Skill Hygiene Auditor

VerifiedCaution

Audits ~/.claude/skills/ for hygiene issues: unused skills, duplicates, missing or overlong descriptions. Reports usage frequency and most-used skills.

Sby Skills Guide Bot
ProductivityIntermediate
7/22/2026
Claude Code
#skill-management#usage-audit#hygiene#claude-code#meta

Recommended for

Automated summary

Audits user-level Claude Code skills under ~/.claude/skills/ and emits a Markdown report on usage frequency, duplicates, and missing or overlong descriptions.

Strengths

  • Reads a JSONL usage log written by a PostToolUse hook (Skill matcher) instead of a transcript grep, and falls back to the transcript heuristic explicitly when the log is missing
  • Honestly reports log coverage and labels Unused verdicts as provisional or heuristic rather than presenting them as final
  • Structured, actionable report: unused list, invocation counts with last-used dates, top 5 longest descriptions, and duplicate name: fields
  • Strictly advisory — never deletes or edits a skill without explicit confirmation

Limitations

  • Undercounts usage: a hand-typed /name invocation expands in place without a Skill tool call, so the hook never records it
  • Only yields trustworthy verdicts after the log has accumulated; on a fresh machine the unused list is mostly noise
  • Requires zsh, jq and ripgrep, and assumes a ~/.claude/ tree with the hook already wired up
When to use it

Use it when trimming your skill set and you need to know which skills are actually invoked, which duplicate each other, or which have bloated descriptions.

When not to use it

Avoid it if you want automated deletion, need to audit project-scoped skills outside ~/.claude/skills/, or want reliable numbers right now on a machine where the usage hook was never installed.

Security analysis

Caution
Quality score86/100

The instruction text itself is benign and explicitly advisory ("suggest only — never delete or edit a skill without explicit confirmation"), with no network calls, exfiltration, obfuscation, or destructive commands. Risk is limited to Bash being used to run a bundled helper script and read local log files for a legitimate read-only audit; because that script's contents are not shipped in the manifest, it warrants a caution rather than a clean safe rating.

Findings
  • •Grants Bash and executes `~/.claude/skills/skill-cleaner/scripts/cleaner.sh`, whose body is not included in SKILL.md and therefore cannot be reviewed here
  • •Reads local runtime state (`~/.claude/state/skill-usage.jsonl`) and optionally transcripts; no evidence of anything being sent off-machine, but scope of filesystem reads is defined only by the unshipped script
  • •Requires a top-level Claude Code hook (`PostToolUse` on `Skill`) to be installed for accurate results — a config-modifying instruction, though it is scoped and user-confirmed
How this analysis is made

Examples

Find unused skills
Which of my Claude Code skills haven't been used in the last 90 days? Run the skill cleaner audit with a 90-day lookback and show me the unused list with its coverage caveat.
Trim the skill set
My ~/.claude/skills folder has grown a lot. Audit it, show me the most-used skills and any duplicates, then recommend what to tighten or remove — don't change anything yet.
Description bloat check
Run the skill audit and list the five longest skill descriptions so I can see which ones are eating prompt budget every turn.

description: Audits ~/.claude/skills/ for hygiene issues. Use when trimming the skill set, asking which skills are unused or most-used, or finding duplicates. Reports usage frequency, unused skills, duplicates, and missing or overlong descriptions. allowed-tools:

  • Bash
  • Read

Skill Cleaner

Audits user-level Claude Code skills under ~/.claude/skills/. Suggest only — never delete or edit a skill without explicit confirmation.

Prerequisites

  • zsh (the script's interpreter — shebang is #!/usr/bin/env zsh)
  • jq — parses the usage log (the ground-truth source for unused detection)
  • rg (ripgrep) — only for the transcript fallback used before the log has coverage

Usage log (source of truth)

Unused detection reads a JSONL usage log written by a PostToolUse hook, not a transcript grep. The hook (~/.claude/hooks/log-skill-use.sh, matcher Skill) appends one {"ts","skill","cwd"} record per skill invocation to ~/.claude/state/skill-usage.jsonl. This captures every invocation deterministically — including skills invoked only by other skills via the Skill tool, which the old transcript heuristic could miss.

The log is runtime state (gitignored) and only accumulates from when the hook was installed. Until it reaches back the full lookback window, the report marks the Unused list provisional and shows the log's actual coverage. If the log is empty or missing entirely, the script falls back to the transcript grep and labels the result a heuristic.

One undercount to keep in mind: a user-typed /name invocation expands in place without a Skill tool call, so the hook never logs it. Log-based "unused" verdicts are a lower bound — sanity-check against the transcript heuristic before recommending deletion.

To bootstrap coverage on a fresh machine where the hook isn't wired yet, add a PostToolUse hook with matcher Skill that runs ~/.claude/hooks/log-skill-use.sh (use the update-config skill), then let the log accumulate.

Run

~/.claude/skills/skill-cleaner/scripts/cleaner.sh

Flags:

  • --days N — lookback window (default 60)
  • --root DIR — override skills root
  • --usage-log FILE — override the usage-log path
  • --transcripts DIR — override transcripts root (fallback only)

Output

Markdown report to stdout. A header line names the source (usage log vs. transcript fallback) and, in log mode, the log's coverage. Then:

  • Unused — skills with zero invocations in the last N days per the usage log. Marked provisional while log coverage is shorter than the window, or heuristic when running off the transcript fallback.
  • Usage (log mode only) — skills that were invoked in the window, with invocation count and last-used date, most-used first. Turns "unused" from a binary into a frequency signal.
  • Longest descriptions — top 5 by character count. Long descriptions cost prompt budget every turn; trim only if trigger keywords are redundant.
  • Duplicates — same name: field across two skill directories.
  • Missing description — skills with no description: in frontmatter.

Example output

# Skill Audit

- Source: usage log (`~/.claude/state/skill-usage.jsonl`) — 1 record, 1 in last 60d
- Log coverage: ~0d (oldest record 2026-07-05)

## Unused (no invocation in 60d)
> ⚠ Provisional — the usage log only reaches back ~0d, less than the 60d window.
- cc-review
- deps-audit
- …

## Usage (last 60d, most-used first)
- skill-cleaner — 1× (last 2026-07-05)

## Duplicates
_None._

Acting on results

  • Treat "unused" as a candidate list, not a kill list. Confirm with the user before deleting any skill directory.
  • Weight the list by its label: a provisional or heuristic Unused list may flag skills that are simply older than the log — lean on the Usage section and let coverage accrue before acting.
  • Prefer tightening a long description over deleting the skill.
  • For duplicates, identify which copy is canonical (usually the one in ~/.claude/skills/ over any project-local override) before removing.

Do not use when

  • Scoring a skill's quality or content depth — use cc-review
  • Checking a skill against a newly-shipped Claude Code release — use cc-release-review

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/skill-hygiene-auditor-mrwakb7d/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/skill-hygiene-auditor-mrwakb7d' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/skill-hygiene-auditor-mrwakb7d/download' --output '.skill-downloads/skill-hygiene-auditor-mrwakb7d/SKILL.md.part' && mv '.skill-downloads/skill-hygiene-auditor-mrwakb7d/SKILL.md.part' '.skill-downloads/skill-hygiene-auditor-mrwakb7d/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

Original excerpt: Prerequisites
  • zsh (the script's interpreter — shebang is #!/usr/bin/env zsh)
  • jq — parses the usage log (the ground-truth source for unused detection)
  • rg (ripgrep) — only for the transcript fallback used before the log has coverage

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

This file does not provide a usable name/description header for this native procedure. It remains available to download and inspect; use the manual method below.

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/skill-hygiene-auditor-mrwakb7d/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills