cancel について
cancelは、指定セッションのアクティブなモードを安全に停止するoh-my-claudecodeのスキルです。セッション単位で後処理を行い、再開用の成果物を保持しながら、通常終了と強制終了を使い分けます。
主な機能
- 01アクティブなOMCモードの検出
- 02セッション単位のモード終了
- 03通常終了と強制終了
- 04再開用成果物の保持
- 05認可された全セッションの後処理
活用シーン
- 01実行中のAutopilotやRalphの停止
- 02Teamワーカーと連携中のRalphの終了
- 03セッション内の古いモード状態の削除
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yeachan-heo/ oh-my-claudecode --skill cancelインストール後、Claude Code で/cancelを入力して読み込まれたか確認します。
詳細
Cancel Skill
アクティブな OMC モードを検出してキャンセルするインテリジェントな機能です。
Cancel Skill は、あらゆる OMC モードを完了して終了するための標準的な方法です。
stop hook が完了を検出すると、状態をクリーンアップするために、このスキルを呼び出すよう LLM に指示します。失敗した操作は同じスコープ内で再試行し、残っているものを報告してください。--force が変更するのはシャットダウンの緊急度のみであり、スコープ、ロックの処理、所有権の確認は変更しません。セッションをまたぐ操作を許可するのは --all のみです。
キャンセルの契約
フラグはスコープとシャットダウン動作をそれぞれ個別に制御します。
| 呼び出し | スコープ | シャットダウン動作 |
|---|---|---|
| フラグなし | 現在のセッションのみ | チームメイトのシャットダウン待機を含む、グレースフルなキャンセル |
--force | 現在のセッションのみ | 強制キャンセル。グレースフルな待機はスキップしますが、保護された状態ツールを引き続き使用し、ロックと所有権を尊重します |
--all | 既知のすべてのセッション。セッション ID を明示して操作 | 各セッションを個別に通常の安全な方法でキャンセルし、その後、明示的に許可されたレガシー/グローバルのクリーンアップを実行 |
--force --all | 既知のすべてのセッション。セッション ID を明示して操作 | 強制的な全件キャンセル。各セッションのグレースフルな待機をスキップし、その後、許可されたレガシー/グローバルのクリーンアップを実行 |
CLI のコンテキストでは OMC_SESSION_ID から、フックのコンテキストではフックが提供する session_id から、現在の ID を解決します。フラグなし、または --force の場合に ID がない、あるいは曖昧なときは、フェイルクローズします。状態を集約したり、検出したセッションを選んだり、スコープを指定しないクリーンアップを実行したりしてはいけません。これはデフォルトのコマンドと --force におけるフェイルクローズエラーです。--all では既知のセッションを列挙できますが、具体的な ID ごとに個別に読み取り、キャンセルし、クリアします。
実行内容
アクティブなモードを自動的に検出してキャンセルします。
- Autopilot:再開用に進捗を保持しながら、ワークフローを停止します。
- Ralph:永続化ループを停止します。
- Legacy Ultrawork / UltraQA:古いアップグレード済みインストールの状態のみを削除します。どちらも実行中のワークフローではありません。
- Ultragoal:セッションの実行時ガードをクリアし、永続的な
.omc/ultragoal/の計画および台帳の成果物は保持します。 - Swarm:連携するエージェントを停止し、許可された共有クリーンアップ経路でのみ、割り当て済みのタスクを解放します。
- Ultrapilot / Pipeline:ワーカーまたは順次実行を停止します。
- Team:グレースフルなシャットダウンにはアクティブな Team の操作面を使用し、その後、セッションスコープの Team 状態をクリアします。強制パスでは待機をスキップします。Claude Code 2.1.178+ には
TeamDeleteがありません。 - Team + Ralph:最初に Team をキャンセルし、次に同じセッション内で連携する Ralph をクリアします。Team のキャンセルに失敗した場合は、連携する Ralph を保持します。
- OMC Teams、Plan Consensus、Self-Improve:モード固有の保護されたクリーンアップを使用し、再開用に指定された成果物を保持します。
使用方法
/oh-my-claudecode:cancel
/oh-my-claudecode:cancel --force
/oh-my-claudecode:cancel --all
/oh-my-claudecode:cancel --force --all
または、cancelomc、stopomc と入力します。
重要:遅延されるツールの処理
状態ツール(state_clear、state_read、state_write、
state_list_active、state_get_status)は Claude Code によって遅延される場合があります。いずれかを呼び出す前に、ToolSearch でこれらすべてを読み込んでください。
ToolSearch(query="select:mcp__plugin_oh-my-claudecode_t__state_clear,mcp__plugin_oh-my-claudecode_t__state_read,mcp__plugin_oh-my-claudecode_t__state_write,mcp__plugin_oh-my-claudecode_t__state_list_active,mcp__plugin_oh-my-claudecode_t__state_get_status")
state_clear が利用できない、または失敗した場合は、同じスコープの操作を再試行し、失敗を報告してください。以下のフォールバックは、強制ではなく、Team 以外のキャンセル時に stop hook のループから緊急脱出する場合にのみ使用します。明示的に特定された現在のセッションのファイルのみを削除します。このフォールバックを autopilot、team、omc-teams、または --force/--all で使用してはいけません。また、ロック、所有権の確認、破損、その他の状態ツールの失敗を回避するために使用してはいけません。連携するモードには、モードごとに保護された操作が必要です。
MODE は特定のモード(例:ralplan、ralph、
ultrawork、ultragoal)に置き換えてください。
# Emergency fallback: direct file removal for one identified session only.
SESSION_ID="${OMC_SESSION_ID:-${CLAUDE_SESSION_ID:-${CLAUDECODE_SESSION_ID:-}}}"
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || { d="$PWD"; while [ "$d" != "/" ] && [ ! -d "$d/.omc" ]; do d="$(dirname "$d")"; done; echo "$d"; })"
sha256portable() { printf '%s' "$1" | (sha256sum 2>/dev/null || shasum -a 256) | cut -c1-16; }
if [ -n "${OMC_STATE_DIR:-}" ]; then
SOURCE="$(git remote get-url origin 2>/dev/null || echo "$REPO_ROOT")"
HASH="$(sha256portable "$SOURCE")"
DIR_NAME="$(basename "$REPO_ROOT" | sed 's/[^a-zA-Z0-9_-]/_/g')"
OMC_STATE="$OMC_STATE_DIR/${DIR_NAME}-${HASH}/state"
elif [ "$REPO_ROOT" != "/" ] && [ -d "$REPO_ROOT/.omc" ]; then
OMC_STATE="$REPO_ROOT/.omc/state"
else
echo "ERROR: Could not locate .omc state directory" >&2; exit 1
fi
[ -d "$OMC_STATE" ] || { echo "ERROR: State dir not found at $OMC_STATE" >&2; exit 1; }
MODE="ralplan" # replace with the target mode
[ -n "$SESSION_ID" ] || { echo "ERROR: current session identity is required; refusing unscoped fallback" >&2; exit 1; }
if [ -d "$OMC_STATE/sessions/$SESSION_ID" ]; then
rm -f "$OMC_STATE/sessions/$SESSION_ID/${MODE}-state.json" \
"$OMC_STATE/sessions/$SESSION_ID/${MODE}-stop-breaker.json" \
"$OMC_STATE/sessions/$SESSION_ID/skill-active-state.json"
NOW_ISO="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
EXPIRES_ISO="$(date -u -d "+30 seconds" +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || python3 - <<'PY'
from datetime import datetime, timedelta, timezone
print((datetime.now(timezone.utc) + timedelta(seconds=30)).strftime('%Y-%m-%dT%H:%M:%SZ'))
PY
)"
printf '{"active":true,"requested_at":"%s","expires_at":"%s","mode":"%s","source":"bash_fallback"}' \
"$NOW_ISO" "$EXPIRES_ISO" "$MODE" > "$OMC_STATE/sessions/$SESSION_ID/cancel-signal-state.json"
fi
キャンセルのフロー
これは、すべての呼び出しに適用される正式な手順です。
1. 引数を解析する
正確なフラグをそれぞれ個別に解析します。不明な引数や似ているだけの引数は何もしません。
FORCE_MODE=false
ALL_MODE=false
for arg in "$@"; do
case "$arg" in
--force) FORCE_MODE=true ;;
--all) ALL_MODE=true ;;
esac
done
SCOPE="current"
if [[ "$ALL_MODE" == true ]]; then SCOPE="all"; fi
GRACEFUL_MODE=true
if [[ "$FORCE_MODE" == true ]]; then GRACEFUL_MODE=false; fi
解析された値によって、上記の契約の行が1つだけ選択されます。
2. アクティブなモードを検出する
- フラグなしまたは
--forceの場合は、現在のセッション ID を一意に特定したうえでstate_list_active(session_id="<current_session_id>")を呼び出します。そのスコープ付きの結果を正とし、集約結果から所有関係を推測しないでください。 --allの場合は、state_list_active(all=true)を一度だけ呼び出し、具体的なセッション ID をすべて保持します。検出は対象を列挙するだけのものであり、Team の読み取りではありません。- 選択された各 ID について、モードのクリーンアップの前に
state_get_status(mode="<mode>", session_id="<session_id>")を呼び出します。Ultrawork は廃止済みのクリーンアップ入力として扱ってください。 - 選択された ID を、すべての読み取り、書き込み、クリアに渡してください。保護された状態ツールは、共有のミューテーションロックと所有権の境界を強制します。いかなるフラグもそのどちらも回避しません。
1 つのスコープ付きステータスに複数のモードが含まれる場合は、次の依存関係順序を使用します。
- Autopilot(リンクされた Ralph と廃止済み状態のクリーンアップを含む)
- スタンドアロンの Ralph
- 廃止済みの Ultrawork と UltraQA
- Ultragoal ランタイムガード
- 共有 Swarm 状態(グローバルパスのみ)
- Ultrapilot と Pipeline
- ネイティブ Team
- レガシー OMC Teams
- Plan Consensus と Self-Improve
Team にリンクされた Ralph は、スタンドアロンのステップから除外され、Team が成功した後にのみ処理されます。これにより、永続化ループがワーカーより長く残ることを防ぎます。
3. 選択された各セッションをキャンセルする
選択された各セッションを、この依存関係順序に従って独立に処理します。スコープ付き操作が失敗した、または未解決のままの場合、そのセッションは不成功とみなします。影響を受けた状態・ランタイムの記録は保持し、スコープと理由を報告して、リンクされたクリーンアップが完了したとは主張しないでください。--all の実行では他の ID の処理を継続してもかまいませんが、そのような失敗があると最終的なグローバルパスはブロックされます。
Autopilot(最初に処理)
workflowRunIdが存在する場合はそれを含め、正確なセッション状態を読み取ります。state_write(mode="autopilot", session_id="<session_id>", active=false, state={workflowRunId: "<exact run id>"})によってのみ、その実行を一時停止します。読み戻しを再実行しないでください。状態ツールは、ミューテーションロックの下でワークフローの整合性を再検証します。- 主要な書き込みが失敗した場合は、そのセッションの依存クリーンアップを停止します。そうでなければ、同じセッションの名前付きワークフローのみを
state_clear(mode="ralplan", session_id="<session_id>")でクリアし、その後にリンクされた Ralph、続いて廃止済みの UltraQA をクリアします。依存クリアが失敗した場合は、再開のために一時停止した主要な実行を保持してください。Force モードでも、この主要処理優先の順序は維持されます。
主要な一時停止は、ワークフロー、パイプラインの追跡、タスクの同一性を保持します。target_state_sha256 は、現在のシリアライズされた状態の正確なハッシュである場合にのみ指定できます。主要な書き込みが失敗した後は、ネストされた ralplan、リンクされた状態、キャンセルシグナル、ランタイムの成果物を決してクリアしないでください。正確な依存関係の失敗を報告し、同じセッション内で再試行してください。
Team(ネイティブ Claude Code)
state_read(mode="team", session_id="<session_id>")を読み取り、取得済みのチーム名とアクティブなワーカーのラベルを取得します。集約的な読み取りから Team を選択しないでください。- 正常終了のパスでは、アクティブなサーフェスを通じて名前付きの各チームメイトにシグナルを送り、メンバーごとに最大 15 秒待機してから、さらに 5 秒間照合します。応答とタイムアウトを記録してください。強制パスでは両方の待機をスキップします。
- 正常な確認またはタイムアウトの後(または強制の場合は直ちに)、
state_clear(mode="team", session_id="<session_id>")をクリアします。ロック、所有権、破損、その他の理由で保護されたクリアが失敗した場合は、Team のランタイム記録とリンクされた Ralph を保持し、スコープなしのクリアやフォールバックを使用しないでください。 - Team のクリアが成功した後にのみ、リンクされた Ralph を確認し、同じセッション ID でクリアします(
state_read(mode="ralph", session_id="<session_id>")を読み取り、続いてstate_clear(mode="ralph", session_id="<session_id>"))。レガシーのomc team//omc-teamsワーカーについては、状態のクリーンアップの後に、取得済みのチーム名による孤立ワーカーのスキャンを実行します。ネイティブ Team にはTeamDeleteがありません。 チーム名、通知済みメンバー、応答、タイムアウト、Team と関連付けられた Ralph の状態がクリアされたかどうか、必要な手動クリーンアップを報告してください。正常なタイムアウトは個別に記録します。未解決の保護対象操作のみが、グローバル処理を妨げます。レガシーの孤立状態スキャンは、記録された名前だけを対象とし、記録されていないネイティブ Team を終了したり、~/.claude/teamsのルートを削除したりしてはいけません。
該当する場合のレガシースキャンは次のとおりです。
node "${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-orphans.mjs" \
--team-name "<captured_team_name>"
ワーカーを終了せずに確認するには、--dry-run を使用してください。このスキャンは保護対象の Team クリアの代わりにはならず、名前のプレフィックスが一致するだけで実行してはいけません。
関連付けられた Ralph コンテキスト
キャンセル開始時に Ralph が関連付けられている場合は、同じく Team を先に処理してください。関連付けられた Team の処理が正常に完了する前に、Ralph をクリアしてはいけません。Team の処理に失敗した場合、Ralph は保護されたままにします。両方の操作で、選択した ID を使用します。
その他のモード
- スタンドアロンの Ralph:
state_clear(mode="ralph", session_id="<session_id>")。 - 廃止された Ultrawork:古いスコープ付きレコードに限り、
state_clear(mode="ultrawork", session_id="<session_id>")を使用します。再有効化やルーティングは行いません。 - 廃止された UltraQA:5.0.0 より前の古い状態に限り、
state_clear(mode="ultraqa", session_id="<session_id>")を使用します。 - Ultragoal:
state_clear(mode="ultragoal", session_id="<session_id>")は実行時ガードのみをクリアします。.omc/ultragoal/のアーティファクトは保持してください。 - Ultrapilot、Pipeline、Plan Consensus、Self-Improve:それぞれの保護されたセッション単位のクリアと、モード固有の再開/アーティファクトのルールに従ってください。
- Swarm やその他の共有状態をセッションから推測してはいけません。承認されたグローバル処理でのみ処理してください。OMC Teams は専用の tmux/実行時クリーンアップを使用します。
Self-Improve のクリーンアップでは、解決済みの状態と孤立したワークツリーをクリアし、iteration_state を保持したうえで、解決済みの agent-settings.json に status: "user_stopped" を記録します。新しいトピックのルートを、フラットなレガシールートに置き換えてはいけません。OMC Teams は、記録済みの専用 tmux/実行時レコードを通じてクリーンアップし、ネイティブ Team の状態として扱ってはいけません。omc-teams のクリアには、そのモードの保護されたセッション操作のみを使用してください。
最後に、スコープ付き操作の最後として state_clear(mode="skill-active", session_id="<session_id>") をクリアします。この操作に失敗した場合も、そのセッションは未解決とみなします。
4. 許可されたグローバルパス
グローバルパスは、--all の場合に限り実行できます。すべての具体的なセッション ID への処理が成功し、最後の skill-active のクリアを含むスコープ内のフローが完了している必要があります。いずれかのセッション操作が失敗した場合、または未解決のままの場合は、部分完了として報告し、このパスは省略してください。失敗したスコープ内操作をグローバルな再試行に置き換えてはいけません。
全セッションの列挙自体が失敗した場合、曖昧な ID が返された場合、または Team の所有者を取得できない場合は、該当スコープを未解決として扱い、スコープ指定のない操作を実行する前に停止してください。レガシーのみのエントリは報告できますが、現在のセッションを推測したり、ネイティブの Team ルートを削除したりする許可にはなりません。
明示的なパスには、以下のような保護された状態ツールを使用してください。
state_clear(mode="<legacy-mode>") # no session_id: --all authorization only
スコープ指定のない state_clear はレガシー専用 API ではありません。セッション状態だけでなく、レガシー/共有アーティファクトも再処理する可能性があります。レガシーモードの JSON、Swarm データベース/マーカー、チェックポイント、共有 OMC ワーカーレジストリなど、このパスで明示的に許可された互換性パスに限定してください。ネイティブの Claude ルートや、所有者の取得とクリアに成功していない Team ルートはクリアしないでください。所有者が取得されていない Team ルートは保護されたままです。グローバルクリーンアップの失敗は、スコープ内セッションの失敗とは分けて報告してください。
明示的な互換性対象は次のとおりです。
.omc/state/{autopilot,ralph,ralph-plan,ralph-verification}-state.json.omc/state/{ultrawork,ultraqa,ultrapilot,pipeline,omc-teams}-state.json.omc/state/{ultrapilot-ownership,plan-consensus,ralplan,boulder,hud}.json.omc/state/subagent-tracking.jsonおよび.omc/state/subagent-tracker.lock.omc/state/{swarm.db,swarm.db-wal,swarm.db-shm,swarm-active.marker,swarm-tasks.db}.omc/state/{rate-limit-daemon.pid,rate-limit-daemon.log}.omc/state/checkpoints/および空の.omc/state/sessions/ディレクトリ- 共有レガシー Team ブリッジのハートビートと
.omc/state/team-mcp-workers.json。取得した所有者の処理が成功した場合に限ります
これらの名前が示すレガシーレコードは次のとおりです(セッション所有の置き換えは含みません)。autopilot-state.json、ralph-state.json、
ralph-plan-state.json、ralph-verification.json、ultrawork-state.json、
ultraqa-state.json、ultrapilot-state.json、ultrapilot-ownership.json、
pipeline-state.json、omc-teams-state.json、plan-consensus.json、
ralplan-state.json、boulder.json、hud-state.json、
subagent-tracking.json、subagent-tracker.lock。
共有データベースの互換性レコードは swarm.db、swarm.db-wal、
swarm.db-shm、swarm-active.marker、swarm-tasks.db です。デーモンのレコードは
rate-limit-daemon.pid と rate-limit-daemon.log です。チェックポイントは、この許可されたグローバルパスの一環としてのみ削除されます。
このリストを、.omc/state、~/.claude/teams、~/.claude/tasks 内の任意のファイルを削除する許可と解釈しないでください。リストにない Team/ランタイムレコードや、所有者が取得されていないレコードは、調査と今後の所有者特定のために残してください。
グローバルパスでも、スコープ内操作と同じロックおよび所有権の確認を維持する必要があります。セッションごとのゲートが開いた後は、互換性対象の個別項目でエラーが発生しても記録を続けてかまいませんが、そのグローバル処理の失敗を報告し、完全にリセットされたとは決して主張しないでください。同じディレクトリにあるという理由だけで、永続的な Autopilot、Ultragoal、Self-Improve、または Team の引き継ぎアーティファクトを削除してはいけません。
選択されたスコープにアクティブなモードが見つからない場合は、次のように報告してください。「アクティブな OMC モードは検出されませんでした。」現在のセッションに対するコマンドでは、この結果の対象を暗黙に拡張しないでください。他のセッションを列挙してグローバルパスを実行するには、--all を使用してください。
保持される状態
| モード | キャンセルの結果 |
|---|---|
| Autopilot | 進捗、フェーズ、計画、判定を保持したまま active=false になります |
| Ralph, Ultrawork, UltraQA, Swarm, Ultrapilot, Pipeline | 保護されたスコープ/グローバル操作が成功すると、状態がクリアされます |
| Ultragoal | ランタイムガードはクリアされますが、永続的な計画/台帳は保持されます |
| Team | 引き継ぎと、取得されていないランタイムルートは保持されます。選択された状態は、そのフローの完了後にのみクリアされます |
| Plan Consensus / Self-Improve | モードの説明に記載された、モード固有の再開/アーティファクト記録が保持されます |
Autopilot は /oh-my-claudecode:autopilot で再開できます。Ultragoal の永続的な
計画と台帳は /ultragoal から再開できます。Ralph と廃止された状態には
再開方法がありません。Team の引き継ぎは、後でスコープを指定して再開する際にも
利用できます。一方、共有 Swarm とレガシーの記録には明示的な認可が必要です。
キャンセルの報告には、選択されたスコープ、確認されたモード、成功した操作と 失敗した操作、省略された待機、保持された記録を含めてください。 タイムアウト、ID の欠落、ロックの競合、所有権の不一致、不正な状態を 成功メッセージに変えてはいけません。現在のセッションについての成功報告は、 別のセッションや共有レガシーアーティファクトにも対応したことを意味しません。
MCP ワーカーのクリーンアップ
選択されたセッションをキャンセルする場合は、取得済みチームの
.omc/state/team-bridge/{team}/*.heartbeat.json レコードのみを調べ、
状態をクリーンアップする前にワーカーの正確なハンドルを取得してください。シャットダウンシグナルを送信し、
名前のプレフィックスで選んだセッションではなく、該当する正確な tmux セッション識別子のみを終了してください。所有権または
ID を確認できない場合は、レコードを保持し、手動クリーンアップが必要であることを報告してください。
ハートビート/レジストリエントリを削除するのは、保護されたクリーンアップが成功した後に限ります。
具体的なセッションがすべて成功した後、認可された --all グローバルランタイム
クリーンアップによって、取得済みの Team 名に対応する共有レガシーブリッジ状態を削除できます。
CAPTURED_TEAM_NAMES には、スコープを指定した Team の読み取りが成功した場合に限り、その名前を設定してください。取得できなかったレジストリ/ルートはすべて保持してください。
シャットダウンには、取得済みの正確なワーカー ID を使用してください。
チーム名のプレフィックスは、所有権の根拠になりません。クリーンアップが成功した後に限り、一致するブリッジ
レコードとレジストリエントリのみを削除してください。