skill-check validates agent skills with clear diagnostics, auto-fix support, quality scoring, and optional security scanning.
npx skill-check .- Validates
SKILL.mdstructure, frontmatter, description quality, body limits, and local references. - Scores skills from 0-100 so teams can track quality improvements over time.
- Supports deterministic
--fixfor safe formatting and metadata corrections. - Runs an integrated security scan (
agent-scan) in the same CLI pipeline. - Accepts local paths and GitHub URLs (
https://github.com/<owner>/<repo>). - Exports text, JSON, SARIF, HTML, and GitHub annotation formats.
Global install via curl:
curl -fsSL https://raw.githubusercontent.com/thedaviddias/skill-check/main/scripts/install.sh | bashInstall via Homebrew:
brew tap thedaviddias/skill-check https://github.com/thedaviddias/skill-check
brew install skill-check| Command | Description |
|---|---|
skill-check [path|github-url] |
Shorthand for skill-check check [path|github-url] |
skill-check check [path|github-url] |
Run validation (and optional security scan) |
skill-check split-body [path] |
Preview/apply section-based body split into references/*.md |
skill-check new <name> |
Scaffold a new skill directory with SKILL.md template |
skill-check watch [path] |
Watch local paths for changes and re-run validation on save |
skill-check diff <a> <b> |
Compare diagnostics between two skill directories |
skill-check report [path|github-url] |
Generate a markdown health report |
skill-check rules [id] |
List all rules, or show detail for a specific rule |
skill-check security-scan [path|github-url] |
Run security scan via agent-scan (mcp-scan) |
skill-check init |
Create skill-check.config.json template |
| Flag | Description |
|---|---|
--fix |
Apply safe automatic fixes for supported findings |
--fix --interactive |
Prompt before applying each fix (TTY only) |
--baseline <path> |
Compare against a previous JSON run and show new/fixed counts |
--format <fmt> |
Output format (see below) |
--share |
Render a share card (text format only) |
--share-out <path> |
Save a share image file (default: ./skill-check-share.png) |
--no-open |
Skip auto-opening HTML reports |
--no-security-scan |
Skip the security scan |
--security-scan-verbose |
Show full raw agent-scan output (default is compact summary) |
--strict |
Treat warnings as errors |
--lenient |
Relax selected strict rules |
--fail-on-warning |
Exit non-zero when warnings exist |
| Format | Description |
|---|---|
text |
Colorized terminal output with ASCII tables, severity badges, and quality scores (default) |
json |
Machine-readable output including quality scores and optional baseline diff |
sarif |
SARIF format for security tooling and GitHub Code Scanning |
html |
Self-contained HTML report with scores, filtering, and dark mode |
github |
::error / ::warning annotations for GitHub Actions |
HTML reports are written to skill-check-report.html (or output.reportPath). In an interactive terminal the report opens in your browser automatically; use --no-open to skip.
View locally: npx skill-check . --format html or open the file directly: open skill-check-report.html (macOS).
The text formatter includes quality score bars per skill, colorized severity badges, and a share-friendly shield card with the exact runnable npx skill-check ... command (including GitHub URL targets when used).
An ASCII CLI banner is shown in interactive text mode; set SKILL_CHECK_NO_BANNER=1 to disable it.
Every check run computes a quality score (0-100) per skill based on five weighted categories:
| Category | Weight | What it measures |
|---|---|---|
| Frontmatter | 30% | Required fields, naming, ordering |
| Description | 30% | Length, "Use when" phrasing |
| Body | 20% | Line/token limits |
| Links | 10% | Broken local and reference links |
| File | 10% | Trailing newlines, formatting |
Scores appear in text, html, and json output.
When multiple skills share the same name or identical description, check emits duplicates.name / duplicates.description warnings so agents can reliably differentiate skills.
Save a JSON run as a baseline and compare later:
npx skill-check check . --format json --no-security-scan > baseline.json
# ... make changes ...
npx skill-check check . --baseline baseline.json --no-security-scanOutput shows how many diagnostics are new, fixed, or unchanged.
pnpm install
pnpm run check
pnpm run reportGenerate real CLI outputs from multi-skill fixtures:
pnpm run smoke:cliSmoke output files are written to reports/smoke/.
Smoke includes a real security scan run by default.
Smoke also includes a real --fix run on a temp copy of the failing mixed fixture.
You can control smoke output colors with SMOKE_COLOR=always|auto|never.
You can set SMOKE_SECURITY_SCAN=0 to skip security smoke and SMOKE_SECURITY_SCAN_RUNNER=auto|local|uvx|pipx to choose the runner (default: pipx).
Use SMOKE_SECURITY_SCAN_SKILLS=/path/to/skills to override the skills path scanned in smoke mode.
Create config with guided setup:
npx skill-check init --interactiveskill-check can validate repos or direct skills directories:
npx skill-check /path/to/repo
npx skill-check check ~/.claude/skillscheck runs the security scan by default.
If dependencies are missing, skill-check automatically installs scanner dependencies by default.
Use --no-installs to hard-block automatic installs.
By default, skill-check prints a compact security summary; use --security-scan-verbose for full scanner details.
Run security scan without UV by forcing pipx:
npx skill-check security-scan . --security-scan-runner pipxRun validation + security scan in one pipeline step with explicit runner:
npx skill-check check . --security-scan-runner pipxSkip security scan for local/offline linting:
npx skill-check check . --no-security-scanApply safe auto-fixes and then re-run validation:
npx skill-check check . --fix --no-security-scanInteractively choose which fixes to apply:
npx skill-check check . --fix --interactive --no-security-scanScaffold a new skill:
npx skill-check new my-skillWatch for changes during development:
npx skill-check watch . --no-security-scanCompare two skill directories:
npx skill-check diff skills/ other-skills/Use GitHub annotations in CI:
npx skill-check check . --format github --no-security-scanGenerate a screenshot-friendly share card:
npx skill-check https://github.com/thedaviddias/skill-check --share --no-security-scanBy default this also writes skill-check-share.png in your current directory.
Set a custom output path with --share-out path/to/card.png.
Hard-block dependency installs:
npx skill-check check . --no-installsskill-check supports scanning GitHub repos directly without a manual clone:
npx skill-check https://github.com/thedaviddias/skill-check --no-security-scan
npx skill-check https://github.com/thedaviddias/skill-check/tree/main/skills --no-security-scanRemote URL scanning behavior:
- Creates an ephemeral shallow clone (
git clone --depth 1) in a temp directory. - Cleans up the checkout automatically after the command finishes.
- Shows remote preparation progress on stderr (spinner in TTY,
[remote]status lines in non-TTY/CI). - Keeps security scan enabled by default (same as local path behavior).
- Does not support
--fixfor URL targets (read-only workflow). watchanddiffare local-path only in this version.
--fix currently handles deterministic formatting/metadata issues:
frontmatter.requiredfrontmatter.name_requiredfrontmatter.description_requiredfrontmatter.name_matches_directoryfrontmatter.name_slug_formatfrontmatter.field_orderdescription.use_when_phrasedescription.min_recommended_lengthfile.trailing_newline_single
Rules requiring human intent (content quality, max-length trimming, broken links, or oversized bodies) remain manual and are reported after fixes are applied.
Use --fix --interactive for per-diagnostic approval prompts (requires TTY).
When body.max_lines fails, use split-body to extract ## sections into references/*.md.
Preview first (no writes):
npx skill-check split-body <skill-dir-or-file>Apply changes:
npx skill-check split-body <skill-dir-or-file> --writeNotes:
- Split is deterministic and section-based (
##headings). - If a long body has no
##headings, the command reports a blocked plan and explains what to add. split-bodyis local-path only (no GitHub URL mutation flow in v1).- After writing, run
npx skill-check check <skill-dir-or-file> --no-security-scan. - For editorial cleanup, use
docs/skills/split-into-references/SKILL.mdor the published copy.
Use skill-check directly in workflows:
Marketplace status: not listed in GitHub Marketplace yet.
Supported usage today is direct repo tags (uses: thedaviddias/skill-check@v1 or @v1.x.y).
See docs/github-action-publishing.md for the publication playbook.
name: skill-check
on:
pull_request:
push:
branches: [main]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: thedaviddias/skill-check@v1
with:
path: .Use --format github for inline annotations on PRs:
- run: npx skill-check check . --format github --no-security-scanEnable security scan explicitly (default is disabled in the action):
name: skill-check-security
on:
pull_request:
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: thedaviddias/skill-check@v1
with:
path: .
security-scan: "true"
security-scan-install-policy: allow
security-scan-runner: pipxEmit SARIF and upload to GitHub Code Scanning:
name: skill-check-sarif
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
security-events: write
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: skillcheck
uses: thedaviddias/skill-check@v1
with:
path: .
format: sarif
sarif-file: reports/skill-check.sarif.json
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.skillcheck.outputs.sarif-file }}The action outputs:
exit-code: CLI exit codesarif-file: absolute path to SARIF file whenformat=sarifcommand: full command used for execution
format=sarif cannot be combined with security-scan=true in the action because security scan output is not SARIF.
- Ensure
maincontains the desiredaction.ymlandgithub-action/index.js. - Create and push an immutable version tag (example:
v1.2.0). - Move the major tag to the latest stable release (
v1->v1.2.0commit). - Verify a workflow using
uses: thedaviddias/skill-check@v1resolves the updated action.
Run skill-check rules to see all built-in rules with severity and fixable status.
Run skill-check rules <id> for detail on a specific rule.
| Rule | Default | Fixable |
|---|---|---|
frontmatter.required |
error | yes |
frontmatter.name_required |
error | yes |
frontmatter.description_required |
error | yes |
frontmatter.name_matches_directory |
error | yes |
frontmatter.name_slug_format |
error | yes |
frontmatter.name_max_length |
error | no |
frontmatter.field_order |
error | yes |
frontmatter.unknown_fields |
warn | no |
frontmatter.compatibility_max_length |
warn | no |
frontmatter.metadata_string_values |
warn | no |
frontmatter.allowed_tools_format |
warn | no |
description.non_empty |
error | no |
description.max_length |
error | no |
description.use_when_phrase |
warn | yes |
description.min_recommended_length |
warn | yes |
body.max_lines |
error | no |
body.max_tokens |
warn | no |
file.trailing_newline_single |
warn | yes |
links.local_markdown_resolves |
warn | no |
links.references_resolve |
warn | no |
duplicates.name |
warn | no |
duplicates.description |
warn | no |
All rules emit actionable suggestion text to guide fixes.
Releases are automated with semantic-release. Pushing to main (after CI passes) runs the release workflow: commits are analyzed for Conventional Commits (fix:, feat:, BREAKING CHANGE:), the version is bumped, CHANGELOG.md is updated, the package is published to npm, and a GitHub release is created.
- Commit messages are validated locally by commitlint (enforced by the
commit-msghook). Usefix:,feat:,docs:,chore:, etc. - npm auth: Use npm Trusted Publishing (OIDC) so you don’t need
NPM_TOKEN. On npmjs.com go to the skill-check package → Settings → Trusted publishing → add a GitHub Actions publisher with workflow filenamepublish.yml(exact name, including extension). Then the workflow can publish without any npm token. Alternatively, set theNPM_TOKENrepository secret for token-based publish.
To simulate a release locally (without publishing): pnpm run release:dry-run. It will fail verifyConditions without NPM_TOKEN and GITHUB_TOKEN; in CI both are set.
docs/quickstart.mddocs/github-action-publishing.mddocs/config.mddocs/rules.mddocs/plugins.mddocs/migration-from-agent-forge.md
Contributions are welcome. Please read CONTRIBUTING.md before opening a pull request.
Thanks goes to these people (emoji key):
David Dias 💻 📖 🚧 |
This project follows the all-contributors specification.
MIT - see LICENSE.
