bail について
Claudeのコーディング作業を中断する際、クリーンアップの前に試したことと学びを記録するスキルです。ブランチやworktreeの扱い、GitHubの課題・PR更新、`MEMORY.md`への学びの保存を案内します。
主な機能
- 01現在の作業段階を判定
- 02`.branch-context.md`に学びを記録
- 03記録を`MEMORY.md`に集約
- 04課題とPRの更新を案内
- 05削除前に確認を要求
活用シーン
- 01作業を中断する理由の記録
- 02今後のセッション向けに学びを保存
- 03放棄したブランチやworktreeの整理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ camacho/ ai-skills --skill bailインストール後、Claude Code で/bailを入力して読み込まれたか確認します。
詳細
中断プロトコル:必ず最初に振り返ってから、クリーンアップします。すべてのコマンドでは絶対パスと git -C を使用します。
入力
WORKTREE:現在のワークツリーの絶対パス(ワークツリーがない場合はプライマリワークツリー)- 任意の理由文字列(指定されていない場合は、理由を尋ねます)
手順
-
存在するものを確認して、現在のステップを特定します:
存在するもの 推定ステップ Issue のみで、ブランチなし Step 0(記録) .branch-context.md があり、ワークツリーなし Step 1(状況把握) ワークツリーがあり、コード変更なし Step 2(分離) ブランチ上に計画ファイルがある Step 3-4(設計/レビュー) コード変更がコミット済み Step 5-7(ビルド/検証/アーカイブ) GitHub で PR がオープン中 Step 8(出荷) -
理由が指定されていない場合は、理由を尋ねます。
-
ワークツリーの
.branch-context.mdに学びを記録します:# Write bail context — use absolute path cat >> "$WORKTREE/.branch-context.md" <<EOF ## Bail - Reason: <reason> - What was attempted: <summary> - What was learned: <learnings> EOF git -C "$WORKTREE" add .branch-context.md git -C "$WORKTREE" commit -m "docs: capture bail context" -
使い捨てのクローンを使って、学びを
MEMORY.mdに集約します(ワークツリー内で main をチェックアウトしないでください):BAIL_DIR="${CLAUDE_SESSION_DIR:-$TMPDIR}/bail-reflect" [ -d "$BAIL_DIR" ] && rm -rf "$BAIL_DIR" git clone --depth 50 "$(git -C "$WORKTREE" remote get-url origin)" "$BAIL_DIR"$BAIL_DIR/ai-workspace/MEMORY.mdを読み、.branch-context.mdから関連する学びを追記してから、次を実行します:git -C "$BAIL_DIR" add ai-workspace/MEMORY.md git -C "$BAIL_DIR" commit -m "docs: consolidate learnings from abandoned <branch> Co-Authored-By: Claude <model>" git -C "$BAIL_DIR" pushnon-fast-forward の場合:
git -C "$BAIL_DIR" pull --rebaseを実行してから push します。再試行は最大 3 回です。 クリーンアップ:rm -rf "$BAIL_DIR" -
GitHub Issue を更新します(アクセス可能な場合):
GH_REPO=<owner/repo> gh issue comment <number> --body "Bailing: <reason>. Learnings captured in MEMORY.md." GH_REPO=<owner/repo> gh issue edit <number> --add-label "deferred" --remove-label "triage" -
PR がオープン中の場合は閉じます:
PR_NUM=$(GH_REPO=<owner/repo> gh pr list --head "<branch>" --json number -q '.[0].number') if [ -n "$PR_NUM" ]; then GH_REPO=<owner/repo> gh pr close "$PR_NUM" fi -
ブランチを保持するかどうか尋ねます:
デフォルト:ブランチを保持します(ユーザーは後で再開できます)。
ユーザーが明示的に削除すると言った場合は、削除されるものを示して確認します:
This will delete: - Branch: <name> - Worktree: <path> - Remote branch (if pushed) Type 'delete' to confirm.入力による確認を得た後にのみ、次を実行します:
PRIMARY="$(git -C "$WORKTREE" worktree list --porcelain | grep -m1 '^worktree ' | sed 's/^worktree //')" # Verify branch is merged before deleting (-d fails if unmerged, -D would force) git -C "$PRIMARY" worktree remove "$WORKTREE" git -C "$PRIMARY" branch -d <branch>branch -dが失敗した場合(未マージの作業がある場合)は、ユーザーに警告して停止します。branch -Dは使用しないでください。 -
完了です。 main をチェックアウトせず、セッションの現在の CWD にとどまります。
エッジケース
- ワークツリーが存在しない(Step 0-1 で中断)→ ワークツリーのクリーンアップをスキップし、Issue のみを更新します
- GitHub にアクセスできない → Issue の更新をスキップし、ローカルのクリーンアップとメモリへの集約は行います
- PR がすでにマージ済み → 閉じず、出力にその旨を記載します
.branch-context.mdがない → 集約の前に、中断理由のみを記載して作成しますCLAUDE_SESSION_DIRが未設定 → クローンには$TMPDIRを代わりに使用します
出力:クリーンアップした内容と、学びを保存した場所の概要。