Skip to content

Agent Integration

Worktrunk ships a plugin for each supported agent CLI. What a plugin provides depends on the hooks that CLI exposes:

CapabilityClaude CodeCodexOpenCodePioh-my-piGemini CLI
Configuration skill✓✓✓
Activity tracking (🤖/💬 in wt list)✓✓✓✓✓✓
Worktree isolation✓✓
/wt-switch-create skill✓

The configuration skill is documentation the agent reads to help set up LLM commits, hooks, and troubleshooting. Activity tracking shows which worktrees have running sessions. Worktree isolation needs worktree-lifecycle hooks, which only Claude Code and OpenCode 2 expose, so Codex, Pi, oh-my-pi, and Gemini users invoke wt switch --create and wt remove directly. Codex tracks activity through its own Stop and SessionEnd hooks.

wt config plugins claude install

Manual equivalent:

claude plugin marketplace add max-sixty/worktrunk
claude plugin install worktrunk@worktrunk

wt config plugins claude uninstall removes the plugin and its marketplace entry.

wt config plugins codex install

Manual equivalent:

codex plugin marketplace add max-sixty/worktrunk
codex plugin add worktrunk@worktrunk

wt config plugins codex uninstall removes the plugin and its marketplace entry.

wt config plugins opencode install

This writes the plugin to OpenCode’s global plugins directory, ~/.config/opencode/plugins/worktrunk.ts (honoring $OPENCODE_CONFIG_DIR and $XDG_CONFIG_HOME). wt config plugins opencode uninstall removes it.

wt config plugins pi install

This writes the activity extension to ~/.pi/agent/extensions/worktrunk.ts, where Pi discovers it on startup; $PI_CODING_AGENT_DIR replaces the agent directory. wt config plugins pi uninstall removes the extension.

wt config plugins omp install

oh-my-pi (omp) is a Pi-derived agent with its own config root and hook API, so it takes a separate command. This writes the activity hook to ~/.omp/agent/hooks/pre/worktrunk.ts. Named $OMP_PROFILE or $PI_PROFILE profiles use ~/.omp/profiles/<profile>/agent, $PI_CONFIG_DIR changes the .omp config root, and $PI_CODING_AGENT_DIR overrides the agent directory for the default profile. wt config plugins omp uninstall removes the hook.

gemini extensions install https://github.com/max-sixty/worktrunk

Gemini loads the extension natively from the repository, so there is no wt wrapper. gemini extensions uninstall worktrunk removes it.

With the /worktrunk skill, the agent can help with:

  • Setting up LLM-generated commit messages
  • Adding project hooks (pre-start, pre-merge, pre-commit)
  • Configuring worktree path templates
  • Fixing shell integration issues

Claude Code is designed to load the skill automatically when it detects worktrunk-related questions.

Every plugin tracks agent sessions with status markers in wt list:

wt list
Branch Status HEAD± main↕ main…± Remote⇅ Commit Age Message
@ main ^⇡ ⇡1 33323bc 1d Initial commit
+ feature-api ↑ 🤖 ↑1 +1 70343f0 1d Add REST API endpo…
+ review-ui ? ↑ 💬 +1 ↑1 +1 a585d6e 1d Add dashboard comp…
+ wip-docs ? – +1 33323bc 1d Initial commit
○ Showing 4 worktrees, 2 with changes, 2 ahead, hidden: Path
  • 🤖 — agent is working
  • 💬 — agent is waiting or idle

Every plugin clears the marker when a session ends. A stale marker can remain if the agent process is killed before its session-end hook runs. In every case, wt config state marker clear removes a marker manually.

Set status markers manually for any workflow:

wt config state marker set "🚧" # Current branch
wt config state marker set "✅" --branch feature # Specific branch
git config worktrunk.state.feature.marker '{"marker":"💬","set_at":0}' # Direct

Activity tracking is not plugin-specific. The plugins above only call wt on their host’s session events, and the marker itself is plain git config — so any CLI that can run a command on session lifecycle events drives the same 🤖/💬 markers with no worktrunk plugin:

Host eventCommand
Session starts, or the agent resumes workwt config state marker set "🤖"
Agent finishes a turn and waits for inputwt config state marker set "💬"
Session endswt config state marker clear

Worktree isolation (Claude Code and OpenCode)

Section titled “Worktree isolation (Claude Code and OpenCode)”

Claude Code agents can run in isolated worktrees (isolation: "worktree"). By default, Claude Code creates these with git worktree add. The plugin’s WorktreeCreate and WorktreeRemove hooks route this through wt switch --create and wt remove instead, so worktrees created by agents get worktrunk’s naming conventions, hooks, and lifecycle management.

Under OpenCode 2, the plugin registers a worktrunk worktree strategy, so worktrees OpenCode creates and removes go through the same commands. Each gets a branch named after the worktree name OpenCode chooses, at the path from worktree-path; OpenCode’s worktree.directory setting no longer applies. A dirty worktree fails removal with worktrunk’s message rather than an offer to force.

/wt-switch-create skill (Claude Code only)

Section titled “/wt-switch-create skill (Claude Code only)”

/wt-switch-create [<branch>] [<repo>] [-- <task>] starts a task in a fresh worktree without leaving the session: it creates the worktree, switches into it, and runs the task (all arguments optional). The worktree shows up in wt list; merge or remove it with wt merge / wt remove.

Claude Code asks for confirmation before a session enters an existing worktree by path outside .claude/worktrees/, which in worktrunk’s default layout is every worktree. The plugin’s PermissionRequest hook answers yes for a worktree of the repository the session is working in that sits where worktree-path puts its branch, so a background session doesn’t stop at that prompt. Entering any other worktree still asks.

wt list statusline --format=claude-code outputs a single-line status for the Claude Code statusline. Claude Code runs it in the background, which is what makes the occasional 1–2 second CI fetch invisible.

~/w/myproject.feature-auth !🤖 @+42 -8 ↑3 ⇡1 #3035 Opus 🌔 65% 1.4×(10am–3pm)

Worktree state comes from the same cells wt list renders; Claude Code’s stdin JSON adds the model, the 🌔 65% context gauge, and the rate-limit pace notice. wt list statusline documents every segment, how the links behave, and the JSON fields behind them.

Claude Code statusline demo
Switching to a worktree, then launching Claude Code with the statusline configured

Add to ~/.claude/settings.json:

~/.claude/settings.json
{
"statusLine": {
"type": "command",
"command": "wt list statusline --format=claude-code"
}
}