peon-ping

GitHub
4.4k 313 简单 1 次阅读 今天MIT图像开发框架Agent
AI 解读 由 AI 自动生成,仅供参考

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

无 GPU 需求

内存

未说明

依赖
notes该工具主要用于播放游戏语音和显示通知,不涉及 AI 模型推理。在 WSL2 或 Debian 系 Linux 上若使用非 WAV 格式音效包,必须安装 ffmpeg。支持通过 Homebrew、安装脚本、PowerShell 或 Nix 进行安装。
python未说明
ffmpeg (WSL2/Linux 非 WAV 格式必需)
peon-ping hero image

快速开始

peon-ping

英语 | 韩语 | 中文 | 日语

macOS WSL2 Linux Windows MSYS2 SSH 许可证

Claude Code Amp Gemini CLI GitHub Copilot Codex Cursor OpenCode Kilo CLI Kiro Kimi Code Windsurf Antigravity OpenClaw Rovo Dev CLI DeepAgents

当你的 AI 编码助手需要关注时,会播放游戏角色语音台词并显示视觉叠加通知——或者让助手通过 MCP 自行选择声音。

AI 编码助手在完成任务或需要权限时不会提醒你。你一不小心切换了标签页、注意力分散,结果又浪费了 15 分钟才重新进入工作状态。peon-ping 通过来自《魔兽争霸》、《星际争霸》、《传送门》、《塞尔达传说》等游戏的语音台词和醒目的屏幕弹窗来解决这个问题——它适用于 Claude CodeAmpGitHub CopilotCodexCursorOpenCodeKilo CLIKiroKimi CodeWindsurfGoogle AntigravityRovo Dev CLIDeepAgents 以及任何支持 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 仓库获取
  • 自定义源——一个包含 namesrc 字段的 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.starttask.acknowledgetask.completetask.errorinput.requiredresource.limituser.spam。 (扩展类别 session.endtask.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: falsemobile_notify.enabled: true

  • volume: 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_rotationdefault_pack;但会被 session_override 分配覆盖。

    "path_rules": [
      { "pattern": "*/work/client-a/*", "pack": "glados" },
      { "pattern": "*/personal/*",      "pack": "peon" }
    ]
    
  • pack_rotation: 包名数组(如 ["peon", "sc_kerrigan", "peasant"])。当 pack_rotation_moderandomround-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(通过 PipeWire wpctl 或 PulseAudio pactl)。

  • 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)。此前,主题叠加层(glassjarvissakura)仅显示在单个屏幕上——使用这些主题的现有配置会自动迁移到 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_IDPEON_CWDPEON_HOOK_EVENTPEON_SESSION_NAME。使用标准输出(截取前 50 个字符);非零退出码则会传递到下一层次。示例:"basename $PEON_CWD"

  • project_name_map(对象,默认:{}):将目录路径映射为通知中显示的自定义项目标签。键为路径模式,值为显示名称。示例:{ "/home/user/work/client-a": "Client A" }

  • notification_templates(对象,默认:{}):针对通知事件的自定义消息格式字符串。键为事件类型(stoppermissionerroridlequestion),值为带变量替换的模板字符串。可用变量包括:{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_rotationdefault_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/SonOfABitchpeon/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 | bashpeon-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 也是如此。

设置:

  1. 先安装 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
    
  2. ~/.codex/config.toml 中添加以下内容:

    notify = ["bash", "~/.claude/hooks/peon-ping/adapters/codex.sh"]
    
  3. 重启 Codex。

如果你通过 Homebrew 安装,运行时文件会管理在 ~/.claude/hooks/peon-ping/ 目录下,而 Codex 适配器会将 Codex 的通知事件转发到该共享运行时环境中。

Amp 设置

这是用于 Amp(由 Sourcegraph 开发)的文件系统监视器适配器。Amp 不像 Claude Code 那样暴露事件钩子,因此此适配器会监视 Amp 在磁盘上的线程文件,并检测代理何时完成一轮交互。

设置:

  1. 确保已安装 peon-ping(curl -fsSL https://peonping.com/install | bash

  2. 安装 fswatch(macOS)或 inotify-tools(Linux):

    brew install fswatch        # macOS
    sudo apt install inotify-tools  # Linux
    
  3. 启动监视器:

    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 标准。

设置步骤:

  1. 确保已安装 peon-ping (curl -fsSL https://peonping.com/install | bash)

  2. 在你的仓库(默认分支)中创建 .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"
          }
        ]
      }
    }
    
  3. 提交并合并到你的默认分支。这些钩子将在你下一次使用 Copilot 代理时生效。

事件映射:

  • sessionStart → 欢迎音效(“准备好工作了吗?”、“是的吗?”)
  • userPromptSubmitted → 第一条提示为问候,后续则触发垃圾信息检测
  • postToolUse → 完成音效(“工作,工作。”、“任务完成了!”)
  • errorOccurred → 错误音效(“我做不到。”)
  • preToolUse → 跳过(噪音太大)
  • sessionEnd → 无音效(session.end 尚未实现)

功能特性:

  • 声音播放:通过 afplay(macOS)、pw-play/paplay/ffplay(Linux)实现——优先级顺序与 Shell 钩子相同。
  • CESP 事件映射:GitHub Copilot 钩子映射到标准 CESP 类别(session.starttask.completetask.erroruser.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.createdsession.idlesession.errorpermission.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 图标的桌面通知

peon-ping OpenCode 通知

提示:安装 terminal-notifierbrew 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 规范。

设置步骤:

  1. 确保已安装 peon-ping(curl -fsSL https://peonping.com/install | bash)。

  2. 将以下钩子添加到你的 ~/.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" }
    ]
  }
}

preToolUsepostToolUse 被有意排除——它们会在每次调用工具时触发,会产生大量噪音。

Rovo Dev CLI 设置

适用于 Atlassian 的 Rovo Dev CLI 的 Shell 适配器,完全符合 CESP v1.0 规范。

自动设置:

如果在运行 install.shpeon-ping-setup 时存在 ~/.rovodev/config.yml 文件,则会自动注册事件钩子。

手动设置:

  1. 确保已安装 peon-ping(curl -fsSL https://peonping.com/install | bash)。

  2. 将以下内容添加到 ~/.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
    
  3. 重启 Rovo Dev CLI 以使钩子生效。

事件映射:

  • on_complete → 完成音效(“工作,工作。”、“完成了!”)
  • on_error → 错误音效(“我做不到。”、“该死!”)
  • on_tool_permission → 权限提示音效(“有什么需要做的吗?”、“嗯?”)

功能:

  • 声音播放 通过 afplay(macOS)、pw-play/paplay/ffplay(Linux)实现——与 Shell 钩子具有相同的优先级链。
  • CESP 事件映射 — Rovo Dev 事件映射到标准 CESP 类别(task.completetask.errorinput.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 上安装 fswatchbrew install fswatch),或在 Linux 上安装 inotifywaitapt install inotify-tools)。curl | bash 安装程序会自动检测 Kimi Code 并启动守护进程。

事件映射:

  • 新会话 → 欢迎音效(“准备好了吗?”、“是的吗?”)
  • 代理回合结束 → 完成音效(“工作,工作。”、“完成了!”)
  • 上下文压缩 → 令牌限制音效
  • 子代理生成 → 子代理跟踪音效

远程开发(SSH / Devcontainers / Codespaces)

在远程服务器或容器内进行编码?peon-ping 会自动检测 SSH 会话、Devcontainers 和 Codespaces,然后通过你本地机器上运行的轻量级中继路由音频和通知。

SSH 设置

  1. 在你的本地机器上,启动中继:

    peon relay --daemon
    
  2. 使用端口转发进行 SSH 连接

    ssh -R 19998:localhost:19998 your-server
    
  3. 在远程主机上安装 peon-ping——它会自动检测 SSH 会话,并通过转发的端口将音频请求发送回你本地的中继。

就是这样。声音将在你的笔记本电脑上播放,而不是在远程服务器上。

可选的 SSH 路由模式:

peon ssh-audio relay   # 默认,始终使用中继
peon ssh-audio auto    # 尝试使用中继,若失败则回退到 SSH 主机本地播放
peon ssh-audio local   # 始终在 SSH 主机上播放

Devcontainers / Codespaces

无需端口转发——peon-ping 会自动检测 REMOTE_CONTAINERSCODESPACES 环境变量,并将音频路由到 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_PORTPEON_RELAY_HOSTPEON_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 — 免费,无需账号)

  1. 在您的手机上安装 ntfy 应用程序
  2. 在应用中订阅一个唯一的主题(例如 my-peon-notifications
  3. 运行:
    peon mobile ntfy my-peon-notifications
    

还支持 PushoverTelegram

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

要求

  • macOSafplay(内置),JXA Cocoa 叠加层或 AppleScript 用于通知
  • Linux — 以下之一:pw-playpaplayffplaympvplay(SoX)或 aplaynotify-send 用于通知
  • Windows — 原生 PowerShell,配备 MediaPlayer 和 WinForms(无需 WSL),或 WSL2
  • MSYS2 / Git Bashpython3cygpath(内置);音频可通过 ffplay/mpv/play 或 PowerShell 备用方案实现
  • 所有平台python3(Windows 原生版本除外)
  • SSH/远程 — 远程主机上需安装 curl
  • IDE — 支持钩子的 Claude Code、Amp,或通过 适配器 支持的任何 IDE

工作原理

peon.sh 是一个注册了 SessionStartSessionEndSubagentStartStopNotificationPermissionRequestPostToolUseFailurePreCompact 事件的 Claude Code 钩子。每次触发事件时:

  1. 事件映射 — 内嵌的 Python 代码块将钩子事件映射到 CESP 音效类别(如 session.starttask.completeinput.required 等)。
  2. 音效选择 — 从当前激活的音效包清单中随机选取一条语音,避免重复。
  3. 音频播放 — 通过 afplay(macOS)、PowerShell 的 MediaPlayer(WSL2/MSYS2 备用方案)或 pw-play/paplay/ffplay/mpv/aplay(Linux/MSYS2)异步播放音效。
  4. 通知 — 更新终端标签页标题,并在终端未聚焦时发送桌面通知。
  5. 远程路由 — 在 SSH 会话、Devcontainers 和 Codespaces 中,音频和通知请求会通过 HTTP 转发到您本地机器上的 中继服务器

音效包会在安装时从 OpenPeon 注册表 下载。官方音效包托管在 PeonPing/og-packs 中。音效文件归各自发行方(Blizzard、Valve、EA 等)所有,仅以合理使用原则分发,用于个人通知目的。

链接

支持本项目

版本历史

v2.18.02026/04/11
v2.17.32026/03/31
v2.17.22026/03/30
v2.17.12026/03/29
v2.16.12026/03/20
v2.16.02026/03/20
v2.15.22026/03/19
v2.15.12026/03/09
v2.15.02026/03/06
v2.14.02026/03/06
v2.12.12026/03/02
v2.12.02026/02/27
v2.8.12026/02/20
v2.8.02026/02/20
v2.7.02026/02/19
v2.6.02026/02/19
v2.5.02026/02/18
v2.4.02026/02/18
v2.3.02026/02/18
v2.2.32026/02/18

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

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 真正成长为懂上

153.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|3天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|4天前
插件Agent图像

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 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架