Know what's actually working in your Claude Code setup — and what's dead weight.
Claude Code configs grow organically. You add skills, MCP servers, hooks, and CLAUDE.md files as you go. Over time, some become outdated, redundant, or forgotten. Nobody knows what's actually used — until something breaks or your context window fills up with irrelevant instructions.
ccoverage scans your repo's Claude Code configuration and joins it against real session history to classify each item:
- Active — used recently and frequently
- Underused — seen in sessions, but below your usage threshold
- Dormant — configured but never appeared in any session
This is session-backed analysis, not just static file detection. It checks what you actually use.
brew install ShuhaoZQGG/tap/ccoveragego install github.com/ShuhaoZQGG/ccoverage@latestGrab a prebuilt binary from GitHub Releases for Linux, macOS, or Windows (amd64/arm64).
ccoverage scan --target . --format textLists all detected configuration items without checking session data.
ccoverage report --target . --lookback-days 30 --format jsonScans config, matches against session history, and classifies each item.
Filter by status or config type:
ccoverage report --status Dormant
ccoverage report --type MCP --format json
ccoverage report --status Dormant,Underused --format mdccoverage init --target ~/Project/MyRepoAdds a SessionEnd hook to the repo's .claude/settings.json so you get a one-line coverage summary after every Claude Code session.
ccoverage summary --target .Outputs a compact summary line. Designed to run as a SessionEnd hook.
| Type | What it covers |
|---|---|
| CLAUDE.md | All CLAUDE.md files (root, nested, .claude/ directory) |
| Skill | Skill definitions in project settings |
| MCP | MCP server configurations |
| Hook | Lifecycle hooks (PreToolUse, PostToolUse, etc.) |
| Command | Custom slash commands |
| Plugin | Plugin configurations with component discovery |
- Scan — Reads
.claude/settings.json, CLAUDE.md files, and project config to build a manifest of all configuration items - Match — Locates session JSONL files and parses tool calls, content blocks, and file paths to find evidence of each config item being used
- Classify — Compares usage counts against the threshold (default: 2) to assign Active, Underused, or Dormant status
Use --error-on-match to fail your build when dormant config is detected:
# .github/workflows/config-hygiene.yml
- name: Check for dormant config
run: |
go install github.com/ShuhaoZQGG/ccoverage@latest
ccoverage report --status Dormant --error-on-matchExit code 1 means matches were found. Clean up your config or adjust the filter.
Run ccoverage init on your repo to automatically get a coverage summary after every Claude Code session:
ccoverage init --target .This installs a hook that runs ccoverage summary at session end, showing something like:
ccoverage: 12 items — 8 Active, 2 Underused, 2 Dormant
Text (default) — human-readable table for terminal use
ccoverage report --format textJSON — machine-readable for scripting and CI
ccoverage report --format jsonMarkdown — for documentation or PR comments
ccoverage report --format mdccoverage includes a companion macOS menubar app that displays your latest coverage summary at a glance. It runs as a menubar-only app — it won't appear in the Dock, just in the menu bar.
Requirements: macOS 14 (Sonoma) or later.
- Download CCoverage.dmg from the latest release
- Open the DMG and drag CCoverage to Applications
- Launch CCoverage from Applications
The DMG bundles the ccoverage CLI inside the app. No separate CLI install needed.
The app is signed and notarized by Apple — no Gatekeeper warnings.
Requirements: macOS 14 (Sonoma) or later, Swift 5.9+, and the ccoverage CLI already in your PATH.
cd menubar
swift build # debug build
# swift build -c release # optimized build
# run the app
.build/arm64-apple-macosx/debug/CCoverageMenuBar