Using git worktrees
Skill event4u-app/agent-config/dist/agent-src/skills/using-git-worktrees
Universal AI Agent OS — audited skills, governance rules, replayable state. One contract, every host agent.
npx -y skills add event4u-app/agent-config --skill using-git-worktreesAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when starting parallel work in isolation from the current branch — spawn a git worktree with ignore-safety checks and a clean test baseline — even when the user says 'try this on the side'.
SKILL.md
7.6 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it
using-git-worktrees
When to use
- Starting new work while the current branch is mid-work and you don't want to stash or switch
- Running two agents (Augment Code, Claude Code, Cursor) on the same repo in parallel — each needs its own working directory
- Experimenting with a refactor that may be thrown away — a throwaway worktree is cheaper than a throwaway commit
- A long-running build or test suite is busy in the current worktree
subagent-orchestrationmode 6 (do-in-worktrees) was selected for a cross-wing chain — this skill is the executor that creates the per-step isolated worktrees the chain expects
Do NOT use when:
- A small fix fits in one commit on the current branch — worktree overhead is not worth it
- The task is linear ("just finish this PR") — a single branch is simpler
- The repo is tiny and branch-switching is instant — setup cost outweighs isolation benefit
- You are unsure which branch you want — pick the branch first
Goal
Land in an isolated, ignored, test-clean worktree ready for implementation, without polluting the parent repo's working tree.
The Iron Law
NO WORKTREE WITHOUT VERIFIED IGNORE + CLEAN BASELINE.
An un-ignored worktree directory will get committed accidentally. A worktree with a failing baseline mixes pre-existing failures into new work and makes it impossible to tell what you broke.
Procedure
0. Pre-flight — read worktrees.mode
Before anything else, read worktrees.mode from .agent-settings.yml
(default: ask). The setting is a mechanical layer on top of
scope-control's permission gate — it narrows, never widens.
worktrees.mode | Behaviour |
|---|---|
ask | Status quo. Continue to step 1; scope-control permission gate applies for every worktree creation. |
on | Standing permission. Skip the per-creation permission ask; continue to step 1. Iron-Law gates (ignore-check, clean baseline) still apply. |
off | No autonomous worktree creation. Refuse unless the user explicitly asked this turn for a worktree ("do this in a worktree", "use mode 6", "spawn a worktree for X"). |
Off, no explicit request → stop. Tell the user the setting is off,
suggest the in-place alternative (subagent-orchestration mode 3
do-in-steps, or just stay on the current branch). Do not re-ask on
the same task.
Off, with explicit request this turn → acknowledge once
("worktrees.mode is off; running this on your explicit request
for this task") and continue to step 1. The override is for this one
task — it does not flip the setting.
The setting only suppresses unprompted usage. The tool stays available when the user wants it.
1. Inspect current state
Before creating anything, check existing conventions — do not assume:
git worktree list # already-active worktrees
ls -d .worktrees worktrees 2>/dev/null # project-local convention
grep -i "worktree.*director" AGENTS.md CLAUDE.md 2>/dev/null
If a worktree on the target branch already exists, reuse it. Git refuses to check out a branch that is already live elsewhere.
2. Pick directory convention
Stop at the first match — do not ask if discovered:
| Found | Use |
|---|---|
.worktrees/ exists | .worktrees/<branch-name> |
worktrees/ exists | worktrees/<branch-name> |
AGENTS.md preference | follow it |
| nothing found | ask user (numbered options) |
Ask format:
.worktrees/— project-local, hiddenworktrees/— project-local, visible~/.event4u/agent-config/worktrees/<project>/— global
Recommendation: 1 — .worktrees/ — project-local keeps the worktree next to the repo (easy cleanup), and the leading dot keeps it out of ls. Caveat: pick 3 if multiple repos must share a single worktree root.
3. Verify ignore-safety (project-local only)
git check-ignore -q .worktrees || git check-ignore -q worktrees
If exit ≠ 0: add the path to .gitignore, commit that change
before creating the worktree. Do not proceed until the check
passes. For the global location, skip — path is outside the repo.
4. Create the worktree
git worktree add .worktrees/<branch-name> -b <branch-name>
cd .worktrees/<branch-name>
Branch names must match the project convention — see
commit-conventions rule.
5. Install dependencies + verify baseline
Auto-detect from manifest files:
| File | Command |
|---|---|
composer.json | composer install |
package.json | npm ci / pnpm install / yarn |
pyproject.toml | poetry install or pip install -e . |
Cargo.toml | cargo build |
go.mod | go mod download |
Run the project's fastest test target. If the baseline fails, stop and report — ask whether to fix main first or proceed. Never silently continue with a red baseline.
Optional env-bootstrap entry — stand-up beyond deps. Some projects need
more than package install to stand up (start services, seed fixtures, generate
config). A project MAY declare a single bootstrap entry — an env-bootstrap
target in its runner file (Taskfile.yml / Makefile / package.json
scripts) or a documented equivalent. When one exists, surface it as the
suggested next action after the baseline — suggest, never auto-execute (no new
autonomous surface). Long-running work then reads one deterministic stand-up
entry instead of re-deriving it each session. If none exists, deps + baseline is
the whole stand-up.
Multi-tool parallel work
Agents share the same .git/ but get their own working directory. One
worktree per agent session; branch name encodes agent/task
(feat/augment-auth, feat/claude-refactor). Merge or discard before
starting a new worktree on the same branch.
Gotcha
- Un-ignored directory — contents end up tracked;
git statusnoise across the whole repo. Verify first. - Two worktrees on same branch — git refuses; pick a new branch.
- Hardcoded
npm installon a PHP project fails silently. Detect from manifest files. - Skipping baseline — failing tests pre-existed; later blamed on your own changes.
Output format
- Location — full path to the worktree
- Branch — created branch name
- Baseline —
<N> tests passingor explicit failure report - Next step — suggested skill or command for the actual work
Do NOT
- NEVER create a worktree before the ignore check passes
- NEVER skip the baseline test run
- NEVER reuse a directory name that already holds a worktree
- NEVER
rm -rfa worktree — usegit worktree remove
Handover
| Task | Skill / command |
|---|---|
| Finishing the branch | finishing-a-development-branch |
| Opening the PR | /create-pr |
| Verifying completeness | verify-before-complete |