skillbench

skillbench checks agent skills, the instruction files a coding agent loads when a request matches them. It lints each skill file against 26 checks, then reads activation counts from the session history your agent already keeps. Codex CLI and Gemini CLI do not record which skill was active, so their skills are reported as “unmeasured”.

Checks
26
Agents read
Claude Code, Codex CLI, Gemini CLI
Network calls
none
Dependencies
none
Licence
MIT

Example output

This is abridged from a real run of --lint across every skill installed on the machine this site was built on. The skill names are generalised. Every count and score is what the linter printed. The scan made no network calls.

# skillbench — lint

Source note: 38 skill · installed agent roots · claude-code/installed: 3
· claude-code/user: 13 · gemini-cli/user: 8 · codex/user: 8
· codex/system: 6 · score: 223 (poor)

1 error · 42 warn · 45 info

## By check

| Sev   | Check               | n  | example skills                |
|-------|---------------------|----|-------------------------------|
| error | ref-broken-link     |  1 | skill-creator                 |
| warn  | eval-missing        | 35 | agent-notes:intake, video-su… |
| warn  | fm-desc-no-trigger  |  5 | video-suite, skill-creator, … |
| warn  | path-absolute       |  1 | agent-notes:intake            |
| info  | fm-desc-no-boundary | 30 | persona:stats, agent-notes:w… |

## Skills needing most work

| Skill              | agent       | error | warn | info | score |
|--------------------|-------------|-------|------|------|-------|
| `video-suite`      | claude-code |     0 |    6 |    3 |    27 |
| `skill-creator`    | codex       |     1 |    3 |    0 |    22 |
| `media-assets`     | claude-code |     0 |    3 |    9 |    21 |
| `video-suite-cli`  | claude-code |     0 |    3 |    6 |    18 |
| `agent-notes:intake` | claude-code |   0 |    2 |    1 |     9 |

The machine I wrote this linter on scores “poor”. Every finding names the check, the skill and the severity, and every check carries a “why it matters” line and a “how to fix” line. The checks live in one file you can open, and any check you disagree with can be switched off with --ignore.

Install

# once
> /plugin marketplace add halilneed/plugins

# the plugin
> /plugin install skillbench@hailneed

# and try it
> /skillbench:coverage

The marketplace id is hailneed, which is why the install line ends in @hailneed.

  • Claude Code and Node.js 18 or newer.
  • No dependencies, no build step, no API key, no account.
  • It also runs standalone: node scripts/skillbench.mjs --coverage --md --lang en
  • For CI, --lint --path . --out lint.json has a stable output format. Fail the build when score.raw goes above a threshold you set.

Commands

/skillbench:lint

Checks whether a skill is written correctly. The 26 checks cover frontmatter, activation quality (trigger phrases, negative boundary), body size, broken references, portability, tool permissions and eval coverage. It runs on the repo you are developing (--path) or on every skill installed across Claude Code, Codex CLI and Gemini CLI.

/skillbench:coverage

Shows whether a skill ever fires. Claude Code records which skill was active for each tool call. Coverage turns that into real activations per skill (calls, distinct sessions, projects, recency) and lists the skills that never fired, with the likeliest reason. Codex CLI and Gemini CLI do not record attribution, so their skills are reported as unmeasured.

/skillbench:collide

Shows whether two skills compete for the same request. It gives an idf-weighted overlap score that names the shared terms blurring the boundary. It also detects drift in skills mirrored into several agent homes, by checking whether the copies are still identical.

What it does and does not do

  • It makes no network calls. The scanner only reads skill files and session logs already on your disk, and skillbench.mjs contains no fetch and no sockets.
  • Only Claude Code stores skill attribution, so skills on Codex CLI and Gemini CLI are reported as unmeasured and get no count.
  • No quota is spent. Everything is read from disk. Live trigger testing, which means running should_trigger prompts, is deliberately deferred to v0.2 because it costs quota.
  • There are 26 checks and no model judgement. checks.mjs is a list you can read, and --selftest runs the engine against 20 fixtures without touching your data.
  • Symlinks are followed. Skills linked from a development repo are found and linted. A naive scanner silently misses every one of them.
  • MIT-licensed (LICENSE). No account, no signup, no telemetry.

Planned

A hosted version, skillbench Cloud, is planned. The plugin stays free and local.

  • Continuous measurement for a team skill library: lint and coverage tracked over time instead of run by hand.
  • Regression history: how a description change affected the trigger rate, before and after.
  • Pre-publish gate for marketplace publishers: a skill has to pass before it is published.

To hear when it exists, subscribe on the writing page.