BOTBUS / 博客

Claude Code、Codex 跑完或等你确认时,怎么让手机响一下

不想一直盯着终端?对比用 hooks、Codex notify 自己配推送和 BotBus 的做法:什么时候会响、通知里能看到什么、点开以后能不能直接处理,以及各自的限制。

先说结论

想让 Claude Code 或 Codex 跑完、出错、等你批准时手机响一下,有两条路:一是用它们自带的扩展点自己配——Claude Code 的 hooks、Codex 的 notify——把事件转给 ntfy、Telegram 之类的推送服务;二是用 BotBus 这类常驻电脑的应用,它在任务进入「等审批、等回答、完成、失败」四种状态时推到 iPhone、Apple Watch 或 Android 手机上,点开通知就进到那个任务,能批准、回答或接着聊。自己配的办法免费、灵活,适合只想要一声提醒的人;它卡在“只能通知、不能操作”,以及要自己处理通知内容经过谁的服务器。

为什么需要推送

Coding agent 的长任务很少一口气跑完。中途它会停下来请示:要跑一条命令、要改一个目录外的文件、要你在两个方案里选一个。跑完了它也只是安静地停在终端里。你要么守在屏幕前,要么隔一阵回来看一眼——多数时候回来发现它十分钟前就停了,在等你。

所以“通知”真正要解决的是两件事:该你出手的那一刻知道,以及知道以后最好能马上处理。前一件靠推送,后一件靠推送后面接着的那个界面。

自己配:hooks 与 notify

这条路完全可行,也是很多人的第一选择。下面的情况是 2026 年 10 月 6 日对照两家官方文档核对的。

Claude Code 的 hooks

Claude Code 的 Notification hook 会在它要提醒你的时候触发,可以按 notification_type 过滤:permission_prompt(弹出了权限框)、idle_prompt(一轮跑完、输入框闲着一阵)、agent_needs_input 等。Stop hook 在一轮回答结束时触发。在 ~/.claude/settings.json 里给这两个事件挂一条命令或一个 HTTP 地址,转发给 ntfy、Pushover、Bark 或 Telegram 机器人,手机就能响。

要注意的是,官方文档写明 Notification hook 只能观察、不能做决定:它的退出码和输出都会被忽略。也就是说,推送能告诉你“它在等你批准”,但你要批准还是得回到电脑前,或者再另外搭一套能把决定送回去的东西。

Codex 的 notify

Codex 在 config.toml 里提供 notify:写成 notify = ["python3", "/path/to/notify.py"],每次触发时把一段 JSON 作为参数传给你的程序,里面有会话 id、工作目录、这一轮的输入和最后一条回复。目前它只支持 agent-turn-complete 这一种事件,审批请求不会触发 notify。终端界面自带的 tui.notifications 可以对 approval-requested 发桌面通知,但那是本机桌面通知,人不在电脑前就看不到。Codex 另有 hooks 可以挂到更多生命周期事件上,想覆盖审批得自己去配、自己测。

这条路卡在哪

如果你只用一个 agent、只想知道“跑完了没有”,一个十几行的脚本就够了,不必为此装别的东西。

BotBus 的做法

BotBus 是常驻在电脑上的应用(Mac 版在菜单栏,Linux 版是命令行后台程序),自动发现本机的 Codex、Claude Code、Hermes、Pi、OpenClaw、DeepSeek Harness 等 agent,把任务同步到手机和手表。推送是它顺带做掉的一件事,规则是固定的:

什么时候会响

任务进入下面四种状态之一时推一条:

状态 通知标题 正文
等待审批 「Codex 等待审批」这类 它要做什么(请求摘要)
等你回答 「Claude Code 在等你回答」这类 它问的问题
任务完成 「… 任务完成」 最后一条回复
任务失败 「… 任务失败」 最后一条消息或报错

还在跑、被你自己中断的任务不推。同一个任务、同一个状态和同一个请求,30 秒内只推一次,不会刷屏。BotBus 启动后的第一轮只记下现状、不推送,所以重启电脑或重开 BotBus 时,不会把积压的“已完成”一次性推给你。你在列表里移出的项目,它的任务也不再推送。

不只是手机上开的任务:电脑终端里开的 Codex 会话、桌面 App 里的会话,只要 BotBus 能看到它的状态变化,一样会推。Claude Code 的终端会话要先在 BotBus 设置的「本机 Agent」里点「安装 hooks」——BotBus 正是靠 hooks 得知会话在请求权限、跑完或出错,安装时只合并它自己的条目,保留你原有的 hooks。

另外有两种 Mac 版特有的情况:任务失败的原因是 macOS 的系统授权弹窗挡住了,会推一条「电脑需要系统授权」;agent 停下来等人、而电脑上恰好有个密码框聚焦着,通知会说明可以直接在手机上操作电脑去填。

点开以后能做什么

点通知直接进到那个任务,看到完整的请求或对话。接下来可以:

这些操作都要求那台电脑在线,并且取决于对应 agent 的连接器是否支持、任务当时处于什么状态。比如 Codex:手机上开的会话,以及从 BotBus 菜单「启动 Codex」打开的桌面 App 里的会话,审批都能在手机上回答(见《在 iPhone 上看 Codex 任务》);只被 BotBus 读取的会话能看到状态、收到推送,但未必能从手机上替它做决定。有的 agent 本身没有审批这一步(Pi 就没有),就只会收到完成和失败。通知本身没有附带“允许”按钮,批准要在打开的任务页里点,这样批之前能看清完整内容。审批的细节见《人不在电脑前,怎么在手机上审批 Claude Code 的权限请求》。

通知内容怎么保护

BotBus 的中转服务器转给苹果推送服务的只有一句固定文案(“有任务在等你审批”“任务完成了”这几句之一)和一段密文。iPhone 上的通知扩展用配对时拿到的钥匙解开密文,换成电脑发来的真实标题、正文和电脑名;中转服务器和苹果都读不到正文。Android 版经 Firebase 收到的同样只有路由字段和密文,在手机本地解开后才显示。

代价是两处:Apple Watch 没有通知扩展,手表上收到的永远是那几句固定文案,抬腕看到“有任务在等你审批”,具体内容要点进去看;中转服务器看得到推送的类别(审批、提问、完成、失败)和时间,这是路由需要的元数据。完整说明见端到端加密说明。

限制与边界

常见问题

我已经配了 Claude Code 的 Notification hook,装 BotBus 的 hooks 会冲突吗?

不会。BotBus 的安装器只合并和移除带它自己标记的 hooks,你原来的 Notification、Stop hook 照常执行。两边都开着时你会收到两份推送,可以按需关掉一边。

Codex 等我批准时,手机能收到吗?

能。Codex 自己的 notify 不覆盖审批,但 BotBus 看到 Codex 任务进入“等待审批”就会推送。手机上开的会话和经 BotBus「启动 Codex」打开的桌面会话,点开就能批准或拒绝。前提是电脑在线、BotBus 在运行。如果你给项目开了 BotBus 的自动批准,手机发起的那一轮里被自动放行的审批不再推送。

手表上能直接批准吗?

能在手表 app 里处理:点开推送进到任务,看请求、批准或拒绝。只是手表上的推送本身只显示固定文案,看不到具体命令。详见《在 Apple Watch 上管 AI 编程 agent》。

推送的内容会被中转服务器看到吗?

正文不会。标题、正文和电脑名在你的设备上加密,中转服务器只转发密文和一句固定文案;它能看到的是推送类别、时间这类元数据。

怎么开始用?

在电脑上装好 BotBus,用手机扫配对二维码,允许通知即可。下载在官网首页:电脑端有 Mac 版(macOS 26 或更新)和 Linux 版,iPhone 与 Apple Watch 版在 App Store(iOS 26 / watchOS 26 起),Android 版需要 Android 8.0 或更新,在官网下载区下载安装包。

← 全部文章