mcpField
W
wt-switch-create

wt-switch-create

github.com/max-sixty開発9.5k1.4k 回インストール今日更新
リポジトリ

wt-switch-create について

Worktrunk の worktree を作成し、依頼されたタスクの前にコーディングセッションを移動するスキルです。ブランチ、リポジトリ、タスクを指定でき、セッションが入れない場合の復旧手順も案内します。

主な機能

  1. 01タスク着手前の worktree 作成
  2. 02ブランチとリポジトリの任意指定
  3. 03パスによる worktree への移動
  4. 04移動失敗時の復旧手順
  5. 05コミットとマージには明示的な許可

活用シーン

  1. 01新しいブランチの worktree でタスクを開始
  2. 02別のリポジトリでタスクを実行
  3. 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 であっても、同様にワークツリーを作成します。

  1. ブランチ名が指定されていない場合は、新しいブランチ名を選びます。 task の内容をもとに、既存のワークツリー名との一貫性を保った短い名前にします。セッションの途中であれば、移動する作業をもとに選びます。名前の手がかりが何もない場合は、確認してください。

  2. repo の指定がない場合は、1 回の呼び出しで作成して移動します。 EnterWorktree({name: "<branch>"}) を実行します。Worktrunk の WorktreeCreate フックは、新しいブランチの場合は wt switch --create を、既存ブランチの場合は wt switch を実行し、必要に応じてチェックアウトを作成します。結果は通常の wt ワークツリーとなり、ユーザーに確認プロンプトは表示されません。成功したら task を実行します(task のテキストがない場合は、準備ができたことを伝えて待機します)。

    セッションの途中で未コミットの作業がある場合は、引き継ぎます。EnterWorktree の呼び出し前に git stash push -u を実行し、その後に git stash pop を実行します。この呼び出しによってセッションのルートが新しいワークツリーに切り替わり、stash はワークツリー間で共有されます。

  3. それ以外の場合は、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 つのワークツリー(リポジトリが指定された場合はその名前付きリポジトリ内)と、 その中の要求されたタスクです。コミット、プッシュ、マージはそれぞれ依然として ユーザーの明示的な許可を必要とします。

コメント