前两天刷到一位网友给 Claude 做了一个物理外挂:用 Arduino 控制一盏 USB 红绿灯,根据 Claude Code 的状态亮不同颜色的灯。想法很酷,但我没有 Arduino ,也不想在桌上多摆一盏灯。
于是我换了个思路:为什么不在电脑上直接做一盏“虚拟红绿灯”呢?于是就有了这个项目 —— Code Light 。一个躺在系统托盘里的小圆点,告诉你 Claude Code 此时此刻正在做什么。
项目地址
https://github.com/cuihp/code-light
AI 写代码 痛点:AI 干活,状态你看不见 Claude Code 是一个运行在终端里的 AI 编码代理。你可以让它帮你写代码、跑测试、查文档……问题来了:你给它一个任务之后,往往要切回终端窗口才能知道它现在是什么状态:
是在执行工具调用?
是卡住等你的确认?
还是已经报错了?
来回切换窗口很打断思路。要是能瞟一眼就知道状态,该多好。
Code Light 就是解决这个问题的。它在你的 macOS (也支持 Linux / Windows )系统托盘中显示一个彩色圆点:
| 颜色 | 状态 | 含义 |
|---|---|---|
| 灰色 | 空闲 | 没有正在运行的 Claude Code 会话 |
| 绿色(闪烁) | 工作中 | 正在执行工具调用(写文件、跑命令等) |
| 黄色(闪烁) | 等待中 | 需要你确认下一步操作 |
| 红色(闪烁) | 错误 | 出事了,快去终端看看 |
| 蓝色 | 完成 | 任务结束(显示 10 秒后变回灰色) |
绿色、黄色、红色都会以每秒 2 次的频率闪烁,非常醒目。鼠标移到图标上还会显示当前状态、活跃会话数量、最后更新时间。
怎么实现的?比你想的更简单 Code Light 没有走复杂的进程通信,也没有开任何网络端口。它用的是最朴素也最可靠的方式 —— 文件。
Claude Code 官方提供了一套生命周期钩子( Lifecycle Hooks ),可以在不同事件(调用工具前、调用工具后、需要用户确认时、会话结束时)执行自定义脚本。Code Light 注册了几个 Bash 钩子脚本,每个脚本做的事很简单:
获取当前会话 ID
把当前状态( working / waiting / error / completed )写入到 ~/.code-light/sessions/<会话 ID>.json
然后,系统托盘程序会每隔 1 秒扫描一次这个文件夹里的所有 JSON 文件,合并所有会话的状态(按错误 > 等待 > 工作中 > 完成 > 空闲的优先级),然后改变图标颜色。
就这么简单。零配置、零端口、零 API ,只有几个文本文件在干活。
安装使用( 3 步搞定) 前提条件 macOS 12+ / Linux / Windows 10+
Claude Code CLI 已安装并配置
Node.js 18+ 和 pnpm
Rust 工具链
- 从源码构建
git clone https://github.com/cuihp/code-light.git
cd code-light
pnpm install
pnpm tauri build
AI 写代码 bash 或者直接安装:

-
启动应用 双击运行 code-light.app ( macOS )或对应平台的可执行文件,系统托盘中会出现一个灰色小圆点。
-
安装钩子 点击托盘图标 → 选择 “Setup Hooks”,这一步会自动把钩子脚本注册到 ~/.claude/settings.json 中。之后正常使用 Claude Code 即可,图标自动变化。

🍎 macOS 提示“应用已损坏”?从源码构建可能被 macOS 阻止,执行以下命令后右键打开应用即可:
xattr -cr /path/to/code-light.app
进阶特性:多会话 + 自动清理 📌 多终端会话支持 你可以在多个终端窗口里同时跑 Claude Code ,Code Light 会追踪所有会话。托盘图标显示的是所有会话中的最高优先级状态(错误 > 等待 > 工作中 > 完成 > 空闲)。比如一个会话在等待确认,另一个在干活,图标会显示黄色闪烁(等待优先级高于工作中)。
🧹 自动清理与保护 超过 5 分钟没有活动的会话会被自动删除
陷入“等待确认”状态超过 30 秒的会话,会被自动提升为“工作中”(防止挂起)
陷入“工作中”状态超过 60 秒的会话,会被自动标记为“完成”
完成状态仅显示 10 秒,然后会话被清理
如果你也在用 Claude Code ,并且受够了来回切换终端看状态,不妨试试这个“红绿灯”。
一眼看清,心里有数。 有什么想法,我们也可以聊聊哇!