ops-daemon について
ops-daemonは、バックグラウンドのops-daemonプロセスを診断・管理するClaude Code向けスキルです。デーモンとサービスの状態を確認し、ユーザー確認を経て個別の修復を行います。
主な機能
- 01デーモンとサービスの状態確認
- 02機械可読なステータス出力
- 03インストール、更新、再起動、削除
- 04dry-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 定義 - OS:
uname -s— デーモンのインストールは macOS のみ(launchd)です。Linux/WSL/Windows では手動実行にフォールバックします。
OPS ► DAEMON
バックグラウンドの ops-daemon プロセスの診断と自動修復を行います。ユーザーが実際に不具合を目にする単一のサブシステム、つまり briefing-pre-warm、memory-extractor、message-listener、inbox-digest、competitor-intel を稼働させ続ける launchd デーモンに対象を絞った ops-doctor のように動作します。
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": "..."}
}
正常なデーモンは、このファイルを 30 秒ごとに更新します。mtime が 120 秒を超えて古い場合は、障害の強い兆候です。
タスク
最初の引数に応じて処理を振り分けます。
| 引数 | アクション |
|---|---|
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が存在します。 - OS がサポートされている —
uname -sがDarwinです。Linux/WSL では手動での実行方法を表示し、warnの注記を付けて終了コード 0 で終了します。ネイティブ Windows では「not supported」と表示します。 - Plist がインストールされている —
~/Library/LaunchAgents/com.claude-ops.daemon.plistが存在します。 - Plist が現在のバージョンを指している —
ProgramArguments内の 2 番目の<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が存在し、新しいことを確認します。(任意 — 存在しない場合は fail ではなく warn として記録します。) - ゾンビ状態の子プロセスがない — 親プロセスが
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) のバージョンを確認し、インストールするようユーザーに尋ねます | いいえ(報告のみ) |
| ゾンビ状態の子プロセス | プロセスごとに確認(ルール 5)を行って kill <pid> を実行します | はい |
| サービス設定の JSON が破損している | 確認とバックアップの後、scripts/daemon-services.default.json から復元します | はい |
修正をまとめて実行してはいけません。 ルール 5 に従い、破壊的操作ごとに [Apply] / [Skip] の選択肢を含む独立した AskUserQuestion が必要です。
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 が赤色の状態を表示できるよう、終了コード 1 で終了します。
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
続いて、[Apply fix] / [Skip this issue] / [Cancel all] の選択肢を含む AskUserQuestion を表示します。各問題について繰り返します。すべての操作後に check を再実行し、実行前後の差分を表示します。
OS 間の注意事項
- macOS:launchd による完全なサポートを提供しています。すべてのサブコマンドを利用できます。
- Linux / WSL:
ops-daemon-manager.sh installはEX_UNAVAILABLE(69) で終了し、手動で実行するnohupの呼び出し方を表示します。checkは引き続きデーモンスクリプトとサービス設定を検証します。 - Windows ネイティブ:サポート対象外です。WSL を使用してください。
この SKILL では launchctl をハードコードしないでください。必ずマネージャースクリプトを経由してください。これにより、将来の systemd / タスクスケジューラのサポートを 1 行の追加で実現できます。
例
# 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'