Peon Ping:为AI编码助手添加事件通知,提升人机协作效率
1. 项目概述:当你的AI编码助手需要你时,它会“说话”
如果你和我一样,每天花大量时间与Claude Code、Cursor、GitHub Copilot这类AI编码助手并肩作战,那你一定遇到过这个场景:你给AI下达了一个复杂的重构或调试指令,然后习惯性地切换到浏览器查资料、回邮件,或者干脆去倒杯咖啡。几分钟后,你回到编辑器,却发现AI早已完成了任务,正静静地等着你。你不仅错过了它完成工作的那一刻,还可能需要花时间重新阅读它生成的代码和解释,才能接上刚才的思路。
这种“信息断层”在频繁的交互中会不断累积,严重打断心流状态。AI助手们默默耕耘,却缺乏一种有效的方式在关键时刻(比如任务完成、需要权限、遇到错误时)主动引起你的注意。
Peon Ping就是为了解决这个问题而生的。它是一个轻量级、跨平台的桌面通知工具,专门为AI驱动的编码工作流设计。其核心思想非常简单却极其有效:为AI助手的事件(如任务开始、完成、出错、需要输入)绑定游戏角色的经典语音和醒目的屏幕横幅通知。想象一下,当Claude Code开始处理任务时,你听到《魔兽争霸》中苦工那句熟悉的“Ready to work!”;当它完成一个复杂函数时,传来“Work complete.”的汇报;当它需要你批准执行某个命令时,会用疑惑的语调问“Hmm?”。
这不仅仅是增加趣味性。在开放式办公室或戴着耳机专注工作时,听觉提示是一种非侵入性但高效的注意力锚点。而覆盖在屏幕角落的视觉横幅,则确保即使你正在全屏会议或另一个应用中,也不会错过任何关键状态更新。它从根本上改变了人机协作的节奏,让你从被动的“检查者”转变为主动的“协调者”。
2. 核心设计理念与工作原理拆解
2.1 基于事件的钩子(Hook)系统
Peon Ping 的核心是一个事件监听与响应系统。它本身并不修改AI助手(如Claude Code、Cursor)的内部代码,而是通过其公开的钩子(Hook)接口进行集成。
钩子是什么?你可以把钩子理解为软件在特定生命周期节点(如“会话开始”、“代理响应后”、“会话结束”)预留的“插槽”。允许外部脚本在这些节点被自动调用。Peon Ping 正是通过向这些插槽注册自己的适配器脚本,来捕获AI助手的关键事件。
工作流程解析:
- 事件触发:当你在Claude Code中输入指令并按下回车,Claude开始处理。此时,它的
session.start钩子被触发。 - 钩子执行:Claude Code 会执行所有注册到
session.start的脚本,其中就包括 Peon Ping 提供的适配器脚本(例如claude.sh)。 - 事件传递:适配器脚本将事件类型(如
session.start)和必要的上下文信息(如会话ID、工作目录)传递给 Peon Ping 的核心守护进程。 - 决策与响应:Peon Ping 守护进程根据当前配置(音量、启用的声音类别、选择的音效包、路径规则等),决定是否需要响应以及如何响应。
- 执行反馈:
- 播放音效:从对应的音效包中随机或按顺序选取一个匹配事件类别的音频文件进行播放。
- 显示通知:在屏幕指定位置生成一个半透明的横幅通知,显示项目名和事件摘要。
- 更新终端标题:在终端标签页的标题前添加一个状态标记(如
●),提供持续的上下文提示。
这种设计使得 Peon Ping 与具体的AI助手实现解耦。只要目标工具支持类似的钩子机制,就可以通过编写一个简单的适配器脚本与之集成。这也是项目能支持 Claude Code、Cursor、Windsurf、Codex 等十多种工具的原因。
2.2 跨平台音频与通知实现
让同一套逻辑在 macOS、Linux、Windows(包括WSL2)上稳定工作,是另一个技术挑战。Peon Ping 采用了“核心逻辑统一,平台实现分离”的策略。
音频播放:
- macOS:使用原生的
afplay命令,这是最稳定、资源占用最低的选择。 - Linux / WSL2:优先使用
paplay(PulseAudio),如果不可用则回退到aplay(ALSA)。在WSL2中,为了播放MP3等格式,需要额外安装ffmpeg进行解码和管道传输。 - Windows (Native):使用 PowerShell 的
Media.SoundPlayer类或更现代的NAudio库,通过预编译的二进制模块处理。
桌面通知:
- macOS:
- Overlay模式:使用 JavaScript for Automation (JXA) 调用 Cocoa 框架,创建无边框、置顶的透明窗口,实现游戏HUD风格的横幅。这是默认且体验最好的方式。
- Standard模式:使用
terminal-notifier或osascript显示原生系统通知。
- Linux:通常使用
notify-send命令,配合libnotify库。 - Windows / WSL2:
- 在WSL2中,通过一个小的Windows端辅助进程(Relay)接收事件,并用 .NET 的
System.Windows.Forms创建窗体来实现 overlay。 - 在原生Windows中,使用
BurntToastPowerShell模块或原生Toast API。
- 在WSL2中,通过一个小的Windows端辅助进程(Relay)接收事件,并用 .NET 的
关键设计考量:
- 性能:音频播放和通知生成必须足够快,不能阻塞AI助手的主进程。因此Peon Ping使用守护进程(daemon)模式,钩子脚本只是快速地向守护进程发送消息。
- 资源占用:守护进程在后台常驻,但非常轻量,通常内存占用在10MB以下。
- 用户体验:Overlay通知被设计为可点击,点击后会自动聚焦到触发事件的终端窗口,实现了从通知到上下文的快速跳转。
3. 音效包生态与CESP开放标准
3.1 音效包结构:不仅仅是音频文件
一个Peon Ping音效包(Sound Pack)是一个遵循特定目录结构的文件夹。以默认的peon(魔兽争霸苦工)包为例:
peon/ ├── manifest.json ├── session.start/ │ ├── 01_ready_to_work.wav │ ├── 02_something_need_doing.wav │ └── ... ├── task.complete/ │ ├── 01_work_complete.wav │ ├── 02_work_work.wav │ └── ... ├── task.error/ │ └── me_not_that_kind_of_orc.wav └── ...manifest.json:包的“身份证”,定义了包名、作者、描述以及所支持的事件类别(Categories)。- 事件类别目录:每个目录对应一个CESP事件类别,里面包含该事件触发时可供随机选择的音频文件。
音频格式的选择:项目优先使用.wav格式,因为它在所有平台上无需额外解码器即可播放。但也支持.mp3、.ogg等格式,在Linux/WSL2下通过ffmpeg进行实时转码。为了保证低延迟,音频文件通常被裁剪得很短(1-3秒)。
3.2 编码事件音效包规范(CESP)
Peon Ping 项目牵头制定了Coding Event Sound Pack Specification (CESP),这是一个开放的、标准化的音效包格式规范。制定开放标准有几个深远意义:
- 生态可扩展性:任何开发者都可以按照CESP规范创建自己的音效包,主题不再局限于游戏,可以是电影台词、自然声音、自定义语音等。这催生了 openpeon.com 这样的社区音效包注册中心。
- 工具无关性:CESP规范的目标是让任何支持钩子机制的AI编码工具都能使用同一套音效包。理想情况下,未来Cursor、Windsurf等工具可以原生支持CESP,进一步降低集成复杂度。
- 事件标准化:CESP定义了标准的事件类别(如
session.start,task.complete,input.required),为不同工具间的事件映射提供了共同语言。
当前支持的核心CESP事件类别:
session.start:AI代理开始处理任务。task.acknowledge:AI代理确认收到任务。(默认禁用,避免频繁打扰)task.complete:任务完成。task.error:执行工具或命令时出错。input.required:需要用户输入或授权。resource.limit:遇到速率或令牌限制。user.spam:用户在短时间内发送过多提示(彩蛋功能)。
3.3 音效包的选择与轮换策略
面对多个音效包,如何管理?Peon Ping 提供了一套精细的、基于规则的优先级系统:
六层优先级决策链(从高到低):
- 会话覆盖(Session Override):通过
/peon-ping-use <pack>命令或MCP服务器为当前会话临时指定一个包。优先级最高。 - 路径规则(Path Rules):根据工作目录的Glob模式匹配。例如,你可以设置
~/work/client-a/*目录下使用glados(Portal的GLaDOS语音),~/personal/*下使用peon。 - IDE规则(IDE Rules):根据触发事件的AI工具来分配。例如,所有来自
cursor的会话使用sc_kerrigan(星际争霸凯瑞甘)。 - 轮换列表(Pack Rotation):配置一个包列表(如
["peon", "glados", "duke_nukem"]),并设置轮换模式为random(随机)或round-robin(循环)。 - 默认包(Default Pack):当以上规则都不匹配时的静态回退包。
- 硬编码默认:如果以上都未设置,则使用内置的
"peon"包。
配置示例与解析:
{ "default_pack": "peon", "pack_rotation": ["peon", "glados", "sc_kerrigan"], "pack_rotation_mode": "round-robin", "path_rules": [ { "pattern": "*/work/important_project/*", "pack": "glados" } ], "ide_rules": [ { "ide": "cursor", "pack": "sc_kerrigan" } ], "exclude_dirs": ["~/temp/*"] }- 场景1:你在
~/work/important_project/src目录下用 Claude Code 工作。系统首先检查路径规则,匹配到glados,因此使用GLaDOS语音包。 - 场景2:你在
~/personal/hobby目录下用 Cursor 工作。路径规则不匹配,接着检查IDE规则,匹配到sc_kerrigan,因此使用凯瑞甘语音包。 - 场景3:你在
~/temp/scratch目录下工作。该目录被exclude_dirs排除,因此跳过路径规则。IDE规则不匹配(假设用的是Claude Code)。接着进入轮换逻辑,由于模式是round-robin,本次会使用轮换列表中的下一个包。 - 场景4:你在任何其他目录用任何其他未配置的IDE工作。所有规则都不匹配,最终使用
default_pack,即peon。
这套系统提供了极大的灵活性,让你可以根据项目、工具甚至心情,自动化地切换工作氛围。
4. 详细安装与配置指南
4.1 跨平台安装方案选择
方案一:Homebrew(macOS/Linux 首选)
brew install PeonPing/tap/peon-ping peon-ping-setup这是最推荐的方式。Homebrew会自动处理依赖、更新和卸载。peon-ping-setup脚本会引导你完成初始配置,并下载默认的音效包。
方案二:安装脚本(通用性强)
# macOS/Linux/WSL2 curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash # Windows (PowerShell) irm https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.ps1 | iex安装脚本会检测你的系统,进行相应安装。在WSL2中,务必确保已安装ffmpeg以支持非WAV格式音频:
sudo apt update && sudo apt install -y ffmpeg方案三:Nix(声明式、可复现)对于Nix用户,可以直接从源码运行或安装到profile:
# 临时运行 nix run github:PeonPing/peon-ping -- status # 永久安装 nix profile install github:PeonPing/peon-ping更强大的方式是使用Home Manager模块进行声明式配置,将Peon Ping的配置纳入你的Nix配置管理,实现完全可复现的开发环境。
安装后的关键目录:
- 全局安装:配置文件位于
~/.claude/hooks/peon-ping/config.json,音效包位于~/.claude/hooks/peon-ping/packs/。 - 本地安装(使用
--local参数):所有文件都位于项目目录下的./.claude/hooks/peon-ping/中。这适用于想在团队项目或特定项目中共享配置的场景,且不会污染全局环境。
4.2 初始配置与个性化
安装后,运行peon setup进入交互式配置向导。这是最快捷的配置方式,它会引导你设置:
- 音量:0.0到1.0,建议从0.5开始,在办公室环境中适当调低。
- 启用的事件类别:你可以关闭某些类别的声音。例如,很多人会关闭
task.acknowledge(任务确认),因为它触发太频繁。 - 桌面通知:是否启用视觉横幅。
- 通知样式:
overlay(游戏风格横幅)或standard(系统原生通知)。 - Overlay主题(仅macOS):
neon(赛博朋克)、glass(玻璃态)、sakura(樱花)或jarvis(钢铁侠贾维斯风格)。 - 通知位置:屏幕的哪个角落。
- 自动关闭时间:通知持续显示多少秒后自动消失,设为0则需手动点击关闭。
你也可以直接编辑config.json文件进行更精细的控制。以下是一些高级配置示例:
{ "volume": 0.6, "enabled": true, "desktop_notifications": true, "notification_style": "overlay", "overlay_theme": "jarvis", "categories": { "session.start": true, "task.acknowledge": false, // 关闭任务确认音效 "task.complete": true, "task.error": true, "input.required": true, "resource.limit": true, "user.spam": true }, "annoyed_threshold": 3, // 10秒内收到3个提示触发“用户刷屏”彩蛋 "annoyed_window_seconds": 10, "silent_window_seconds": 5, // 短于5秒的任务不播放完成音效 "headphones_only": true, // 仅在检测到耳机时播放声音 "suppress_sound_when_tab_focused": true, // 当前终端标签页聚焦时不播放声音 "default_pack": "glados", "pack_rotation": ["peon", "sc_kerrigan", "portal_turret"], "pack_rotation_mode": "random", "path_rules": [ { "pattern": "*/work/*", "pack": "glados" } ] }4.3 与不同AI助手的集成
Peon Ping 通过适配器脚本与各种IDE和CLI工具集成。安装程序通常会尝试自动检测并配置钩子。以下是手动检查或配置的方法:
Claude Code:钩子配置通常在~/.claude/settings.json。安装后应看到类似内容:
{ "hooks": { "session.start": [{ "command": "/path/to/peon-ping/adapters/claude.sh session.start" }], "afterAgentResponse": [{ "command": "/path/to/peon-ping/adapters/claude.sh afterAgentResponse" }], "stop": [{ "command": "/path/to/peon-ping/adapters/claude.sh stop" }] } }Cursor:配置位于~/.cursor/hooks.json:
{ "version": 1, "hooks": { "afterAgentResponse": [{ "command": "bash /path/to/peon-ping/adapters/cursor.sh afterAgentResponse" }], "stop": [{ "command": "bash /path/to/peon-ping/adapters/cursor.sh stop" }] } }通用检查:如果声音不工作,首先运行peon status --verbose检查守护进程状态、音频输出设备以及已检测到的IDE集成。常见的集成失败原因是钩子配置文件路径错误或权限问题。
5. 高级使用技巧与场景配置
5.1 精细化场景控制:静音、仅通知、仅声音
Peon Ping 的三个控制维度(声音、桌面通知、移动通知)是独立的,可以灵活组合:
| 场景需求 | 配置命令 | 效果 |
|---|---|---|
| 开会时完全静音 | peon pause | 所有声音停止,但桌面和移动通知照常。 |
| 需要视觉提示但不想打扰他人 | peon notifications off或peon popups off | 声音照常播放,但桌面横幅关闭。适合戴耳机工作。 |
| 仅需视觉提示(图书馆/深夜) | peon pause且desktop_notifications: true | 无声音,只有桌面横幅。 |
| 临时禁用所有反馈 | peon pause && peon notifications off | 声音和桌面通知均关闭。可通过/peon-ping-toggle快速恢复。 |
| 仅通过手机接收关键通知 | 配置mobile_notify,并设置desktop_notifications: false | 桌面无打扰,手机接收推送。适合离开座位时。 |
快速切换技巧:在Claude Code中,直接使用斜杠命令/peon-ping-toggle可以一键切换声音的开启/关闭状态,这是会议期间最常用的操作。
5.2 基于上下文的智能提示
1. 项目名称智能识别:通知横幅和终端标题会显示项目名。其识别优先级如下:
- 手动通过
/peon-ping-rename <项目名>设置(最高)。 - 环境变量
CLAUDE_SESSION_NAME。 - 项目根目录下的
.peon-label文件内容。 - 自定义脚本
notification_title_script的输出。 project_name_map配置中的映射。- Git仓库名(如果当前目录在Git仓库中)。
- 当前目录的文件夹名(最低)。
你可以通过peon notifications label “我的大项目”来手动覆盖当前会话的标签。
2. 会议检测与自动静音:配置"meeting_detect": true后,Peon Ping 会监听系统麦克风状态。当检测到麦克风被占用(如你在进行Zoom/Teams会议)时,会自动暂停音频播放,仅保留视觉通知。会议结束后,音频自动恢复。这是一个非常贴心的“勿扰”功能。
3. 终端标签页聚焦感知:设置"suppress_sound_when_tab_focused": true(仅macOS)。当你正盯着触发事件的终端标签页工作时,AI完成任务不会播放声音(因为你已经看到了)。只有当事件来自后台标签页时,才会播放声音提醒你切换过去。这符合“通知是用于引起对未关注事物的注意”这一原则。
5.3 移动通知集成(ntfy)
对于需要离开工位,但又不想错过AI完成重要任务的情况,可以设置移动推送。
- 获取一个ntfy主题(Topic):访问 ntfy.sh 或自建ntfy服务器,创建一个唯一的主题名,例如
mysecret-peon-alerts。 - 配置Peon Ping:
这会将你的设备订阅到该主题。任何发送到此主题的消息都会推送到你的手机。peon mobile ntfy mysecret-peon-alerts - 安装ntfy手机App:在iOS或Android上安装ntfy应用,并添加你创建的主题。
- 测试:运行
peon mobile test,你的手机应该会收到一条测试通知。
现在,当AI完成任务或需要输入时,你的手机也会收到推送。你可以通过peon mobile off关闭此功能。移动通知的触发规则与桌面通知相互独立,可以在配置中精细控制。
5.4 Peon Trainer:你的编码健身教练
这是一个内置的趣味功能,将你的“苦工”AI助手变成了一个健身监督员。
原理:Trainer模式会利用你的编码会话作为计时器。每次开始新会话(session.start)时,它会鼓励你先做几个动作(如“Drop and give me twenty!”)。随后,在会话进行中,每隔大约20分钟的活动时间,它就会发出提醒,催促你进行下一组锻炼。
使用方法:
# 1. 开启教练模式 peon trainer on # 2. 设置每日目标(例如,总计300个标准动作单位) peon trainer goal 300 # 3. 开始编码。每隔20分钟左右,你会听到“You not working!”之类的催促。 # 4. 完成一组锻炼后,记录日志 peon trainer log 25 pushups peon trainer log 15 squats # 5. 查看今日进度 peon trainer status训练数据以天为单位存储,每天午夜自动清零。你可以为不同动作设置不同的每日目标,甚至设置周计划(例如周一练胸,周二练腿)。这是一个巧妙地将健康提醒融入工作流的例子。
6. 故障排查与常见问题
6.1 安装与启动问题
问题:安装后没有声音。
- 检查守护进程:运行
peon status。如果显示peon-ping daemon is not running,尝试手动启动peon-ping --daemon &。 - 检查钩子配置:确认你的AI助手(如Claude Code)的配置文件(
~/.claude/settings.json)中包含了Peon Ping的钩子命令。路径必须是绝对路径。 - 检查音频输出:运行
peon status --verbose,查看Audio output是否识别到了正确的设备。在Linux上,确保PulseAudio或PipeWire服务正在运行。 - WSL2特定问题:确保已安装
ffmpeg。如果使用WSLg,确保Windows端的音频服务正常。可以尝试在Windows PowerShell中运行peon relay --daemon来启动音频中继服务。
问题:通知不显示。
- 检查通知开关:运行
peon notifications on。 - 检查通知样式:
peon status --verbose查看Desktop notifications和Notification style。如果样式是standard但没看到通知,可能是系统通知被屏蔽了。尝试切换到overlay样式。 - macOS权限:确保终端应用(如Terminal, iTerm2)有“辅助功能”权限(系统设置 > 隐私与安全性 > 辅助功能)。
6.2 音效包相关问题
问题:切换音效包无效,始终是默认包。
- 检查包是否安装:运行
peon packs list,确认你想用的包在已安装列表中。 - 检查规则优先级:使用
peon debug on开启调试模式,然后触发一个事件。查看日志(peon logs --last 20),会输出详细的包选择决策过程,显示每一层规则匹配的结果。 - 注意排除目录:如果你的当前路径匹配
exclude_dirs,则会跳过path_rules。
问题:自定义音效包不工作。
- 检查目录结构:必须严格遵循
pack_name/event_category/audio_file.wav的结构,并包含有效的manifest.json。 - 检查manifest文件:确保
manifest.json中的name和categories定义正确。 - 使用本地安装测试:将你的包目录放在
~/.claude/hooks/peon-ping/packs/下,然后运行peon packs use <你的包名>。
6.3 性能与资源问题
问题:感觉有延迟,或者AI助手响应变慢。
- Peon Ping的钩子脚本执行非常快(毫秒级),通常不会造成可感知的延迟。如果感觉慢,可能是网络问题或AI助手本身的原因。
- 可以运行
peon debug on然后查看日志,确认钩子被调用和音效播放的时间戳。如果播放音效本身有延迟,可能是音频文件过大或系统音频服务问题。
问题:守护进程占用CPU过高。
- 正常情况下,守护进程在空闲时CPU占用接近0。如果持续偏高,可能是陷入了某种循环。尝试重启守护进程:
pkill -f peon-ping-daemon,然后重新启动。
6.4 日志与调试
最重要的调试命令:
# 开启详细调试日志 peon debug on # 触发一个AI事件(如在Claude Code中执行一个命令),然后查看最新日志 peon logs --last 50 # 过滤特定会话的日志 peon logs --session <session_id> # 查看守护进程详细状态 peon status --verbose日志文件位于~/.claude/hooks/peon-ping/logs/目录下,按日期分割。它们记录了每个事件的详细信息、包选择逻辑、错误信息等,是排查问题的第一手资料。
7. 项目演进与社区生态
Peon Ping 从一个解决个人痛点的脚本,成长为一个拥有活跃社区的开源项目,其演进路径值得借鉴。
1. 从工具到标准(CESP):项目的关键转折点是提出CESP规范。这避免了项目被锁定在单一的实现上,而是致力于构建一个开放的、可互操作的生态系统。任何开发者都可以制作符合CESP规范的音效包,并在任何支持该规范的播放器中使用。
2. 社区音效包仓库(openpeon.com):项目维护了一个社区音效包注册中心。开发者可以提交自己的音效包,用户可以通过peon packs install <packname>直接从社区安装。这极大地丰富了用户体验,从《毁灭战士》的BFG到《瑞克和莫蒂》的Mr. Meeseeks,应有尽有。
3. 声明式配置与基础设施即代码:通过提供Nix/Home Manager模块,项目拥抱了“基础设施即代码”和“可复现环境”的理念。高级用户可以将Peon Ping的配置完全编码化,与他们的开发环境配置一起进行版本管理。
4. MCP(Model Context Protocol)集成:Peon Ping 提供了一个MCP服务器。这意味着支持MCP的AI助手(如Claude Desktop)可以直接通过对话与Peon Ping交互,例如让AI自己选择喜欢的提示音效包。这代表了AI工具间更深层次的、标准化的集成方式。
未来可能的演进方向:
- 更多事件类型:如
task.progress(任务进度更新)、session.idle(代理空闲超时)。 - 可视化仪表板:一个图形界面来管理音效包、查看历史事件、配置复杂规则。
- 与其他自动化工具集成:例如,当AI遇到构建错误时,不仅播放错误音效,还可以自动在Slack频道发送警报。
- 基于AI的智能音效选择:根据当前任务类型(调试、重构、编写测试)或代码库情绪(测试通过率下降)自动选择合适的音效主题。
Peon Ping 的成功证明,在追求开发效率的工具链中,“用户体验”和“人性化交互”同样拥有巨大价值。它将原本沉默的、异步的AI协作过程,变得有声有色,富有情感,最终提升了人机协作的整体效率和愉悦感。
