mcpField
S
stop

stop

github.com/terrylicaエージェントワークフロー286 回インストール1 日前に更新
リポジトリ

stop について

stopは、自己修正ループを終了するスキルです。契約ファイルにDONEと理由を記録して最終状態を通知し、ループの後処理を行います。調査用ファイルを残すオプションもあります。

主な機能

  1. 01契約ファイルへのDONE記録
  2. 02最終状態の通知
  3. 03ループのアンロードと登録解除
  4. 04状態ディレクトリの保管と削除
  5. 05調査用ファイルの保持

活用シーン

  1. 01目標達成後のループ終了
  2. 02外部依存で進めない場合の停止
  3. 03停止後のハートビートと修正ログの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/terrylica/cc-skills --skill stop

インストール後、Claude Code で/stopを入力して読み込まれたか確認します。

詳細

autoloop: 停止

自己修正ループを正常に終了します。タイムスタンプと理由を含む ## DONE セクションを追記し、最終状態の概要をまとめた PushNotification を送信して、新しい起動のスケジュールを停止します。次回の /loop の起動時には DONE マーカーを検出し、何もせずに終了します。

自己進化型スキル:このスキルは使用を通じて改善されます。指示に誤りがある、パラメーターがずれている、または回避策が必要だった場合は、先送りせず、すぐにこのファイルを修正してください。実際に再現できる問題がある場合にのみ更新してください。

引数

  • 位置引数(省略可):理由を示す文字列。デフォルトは "user-requested stop" です。
  • --keep-forensics(フラグ、省略可):停止後にアーカイブして削除する代わりに、状態ディレクトリを保持します。Wave 2 以降のデフォルトの動作では、クリーンアップ用の tarball を作成し、<state_dir> に対して rm -rf を実行します。停止後に heartbeat.json または revision-log/ を調査する必要がある場合は、このフラグを指定してください。

ステップ 1:コントラクトを特定する

CONTRACT_PATH="${CONTRACT_PATH:-./LOOP_CONTRACT.md}"
if [ ! -f "$CONTRACT_PATH" ]; then
  echo "No contract at $CONTRACT_PATH — nothing to stop."
  exit 0
fi

ユーザーがコントラクトを指定しておらず、cwd 以下に複数の LOOP_CONTRACT.md ファイルがある場合は、AskUserQuestion を使用して選択してください。

ステップ 2:停止理由を確認する

AskUserQuestion を使用して停止理由を選択してください。

  • Research saturation — null-rescue の起動が3回連続した
  • Goal achieved — 完了条件を満たした
  • User request — 手動で終了する
  • Blocked on external dependency — 介入なしでは続行できない

選択した理由と、ユーザーからの自由記述のメモ(ある場合)を DONE セクションに記録してください。

ステップ 3:DONE セクションを追記する

以下のブロックをコントラクトに追記してください(Edit または Bash の cat >> を使用します)。

---

## DONE

- **Stopped at**: <ISO 8601 UTC>
- **Iteration**: <current value from frontmatter>
- **Reason**: <chosen reason>
- **User note**: <free-text if any>
- **Final state summary**:
  <one-paragraph synthesis of the Current State section at time of stop>

The next /loop firing will observe this section and exit without further action.

ステップ 4:PushNotification を送信する

PushNotification がまだ利用可能でない場合は、ToolSearch 経由で読み込んでから、次を送信してください。

<loop-name> stopped at iter <N>. Reason: <reason>. Final state: <one-line summary>.

200文字以内にしてください。

ステップ 5:launchd plist をアンロードする

登録を解除する前に、launchd plist をアンロードしてください。

# Source the launchd library
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/cc-skills/plugins/autoloop}"
source "$PLUGIN_ROOT/scripts/launchd-lib.sh"
source "$PLUGIN_ROOT/scripts/state-lib.sh"

# Derive loop_id and state_dir
loop_id=$(derive_loop_id "$CONTRACT_PATH")
state_dir=$(state_dir_path "$loop_id" "$CONTRACT_PATH")

# Unload plist (idempotent; no-op on non-macOS)
if ! unload_plist "$loop_id" "$state_dir" 2>/dev/null; then
  echo "WARNING: Failed to unload launchd plist" >&2
fi

ステップ 6:マシンレジストリからループの登録を解除する

plist をアンロードした後、マシンレジストリのエントリーをクリーンアップしてください。

# Source the registry library
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/marketplaces/cc-skills/plugins/autoloop}"
source "$PLUGIN_ROOT/scripts/registry-lib.sh"

# Derive loop_id from contract path
loop_id=$(derive_loop_id "$CONTRACT_PATH")

# Unregister from machine registry (idempotent; no error if already absent)
if ! unregister_loop "$loop_id"; then
  echo "WARNING: Failed to unregister loop from machine registry" >&2
fi

ステップ 7:状態ディレクトリをクリーンアップする(Wave 2)

登録を解除した後、ループの状態ディレクトリをアーカイブして削除し、孤立したディレクトリが蓄積しないようにしてください。tarball はディレクトリの隣(親ディレクトリ内)に作成され、その後ディレクトリ自体に rm -rf を実行します。

# state_dir was already computed in Step 5 via state_dir_path()
if [ -n "$state_dir" ]; then
  # Pass --keep-forensics if the user requested it (e.g. they want to inspect
  # heartbeat.json or revision-log/<session>.jsonl after stop).
  KEEP_FLAG=""
  for arg in "$@"; do
    [ "$arg" = "--keep-forensics" ] && KEEP_FLAG="--keep-forensics"
  done
  cleanup_state_dir "$state_dir" $KEEP_FLAG
fi

cleanup_state_dir は state-lib.sh によってエクスポートされます。$HOME の外にあるパスへの操作は拒否されます(安全ガード)。tarball の作成に失敗しても致命的ではありません。警告を表示して、rm を続行します。

ステップ 8:frontmatter を更新する

YAML frontmatter の exit_condition フィールドを編集し、DONE を含めてください。これにより、次回の起動時に本文をスキャンせず、すぐに検出できます。

ステップ 9:最終コミットを提案する

推奨するコミットを表示してください。

git add "$CONTRACT_PATH"
git commit -m "$(cat <<'EOF'
loop(stop): <loop-name> complete — <reason>

Final iteration: <N>
Last action: <summary from Current State>
EOF
)"

アンチパターン

  • このスキルから実行中のプロセスに kill -9 を実行しないでください。これは対象外です。このスキルはループにシグナルを送るだけです。プロセスの終了には、別のスキル(ru:stop や pueue kill など)を使用します。
  • Revision Log を書き換えないでください。追記のみです。代わりに DONE セクションを追加してください。
  • ユーザーがその場にいる場合(直近60秒以内のユーザー発話がないか確認してください)は PushNotification を送信しないでください。迷った場合は、プッシュ通知を省略してください。

トラブルシューティング

症状対処法
PushNotification ツールが読み込まれていないステップ4の前に、クエリ select:PushNotification を指定して ToolSearch を実行します
DONE セクションがすでに存在するループはすでに停止しています。確認メッセージを表示して終了してください
DONE の後もループが起動し続ける次回の /loop ではコントラクトを読み込んで即時終了するはずです。ポインタートリガーが正しいか確認してください

実行後の振り返り

  1. 現在地を確認します。 — 編集する前に、この SKILL.md が正式なファイルであることを確認します。
  2. 何が失敗しましたか? — 原因となった指示を修正します。
  3. 何にずれが生じましたか? — 必要に応じて DONE セクションのテンプレートを更新します。
  4. 記録します。 — Evolution-log に記録します。

コメント