ce-worktree — Claude Code skill: isolated git worktrees
The skill sets up a separate git worktree so your edits stay out of the main checkout. Handy when you want to work away from the current branch.
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a claude-codeWhat ce-worktree does
The skill first checks whether isolation already exists, and only then creates anything. It compares the absolute git dir against the absolute common git dir: equal means a normal checkout, different means a linked worktree or a submodule. A submodule counts as a normal checkout, but inside an existing worktree the skill works in place — a worktree-from-worktree lands in the wrong tree and stays invisible to the harness that made the current one.
Order of operations: the harness's native tool first — EnterWorktree, WorktreeCreate, a /worktree command or a --worktree flag. Plain git is the fallback. It runs from the repo root, checks with git check-ignore -q .worktrees/ that .worktrees/ is gitignored, and refreshes the base with git fetch origin <from-branch>. No origin remote or a differently named one is not an abort; the skill continues with the local ref.
There are two modes. For new work it creates a branch from a base; for an existing ref — a PR, branch or commit — it attaches the worktree to that ref. A branch can be checked out in only one worktree at a time, so if the ref is already taken the skill reports the path instead of making a second tree. PRs get checked out on a local branch rather than a detached FETCH_HEAD, which would orphan the fix loop's commits. If git worktree add fails on a sandbox or permission error, the skill does not fall back to the current checkout — it asks what you want to do.
What it helps with
- spin up a separate tree for new work without touching the current branch
- attach a worktree to an existing branch, PR or commit
- avoid a second worktree for a branch that is already checked out
- check out a PR on a local branch so its commits are not orphaned
- detect that you are already inside an isolated tree
Example prompts for the agent
- Set up a worktree for this new task and report the path and branch
- Attach a worktree to the
fix/email-validationbranch - Check out this PR in its own worktree
How to install ce-worktree
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a claude-code2Manually: put the files in place
~/.claude/skills/ce-worktree/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/ce-worktree/
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a codex2Manually: put the files in place
.agents/skills/ce-worktree/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a cursor2Manually: put the files in place
.cursor/skills/ce-worktree/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install EveryInc/compound-engineering-plugin ce-worktree2Manually: put the files in place
.github/skills/ce-worktree/SKILL.md1Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a gemini-cli2Platform CLI
gemini skills install https://github.com/EveryInc/compound-engineering-plugin --path skills/ce-worktreeManually: put the files in place
.devin/skills/ce-worktree/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about ce-worktree
How do I install ce-worktree in Claude Code?
Run npx skills add EveryInc/compound-engineering-plugin --skill ce-worktree -a claude-code. The skill file lands at ~/.claude/skills/ce-worktree/SKILL.md.
What does ce-worktree do?
It sets up an isolated git worktree: either a fresh branch from a base, or a worktree attached to an existing branch, PR or commit. It checks for existing isolation first.
Why won't it create a second worktree for the same branch?
A branch can be checked out in only one worktree at a time. If the ref is already taken, the skill reports where it is checked out and leaves the call to you.
Source text
SKILL.md · MIT
--- name: ce-worktree description: Set up isolated git worktrees — create a new branch for fresh work, or attach a worktree to an existing branch, PR, or commit. Use when starting isolated work or isolating an existing ref. --- # Worktree Isolation Ensure the current work happens in an isolated workspace, without disturbing the user's main checkout. Most coding harnesses now create a worktree by default at session start, so the common case is that **isolation already exists**. **Done when:** the caller is working in an isolated tree — existing or newly created — and its path and branch have been reported, or a blocker has been reported instead. **Order of operations: detect existing isolation -> prefer a native worktree tool -> fall back to plain git.** Never create a worktree the harness cannot see. **Two modes, set by the caller's need:** - **New work (default).** No ref named — create a fresh branch from a base (trunk). This is what `ce-work` and `ce-code-review` use when the user picks the worktree option. - **Isolate an existing ref.** The caller names a PR head, branch, or commit — attach the worktree to that ref instead of creating a new branch. **A branch can be checked out in only one worktree at a time.** If the named ref is already checked out anywhere (most commonly as the primary checkout's current branch), do **not** create a second worktree — report that it is already checked out at `<path>` and let the caller act (work there in place; or, only if a clean separate tree is essential, create a *detached* worktree at the same commit). ## Step 0: Detect existing isolation Compare the **resolved absolute** git dir against the **resolved absolute** common git dir. Git mixes absolute and relative forms depending on the current directory (from a subdirectory of a normal checkout, `--git-dir` comes back absolute while `--git-common-dir` may be relative), so a raw string compare yields a false "already isolated": ```bash git rev-parse --absolute-git-dir # absolute git dir for this worktree (cd "$(git rev-parse --git-common-dir)" && pwd -P) # absolute shared (common) git dir ``` **Equal** -> normal checkout; continue to Step 1. **Different** -> a linked worktree *or* a submodule. Distinguish with `git rev-parse --show-superproject-working-tree`: - **Non-empty** -> submodule; treat it as a normal checkout and continue to Step 1. - **Empty** -> **already isolated**. Report the worktree path (`git rev-parse --show-toplevel`) and current branch, then **work in place** — a worktree-from-worktree lands in the wrong tree and is invisible to the harness that made the current one. In isolate-an-existing-ref mode, check that ref out here (unless it is already current) rather than nesting a worktree. ## Step 1: Prefer the harness's native worktree tool If the harness provides a native worktree primitive — for example an `EnterWorktree` / `WorktreeCreate` tool, a `/worktree` command, or a `--worktree` flag — use it and stop. Native tools place, track, and clean up the worktree so the harness can manage it. A behind-the-back `git worktree add` creates phantom state the harness cannot see, navigate to, or clean up. ## Step 2: Git fallback Only when there is no native tool **and** Step 0 found no existing isolation. 1. **Run from the repo root:** `cd "$(git rev-parse --show-toplevel)"`. The paths below are repo-root-relative, but the skill runs from the user's current directory — without this, `.worktrees/<branch>` and the `.gitignore` edit land in a subdirectory (e.g. `src/.worktrees/...`). 2. Choose a meaningful branch name from the work description (e.g. `feat/login`, `fix/email-validation`) — never an opaque auto-generated one. Base: origin's default branch, else `main`. 3. **Ensure `.worktrees/` is gitignored before creating anything:** `git check-ignore -q .worktrees/` — **with the trailing slash**, so an existing directory-only `.worktrees/` rule is honored even before the directory exists (without the slash the probe misses it and dirties a correctly-configured repo). Not ignored -> add a `.worktrees/` line to `.gitignore`. 4. Refresh the base with `git fetch origin <from-branch>`. This is **non-fatal** — no `origin` remote, a differently-named remote, or a local-only branch is not an abort; continue with the local ref. 5. Create the worktree, per mode: - **New work:** `git worktree add -b <branch-name> .worktrees/<branch-name> origin/<from-branch>` (use the local `<from-branch>` ref if `origin/<from-branch>` does not exist). - **Existing branch or tag:** `git worktree add .worktrees/<slug> <target-ref>`. - **PR:** check it out on a **local branch** — `git fetch origin pull/<n>/head:pr-<n>` then `git worktree add .worktrees/pr-<n> pr-<n>`. Never a detached `FETCH_HEAD`: that orphans the fix loop's commits instead of updating the PR. (For push-tracking back to the PR, create it detached — `git worktree add --detach .worktrees/pr-<n>` — then `cd` in and run `gh pr checkout <n>`, which is fork-safe.) - If git reports the ref is already checked out elsewhere, apply the one-branch-one-worktree rule above — do not force a second worktree. 6. `cd` into it, then report the path and branch. If `git worktree add` fails with a sandbox or permission error, the requested isolation does not exist. Do **not** proceed in the current checkout — the user chose isolation specifically to avoid it. Report the failure and ask, offering options such as "work in the current checkout" vs "stop and resolve the permission issue", using the host's blocking question tool already in the current tool list (match by capability, not by a host-specific name). Presence in the current tool list is proof the tool exists; never call a user-facing question tool to discover whether it exists. If a matching tool is listed but unloaded, use the host's tool-discovery primitive to load that capability — do not search for another host's tool name. Only when no such tool is in the list or a real question call errors, present the numbered options in chat and wait for the reply. Never skip the confirmation, and do not retry alternative paths automatically.
© EveryInc · MIT · EveryInc/compound-engineering-plugin