peon-ping
peon-ping 是一款专为开发者设计的趣味通知工具,旨在解决在使用 AI 编程助手(如 Claude Code、GitHub Copilot、Cursor 等)时,因等待任务完成或权限确认而频繁查看终端、导致注意力分散的痛点。它不再让你枯燥地“盯着”屏幕,而是当 AI 代理需要关注时,通过播放《魔兽争霸》、《星际争霸》、《传送门》等经典游戏的角色语音,并配合醒目的屏幕横幅,主动向你发出提醒。
这款工具特别适合广大软件工程师、全栈开发者以及重度依赖 AI 辅助编码的技术人员。无论是本地开发、远程 SSH 连接,还是在 WSL2 和各类容器中工作,peon-ping 都能无缝集成。其独特的技术亮点在于支持跨平台(macOS、Linux、Windows)和多 IDE 适配,并引入了 MCP(模型上下文协议)服务器机制,允许 AI 代理根据上下文智能选择特定的音效进行反馈。此外,它还提供了丰富的声音包自定义选项和移动端通知支持。通过 peon-ping,你可以更从容地离开终端去处理其他事务,待听到熟悉的"Work work!"语音时再回归,从而有效保护心流状态,提升开发效率与乐趣。
使用场景
资深后端工程师李明正在使用 Claude Code 重构一个遗留的微服务模块,该任务涉及大量代码生成与依赖修复,预计耗时数小时且需人工确认关键决策。
没有 peon-ping 时
- 频繁无效检查:李明不敢离开终端去处理邮件或开会,每隔几分钟就要切回窗口查看 AI 是否卡住或已完成,严重打断心流。
- 错过关键交互:当 AI 遇到权限请求或模糊逻辑需要人类确认时,因无人响应而长时间空转,浪费宝贵的计算资源和等待时间。
- 上下文丢失成本高:一旦因分心未及时响应导致任务暂停,重新回顾代码逻辑和 AI 思路往往需要额外 15 分钟来恢复状态。
- 远程开发盲区:在通过 SSH 连接远程服务器开发时,缺乏直观的视觉或听觉反馈,完全无法感知后台 Agent 的运行状态。
使用 peon-ping 后
- 听觉状态感知:peon-ping 在 AI 开始工作、完成任务或需要确认时,分别播放《魔兽争霸》中苦力"Work work"、"Job done"或警示语音,李明无需看屏即可掌握进度。
- 即时响应机制:当 AI 发出特定语音提示需要决策时,李明能立即从其他工作中切换回来处理,确保开发流程零延迟衔接。
- 沉浸式大屏提醒:屏幕上同步弹出醒目的游戏风格横幅(如星际争霸风格),即使戴着降噪耳机也能通过视觉余光捕捉到关键通知。
- 多环境无缝覆盖:无论是在本地 macOS、WSL2 还是远程 SSH 会话中,peon-ping 都能稳定推送通知,彻底消除远程开发的“黑盒”焦虑。
peon-ping 通过将枯燥的终端状态转化为生动的游戏化音画反馈,让开发者从“看守终端”的琐事中解放,真正实现人机协作的流畅心流。
运行环境要求
- Linux
- macOS
- Windows
无 GPU 需求
未说明

快速开始
peon-ping
当你的 AI 编码助手需要关注时,会播放游戏角色语音台词并显示视觉叠加通知——或者让助手通过 MCP 自行选择声音。
AI 编码助手在完成任务或需要权限时不会提醒你。你一不小心切换了标签页、注意力分散,结果又浪费了 15 分钟才重新进入工作状态。peon-ping 通过来自《魔兽争霸》、《星际争霸》、《传送门》、《塞尔达传说》等游戏的语音台词和醒目的屏幕弹窗来解决这个问题——它适用于 Claude Code、Amp、GitHub Copilot、Codex、Cursor、OpenCode、Kilo CLI、Kiro、Kimi Code、Windsurf、Google Antigravity、Rovo Dev CLI、DeepAgents 以及任何支持 MCP 的客户端。
观看实际效果 → peonping.com
安装
方法 1:Homebrew(推荐)
brew install PeonPing/tap/peon-ping
然后运行 peon-ping-setup 注册钩子并下载音效包。适用于 macOS 和 Linux。
方法 2:安装脚本(macOS、Linux、WSL2)
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash
⚠️ 在 WSL2 中,必须安装 ffmpeg 才能使用非 WAV 格式的音效包。在 Debian 发行版中,请使用以下命令安装:
sudo apt update; sudo apt install -y ffmpeg
方法 3:Windows 安装程序
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.ps1" -UseBasicParsing | Invoke-Expression
默认安装 5 个精选包(《魔兽争霸》、《星际争霸》、《传送门》)。再次运行可更新,同时保留配置和状态。或者 在 peonping.com 上交互式选择音效包,获取自定义安装命令。
有用的安装标志:
--all— 安装所有可用的音效包--packs=peon,sc_kerrigan,...— 只安装特定的音效包--local— 将音效包、配置和钩子安装到当前项目的./.claude/目录下--global— 显式全局安装(与默认设置相同)--init-local-config— 仅创建./.claude/hooks/peon-ping/config.json
--local 不会修改你的 shell 配置文件(不会注入全局 peon 别名或补全功能)。钩子会以绝对路径注册在项目级别的 ./.claude/settings.json 中,因此无论你在项目中的哪个工作目录,它们都能正常工作。
示例:
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash -s -- --all
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash -s -- --packs=peon,sc_kerrigan
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash -s -- --local
如果已经存在全局安装而你尝试进行本地安装(或反之),安装程序会提示你先移除现有的安装,以免发生冲突。
方法 4:先克隆并检查
git clone https://github.com/PeonPing/peon-ping.git
cd peon-ping
./install.sh
方法 5:Nix(macOS、Linux)
无需安装即可直接从源代码运行:
nix run github:PeonPing/peon-ping -- status
nix run github:PeonPing/peon-ping -- packs install peon
或者将其安装到你的用户配置文件中:
nix profile install github:PeonPing/peon-ping
开发环境(bats、shellcheck、nodejs):
nix develop # 或使用 direnv
Home Manager 模块(声明式配置)
对于可重复的配置,可以使用 Home Manager 模块:
# 在你的 home.nix 或 flake.nix 中
{ inputs, pkgs, ... }:
let
peonCursorAdapterPath = "${inputs.peon-ping.packages.${pkgs.system}.default}/share/peon-ping/adapters/cursor.sh";
in {
imports = [ inputs.peon-ping.homeManagerModules.default ];
programs.peon-ping = {
enable = true;
package = inputs.peon-ping.packages.${pkgs.system}.default;
settings = {
default_pack = "glados";
volume = 0.7;
enabled = true;
desktop_notifications = true;
categories = {
"session.start" = true;
"task.complete" = true;
"task.error" = true;
"input.required" = true;
"resource.limit" = true;
"user.spam" = true;
};
};
# 从 og-packs(简单字符串表示法)和自定义源(包含 name + src 的 attrset)安装音效包
installPacks = [
"peon"
"glados"
"sc_kerrigan"
# 来自 GitHub 的自定义音效包(openpeon.com 注册表)
{
name = "mr_meeseeks";
src = pkgs.fetchFromGitHub {
owner = "kasperhendriks";
repo = "openpeon-mrmeeseeks";
rev = "main"; # 或使用提交哈希以确保可重复性
sha256 = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
}
];
enableZshIntegration = true;
};
# 光标钩子
home.file.".cursor/hooks.json".text = builtins.toJSON {
version = 1;
hooks = {
afterAgentResponse = [{ command = "bash ${peonCursorAdapterPath} afterAgentResponse"; }];
stop = [{ command = "bash ${peonCursorAdapterPath} stop"; }];
};
};
}
音效包安装:installPacks 选项支持两种格式:
- 简单字符串(例如
"peon"、"glados")——从 og-packs 仓库获取 - 自定义源——一个包含
name和src字段的 attrset,其中src可以是任何 Nix 获取器的结果(例如pkgs.fetchFromGitHub)
对于在 openpeon.com 上列出的音效包,请找到其 GitHub 仓库链接,并使用 pkgs.fetchFromGitHub:
{
name = "pack_name";
src = pkgs.fetchFromGitHub {
owner = "github-owner";
repo = "repo-name";
rev = "main"; # 或者使用具体的提交哈希或标签
sha256 = ""; # 初次留空,Nix 会提示正确的哈希值
};
}
IDE 钩子:peon-ping Home Manager 模块不会自动设置你的 IDE 钩子,以避免更新冲突。你需要根据自己的 IDE 配置方式自行定义这些钩子(见上文示例)。
- peon-ping 提供了适用于多种 IDE 的适配脚本,例如
cursor.sh— 参见adapters/ - 你需要在钩子中调用这些脚本,例如:
如上文光标示例所示。${inputs.peon-ping.packages.${pkgs.system}.default}/share/peon-ping/adapters/$YOUR_IDE.sh EVENT_NAME
你会听到的内容
| 事件 | CESP 分类 | 示例 |
|---|---|---|
| 会话开始 | session.start |
"准备好了吗?", "嗯?", "你想做什么?" |
| 任务完成 | task.complete |
"加油!", "我可以搞定。", "好的,没问题。" |
| 需要权限 | input.required |
"有什么需要做的吗?", "嗯?", "你想干什么?" |
| 工具或命令错误 | task.error |
"我做不到。", "该死!" |
| 代理确认任务 | task.acknowledge |
"明白。", "马上处理。" (默认关闭) |
| 使用率或令牌限制被触发 | resource.limit |
"嘟嘟嘟。" (取决于具体音效包) |
| 连续快速提示(10 秒内 3 次以上) | user.spam |
"我很忙,别打扰我!" |
此外,在每个屏幕(macOS/WSL/MSYS2)上还会显示大型覆盖式横幅通知,并在终端标签页标题中显示 ● 项目:已完成——即使你在其他应用中,也能立即知道发生了什么。
peon-ping 实现了 Coding Event Sound Pack Specification (CESP)——一种开放标准,用于编码事件音效,任何智能型 IDE 都可以采用。
快速控制
在会议或配对会话期间需要静音声音和通知吗?有两种方法:
| 方法 | 命令 | 适用场景 |
|---|---|---|
| 斜杠命令 | /peon-ping-toggle |
在 Claude Code 中工作时 |
| CLI | peon toggle |
从任何终端标签页 |
其他 CLI 命令:
peon pause # 静音
peon resume # 取消静音
peon mute # “pause”的别名
peon unmute # “resume”的别名
peon status # 检查是否已暂停或启用(简洁)
peon status --verbose # 显示完整详情(通知、耳机、IDE 等)
peon volume # 显示当前音量
peon volume 0.7 # 设置音量(0.0–1.0)
peon rotation # 显示当前轮换模式
peon rotation random # 设置轮换模式(随机|轮循|会话覆盖)
peon packs list # 列出已安装的声音包
peon packs list --registry # 浏览注册表中所有可用包
peon packs community # 列出按信任等级分组的所有注册表包(Windows)
peon packs search <query> # 按名称搜索注册表包(Windows)
peon packs install <p1,p2> # 从注册表安装包
peon packs install --all # 安装注册表中的所有包
peon packs install-local <path> # 从本地目录安装包
peon packs use <name> # 切换到特定包(在 Windows 上会自动从注册表安装)
peon packs use --install <name> # 切换到指定包,必要时从注册表安装
peon packs next # 循环切换到下一个包
peon packs remove <p1,p2> # 移除特定包
peon packs bind <name> # 将包绑定到当前目录
peon packs bind --pattern <path> # 将包绑定到目录模式,例如 "*/services"
peon packs unbind # 移除当前目录的绑定
peon packs bindings # 列出所有已分配的绑定
peon notifications on # 启用桌面通知
peon notifications off # 禁用桌面通知
peon notifications overlay # 使用大型叠加横幅(默认)
peon notifications standard # 使用标准系统通知
peon notifications test # 发送测试通知
peon notifications position [pos] # 获取/设置通知位置(左上、中上、右上、左下、中下、右下)
peon notifications dismiss [N] # 获取/设置自动关闭时间(秒)(0 = 持续显示)
peon notifications label [text|reset] # 获取/设置通知的项目标签覆盖
peon notifications template [key] [fmt] # 获取/设置/重置消息模板(键:停止、权限、错误、空闲、提问)
peon preview # 播放 session.start 中的所有声音
peon preview <category> # 播放特定类别中的所有声音
peon preview --list # 列出活动包中的所有类别
peon mobile ntfy <topic> # 设置手机通知(免费)
peon mobile off # 禁用手机通知
peon mobile test # 发送测试通知
peon debug on # 启用调试日志
peon debug off # 禁用调试日志
peon debug status # 显示调试状态、日志目录、文件数量及总大小
peon logs # 显示今日日志的最后 50 行
peon logs --last N # 显示所有日志文件中的最后 N 行
peon logs --session ID # 按会话 ID 过滤今日日志
peon logs --session ID --all # 在所有日志文件中搜索会话 ID
peon logs --clear # 删除所有日志文件(需确认)
peon relay --daemon # 启动音频中继(用于 SSH/devcontainer)
peon relay --stop # 停止后台中继
peon preview 可用的 CESP 类别:session.start、task.acknowledge、task.complete、task.error、input.required、resource.limit、user.spam。 (扩展类别 session.end 和 task.progress 已在 CESP 规范中定义,并由包清单支持,但目前尚未由内置钩子事件触发。)
支持选项卡补全——输入 peon packs use <TAB> 即可查看可用包名。
暂停会立即静音声音和桌面通知。暂停状态会持续到您恢复为止。暂停时标签页标题仍保持活跃。
配置
peon-ping 会在 Claude Code 中安装以下斜杠命令:
/peon-ping-toggle— 静音/取消静音声音/peon-ping-config— 更改任何设置(音量、包、类别等)/peon-ping-rename <name>— 为当前会话命名,该名称将显示在通知标题和终端标签页标题中(零令牌,被钩子拦截);不提供参数则恢复为自动检测
您也可以直接让 Claude 为您更改设置——例如“启用轮循包轮换”、“将音量设为 0.3”或“将 glados 添加到我的包轮换中”。无需手动编辑配置文件。
配置文件的位置取决于安装方式:
- 全局安装:
$CLAUDE_CONFIG_DIR/hooks/peon-ping/config.json(默认~/.claude/hooks/peon-ping/config.json) - 本地安装:
./.claude/hooks/peon-ping/config.json
{
"volume": 0.5,
"categories": {
"session.start": true,
"task.acknowledge": true,
"task.complete": true,
"task.error": true,
"input.required": true,
"resource.limit": true,
"user.spam": true
}
}
独立控制
peon-ping 提供三种可自由组合的独立控制:
| 配置键 | 控制项 | 影响声音 | 影响桌面弹窗 | 影响手机推送 |
|---|---|---|---|---|
enabled |
主音频开关 | ✅ 是 | ❌ 否 | ❌ 否 |
desktop_notifications |
桌面弹窗横幅 | ❌ 否 | ✅ 是 | ❌ 否 |
mobile_notify.enabled |
手机推送通知 | ❌ 否 | ❌ 否 | ✅ 是 |
这意味着您可以:
保留声音但禁用桌面弹窗:
peon notifications off保留桌面弹窗但禁用声音:
peon pause启用手机推送而不启用桌面弹窗:将
desktop_notifications: false和mobile_notify.enabled: truevolume: 0.0–1.0(安静到适合办公室)
desktop_notifications:
true/false— 独立于声音开关桌面通知弹窗(默认:true)。禁用后,声音仍会播放,但视觉弹窗会被屏蔽。移动通知不受影响。notification_style:
"overlay"或"standard"— 控制桌面通知的显示方式(默认:"overlay")- overlay: 大型、醒目的横幅——macOS 上为 JXA Cocoa 叠加层,WSL/MSYS2 上为 Windows Forms 弹窗。点击叠加层会将终端窗口置顶(支持 Ghostty、Warp、iTerm2、Zed、Terminal.app)。在 iTerm2 中,点击不仅会将应用置顶,还会聚焦正确的标签页/窗格/窗口。
- standard: 系统通知——macOS 上使用
terminal-notifier/osascript,WSL/MSYS2 上使用 Windows 通知气泡。安装terminal-notifier后(brew install terminal-notifier),点击标准通知会自动将终端窗口置顶(支持 Ghostty、Warp、iTerm2、Zed、Terminal.app)。在原生 Windows 系统中,点击通知气泡会将 IDE 或终端窗口置顶(支持 VS Code、Cursor、Windsurf、Windows Terminal、PowerShell)。当有多个窗口打开时,通知会通过基于 PID 的进程树匹配,精准定位到触发事件的窗口。
overlay_theme:
"jarvis"、"glass"、"sakura",或省略以使用默认叠加层主题——仅适用于 macOS(默认:无)- jarvis: 圆形 HUD,带有旋转弧线、刻度标记和进度环。
- glass: 玻璃质感面板,配有强调色条、进度线和时间戳。
- sakura: 极简禅意花园,点缀盆景树与飘落的樱花花瓣动画。
categories: 开关各个 CESP 声音分类(例如,
"session.start": false可禁用问候音)。annoyed_threshold / annoyed_window_seconds: 在 N 秒内收到多少条提示会触发
user.spam彩蛋。silent_window_seconds: 对持续时间少于 N 秒的任务,抑制
task.complete音效及通知。(例如,设置为10表示只有超过 10 秒的任务才会发出音效。)session_start_cooldown_seconds(数字,默认:
30):用于去重同时启动的多个工作区的问候音效(如同时打开 OpenCode 或 Cursor 并加载多个文件夹)。仅第一个会话的开始会播放问候音,此窗口内的后续会话则保持静音。设为0可禁用去重功能,始终播放问候音。suppress_subagent_complete(布尔值,默认:
false):当子代理会话结束时,抑制task.complete音效及通知。当 Claude Code 的任务工具并行调度多个子代理时,每个子代理都会触发完成音效——将其设置为true,则只会听到父会话的完成音效。default_pack: 当没有更具体的规则适用时使用的回退包(默认:
"peon")。取代了旧的active_pack键——现有配置会在peon update时自动迁移。path_rules:
{ "pattern": "...", "pack": "..." }对象数组。根据工作目录,使用 glob 匹配规则(*、?)为会话分配特定包。优先匹配第一个规则。该规则优先于pack_rotation和default_pack;但会被session_override分配覆盖。"path_rules": [ { "pattern": "*/work/client-a/*", "pack": "glados" }, { "pattern": "*/personal/*", "pack": "peon" } ]pack_rotation: 包名数组(如
["peon", "sc_kerrigan", "peasant"])。当pack_rotation_mode为random或round-robin时使用。留空[]则仅使用default_pack(或path_rules)。pack_rotation_mode:
"random"(默认)、"round-robin"或"session_override"。在random/round-robin模式下,每个会话会从pack_rotation中随机选择一个包。而在session_override模式下,可通过/peon-ping-use <pack>命令为每个会话指定包。无效或缺失的包会按层级顺序回退。("agentskill"被视为"session_override"的旧别名,仍可接受。)session_ttl_days(数字,默认:7):使超过 N 天的会话级包分配失效。防止在使用
session_override模式时.state.json文件无限增长。headphones_only(布尔值,默认:
false):仅在检测到耳机或外部音频设备时播放声音。启用后,若当前输出为内置扬声器,则会抑制声音——这在开放式办公室中非常实用。可通过peon status查看状态。支持 macOS(通过system_profiler)和 Linux(通过 PipeWirewpctl或 PulseAudiopactl)。suppress_sound_when_tab_focused(布尔值,默认:
false):当触发钩子事件的终端标签页为当前活动/聚焦的标签页时,跳过声音播放。后台标签页的声音仍会正常播放,作为提醒其他地方发生了某些事情。桌面和移动通知不受影响。适用于仅希望从未查看的标签页获取音频提示的情况。仅限 macOS(使用osascript检查前台应用及 iTerm2 标签页焦点)。meeting_detect 检测麦克风是否正在使用,并暂时抑制音频,直到麦克风不再使用为止。通知仍会显示。
notification_position(字符串,默认:
"top-center"):叠加式通知在屏幕上的显示位置。选项包括:"top-left"、"top-center"、"top-right"、"bottom-left"、"bottom-center"、"bottom-right"。notification_dismiss_seconds(数字,默认:4):叠加式通知在 N 秒后自动消失。设置为
0可使通知持续显示,需手动关闭。notification_all_screens(布尔值,默认:
true):叠加式通知显示在所有屏幕上(true)或仅主屏幕上(false)。此前,主题叠加层(glass、jarvis、sakura)仅显示在单个屏幕上——使用这些主题的现有配置会自动迁移到false。仅适用于 macOS。CLAUDE_SESSION_NAME环境变量:在启动claude之前设置,为会话命名自定义名称。该名称会同时显示在桌面通知标题和终端标签页标题中。优先级高于所有基于配置的命名方式。示例:CLAUDE_SESSION_NAME="Auth Refactor" claude或先执行export CLAUDE_SESSION_NAME="Feature: Auth"再运行claude。由于 peon-ping 作为该 Claude 实例的子进程运行,每个终端会自动获得各自的标题。notification_title_override(字符串,默认:
""):覆盖通知标题中显示的项目名称。为空时,项目名称将自动从/peon-ping-rename>CLAUDE_SESSION_NAME>.peon-label>notification_title_script>project_name_map> Git 仓库名 > 文件夹名中推断得出。notification_title_script(字符串,默认:
""):在事件发生时运行的 Shell 命令,用于动态计算项目名称。接收以下环境变量:PEON_SESSION_ID、PEON_CWD、PEON_HOOK_EVENT、PEON_SESSION_NAME。使用标准输出(截取前 50 个字符);非零退出码则会传递到下一层次。示例:"basename $PEON_CWD"。project_name_map(对象,默认:
{}):将目录路径映射为通知中显示的自定义项目标签。键为路径模式,值为显示名称。示例:{ "/home/user/work/client-a": "Client A" }。notification_templates(对象,默认:
{}):针对通知事件的自定义消息格式字符串。键为事件类型(stop、permission、error、idle、question),值为带变量替换的模板字符串。可用变量包括:{project}、{summary}、{tool_name}、{status}、{event}。示例:{ "stop": "{project}: {summary}", "permission": "{project}: {tool_name} 需要批准" }。
声音包选择层级
peon-ping 通过一个五层的优先级体系来决定使用哪个声音包。最先找到有效且已安装的声音包即为最终选择:
| 优先级 | 层级 | 来源 | 设置方法 |
|---|---|---|---|
| 1(最高) | session_override | 每会话覆盖设置 | /peon-ping-use <pack> 技能或 MCP |
| 2 | path_rules | 工作目录的 glob 匹配 | peon packs bind 或配置中的 path_rules |
| 3 | pack_rotation | 随机或轮询列表 | 配置中的 pack_rotation 数组 + pack_rotation_mode |
| 4 | default_pack | 静态回退 | peon packs use <name> 或配置中的 default_pack |
| 5(最低) | hardcoded | 内置默认 | "peon" |
如果某一层引用了未安装的声音包,则会自动降级到下一层。
按项目分配声音包(path_rules)
根据目录路径为不同项目分配不同的声音包。可通过 CLI 或直接编辑 config.json 进行设置。
CLI(推荐):
peon packs bind glados # 将 glados 绑定到当前目录
peon packs bind sc_kerrigan --pattern "*/services/*" # 绑定到 glob 模式
peon packs bind duke_nukem --install # 绑定并从注册表安装所需包
peon packs unbind # 移除当前目录的绑定
peon packs unbind --pattern "*/services/*" # 移除特定模式的绑定
peon packs bindings # 列出所有绑定
手动配置:
"path_rules": [
{ "pattern": "*/work/client-a/*", "pack": "glados" },
{ "pattern": "*/personal/*", "pack": "peon" },
{ "pattern": "*/services/*", "pack": "sc_kerrigan" }
]
规则使用 glob 匹配(*, ?)。优先匹配第一个规则。路径规则会覆盖 pack_rotation 和 default_pack,但会被 session_override 覆盖。
常见用例
只响声不弹窗
想要语音反馈但不想有视觉干扰?
peon notifications off
这将保持所有声音类别正常播放,同时屏蔽桌面通知横幅。若已配置移动通知,则仍会正常工作。
你也可以使用别名:
peon popups off
仅通知无声模式
想要视觉提醒但不要声音?
peon pause # 或在配置中将 "enabled" 设置为 false
当 desktop_notifications: true 时,你会收到弹窗提示,但不会有声音。
完全静音
禁用所有功能:
peon pause
peon notifications off
peon mobile off
Peon 训练师
你的 peon 也是你的私人教练。内置 Pavel 风格的每日锻炼模式——那个曾经喊着“干活干活”的兽人现在会催促你做俯卧撑和深蹲。
快速开始
peon trainer on # 启动训练模式
peon trainer goal 200 # 设置每日目标(默认:300/300)
# ... 编码一段时间后,peon 大约每 20 分钟提醒一次 ...
peon trainer log 25 pushups # 记录完成情况
peon trainer log 30 squats
peon trainer status # 查看进度
工作原理
训练提醒与你的编码会话同步进行。当你开始新会话时,peon 会立即鼓励你先做俯卧撑再写代码。随后,每活跃编码约 20 分钟,你就会听到 peon 催促你继续锻炼。无需后台守护进程。使用 peon trainer log 记录完成次数,进度将在午夜自动重置。
命令
| 命令 | 描述 |
|---|---|
peon trainer on |
启动训练模式 |
peon trainer off |
关闭训练模式 |
peon trainer status |
查看今日进度 |
peon trainer log <n> <exercise> |
记录锻炼次数(例如 log 25 pushups) |
peon trainer goal <n> |
设置所有锻炼项目的总目标 |
peon trainer goal <exercise> <n> |
设置单个锻炼项目的目标 |
Claude Code 技能
在 Claude Code 中,你可以在不退出对话的情况下记录锻炼次数:
/peon-ping-log 25 pushups
/peon-ping-log 30 squats
自定义语音提示
将你的音频文件放入 ~/.claude/hooks/peon-ping/trainer/sounds/ 目录:
trainer/sounds/session_start/ # 会话开场(“先做俯卧撑,再写代码!Zug zug!”)
trainer/sounds/remind/ # 提醒语句(“有什么需要做的吗?是的。俯卧撑!”)
trainer/sounds/log/ # 确认语句(“干活干活!肌肉可能正在变大!”)
trainer/sounds/complete/ # 庆祝语句(“Zug zug!人类完成了所有动作!”)
trainer/sounds/slacking/ # 失望语句(“Peon 非常失望。”)
更新 trainer/manifest.json 以注册你的音频文件。
MCP 服务器
peon-ping 内置了一个 MCP(模型上下文协议) 服务器,因此任何兼容 MCP 的 AI 助手都可以通过工具调用直接播放声音,无需额外钩子。
关键区别在于:由助手自行选择声音。助手不会在每个事件上自动播放固定声音,而是调用 play_sound 并明确指定所需的声音——例如构建失败时播放 duke_nukem/SonOfABitch,读取文件时播放 sc_kerrigan/IReadYou。
设置
在你的 MCP 客户端配置中添加以下内容(Claude Desktop、Cursor 等):
{
"mcpServers": {
"peon-ping": {
"command": "node",
"args": ["/path/to/peon-ping/mcp/peon-mcp.js"]
}
}
}
若通过 Homebrew 安装:$(brew --prefix peon-ping)/libexec/mcp/peon-mcp.js。完整设置说明请参阅 mcp/README.md。
助手可执行的功能
| 功能 | 描述 |
|---|---|
play_sound |
按键播放一个或多个声音(如 duke_nukem/SonOfABitch、peon/PeonReady1) |
peon-ping://catalog |
完整的声音包目录作为 MCP 资源——客户端只需预取一次,无需重复调用工具 |
peon-ping://pack/{name} |
单个声音包的详细信息及可用声音键 |
需 Node.js 18+。由 @tag-assistant 贡献。
多IDE支持
peon-ping 可与任何支持钩子的代理型IDE配合使用。适配器会将IDE特定的事件转换为CESP标准。
| IDE | 状态 | 设置 |
|---|---|---|
| Claude Code | 内置 | curl | bash 安装即可完成所有配置 |
| Amp | 适配器 | bash adapters/amp.sh / powershell adapters/amp.ps1(设置) |
| Gemini CLI | 适配器 | 添加指向 adapters/gemini.sh(或 Windows 上的 .ps1)的钩子(设置) |
| GitHub Copilot | 适配器 | 将钩子添加到 .github/hooks/hooks.json,指向 adapters/copilot.sh(或 .ps1)(设置) |
| OpenAI Codex | 适配器 | 先安装 peon-ping 运行时,再在 ~/.codex/config.toml 中添加 notify 配置,指向 adapters/codex.sh(或 .ps1)(设置) |
| Cursor | 内置 | curl | bash、peon-ping-setup 或 Windows 的 install.ps1 会自动检测并注册钩子。在 Windows 上,请启用 设置 → 功能 → 第三方技能,以便 Cursor 加载 ~/.claude/settings.json 来播放会话开始/结束的声音。 |
| OpenCode | 适配器 | bash adapters/opencode.sh / powershell adapters/opencode.ps1(设置) |
| Kilo CLI | 适配器 | bash adapters/kilo.sh / powershell adapters/kilo.ps1(设置) |
| Kiro | 适配器 | 添加指向 adapters/kiro.sh(或 .ps1)的钩子条目(设置) |
| Windsurf | 适配器 | 添加指向 adapters/windsurf.sh(或 .ps1)的钩子条目(设置) |
| Google Antigravity | 适配器 | bash adapters/antigravity.sh / powershell adapters/antigravity.ps1 |
| Kimi Code | 适配器 | bash adapters/kimi.sh --install / powershell adapters/kimi.ps1 -Install(设置) |
| OpenClaw | 适配器 | 从你的 OpenClaw 技能中调用 adapters/openclaw.sh <event>(或 openclaw.ps1) |
| Rovo Dev CLI | 适配器 | 如果存在 ~/.rovodev,则由 install.sh 自动注册;否则需手动将钩子添加到 ~/.rovodev/config.yml(设置) |
| DeepAgents | 适配器 | bash adapters/deepagents.sh / powershell adapters/deepagents.ps1(设置) |
Windows: 所有适配器都提供原生 PowerShell 版本(
.ps1)。Windows 安装程序(install.ps1)会将这些文件复制到~/.claude/hooks/peon-ping/adapters/。文件系统监视器(Amp、Antigravity、Kimi)使用 .NET 的FileSystemWatcher而不是 fswatch/inotifywait——无需额外依赖。
OpenAI Codex 设置
Codex 支持通过适配器实现,并不会由 peon-ping-setup 自动注册。
Codex 适配器期望 peon-ping 运行时位于 ~/.claude/hooks/peon-ping/,即使你只使用 Codex 而不使用 Claude Code 也是如此。
设置:
先安装 peon-ping 运行时:
bash "$(brew --prefix peon-ping)"/libexec/install.sh --no-rc或使用标准安装脚本:
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash -s -- --no-rc在
~/.codex/config.toml中添加以下内容:notify = ["bash", "~/.claude/hooks/peon-ping/adapters/codex.sh"]重启 Codex。
如果你通过 Homebrew 安装,运行时文件会管理在 ~/.claude/hooks/peon-ping/ 目录下,而 Codex 适配器会将 Codex 的通知事件转发到该共享运行时环境中。
Amp 设置
这是用于 Amp(由 Sourcegraph 开发)的文件系统监视器适配器。Amp 不像 Claude Code 那样暴露事件钩子,因此此适配器会监视 Amp 在磁盘上的线程文件,并检测代理何时完成一轮交互。
设置:
确保已安装 peon-ping(
curl -fsSL https://peonping.com/install | bash)安装
fswatch(macOS)或inotify-tools(Linux):brew install fswatch # macOS sudo apt install inotify-tools # Linux启动监视器:
bash ~/.claude/hooks/peon-ping/adapters/amp.sh # 前台运行 bash ~/.claude/hooks/peon-ping/adapters/amp.sh & # 后台运行
事件映射:
- 新线程文件创建 → 欢迎音效(“准备好了吗?”、“是吗?”)
- 线程文件停止更新 + 代理完成一轮交互 → 完成音效(“工作,工作。”、“任务完成了!”)
工作原理:
适配器会监视 ~/.local/share/amp/threads/ 目录下的 JSON 文件变化。当线程文件停止更新(空闲超时为 1 秒),且最后一则消息来自助手且包含文本内容(而非待处理的工具调用)时,它会发出 Stop 事件——表示代理已完成工作,正在等待你的输入。
环境变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
AMP_DATA_DIR |
~/.local/share/amp |
Amp 数据目录 |
AMP_THREADS_DIR |
$AMP_DATA_DIR/threads |
要监视的线程目录 |
AMP_IDLE_SECONDS |
1 |
在发出 Stop 事件前的无变化秒数 |
AMP_STOP_COOLDOWN |
10 |
每个线程两次 Stop 事件之间的最小间隔秒数 |
GitHub Copilot 设置
一个与 GitHub Copilot 兼容的 Shell 适配器,完全符合 CESP v1.0 标准。
设置步骤:
确保已安装 peon-ping (
curl -fsSL https://peonping.com/install | bash)在你的仓库(默认分支)中创建
.github/hooks/hooks.json文件:{ "version": 1, "hooks": { "sessionStart": [ { "type": "command", "bash": "bash ~/.claude/hooks/peon-ping/adapters/copilot.sh sessionStart" } ], "userPromptSubmitted": [ { "type": "command", "bash": "bash ~/.claude/hooks/peon-ping/adapters/copilot.sh userPromptSubmitted" } ], "postToolUse": [ { "type": "command", "bash": "bash ~/.claude/hooks/peon-ping/adapters/copilot.sh postToolUse" } ], "errorOccurred": [ { "type": "command", "bash": "bash ~/.claude/hooks/peon-ping/adapters/copilot.sh errorOccurred" } ] } }提交并合并到你的默认分支。这些钩子将在你下一次使用 Copilot 代理时生效。
事件映射:
sessionStart→ 欢迎音效(“准备好工作了吗?”、“是的吗?”)userPromptSubmitted→ 第一条提示为问候,后续则触发垃圾信息检测postToolUse→ 完成音效(“工作,工作。”、“任务完成了!”)errorOccurred→ 错误音效(“我做不到。”)preToolUse→ 跳过(噪音太大)sessionEnd→ 无音效(session.end 尚未实现)
功能特性:
- 声音播放:通过
afplay(macOS)、pw-play/paplay/ffplay(Linux)实现——优先级顺序与 Shell 钩子相同。 - CESP 事件映射:GitHub Copilot 钩子映射到标准 CESP 类别(
session.start、task.complete、task.error、user.spam)。 - 桌面通知:默认显示大型覆盖式横幅通知,或常规通知。
- 垃圾信息检测:若在 10 秒内连续收到 3 条以上快速提示,则触发
user.spam语音提示。 - 会话跟踪:为每个 Copilot 会话 ID 分别标记会话。
OpenCode 设置
一个原生 TypeScript 插件,用于 OpenCode,完全符合 CESP v1.0 标准。
快速安装:
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/adapters/opencode.sh | bash
安装程序会将 peon-ping.ts 复制到 ~/.config/opencode/plugins/,并在 ~/.config/opencode/peon-ping/config.json 中创建配置文件。插件包存储在共享的 CESP 路径下(~/.openpeon/packs/)。
功能特性:
- 声音播放:通过
afplay(macOS)、pw-play/paplay/ffplay(Linux)实现——优先级顺序与 Shell 钩子相同。 - CESP 事件映射:
session.created、session.idle、session.error、permission.asked以及快速提示检测等均映射到标准 CESP 类别。 - 桌面通知:默认显示大型覆盖式横幅通知(使用 JXA Cocoa,在所有屏幕上可见),或通过
terminal-notifier/osascript发送常规通知。仅当终端未处于焦点状态时才会触发。 - 终端焦点检测:在发送通知前,通过 AppleScript 检查你的终端应用(Terminal、iTerm2、Warp、Alacritty、kitty、WezTerm、ghostty、Hyper)是否位于前台。
- 标签页标题:更新终端标签页以显示任务状态(“● 项目:正在工作…”、“✓ 项目:完成”、“✗ 项目:出错”)。
- 插件包切换:从配置中读取
default_pack(对于旧版配置则回退到active_pack),并在运行时加载该包的openpeon.json清单文件。path_rules可根据工作目录覆盖默认包。 - 防重复逻辑:避免同一类别中的声音连续两次播放。
- 垃圾信息检测:若在 10 秒内连续收到 3 条以上快速提示,则触发
user.spam语音提示。
🖼️ 截图:带有自定义 peon 图标的桌面通知

提示:安装
terminal-notifier(brew install terminal-notifier),以获得支持副标题和分组的更丰富通知。
🎨 可选:为通知自定义 peon 图标
默认情况下,terminal-notifier 会显示通用的 Terminal 图标。随附脚本使用 macOS 自带工具(sips + iconutil)将其替换为 peon 图标——无需额外依赖。
bash <(curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/adapters/opencode/setup-icon.sh)
或者,如果你已在本地安装(Homebrew 或 git clone):
bash ~/.claude/hooks/peon-ping/adapters/opencode/setup-icon.sh
该脚本会自动查找 peon 图标(Homebrew libexec、OpenCode 配置或 Claude hooks 目录),生成合适的 .icns 文件,备份原始 Terminal.icns,并进行替换。在 brew upgrade terminal-notifier 后请重新运行。
未来:待 jamf/Notifier 上架 Homebrew(#32)后,插件将迁移到该工具——Notifier 内置
--rebrand支持,无需任何图标修改技巧。
Kilo CLI 设置
一个原生 TypeScript 插件,用于 Kilo CLI,完全符合 CESP v1.0 标准。Kilo CLI 是 OpenCode 的一个分支,使用相同的插件系统——此安装程序会下载 OpenCode 插件,并针对 Kilo 进行补丁处理。
快速安装:
curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/adapters/kilo.sh | bash
安装程序会将 peon-ping.ts 复制到 ~/.config/kilo/plugins/,并在 ~/.config/kilo/peon-ping/config.json 中创建配置文件。插件包存储在共享的 CESP 路径下(~/.openpeon/packs/)。
功能特性: 与 OpenCode 适配器 相同——声音播放、CESP 事件映射、桌面通知、终端焦点检测、标签页标题、插件包切换、防重复逻辑以及垃圾信息检测。
Gemini CLI 设置
适用于 Gemini CLI 的 Shell 适配器,完全符合 CESP v1.0 规范。
设置步骤:
确保已安装 peon-ping(
curl -fsSL https://peonping.com/install | bash)。将以下钩子添加到你的
~/.gemini/settings.json文件中:{ "hooks": { "SessionStart": [ { "matcher": "startup", "hooks": [ { "name": "peon-start", "type": "command", "command": "bash ~/.claude/hooks/peon-ping/adapters/gemini.sh SessionStart" } ] } ], "AfterAgent": [ { "matcher": "*", "hooks": [ { "name": "peon-after-agent", "type": "command", "command": "bash ~/.claude/hooks/peon-ping/adapters/gemini.sh AfterAgent" } ] } ], "AfterTool": [ { "matcher": "*", "hooks": [ { "name": "peon-after-tool", "type": "command", "command": "bash ~/.claude/hooks/peon-ping/adapters/gemini.sh AfterTool" } ] } ], "Notification": [ { "matcher": "*", "hooks": [ { "name": "peon-notification", "type": "command", "command": "bash ~/.claude/hooks/peon-ping/adapters/gemini.sh Notification" } ] } ] } }
事件映射:
SessionStart(启动)→ 欢迎音效(“准备好了吗?”、“是的吗?”)AfterAgent→ 任务完成音效(“工作,工作。”、“完成了!”)AfterTool→ 成功 = 任务完成音效,失败 = 错误音效(“我做不到。”)Notification→ 系统通知
Windsurf 设置
将以下内容添加到 ~/.codeium/windsurf/hooks.json(用户级别)或 .windsurf/hooks.json(工作区级别):
{
"hooks": {
"post_cascade_response": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/windsurf.sh post_cascade_response", "show_output": false }
],
"pre_user_prompt": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/windsurf.sh pre_user_prompt", "show_output": false }
],
"post_write_code": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/windsurf.sh post_write_code", "show_output": false }
],
"post_run_command": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/windsurf.sh post_run_command", "show_output": false }
]
}
}
Kiro 设置
创建 ~/.kiro/agents/peon-ping.json 文件:
{
"name": "peon-ping",
"hooks": {
"agentSpawn": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/kiro.sh" }
],
"userPromptSubmit": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/kiro.sh" }
],
"stop": [
{ "command": "bash ~/.claude/hooks/peon-ping/adapters/kiro.sh" }
]
}
}
preToolUse 和 postToolUse 被有意排除——它们会在每次调用工具时触发,会产生大量噪音。
Rovo Dev CLI 设置
适用于 Atlassian 的 Rovo Dev CLI 的 Shell 适配器,完全符合 CESP v1.0 规范。
自动设置:
如果在运行 install.sh 或 peon-ping-setup 时存在 ~/.rovodev/config.yml 文件,则会自动注册事件钩子。
手动设置:
确保已安装 peon-ping(
curl -fsSL https://peonping.com/install | bash)。将以下内容添加到
~/.rovodev/config.yml文件中:eventHooks: events: - name: on_complete commands: - command: bash ~/.claude/hooks/peon-ping/adapters/rovodev.sh on_complete - name: on_error commands: - command: bash ~/.claude/hooks/peon-ping/adapters/rovodev.sh on_error - name: on_tool_permission commands: - command: bash ~/.claude/hooks/peon-ping/adapters/rovodev.sh on_tool_permission重启 Rovo Dev CLI 以使钩子生效。
事件映射:
on_complete→ 完成音效(“工作,工作。”、“完成了!”)on_error→ 错误音效(“我做不到。”、“该死!”)on_tool_permission→ 权限提示音效(“有什么需要做的吗?”、“嗯?”)
功能:
- 声音播放 通过
afplay(macOS)、pw-play/paplay/ffplay(Linux)实现——与 Shell 钩子具有相同的优先级链。 - CESP 事件映射 — Rovo Dev 事件映射到标准 CESP 类别(
task.complete、task.error、input.required)。 - 桌面通知 — 默认为大型覆盖式横幅,或使用标准通知。
- 防抖动 — 抑制快速连续完成时产生的重复音效。
Kimi Code 设置
适用于 Kimi Code CLI(MoonshotAI)的文件系统监视器适配器。Kimi Code 会将 Wire Mode 事件写入 ~/.kimi/sessions/ 目录——此适配器作为后台守护进程监视这些文件,并将事件转换为 CESP 格式。
# 安装(启动后台守护进程)
bash ~/.claude/hooks/peon-ping/adapters/kimi.sh --install
# 查看状态 / 停止
bash ~/.claude/hooks/peon-ping/adapters/kimi.sh --status
bash ~/.claude/hooks/peon-ping/adapters/kimi.sh --uninstall
需要在 macOS 上安装 fswatch(brew install fswatch),或在 Linux 上安装 inotifywait(apt install inotify-tools)。curl | bash 安装程序会自动检测 Kimi Code 并启动守护进程。
事件映射:
- 新会话 → 欢迎音效(“准备好了吗?”、“是的吗?”)
- 代理回合结束 → 完成音效(“工作,工作。”、“完成了!”)
- 上下文压缩 → 令牌限制音效
- 子代理生成 → 子代理跟踪音效
远程开发(SSH / Devcontainers / Codespaces)
在远程服务器或容器内进行编码?peon-ping 会自动检测 SSH 会话、Devcontainers 和 Codespaces,然后通过你本地机器上运行的轻量级中继路由音频和通知。
SSH 设置
在你的本地机器上,启动中继:
peon relay --daemon使用端口转发进行 SSH 连接:
ssh -R 19998:localhost:19998 your-server在远程主机上安装 peon-ping——它会自动检测 SSH 会话,并通过转发的端口将音频请求发送回你本地的中继。
就是这样。声音将在你的笔记本电脑上播放,而不是在远程服务器上。
可选的 SSH 路由模式:
peon ssh-audio relay # 默认,始终使用中继
peon ssh-audio auto # 尝试使用中继,若失败则回退到 SSH 主机本地播放
peon ssh-audio local # 始终在 SSH 主机上播放
Devcontainers / Codespaces
无需端口转发——peon-ping 会自动检测 REMOTE_CONTAINERS 和 CODESPACES 环境变量,并将音频路由到 host.docker.internal:19998。只需在你的主机上运行 peon relay --daemon 即可。
中继命令
peon relay # 在前台启动中继
peon relay --daemon # 在后台启动
peon relay --stop # 停止后台中继
peon relay --status # 检查中继是否正在运行
peon relay --port=12345 # 自定义端口(默认:19998)
peon relay --bind=0.0.0.0 # 监听所有接口(安全性较低)
环境变量:PEON_RELAY_PORT、PEON_RELAY_HOST、PEON_RELAY_BIND。
如果 peon-ping 检测到 SSH 或容器会话,但无法连接到中继,则会在 SessionStart 事件时打印设置说明。
基于分类的 API(用于轻量级远程钩子)
中继支持基于分类的端点,可在服务器端处理声音选择。这对于未安装 peon-ping 的远程机器非常有用——远程钩子只需发送一个分类名称,中继就会从当前激活的声音包中随机选择一个声音播放。
端点:
| 端点 | 描述 |
|---|---|
GET /health |
健康检查(返回“OK”) |
GET /play?file=<path> |
播放特定声音文件(旧版) |
GET /play?category=<cat> |
从分类中随机播放声音(推荐) |
POST /notify |
发送桌面通知 |
远程钩子示例(scripts/remote-hook.sh):
#!/bin/bash
RELAY_URL="${PEON_RELAY_URL:-http://127.0.0.1:19998}"
EVENT=$(cat | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('hook_event_name',''))" 2>/dev/null)
case "$EVENT" in
SessionStart) CATEGORY="session.start" ;;
Stop) CATEGORY="task.complete" ;;
PermissionRequest) CATEGORY="input.required" ;;
*) exit 0 ;;
esac
curl -sf "${RELAY_URL}/play?category=${CATEGORY}" >/dev/null 2>&1 &
将此脚本复制到您的远程机器,并在 ~/.claude/settings.json 中注册:
{
"hooks": {
"SessionStart": [{"command": "bash /path/to/remote-hook.sh"}],
"Stop": [{"command": "bash /path/to/remote-hook.sh"}],
"PermissionRequest": [{"command": "bash /path/to/remote-hook.sh"}]
}
}
中继会读取您本地机器上的 config.json 文件以获取当前激活的声音包和音量,加载该声音包的清单,并在避免重复的情况下随机选择一个声音。
移动通知
当任务完成或需要关注时,您可以在手机上收到推送通知——这在您离开办公桌时非常有用。
快速入门(ntfy.sh — 免费,无需账号)
- 在您的手机上安装 ntfy 应用程序
- 在应用中订阅一个唯一的主题(例如
my-peon-notifications) - 运行:
peon mobile ntfy my-peon-notifications
peon mobile pushover <user_key> <app_token>
peon mobile telegram <bot_token> <chat_id>
移动命令
peon mobile on # 启用移动通知
peon mobile off # 禁用移动通知
peon mobile status # 显示当前配置
peon mobile test # 发送测试通知
移动通知会在每次事件发生时触发,无论窗口是否处于焦点状态——它们与桌面通知和声音是独立的。
声音包
涵盖魔兽争霸、星际争霸、红色警戒、传送门、塞尔达传说、Dota 2、地狱特工2、上古卷轴等共 165 个声音包。默认安装包含 5 个精选声音包:
| 包 | 角色 | 声音 |
|---|---|---|
peon(默认) |
半兽人劳工(魔兽争霸 III) | “准备好了吗?”,“干活,干活!”,“好的,好的。” |
peasant |
人类农民(魔兽争霸 III) | “是的,大人?”,“活干完了!”,“准备好了,长官。” |
sc_kerrigan |
莎拉·凯莉根(星际争霸) | “我明白了”,“现在怎么办?”,“真好笑啊?” |
sc_battlecruiser |
战列巡洋舰(星际争霸) | “战列巡洋舰已就绪”,“动手吧”,“开火!” |
glados |
GLaDOS(传送门) | “哦,原来是你啊”,“你这个怪物”,“你整个团队都死了。” |
浏览所有带有音频预览的声音包 → openpeon.com/packs
使用 --all 可以安装所有声音包,或者随时切换声音包:
peon packs use glados # 切换到特定声音包
peon packs use --install glados # 一步完成安装并切换
peon packs next # 循环切换到下一个声音包
peon packs list # 列出所有已安装的声音包
peon packs list --registry # 浏览所有可用的声音包
peon packs install glados,murloc # 安装指定声音包
peon packs install --all # 安装注册表中的所有声音包
想添加自己的声音包吗?请参阅 openpeon.com/create 上的完整指南 或 CONTRIBUTING.md。
调试
当声音无法播放或通知未出现时,结构化的调试日志可以帮助您追踪钩子调用过程中究竟发生了什么。
启用调试日志
peon debug on # 启用——日志写入 ~/.claude/hooks/peon-ping/logs/
peon debug off # 禁用
peon debug status # 显示状态、日志目录、文件数量、总大小
您也可以通过设置环境变量 PEON_DEBUG=1 来在不更改配置的情况下为每次调用启用调试日志。
阅读日志
peon logs # 今日日志的最后 50 行
peon logs --last 100 # 所有日志文件中的最后 100 行
peon logs --session <ID> # 按会话 ID 筛选今日日志
peon logs --session <ID> --all # 在所有日志文件中搜索会话 ID
peon logs --clear # 删除所有日志文件(需确认)
日志格式
每条日志都是一个结构化的键值记录:
2026-03-26T14:32:01.042 [config] inv=a3f1 loaded=/path/to/config.json volume=0.5 pack=peon enabled=True
2026-03-26T14:32:01.045 [event] inv=a3f1 hook_event=Stop cesp=task.complete session=abc123
2026-03-26T14:32:01.048 [sound] inv=a3f1 file=work-work.wav label="Work, work." category=task.complete
2026-03-26T14:32:01.120 [play] inv=a3f1 player=afplay file=work-work.wav
2026-03-26T14:32:01.125 [notify] inv=a3f1 title="peon: done" body="Work, work."
- inv — 唯一的 4 字符调用 ID,用于链接单次钩子调用的所有阶段
- 阶段:
[config]、[event]、[sound]、[play]、[notify]——分别代表钩子流程中的各个阶段 - 包含空格或特殊字符的值会被引号括起来
常见故障示例
| 症状 | 日志中应查找的内容 |
|---|---|
| 没有声音播放 | [event] 行显示 exit=early(分类被禁用、暂停或被去抖动) |
| 使用了错误的声音包 | [config] 行显示意外的 pack= 值——检查路径规则或轮换设置 |
| 缺少声音文件 | [sound] 行显示 error= 并附带文件路径 |
| 通知缺失 | 缺少 [notify] 行——检查配置中的 desktop_notifications |
配置键
| 键 | 默认值 | 描述 |
|---|---|---|
debug |
false |
启用结构化调试日志记录 |
debug_retention_days |
7 |
自动清除超过 N 天的日志 |
日志存储在 ~/.claude/hooks/peon-ping/logs/peon-ping-YYYY-MM-DD.log(每天一个文件)。当创建新一天的日志时,旧日志会根据 debug_retention_days 自动被清除。
卸载
macOS/Linux:
bash "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/peon-ping/uninstall.sh # 全局
bash .claude/hooks/peon-ping/uninstall.sh # 项目本地
Windows(PowerShell):
# 标准卸载(删除音效前会提示)
powershell -File "$env:USERPROFILE\.claude\hooks\peon-ping\uninstall.ps1"
# 保留音效包(移除其他所有内容)
powershell -File "$env:USERPROFILE\.claude\hooks\peon-ping\uninstall.ps1" -KeepSounds
要求
- macOS —
afplay(内置),JXA Cocoa 叠加层或 AppleScript 用于通知 - Linux — 以下之一:
pw-play、paplay、ffplay、mpv、play(SoX)或aplay;notify-send用于通知 - Windows — 原生 PowerShell,配备
MediaPlayer和 WinForms(无需 WSL),或 WSL2 - MSYS2 / Git Bash —
python3、cygpath(内置);音频可通过ffplay/mpv/play或 PowerShell 备用方案实现 - 所有平台 —
python3(Windows 原生版本除外) - SSH/远程 — 远程主机上需安装
curl - IDE — 支持钩子的 Claude Code、Amp,或通过 适配器 支持的任何 IDE
工作原理
peon.sh 是一个注册了 SessionStart、SessionEnd、SubagentStart、Stop、Notification、PermissionRequest、PostToolUseFailure 和 PreCompact 事件的 Claude Code 钩子。每次触发事件时:
- 事件映射 — 内嵌的 Python 代码块将钩子事件映射到 CESP 音效类别(如
session.start、task.complete、input.required等)。 - 音效选择 — 从当前激活的音效包清单中随机选取一条语音,避免重复。
- 音频播放 — 通过
afplay(macOS)、PowerShell 的MediaPlayer(WSL2/MSYS2 备用方案)或pw-play/paplay/ffplay/mpv/aplay(Linux/MSYS2)异步播放音效。 - 通知 — 更新终端标签页标题,并在终端未聚焦时发送桌面通知。
- 远程路由 — 在 SSH 会话、Devcontainers 和 Codespaces 中,音频和通知请求会通过 HTTP 转发到您本地机器上的 中继服务器。
音效包会在安装时从 OpenPeon 注册表 下载。官方音效包托管在 PeonPing/og-packs 中。音效文件归各自发行方(Blizzard、Valve、EA 等)所有,仅以合理使用原则分发,用于个人通知目的。
链接
- @peonping on X — 最新动态与公告
- peonping.com — 项目主页
- openpeon.com — CESP 规范、音效包浏览器、集成指南、创作指南
- OpenPeon 注册表 — 音效包注册表(GitHub Pages)
- og-packs — 官方音效包
- peon-pet — macOS 桌面宠物(兽人精灵,对钩子事件作出反应)
- 许可证(MIT)
支持本项目
- Venmo:@garysheng
- 社区代币(自行研究/自娱自乐):有人在 Base 上创建了 $PEON 代币——我们从中获得交易手续费,用于支持开发。
0xf4ba744229afb64e2571eef89aacec2f524e8ba3
版本历史
v2.18.02026/04/11v2.17.32026/03/31v2.17.22026/03/30v2.17.12026/03/29v2.16.12026/03/20v2.16.02026/03/20v2.15.22026/03/19v2.15.12026/03/09v2.15.02026/03/06v2.14.02026/03/06v2.12.12026/03/02v2.12.02026/02/27v2.8.12026/02/20v2.8.02026/02/20v2.7.02026/02/19v2.6.02026/02/19v2.5.02026/02/18v2.4.02026/02/18v2.3.02026/02/18v2.2.32026/02/18常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器