Skip to main content
skillcheck

PyPI version Python CI status License

Static analyzer for SKILL.md files. Validates frontmatter, body sizing, file references, and cross-agent compatibility against the agentskills.io specification. No network calls. No LLM API calls. No file mutations.

842 tests cover all rule modules.

Install

pip install skillcheck

Requires Python 3.10 or later. For more accurate token estimates, install the optional extra:

pip install "skillcheck[tiktoken]"

Usage

skillcheck SKILL.md            # validate one file
skillcheck skills/             # scan a directory for files named SKILL.md
skillcheck SKILL.md --format json
skillcheck --help              # full flag reference

Sample output:

✔ PASS  skills/claude-api/SKILL.md
  line 2   ⚠ warning  frontmatter.name.reserved-word  Name contains the term 'claude'.
  line 4   · info     frontmatter.field.ecosystem      Field 'license' is ecosystem-common.

Checked 18 files: 18 passed, 0 failed, 29 warnings

GitHub Action

- uses: moonrunnerkc/skillcheck@v1
  with:
    path: skills/

Diagnostics appear as inline PR annotations. Inputs documented in action.yml.

pre-commit

repos:
  - repo: https://github.com/moonrunnerkc/skillcheck
    rev: v1.5.0
    hooks:
      - id: skillcheck

The hook passes --no-color by default so the captured pre-commit log stays clean. Override or extend with args: in your .pre-commit-config.yaml (for example, args: ["--no-color", "--strict"]).

What it checks

  • Frontmatter: required fields, types, name and description length limits, reserved-word collisions.
  • Description quality: 0-100 score across action verbs, trigger phrases, keywords, specificity, and length.
  • Sizing: line and token thresholds against the agentskills.io disclosure budgets.
  • References: broken links, escapes outside the skill directory, depth limits.
  • Cross-agent compatibility: Claude Code, VS Code, Codex, Cursor.
  • Capability graph (--analyze-graph): orphaned capabilities, unused inputs, unproduced outputs, unreferenced tools.
  • History ledger (--history): per-skill append-only JSON file tracking validation results across runs.

Agent modes

When the calling agent can run a prompt, skillcheck can ingest its response and merge findings into the report:

skillcheck SKILL.md --emit-critique-prompt > prompt.txt
# hand prompt.txt to the agent, then:
skillcheck SKILL.md --ingest-critique response.json

The same flow exists for capability graph extraction (--emit-graph-prompt / --ingest-graph). Prompt variants are tuned per agent via --critique-agent and --graph-agent (claude, codex, cursor).

An ingested response describes exactly one skill, so --ingest-critique and --ingest-graph require a single resolved SKILL.md. Pointing them at a directory that expands to more than one skill exits 2. Run the ingest once per skill.

Exit codes

Code Meaning
0 No errors. Warnings alone exit 0 unless --strict is set.
1 One or more errors. Also: warnings with --strict (the umbrella --strict-vscode / --strict-cursor only escalate their own diagnostics; the umbrella additionally escalates any warning-only run). Also: history.skill.regressed with --fail-on-regression. Also: any ingest parse failure.
2 Input or argument error (missing path, conflicting flags, malformed input, an ingest flag pointed at more than one skill).
3 Symbolic checks passed but an ingested critique reported semantic errors.

When both 1 and 3 would apply, 1 wins so CI consumers see the higher-severity signal.

Configuration

Defaults live in a skillcheck.toml discovered upward from the validated path. Override per invocation with --config PATH. Organization-specific frontmatter keys belong under [frontmatter] extension_fields. Override the name reserved-word list with [frontmatter] reserved_words = ["acme", "internal"] (an empty array reverts to the defaults).

--ignore PREFIX suppresses any diagnostic whose rule ID starts with PREFIX. The prefix is matched against the full dotted rule ID, so all three levels work: a top-level category (--ignore sizing), a category-and-field pair (--ignore frontmatter.name), or a fully-qualified rule (--ignore compat.unverified). The flag is repeatable.

Documentation

Releases

Pushing a version tag (v1.2.3) runs .github/workflows/release.yml, which builds the wheel and sdist, issues a SLSA build provenance attestation via actions/attest-build-provenance, and publishes to PyPI through trusted publishing. To verify a release artifact before installing:

gh attestation verify dist/skillcheck-*.whl --owner moonrunnerkc

This confirms the wheel was built by moonrunnerkc/skillcheck CI from the source at the tagged commit. Untagged builds (PR and main-branch CI) are not attested or published.

License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skillcheck-1.5.0.tar.gz (205.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skillcheck-1.5.0-py3-none-any.whl (102.6 kB view details)

Uploaded Python 3

File details

Details for the file skillcheck-1.5.0.tar.gz.

File metadata

  • Download URL: skillcheck-1.5.0.tar.gz
  • Upload date:
  • Size: 205.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skillcheck-1.5.0.tar.gz
Algorithm Hash digest
SHA256 d50a536f86ff0dc7c02f0dbd32a13160a6c30e4eca7f3f09973065b690158d7e
MD5 c3717275751cf746a2943e0193d8a2c4
BLAKE2b-256 308f4538a40fa98624293a99103768f5bffa6ff3710b9c21484c8495bb13194a

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillcheck-1.5.0.tar.gz:

Publisher: release.yml on moonrunnerkc/skillcheck

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file skillcheck-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: skillcheck-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 102.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skillcheck-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 260b58d5320d40cf73fb68b855aad31d1ce3d15b2dd294e21cf3a5a5342aa5ba
MD5 f1a76b7d4637cef0ad7148a7b4bb0b90
BLAKE2b-256 e1fdd4e2cce5887f548b8190584d4475781a7e06e01c14e6c1df705cb08a36b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillcheck-1.5.0-py3-none-any.whl:

Publisher: release.yml on moonrunnerkc/skillcheck

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.5.0 This release

2 files

1.4.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page