mcpField
O
ops-daemon

ops-daemon

github.com/davepoon云与 DevOps3.7k73 次安装今天更新
代码仓库

关于 ops-daemon

ops-daemon 是用于诊断和管理后台 ops-daemon 进程的 Claude Code 技能。它检查守护进程及服务健康状况,并通过确认流程提供针对性修复操作。

主要功能

  1. 01检查守护进程与服务健康状况
  2. 02输出机器可读状态
  3. 03安装、升级、重启或卸载
  4. 04通过 dry-run 预览变更
  5. 05逐项引导修复

适用场景

  1. 01排查后台服务停止的原因
  2. 02插件升级后更新守护进程路径
  3. 03应用前审查修复操作

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davepoon/buildwithclaude --skill ops-daemon

安装后在 Claude Code 中输入/ops-daemon确认已加载。

详细介绍

运行时上下文

诊断前,请加载:

  1. 插件根目录:echo "${CLAUDE_PLUGIN_ROOT:-$(ls -d "$HOME/.claude/plugins/cache/ops-marketplace/ops"/*/ 2>/dev/null | sort -V | tail -1)}" — 最新安装的版本
  2. 守护进程健康状态:cat ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-health.json — 主要诊断输入
  3. 服务配置:cat ${CLAUDE_PLUGIN_DATA_DIR}/daemon-services.json — 各服务的命令和 cron 定义
  4. 操作系统: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:

  1. 已解析插件根目录 — 已设置 CLAUDE_PLUGIN_ROOT 环境变量,或者 ~/.claude/plugins/cache/ops-marketplace/ops/<version>/scripts/ops-daemon.sh 存在。
  2. 操作系统受支持 — uname -s 的结果为 Darwin。在 Linux/WSL 上打印手动调用方式,并以 warn 说明退出,退出码为 0。在原生 Windows 上打印“not supported”。
  3. 已安装 Plist — ~/Library/LaunchAgents/com.claude-ops.daemon.plist 存在。
  4. Plist 指向当前版本 — ProgramArguments 中第二个 <string> 等于 ${PLUGIN_ROOT}/scripts/ops-daemon.sh。不匹配 = 升级后路径过期(最常见的故障模式)。
  5. Plist 是有效的 XML — plutil -lint 通过。
  6. 已注册 Launchctl — launchctl list 显示该标签,且具有有效 PID(不是 -)。
  7. 进程存活 — kill -0 <pid> 执行成功。
  8. Bash 二进制文件存在 — ProgramArguments 中第一个 <string> 是可执行文件,且其 BASH_VERSINFO >= 4(守护进程脚本中的 declare -A 有此要求)。
  9. 健康文件是最新的 — daemon-health.json 存在,且 mtime 在最近 120 秒内。
  10. 每项服务都有命令 — 遍历 daemon-services.json 中的服务;每个已启用条目都必须有非空的 command 字段。缺少 command 会导致服务被静默跳过(历史遗留问题)。
  11. 运行中的服务存活 — 对健康文件中状态为 status=running|polling 的每项服务,确认 kill -0 <pid> 执行成功。
  12. Cron 服务的 next_run 在未来 — scheduled 服务必须具有未来的 next_run 时间戳。
  13. wacli-sync 路径可解析 — 如果已启用,则 ~/.wacli/.health 存在且是最新的。(可选 — 如果缺失,标记为 warn,而不是 fail。)
  14. 没有僵尸子进程 — 不存在没有 ops-daemon.sh 父进程的孤立 ops-message-listener.sh 或 wacli-keepalive.sh 进程。
修复方案

对于每项检查失败的情况,fix 模式都会提出具体的修复方案,并通过 AskUserQuestion 询问用户(最多 4 个选项 — 始终包含 [Skip]):

失败情况修复方式有破坏性?
Plist 版本路径过期ops-daemon-manager.sh upgrade是 — 卸载并重新加载
缺少 Plistops-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'

评论

支持 Markdown