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.jsonhas a stable output format. Fail the build whenscore.rawgoes 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.mjscontains 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_triggerprompts, is deliberately deferred to v0.2 because it costs quota. - There are 26 checks and no model judgement.
checks.mjsis a list you can read, and--selftestruns 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.