mcpField
B
bail

bail

github.com/camachoエージェントワークフロー684 回インストール
リポジトリ

bail について

Claudeのコーディング作業を中断する際、クリーンアップの前に試したことと学びを記録するスキルです。ブランチやworktreeの扱い、GitHubの課題・PR更新、`MEMORY.md`への学びの保存を案内します。

主な機能

  1. 01現在の作業段階を判定
  2. 02`.branch-context.md`に学びを記録
  3. 03記録を`MEMORY.md`に集約
  4. 04課題とPRの更新を案内
  5. 05削除前に確認を要求

活用シーン

  1. 01作業を中断する理由の記録
  2. 02今後のセッション向けに学びを保存
  3. 03放棄したブランチやworktreeの整理

インストール

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

$npx skills add https://github.com/camacho/ai-skills --skill bail

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

詳細

中断プロトコル:必ず最初に振り返ってから、クリーンアップします。すべてのコマンドでは絶対パスと git -C を使用します。

入力

  • WORKTREE:現在のワークツリーの絶対パス(ワークツリーがない場合はプライマリワークツリー)
  • 任意の理由文字列(指定されていない場合は、理由を尋ねます)

手順

  1. 存在するものを確認して、現在のステップを特定します:

    存在するもの推定ステップ
    Issue のみで、ブランチなしStep 0(記録)
    .branch-context.md があり、ワークツリーなしStep 1(状況把握)
    ワークツリーがあり、コード変更なしStep 2(分離)
    ブランチ上に計画ファイルがあるStep 3-4(設計/レビュー)
    コード変更がコミット済みStep 5-7(ビルド/検証/アーカイブ)
    GitHub で PR がオープン中Step 8(出荷)
  2. 理由が指定されていない場合は、理由を尋ねます。

  3. ワークツリーの .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"
    
  4. 使い捨てのクローンを使って、学びを 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" push
    

    non-fast-forward の場合:git -C "$BAIL_DIR" pull --rebase を実行してから push します。再試行は最大 3 回です。 クリーンアップ:rm -rf "$BAIL_DIR"

  5. 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"
    
  6. 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
    
  7. ブランチを保持するかどうか尋ねます:

    デフォルト:ブランチを保持します(ユーザーは後で再開できます)。

    ユーザーが明示的に削除すると言った場合は、削除されるものを示して確認します:

    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 は使用しないでください。

  8. 完了です。 main をチェックアウトせず、セッションの現在の CWD にとどまります。

エッジケース

  • ワークツリーが存在しない(Step 0-1 で中断)→ ワークツリーのクリーンアップをスキップし、Issue のみを更新します
  • GitHub にアクセスできない → Issue の更新をスキップし、ローカルのクリーンアップとメモリへの集約は行います
  • PR がすでにマージ済み → 閉じず、出力にその旨を記載します
  • .branch-context.md がない → 集約の前に、中断理由のみを記載して作成します
  • CLAUDE_SESSION_DIR が未設定 → クローンには $TMPDIR を代わりに使用します

出力:クリーンアップした内容と、学びを保存した場所の概要。

コメント