worktree · git:20260226.ce66352 · 2026-02-26 · sha256 4c4643d67bb488ab

worktree git:20260226.ce66352A

Immutable. This exact content is served forever at /api/v1/blob/4c4643d67bb488ab.

---
name: worktree
description: >
  Use when starting feature work that needs workspace isolation — creates git worktree
  with automatic project setup and baseline test verification. Ensures worktree directory
  is git-ignored and safe. Integrates with code-forge:impl and code-forge:finish.
---

# Code Forge — Worktree

Create an isolated git worktree for feature development with automated project setup and safety verification.

## When to Use

- Starting feature work that should not affect the main workspace
- Before running code-forge:impl to isolate implementation changes
- When you need a clean baseline for testing or experimentation

## Iron Law

**NEVER create a project-local worktree without verifying it is git-ignored.** Worktree contents tracked by git will cause repository corruption.

## Workflow

```
Detect Directory → Verify Safety → Create Worktree → Project Setup → Baseline Tests → Report
```

### Step 1: Detect Worktree Directory

Check in order:
1. Existing `.worktrees/` or `worktrees/` directory in project root — use if found
2. Project CLAUDE.md for worktree preference — use without asking
3. Ask user:
   - **Project-local** `.worktrees/` (Recommended) — keeps worktrees near the code
   - **Global** `~/.config/code-forge/worktrees/` — outside project, no .gitignore needed

### Step 2: Verify Safety (Project-Local Only)

**CRITICAL:** If using a project-local directory:

```bash
git check-ignore -q <worktree-dir>
```

- **Ignored:** Proceed
- **NOT ignored:** Add to `.gitignore` immediately, then commit:
  ```bash
  echo "<worktree-dir>/" >> .gitignore
  git add .gitignore && git commit -m "chore: add worktree directory to .gitignore"
  ```

Global directory: skip this step.

### Step 3: Create Worktree

```bash
# Detect project name
PROJECT_NAME=$(basename "$(git rev-parse --show-toplevel)")

# Create worktree with new branch
git worktree add <worktree-dir>/<feature-name> -b <feature-name>
```

Branch naming: use the feature name provided by the user, prefixed with `feat/` if not already prefixed.

### Step 4: Project Setup

Auto-detect and run setup in the worktree directory:

| Marker | Command |
|--------|---------|
| `package.json` | `npm install` |
| `package-lock.json` | `npm ci` |
| `yarn.lock` | `yarn install` |
| `pnpm-lock.yaml` | `pnpm install` |
| `requirements.txt` | `pip install -r requirements.txt` |
| `pyproject.toml` | `pip install -e .` or `poetry install` |
| `Cargo.toml` | `cargo build` |
| `go.mod` | `go mod download` |
| `build.gradle` | `./gradlew build` |
| `pom.xml` | `mvn install -DskipTests` |

If multiple markers exist, run the most specific one. If none match, skip setup.

### Step 5: Baseline Tests

Run the project's test command to establish a clean baseline:

```bash
# Auto-detect test command from package.json, Makefile, etc.
# Run tests and report results
```

- **All pass:** Report green baseline, proceed
- **Some fail:** Warn user — "Baseline has N failing tests. These are pre-existing, not caused by your changes."
- **No test command found:** Skip, inform user

### Step 6: Report

```
Worktree created:
  Branch:    feat/<feature-name>
  Location:  <worktree-dir>/<feature-name>
  Setup:     npm install (completed)
  Baseline:  42/42 tests passing

Next steps (code-forge workflow):
  /code-forge:impl <feature-name>    Execute implementation tasks
  /code-forge:finish                  When done, merge/PR/cleanup

Next steps (ad-hoc development):
  /code-forge:tdd                    Enforce TDD discipline
  /code-forge:finish                  When done, merge/PR/cleanup
```

## Common Mistakes

- Creating project-local worktree without checking .gitignore
- Skipping baseline tests — pre-existing failures mask new regressions
- Hardcoding setup commands instead of auto-detecting
- Proceeding when baseline tests fail without user acknowledgment