Janitor Swipe — interactive skill triage
A bash TUI that puts every installed skill into a sorted deck and lets the user swipe keep / delete / skip on each card. The deck is sorted "most likely waste first" — heavy, never-used skills appear at the top, so most users hit ← delete a few times and quit before reviewing the whole list.
How to Run
Important: the swipe TUI needs an interactive terminal. Inside Claude Code, the Bash tool's stdin is non-interactive, so the keypress reader can't work. The user must invoke it via the ! prefix so the command runs in their actual shell:
!bash ~/.claude/skills/skills-janitor/scripts/swipe.sh
When the user asks for /janitor-swipe, tell them to run that command in their terminal. Do NOT try to run it yourself via the Bash tool — it will error with "needs an interactive terminal".
What the User Sees
Each card shows:
- Skill name + position in deck (e.g.
[3 / 47]) - Token cost (raw + % of context budget)
- Usage count and last invoked date
- Scope (
user,project,plugin · <plugin-name>, etc.) - 3-line truncated description
- Verdict label (e.g. "Heavy + unused — likely dead weight")
Controls:
←/h/d— stage for delete→/l/k— keep↓/j/s/ space — skipu— undo (back up one card, clear its decision)i— inspect (show full SKILL.md description)q/ Esc — quit (still shows summary for decisions made so far)
Scope-Aware Behavior
This is the critical correctness point — the swipe doesn't lie about what it can delete:
| Scope | What happens on swipe left |
|---|---|
user, project, codex-user, codex-project |
Path is staged for rm -rf (or unlink if symlink) |
plugin, plugin-source |
NOT deleted — flagged under "Plugins to review" at the apply screen, with a hint to run /plugin uninstall <plugin> if enough skills from that plugin were swiped |
Apply Screen
After the last card (or q), the user sees a summary and is prompted:
y— apply deletions immediatelyN— cancelsave— write decisions to~/.skills-janitor/swipe-<timestamp>.jsonfor later application viaswipe.sh --apply <file>
Every deletion is logged to ~/.skills-janitor/log.jsonl with the path and frontmatter snapshot.
Edge Cases
- No skills installed → exits 0 with a message
- Terminal < 50 cols or < 22 rows → exits 1 with a message
- No TTY → exits 1 with a message pointing the user at
/janitor-reportor/janitor-valuefor list-form output - Symlinks →
rmthe link itself, never follow to the target
Related Skills
/janitor-report— same data as a non-interactive list/janitor-value— combined token + usage view (the data underneath the swipe deck)/janitor-fix --prune— automated broken-symlink cleanup, no interactive review