造物 / Make
🪟 Close Host Window
让终端里的 Claude Code 自己关掉 VSCode 窗口的插件
简介
Close Host Window 是一个 VSCode 插件,让集成终端里的进程(比如 Claude Code)能关闭承载它的那个窗口,全程不抢焦点、不切 Space。
使用场景:让 Agent 在后台并行干活,干完各自关掉自己的窗口,不用我一个个手动收。
为什么需要插件
外部进程想关 VSCode 窗口,常规路径都走不通:
- AppleScript / Accessibility API:关窗前必须把窗口激活,焦点被抢,macOS 还会切 Space
- 直接杀进程:绕过 VSCode 的状态保存,脏编辑器可能丢数据
- CDP(Chrome DevTools Protocol):需要 VSCode 以 debug 参数启动,日常环境不可用
只有扩展内部能调 workbench.action.closeWindow 这个官方命令,安静地关窗。所以只能自己写一个。
用法
插件激活后,新开的终端自带环境变量 $VSC_WINDOW_CLOSE_HOOK,指向一个 Unix socket。终端里的进程想关窗时,往 socket 写一行自己的 PID:
echo $$ | nc -U "$VSC_WINDOW_CLOSE_HOOK"
拿到 PID 后,插件先给目标进程组发 SIGTERM,等 5 秒让 Claude Code 跑完 SessionEnd hooks(保存会话、清理状态),再执行关窗。
老终端拿不到环境变量的话,可以在 workspace 根目录 touch 一个哨兵文件触发,精度差一些(同 workspace 多窗口会广播),能拿 socket 就别用哨兵。
我在 shell rc 里常驻了一个 vsc-close 函数封装这两种通道,Agent 的 prompt 里直接告诉它"干完活调用 vsc-close"就行。
已知限制
- 仅 macOS / Linux(依赖 Unix domain socket 和
nc -U) - tmux 里的进程不在终端进程组,关窗时杀不到
- 同窗口多个 Claude 会话会被一起杀掉,所以一个窗口只跑一个会话
项目没发 marketplace,vsce package 打成 vsix 本地安装,自用足够。
https://github.com/Lionad-Morotar/vscode-extension-for-agent