Config drift for AI workflows.

Know what your agents read.

Every PR, agentlint reviews your rules, hooks, and skills, and inline-comments on contradictions, broken pointers, and hooks that silently drop your config.

  • Comments only — read your code, write PR comments, nothing else.
  • 5 free audits on every private repo. Unlimited on OSS.
  • Public report URLs expire after 30 days. Never trains on your rules.

What you'll see in your next PR

An inline review comment, anchored to the line that broke. Quiet on clean PRs.

agentlint bot commented on .cursor/rules/db.mdc · line 12

P0 Inline-SQL rule contradicts AGENTS.md

---
globs: ["*.sql", "src/routes/**/*.ts"]
alwaysApply: false
---
# Database queries

Inline raw SQL in route handlers for the lowest possible latency.

AGENTS.md (always-loaded) requires every SQL statement to go through db/queries.ts so input sanitization stays in one place. This new Cursor rule auto-attaches when the agent edits any *.sql or route file and tells it to inline raw SQL instead. Cursor users will write inline; Claude Code users will use the helper. The codebase will diverge in three weeks and the next contributor inherits two patterns.

Suggested change
# Database queries

Use the helpers in db/queries.ts. They centralise
parameter binding and connection pooling. Adding a
new query means adding a new exported function there,
not inlining SQL at the call site.
Posted on acme/dashboard #847 · React 👎 to flag false positive · Every flagged finding gets reviewed

Three things a code reviewer can't see

Your agent reads more than your code. agentlint reads it too.

01

Broken pointers in your rules

AGENTS.md tells the agent to read scripts/seed-fixtures.ts. The file was renamed four commits ago. The agent follows the link, finds nothing, falls through to whatever else it can find. agentlint flags it the moment the rename ships.

From a real audit AGENTS.md:13 → ./scripts/seed-fixtures.ts Deterministic — no LLM call.
02

Hooks that don't match the harness spec

Your SessionStart hook emits { "additionalContext": "..." }. The Claude Code spec is additional_context. The harness silently drops the field. Your context never reaches the model. agentlint fetches the live spec from each harness vendor (Claude Code, Cursor, Aider, Codex) at audit time and cross-checks every field name.

From a real audit session-start.sh — emits camelCase, spec uses snake_case
03

Skills that contradict your rules

AGENTS.md (always-loaded) tells the agent to use db/queries.ts for SQL. A Cursor rule (auto-attached on *.sql) tells it to inline SQL in route handlers. Cursor users follow one rule, Claude Code users the other. The codebase forks in the open. agentlint flags the contradiction with the load conditions of both files quoted side-by-side.

From a real audit AGENTS.md (always-loaded) ⇄ .cursor/rules/db.mdc (auto-attach)

Setup

Two clicks. No config. Lives entirely in your PR flow.

  1. 1
    Install the GitHub App on the repos you want audited. Read access to file contents, write access to PR and issue comments. Nothing else.
  2. 2
    agentlint runs an initial audit on the default branch and opens one issue with the findings. Public read-only report at agentlint.net/r/<id>.
  3. 3
    Every PR that touches a rules file, hook, or skill gets reviewed inline. Quiet on clean PRs. Comments only — no commits, no merge gates.

Pricing

Per repo. Cancel anytime. Free for OSS, forever.

Free

$0/forever

No card. No contract. No catch.

  • 5 audits per private repo
  • Unlimited audits on public & OSS repos
  • Every check (P0 / P1 / nit)
  • Public read-only reports
  • 30-day audit history
Install on GitHub

Install in under a minute. Upgrade only if you keep using it.

Larger team? team@agentlint.net — volume pricing available for orgs with 10+ active repos.

FAQ

Four questions worth answering up front.

What does agentlint actually read?

The agent-rules surface only — CLAUDE.md, AGENTS.md, GEMINI.md, every .cursor/rules/*.mdc, .cursorrules, .clinerules, .windsurfrules, .aider.conf.yml, every .claude/skills/*/SKILL.md, every .claude/agents/*.md subagent, harness configs (settings.json, .cursor/hooks.json), and every hook script in .claude/hooks/. We follow markdown-link cross-references one level deep so the auditor can compare a rule against the file it points at.

Why not just use CodeRabbit, Greptile, or Copilot?

Use both. Code reviewers review your code. agentlint reviews the rules your agents follow. They are not the same surface area: a contradicting rule in AGENTS.md is invisible to a code reviewer, but it changes what your agent does on every turn.

Where's my data stored, and what model reads it?

Your bundled rule files are sent to Cloudflare Workers AI — currently gpt-oss-120b via the agentlint AI Gateway — for the audit, then discarded. Findings are stored in Cloudflare KV with a 30-day TTL. We never train on your rules. The model can be swapped if quality slips; the change would land on the changelog.

What if I disagree with a finding?

React 👎 on the comment. We review every flagged finding and tune the prompt to stop emitting that pattern. Per-finding dismiss commands and persistent # agentlint: ignore markers are on the roadmap — see changelog.

Install on GitHub See another sample audit

Install agentlint. Find out what your next PR is actually telling your agent.

Install on GitHub

5 free audits on every private repo. Unlimited on OSS, forever. No card.