Skip to content
Back to skills

Worktree

ASecurity

Manage git worktrees for autoimprove experiments. Creates isolated worktrees for each experiment so the main codebase is never touched. Handles setup, teardown, and merging winning experiments back to main.

  • 5 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added May 26, 2026
devopsgobashgit

Security analysis

A93/100
  • highPerforms destructive filesystem operations

Pro shows the line behind each finding and how to fix it

Scanned May 27, 2026

npx -y skills add benmarte/autoimprove --skill worktree --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Worktree?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Worktree
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/benmarte-worktree/badge)](https://www.skillsdirectory.com/skills/benmarte-worktree)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
description: Manage git worktrees for autoimprove experiments. Creates isolated worktrees for each experiment so the main codebase is never touched. Handles setup, teardown, and merging winning experiments back to main.
---

# Worktree Management Skill

Every autoimprove experiment runs in an isolated git worktree — a separate directory linked to the same repo but on its own branch. The main working directory is **never modified**. Only winning experiments get merged back.

```
your-project/          ← main worktree (never touched during experiments)
.claude/autoimprove/worktrees/       ← experiment worktrees live here
  experiment-001/      ← branch: autoimprove/experiment-001
  experiment-002/      ← branch: autoimprove/experiment-002
```

---

## Setup worktree environment

Run once before the first experiment in a session:

```bash
# 1. Make sure we're on a clean main branch
git status
git branch --show-current

# 2. Create the worktree container directory (gitignored)
mkdir -p .claude/autoimprove/worktrees

# 3. Add it to .gitignore if not already there
grep -q ".claude/autoimprove/worktrees" .gitignore 2>/dev/null || echo ".claude/autoimprove/worktrees" >> .gitignore

# 4. Record the base commit so all experiments branch from the same point
BASE_COMMIT=$(git rev-parse HEAD)
echo "Base commit: $BASE_COMMIT"
```

---

## Create a new experiment worktree

Run at the start of each iteration:

```bash
EXPERIMENT_ID=$(printf "%03d" $ITERATION_NUMBER)
BRANCH="autoimprove/experiment-$EXPERIMENT_ID"
WORKTREE_PATH=".claude/autoimprove/worktrees/experiment-$EXPERIMENT_ID"

# Create a new branch and worktree from current HEAD
git worktree add -b "$BRANCH" "$WORKTREE_PATH"

echo "Created worktree: $WORKTREE_PATH"
echo "Branch: $BRANCH"
```

Now switch all subsequent file edits and commands to run inside `$WORKTREE_PATH`. The main directory is untouched.

---

## Run measurement in a worktree

All measurement commands must be run from inside the worktree path:

```bash
cd .claude/autoimprove/worktrees/experiment-$EXPERIMENT_ID

# Run the measurement suite from .claude/autoimprove/config.md
# (same commands, different working directory)
```

---

## Winning experiment — merge back to main

If AFTER score > BEFORE score:

```bash
BRANCH="autoimprove/experiment-$EXPERIMENT_ID"

# Option A: Squash merge (recommended — keeps main history clean)
git merge --squash "$BRANCH"
git commit -m "autoimprove($EXPERIMENT_ID): $HYPOTHESIS_ONE_LINE

Score: $BEFORE_SCORE → $AFTER_SCORE (+$DELTA pts)
Files: $CHANGED_FILES"

# Remove the worktree and branch
git worktree remove ".claude/autoimprove/worktrees/experiment-$EXPERIMENT_ID"
git branch -D "$BRANCH"

echo "✅ Experiment $EXPERIMENT_ID merged to main"
```

---

## Losing experiment — discard cleanly

If AFTER score <= BEFORE score:

```bash
# Just remove the worktree and delete the branch — main is untouched
git worktree remove ".claude/autoimprove/worktrees/experiment-$EXPERIMENT_ID" --force
git branch -D "autoimprove/experiment-$EXPERIMENT_ID"

echo "❌ Experiment $EXPERIMENT_ID discarded — no changes to main"
```

---

## Cleanup all worktrees (end of session)

Run after the session completes or if something goes wrong:

```bash
# List all autoimprove worktrees
git worktree list | grep autoimprove

# Remove all experiment worktrees
for wt in .claude/autoimprove/worktrees/experiment-*; do
  git worktree remove "$wt" --force 2>/dev/null
done

# Clean up branches
git branch | grep "autoimprove/experiment" | xargs git branch -D 2>/dev/null

# Remove the container directory
rm -rf .claude/autoimprove/worktrees

echo "All experiment worktrees cleaned up"
```

---

## Emergency recovery

If something goes wrong mid-session and worktrees are left dangling:

```bash
# Check for stale worktrees
git worktree prune

# List all worktrees
git worktree list

# Force remove a specific one
git worktree remove .claude/autoimprove/worktrees/experiment-001 --force
git branch -D autoimprove/experiment-001
```

---

## Key guarantees

- **Main branch is never modified** until a winning experiment is explicitly merged
- **Each experiment starts from the same commit** — experiments are independent, not cumulative
- **No leftover branches** — winning experiments become squash commits, losers are deleted entirely
- **Safe to Ctrl+C** — worktrees can be cleaned up manually with the cleanup commands above
- **Parallel-safe** — each experiment has its own directory and branch, so multiple sessions can run without conflict (advanced use)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.