Skip to main content

Quality linter for AI agent skill files — readability, clarity, and graph integrity checks

Project description

skillscan-lint

CI PyPI Docker Hub License Python

Quality linter for AI agent skill files. Catches weasel words, ambiguous instructions, missing metadata, and skill graph problems (cycles, dangling references, broken file links) before they reach production.

Works with skills from skills.sh, ClawHub, and any SKILL.md-based skill package.


Install

pip install skillscan-lint

Or run without installing:

docker run --rm -v "$PWD:/work" kurtpayne/skillscan-lint scan /work/skills/

Quick Start

# Lint a single skill file
skillscan-lint scan SKILL.md

# Lint an entire skills directory (including graph checks)
skillscan-lint scan ./skills/ --graph

# Output as JSON for CI integration
skillscan-lint scan ./skills/ --format json

# List all rules
skillscan-lint rules

Example output

SKILL.md
  QL-004  WARNING  Weasel intensifier "basically" weakens the instruction.
  QL-009  ERROR    Description too short (8 words). Minimum is 10.
  QL-015  WARNING  TODO marker found — remove before publishing.
  GR-002  ERROR    Skill "data-fetcher" references "parser" which does not exist.
  GR-006  WARNING  Broken file reference: "references/auth.md" does not exist.

2 errors, 3 warnings

Rules

skillscan-lint ships with two rule families:

Quality rules (QL-*)

Rule Severity What it catches
QL-001 WARNING Passive voice in instructions
QL-004 WARNING Weasel intensifiers (basically, very, essentially)
QL-008 WARNING Vague verbs (handle, manage, deal with)
QL-009 ERROR Description too short (< 10 words)
QL-010 WARNING Description too long (> 150 words)
QL-011 ERROR Missing description field
QL-012 ERROR Missing name field
QL-013 WARNING Name not in snake_case
QL-014 WARNING Missing version field
QL-015 WARNING TODO/FIXME marker in body
QL-016 WARNING Superlatives (best, perfect, ultimate)
QL-017 WARNING Nominalisations (optimizationoptimize)
QL-018 WARNING Redundant phrases (end result, past history)
QL-019 WARNING Buzzwords (leverage, synergy, paradigm)
QL-020 WARNING Hedging language (might, could possibly)
QL-021 ERROR Sentence too long (> 35 words)
QL-022 WARNING Instruction body too long (> 500 lines)
QL-023 WARNING Missing ## Usage or ## Overview section
QL-024 WARNING Missing ## Examples section

Run skillscan-lint rules for the full list with descriptions.

Graph rules (GR-*, requires --graph)

Graph rules analyze the invocation graph across a skills directory — which skills call which, what files they reference, and whether the dependency structure is sound.

Rule Severity What it catches
GR-001 ERROR Cycle in skill invocation graph (A → B → A)
GR-002 ERROR Dangling reference (skill invokes a skill that doesn't exist)
GR-003 WARNING Orphan entry-point (invokes others but is never invoked — add entry_point: true if intentional)
GR-004 WARNING Hub skill (unusually high in-degree — single point of failure)
GR-005 WARNING Undocumented dependency (referenced skill has no ## Usage or ## Overview section)
GR-006 WARNING Broken intra-skill file reference (Markdown link points to a .md file that doesn't exist)

Graph edges are resolved from three sources, in order of reliability:

  1. Front-matter keysinvoke:, calls:, depends_on:, uses:, requires: with skill names or file paths
  2. Markdown links to SKILL.md files[skill name](../other-skill/SKILL.md)
  3. Path resolution — front-matter values containing / or ending in .md are resolved relative to the skill file

Reference docs, README files, and other supporting .md files within a skill package are not treated as graph nodes — they are checked by GR-006 for broken links instead.


CI Integration

GitHub Actions

- name: Lint skills
  run: |
    pip install skillscan-lint
    skillscan-lint scan ./skills/ --graph --format json > report.json

Pre-commit hook

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/kurtpayne/skillscan-lint
    rev: v0.3.0
    hooks:
      - id: skillscan-lint
        args: [--graph]

Docker in CI

- name: Lint skills
  run: |
    docker run --rm -v "${{ github.workspace }}:/work" \
      kurtpayne/skillscan-lint scan /work/skills/ --graph --format json \
      > skillscan-lint-report.json

Skill Graph Example

Given a skills directory:

skills/
  data-fetcher/SKILL.md   (invoke: parser)
  parser/SKILL.md         (invoke: data-fetcher)   ← cycle!
  formatter/SKILL.md      (invoke: missing-skill)  ← dangling ref

Running skillscan-lint scan ./skills/ --graph will report:

GR-001  ERROR    Cycle detected: data-fetcher → parser → data-fetcher
GR-002  ERROR    Skill "formatter" references "missing-skill" which does not exist.

Related

  • skillscan-security — Security scanner for AI skills: prompt injection, IOC matching, malware detection, ML-based classifier
  • skills.sh — Community registry of AI agent skills
  • ClawHub — MCP skill marketplace

License

Apache-2.0. See LICENSE.

Project details


Download files

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

Source Distribution

skillscan_lint-0.3.1.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

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

skillscan_lint-0.3.1-py3-none-any.whl (26.7 kB view details)

Uploaded Python 3

File details

Details for the file skillscan_lint-0.3.1.tar.gz.

File metadata

  • Download URL: skillscan_lint-0.3.1.tar.gz
  • Upload date:
  • Size: 31.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for skillscan_lint-0.3.1.tar.gz
Algorithm Hash digest
SHA256 be1a3f654beb1765f728fc073c2e11b2819d51dce599c4e28e9e5b2eabc3a39e
MD5 8d75321d747faaf50d6cc0e885416687
BLAKE2b-256 dd3faffdcff653e23ae5bcc0d04b1d0fc3db02e097c91d8e296227babc4309d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillscan_lint-0.3.1.tar.gz:

Publisher: release-pypi.yml on kurtpayne/skillscan-lint

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

File details

Details for the file skillscan_lint-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: skillscan_lint-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 26.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for skillscan_lint-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d95e9ac1302661692933640867e85678f81e9a42d2358f9714cfedc8ebc8f3a1
MD5 090e618a0baf2a738004146f23c896b7
BLAKE2b-256 bb2884c77ca4a760694c42adcf9601b542a3e4091f9c570fa03b9f7b9a1d9a9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillscan_lint-0.3.1-py3-none-any.whl:

Publisher: release-pypi.yml on kurtpayne/skillscan-lint

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page