Vibe Coding信号灯实现原理:从Cursor事件到状态灯的完整链路
版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 引言 随着本地AI编程助手如Codex、Claude Code和Cursor的普及,开发者开始习惯让AI长时间在后台执行复杂任务:读取文件、运行测试、修改代码、等待权限批准。在这些场景中,你不得不反复切回终端或编辑器确认进度——是否有更直观的方式了解Agent的状态? 你可能已经在朋友圈中看到,有人用类似信号灯的硬件,实时展示AI编程助手的状态。 AI编程助手的状态是如何采集并展示的呢? 最近萌叔发现了一个纯软件实现的vibe coding信号灯 vearne/vibecoding-signal-light,通过悬浮三色灯、菜单栏图标和Touch Bar实时展示AI Agent的工作状态。 本文将深入剖析其技术实现,特别是如何从Cursor编辑器获取状态并映射为灯语。 2. 整体架构:双Swift进程协作 项目采用了清晰的双进程设计,全部基于Swift构建: Swift CLI(signal-light-cli):无状态命令行工具,由Cursor/Codex/Claude Code的hook调用。负责解析事件、更新状态文件、发送跨进程通知。 Swift App(signal-light-mac):macOS AppKit长驻应用。读取状态文件,通过动画定时器驱动三色灯UI渲染。 CLI写完状态后,并非只靠App轮询文件。它会双通道通知App立刻刷新: Darwin CFNotification(com.vibecoding.signal-light.status-changed)——跨进程、低延迟 DistributedNotificationCenter——同用户会话内的兜底通知 App侧同时监听这两种通知,并用文件系统监控作为最终兜底,因此灯语能接近实时变化。 2.1 配置Cursor Hook 应用安装时,会创建 ~/.cursor/hooks.json。 Cursor 的 hooks.json 是一套事件驱动的中间件机制,用来在 Cursor Agent(AI 助手)特定生命周期节点插入自定义脚本,从而观察、拦截、控制或扩展 AI 的行为。可以把它理解为挂在 AI 工作流流水线上的“钩子”。 内容大致如下: { "hooks": { "afterAgentResponse": [{ "command": "\/usr\/local\/bin\/cursor-signal-hook", "timeout": 5, "type": "command" }], "afterAgentThought": [{ "command": "\/usr\/local\/bin\/cursor-signal-hook", "timeout": 5, "type": "command" }], "afterFileEdit": [{ "command": "\/usr\/local\/bin\/cursor-signal-hook", "timeout": 5, "type": "command" }] ... }, "version": 1 } Cursor 侧注册了约 20+ 个 hook 事件(完整列表见附录);高频几个包括 beforeSubmitPrompt、preToolUse / postToolUse、afterFileEdit、permissionRequest、stop 等。 ...