关于 ops-daemon
ops-daemon 是用于诊断和管理后台 ops-daemon 进程的 Claude Code 技能。它检查守护进程及服务健康状况,并通过确认流程提供针对性修复操作。
主要功能
- 01检查守护进程与服务健康状况
- 02输出机器可读状态
- 03安装、升级、重启或卸载
- 04通过 dry-run 预览变更
- 05逐项引导修复
适用场景
- 01排查后台服务停止的原因
- 02插件升级后更新守护进程路径
- 03应用前审查修复操作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill ops-daemon安装后在 Claude Code 中输入/ops-daemon确认已加载。
详细介绍
运行时上下文
诊断前,请加载:
- 插件根目录:
echo "${CLAUDE_PLUGIN_ROOT:-$(ls -d "$HOME/.claude/plugins/cache/ops-marketplace/ops"/*/ 2>/dev/null | sort -V | tail -1)}"— 最新安装的版本 - 守护进程健康状态:
cat ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-health.json— 主要诊断输入 - 服务配置:
cat ${CLAUDE_PLUGIN_DATA_DIR}/daemon-services.json— 各服务的命令和 cron 定义 - 操作系统:
uname -s— 守护进程仅支持在 macOS 上安装(launchd)。Linux/WSL/Windows 会回退到手动调用。
OPS ► DAEMON
后台 ops-daemon 进程的诊断与自动修复界面。功能类似 ops-doctor,但仅针对用户实际会遇到故障的子系统:负责让 briefing-pre-warm、memory-extractor、message-listener、inbox-digest 和 competitor-intel 保持运行的 launchd 守护进程。
CLI/API 参考
bin/ops-daemon-manager.sh
| 命令 | 用法 | 输出 |
|---|---|---|
${CLAUDE_PLUGIN_ROOT}/scripts/ops-daemon-manager.sh status | 输出 JSON 快照 | {os, installed, running, pid, plist_version_match, health_fresh, ...} |
${CLAUDE_PLUGIN_ROOT}/scripts/ops-daemon-manager.sh install | 首次安装(幂等) | 写入 plist,加载 launchd |
${CLAUDE_PLUGIN_ROOT}/scripts/ops-daemon-manager.sh upgrade | 将 plist 指向当前 PLUGIN_ROOT 并重新加载 | 修复过期的版本路径 |
${CLAUDE_PLUGIN_ROOT}/scripts/ops-daemon-manager.sh restart | 卸载并重新加载,不重新配置 | 清除卡住的状态 |
${CLAUDE_PLUGIN_ROOT}/scripts/ops-daemon-manager.sh uninstall | 停止并移除 plist | 将系统恢复到安装前的状态 |
支持使用 --plugin-root PATH 覆盖自动检测,并使用 --dry-run 预览操作且不产生副作用。
健康状态文件架构
${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json:
{
"timestamp": "<ISO-8601 UTC>",
"pid": <int>,
"uptime_seconds": <int>,
"services": {
"<name>": {
"status": "running|polling|scheduled|dead|needs_reauth",
"pid": <int|null>,
"last_health": "<string|null>",
"last_run": "<ISO-8601|empty>",
"next_run": "<ISO-8601|empty>",
"restarts": <int>
}
},
"action_needed": null | {"kind": "...", "service": "...", "message": "..."}
}
健康的守护进程每 30s 刷新此文件。mtime 超过 120s 是明确的故障信号。
你的任务
根据第一个参数选择操作:
| 参数 | 操作 |
|---|---|
check(默认) | 运行所有诊断,打印彩色报告;状态正常时退出码为 0,否则为 1 |
fix | 运行 check,然后针对检测到的每个问题询问用户是否确认,并应用修复 |
restart | 调用 ops-daemon-manager.sh restart |
status | 原样打印 ops-daemon-manager.sh status 的 JSON 输出,供其他技能使用 |
uninstall | 通过 AskUserQuestion 询问 [Uninstall] / [Cancel],然后调用管理器 |
诊断清单
运行每项检查,并将结果记录为 pass / fail / warn:
- 已解析插件根目录 — 已设置
CLAUDE_PLUGIN_ROOT环境变量,或者~/.claude/plugins/cache/ops-marketplace/ops/<version>/scripts/ops-daemon.sh存在。 - 操作系统受支持 —
uname -s的结果为Darwin。在 Linux/WSL 上打印手动调用方式,并以warn说明退出,退出码为 0。在原生 Windows 上打印“not supported”。 - 已安装 Plist —
~/Library/LaunchAgents/com.claude-ops.daemon.plist存在。 - Plist 指向当前版本 —
ProgramArguments中第二个<string>等于${PLUGIN_ROOT}/scripts/ops-daemon.sh。不匹配 = 升级后路径过期(最常见的故障模式)。 - Plist 是有效的 XML —
plutil -lint通过。 - 已注册 Launchctl —
launchctl list显示该标签,且具有有效 PID(不是-)。 - 进程存活 —
kill -0 <pid>执行成功。 - Bash 二进制文件存在 —
ProgramArguments中第一个<string>是可执行文件,且其BASH_VERSINFO >= 4(守护进程脚本中的declare -A有此要求)。 - 健康文件是最新的 —
daemon-health.json存在,且mtime在最近 120 秒内。 - 每项服务都有命令 — 遍历
daemon-services.json中的服务;每个已启用条目都必须有非空的command字段。缺少command会导致服务被静默跳过(历史遗留问题)。 - 运行中的服务存活 — 对健康文件中状态为
status=running|polling的每项服务,确认kill -0 <pid>执行成功。 - Cron 服务的
next_run在未来 —scheduled服务必须具有未来的next_run时间戳。 - wacli-sync 路径可解析 — 如果已启用,则
~/.wacli/.health存在且是最新的。(可选 — 如果缺失,标记为 warn,而不是 fail。) - 没有僵尸子进程 — 不存在没有
ops-daemon.sh父进程的孤立ops-message-listener.sh或wacli-keepalive.sh进程。
修复方案
对于每项检查失败的情况,fix 模式都会提出具体的修复方案,并通过 AskUserQuestion 询问用户(最多 4 个选项 — 始终包含 [Skip]):
| 失败情况 | 修复方式 | 有破坏性? |
|---|---|---|
| Plist 版本路径过期 | ops-daemon-manager.sh upgrade | 是 — 卸载并重新加载 |
| 缺少 Plist | ops-daemon-manager.sh install | 否 |
| Plist XML 无效 | 备份后通过 install 重新生成 | 是 — 覆盖 |
| 进程已停止但 Plist 正常 | ops-daemon-manager.sh restart | 是 — 重启 |
| 健康文件过期(>120 秒) | ops-daemon-manager.sh restart | 是 |
服务缺少 command | 显示差异后,将 scripts/daemon-services.example.json 合并到用户的 daemon-services.json | 是 — 写入配置 |
| Bash 二进制文件缺失/<4 | 在 macOS 上运行 brew install bash;在 Linux 上检查 $(command -v bash) 的版本;询问用户是否安装 | 否(仅报告) |
| 僵尸子进程 | 对每个进程单独确认后运行 kill <pid>(规则 5) | 是 |
| 服务配置 JSON 损坏 | 确认并备份后,从 scripts/daemon-services.default.json 恢复 | 是 |
绝不批量修复。 根据规则 5,每项破坏性操作都必须单独通过 AskUserQuestion 提供 [Apply] / [Skip] 选项。
check 的输出格式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► DAEMON CHECK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OS: macos
Plugin root: ${CLAUDE_PLUGIN_ROOT}
Daemon PID: 57004
Uptime: 1h 12m
✓ Plist installed
✓ Plist points at current version
✓ Plist is valid XML
✓ Launchctl registered, PID alive
✓ Bash binary found (5.3)
✓ Health file fresh (mtime 23s ago)
✓ All 5 enabled services have commands
✓ Running services alive
✓ Cron services have future next_run
STATUS: GREEN — daemon healthy
发生失败时,将 ✓ 替换为 ✗,并附加一行修复提示。退出码为 1,以便 /ops:ops-status 显示红色状态。
status 的输出格式
原样打印 ops-daemon-manager.sh status 输出的 JSON。不添加包装内容。这是供 ops-status、ops-go 和其他技能使用的机器可读契约。
fix 的输出格式
显示 check 报告,然后对每项失败的检查进入确认循环:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► DAEMON FIX — 3 issues found
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✗ Plist points at old version 1.0.0
→ Proposed: ops-daemon-manager.sh upgrade
随后通过 AskUserQuestion 询问 [Apply fix] / [Skip this issue] / [Cancel all]。对每个问题重复此流程。执行完所有操作后,重新运行 check,并打印修复前后的差异。
跨操作系统说明
- macOS:通过 launchd 完全支持。所有子命令均可用。
- Linux / WSL:
ops-daemon-manager.sh install会以EX_UNAVAILABLE(69)退出,并打印手动执行的nohup命令。check仍会验证守护进程脚本和服务配置。 - Windows native:不支持。请使用 WSL。
不要在此 SKILL 中硬编码 launchctl——始终通过管理器脚本调用,以便将来仅需一行即可添加 systemd / Task Scheduler 支持。
示例
# Morning habit: confirm the daemon survived overnight
/ops:daemon check
# After a plugin upgrade (`/plugin upgrade claude-ops`):
/ops:daemon fix
# → detects stale plist, asks [Apply upgrade], reloads, verifies
# Embedded in another skill:
/ops:daemon status | jq -r '.health_fresh'