Clean
A personal Claude Code skills library built around one deliberate, gated workflow: /spec → /plan → /build → /test → /review → /ship
npx -y skills add bingelp/skills --skill cleanAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Deletes completed features' spec artifacts from the shared git dir after confirmation, leaving in-flight work untouched. Only runs when the user explicitly types /clean.
SKILL.md
5.2 KB, as published. Nobody here has run it
Clean
Overview
Housekeeping for the pipeline. Over time <git-common-dir>/specs/ accumulates a folder per
feature, and finished ones just sit there. /clean finds the features that are done,
lists them, and — only after you confirm — removes their specs/<slug>/ folders. It never
touches work that's still in flight, and it never deletes without showing you the list first.
This is the one pipeline skill that deletes. Deletion is irreversible (the artifacts are the
hand-off record and live inside .git, so there's no commit to revert), so the whole design
is "propose, confirm, then delete" — never "delete, then report."
When to Use
Explicit invocation only (/clean). Typical trigger: after shipping one or more features, when
/where's roll-up is cluttered with completed work you no longer need to track. If you want to
see status without removing anything, use /where — /clean is the destructive counterpart.
Where artifacts live
Every specs/<slug>/… path below resolves under the repo's shared git dir, not the working tree:
SPECS="$(git rev-parse --path-format=absolute --git-common-dir)/specs" # e.g. …/.git/specs
Storing artifacts there keeps them visible across every session and worktree — including the background-isolated steps Claude Code may switch into automatically — while making them impossible to accidentally commit. Outside a git repo, fall back to ./specs.
Process
-
Locate features. Resolve
SPECS(above) and listspecs/*/directories.- No
specs/dir, or it's empty → report "Nothing to clean — no features on disk." and stop.
- No
-
Derive each feature's state the same way
/wheredoes — read the artifacts, never guess from the conversation. A feature is a deletion candidate only when it is complete:review.mdexists, and- its per-
AC<n>verdicts are all met (no "not met" / unresolved "partially met").
Everything else is in-flight and off-limits: anything with no
review.md, a review with unmet criteria, or an inconsistent/interrupted state (e.g.plan.mdwith notasks.md). -
Check for drift before calling anything complete. A green
review.mdcan be stale — ifspec.mdgrew or an AC was reworded after/test//reviewran, the feature only looks done (seewhere/RECONCILE.mdfor the signals). A drifted feature is not a clean deletion candidate: list it separately under a ⚠ and exclude it from the default selection, so a spec that quietly changed after review doesn't get swept away as "finished." -
Present the candidates and confirm. Show two groups and stop for the user's choice:
Complete — safe to delete: dark-mode review ✓ (5/5 ACs met) csv-export review ✓ (3/3 ACs met) ⚠ Complete but drifted (excluded by default — reconcile first): export-v2 review ✓ but spec.md has AC6 with no verification entry In flight — will NOT be touched: onboarding build 3/7Ask which to delete. Default proposal: the "safe to delete" group only. Never preselect an in-flight or drifted feature; the user can override explicitly, but you must not.
-
Confirm shipped, when it matters. Deletion is irreversible and
review ✓is not proof the work is merged. If you can cheaply tell a feature isn't shipped (no merged branch/PR for the slug), say so — the user may still want the artifacts as a reference. Let them decide; don't block, but don't hide it either. -
Delete only what was confirmed. For each chosen slug, remove its
specs/<slug>/folder (e.g.rm -rf "$SPECS/<slug>"). These live inside.gitand aren't tracked, so there's no commit and no.gitignoreto update — the removal is complete once the folder is gone.- Guard the path: only ever delete a
<slug>subdirectory inside the resolvedSPECSdir. NeverrmSPECSitself, a parent, or anything outside it.
- Guard the path: only ever delete a
-
Report. State exactly which folders were deleted and what remains in flight, so the next
/wherematches expectations. If nothing was confirmed, say so and delete nothing.
Red Flags
- Deleting anything before showing the list and getting an explicit go-ahead —
/cleanis propose-confirm-delete, never delete-then-report. - Treating a feature as complete from memory of the conversation instead of reading
review.mdand itsAC<n>verdicts — the files are the source of truth. - Sweeping up a drifted feature (green review but a changed/reworded spec) as "finished" — it looks done and isn't; exclude it by default and point at reconciliation.
- Deleting in-flight or inconsistent work because the folder was "in the way" — if it's not provably complete, it's off-limits.
rm-ing anything other than a confirmed<slug>folder inside the resolvedSPECSdir — no parents, no globs that could escape, noSPECSroot.- Assuming
review ✓means shipped and merged — flag unshipped features so the user doesn't lose an artifact they still wanted.