Lint + Intent

Make slop illegal. Give your AI agent a map to write clean code.

Linters say what's wrong — lintent explains why and how to fix it.

❌ Raw Linter

{
  "code": "F401",
  "message": "`os` imported but unused"
}

AI: deletes the import 🤷

✅ With lintent

{
  "code": "F401",
  "semantic": {
    "illegal": "Unused imports",
    "legal": "Remove, or # noqa for side-effects",
    "why": "Clean deps, faster startup"
  }
}

AI: understands the intent


🚀 Quickstart: Let Your Agent Set It Up

Copy this prompt to your AI agent:

Set up lintent in this project for semantic linting:

1. Install: npm install -g lintent
2. Initialize: lintent init
3. Run: lintent run --pretty
4. Fix violations using semantic context (illegal/legal/why)
5. Check summary.without_semantic - if > 0, help me add custom rules:
   - Run: lintent guide customize
   - For each violation without semantic context, analyze my codebase patterns
   - Ask me about conventions and exceptions
   - Add rules to lintent.yaml
6. Create .cursor/rules/lintent.mdc with:
   - Always run `lintent run --pretty` before fixing lint issues
   - Use semantic context to understand violations
   - Follow the "legal" guidance, don't just delete code
Set up lintent for semantic linting in this project:

1. Run: npm install -g lintent
2. Run: lintent init
3. Run: lintent run --pretty
4. Fix violations using semantic context (illegal/legal/why)
5. Check summary.without_semantic count. If > 0:
   - Run: lintent guide customize
   - Analyze codebase for patterns
   - Ask me about our conventions
   - Create custom rules in lintent.yaml
6. Add to CLAUDE.md:
   ## Linting
   - Run `lintent run --pretty` before fixing lint issues
   - Use semantic context: illegal (what's wrong), legal (how to fix), why (reasoning)
   - Follow "legal" guidance, don't just delete code
Set up lintent for semantic linting in this project:

1. Install: npm install -g lintent
2. Initialize: lintent init  
3. Run: lintent run --pretty
4. Fix violations using semantic fields (illegal/legal/why)
5. If summary.without_semantic > 0, customize rules:
   - Run: lintent guide customize
   - Search codebase for patterns related to violations
   - Ask about conventions and exceptions
   - Add project-specific rules to lintent.yaml
6. Add to AGENTS.md:
   ## Linting
   - Run `lintent run --pretty` before fixing lint issues
   - Use semantic context (illegal/legal/why)
   - Follow "legal" guidance, don't just delete code

Get Started → View on GitHub


The Problem: AI Agents Need Context

❌ Without lintent

{
  "code": "F401",
  "message": "`os` imported but unused"
}

AI: deletes the import

But what if it was for side effects? What's the principle?

✅ With lintent

{
  "code": "F401",
  "semantic": {
    "illegal": "Unused imports",
    "legal": "Import only what you use, or # noqa for side-effects",
    "why": "Clean deps, faster startup"
  }
}

AI understands the intent.


Why lintent?

🎯 Semantic Context

Every violation includes illegal, legal, and why — the full picture for intelligent fixes.

⚡ Zero Config

Auto-detects ruff, pyright, eslint, and tsc from your existing config files. Just run it.

🤖 Agent-First

JSON output optimized for LLMs. Includes lintent guide for injectable AI instructions.

📦 Presets Included

Start with semantic rules for common violations. Customize as you grow.

🔧 Your Linters

lintent runs YOUR existing linters. No new tool to learn — just enriched output.

📊 Full Visibility

See which linters ran, which failed, and track semantic coverage over time.


Supported Linters

🐍 ruff 🐍 pyright 📜 eslint 📜 typescript

Coming soon: Rust (clippy), Go (golangci-lint), Java (checkstyle), and more.


Manual Setup

# Install
npm install -g lintent

# Initialize with preset
lintent init --preset python    # or typescript

# Run
lintent run --pretty

# Get AI guide
lintent guide

Pro tip

Run lintent guide to get an injectable AI guide tailored to your project.

[Full Documentation →](getting-started/installation.md){ .btn .btn-primary } [Cursor Integration](guides/cursor-integration.md){ .btn .btn-secondary }