wt-switch-create について
Worktrunk の worktree を作成し、依頼されたタスクの前にコーディングセッションを移動するスキルです。ブランチ、リポジトリ、タスクを指定でき、セッションが入れない場合の復旧手順も案内します。
主な機能
- 01タスク着手前の worktree 作成
- 02ブランチとリポジトリの任意指定
- 03パスによる worktree への移動
- 04移動失敗時の復旧手順
- 05コミットとマージには明示的な許可
活用シーン
- 01新しいブランチの worktree でタスクを開始
- 02別のリポジトリでタスクを実行
- 03セッション移動が妨げられた際の復旧
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ max-sixty/ worktrunk --skill wt-switch-createインストール後、Claude Code で/wt-switch-createを入力して読み込まれたか確認します。
同梱ファイルrationale.md
詳細
Arguments: $ARGUMENTS. 文法: [<branch>] [<repo>] [-- <task>]。
- branch — 省略可能です。新しいワークツリーのブランチ名です。省略した場合は、下記の手順 1 で選びます。
- repo — 省略可能なパスまたは名前です。セッションで現在使用しているリポジトリではなく、このリポジトリにワークツリーを作成します。
- task — 省略可能です。新しいワークツリー内で行う作業です。task がない場合は、ワークツリーに入り、待機します。
-- より前のトークンは、ブランチまたはリポジトリです。パス形式のトークン(/、~、./、../ で始まるもの)はリポジトリです。単独の名前はどちらにもなり得るため、状況に基づいて判断してください。現在のリポジトリにその名前のブランチがすでにある場合は、wt switch 自体と同様に、その名前はブランチです。それ以外の場合、ユーザーがリポジトリを置いている場所(現在のリポジトリの隣、または ~/workspace のようなワークスペースディレクトリ)にその名前の git リポジトリが存在すれば、リポジトリです。存在しなければブランチです(docs はブランチであり、現在のリポジトリの docs/ ディレクトリではありません)。リポジトリとして判断した名前は、絶対パスとして引き継ぎます。手順 3 での <repo> には、単独のトークンではなく、そのパスを使います。ブランチと判断されるトークンが 2 つある場合、この文法には当てはまりません。確認してください。-- がない場合は、task の開始位置を判断します。ブランチ名(fix-auth)またはリポジトリと判断される先頭のトークンは、それぞれとして扱い、残りを task とします。それ以外の場合は入力全体が task です(fix the parser bug にはブランチ名らしい先頭部分がないため、すべて task です)。
/wt-switch-create my-feature -- fix the parser bug
/wt-switch-create -- fix the parser bug
/wt-switch-create my-feature ~/workspace/other-repo -- fix the parser bug
/wt-switch-create my-feature
実行すること
すべての呼び出しでは、他の作業に先立ってワークツリーを作成します。この呼び出し自体がワークツリー作成の明示的なリクエストです。調査のみ、または読み取り専用の task であっても、同様にワークツリーを作成します。
-
ブランチ名が指定されていない場合は、新しいブランチ名を選びます。 task の内容をもとに、既存のワークツリー名との一貫性を保った短い名前にします。セッションの途中であれば、移動する作業をもとに選びます。名前の手がかりが何もない場合は、確認してください。
-
repo の指定がない場合は、1 回の呼び出しで作成して移動します。
EnterWorktree({name: "<branch>"})を実行します。Worktrunk のWorktreeCreateフックは、新しいブランチの場合はwt switch --createを、既存ブランチの場合はwt switchを実行し、必要に応じてチェックアウトを作成します。結果は通常のwtワークツリーとなり、ユーザーに確認プロンプトは表示されません。成功したら task を実行します(task のテキストがない場合は、準備ができたことを伝えて待機します)。セッションの途中で未コミットの作業がある場合は、引き継ぎます。
EnterWorktreeの呼び出し前にgit stash push -uを実行し、その後にgit stash popを実行します。この呼び出しによってセッションのルートが新しいワークツリーに切り替わり、stash はワークツリー間で共有されます。 -
それ以外の場合は、
wtで作成し、パスを指定して移動します。 ここに該当するのは、手順 2 では指定できない repo 引数がある場合と、手順 2 がAlready in a worktree sessionというエラーで失敗した場合の 2 通りです。Bash呼び出しで作成します(このリポジトリの場合は-C <repo>を省略します)。wt -C <repo> switch --create <branch> --no-cd --format=json標準出力は JSON で、
pathフィールドにワークツリーの絶対パスが入ります(ステータス行は標準エラーに出力されます)。Branch <branch> already existsが表示された場合、ユーザーがブランチを指定しているなら--createなしで再実行します(そのブランチに移動し、ワークツリーがなければ作成します)。手順 1 で名前を選んだ場合は、別の名前を選んで再実行します。その他のエラー(git リポジトリではない、名前が無効など)が発生した場合は、ユーザーに報告して停止します。repo 引数がある場合は、次に独立した
Bash呼び出しでcd <repo>を実行します。EnterWorktreeがセッションのルートを切り替えるのは、cwd があるリポジトリ内に限られます。また、worktrunk のPermissionRequestフックが確認への応答を行うのは、同じリポジトリのwtワークツリーに対する呼び出しだけです。cdの結果がShell cwd was resetの場合、repo にアクセスできません。到達不能の説明に従って、移動を省略し、制御を戻します。次に、
EnterWorktree({path: "<JSON の path>"})を呼び出します。repo 引数がある場合は、セッションが新しいワークツリーで作業するようになった後(移動後、または以下の復旧手順で
cdした後)、ルートに存在するCLAUDE.mdとAGENTS.mdを読み込みます。Claude Code は起動時のリポジトリのルート指示をコンテキストに保持し、新しいリポジトリのネストされた指示のみを読み込むため、新しいリポジトリのルートファイルが、以降のセッションでは起動時のリポジトリの指示に優先します。- 承認済み → セッションはワークツリー内で再ルートされます。タスクを実行してください(タスクテキストがない場合は、準備完了を確認して待機します)。
- ツールエラー — ツールが実行され、エラーが返された(
Cannot enter worktree: …)→ 正常系です。何も移動しておらず、1 つのリカバリーで すべてに対応できます。よくある原因は、セッションがすでにワークツリー内(または ピン留めされている)にルートされていることで、これによりエントリーが現在のリポジトリの.claude/worktrees/に制限され、同じリポジトリのwtの兄弟であっても除外されます。リカバリーの テストは、そのディレクトリにcdできるかどうかで、許可されたディレクトリ内であれば 機能します。そこでcd <path>を実行し、結果を読み取ってください:Shell cwd was resetの通知がない → 成功しました。ワークツリーに到達できます。 そこで作業してください。ただし、単なるcdは追跡された再ルートではないため、cwd は ターンをまたいで(および生成されたサブエージェント内で)セッションの起動時のワークツリーに 戻る可能性があります。cdの永続化を信頼するのではなく、git -C <path>/wt - <path>で コマンドをピン留めしてください。Shell cwd was reset→ 到達不可。 停止し、cdがリセットされたディレクトリを 到達可能にするようユーザーに依頼してください:リポジトリとそのワークツリーの両方を保持する 親、たとえば~/workspaceをpermissions.additionalDirectoriesに追加する(永続的、すべてのセッション)、 またはそれに対して/add-dirを実行する(このセッション)。その後、そのcdから続行してください。 コマンドごとにcdがリセットされる状態で絶対パスを使って苦労しないでください。
- 拒否 — 呼び出し自体が拒否され、ツールエラーはなかった → 拒否がどのように
表現されていても、それは
.claude/worktrees/外のワークツリーに入ることについて Claude Code が表示するものに対するユーザーの回答です。ただし、尋ねるユーザーがいなかった場合 (拒否はセッションがプロンプトを出せなかったと述べている)は別で、これは何も決定しません — 上記のリカバリーを行ってください。ユーザーの回答について:wtがたった今作成したワークツリーはまだ存在します。エントリーが行われなかっただけです。 移動したリポジトリから、もしあればcdで戻り、その後ワークツリーのパスを報告して 進め方を尋ねてください。cdでそこに到達することはその回答を上書きすることになるためです。
クリーンアップ
ワークツリーは通常の worktrunk ワークツリーです:wt list に表示され、他のものと同様に
wt merge / wt remove <branch> でマージまたは削除されます。促されずに削除しないでください。
ステップ 2 のワークツリーでセッションが一度も触れなかったもの — 変更されたファイルもコミットもない —
は、セッション終了時にブランチも含めてクリーンアップされます。そこに書き込まれたものがあれば
残ります。ステップ 3 のワークツリーは常に残ります。ユーザーがセッション途中で離れるよう
依頼した場合、ExitWorktree({action: "keep"}) はセッションを元のディレクトリに戻します;
ExitWorktree は path で入ったワークツリーを削除できないため、それらの削除は常に
wt remove <branch> です。
スコープ
このコマンドの責務は 1 つのワークツリー(リポジトリが指定された場合はその名前付きリポジトリ内)と、 その中の要求されたタスクです。コミット、プッシュ、マージはそれぞれ依然として ユーザーの明示的な許可を必要とします。