Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Lint, sync and scaffold agent-config files (SKILL.md, CLAUDE.md, AGENTS.md). Use when checking, validating or regenerating agent-config files in a repository.
.claude/skills/cloudroad-io-skillcraft/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -22% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 52% | 0% |
<!-- skillcraft:managed-source path=AGENTS.md -->
ESLint + Jest for agent-config files. skillcraft lints, syncs and scaffolds the fragmented ecosystem of SKILL.md, CLAUDE.md, AGENTS.md, .cursor/rules, .claude/rules and copilot-instructions. One canonical source, many managed targets, drift detection in CI.
bashuv tool install skillcraft # or: pip install skillcraft
| Command | Purpose | | --- | --- | | skillcraft lint [--check] [-f plain\|json\|github\|sarif] | Run the rule set over discovered config files; exit 1 on any ERROR. | | skillcraft sync [--check] [--diff] [--adopt <file>] | Regenerate managed targets from AGENTS.md; detect drift. | | skillcraft init [--name <name>] | Scaffold a minimal AGENTS.md + .skillcraft.toml. | | skillcraft version | Print the version. |
AGENTS.md (vendor-neutral, schema-less). Richer metadata (name, description, scope, license, …) rides in invisible <!-- skillcraft:meta <json> --> comments — valid markdown to every consumer, machine-readable to skillcraft.ConfigDoc. Every parser emits it, every renderer consumes it. Same-format parse→render is lossless; extra_frontmatter escape hatch guarantees no field is silently dropped.skillcraft sync renders each target from the canonical doc and writes it with a <!-- skillcraft:managed-source path=AGENTS.md --> marker. skillcraft sync --check exits 1 if any managed target drifted (CI). Unmanaged files are never overwritten; opt in with --adopt.Rule or Converter, decorate with @register_rule / @register_converter, and (for external packages) declare an entry-point in skillcraft.rules / skillcraft.converters. See CONTRIBUTING.md.| ID | Scope | Rule | | --- | --- | --- | | SC101 | SKILL | name is kebab-case, ≤64 chars | | SC102 | SKILL | in a skills/<name>/ folder, name matches the folder | | SC103 | SKILL | description present, ≤1024 chars | | SC104 | SKILL | body ≈ <5000 tokens (warn past 4000) | | SC105 | SKILL | description ≥40 chars for triggerability (warn) | | SC201 | CLAUDE | @path imports resolve, no cycles, ≤4 hops | | SC202 | CLAUDE | line count <200 (warn), <500 (error) | | SC203 | CLAUDE | @imports resolve inside the repo root (error) | | SC204 | ALL | no skipped heading levels (warn) | | SC301 | ALL | required frontmatter present iff the format requires it | | SC302 | ALL | no merge-conflict markers in the body | | SC304 | ALL | body ends with a trailing newline (warn) | | SC401 | CURSOR | globs well-formed and the rule is reachable (error/warn) | | SC402 | CURSOR | not both alwaysApply: true and globs (warn) |
bashuv sync uv run ruff check uv run pytest uv run skillcraft lint # dogfood: lint skillcraft's own configs uv run skillcraft sync --check # dogfood: no drift between AGENTS.md and targets
src/skillcraft/ cli, ir, markers, tokens, config, discover
lint/{runner,report} sync/engine scaffold/init
plugins/{api,registry,builtin/{rules,converters}}
tests/ unit (ir, markers, rules, converters, sync, registry, config, discover) + cli e2eMIT.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,674 | 2,633 | -75% | 1 | 1 | 0% | 1,834 | 1,433 | -22% | 0 | 0 | — |
case-02 | fail→pass | 9,414 | 3,014 | -68% | 1 | 1 | 0% | 1,625 | 1,322 | -19% | 0 | 0 | — |
case-03 | fail→pass | 10,294 | 3,837 | -63% | 1 | 1 | 0% | 2,011 | 1,811 | -10% | 0 | 0 | — |
case-04 | fail→pass | 5,118 | 3,322 | -35% | 1 | 1 | 0% | 932 | 1,561 | +67% | 0 | 0 | — |
case-05 | fail→pass | 6,889 | 3,676 | -47% | 1 | 1 | 0% | 1,097 | 1,671 | +52% | 0 | 0 | — |
case-06 | fail→pass | 15,607 | 3,464 | -78% | 1 | 1 | 0% | 2,440 | 1,621 | -34% | 0 | 0 | — |
case-07 | fail→pass | 11,473 | 1,859 | -84% | 1 | 1 | 0% | 1,741 | 1,272 | -27% | 0 | 0 | — |
case-08 | fail→pass | 8,464 | 3,120 | -63% | 1 | 1 | 0% | 1,477 | 1,521 | +3% | 0 | 0 | — |
case-09 | fail→pass | 7,581 | 3,817 | -50% | 1 | 1 | 0% | 1,279 | 1,632 | +28% | 0 | 0 | — |
case-10 | fail→pass | 11,510 | 4,017 | -65% | 1 | 1 | 0% | 1,547 | 1,691 | +9% | 0 | 0 | — |
case-11 | fail→pass | 8,709 | 2,889 | -67% | 1 | 1 | 0% | 1,519 | 1,355 | -11% | 0 | 0 | — |
case-12 | fail→pass | 8,234 | 2,762 | -66% | 1 | 1 | 0% | 1,581 | 1,395 | -12% | 0 | 0 | — |
case-13 | fail→pass | 10,855 | 1,533 | -86% | 1 | 1 | 0% | 1,900 | 1,189 | -37% | 0 | 0 | — |
case-14 | fail→pass | 6,166 | 2,087 | -66% | 1 | 1 | 0% | 1,105 | 1,271 | +15% | 0 | 0 | — |
case-15 | fail→pass | 10,754 | 4,903 | -54% | 1 | 1 | 0% | 2,014 | 1,915 | -5% | 0 | 0 | — |
case-16 | fail→pass | 10,654 | 2,249 | -79% | 1 | 1 | 0% | 1,891 | 1,364 | -28% | 0 | 0 | — |
case-17 | fail→pass | 11,034 | 3,014 | -73% | 1 | 1 | 0% | 1,991 | 1,537 | -23% | 0 | 0 | — |
case-18 | fail→pass | 7,983 | 2,070 | -74% | 1 | 1 | 0% | 1,186 | 1,329 | +12% | 0 | 0 | — |
case-19 | fail→pass | 7,366 | 3,488 | -53% | 1 | 1 | 0% | 1,255 | 1,594 | +27% | 0 | 0 | — |
case-20 | pass→pass | 3,677 | 2,374 | -35% | 1 | 1 | 0% | 583 | 1,366 | +134% | 0 | 0 | — |
case-21 | pass→pass | 2,618 | 2,058 | -21% | 1 | 1 | 0% | 437 | 1,336 | +206% | 0 | 0 | — |
case-22 | pass→fail | 8,513 | 7,638 | -10% | 1 | 1 | 0% | 1,458 | 2,208 | +51% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +82 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.