Using it in CI
As a reusable GitHub Action (action.yml) —
pin to the latest release tag,
not @main:
- uses: pespinel/skillseal@v0.22.0
with:
path: ./skills
fail-on: error
min-score: 80
Or driven directly, e.g. to also run routing tests:
- uses: astral-sh/setup-uv@v3
- name: Check Agent Skills
run: uvx skillseal check ./skills --fail-on error --min-score 80
- name: Test Agent Skill Routing
run: uvx skillseal test ./skills --require-tests
--require-tests fails the gate if any discovered skill has no skillseal.yaml —
without it, a repo that has never written a routing test still exits 0
("skipped", not "passed"). The action (action.yml) only wraps check; run
skillseal test directly, as above, to gate on routing tests in CI.
This repo's own .github/workflows/ci.yml
does the same against examples/, plus lint/type-check/unit tests.
Large skill repos: only lint what changed
For a monorepo with many skills, --changed scopes discovery to skills with
a file that changed between two refs, instead of re-linting the whole tree
every run:
- name: Check changed Agent Skills
run: uvx skillseal check ./skills --changed --base-ref origin/main
check also accepts multiple explicit paths directly (skillseal check
a/SKILL.md b/SKILL.md) — that's what the pre-commit hook
below uses, for per-file scoping without needing a git ref at all.
GitHub code scanning
--format sarif turns findings into code-scanning alerts on the file/line
they fired on, instead of a log line someone has to go read:
- uses: astral-sh/setup-uv@v3
- name: Check Agent Skills (SARIF)
run: uvx skillseal check ./skills --format sarif > skillseal.sarif
continue-on-error: true # let the upload step run even if check exits 1
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: skillseal.sarif
Requires GitHub code scanning to be enabled for the repo (Settings → Code security → Code scanning). SECURITY-category findings are the natural fit here — they're the ones worth surfacing as an alert, not just a check-run comment.
pre-commit
Also pin rev to the latest release tag:
repos:
- repo: https://github.com/pespinel/skillseal
rev: v0.22.0
hooks:
- id: skillseal
Only lints the SKILL.md files that actually changed (pass_filenames:
true) — editing one skill in a large repo doesn't re-lint every other one.