我总是启动一个长时间运行的代理任务,然后守在终端前,好像它欠我钱一样。那些空等的分钟不断累积。于是我做了一个小工具,替我盯着终端。

说出来有点丢人。我会给 AI 代理一个真正的任务:重构一个认证模块、迁移一个路由、跑一遍完整的测试套件,然后我就只是……看着。六分钟的进度转圈,而我死盯着它,好像一移开视线它就会消失似的。
另一种做法更糟。切到 Slack,被别的事情卷进去,然后十分钟后飘回来,代理早就跑完了,状态也冷掉了。到那时,我已经忘了自己当初到底要的是什么。
所以一次任务本来只要六分钟,却让我付出了十五分钟的代价。每一次都是。开始和完成之间的这段空隙,正在悄悄吞掉我的一天。
🔔 信号其实早就在那儿了
让人恼火的是,我想知道的那个时刻其实早就存在了。每个代理都清楚地知道自己什么时候完成了一轮任务,或者停下来问你问题。Claude Code 会触发一个 Stop 钩子。Codex 有一个 notify 命令。Gemini 有一个 AfterAgent 事件。Copilot 有 agentStop。
这个事件就摆在每个工具里,现成的。只是没人把它转换成一句简单的*"喂,回来一下"*。
正是这个想法,让我不再抱怨,开始动手。我不需要轮询任何东西,也不需要去抓日志。我只需要接住代理本就在广播的那个信号,把它变成一段语音、一条通知、一声提示音:不管我飘到哪儿去了,都能被推一把叫回来。这正是 turnbell 在做的事。

🧱 第一个决定是一条约束,不是一个功能
在写下第一行代码之前,我先决定了这个工具不能做什么。
不能有后台守护进程在我的进程列表里嗡嗡作响。不能要求每个项目都导入一个 SDK。不能有任何让我担心它到底动了什么的东西。它做的只是把每个代理自己的钩子配置接上,去调用一条命令,这就是它留下的全部痕迹。
由此得出两条规则:
- 每一次改动都能逐字节还原。 turnbell(也发布在 npm 上)会原子化地应用一次配置编辑,然后把它刚写入的确切 diff 显示给你,让你当场决定保留还是撤销。一个原本没被动过的文件,会被精确还原成之前的每一个字节;而一个只是被注入了一个代码块的文件(比如某个代理的指令文件),只会把那个代码块原样抽掉,所以你之后在它周围做的任何编辑都会完好保留。
- 卸载必须诚实。 它只撤销自己添加过的东西,不多不少,遵循上面同样的两条规则,所以它不会一边宣称"可逆",一边悄悄做不到。
真正的工程工作大部分都花在了这里,花在这个毫不起眼的承诺上:这东西离开你机器时,会和它来的时候一模一样。一个会编辑你全局配置的工具,必须靠这个来赢得那份权限。
🔒 唯一离开你机器的东西
我想要手机提醒,这意味着总得有点什么要经过网络。这让我更谨慎,而不是更放松。
语音、桌面通知和声音从来不会离开这台机器,它们从定义上就是本地的。唯一对外的路径是一个可选的 webhook,它只有一个序列化器,只会输出恰好六个字段:版本号、时间戳、代理名称、事件、项目的文件夹名,以及一行简短的状态说明。
没有代码。没有工作目录。没有代理的回复内容。而且在你信任它之前,你可以直接打印出确切的字节:一个 flag 就能让你看到 payload,而什么都不会发送。
隐私不是我最后硬贴上去的一句营销话术。它是一个结构性的选择:只给网络开一扇门,而且把这扇门做得很小。
🧩 八个代理,一份契约
接下来是混乱的中间地带,有意思的工作通常就藏在这里。
每个代理暴露出来的钩子集合都不一样,能做的事也不一样。Claude Code 几乎什么都能做:完成、卡住、朗读回复、一个斜杠命令。Cursor 只能宣布自己完成了。opencode 没法暴露它的对话记录,所以朗读回复这件事对它来说根本行不通。
很容易就会想把这些差异抹平,号称"统一支持"。我反其道而行之。我在一个统一的 wire/unwire 契约背后,为每个代理都写了一个专属的适配器,能力对照表则老老实实地告诉你,每一个代理到底能兑现什么。
因为失去别人信任最快的办法,就是承诺一个他们的环境根本兑现不了的功能。诚实的局限,胜过一张好看却说谎的对照表。
🎯 我真正学到的东西
真正有意思的部分,从来都不是那个会说话的终端。而是围绕着它的一切。
真正的问题在于,要做一个能伸手进你的全局配置、你的代理、你的机器里的东西,而且配得上待在那儿。原子化地应用改动,让它可逆,给网络开一扇小门,坦白说出自己做不到的事。
我反复回到同一个检验标准:把它做得就像卸载它的人正在看着一样。 这一个视角决定的设计取舍,比任何功能需求都多。
现在我启动一个长任务之后,是真的会走开。几分钟后,我的笔记本会把回复念出来,或者我的手机会震动,因为代理卡住了,需要我做个决定。那些空等的时间没有了。我只会在真正要紧的那一刻被叫回去,不早一分钟,也不晚十分钟。
如果可逆的配置编辑和只开一扇门的网络策略对你有用:turnbell 是开源的:GitHub · npm。
如果有一个编辑配置的工具被发现其实不可逆,你会立刻不再信任哪一个?
我很好奇这种事是不是已经在你身上发生过,某个 CLI 改写了一个 dotfile 却没留退路,以及这有没有改变你后来读安装程序承诺时的仔细程度。


