> Use this skill when the user asks about Worktrunk (wt), git worktree management, running parallel AI agents with worktrees, setting up wt hooks, configuring wt.toml, using `wt switch`, `wt list`, `wt merge`, `wt remove`, `wt step`, LLM commit messages, or integrating Worktrunk with your AI agent. Also trigger when the user wants to run multiple AI agent sessions in parallel across isolated git branches, or automate dev server / database / dependency setup per worktree. Always use this skill for any question involving the `wt` CLI, worktree lifecycle automation, or the worktrunk plugin.
npx skills add https://github.com/jjmartres/opencode --skill worktrunk
Worktrunk (wt) is a CLI for git worktree management designed to run AI agents
(like Claude Code) in parallel across isolated branches. Think of it as making
git worktree as easy as git branch.
| Task | Command |
| ------------------------------- | ----------------------------------- |
| Create worktree + switch | wt switch --create feat |
| Create worktree + launch Claude | wt switch --create feat -x claude |
| List all worktrees | wt list |
| Merge & clean up | wt merge main |
| Remove current worktree | wt remove |
| Commit staged changes | wt step commit |
# macOS/Linux (recommended)
brew install worktrunk && wt config shell install
# Cargo
cargo install worktrunk && wt config shell install
# Windows
winget install max-sixty.worktrunk
git-wt config shell install
Shell integration (wt config shell install) is required so that wt switch
can actually change the shell's directory.
wt switch --create feature-auth # New branch + worktree
wt switch --create feature-auth -x claude # + launch Claude in it
wt switch existing-branch # Switch to existing worktree
wt switch - # Previous worktree
Worktrees are placed at ../repo.branch-name by default (configurable).
wt list # All worktrees with status, commits, CI
wt list --full --branches # Include remote branches without worktrees
wt list --format=json # Machine-readable output
Key indicators in wt list:
@ = current worktree+ / - = staged / unstaged changes↑ / ↓ = ahead / behind remote⇡ / ⇣ = ahead / behind default branch🤖 = Claude is working (Claude Code plugin)💬 = Claude waiting for inputwt switch -x claude -c feature-a -- 'Add user authentication'
wt switch -x claude -c feature-b -- 'Fix the pagination bug'
wt switch -x claude -c feature-c -- 'Write tests for the API'
-x / --execute runs a command after switching; arguments after -- are passed to it.
PR workflow:
wt step commit # Commit staged changes with optional LLM message
gh pr create # Open PR
wt remove # After PR merged
Local merge (squash + rebase + fast-forward):
wt merge main
# Commits, rebases onto main, fast-forward merges, removes worktree
Hooks automate worktree lifecycle events. Define in .config/wt.toml (project)
or ~/.config/worktrunk/config.toml (user/global).
See references/hooks.md for the full hook reference, template variables, and
common patterns (dev servers, databases, cold-start elimination).
| Hook | When | Blocking |
| ------------- | ------------------- | ---------------------- |
| post-create | After creation | Yes (blocks --execute) |
| post-start | After creation | No (background) |
| post-switch | Every switch | No |
| pre-commit | Before merge commit | Yes |
| pre-merge | Before merge | Yes |
| post-merge | After merge | Yes |
| pre-remove | Before removal | Yes |
| post-remove | After removal | No |
Eliminate cold starts (copy deps/caches/env from main):
[post-start]
copy = "wt step copy-ignored"
Dev server per worktree (deterministic port from branch name):
[post-start]
server = "npm run dev -- --port {{ branch | hash_port }}"
[pre-remove]
server = "lsof -ti :{{ branch | hash_port }} -sTCP:LISTEN | xargs kill 2>/dev/null || true"
Local CI gate (run tests before merge):
[pre-merge]
test = "npm test"
build = "npm run build"
In hook commands (Jinja2 syntax):
| Variable | Value |
| ---------------------- | -------------------------------- |
| {{ branch }} | Branch name |
| {{ repo }} | Repository directory name |
| {{ worktree_path }} | Absolute path to this worktree |
| {{ default_branch }} | Default branch name |
| {{ target }} | Target branch (merge hooks only) |
| Filter | Example | Output |
| ------------- | ----------------------------- | ----------------------- |
| sanitize | {{ branch \| sanitize }} | / and \ → - |
| sanitize_db | {{ branch \| sanitize_db }} | DB-safe identifier |
| hash_port | {{ branch \| hash_port }} | Stable port 10000-19999 |
Generate commit messages from diffs:
wt step commit # Commit staged changes, generate message
wt step commit --all # Stage all + commit
Configure in ~/.config/worktrunk/config.toml:
[commit.generation]
model = "claude-opus-4-5" # or any supported model
provider = "anthropic"
Install the plugin for activity tracking (🤖 / 💬 in wt list) and
configuration skill:
claude plugin marketplace add max-sixty/worktrunk
claude plugin install worktrunk@worktrunk
Add to ~/.claude/settings.json for statusline:
{
"statusLine": {
"type": "command",
"command": "wt list statusline --format=claude-code"
}
}
Spawn agent handoffs directly into Zellij panes (great with your existing Zellij setup):
zellij run -- wt switch --create fix-auth -x claude -- \
'Fix the session timeout bug in auth module'
Or use hooks for a full multi-pane layout per worktree:
# .config/wt.toml
[post-create]
zellij = """
zellij action new-tab --name {{ branch | sanitize }}
zellij action new-pane -- claude
"""
For microservice's repos, a typical .config/wt.toml:
[post-create]
env = "cp {{ primary_worktree_path }}/.env.local .env.local 2>/dev/null || true"
[post-start]
copy = "wt step copy-ignored"
[pre-merge]
lint = "make lint"
test = "make test"
[post-merge]
notify = "echo '✓ Merged {{ branch }} → {{ target }}'"
references/hooks.md — Complete hook documentation with all patternsreferences/commands.md — Full command reference (switch, list, merge, remove, step, config)Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take jjmartres/worktrunk from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference brew, cargo, go.
Without those the skill loads but fails at the first command.