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
CONTRIBUTING.md: testing, maintainer workflows, rule-authoring conventions.docs/case-study-v1-real-world-runs.md: runs against the Anthropic skills corpus.docs/case-study-silent-skill-failure.md: VS Code dirname-mismatch incident.skills/skillcheck/SKILL.md: a SKILL.md that passes every rule.
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.
Metadata
Release files for skillcheck 1.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| skillcheck-1.5.0.tar.gz | 205.3 kB | With provenance | Details for skillcheck-1.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| skillcheck-1.5.0-py3-none-any.whl | Python 3 | none | any | Details for skillcheck-1.5.0-py3-none-any.whl |
Total release size: 307.9 kB
Release files / skillcheck-1.5.0.tar.gz
| Download URL | skillcheck-1.5.0.tar.gz |
|---|---|
| Size | 205.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d50a536f86ff0dc7c02f0dbd32a13160a6c30e4eca7f3f09973065b690158d7e
|
|
BLAKE2b-256 checksum How to use checksums |
308f4538a40fa98624293a99103768f5bffa6ff3710b9c21484c8495bb13194a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.
Transparency logRelease files / skillcheck-1.5.0-py3-none-any.whl
| Download URL | skillcheck-1.5.0-py3-none-any.whl |
|---|---|
| Size | 102.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
260b58d5320d40cf73fb68b855aad31d1ce3d15b2dd294e21cf3a5a5342aa5ba
|
|
BLAKE2b-256 checksum How to use checksums |
e1fdd4e2cce5887f548b8190584d4475781a7e06e01c14e6c1df705cb08a36b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.
Transparency logSecurity for skillcheck 1.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for skillcheck-1.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.