janitor-fix — Claude Code skill: what it does, how to install
Repairs frontmatter issues in skill files and cleans up broken symlinks. Runs as a safe dry run before applying any modifications.
npx skills add khendzel/skills-janitor --skill janitor-fix -a claude-codeWhat janitor-fix does
The skill inspects SKILL.md files across user, project, and codex scopes to fix common formatting defects. It restores missing --- delimiters and inserts a fallback version tag of 1.0.0. Missing descriptions are filled using folder names. Every check starts in dry-run mode, printing [DRY RUN] action lines until approved.
Adding --prune reveals broken symlinks pointing to deleted targets and empty directories without SKILL.md. Files change only under --apply. Every applied change gets recorded with timestamps inside data/changelog.log.
Plugin and marketplace skills are skipped entirely because local edits would get overwritten on the next update. Running the tool requires bash 3.2+ and write permissions to skill directories like ~/.claude/skills.
What it helps with
- restore missing
---delimiters in frontmatter headers - populate blank description fields using folder names
- delete broken symlinks pointing to deleted targets
- prune empty skill folders lacking
SKILL.md
Example prompts for the agent
- /janitor-fix
- /janitor-fix --prune
- Clean up broken skill directories with /janitor-fix --prune --apply
How to install janitor-fix
1Skills CLI (Vercel)
npx skills add khendzel/skills-janitor --skill janitor-fix -a claude-code2Manually: put the files in place
~/.claude/skills/janitor-fix/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/janitor-fix/
1Skills CLI (Vercel)
npx skills add khendzel/skills-janitor --skill janitor-fix -a codex2Manually: put the files in place
.agents/skills/janitor-fix/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add khendzel/skills-janitor --skill janitor-fix -a cursor2Manually: put the files in place
.cursor/skills/janitor-fix/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install khendzel/skills-janitor janitor-fix2Manually: put the files in place
.github/skills/janitor-fix/SKILL.md1Skills CLI (Vercel)
npx skills add khendzel/skills-janitor --skill janitor-fix -a gemini-cli2Platform CLI
gemini skills install https://github.com/khendzel/skills-janitor --path skills/janitor-fixManually: put the files in place
.devin/skills/janitor-fix/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add khendzel/skills-janitor --skill janitor-fix -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about janitor-fix
How to install janitor-fix in Claude Code?
Run npx skills add khendzel/skills-janitor --skill janitor-fix -a claude-code. The skill will be installed at ~/.claude/skills/janitor-fix/SKILL.md.
What does janitor-fix do?
It audits local skill directories, repairs metadata headers, and sets default version numbers. With the --prune flag, it also cleans out dead symlinks and empty folders.
Why are plugin skills skipped during fixes?
Skills installed from plugins or marketplaces update upstream. Any local modifications to them would be overwritten during an update, so the tool flags them with [SKIP].
Source text
SKILL.md · MIT
--- name: janitor-fix description: "Automatically fix skill problems (safe preview first). Also use with --prune to find and remove broken symlinks, empty directories, and orphaned skills. Trigger with '/janitor-fix'." allowed-tools: Read, Bash(bash:*) argument-hint: "[--apply] [--prune]" version: 1.5.1 author: Krzysztof Hendzel <[email protected]> license: MIT compatibility: Designed for Claude Code. Requires bash 3.2+ (macOS default works). Modifies only user/project/codex-scope skill files, never plugin content. tags: - skills - auto-fix - cleanup - symlinks - maintenance --- # Auto-Fix Automatically fix common skill issues. Dry-run by default — shows what would change without modifying files. ## Overview Repairs frontmatter problems (missing delimiters, empty descriptions, missing version fields) across user, project, and codex-scope skills, and — in `--prune` mode — removes broken symlinks and empty skill directories. Plugin/marketplace skills are never modified (changes would be overwritten on update). ## Prerequisites - Claude Code with the skills-janitor plugin installed (provides `scripts/fix.sh`) - bash 3.2+ (the stock macOS bash works; no external dependencies) - Write access to the user's own skill directories (`~/.claude/skills`, `./.claude/skills`, `~/.agents/skills`) ## Instructions ### Step 1: Preview first (always) ```bash bash ~/.claude/skills/skills-janitor/scripts/fix.sh # preview fixes bash ~/.claude/skills/skills-janitor/scripts/fix.sh --prune # preview broken/orphaned removals ``` ### Step 2: Show the user the preview and confirm Never jump straight to `--apply`. Present the `[DRY RUN]` lines and ask before writing. ### Step 3: Apply ```bash bash ~/.claude/skills/skills-janitor/scripts/fix.sh --apply # apply fixes bash ~/.claude/skills/skills-janitor/scripts/fix.sh --prune --apply # remove broken skills ``` What it fixes: - Adds missing frontmatter delimiters (`---`) - Fills empty `description` fields with a template - Adds missing `version` field (defaults to "1.0.0") - Generates template descriptions using the skill folder name Prune mode finds and removes: - **Broken symlinks** — skill folder points to deleted source - **Empty directories** — skill folder with no SKILL.md - **Orphaned skills** — user-scope copies of plugin skills Safety model: dry-run by default (must pass `--apply` to write), skips plugin/marketplace skills, logs ALL changes with timestamps to `data/changelog.log`, always asks for confirmation before removing. ## Output Per-skill action lines (`[DRY RUN]` / `[FIXED]` / `[PRUNED]` / `[SKIP]`) followed by a summary of fixable issues, skipped items, and prunable entries. In dry-run mode the summary ends with "Run with --apply to make these changes." ## Error Handling 1. **Error**: A fix produced an unexpected result in a SKILL.md **Solution**: Every applied change is logged in `data/changelog.log` with a timestamp — show the log entry and restore the affected field manually; template descriptions are meant to be replaced by the author. 2. **Error**: `[SKIP] Plugin/marketplace skill - don't modify` **Solution**: Expected behavior, not an error. Plugin content is fixed upstream — suggest the user report the issue to the plugin author instead. 3. **Error**: Prune lists a skill the user wants to keep **Solution**: Do not run `--apply`. A "broken symlink" that should be kept means its target moved — recreate the link (`ln -sfn <new-target> <link>`) instead of pruning. ## Examples ### Example 1: Safe fix cycle **Input**: "Fix my skills." **Output**: Run the dry-run, present the `[DRY RUN]` list ("3 fixable: 2 missing descriptions, 1 missing version"), ask for confirmation, then run `--apply` and report the `[FIXED]` lines. ### Example 2: Cleanup of broken leftovers **Input**: "Remove broken skills." **Output**: Run `--prune` (dry-run), show what would be removed and why (broken symlink targets, empty dirs), confirm, then `--prune --apply` and report the `[PRUNED]` lines. ## Resources - Fix script (plugin-relative): `{baseDir}/../../scripts/fix.sh` - Change log of applied fixes: `data/changelog.log` in the plugin directory - For finding issues: `/janitor-report` - For usage + token cost: `/janitor-value`
© Krzysztof Hendzel · MIT · khendzel/skills-janitor