v2.4.0
perch wt rm no longer makes you wait on the filesystem. Perch moves an eligible worktree to a hidden sibling on the same volume, confirms Git has dropped the registration, and hands the unlinking to a detached worker. Removing a large worktree returns as soon as the repository decisions are done, instead of after the roughly fifteen seconds it takes to unlink every file.
Reclamation records live in repository-local config, so a later wt command finishes work that was interrupted. Advisory locks keep a worker from reclaiming before deregistration and from traversing a tree another worker already holds. Unlicensed removals and initialized submodules stay behind Git's own guard; explicit --force licenses the fast path.
A named removal now resolves its target first and checks dirtiness only in that worktree, saving 0.10 to 0.46 seconds per unrelated worktree. A forced named removal skips the check entirely, since nothing reads its result. The interactive picker still assesses every worktree so its markers and risk legend stay complete.
Removal also shows a spinner for its full duration — the worktree name for a single selection, the count for a batch. Results and removed-hook output suspend the spinner so stderr stays readable and hook output keeps its order.
What's changed
- Show progress while removing worktrees
- Assess dirtiness only for the selected removal target
- Detach worktree file reclamation
- Bump the version to 2.4.0
Full changelog: v2.3.0...v2.4.0