Skip to main content
skill CX Codex

janitor-report — Claude Code skill for skill health checks

Builds one report across every skill: inventory, quality errors, duplicates and broken links. Run it with /janitor-report.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add khendzel/skills-janitor --skill janitor-report -a claude-code
Open on GitHub

What janitor-report does

The skill walks through every place a skill can live: user, project, codex, plugin and source scopes. Plugin skills show up under their full invocation name, such as marketing-skills:image — the v1.2 report could not see them. The scan JSON also carries subagents from ~/.claude/agents and an update_available flag per plugin, set by comparing the installed commit against the marketplace HEAD.

Three scripts do the work. scan.sh builds the inventory, lint.sh runs quality checks, detect_dupes.sh catches name collisions and description overlap above 30% Jaccard similarity. Quality findings come in levels: critical covers broken symlinks, a missing SKILL.md or missing frontmatter; warnings cover a missing or short description and a missing version; info covers an empty body, no Gotchas section and large files.

Pass --brief to get the inventory alone. You need bash 3.2+, and the stock macOS bash is enough. The scripts read local files only: ~/.claude/skills, ~/.claude/agents and installed plugin metadata. No keys, no authentication. If the plugins array comes back empty while plugins are installed, check ~/.claude/plugins/installed_plugins.json.

What it helps with

  • Catch broken symlinks and skills with no SKILL.md before they break a call
  • Spot a user-scope skill that duplicates a plugin one and drop the extra copy
  • See which plugins have an update against the marketplace
  • Get every skill listed by scope with line counts and frontmatter fields
  • Flag descriptions that are too short and skills with no version

Example prompts for the agent

  • Check my skills for problems
  • /janitor-report --brief
  • Give me a full health report on my skills

How to install janitor-report

1Skills CLI (Vercel)

npx skills add khendzel/skills-janitor --skill janitor-report -a claude-code

2Manually: put the files in place

~/.claude/skills/janitor-report/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/janitor-report/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about janitor-report

How do I install janitor-report in Claude Code?

Run npx skills add khendzel/skills-janitor --skill janitor-report -a claude-code. The skill lands at ~/.claude/skills/janitor-report/SKILL.md.

What does janitor-report do?

It produces a single report over all your skills: inventory, quality checks, duplicates and broken links. With --brief you get the inventory only.

What does janitor-report need to run?

Bash 3.2+ and read access to ~/.claude/skills, ~/.claude/agents and plugin metadata. The scripts read local files, so no keys are involved.

Source text

SKILL.md · MIT
---
name: janitor-report
description: "Full health check of all your skills in one report. Use when the user wants to check for errors, find duplicates, detect broken skills, or get a complete overview of skill health. Pass --brief for inventory only. Trigger with '/janitor-report'."
allowed-tools: Read, Bash(bash:*)
argument-hint: "[--brief]"
version: 1.7.0
author: Krzysztof Hendzel <[email protected]>
license: MIT
compatibility: Designed for Claude Code. Requires bash 3.2+ (macOS default works). Reads local Claude Code data only (~/.claude/skills, ~/.claude/agents, installed plugin metadata).
tags:
  - skills
  - health-check
  - duplicates
  - maintenance
  - inventory
---

# Health Report

Generate a comprehensive health report combining inventory, quality checks, duplicate detection, and broken skill findings.

## Overview

One report covering every place a skill lives: user, project, codex, plugin, and source scopes. Plugin skills appear with their full invocation name (e.g. `marketing-skills:image`, `figma:figma-use`) — these were invisible to the v1.2 report. The scan JSON also includes an `agents` array (subagents from `~/.claude/agents` — their descriptions are always-loaded too) and per-plugin `update_available` (installed commit vs marketplace HEAD) — surface stale plugins and heavy agents in the report.

Modes:

- **`/janitor-report`** (default) — full health check: inventory + lint + duplicates + broken
- **`/janitor-report --brief`** — inventory only (replaces the old `/janitor-audit`)

## Prerequisites

- Claude Code with the skills-janitor plugin installed (provides `scripts/scan.sh`, `lint.sh`, `detect_dupes.sh`)
- bash 3.2+ (the stock macOS bash works; no external dependencies)
- Read access to `~/.claude/skills`, `~/.claude/agents`, and installed plugin metadata
- No authentication or API keys required — the scripts read local files only

## Instructions

### Step 1: Run the scripts

Full report:

```bash
bash ~/.claude/skills/skills-janitor/scripts/scan.sh
bash ~/.claude/skills/skills-janitor/scripts/lint.sh
bash ~/.claude/skills/skills-janitor/scripts/detect_dupes.sh
```

Brief mode (inventory only):

```bash
bash ~/.claude/skills/skills-janitor/scripts/scan.sh
```

### Step 2: What each script covers

- **Inventory (scan.sh)** — all skills across scopes, symlink status, frontmatter fields, line counts; `agents` and `plugins` (with `update_available`) arrays; `broken_symlinks` count.
- **Quality checks (lint.sh)** — Critical: broken symlinks, missing SKILL.md, missing frontmatter. Warning: missing/empty name or description, description too short/long, missing version. Info: no body content, no Gotchas section, large files.
- **Duplicate detection (detect_dupes.sh)** — name collisions (two distinct skills with the same qualified name at different paths) and description overlap (Jaccard similarity >30%), with cross-scope user-vs-plugin pairs explicitly surfaced (e.g. `marketing-seo-audit` (user) ↔ `marketing-skills:seo-audit` (plugin)).

### Step 3: Present a unified report

Merge the three outputs into one table with severity levels, then recommend actions.

## Output

```
| Skill                            | Scope    | Status      | Issues                                   |
|----------------------------------|----------|-------------|------------------------------------------|
| marketing-copywriting            | user     | DUPLICATE?  | 90% overlap with marketing-skills:copywriting |
| seo-audit                        | user     | WARNING     | Description too short                    |
| old-deploy-helper                | user     | CRITICAL    | Broken symlink                           |
| figma:figma-use                  | plugin   | OK          | -                                        |
```

Recommended actions per issue type:

- Broken symlinks → `/janitor-fix --prune`
- Quality issues → `/janitor-fix`
- User-vs-plugin duplicates → uninstall the user-scope copy and rely on the plugin (or vice versa)
- Stale plugins (`update_available: true`) → `/plugin update <name>`
- Token waste → `/janitor-value`
- Suspicious content (injection phrases, dangerous scripts) → `/janitor-security`
- Unused MCP servers (run `scripts/mcp.sh` for the inventory) → remove the config entry or `/janitor-swipe`

## Error Handling

1. **Error**: `scan.sh: No such file or directory`
   **Solution**: The plugin is installed under a different root. Locate it with `ls ~/.claude/skills` or check the plugin cache, then run the scripts from their actual location.

2. **Error**: Scan output is not valid JSON
   **Solution**: Re-run with stderr visible (drop any `2>/dev/null`) and report the failing line; a skill directory with unusual characters is the usual cause.

3. **Error**: `plugins` array is empty despite installed plugins
   **Solution**: `~/.claude/plugins/installed_plugins.json` is missing or in an unknown format — report which Claude Code version is in use.

## Examples

### Example 1: Full health check

**Input**: "Check my skills for problems."

**Output**: Run all three scripts, merge into the severity table, and lead with counts: "175 skills scanned: 2 critical (broken symlinks), 5 warnings, 3 likely duplicates, 2 plugins have updates available."

### Example 2: Inventory only

**Input**: "/janitor-report --brief"

**Output**: Run `scan.sh` only and present the inventory grouped by scope with per-scope counts.

## Resources

- Scripts (plugin-relative): `{baseDir}/../../scripts/scan.sh`, `lint.sh`, `detect_dupes.sh`
- `/janitor-fix` — auto-fix the issues this report finds
- `/janitor-value` — token cost + usage (combined)
- `/janitor-discover` — find or evaluate new skills

© Krzysztof Hendzel · MIT · khendzel/skills-janitor

Similar skills

All skills for Agent setup: memory, context, orchestration →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor