Claude 任务监控
右上角一格,看清哪个会话在等你
同时开五六个 Claude Code 会话之后,真正的问题不是它们跑得慢,是你不知道该看哪一个——有的在干活不用管,有的问了句话在那儿干等,有的三分钟前就跑完了你还不知道。
这是 macOS 右上角一块常驻的小窗口,把本机所有会话的状态摊在一起:谁在干活、谁在等你、卡了多久、todo 到哪了。永远置顶,不抢焦点,不进 Dock、不进 Cmd-Tab。纯本地,不联网,不要 API key,对 ~/.claude/ 只读。
排序就是它的全部主张
卡片顺序永远是「等授权 → 等输入 → 出错 → 干活中 → 空闲 → 已退出」,同一档里卡得越久越靠前。需要你动手的永远浮在最上面,你不需要读,扫一眼颜色和位置就够了。
六种状态各有颜色:等授权是红的(最该马上处理),等输入是橙的,出错是洋红——刻意和「等授权」的红拉开,免得误读成要点同意。干活中绿、空闲灰、已退出深灰。
收起后只剩 2.5% 的面积
展开是 296 × 336,收起是 72 × 35。横向纵向一起收,变成右上角一颗小药丸,右边缘锚定不动、只往左下收。
但收起不等于失明——连接指示灯、会话数、等待数、未读数仍然可见。宽度是按内容动态算的,有「N 等」徽标时自动变宽,没有就缩到最小。
未读红点只认跃迁
会话从「干活中」变成「空闲」时打一个红点,意思是「出结果了但你还没看」。你点了那张卡,或者会话重新开始活动(说明你已经接手),红点就清掉。
关键在于只认状态跃迁:app 重启时那些早就跑完的会话不会全被标成未读——那不是「刚刚出结果」。提示音同理,启动时不响、新发现的会话不响,否则重启一次就是一串炸响。
为什么不用系统通知
试过,走不通。macOS 的通知守护进程拒绝 ad-hoc 签名、未公证的本地 app——osascript display notification 被静默丢弃(退出码还给你 0),UNUserNotificationCenter 直接报 Notifications are not allowed。要真正的横幅就得有开发者签名加公证,那会给「clone 下来自己 build」立一道很高的门槛。
所以改成边框闪烁 + 提示音 + 常驻红卡这套组合:完全本地、零授权、100% 可靠。窗口跟随所有桌面、浮在全屏应用之上,在哪个 Space 都看得到。
技术
SwiftUI + AppKit 的 NSPanel,加一个零依赖的 Node 状态引擎。进程间只有一根管道:app 启动时 spawn node engine/index.js --watch,按行读 stdout 的 NDJSON。引擎挂了自动重启(指数退避,上限 30 秒),app 退出同步杀子进程。
数据全部来自 Claude Code 自己写在本地的文件——会话注册表、对话流水 .jsonl、todo 进度。.jsonl 可能非常大(本机实测有 140MB 的),所以引擎只 seek 到末尾读最后几十 KB,并用 mtime 缓存跳过没变的文件,单轮扫描实测 3–14ms。
有两个坑值得记下来。一是 GUI 启动的 .app 继承的 PATH 极简,不含 /opt/homebrew/bin,所以不能指望 /usr/bin/env node,得挨个探常见安装位置再兜底扫 nvm 的版本目录。二是引擎和 app 两侧的状态词表不一样(running / waiting_permission 对 working / needsAuth),早期版本用 SessionState(rawValue:) ?? .idle 兜底,结果每个状态都匹配不上、全部静默塌成空闲——窗口不报错,只是把所有会话画成灰色,比崩溃还难发现。
声明
个人项目,与 Anthropic 无关,非官方工具。


- 上线
- 2026
- 我的角色
- 独立开发
- 技术栈
- SwiftSwiftUIAppKitNode.js