worktrunk — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited worktrunk (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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 installShell 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 worktreeWorktrees 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 outputKey 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 mergedLocal merge (squash + rebase + fast-forward):
wt merge main
# Commits, rebases onto main, fast-forward merges, removes worktreeHooks 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 + commitConfigure 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@worktrunkAdd 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)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.