关于 wt-switch-create
此技能会先创建 Worktrunk worktree,并将编码会话切换到其中,再执行指定任务。可选择分支、仓库和任务,并提供会话无法进入 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。语法:[<branch>] [<repo>] [-- <task>]。
- branch — 可选;新工作树的分支名称。省略时, 按照下文步骤 1 选择。
- repo — 可选路径或名称;在此仓库中创建工作树,而不是在会话当前所在的仓库中创建。
- task — 可选;在新工作树中要执行的操作。不指定任务则进入 工作树并等待。
-- 之前的标记是分支和/或仓库。形似路径的标记
(以 /、~、./ 或 ../ 开头)是仓库。裸名称可能是分支,也可能是仓库,
需要根据情况判断。如果当前仓库已有同名分支,则它是分支,wt switch 本身也是如此。否则,如果用户存放仓库的位置(当前仓库旁边,或
~/workspace 这样的工作区目录)存在同名 git 仓库,则它是仓库;若不存在,则它是分支(docs 是分支,而不是当前仓库的
docs/ 目录)。如果名称被识别为仓库,则后续使用其绝对路径:步骤 3 中的 <repo> 应是该路径,而不是裸标记。两个标记若都被识别为分支,则不符合语法——请询问用户。如果没有
--,根据任务从哪里开始判断:开头被识别为分支名称(fix-auth)或仓库的标记会被视为相应参数,剩余部分是任务;否则,整个输入都视为任务(fix the parser bug 没有形似分支的开头,因此全部是任务)。
/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
要做的事
每次调用都必须先创建工作树,再进行任何其他工作。调用本身就是创建工作树的明确请求;即使是研究或只读任务,也照样创建工作树。
-
如果没有提供分支名称,则选择一个新名称:名称要简短,根据任务确定, 并与现有工作树名称保持一致;如果是在会话中途,则根据要迁移的工作选择名称;如果没有可据以命名的内容,请询问。
-
未提供仓库参数时,在一次调用中创建并进入工作树:
EnterWorktree({name: "<branch>"})。Worktrunk 的WorktreeCreatehook 会为新分支运行wt switch --create,或为现有分支运行wt switch,并在需要时创建其检出目录。结果是普通的wt工作树,用户不会看到确认提示。成功后,执行任务(如果没有任务文本,则确认已准备就绪并等待)。如果在会话中途操作,请将未提交的工作一并迁移:在调用
EnterWorktree前运行git stash push -u,之后运行git stash pop——该调用会将会话的根目录切换到新工作树,而 stash 在各工作树间共享。 -
其他情况,使用
wt创建并通过路径进入工作树。 以下两种情况会进入此步骤:提供了仓库参数(步骤 2 无法针对该仓库),或步骤 2 失败且错误提示为Already in a worktree session。使用Bash调用创建(若是当前仓库,则省略-C <repo>):wt -C <repo> switch --create <branch> --no-cd --format=json标准输出为 JSON,其中
path字段是工作树的绝对路径(状态行会输出到标准错误)。如果提示Branch <branch> already exists:若分支由用户指定,则不带--create重新运行(这会进入该分支,并在工作树不存在时创建工作树);若名称由步骤 1 选择,则换一个名称后重新运行。其他任何失败(不是 git 仓库、名称无效):报告错误并停止。如果提供了仓库参数,接下来单独使用
Bash调用运行cd <repo>。EnterWorktree只会在当前工作目录所属的仓库内切换根目录,而 Worktrunk 的PermissionRequesthook 仅会为同一仓库的wt工作树,回答该调用所请求的确认。如果cd报告Shell cwd was reset,则无法访问该仓库:跳过进入步骤,并按照下文 无法访问 的说明交接。然后调用
EnterWorktree({path: "<path from the JSON>"})。如果提供了仓库参数,在会话开始于新工作树中工作之后(已进入,或通过下文的恢复步骤使用
cd进入),在执行任务前读取该仓库根目录下存在的CLAUDE.md和AGENTS.md。Claude Code 会将启动时所在仓库的根目录指令保留在上下文中,并且只加载新仓库中更深层级的指令文件,因此,在本次会话剩余时间内,新仓库的根目录文件会取代启动时仓库的根目录文件。- 已接受 → 会话已在该工作树中重新定位。执行任务(如果没有任务文本,则确认已就绪并等待)。
- 工具错误 — 工具已运行并返回错误(
Cannot enter worktree: …)→ 可妥善处理;没有任何内容被移动,一种恢复方法适用于所有情况。常见原因是会话已位于某个工作树中(或使用了固定 Agent),这会将进入范围限制在当前仓库的.claude/worktrees/,甚至不包括同一仓库中的wt兄弟目录。恢复时要检查的是能否cd进入该工作树;如果它位于允许的目录中,就可以进入。因此,执行cd <path>并查看结果:- 没有出现
Shell cwd was reset提示 → 已成功进入;该工作树可访问。在其中工作,但单独执行cd不会将重新定位记录为受跟踪状态,因此跨轮次(以及在衍生的子 Agent 中)当前工作目录可能会恢复为会话启动时所在的工作树;请使用git -C <path>/wt -C <path>固定命令,而不要指望cd持续生效。 - 出现
Shell cwd was reset→ 无法访问。 停止并请用户让重置cd的目录变为可访问:将同时包含仓库及其工作树的父目录(例如~/workspace)添加到permissions.additionalDirectories(长期生效,每个会话均适用),或对其运行/add-dir(仅限本会话)。然后从该cd继续。不要在每条命令执行时cd都被重置的情况下,反复尝试绝对路径。
- 没有出现
- 已拒绝 — 调用本身被拒绝,没有工具错误 → 无论拒绝提示如何措辞,这都是用户对 Claude Code 显示的、关于进入
.claude/worktrees/之外工作树的确认请求所作的答复;但如果无法询问用户(拒绝提示称会话无法发起询问),则不能据此得出任何结论——请采用上述恢复方法。根据用户的答复:刚创建的工作树wt仍然存在;只是没有进入其中。如果你已移入仓库,请先cd回去,然后报告该工作树的路径并询问如何继续,因为通过cd访问它会违背用户的答复。
清理
该工作树是一个普通的 worktrunk 工作树:它会显示在 wt list 中,可像其他工作树一样使用 wt merge 合并,或使用 wt remove <branch> 删除。不要擅自删除。
如果会话从未操作过第 2 步创建的工作树(没有更改文件,也没有提交),则会话结束时会清理该工作树及其分支;任何写入其中的内容都会使其保留。第 3 步创建的工作树始终保留。如果用户要求在会话中途离开,ExitWorktree({action: "keep"}) 会将会话返回其原始目录;
ExitWorktree 无法删除通过 path 进入的工作树,因此这类工作树始终要使用 wt remove <branch> 删除。
范围
该命令的职责范围是一个工作树(如果指定了仓库,则位于该仓库中)以及其中要求执行的任务。提交、推送和合并仍须分别获得用户的明确许可。