Hook Development for Claude Code Plugins
anthropics/claude-plugins-official
Explains how to write Claude Code plugin hooks, both prompt-based checks and bash commands, for events such as PreToolUse, Stop and SessionStart.
Tinder for your Claude Code skills. An agent skill from khendzel/skills-janitor.
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install khendzel/skills-janitor janitor-swipe --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/janitor-swipe .claude/skills/janitor-swipe && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .claude/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install khendzel/skills-janitor janitor-swipe --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/janitor-swipe .agents/skills/janitor-swipe && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .agents/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install khendzel/skills-janitor janitor-swipe --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/janitor-swipe .cursor/skills/janitor-swipe && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .cursor/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/khendzel/skills-janitor.git --path skills/janitor-swipe--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install khendzel/skills-janitor janitor-swipe --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/janitor-swipe .gemini/skills/janitor-swipe && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .gemini/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install khendzel/skills-janitor janitor-swipeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/janitor-swipe .github/skills/janitor-swipe && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .github/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add khendzel/skills-janitor --skill janitor-swipe -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install khendzel/skills-janitor janitor-swipe --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/khendzel/skills-janitor.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/janitor-swipe .opencode/skills/janitor-swipe && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "janitor-swipe" agent skill from https://github.com/khendzel/skills-janitor/tree/main/skills/janitor-swipe into .opencode/skills/janitor-swipe/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "janitor-swipe", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
janitor-swipeTinder for your Claude Code skills. An agent skill from khendzel/skills-janitor.
Janitor Swipe is an agent skill from khendzel/skills-janitor. Tinder for your Claude Code skills. Reviews a sorted deck of every installed skill and lets you swipe keep / delete / skip on each one. Use when the user wants to bulk-clean their skill collection, triage unused skills, or do interactive skill cleanup. Trigger with '/janitor-swipe'.
Its SKILL.md is about 1.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Designed for Claude Code. The TUI itself requires an interactive terminal (the user runs it with the '!' prefix); requires bash 3.2+ and a terminal of at…
It works with Bash. The repository describes itself as: Tinder for your Claude Code skills, subagents and MCP servers. Swipe away what wastes context, scan for prompt injection, get honest token costs. Fixes what it finds and actually… The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4b42f39. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBash(bash:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designed for Claude Code. The TUI itself requires an interactive terminal (the user runs it with the '!' prefix); requires bash 3.2+ and a terminal of at least 50x22.
From compatibility in the SKILL.md frontmatter.
Janitor Swipe loads about 1.5k tokens when it runs. Until then it costs about 74 tokens; SKILL.md has 694 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from khendzel/skills-janitor at commit 4b42f39, republished under its MIT licence (© khendzel). 694 words, ~1,482 tokens.
.claude/skills/janitor-swipe/SKILL.md (or your agent's skills folder).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. The swipe is scope-aware and honest about what it can delete: user-scope skills are actually removed (after confirmation), plugin skills are flagged for review instead.
scripts/swipe.sh and swipe-build-deck.sh)!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.shWhen 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".
Each card shows:
[3 / 47])X always · Y on trigger (description tokens are permanent; body loads only when the skill fires)user, project, plugin · <plugin-name>, etc.)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 | 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 |
mcp-user, mcp-project (v1.7) | Server entry is removed from its config file (~/.claude.json / .mcp.json) with a timestamped .bak backup — reversible |
mcp-plugin | NOT edited — flagged for plugin review like plugin skills |
MCP server cards show real call counts from session transcripts instead of token guesses (schemas live server-side). An unused connected server ranks high — its tool schemas load into context for nothing.
After the last card (or q), an apply screen shows keep/skip/delete counts, the deletion list with paths, the "frees X always-loaded + Y on-trigger" token summary, the plugin review breakdown, and a prompt:
y — apply deletions immediately (logged to ~/.skills-janitor/log.jsonl with path and frontmatter snapshot)N — cancelsave — write decisions to ~/.skills-janitor/swipe-<timestamp>.json for later application via swipe.sh --apply <file>Error: "Swipe needs an interactive terminal"
Solution: The command was run through the Bash tool. Have the user run it with the ! prefix in their own terminal.
Error: "Swipe needs at least 50 columns / 22 rows" Solution: The terminal window is too small — resize and retry.
Error: No skills to swipe
Solution: Nothing is installed (exits 0 with a message) — suggest /janitor-discover to find skills.
Error: The user wants a non-interactive view instead
Solution: Point them at /janitor-report or /janitor-value for the same data in list form.
Edge cases handled by the script: Ctrl-C mid-swipe restores the terminal; symlinks are unlinked, never followed; old saved decks without the v1.5 token-split fields still load.
Input: "/janitor-swipe" or "help me clean up my skills interactively"
Output: Explain the flow in two sentences, then give the exact command to run: !bash ~/.claude/skills/skills-janitor/scripts/swipe.sh — and offer to review the results afterwards.
Input: "I saved my swipe decisions yesterday — apply them."
Output: !bash ~/.claude/skills/skills-janitor/scripts/swipe.sh --apply ~/.skills-janitor/swipe-<timestamp>.json (list the files in ~/.skills-janitor/ to find the right one).
{baseDir}/../../scripts/swipe.sh; deck builder: {baseDir}/../../scripts/swipe-build-deck.sh~/.skills-janitor/log.jsonl/janitor-report — same data as a non-interactive list/janitor-value — the token + usage data underneath the swipe deck/janitor-fix --prune — automated broken-symlink cleanup, no interactive review© khendzel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/janitor-swipe of khendzel/skills-janitor.
Open the folder on GitHubat commit 4b42f39
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in khendzel/skills-janitor, which our catalogue first saw on October 7, 2026.
Janitor Swipe next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Janitor Swipe this skillkhendzel/skills-janitor | 123 | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Hook Development for Claude Code Pluginsanthropics/claude-plugins-official | 38k | 10 repos | ~4.1k | Automated safety check: Notes | Apache-2.0 | |
| Plugin Settings Patternanthropics/claude-plugins-official | 38k | 7 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Mole Bug Patternstw93/Mole | 70k | — | ~2k | Automated safety check: Pass | GPL-3.0 | |
| Neat-Freak Knowledge CloseoutKKKKhazix/khazix-skills | 21k | — | ~1.9k | Automated safety check: Pass | MIT | |
| E2Ecallstack/react-native-pager-view | 3.4k | 1 repos | ~2.1k | Automated safety check: Pass | MIT |
anthropics/claude-plugins-official
Explains how to write Claude Code plugin hooks, both prompt-based checks and bash commands, for events such as PreToolUse, Stop and SessionStart.
anthropics/claude-plugins-official
Shows how Claude Code plugins keep per-project settings and state in .claude/plugin-name.local.md files with YAML frontmatter and a markdown body.
tw93/Mole
A catalog of recurring bug shapes in the Mole Mac cleaner, used to review safety-sensitive diffs for deletion safety, unbounded commands, shell traps and weak tests.
KKKKhazix/khazix-skills
Brings project docs, agent rule files, authorized memory and leftover workspace files back in line with what the code and runtime actually do at the end of a work session.
callstack/react-native-pager-view
Agentic end-to-end tests with e2e, the e2e runner. An agent skill from callstack/react-native-pager-view.
automazeio/ccpm
Runs a spec-driven workflow from PRD to epic to GitHub issues to parallel agents, with status, standup and blocked-work reports from bundled scripts.
khendzel/skills-janitor
Automatically fix skill problems (safe preview first). An agent skill from khendzel/skills-janitor.
khendzel/skills-janitor
Full health check of all your skills in one report. An agent skill from khendzel/skills-janitor.
khendzel/skills-janitor
Show whether each skill is earning its context-window cost — combined tokens-used view sorted by waste.
khendzel/skills-janitor
Find new skills on GitHub or check a specific skill before installing.
Works with
Tinder for your Claude Code skills. An agent skill from khendzel/skills-janitor. Janitor Swipe is an agent skill from khendzel/skills-janitor. Tinder for your Claude Code skills.
Janitor Swipe fits situations like: the user wants to bulk-clean their skill collection; triage unused skills; do interactive skill cleanup; with /janitor-swipe.
Run `npx skills add khendzel/skills-janitor --skill janitor-swipe -a claude-code`. Or copy the skill folder (skills/janitor-swipe in khendzel/skills-janitor) into .claude/skills/janitor-swipe in your project. Claude Code loads it when a task matches its description.
Run `npx skills add khendzel/skills-janitor --skill janitor-swipe -a codex`. Or copy the skill folder (skills/janitor-swipe in khendzel/skills-janitor) into .agents/skills/janitor-swipe in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add khendzel/skills-janitor --skill janitor-swipe -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/janitor-swipe, .gemini/skills/janitor-swipe, .github/skills/janitor-swipe and .opencode/skills/janitor-swipe in your project.
Going by SKILL.md and its folder, Janitor Swipe needs the command-line tools its instructions call (bash). Its frontmatter pre-approves these tools: Read, Bash(bash:*). Compatibility (from SKILL.md): Designed for Claude Code. The TUI itself requires an interactive terminal (the user runs it with the '!' prefix); requires bash 3.2+ and a terminal of at least 50x22..
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Janitor Swipe is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.5k tokens (SKILL.md is roughly 5.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Janitor Swipe: Hook Development for Claude Code Plugins (anthropics/claude-plugins-official, 38k stars), Plugin Settings Pattern (anthropics/claude-plugins-official, 38k stars), Mole Bug Patterns (tw93/Mole, 70k stars) and Neat-Freak Knowledge Closeout (KKKKhazix/khazix-skills, 21k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
khendzel (a GitHub user) maintains it in khendzel/skills-janitor, which has 123 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on September 30, 2026.
Source: khendzel/skills-janitor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.