我开发了一个 macOS 菜单栏应用来监控我所有的 Claude Code 会话——它是如何工作的

发布: (2026年3月1日 GMT+8 16:50)
6 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文并保留原始的格式、Markdown 语法以及代码块和 URL。

功能概述

c9watch 是一款原生 macOS 菜单栏应用,能够自动发现机器上所有正在运行的 Claude Code 会话。无需插件、无需设置——它在操作系统层面扫描进程,因此可以配合您已经在使用的任何终端或 IDE。

Dashboard

会话按状态分组——Working(进行中)、Needs Permission(需要授权)、Idle(空闲)、Done(已完成)——这样授权请求会出现在最上方。您还可以按项目(带有 git 分支信息)分组,展开任意会话查看完整对话,停止或重命名会话,并直接跳转到父终端。

它的其他功能包括:

  • 托盘弹出框 — 点击菜单栏图标即可快速概览,无需打开完整仪表盘
  • 对话查看器 — 支持格式化的 markdown、代码块、内联图片,以及用于导航的侧边栏
  • 会话历史 — 可通过关键字搜索所有过去的会话
  • 费用追踪 — 按天、按项目、按模型的花费明细
  • 移动客户端 — 扫描二维码,通过 WebSocket 在手机上查看会话
  • macOS 通知 — 当代理需要您关注时会弹出提醒

工作原理(内部实现)

进程发现

后台线程每 2 秒使用 sysinfo 轮询一次,扫描正在运行的 claude 进程。每个进程通过路径编码和时间戳关联,匹配到 ~/.claude/projects/ 中对应的会话文件。

会话的 JSONL 文件的最近 N 条记录会被解析,以确定状态:

  • Working — Claude 正在生成回复或执行工具
  • Needs Permission — 工具调用正在等待用户批准
  • Idle — 正在等待你的下一条提示

状态更新通过 Tauri 事件推送到 Svelte 前端。UI 会响应式更新,并按优先级对会话进行排序。

会话历史与搜索

c9watch 读取 ~/.claude/history.jsonl 获取会话索引,然后在所有项目目录下的各个 JSONL 文件中进行深度内容搜索。文本提取逻辑会仔细区分用户提示和工具结果——只有实际用户输入的内容会被索引,从而避免在元数据上产生噪音匹配。

搜索结果会链接回对话查看器,并使用滚动到匹配位置并高亮显示的方式呈现。

成本追踪

JSONL 文件中的助手消息元数据包含模型使用情况和 token 数量。成本计算器使用每个模型的定价表,并通过文件 mtime 缓存结果,因此未更改的会话永远不会被重新扫描。

一个棘手的地方在于:Anthropic 的模型 ID 包含日期后缀,例如 claude-sonnet-4-5-20250929。定价查找会在匹配定价表之前,先去掉这些后缀进行标准化。

托盘弹出框(NSPanel)

菜单栏弹出框使用 macOS 的 NSPanel,并设置了特定的 collection behaviors —— full_screen_auxiliary()can_join_all_spaces()stationary() —— 使其能够在全屏应用之上显示且不抢占焦点。为了让拖拽区域与标题栏中的可点击标签按钮共存,需要在各个按钮上设置 -webkit-app-region: no-drag,而保持其周围区域仍可拖动。

技术栈

技术
桌面框架Tauri 2
前端SvelteKit + Svelte 5
后端Rust
进程发现sysinfo
设计系统Vercel Noir(真黑色,Geist 字体)

为什么选择 Tauri 而不是 Electron

你已经在运行一堆 Claude Code 代理,占用了大量内存。监控工具不应再增加额外负担。Tauri 为你提供一个原生二进制文件,开销极小——Rust 在本地速度下处理繁重的工作(进程扫描、JSONL 解析),而 Svelte 则在前端编译掉框架的开销。

开发过程

我使用 Claude Code 本身构建了 c9watch。大部分 Rust 后端和 Svelte 前端都是在 AI 辅助下完成的——我描述我想要的功能,审查输出,进行测试并迭代。架构决策(Tauri 而非 Electron、操作系统级别的扫描、JSONL 解析策略)是我做出的,但实现的繁重工作由 Claude Code 完成。

开源

MIT 许可证,无遥测,完全开源。

  • GitHub:
  • Demo:
  • Install:
curl -fsSL https://raw.githubusercontent.com/minchenlee/c9watch/main/install.sh | bash

如果你正在运行多个 Claude Code 会话并且对发生的事情失去跟踪,试试看吧。欢迎提供反馈、提交问题和 PR。

0 浏览
Back to Blog

相关文章

阅读更多 »

当工作成为心理健康风险时

markdown !Ravi Mishrahttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fu...