skillcheck
Health Warn
- License รขโฌโ License: MIT
- Description รขโฌโ Repository has a description
- Active repo รขโฌโ Last push 0 days ago
- Low visibility รขโฌโ Only 7 GitHub stars
Code Fail
- network request รขโฌโ Outbound network request in dashboard/api/_lib/clerk.js
- process.env รขโฌโ Environment variable access in dashboard/api/_lib/config.js
- exec() รขโฌโ Shell command execution in dashboard/api/_lib/http.js
- network request รขโฌโ Outbound network request in dashboard/api/_lib/nvidia.js
- process.env รขโฌโ Environment variable access in dashboard/api/_lib/store.js
- network request รขโฌโ Outbound network request in dashboard/api/_lib/store.js
Permissions Pass
- Permissions รขโฌโ No dangerous permissions requested
No AI report is available for this listing yet.
๐งช A/B test your agent skills โ skillcheck measures whether a SKILL.md actually improves an LLM's task performance, with blind grading, bootstrap confidence intervals, and a 0โ100 score. CLI for Claude Code, Codex & Cursor skills.
Measure whether an agent skill actually improves a model's task performance.
Most published SKILL.md files have never been tested. You can't tell whether they
help your model or are just decoration. Skillcheck answers that with a controlled
experiment instead of a vibe check.
Point it at any Markdown skill file and it runs an A/B test: it generates fresh tasks
for the skill's declared domain, has the model solve every task with and
without the skill injected, grades both arms blind, and reports the measured
effect with a bootstrap confidence interval and a 0โ100 quality score.
$ skillcheck
โ Evaluation tasks ready ยท 12s
โ Trials complete (30/30) ยท 1m 38s
โ Grading complete (30/30) ยท 41s
โ Analysis complete ยท 2m 33s
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ SKILLCHECK RESULT โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Skill API Documentation โ
โ Run size 5 tasks ร 3 trials โ
โ โ
โ Verdict HELPS โ
โ The skill HELPED โ model passed 80% of tasks with it โ
โ vs 55% without. โ
โ โ
โ With skill 80.0% of tasks passed โ
โ Without skill 55.0% of tasks passed โ
โ Skill effect +25.0 pp change in pass rate โ
โ Confidence +8.0 pp to +42.0 pp (95% range) โ
โ Token cost +480 tokens to include the skill โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Satisfaction โโโโโโโโโโโโโโโโโโ 75.0/100 GOOD โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Table of contents
- Install
- Quick start
- How it works
- Architecture
- Commands
- Reading the result
- Effort levels
- Terminal experience
- Configuration
- Model choice
- Self-hosting
- Development
- Star history
- License
Install
npm install -g @sx4im/skillcheck
# or run it without installing:
npx @sx4im/skillcheck
Requires Node.js 20+. Works on Linux, macOS, and Windows.
Skillcheck checks npm for a newer version about once a day and offers to update
(like the Codex and Gemini CLIs). Disable with SKILLCHECK_NO_UPDATE_CHECK=1.
Quick start
skillcheck
On first run it asks for your Skillcheck API key (grab a free one from the dashboard โ
the URL is built in, and the free tier includes 10 checks). Key entry is masked, the
key is verified before it's saved, then a full-screen file picker opens: navigate
folders with the arrow keys, pick any .md file, choose an effort level from the
arrow-key menu, and watch the live progress tracker until the result card lands.
The picker runs on the terminal's alternate screen, so quitting hands your
scrollback right back.
Point it straight at a file or folder to skip the picker:
skillcheck check ./SKILL.md
skillcheck ./my-skill-folder # a folder containing a .md
skillcheck check ./SKILL.md --json # machine-readable output
skillcheck check ./SKILL.md --output result.json
Fully headless (CI, scripts) โ set the key via environment variable:
export SKILLCHECK_TOKEN=chk_live_...
skillcheck check ./SKILL.md --tasks 5 --trials 3 --json
How it works
Skillcheck treats a skill like a drug trial treats a drug:
- Normalize โ the skill file is parsed; its declared domain is read from
front matter (domain:/description:) or the first heading. - Generate โ a task generator sees only the domain, never the skill body,
so the tasks can't leak the skill's instructions. It produces 2ร candidate
tasks; a seeded shuffle picks the final set. - Run โ every task runs
Ktrials in two arms: with the skill injected as
a system prompt, and without it. Same model, same temperature. - Grade โ a blind grader scores each output against the task's pass/fail
criterion. It never knows which arm produced the output (outputs are shuffled),
and grades at temperature 0 in JSON mode. - Score โ pass rates are compared pairwise and a 1000-iteration paired
bootstrap produces the effect size, a 95% confidence interval, and the verdict:HELPS(CI fully above zero),HARMS(fully below), orPLACEBO(overlaps zero).
Every run is fresh: tasks and outputs are generated anew each time and check
stores nothing locally, so a repeated check is an independent measurement. Full
methodology in METHODOLOGY.md.
Architecture
How a check flows from your terminal to the result card:
flowchart LR
subgraph CLI["skillcheck CLI (local)"]
direction TB
A["User input<br/>skillcheck check ./SKILL.md"] --> B{API key<br/>configured?}
B -- no --> C["Interactive setup<br/>masked key โ verified โ saved"]
B -- yes --> D
C --> D["Normalize skill<br/>name ยท domain ยท instructions"]
D --> E["Generate tasks<br/>domain only โ never the skill body"]
E --> F["Run trials<br/>each task ร K trials ร 2 arms"]
F --> G["Blind grading<br/>shuffled outputs ยท temp 0 ยท JSON verdict"]
G --> H["Paired bootstrap<br/>1000 resamples โ effect ยท 95% CI ยท verdict"]
H --> I{Output mode}
I -->|terminal| J["Result card<br/>+ animated satisfaction bar"]
I -->|"--json / --output"| K["JSON result<br/>task suite + transcript hashes"]
end
subgraph Cloud["Skillcheck Cloud (dashboard/, Vercel)"]
direction TB
P["Metered proxy<br/>/api/chat/completions<br/>authenticates chk_live key<br/>counts 1 run per check<br/>pins model ยท caps max_tokens"]
V["/api/key/verify"]
S["NVIDIA key<br/>stays server-side"]
P ~~~ V ~~~ S
end
subgraph NIM["NVIDIA NIM"]
direction TB
M["openai/gpt-oss-120b<br/>default for all three roles"]
end
CLI ==>|"model calls<br/>(generate ยท run ยท grade)"| Cloud
CLI -.->|"setup: key verify"| Cloud
Cloud ==>|server-side key| NIM
CLI -.->|"direct mode<br/>(NVIDIA_API_KEY)"| NIM
style CLI fill:#0b2942,stroke:#2d7dd2,color:#e8f0fe
style Cloud fill:#102a12,stroke:#3fa34d,color:#e8f5e9
style NIM fill:#2a2210,stroke:#d2a52d,color:#fdf6e3
Key properties:
- One metered run per check โ every model call in a check shares a run id, so
the hosted proxy counts the whole check as a single run. - No provider key on your machine (hosted mode) โ the CLI talks to the proxy;
the NVIDIA key lives only on the server. - Direct mode โ set
NVIDIA_API_KEYto bypass the proxy entirely and call
NVIDIA NIM with your own key.
Commands
skillcheck # interactive: pick a file, pick effort, run
skillcheck check <path> [--tasks N] [--trials K] [--output file.json] [--json] [--explain]
skillcheck setup # connect / change your API key
skillcheck logout # remove your saved API key
skillcheck eval <path> [--tasks N] [--trials K] [--output file.json] # raw JSON evaluator
skillcheck verify <result.json> [--sample n] # independently re-measure a published result
skillcheck corpus run --corpus corpus.json [--results dir] # batch-evaluate many skills
skillcheck rot [--results dir] [--output report.json] # detect skills that stopped helping
skillcheck --version
Accepted inputs: any Markdown (.md) file โ SKILL.md, AGENTS.md, CLAUDE.md,
or any other .md โ or a folder containing one. --tasks is capped at 50 and--trials at 10; mistyped options are rejected rather than silently ignored.
Reading the result
Verdict โ
HELPS/PLACEBO/HARMS, decided by whether the 95%
confidence interval clears zero.PLACEBOmeans no measurable difference,
not necessarily a bad skill.Skill effect โ the change in pass rate, in percentage points (pp).
Confidence โ the 95% range for the true effect. A wide range means the
run was inconclusive; re-run at a higher effort for a clearer signal.Token cost โ the prompt-token overhead of including the skill.
Satisfaction โ a 0โ100 quality score where 50 = no effect:
Score Band Score Band โค10 Very bad 51โ60 Decent 11โ30 Bad 61โ80 Good 31โ50 Normal 81โ100 Excellent
Each run is an independent experiment โ tasks and model outputs are generated
fresh every time, so results vary run to run. That variance is what the
confidence interval quantifies.
Add --explain to see why a verdict landed where it did: a per-task breakdown
of the with/without pass rates, the change, and a contrasting example model output
from each arm โ printed below the card, and included in --json output underexplain. It reuses the outputs the run already produced, so it costs nothing
extra.
skillcheck check ./SKILL.md --explain
skillcheck check ./SKILL.md --explain --json # breakdown under result.explain
Effort levels
The interactive run asks how thorough to be โ more tasks/trials means a tighter
confidence interval but a longer run:
| Level | Tasks ร trials | Typical time |
|---|---|---|
| Quick | 2 ร 1 | ~30 sec |
| Standard | 3 ร 2 | ~1โ2 min |
| Thorough | 5 ร 3 | ~3โ4 min |
For scripted runs, set it explicitly: skillcheck check ./SKILL.md --tasks 5 --trials 3.
Terminal experience
The CLI is built to feel like a first-class developer tool:
- Live step tracker โ each phase persists as a receipt line
(โ Trials complete (30/30) ยท 1m 38s) while the active phase shows a spinner,
a progress bar, and elapsed time. Progress renders on stderr, so piping
stdout still gives you a clean result; piped stderr gets plain log lines
instead of spinner frames. - Animated result card โ the satisfaction bar sweeps to its score on
interactive terminals; non-TTY output is the same card, static. - Adaptive colour โ truecolor gradients where supported, 256/16-colour
fallbacks elsewhere.NO_COLOR(any non-empty value)
disables colour entirely;FORCE_COLOR=1|2|3forces it on for piped output. - Quiet cancellation โ backing out of a menu with
q/Ctrl+Cexits with
code130and a one-line note, not an error dump. Run failures print a
conciseโblock on stderr. - Masked secrets โ API-key entry never echoes; keys are stored at
~/.config/skillcheck/config.jsonwith0600permissions.
Configuration
Credential precedence (highest wins):
| Setting | Mode | Effect |
|---|---|---|
<PROVIDER>_API_KEY |
direct | Call OpenAI, Anthropic, Gemini, Groq, Mistral, OpenRouter, or NVIDIA NIM with your own key |
SKILLCHECK_TOKEN |
hosted | Use a Skillcheck Cloud key without saving anything |
skillcheck setup |
interactive | Setup assistant: choose Hosted mode or Bring Your Own Key (BYOK) with live model selection |
Supported providers for Bring-Your-Own-Key (BYOK) direct mode:
- OpenAI (
OPENAI_API_KEY, models list viahttps://api.openai.com/v1/models) - Anthropic (
ANTHROPIC_API_KEY, models list viahttps://api.anthropic.com/v1/models) - Google Gemini (
GEMINI_API_KEY/GOOGLE_API_KEY, models list viahttps://generativelanguage.googleapis.com/v1beta/models) - Groq (
GROQ_API_KEY, models list viahttps://api.groq.com/openai/v1/models) - Mistral AI (
MISTRAL_API_KEY, models list viahttps://api.mistral.ai/v1/models) - OpenRouter (
OPENROUTER_API_KEY, models list viahttps://openrouter.ai/api/v1/models) - NVIDIA NIM (
NVIDIA_API_KEY, models list viahttps://integrate.api.nvidia.com/v1/models)
Optional environment variables:
| Variable | Default | Purpose |
|---|---|---|
SKILLCHECK_API_URL |
hosted cloud URL | Point at a self-hosted proxy deployment |
SKILLCHECK_MODEL |
provider default | Override the model for all three roles |
<PROVIDER>_GENERATOR_MODEL / <PROVIDER>_RUNNER_MODEL / <PROVIDER>_GRADER_MODEL |
โ | Per-role model overrides for any provider (e.g. OPENAI_RUNNER_MODEL, ANTHROPIC_RUNNER_MODEL) |
OPENAI_BASE_URL / ANTHROPIC_BASE_URL / ... |
provider default | Custom API base URL per provider |
SKILLCHECK_TIMEOUT_MS / NVIDIA_TIMEOUT_MS |
120000 |
Per-request timeout |
SKILLCHECK_REQUEST_DELAY_MS / NVIDIA_REQUEST_DELAY_MS |
750 |
Minimum delay between requests (rate-limit safety) |
SKILLCHECK_MAX_ATTEMPTS |
8 |
Retry budget for retryable failures (429/5xx) |
SKILLCHECK_NO_UPDATE_CHECK |
โ | 1 disables the daily update check |
SKILLCHECK_DEBUG |
โ | 1 enables verbose per-call logging |
NO_COLOR |
โ | Any non-empty value disables colour (spec) |
FORCE_COLOR |
โ | 1/2/3 forces colour on, even when piped |
Model choice
All three roles (task generator, runner, blind grader) default to the selected provider's optimal model (e.g., gpt-4o for OpenAI, claude-3-5-sonnet-20241022 for Anthropic, gemini-1.5-pro for Gemini, openai/gpt-oss-120b for NVIDIA NIM).
When running skillcheck setup, choosing Bring Your Own Key queries your provider's live /models endpoint, letting you pick any available model directly from your provider.
Role model overrides let you benchmark your specific production model while maintaining a strong generator and grader:OPENAI_RUNNER_MODEL=gpt-4o-mini skillcheck check ./SKILL.md or ANTHROPIC_RUNNER_MODEL=claude-3-5-haiku-20241022 skillcheck check ./SKILL.md.
Self-hosting
Skillcheck's hosted tier runs behind a metered proxy so end users never need a provider key. The dashboard/ folder is a deployable Vercel app (Clerk sign-in, free-tier metering, optional Stripe upgrade) that issues chk_live_โฆ keys and forwards completions to your server-side NVIDIA key. See the dashboard/README.md for deployment notes.
To bypass the hosted proxy, run skillcheck setup and select Bring Your Own Key, or set provider environment variables (e.g., OPENAI_API_KEY, ANTHROPIC_API_KEY, NVIDIA_API_KEY โ see .env.example).
Development
npm ci
npm run build # compile to dist/
npm test # vitest (131 tests)
npm run test:coverage # vitest + v8 coverage gate (85% lines/stmts/funcs, 70% branches)
npm run lint # eslint (flat config, typescript-eslint)
npm run typecheck # strict TS, src + tests
The CLI lives in packages/cli (bin/skillcheck.ts โ src/cli.ts).packages/site is the static leaderboard site; dashboard/ is the hosted cloud.
The suite runs fully offline: the model adapter is mocked, so an end-to-end test
drives the whole normalize โ generate โ run โ grade โ score pipeline (plus the
retry adapter, metering, and every command) without a single API call. The
interactive terminal shell is verified behaviourally rather than counted toward the
coverage percentage.
Every push and pull request runs ci.yml โ lint,
typecheck, coverage, and a clean build on Node 20 and 22, a published-tarball
validation, and the dashboard's offline tests โ and it makes no model calls, so it
runs on forks too. Tagging a release (npm version patch && git push --follow-tags)
triggers release.yml, which republishes to npm
with provenance. Separately, a scheduled rot workflow
re-runs the live corpus weekly and opens a PR when a skill's verdict regresses.
Star history
If Skillcheck saved you from shipping a placebo skill, a โญ helps other people find it.
License
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found