Skip to main content

The ESLint of AI coding assistant instructions — audit, validate, and fix your Copilot skills, Cursor rules, and agent instruction files.

Project description

agentlint

CI PyPI Python License: MIT Discord

The ESLint of AI coding assistant instructions.

Audit, validate, and keep your GitHub Copilot skills, Cursor rules, and agent instruction files consistent with your actual codebase.


Why

AI coding assistants are only as good as their instructions. Instruction files drift silently:

  • A skill references a file that was renamed six months ago.
  • A threshold is hardcoded in a SKILL.md but the constant changed in source code.
  • Two skills have overlapping triggers — the agent picks randomly.
  • A skill was added to disk but never wired into the dispatch table.

None of this gets caught by markdownlint or yamllint. These are codebase-aware problems that require codebase-aware checks.


Quick start

pip install instruction-lint
cd your-project
agentlint

Or as a pre-commit hook (recommended — runs on every commit, zero maintenance):

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/Mr-afroverse/agentlint
    rev: v0.2.0
    hooks:
      - id: agentlint

What it checks

ID Check Severity Zero-config
AL-D01 Skill path in dispatch table → exists on disk Error
AL-D02 Skill file on disk → referenced in dispatch table Error
AL-F01 Source-file paths in skill files → exist on disk Warning
AL-N01 Threshold numbers → have a source pointer Warning
AL-T01 Trigger descriptions → no significant overlap Warning
AL-P* Forbidden patterns (built-in defaults + configurable) Error
AL-E01 .env vs .env.example key parity Error
AL-C01 Cross-file value consistency groups Error

The first six checks work out of the box with no configuration. AL-E01 and AL-C01 are config-driven — add rules in .agentlint.yml to activate them.


Supported assistants

Assistant Monolithic File Modular Rules Directory Format Detected
GitHub Copilot .github/copilot-instructions.md + .github/skills/**/SKILL.md
Cursor .cursorrules + .cursor/rules/*.mdc
Windsurf .windsurfrules + .windsurf/rules/*.md
Aider .aider.conf.yml + .aider/rules/*.md
Continue.dev .continuerules + .continue/rules/*.md

Multiple formats can be active at once. agentlint auto-detects which are present.


Example output

[agentlint] 2 error(s), 1 warning(s) across 8 file(s).  Grade: C

  .github/skills/gps-scorer/SKILL.md
    ✖ [AL-D02]:1  Skill `gps-scorer` is not referenced in the dispatch file.
      Fix → Add an entry for `.github/skills/gps-scorer/SKILL.md` in the dispatch table.

  .github/copilot-instructions.md
    ✖ [AL-D01]:14  Skill path not found on disk: `.github/skills/old-scorer/SKILL.md`
      Fix → Create the file or correct the path in the dispatch table.

  .github/skills/eudr-standards/SKILL.md
    ⚠ [AL-N01]:48  Threshold number without source pointer: `| GREEN ≥ 90% |`
      Fix → Add '(Source: constants.py)' or a regulatory article reference.

Health scoring

Every run produces a grade (A–F) based on error and warning density across scanned files. Use it to track skill health over time in your CI dashboard.

Grade: A  → no violations, or up to 2 warnings per file
Grade: B  → up to 3–4 warnings per file, or 1 error in a large repo
Grade: C  → 6 warnings per file, or 1 error per small file
Grade: D  → 2 errors per file, or many warnings
Grade: F  → 3+ errors per file, or high combined density

The score formula is 100 − (errors_per_file × 20) − (warnings_per_file × 5). Grades A–F map to score bands 90 / 80 / 70 / 60 / below 60.

Pipe --format json into your CI annotation step:

agentlint --format json | tee agentlint-report.json

Or emit SARIF for GitHub Code Scanning:

agentlint --format sarif | tee agentlint.sarif

Configuration

agentlint works with zero config. Add .agentlint.yml to extend or override defaults:

# .agentlint.yml

# Add project-specific forbidden patterns (extends built-in defaults)
forbidden_patterns:
  - id: MY001
    pattern: '\b8-stage pipeline\b'
    reason: "Pipeline has 7 stages  this count will drift."
    fix: "Use '7-stage' and add a pointer to orchestrator.py."
    severity: error

# Adjust trigger-overlap sensitivity (0.0–1.0, default 0.5)
trigger_overlap_threshold: 0.6

# Add extra source-root directories for file-reference resolution
source_roots: [".", "src", "backend"]

# Add project-specific source markers (extends built-in list)
source_markers:
  - "my_constants\\.py"
  - "REGULATORY_GATES"

# Disable specific checks
checks:
  trigger-overlap: false

# Re-classify individual check severity ("error" | "warning")
severity_overrides:
  AL-N01: error    # promote number-sourcing from warning to error
  AL-T01: warning  # demote trigger-overlap from default to warning

# Fail the run when warnings are present (default: only errors fail)
fail_on_warnings: true

# Paths to skip (substring match on the file path)
ignore_paths:
  - "archive/"
  - "docs/health/"

# ── v0.2 features ────────────────────────────────────────────

# Glob patterns for extra documentation files to scan with AL-P* and AL-F01
extra_paths:
  - "docs/**/*.md"
  - "*.md"

# .env vs .env.example key parity (AL-E01)
config_parity:
  - source: ".env"
    template: ".env.example"
    severity: error

# Cross-file value consistency groups (AL-C01)
consistency_groups:
  - id: test-count
    pattern: '\b(\d+)\s+passed'
    files: ["README.md", "CONTRIBUTING.md", "docs/RELEASE.md"]
    severity: error

Replace built-in forbidden patterns entirely

forbidden_patterns_mode: replace
forbidden_patterns:
  - id: PROJ001
    pattern: '\blegacy_mode\b'
    reason: "legacy_mode was removed in v2."
    fix: "Delete the flag entirely."
    severity: error

Layer 2: Behavioral testing

The checks above are static — they analyse files without running the agent. To test whether your skills actually fire correctly and produce sound guidance, use the included behavioral test sheet:

agentlint --init   # copies SKILL_HEALTH_CHECK.md into .github/skills/

The template contains 10 ready-to-run prompts with explicit PASS/FAIL criteria covering trigger accuracy, over-firing prevention, source-pointer discipline, multi-skill invocation, and more.


GitHub Action

# .github/workflows/agentlint.yml
name: agentlint
on: [push, pull_request]

jobs:
  agentlint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Mr-afroverse/agentlint@v0.2.0

Action inputs

Input Default Description
path . Directory to scan
format text Output format — text, json, sarif, or badge
adapter auto Force adapter — copilot, cursor, windsurf, aider, continue, or auto
fail-on-warnings false Exit 1 when warnings are present

Example — fail the build on warnings:

- uses: Mr-afroverse/agentlint@v0.2.0
  with:
    fail-on-warnings: true

Example — emit SARIF for GitHub Code Scanning:

- name: Install agentlint
  run: pip install instruction-lint
- name: Run agentlint (SARIF)
  run: agentlint --format sarif > agentlint.sarif
- name: Upload SARIF
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: agentlint.sarif

CLI reference

Usage: agentlint [OPTIONS] [PATH]

  agentlint — audit AI coding assistant instruction files.

Options:
  -V, --version                   Show the version and exit.
  --format [text|json|sarif|badge]
                                  Output format (default: text). 'badge' writes
                                  agentlint-badge.svg to disk.
  --config PATH                   Path to .agentlint.yml config file.
  --adapter [copilot|cursor|windsurf|aider|continue|auto]
                                  Force a specific adapter (default: auto-
                                  detect).
  --fail-on-warnings              Exit 1 when warnings are present (overrides
                                  config).
  --init                          Copy SKILL_HEALTH_CHECK.md template into
                                  .github/skills/.
  --watch                         Re-run on file changes. Requires: pip
                                  install 'instruction-lint[watch]'.
  -h, --help                      Show this message and exit.

Development

git clone https://github.com/Mr-afroverse/agentlint
cd agentlint
pip install -e ".[dev]"  # or: pip install instruction-lint
pytest

License

MIT — 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

instruction_lint-0.2.0.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

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

instruction_lint-0.2.0-py3-none-any.whl (34.6 kB view details)

Uploaded Python 3

File details

Details for the file instruction_lint-0.2.0.tar.gz.

File metadata

  • Download URL: instruction_lint-0.2.0.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for instruction_lint-0.2.0.tar.gz
Algorithm Hash digest
SHA256 0efc1263f957f7839a4ee2862337ea7d63092fd6aa6b8889a90599761cf029a2
MD5 e9b3c6460619d53c0e5dc9a4cad5691f
BLAKE2b-256 b57b24528c869f8174e111f340414f0788aefe71757d5cf36d8cfcd12528fadc

See more details on using hashes here.

File details

Details for the file instruction_lint-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for instruction_lint-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d98c0698b03fe3939e38323d2f58b4c6f23735f920a0b626026900fdf13192e2
MD5 ac7bbf9865a313b2b46335660be3c14f
BLAKE2b-256 267695c43eaed8e57c7a539e71c3b97c4730d7ead4bc0b9ba37f2bb3c31b8f13

See more details on using hashes here.

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