worktree
ワークツリーのライフサイクル管理スキル。一覧表示、マージ済みワークツリーの自動削除、手動削除、ゾンビエージェントプロセスの kill を行う。「/worktree list」「/worktree clean」「/worktree remove」「/worktree kill-zombies」と言った時に使用。
SKILL.mdskills/worktree/SKILL.md
GitHub🌳 ワークツリー管理
[!IMPORTANT] このスキルは git worktree のライフサイクルを管理する(一覧 / マージ済み自動削除 / 手動削除 / ゾンビ tmux エージェント kill)。 結果のみを簡潔に返す。途中経過は出力しない。 未コミット変更があるワークツリー・メインワークツリーは 削除対象から除外 する。
git worktree のライフサイクルを管理する。
📖 使用方法
/vibecorp:worktree list
/vibecorp:worktree clean
/vibecorp:worktree remove <ブランチ名>
/vibecorp:worktree kill-zombies
📦 サブコマンド
| サブコマンド | 用途 |
|---|---|
list |
全ワークツリーの状態を表示する |
clean |
マージ済み / 孤立ワークツリーを自動削除し、ゾンビ tmux エージェントも掃除する |
remove <ブランチ名> |
指定したワークツリーを手動削除する |
kill-zombies |
ゾンビ tmux エージェントだけを kill する |
🗂️ list — ワークツリー一覧
全ワークツリーの状態を表示する。
git worktree list
各ワークツリーについて、ブランチ名でタイプを判定し、対応する情報を取得する。
🏷️ ブランチタイプの判定
| パターン | タイプ | PR 確認 |
|---|---|---|
worktree-agent-* |
Agent worktree | 不要(PR なし) |
dev/* 等 |
通常 worktree | PR 状態を確認 |
通常 worktree の PR 確認
gh pr list --head <ブランチ名> --state all --json number,state,title --jq 'if length > 0 then .[0] | ("#" + (.number | tostring)) + " " + (.state | ascii_downcase) + " " + .title else "- - -" end'
Agent worktree の状態判定
# 未コミット変更の有無
git -C <worktree_path> status --porcelain
# ベースブランチとの差分の有無
git -C <worktree_path> diff HEAD..origin/main --quiet
| 状態 | 条件 |
|---|---|
agent (孤立) |
未コミット変更なし + 差分なし |
agent (作業中) |
未コミット変更あり or 差分あり |
返却フォーマット
| パス | ブランチ | PR | 状態 |
|------|---------|-----|------|
| /path/to/worktree | dev/62_xxx | #123 | open |
| /path/to/worktree2 | dev/99_yyy | #456 | merged |
| .claude/worktrees/agent-abc123 | worktree-agent-abc123 | - | agent (孤立) |
| .claude/worktrees/agent-def456 | worktree-agent-def456 | - | agent (作業中) |
🧹 clean — マージ済み・孤立ワークツリーの自動削除
マージ済みの PR に対応するワークツリー、および孤立した Agent worktree を自動削除する。
削除完了後、消えた worktree を見続けるゾンビ tmux エージェントも自動 kill する(kill-zombies と同じ動作)。
ワークフロー
git worktree listで全ワークツリーを取得(メインを除く)。- 各ワークツリーのブランチ名でタイプを判定する。
通常 worktree(dev/* 等)の処理
- ブランチについて PR の状態を確認する。
merged状態の PR に対応するワークツリーを削除対象とする。- 削除前に未コミットの変更がないか確認する。
# 未コミット変更の確認(worktree のパスで実行)
git -C <worktree_path> status --porcelain
- 未コミット変更がある場合はスキップしてユーザーに報告する。
- 変更がない場合はワークツリーとローカルブランチを削除する。
git worktree remove <worktree_path>
git branch -d <ブランチ名>
Agent worktree(worktree-agent-*)の処理
Agent worktree は PR を持たないため、以下の条件で削除を判定する。
- 未コミットの変更がないか確認する。
git -C <worktree_path> status --porcelain
- ベースブランチとの差分がないか確認する(Agent が変更を残していないか)。
git -C <worktree_path> diff HEAD..origin/main --quiet
- 両方とも空(未コミット変更なし + 差分なし)→ 孤立した Agent worktree として削除する。
git worktree remove <worktree_path>
git branch -d <ブランチ名>
- いずれかが非空 → スキップしてユーザーに報告する(作業中 or 未プッシュの変更がある)。
worktree 削除後のゾンビ kill
ワークツリー削除ステップが完了したら、kill-zombies サブコマンドと同じ手順でゾンビエージェントを掃除する(後述「kill-zombies — ゾンビ tmux エージェントの自動 kill」参照)。
返却フォーマット
削除: dev/62_xxx (/path/to/worktree)
削除: worktree-agent-abc123 (.claude/worktrees/agent-abc123) [Agent]
スキップ: dev/100_zzz (未コミット変更あり)
スキップ: worktree-agent-def456 (作業中) [Agent]
Killed: ship-parallel-20260405/ship-243 pane=%176 worktree=/path/to/missing
---
削除: 2件, スキップ: 2件, Killed: 1件, Skipped: 0件
🗑️ remove — 指定ワークツリーの手動削除
指定したブランチ名のワークツリーを削除する。
ワークフロー
git worktree listから指定ブランチのパスを特定する。- 未コミット変更がないか確認する。
- 未コミット変更がある場合はユーザーに確認を求める。
- ワークツリーとローカルブランチを削除する。
git worktree remove <worktree_path>
git branch -d <ブランチ名>
-d で削除できない場合(未マージ)はユーザーに報告して停止する。-D は使用しない。
返却フォーマット
削除: <ブランチ名> (<worktree_path>)
🧟 kill-zombies — ゾンビ tmux エージェントの自動 kill
ship-parallel が tmux ペインで起動した Agent は、対応する worktree が削除されると cd: no such file or directory のループに入り CPU を消費し続ける(Issue #253)。
このサブコマンドは ~/.claude/teams/*/config.json を走査し、worktree が消えた tmux 連動エージェントの tmux ペインを検出して kill する。
ワークフロー
実装は .claude/lib/zombie_agent.sh に集約されている。スキル実行時はこのスクリプトを呼び出すだけでよい。
bash "$CLAUDE_PROJECT_DIR/.claude/lib/zombie_agent.sh" kill
スクリプトの動作:
~/.claude/teams/*/config.jsonを全走査する。backendType == "tmux"かつtmuxPaneId非空のメンバーを抽出する。promptからworktree パス: <path>をパースして worktree 絶対パスを取得する。- 該当パスのディレクトリが存在しない → ゾンビとして検出する。
- tmux サーバーが起動しており該当ペインが残存している →
tmux kill-pane -t <paneId>。 - tmux ペインが既に消えている / tmux サーバー未起動 → スキップする。
dry run(kill せずに一覧確認)
bash "$CLAUDE_PROJECT_DIR/.claude/lib/zombie_agent.sh" list
<team>\t<member-name>\t<tmuxPaneId>\t<missing-worktree-path> 形式で tab 区切り出力する。
返却フォーマット
Killed: ship-parallel-20260405/ship-243 pane=%176 worktree=/path/to/missing
Skipped: ship-parallel-20260405/ship-244 pane=%177 (既に消滅 or tmux 未起動) worktree=/path/to/missing2
---
Killed: 1, Skipped: 1
⚠️ 制約
- jq では string interpolation
\(...)を使わない — Bash 上で\がエスケープ文字、()がサブシェルとして解釈され、意図しない展開やパースエラーを引き起こすため。必ず+で結合する。 - コマンドをそのまま実行する —
2>/dev/null、|| echo、; echo等のリダイレクトやフォールバックを付加しない(根拠)。 git branch -D(強制削除)は使用しない。- 未コミット変更があるワークツリーは自動削除しない。
- メインワークツリーは削除対象から除外する。
🔗 関連ルール
- プロンプト作成基準:
.claude/rules/prompt-writing.md - マークダウン規約:
.claude/rules/markdown.md - シェル規約:
.claude/rules/shell.md