Skip to main content

Real-time quality guardrails for AI coding agents

Project description

agentlint

Real-time quality guardrails for AI coding agents.

AI coding agents drift during long sessions — they introduce API keys into source, skip tests, force-push to main, and leave debug statements behind. AgentLint catches these problems as they happen, not at review time.

What it catches

AgentLint ships with 10 universal rules that work with any tech stack:

Rule Severity What it does
no-secrets ERROR Blocks writes containing API keys, tokens, passwords
no-env-commit ERROR Blocks writing .env and credential files
no-force-push ERROR Blocks git push --force to main/master
no-destructive-commands WARNING Warns on rm -rf, DROP TABLE, git reset --hard
dependency-hygiene WARNING Warns on ad-hoc pip install / npm install
max-file-size WARNING Warns when a file exceeds 500 lines
drift-detector WARNING Warns after many edits without running tests
no-debug-artifacts WARNING Detects console.log, print(), debugger left in code
test-with-changes WARNING Warns if source changed but no tests were updated
no-todo-left INFO Reports TODO/FIXME comments in changed files

ERROR rules block the agent's action. WARNING rules inject advice into the agent's context. INFO rules appear in the session report.

Quick start

pip install agentlint
cd your-project
agentlint setup

That's it! AgentLint hooks are now active in Claude Code. The setup command:

  • Installs hooks into .claude/settings.json
  • Creates agentlint.yml with auto-detected settings (if it doesn't exist)

To remove AgentLint hooks:

agentlint uninstall

Installation options

# Install to project (default)
agentlint setup

# Install to user-level settings (~/.claude/settings.json)
agentlint setup --global

Claude Code marketplace

Add the AgentLint marketplace and install the plugin:

/plugin marketplace add mauhpr/agentlint
/plugin install agentlint@agentlint

Local plugin (development)

claude --plugin-dir /path/to/agentlint/plugin

Manual hook configuration

Add to your project's .claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash|Edit|Write",
        "hooks": [{ "type": "command", "command": "agentlint check --event PreToolUse" }]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [{ "type": "command", "command": "agentlint check --event PostToolUse" }]
      }
    ],
    "Stop": [
      {
        "hooks": [{ "type": "command", "command": "agentlint report" }]
      }
    ]
  }
}

Configuration

Create agentlint.yml in your project root (or run agentlint init):

# Auto-detect tech stack or list packs explicitly
stack: auto

# strict: warnings become errors
# standard: default behavior
# relaxed: warnings become info
severity: standard

packs:
  - universal

rules:
  max-file-size:
    limit: 300          # Override default 500-line limit
  drift-detector:
    threshold: 5        # Warn after 5 edits without tests (default: 10)
  no-secrets:
    enabled: false      # Disable a rule entirely

# Load custom rules from a directory
# custom_rules_dir: .agentlint/rules/

Custom rules

Create a Python file in your custom rules directory:

# .agentlint/rules/no_direct_db.py
from agentlint.models import Rule, RuleContext, Violation, Severity, HookEvent

class NoDirectDB(Rule):
    id = "custom/no-direct-db"
    description = "API routes must not import database layer directly"
    severity = Severity.WARNING
    events = [HookEvent.POST_TOOL_USE]
    pack = "custom"

    def evaluate(self, context: RuleContext) -> list[Violation]:
        if not context.file_path or "/routes/" not in context.file_path:
            return []
        if context.file_content and "from database" in context.file_content:
            return [Violation(
                rule_id=self.id,
                message="Route imports database directly. Use repository pattern.",
                severity=self.severity,
                file_path=context.file_path,
            )]
        return []

Then set custom_rules_dir: .agentlint/rules/ in your config.

See docs/custom-rules.md for the full guide.

How it works

AgentLint hooks into Claude Code's lifecycle events:

  1. PreToolUse — Before Write/Edit/Bash calls. Can block the action (exit code 2).
  2. PostToolUse — After Write/Edit. Injects warnings into the agent's context.
  3. Stop — End of session. Generates a quality report.

Each invocation loads your config, evaluates matching rules, and returns JSON that Claude Code understands. Session state persists across invocations so rules like drift-detector can track cumulative behavior.

Comparison with alternatives

Project How AgentLint differs
guardrails-ai Validates LLM I/O. AgentLint validates agent tool calls in real-time.
claude-code-guardrails Uses external API. AgentLint is local-first, no network dependency.
Custom hooks Copy-paste scripts. AgentLint is a composable engine with config + plugins.
Codacy Guardrails Commercial, proprietary. AgentLint is fully open source.

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT

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

agentlint-0.1.0.tar.gz (73.8 kB view details)

Uploaded Source

Built Distribution

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

agentlint-0.1.0-py3-none-any.whl (27.3 kB view details)

Uploaded Python 3

File details

Details for the file agentlint-0.1.0.tar.gz.

File metadata

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

File hashes

Hashes for agentlint-0.1.0.tar.gz
Algorithm Hash digest
SHA256 838bf22295e0bacdb2044b068240644a4d39660d83592e2c4de9f8c2b978aed5
MD5 c8449c08baffabdbd135eaf00eca69db
BLAKE2b-256 e3d061e3d993b7acace40153390bc5153a88bd624f0d007c3637e9c1790b5d35

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentlint-0.1.0.tar.gz:

Publisher: publish.yml on mauhpr/agentlint

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

File details

Details for the file agentlint-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for agentlint-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c35722f260545621403d48f3e9d2117e33cf940251f8cbdc22cfbce62d92325e
MD5 4639a11d21394e49d985ceb1d049fad0
BLAKE2b-256 825c8d8d62de2dd774634854d8b6a26fcab6be20a5b4cba6762b68e6ccb1c617

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentlint-0.1.0-py3-none-any.whl:

Publisher: publish.yml on mauhpr/agentlint

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