macOS · 本地运行 · 开源

别再盯着一排终端,等 agent 来找你

多个 coding agent 并行跑的时候,谁在等你授权、谁问了问题、谁已经跑完,你只能一个个终端翻。CCNotify 把这些事件收拢成屏幕右上角的卡片——点“允许”,决定直接回传给 agent。

需要 macOS 13+ · 支持 Claude Code 与 Codex CLI · 全部流量只走 127.0.0.1

  • 卡片上直接“允许 / 拒绝”,agent 立刻继续跑
  • 一键跳回发起这次会话的那个终端窗口
  • CCNotify 挂了也不挡路:hook 静默退出,agent 回退原生授权流程
3 个会话在等你
$
›
问题

并行开发的真正瓶颈,是你自己在轮询

Agent 越好用,你开的会话就越多。可它们都是被动的:卡在授权上就一直卡着,跑完了也不会喊你。

  • 01四个终端标签,你不切过去就不知道哪个停在“是否允许执行”上。
  • 02任务早跑完了,你还在等;或者你等了半天,其实它十分钟前就在问你问题。
  • 03为了确认一件小事反复切窗口找上下文,注意力全碎在路上。
功能

该你出手的时候,它才出现

不是把日志再抄一遍给你看,而是把需要人做的那一下,搬到你眼前。

01

授权就地决策

卡片里能看到完整命令、要改的文件和补丁内容。点“允许”或“拒绝”,结果作为 hook 输出回传,终端里的 agent 立刻接着跑,不用你切过去敲回车。

允许 / 拒绝本会话允许
02

选项卡片(HITL)

Agent 反问“部署到预发还是生产?”时,选项直接铺在卡片上,点一下就选好了。长文本折叠显示,需要时展开看全文。

多选支持Claude Code
03

一键跳回终端

想自己接管就点卡片上的终端按钮,直接激活发起这次会话的那个窗口和标签页——靠 tty 与终端会话标识定位,不是瞎猜最前面那个。

TerminaliTerm2tmux
04

五套主题、声音、时长全可调

菜单栏点开就是设置面板,不用手改 JSON。主题、提示音与音量、每类卡片停留多久、折叠行数,都在面板里改,改完立即生效。

5 套主题分类提示音
05

不打断你的手感

鼠标停在卡片上或正在拖动时,倒计时暂停;移开后从零重新计时。需要你决策的卡片默认不会自己消失,卡片多了可以上下滚动,右划关闭。

悬停暂停右划关闭
06

全本地,出错就让路

服务只监听 127.0.0.1,请求要带本机生成的 token,不上传任何代码。App 没开、端口变了、请求超时,hook 一律静默退出 0,agent 自动回退到它原生的授权流程。

127.0.0.1失败即让路
工作原理

一个 hook、一个本地服务、一次回传

没有云端、没有中转、没有轮询。整条链路都在你这台机器上,往返一次通常在几十毫秒。

01

Agent 触发 hook

需要授权、要问你问题、任务结束时,Claude Code 或 Codex 会执行安装好的 ccnotify-hook —— 一个几十行的 sh 脚本,把事件 JSON 从 stdin 转发出去。

02

本地服务弹卡片

CCNotify 在 127.0.0.1 上校验 token,按事件类型播放提示音,在右上角弹出对应卡片;终端定位信息随请求头一起送到,用于之后跳回。

03

决定原路回传

你点下的按钮被写成 hook 的标准输出,agent 读到 allow 或 deny 就继续执行。没人点也不会永远卡着:到时间自动放行给终端。

支持的 Agent

Claude Code 与 Codex,同一套管道

两家的 hook 协议形状几乎一致:stdin 收一个 JSON,stdout 回一个决定。所以一个 hook 客户端就同时服务两者,卡片上会标明事件来自谁。

能力 Claude Code Codex CLI
授权卡片(允许 / 拒绝回传)✓✓
任务完成卡片✓✓
会话开始 / 结束跟踪✓✓
选项卡片(AskUserQuestion)✓—
空闲提醒(Notification)✓—
一键跳回终端✓✓
Codex 侧的说明:非托管 hook 必须被信任,而信任状态和配置内容的哈希绑定。因此 CCNotify 改过 ~/.codex/hooks.json 之后,你需要在 Codex 里执行一次 /hooks 重新信任,否则 hook 会静默地不执行、也不报错。
安装

双击安装,不用碰终端

下载 .pkg 双击就行。App 启动后自己写入 hook、幂等地合并进两个 agent 的配置(改动前自动备份)、注册开机自启,并弹一张面板告诉你每一步的结果。

01

下载安装包

一个 435 KB 的 CCNotify-0.3.0.pkg,里面就是编译好的 App,不含任何需要你执行的脚本。

02

双击安装

安装包还没做苹果签名,首次打开请在 Finder 里右键 → 打开(或到「系统设置 › 隐私与安全性」点“仍要打开”)。之后一路下一步,输一次管理员密码,App 会装进「应用程序」并自动启动。

03

看一眼结果面板就好了

面板会列出 hook、Claude Code、Codex CLI、开机自启四项的状态。Claude Code 新开的会话即刻生效;Codex 用户记得在 Codex 里执行一次 /hooks 重新信任。

想先看看长什么样:点菜单栏铃铛 → 发送测试卡片,会立刻弹一张真的授权卡片出来。后面才装 Codex,或者把 App 挪了位置,点铃铛菜单里的重新接入 Agent…重接一遍。
想从源码编译?仓库在 github.com/dmxj/ccnotify,克隆后跑 ./build.sh 生成 build/CCNotify.app,双击它就会自己完成接入;想自己打一个安装包就再跑 ./packaging/build-pkg.sh。只依赖 Xcode Command Line Tools,不需要完整 Xcode。
主题

五套主题,都是真实截图

下面每一张都是从运行中的 App 上按窗口截下来的,没有重绘。在设置面板里随时切换。

light theme card
浅色 · 纯白light
paper theme card
浅色 · 暖纸paper
dark theme card
深色 · 石墨dark
midnight theme card
深色 · 午夜蓝midnight
glass theme card
毛玻璃glass
codex apply_patch card
Codex 改文件apply_patch
常见问题

你大概会问这些

它会把我的代码传到哪里去吗?
不会。服务只绑定 127.0.0.1,端口和随机 token 写在 ~/.ccnotify/runtime.env,每个请求都要带这个 token。没有任何出网请求,卡片内容只在本机内存和屏幕上出现。
CCNotify 崩了或者没启动,我的 agent 会不会卡死?
不会。hook 客户端是 fail-open 的:连不上、端口变了、超时、返回不是 JSON,一律退出 0 且不输出任何内容,agent 就当没装这个 hook,回退到它自己的授权流程。
支持 Windows 或 Linux 吗?
目前只有 macOS 13+。弹窗、菜单栏、提示音和“跳回终端”都直接用了 AppKit 与 macOS 的辅助功能接口。事件协议本身是跨平台的,其它平台的客户端可以复用同一套 hook 约定。
除了 Claude Code 和 Codex,还能接别的 agent 吗?
可以。接入面很薄:任何能在关键节点执行一条命令、并读取该命令标准输出的 agent,都可以把 ccnotify-hook 挂上去。hook 会带上一个 agent 标识,卡片上就会显示它的名字。
Codex 里装完了,但 hook 好像没反应?
在 Codex 里执行一次 /hooks。Codex 的 hook 信任和配置内容的哈希绑定,CCNotify 改写过 hooks.json,旧的信任就失效了——而它跳过未信任的 hook 时是完全静默的。
卡片会自己消失吗?
信息类卡片按你设的时长自动消失;需要你决策的卡片默认一直留着。鼠标悬停或拖动时倒计时暂停,移开后从零重新计时。
怎么卸载?
在「系统设置 › 通用 › 登录项」里关掉 CCNotify,把 /Applications/CCNotify.app 拖进废纸篓,再从 ~/.claude/settings.json 和 ~/.codex/hooks.json 里移除包含 ccnotify-hook 的条目即可。配置、日志和 hook 客户端都在 ~/.ccnotify/,整个目录删掉就干净了。

把轮询交给它,你只管做决定

一个菜单栏小工具,几十 KB 的 hook 脚本,装上就不用再守着终端了。

约 435 KB · 双击安装,无需终端 · macOS 13 或更高版本 · 首次打开请右键 → 打开