Skip to main content

Lint AI coding agent git diffs using static analysis.

Project description

agentlint

CI Python License

agentlint is a Python CLI that lints AI coding-agent git diffs for common risky patterns using static analysis only (no LLM calls).

Install

pip install ai-agentlint

For local development:

pip install -e ".[dev]"

Quick Start

Basic check against last commit:

agentlint check

Check staged changes:

agentlint check --staged

Check a commit range:

agentlint check HEAD~3..HEAD

Pipe a diff through stdin:

git diff | agentlint check --stdin

Provide task context for scope-aware checks:

agentlint check --task "only update parser error handling"

JSON output for automation:

agentlint check --format json

Markdown output for PR comments:

agentlint check --format markdown

Available report formats: text (default), json, and markdown.

Checks

  • scope_drift: Warns when changed files appear unrelated to --task. Example: task is "parser bugfix" but diff edits infra/main.tf.
  • secret_leak: Errors on likely credential leaks (AWS/GitHub tokens, passwords, private keys, DB URLs). Example: added line password = "supersecret123".
  • test_regression: Warns when test lines are deleted without replacement or tests are changed off-task. Example: delete tests/test_api.py assertions and add no test updates.
  • config_vandalism: Warns for CI/infra/lock-file edits outside scope. Example: modify .github/workflows/ci.yml in a docs-only task.
  • dependency_injection: Warns when new dependencies are introduced unexpectedly. Example: add flask==3.0.0 to requirements.txt without dependency-related task text.
  • todo_bombs: Warns/errors on TODO/FIXME/HACK spikes. Example: adding 4 TODO markers raises an error.
  • mcp_permissions: Errors on dangerous MCP server configuration patterns. Example: .mcp.json with "autoApprove": true or "autoApprove": ["*"] (related to CVE-2026-21852 auto-approve bypass).
  • permission_escalation: Errors on risky patterns (sudo, permissive chmod, eval, exec, shell=True, os.system). Example: subprocess.run(cmd, shell=True).
  • dead_code: Warns on added commented-out code blocks (5+ lines). Example: pasting a large block of # old implementation lines.

Configuration

agentlint discovers .agentlint.toml by walking up from the current directory.

disabled_checks = ["scope_drift"]

[severity]
todo_bombs = "error"
config_vandalism = "info"

[ignore]
secret_leak = ["tests/fixtures/*"]
scope_drift = ["docs/*"]

[secrets]
allowed_patterns = ["^dummy_token_for_tests$"]

CLI config controls:

  • --config PATH: Load config from explicit file.
  • --no-config: Ignore discovered config files.

GitHub Actions

Use the bundled composite action in this repository to lint PR diffs and post markdown results as a pull request comment.

name: agentlint
on:
  pull_request:

permissions:
  contents: read
  pull-requests: write

jobs:
  lint-diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - run: git fetch origin main --depth=1
      - uses: ./
        id: agentlint
        with:
          fail-on-error: true
          fail-on-warning: false
          format: markdown
          comment: true
          python-version: "3.12"
      - if: always()
        run: |
          echo "exit-code=${{ steps.agentlint.outputs.exit-code }}"
          printf '%s\n' "${{ steps.agentlint.outputs.report }}"

Context File Validation

Beyond linting git diffs, agentlint can validate your context files (AGENTS.md, CLAUDE.md, GEMINI.md) directly for staleness, bloat, and internal conflicts.

agentlint check-context

Or target a specific file:

agentlint check-context CLAUDE.md --format json

Context checks

ID Severity What it catches
CTX001 warning path-rot — file/dir paths mentioned in the context file that no longer exist
CTX002 warning script-rotnpm run <script> references missing from package.json
CTX003 warning/error bloat — context files >8k chars (warning) or >15k chars (error); per ETH Zurich ICSE 2026, stale context adds ~20% token overhead
CTX004 info stale-todos — TODO/FIXME/HACK/XXX markers that may confuse agents
CTX005 warning year-rot — references to 2023 or earlier may be outdated guidance
CTX006 warning multi-file-conflict — conflicting test/build commands across multiple context files

Freshness score

Every run produces a freshness score (0–100). Each finding deducts points:

  • error: −15
  • warning: −5
  • info: −2

A score below 70 suggests the context file needs a cleanup pass.

Works alongside agentlint check

agentlint check lints what agents write (git diffs). agentlint check-context lints what agents read (context files). Together they cover the full agent quality surface.

CI integration

Add a weekly context health check with the bundled GitHub Action:

- uses: mikiships/agentlint@main
  with:
    mode: context-check
    # context-file: AGENTS.md  # optional, auto-detected otherwise

See .github/workflows/examples/agentlint-context-check.yml for a full example.

Why agentlint?

  • Enforces deterministic, static checks suitable for CI gates.
  • Focuses on agent-specific failure patterns in patch output.
  • Fast enough to run on every PR and staged commit.

Part of the Agent Toolkit

agentlint is one of three tools for AI coding agent quality:

  • coderace — Race coding agents against each other on real tasks. Automated, reproducible, scored comparisons.
  • agentmd — Generate and score context files (CLAUDE.md, AGENTS.md, .cursorrules) for AI coding agents.
  • agentlint — Lint AI agent git diffs for risky patterns. Static analysis, no LLM required.

Measure (coderace) → Optimize (agentmd) → Guard (agentlint).

Contributing

  1. Create a branch.
  2. Add or update checks/tests/docs together.
  3. Run pytest -v --cov=agentlint --cov-report=term-missing.
  4. Open a PR with a short rationale and sample diff cases.

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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

ai_agentlint-0.4.2-py3-none-any.whl (30.3 kB view details)

Uploaded Python 3

File details

Details for the file ai_agentlint-0.4.2-py3-none-any.whl.

File metadata

  • Download URL: ai_agentlint-0.4.2-py3-none-any.whl
  • Upload date:
  • Size: 30.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for ai_agentlint-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 9c933269c24abc5faab7f1033a32a7615e76d421d926acf3bfcc7ffe33bf8f84
MD5 69486c6336fe056ca6ebd5fd718a18fe
BLAKE2b-256 37b0980c244762b3f6b2872f90003582828979dfc51a8e13c60335b2cdd8004d

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