name: speckit-worktree-clean description: Remove stale or merged worktrees and reclaim disk space compatibility: Requires spec-kit project structure with .specify/ directory metadata: author: github-spec-kit source: worktree:commands/speckit.worktree.clean.md
Clean Worktrees
Remove worktrees for branches that have been merged or are no longer needed. Safely cleans up .worktrees/ directory entries and reclaims disk space.
User Input
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty). The user may specify a branch name to clean (e.g., "005-api-gateway"), "merged" to clean all merged worktrees, or "all" to clean everything.
Prerequisites
- Verify a spec-kit project exists by checking for
.specify/directory - Verify git is available and the project is a git repository
- Verify
.worktrees/directory exists and contains worktrees
Outline
-
Scan worktrees: List all worktrees and classify them:
- Merged: Branch has been merged into main/master — safe to remove
- Orphaned: Branch has been deleted but worktree still exists — safe to remove
- Stale: No commits for 30+ days, not merged — warn before removing
- Active: Recent activity, not merged — refuse to remove unless forced
-
Build cleanup plan: Based on user input, determine what to remove:
User Input Action Specific branch name Remove that worktree only (with confirmation) mergedRemove all merged worktrees staleRemove all stale worktrees (30+ days inactive) allRemove all worktrees except main (with strong warning) No input Remove merged and orphaned only (safest default) -
Present cleanup plan: Show a preview before making any changes:
# Worktree Cleanup Plan | # | Branch | Status | Action | Disk Size | | --- | --------------- | ----------- | ----------------- | --------- | | 1 | 005-api-gateway | ✅ Merged | Remove | ~45 MB | | 2 | 002-old-feature | ❌ Orphaned | Remove | ~32 MB | | 3 | 004-chat-system | 🟡 Idle | Keep (not merged) | ~41 MB | **Will remove**: 2 worktrees (~77 MB) **Will keep**: 1 worktree -
Confirm with user: Ask for explicit confirmation before proceeding. Removing worktrees with uncommitted changes is destructive.
-
Check for uncommitted changes: Before removing each worktree:
- Run
git -C .worktrees/{branch}/ status --porcelainto check for uncommitted work - If uncommitted changes exist, warn the user and skip unless they confirm
- List the uncommitted files so the user knows what would be lost
- Run
-
Execute cleanup: For each worktree to remove:
- Run
git worktree remove .worktrees/{branch-name}to safely remove - If the worktree is locked, run
git worktree unlock .worktrees/{branch-name}first - Remove the entry from
.worktrees/directory - Run
git worktree pruneafter all removals to clean up stale references
- Run
-
Report: Output a summary:
- How many worktrees were removed
- How much disk space was reclaimed (approximate)
- How many worktrees remain
- Any worktrees that were skipped (with reason)
Rules
- Never remove without confirmation — always show the plan first and wait for approval
- Never remove the main working directory — only clean feature worktrees in
.worktrees/ - Warn about uncommitted changes — refuse to remove worktrees with uncommitted work unless user explicitly confirms
- Safe defaults — with no input, only remove merged and orphaned worktrees
- Prune after cleanup — always run
git worktree pruneto clean up stale administrative files - Never delete branches — removing a worktree does not delete the git branch, only the working directory