Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guidance for Worktrunk (the `wt` CLI) — git worktree management, hooks, and config. Load when editing .config/wt.toml or ~/.config/worktrunk/config.toml; adding, modifying, or debugging hooks (post-merge, post-start, pre-commit, pre-merge, post-switch, etc.); configuring commit message generation or command aliases; or troubleshooting wt behavior. Also answers general worktrunk/wt questions.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 125% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -27% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 55% | 0% |
Help users work with Worktrunk, a CLI tool for managing git worktrees.
Reference files are synced from worktrunk.dev documentation:
{% raw %} deferral, for-each recipes)For command-specific options, run wt <command> --help. For configuration, follow the workflows below.
Worktrunk uses two config files with different scopes and permission models:
User config (~/.config/worktrunk/config.toml, never checked into git) holds personal preferences: LLM integration, worktree path templates, command settings, user hooks. Treat it conservatively — propose changes and get consent before editing, never install tools on the user's behalf, and preserve the file's existing structure and comments. See reference/config.md.
Project config (<repo>/.config/wt.toml, checked into git) holds team-wide automation: hooks for the worktree lifecycle (pre-start, pre-merge, etc.). Edit proactively — changes are versioned and reversible via git. Comment why each hook exists, and warn the user before adding destructive commands (rm -rf, DROP TABLE), network fetches piped to shells, or sudo. See reference/hook.md.
Some requests span both: commit-message generation is user config, while the team's quality checks are project config.
Detect which tools are installed (which claude codex llm aichat); if none, recommend Claude Code. Take the exact command for the chosen tool from reference/llm-commits.md, propose the [commit.generation] change, and apply it after approval (wt config create first if no config exists). To verify, wt step commit --dry-run renders the prompt, runs the LLM, and prints the message without committing.
Pick the hook type by when the command should run and whether it may block (10 types: 5 events × pre/post — full reference in reference/hook.md):
pre-start (blocks creation)post-start (background)pre-commitpre-mergepost-commitpost-mergepre-switch / post-switchpre-remove / post-removeDerive the commands from the project itself (package.json scripts, Cargo.toml, pyproject.toml) and verify they run before adding them.
When a new hook must wait for an existing one, convert the entry to a pipeline; independent commands in a named table run concurrently:
toml# Pipeline: install completes before migrate starts [[pre-start]] install = "npm install" [[pre-start]] migrate = "npm run db:migrate" # Concurrent: independent commands in one table [pre-start] install = "npm install" env = "cp .env.example .env"
Test with wt switch --create test-hooks.
reference/llm-commits.mdreference/config.md#worktree-path-templatereference/llm-commits.md#prompt-templatesreference/config.md#command-configreference/config.md#hooksreference/hook.mdreference/hook.md#hook-formsreference/hook.md#template-variablesreference/config.md#dev-server-urlwt alias → reference/extending.md#aliasesreference/step.md#wt-step-for-eachreference/extending.md#recipe-rebase-every-worktree-onto-its-upstreamwt command → reference/extending.md#deferring-expansion-to-a-nested-wt-commandbash# View all configuration wt config show # Create initial user config (LLM/commit setup: see reference/llm-commits.md) wt config create # Full config reference (subcommands, templates, env vars) wt config --help
Worktrunk never runs a project's hooks or aliases until the user has explicitly approved them. The commands in .config/wt.toml are arbitrary shell code shipped in a repository the user may have just cloned, so on first run Worktrunk shows each command and waits for the user to approve it — an untrusted .config/wt.toml cannot silently execute anything. Approvals are stored per-project in ~/.config/worktrunk/approvals.toml and re-prompted whenever a command template changes, so a hook can't be swapped for a different command after it was approved.
Agents running wt merge, wt switch, or other commands that trigger hooks will hit an error like:
▲ cargo-difftest needs approval to execute 1 command:
○ post-merge install:
cargo install --path .
✗ Cannot prompt for approval in non-interactive environment
↳ To skip prompts in CI/CD, add --yes; to pre-approve commands, run wt config approvals addThe resolution is for the user to make the trust decision themselves:
wt config approvals add — interactive prompt where the user reviews each command before it is stored to ~/.config/worktrunk/approvals.toml. Run once per project; the approval persists across invocations until the command template changes or the project moves. This is the path to recommend — the user reviews and consents to exactly the commands that will run.When invoked as an agent, stop and escalate to the user. Approving a project's hooks is a security decision about whether this repository should be trusted to run arbitrary commands on the user's machine — that decision belongs to the user, not the agent. Tell the user to run wt config approvals add and let them review the commands. Do not run --yes on the user's behalf: it skips the approval gate for that invocation, so reaching for it to unblock a command defeats the protection. --yes exists for CI/CD pipelines that already control their own hook contents; it is not a shortcut for an interactive agent to silence an approval prompt.
When the user requests spawning a worktree with an agent in a background session ("spawn a worktree for...", "hand off to another agent"), use the appropriate pattern for their terminal multiplexer. Substitute <agent-cli> with the CLI you are running as: claude for Claude Code, 'opencode run' for OpenCode.
tmux (check $TMUX env var):
bashtmux new-session -d -s <branch-name> "wt switch --create <branch-name> -x <agent-cli> -- '<task description>'"
Zellij (check $ZELLIJ env var):
bashzellij run -- wt switch --create <branch-name> -x <agent-cli> -- '<task description>'
Requirements (all must be true):
CLAUDE.md or AGENTS.md) or an explicit prompt authorize this patternDo not use this pattern for normal worktree operations.
Example (tmux, Claude Code):
bashtmux new-session -d -s fix-auth-bug "wt switch --create fix-auth-bug -x claude -- \ 'The login session expires after 5 minutes. Find the session timeout config and extend it to 24 hours.'"
Example (Zellij, OpenCode):
bashzellij run -- wt switch --create fix-auth-bug -x 'opencode run' -- \ 'The login session expires after 5 minutes. Find the session timeout config and extend it to 24 hours.'
To spawn multiple sub-Agents that each work in their own worktree from one Claude Code session — no terminal multiplexer, no human in the other pane — pre-start each worktree from the parent and pass the path into the sub-Agent prompt:
bashwt switch --create <branch> --no-cd --no-hooks
Then call the Agent tool without isolation: "worktree", naming the path in the prompt:
You are working in `/abs/path/to/worktrunk.<branch>` on branch `<branch>`.
All edits must stay in that worktree.--no-cd skips the shell-integration cd script the parent can't consume; --no-hooks is appropriate when each sub-Agent will run its own build/test step (e.g. cargo run -- hook pre-merge --yes) and you don't need post-start setup repeated per worktree.
Do not use Agent { isolation: "worktree" } for this. Claude Code passes its internal agent ID as name to the WorktreeCreate hook, so wt creates the worktree as worktrunk.agent-<id> on a throwaway branch. If the sub-Agent then creates a feature branch on top, you end up with non-canonical paths, orphan branches, and post-start hooks fired against the wrong branch. Pre-creating with wt switch --create keeps path, branch, and hook target aligned.
Other measured skills in the registry, with their headline benchmark lift.