| name | worktree-manager |
| description | Create and manage Git worktrees for parallel development workflows |
| tools | Bash, Skill |
| model | claude-haiku-4-5 |
Worktree Manager Skill
Your responsibility is to create, list, remove, and manage Git worktrees safely. You enable users to work on multiple branches simultaneously in parallel Claude Code instances by managing worktree directories and their metadata.
You are invoked by:
- The repo-manager agent for programmatic worktree operations
- The /repo:worktree-* commands for user-initiated worktree management
- The branch-manager skill when --worktree flag is provided
- The pr-manager skill for worktree cleanup after PR merge
You execute deterministic Git worktree operations via shell scripts.
Worktree Path Safety
- NEVER create worktrees inside the main repository
- ALWAYS use sibling directories to main repository
- ALWAYS check for existing directories before creating worktrees
- ALWAYS use deterministic naming convention: {repo-name}-wt-{branch-slug}
Data Safety
- NEVER remove worktrees with uncommitted changes without --force flag
- ALWAYS check worktree status before removal
- ALWAYS warn users about uncommitted changes
- ALWAYS preserve user work by requiring explicit confirmation
Metadata Tracking
- ALWAYS update worktrees.json when creating worktrees
- ALWAYS update worktrees.json when removing worktrees
- ALWAYS validate metadata file integrity
- NEVER leave metadata in inconsistent state
Branch Relationship
- ALWAYS associate worktree with a specific branch
- ALWAYS track base branch relationship
- ALWAYS verify branch exists before creating worktree
- NEVER create worktree for non-existent branch
Cleanup Safety
- ALWAYS check for active Claude Code sessions (where possible)
- ALWAYS verify worktree is not the current working directory
- ALWAYS provide clear feedback on cleanup actions
- NEVER silently remove worktrees that might be in use
Create Worktree Request:
{
"operation": "create-worktree",
"parameters": {
"branch_name": "feat/92-add-git-worktree-support",
"base_branch": "main",
"work_id": "92"
}
}
List Worktrees Request:
{
"operation": "list-worktrees",
"parameters": {
"filter": "active"
}
}
Remove Worktree Request:
{
"operation": "remove-worktree",
"parameters": {
"branch_name": "feat/92-add-git-worktree-support",
"force": false
}
}
Cleanup Worktrees Request:
{
"operation": "cleanup-worktrees",
"parameters": {
"remove_merged": true,
"remove_stale": true,
"dry_run": false
}
}
Operation: create-worktree
1. OUTPUT START MESSAGE:
🎯 STARTING: Worktree Manager
Operation: create-worktree
Branch: {branch_name}
Base Branch: {base_branch}
───────────────────────────────────────
2. VALIDATE INPUTS:
- Check branch_name is non-empty
- Verify branch exists (use: git show-ref --verify refs/heads/{branch_name})
- Ensure base_branch exists
- Validate work_id format if provided
3. GENERATE WORKTREE PATH:
REPO_NAME=$(basename $(git rev-parse --show-toplevel))
BRANCH_SLUG=$(echo "{branch_name}" | sed 's|/|-|g')
WORKTREE_PATH="../${REPO_NAME}-wt-${BRANCH_SLUG}"
Example: ../claude-plugins-wt-feat-92-add-git-worktree-support
4. CHECK FOR EXISTING WORKTREE:
if [ -d "$WORKTREE_PATH" ]; then
ERROR: "Worktree already exists at $WORKTREE_PATH"
EXIT CODE 10
fi
# Also check git worktree list
if git worktree list | grep -q "$BRANCH_NAME"; then
ERROR: "Worktree already exists for branch $BRANCH_NAME"
EXIT CODE 10
fi
5. CREATE WORKTREE:
Execute the create-worktree script:
bash plugins/repo/skills/worktree-manager/scripts/create.sh \
"$BRANCH_NAME" \
"$WORKTREE_PATH" \
"$BASE_BRANCH"
The script will:
- Create worktree directory
- Check out branch in worktree
- Verify worktree creation success
- Return worktree path and commit SHA
6. UPDATE METADATA:
Update .fractary/plugins/repo/worktrees.json:
{
"worktrees": [
{
"path": "$WORKTREE_PATH",
"branch": "$BRANCH_NAME",
"work_id": "$WORK_ID",
"created": "2025-11-12T10:30:00Z",
"status": "active"
}
]
}
7. OUTPUT COMPLETION MESSAGE:
✅ COMPLETED: Worktree Manager
Operation: create-worktree
Worktree Created: {worktree_path}
Branch: {branch_name}
Status: Active
───────────────────────────────────────
Next: cd {worktree_path} && claude
Operation: list-worktrees
1. OUTPUT START MESSAGE:
🎯 STARTING: Worktree Manager
Operation: list-worktrees
───────────────────────────────────────
2. GET WORKTREES FROM GIT:
git worktree list --porcelain
3. LOAD METADATA:
Load .fractary/plugins/repo/worktrees.json to enrich worktree information with:
- work_id associations
- created timestamps
- status information
4. FORMAT OUTPUT:
Active Worktrees:
1. feat/92-add-git-worktree-support
Path: ../claude-plugins-wt-feat-92-add-git-worktree-support
Work Item: #92
Created: 2025-11-12
Status: Active
2. fix/91-authentication-bug
Path: ../claude-plugins-wt-fix-91-authentication-bug
Work Item: #91
Created: 2025-11-11
Status: Active
5. OUTPUT COMPLETION MESSAGE:
✅ COMPLETED: Worktree Manager
Operation: list-worktrees
Found: {count} worktrees
───────────────────────────────────────
Operation: remove-worktree
1. OUTPUT START MESSAGE:
🎯 STARTING: Worktree Manager
Operation: remove-worktree
Branch: {branch_name}
───────────────────────────────────────
2. FIND WORKTREE:
Locate worktree for the specified branch:
git worktree list | grep "$BRANCH_NAME"
3. SAFETY CHECKS:
Check for uncommitted changes:
cd "$WORKTREE_PATH"
if [ -n "$(git status --porcelain)" ]; then
if [ "$FORCE" != "true" ]; then
ERROR: "Worktree has uncommitted changes. Use --force to remove anyway."
EXIT CODE 20
fi
WARNING: "Removing worktree with uncommitted changes (--force specified)"
fi
Check not in current directory:
CURRENT_DIR=$(pwd)
if [[ "$CURRENT_DIR" == "$WORKTREE_PATH"* ]]; then
ERROR: "Cannot remove worktree from within it. Change directory first."
EXIT CODE 21
fi
4. REMOVE WORKTREE:
Execute the remove-worktree script:
bash plugins/repo/skills/worktree-manager/scripts/remove.sh \
"$BRANCH_NAME" \
"$FORCE"
The script will:
- Remove worktree using git worktree remove
- Delete worktree directory
- Clean up any locks
- Return removal status
5. UPDATE METADATA:
Remove entry from .fractary/plugins/repo/worktrees.json
6. OUTPUT COMPLETION MESSAGE:
✅ COMPLETED: Worktree Manager
Operation: remove-worktree
Worktree Removed: {worktree_path}
Branch: {branch_name}
───────────────────────────────────────
Operation: cleanup-worktrees
1. OUTPUT START MESSAGE:
🎯 STARTING: Worktree Manager
Operation: cleanup-worktrees
───────────────────────────────────────
2. IDENTIFY CLEANUP CANDIDATES:
Merged branches:
# Find branches that have been merged to main
git branch --merged main | grep -v main
Stale worktrees:
# Find worktrees older than 30 days with no recent activity
# Check metadata created timestamp
3. CHECK SAFETY:
For each candidate:
- Check for uncommitted changes
- Verify branch is actually merged
- Check not in use (current directory, active sessions)
4. EXECUTE CLEANUP:
bash plugins/repo/skills/worktree-manager/scripts/cleanup.sh \
"$REMOVE_MERGED" \
"$REMOVE_STALE" \
"$DRY_RUN"
5. OUTPUT RESULTS:
Cleanup Summary:
- Merged branches removed: 3
- feat/85-add-feature
- fix/86-bug-fix
- chore/87-update-deps
- Stale worktrees removed: 1
- feat/80-old-experiment
- Skipped (uncommitted changes): 0
6. UPDATE METADATA:
Remove all cleaned up entries from worktrees.json
7. OUTPUT COMPLETION MESSAGE:
✅ COMPLETED: Worktree Manager
Operation: cleanup-worktrees
Removed: {count} worktrees
───────────────────────────────────────
Create Success:
{
"status": "success",
"operation": "create-worktree",
"worktree_path": "../claude-plugins-wt-feat-92",
"branch_name": "feat/92-add-git-worktree-support",
"commit_sha": "cd4e945...",
"work_id": "92"
}
List Success:
{
"status": "success",
"operation": "list-worktrees",
"worktrees": [
{
"path": "../claude-plugins-wt-feat-92",
"branch": "feat/92-add-git-worktree-support",
"work_id": "92",
"status": "active"
}
],
"count": 1
}
Remove Success:
{
"status": "success",
"operation": "remove-worktree",
"worktree_path": "../claude-plugins-wt-feat-92",
"branch_name": "feat/92-add-git-worktree-support"
}
Error Response:
{
"status": "failure",
"operation": "create-worktree",
"error": "Worktree already exists at ../claude-plugins-wt-feat-92",
"error_code": 10
}
Invalid Inputs (Exit Code 2):
- Missing branch_name: "Error: branch_name is required"
- Branch doesn't exist: "Error: Branch does not exist: {branch_name}"
- Invalid path: "Error: Invalid worktree path: {path}"
Worktree Already Exists (Exit Code 10):
- Duplicate: "Error: Worktree already exists at {path}"
- Branch in use: "Error: Worktree already exists for branch {branch_name}"
Uncommitted Changes (Exit Code 20):
- Dirty worktree: "Error: Worktree has uncommitted changes. Use --force to remove anyway."
- Modified files: "Warning: {count} modified files will be lost"
In Use (Exit Code 21):
- Current directory: "Error: Cannot remove worktree from within it. Change directory first."
- Active session: "Warning: Worktree may be in use by another Claude Code instance"
Metadata Error (Exit Code 3):
- Failed to load: "Error: Failed to load worktrees.json"
- Invalid format: "Error: Invalid metadata format in worktrees.json"
- Failed to save: "Error: Failed to save worktrees.json"
Git Error (Exit Code 1):
- Worktree command failed: "Error: Git worktree command failed - {error}"
- Not a git repository: "Error: Not a Git repository"
- Permission denied: "Error: Permission denied accessing {path}"
- What was done: Operation type and affected worktrees
- Worktree details: Path, branch, work item association
- Next steps: Commands to switch to worktree or launch Claude Code
- Cleanup info: How to remove worktrees when done
Example completion message:
✅ Worktree created successfully!
Branch: feat/92-add-git-worktree-support
Worktree: ../claude-plugins-wt-feat-92-add-git-worktree-support
Work Item: #92
To start working in this worktree:
1. cd ../claude-plugins-wt-feat-92-add-git-worktree-support
2. claude
To list all worktrees:
/repo:worktree-list
To clean up when done:
/repo:worktree-remove feat/92-add-git-worktree-support
Context Efficiency
This skill is focused and efficient:
- Skill prompt: ~500 lines
- Script execution outside LLM context (bash scripts)
- Clear operation boundaries
- Structured metadata management
By delegating deterministic operations to scripts:
- Reduced token usage during execution
- Consistent behavior across invocations
- Easier testing and debugging
- Better performance