| name | forking-worktree |
| description | Use when user wants to create new autonomy branch with dedicated worktree for parallel agent workflows |
Forking Worktree
Overview
Create new autonomy branch with dedicated worktree for running parallel Claude agents on different branches simultaneously. All worktrees created at repository root level (.worktrees/autonomy/), regardless of where command is invoked.
Core principle: Worktrees represent branches, not iterations. Multiple iterations happen within same worktree. Worktrees enable parallel exploration with isolated working directories.
When to Use
Use this skill when:
- User runs
/fork-worktreecommand - User wants to run multiple agents in parallel on different autonomy branches
- User wants isolated working directory for new exploration branch
- User wants to create autonomy branch without disturbing current working directory
DO NOT use for:
- Creating branches without worktrees (use forking-iteration instead)
- Creating non-autonomy branches (use git directly)
- Starting iterations (use starting-an-iteration instead)
Quick Reference
| Step | Action | Tool |
|---|---|---|
| 1. Parse arguments | Extract iteration (optional) and strategy-name | Manual |
| 2. Detect repository root | Find git root from anywhere (main repo or worktree) | Bash |
| 3. Validate | Check strategy-name, branch, and worktree path availability | Bash |
| 4. Resolve fork point | Find iteration tag or use HEAD | Bash |
| 5. Create worktree | Create branch + worktree at root level | Bash |
| 6. Report success | Confirm creation with navigation instructions | Direct output |
Process
Step 1: Parse and Validate Arguments
Extract arguments from command args:
Format: [iteration] <strategy-name>
Parse:
If args contains only one word:
iteration = None
strategy_name = args
Else if args contains two words:
iteration = first word
strategy_name = second word
Else:
Error: "Invalid arguments. Usage: /fork-worktree [iteration] <strategy-name>"
Validate strategy-name:
- Must be kebab-case (lowercase, hyphens, no special chars)
- Must not be empty
- Should be descriptive (warn if too generic like "test" or "new")
Normalize strategy-name:
# Convert to lowercase, replace invalid chars with hyphens
strategy_name=$(echo "$strategy_name" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]-' '-' | sed 's/^-*//; s/-*$//')
Step 2: Detect Repository Root
Find the git repository root, regardless of whether we're in main repo or inside a worktree:
# Get common git directory (works from anywhere, including worktrees)
git_common_dir=$(git rev-parse --git-common-dir)
# Repository root is parent of .git directory
# For main repo: .git is directory -> parent is repo root
# For worktree: .git is file pointing to .git/worktrees/X -> common-dir points back to main .git
if [ -d "$git_common_dir" ]; then
repo_root=$(cd "$git_common_dir/.." && pwd)
else
echo "Error: Unable to determine repository root"
exit 1
fi
Why this matters:
- Ensures all worktrees created at
.worktrees/autonomy/relative to repo root - Prevents nested worktrees (
.worktrees/autonomy/experiment-a/.worktrees/...) - Works whether invoked from main repo or from within another worktree
Step 3: Validate Branch and Worktree Availability
Check that we can create the new branch and worktree:
Check branch doesn't exist:
if git branch -a | grep -q "autonomy/$strategy_name\$"; then
echo "Error: Branch 'autonomy/$strategy_name' already exists."
echo ""
echo "To work on existing branch:"
echo " git checkout autonomy/$strategy_name"
echo ""
echo "To create worktree for existing branch:"
echo " cd $repo_root"
echo " git worktree add .worktrees/autonomy/$strategy_name autonomy/$strategy_name"
echo ""
echo "Available autonomy branches:"
git branch -a | grep autonomy/
exit 1
fi
Check worktree path doesn't exist:
worktree_path="$repo_root/.worktrees/autonomy/$strategy_name"
if [ -e "$worktree_path" ]; then
echo "Error: Worktree directory already exists: $worktree_path"
echo ""
echo "Remove it first:"
echo " /remove-worktree $strategy_name"
echo "Or:"
echo " git worktree remove .worktrees/autonomy/$strategy_name"
exit 1
fi
Create parent directory if needed:
mkdir -p "$repo_root/.worktrees/autonomy"
Step 4: Resolve Fork Point
Determine what commit to fork from (same logic as forking-iteration):
If iteration specified:
# Search for iteration tag in current branch history
matching_tags=$(git tag --merged HEAD | grep "iteration-$(printf '%04d' $iteration)\$")
tag_count=$(echo "$matching_tags" | grep -c '^' || echo "0")
if [ "$tag_count" -eq 0 ]; then
echo "Error: Iteration $iteration not found in current branch history."
echo ""
echo "Most recent iterations in current branch:"
git tag --merged HEAD | grep 'iteration-' | tail -5
exit 1
elif [ "$tag_count" -eq 1 ]; then
fork_point="$matching_tags"
fork_description="iteration $iteration (tag: $matching_tags)"
else
# Multiple matches (shouldn't happen with branch-namespaced tags)
echo "Multiple iteration tags found for iteration $iteration:"
echo "$matching_tags"
echo ""
echo "Please specify which tag to fork from."
exit 1
fi
If iteration NOT specified:
# Fork from current HEAD
fork_point=$(git rev-parse HEAD)
fork_description="current commit ($(git rev-parse --short HEAD))"
Validate fork point exists:
if ! git rev-parse "$fork_point" >/dev/null 2>&1; then
echo "Error: Fork point '$fork_point' not found in git history."
exit 1
fi
Step 5: Create Worktree
Create the branch and worktree in a single git command:
# Navigate to repository root (important for relative path resolution)
cd "$repo_root"
# Create branch + worktree together
# -b creates new branch
# path is relative to repo root: .worktrees/autonomy/<strategy-name>
# fork_point is where to create the branch from
git worktree add -b "autonomy/$strategy_name" \
".worktrees/autonomy/$strategy_name" \
"$fork_point"
# Verify worktree created successfully
if [ ! -d "$worktree_path" ]; then
echo "Error: Failed to create worktree at $worktree_path"
exit 1
fi
# Verify branch exists
if ! git branch -a | grep -q "autonomy/$strategy_name\$"; then
echo "Error: Failed to create branch 'autonomy/$strategy_name'"
exit 1
fi
What this does:
- Creates new branch
autonomy/<strategy-name>at fork point - Creates worktree directory at
.worktrees/autonomy/<strategy-name>/ - Checks out the new branch in the worktree (not in current directory)
- Current directory remains unchanged
Step 6: Report Success
Announce successful worktree creation with navigation instructions:
✓ Worktree created successfully
Branch: autonomy/<strategy-name>
Worktree: .worktrees/autonomy/<strategy-name>/
Forked from: [fork_description]
Next steps:
1. Navigate to worktree:
cd .worktrees/autonomy/<strategy-name>
2. Start iteration:
/start-iteration
The worktree is an isolated working directory where you can work on this branch independently of other branches.
Calculate relative path for convenience:
# If we're already in a worktree, provide sibling navigation
current_dir=$(pwd)
if [[ "$current_dir" == *"/.worktrees/autonomy/"* ]]; then
# In a worktree, provide relative navigation to sibling
echo "From your current location:"
echo " cd ../$strategy_name"
fi
Important Notes
Repository Root Detection
Works from anywhere:
- Main repository working directory
- Inside any worktree (including deeply nested work)
- Detached HEAD state
- Any subdirectory
All worktrees created at same level:
repo-root/
├── .git/
├── .worktrees/
│ └── autonomy/
│ ├── experiment-a/ # Created from main repo
│ ├── experiment-b/ # Created from experiment-a worktree
│ └── experiment-c/ # Created from experiment-b worktree
Branch and Worktree Lifecycle
Branch persists after worktree removal:
- Removing worktree (via
/remove-worktree) deletes directory - Branch
autonomy/<strategy-name>and all commits persist - Can create new worktree for same branch later
- All iteration tags remain in git history
One branch per worktree:
- Git enforces: branch can only be checked out in one worktree at a time
- Attempting to create worktree for already-checked-out branch fails
- This is a feature, not a bug (prevents conflicting changes)
Worktrees Are Optional
Existing workflows unchanged:
/fork-iterationstill creates branches without worktrees- All autonomy skills work in both main repo and worktrees
- Worktrees are enhancement for parallel agent workflows
- Use worktrees when beneficial, ignore when not needed
Isolation and Independence
Each worktree is independent:
- Separate working directory with own file state
- Can have uncommitted changes independent of other worktrees
- Can be at different commits (though shares branch history)
- Perfect for running multiple Claude agents in parallel
Shared git metadata:
- All commits immediately visible across all worktrees
- Tags created in one worktree visible in all worktrees
- Branch operations (create, delete) affect all worktrees
.gitdirectory is shared
Common Mistakes
| Mistake | Reality |
|---|---|
| "Create worktree in current directory" | NO. Always create at repo root .worktrees/autonomy/ regardless of where invoked. |
| "I'll use relative path .worktrees/..." | YES, but must cd to repo_root first. Path is relative to repo root. |
| "Branch exists, I'll create worktree for it" | NO. This skill creates NEW branches. Existing branch = error. |
| "I'll also start the iteration" | NO. Worktree creation is separate. User navigates and runs /start-iteration. |
| "I'll checkout the branch in current directory" | NO. Branch checked out in worktree, current directory unchanged. |
| "Nested worktrees are fine" | NO. All worktrees must be at root level .worktrees/autonomy/. |
| "I'll use git rev-parse --show-toplevel" | NO. That gives worktree root, not repo root. Use --git-common-dir. |
After Creating Worktree
Once worktree is created:
- New directory exists at
.worktrees/autonomy/<strategy-name>/ - Branch
autonomy/<strategy-name>checked out in that directory - Current working directory unchanged (still in main repo or original worktree)
- User must navigate to worktree:
cd .worktrees/autonomy/<strategy-name> - User runs
/start-iterationto begin work - All autonomy skills work normally in worktree
Integration with Parallel Agents
Typical workflow:
# Terminal 1: First agent
/fork-worktree experiment-a
cd .worktrees/autonomy/experiment-a
/start-iteration
# Agent 1 works here
# Terminal 2: Second agent (can run while agent 1 is working)
/fork-worktree experiment-b
cd .worktrees/autonomy/experiment-b
/start-iteration
# Agent 2 works here independently
# Terminal 3: Analysis (from anywhere)
/list-branches
/compare-branches experiment-a experiment-b
Each agent has:
- Isolated working directory
- Independent iteration journals
- Separate uncommitted changes
- Shared git history and tags