/wt-clean — 自分の worktree を片付けて閉じる
worktree 側のセッションで実行する。実行に成功すると workspace ごと閉じ、このセッション自体が終了する。cwd が本体 checkout なら、wt rm <task> と task を明示するか、worktree 側セッションで実行するよう案内する。
手順
- モードを判定する:
gh pr view --json state,headRefOid,urlで現在ブランチの PR を調べる。PR があれば PR モード、無ければ(gh 無し / remote 無し / PR 未作成)ローカルモード。 - PR モードの検査(3 点):
- 未コミット変更が無い:
git status --porcelainが空 - PR がマージ済み: state が
MERGED - HEAD が PR に入っている:
git rev-parse HEADが headRefOid と一致 3 点すべて満たしたら: 先に完了報告を出す(PR URL と、本体 checkout の更新は dev 側でgit pullする旨を含める)。報告を出してからwt rm --forceを実行する。ここでの--forceは例外的に正当 — PR マージ後も本体 checkout は pull 前なので、git branch -dがブランチを「未マージ」と誤認して残すため。3 点を検証済みの場合に限る。 満たさないときは中断して報告する: - state が
OPEN→ 「PR がまだマージされていない」。URL を示して待つ(headRefOid 不一致は push 漏れ —git pushで PR を更新してから待つ)。 - state が
MERGEDだが未コミット変更がある、または HEAD が headRefOid と不一致 → マージ後に積んだ余剰の変更。push しても merged PR には入らない。新しい issue / ブランチに切り出すか、ユーザーが破棄を明示した場合のみ破棄する。 - state が
CLOSED(マージされず閉じた)→ 破棄扱い。ユーザーが破棄を明示した場合のみwt rm --force。
- 未コミット変更が無い:
- ローカルモードの検査(2 点):
- 未コミット変更:
git status --porcelain - 本体に未取り込みのコミット:
git log --oneline $(git -C <本体パス> rev-parse HEAD)..HEAD(本体パスはgit rev-parse --path-format=absolute --git-common-dirの親ディレクトリ)
- 未コミット変更:
- ローカルモードで両方空なら: 先に完了報告を出す(「worktree を片付けます。この workspace は閉じます」)。報告を出してから
wt rmを実行する — 実行すると workspace ごと閉じてセッションが終了するため、後から報告はできない。task は現在のブランチから自動推定される。 - ローカルモードでどちらか非空なら中断し、失われるものを具体的に列挙する(変更ファイル一覧 / コミット一覧)。選択肢を提示する:
/wt-mergeで本体に取り込んでから片付ける- 未コミット変更をコミットしてから
/wt-merge - 破棄してよいとユーザーが明示した場合のみ
wt rm --force
レビューサーバ
/wt-review が HTTP 配信でレビューページを出していた場合、wt rm が残っている listener も止める(worktree を消しても配信プロセスだけ生き続けるのを防ぐ)。承認ボタンが押された時点でサーバは自分で終了しているので、通常は何も残らない。片付けずに listener だけ止めたいときは wt serve --stop。
禁止事項
--forceを自己判断で使わない。例外は PR モードで 3 点(未コミット無し / MERGED / HEAD 一致)を検証済みの場合のみ。未マージ・未コミットの作業を黙って消さない。