Skip to content
LintLang 0.6.0 · Python 3.10+ · Apache-2.0Local · deterministic · zero LLM

Static analysis for agent language

Lint the instructions your agents execute.

LintLang catches ambiguous tools, missing limits, conflicting directives, and schema mismatches in AGENTS.md, prompts, configuration, and Python source—before a model runs.

Run onceno install
$ uvx --from lintlang==0.6.0 lintlang scan AGENTS.md

REVIEW — 2 MEDIUM

H1.6 tool:search_docs ↔ tool:search_guides
Descriptions do not state how these tools differ.
Inputs
Text · YAML · JSON · Python
Files, directories, or stdin
Outcomes
PASS · REVIEW · FAIL · ERROR
Nonblocking by default
CI formats
Terminal · JSON · SARIF 2.1.0
Stable rule IDs and honest locations
Runtime
PyYAML only
No model, API, telemetry, or network call

Browser playground · LintLang 0.6.0

Put one real instruction set through the linter.

Run the example below, or paste your own prompt, tool definition, or configuration. The actual LintLang engine runs locally in your browser.

Local executionZero LLM calls
01 · Input

Your instructions

437 / 20,000
Example reference · expected resultFAILH1.2 · H2 · H1.6Compare the original and improved examples by running a scan on each.
Input stays in this browser and is never stored.

The first scan downloads the Python runtime and LintLang, so it may take a moment. Later scans reuse the loaded engine.

02 · Result

Deterministic findings

Ready when you are.

Run the loaded example to see its findings. Then load the improved example and scan again to compare.

No model · no upload · no account

Want the repeatable workflow?

Use the CLI in CI Request a review
01

Ambiguous tools

Descriptions that are empty, vague, overlapping, or missing the words that distinguish neighboring tools.

02

Missing constraints

Retry loops, tool-using instructions, and workflows that omit limits, stop conditions, or progress checks.

03

Contract mismatches

Tool descriptions that disagree with schemas, conflicting output requirements, and malformed message roles.

04

Embedded prompts

Prompt text and uncalibrated thresholds extracted from Python source without executing the application.

1Run onceuvx --from lintlang==0.6.0 lintlang scan AGENTS.md
2Review the baseline

Fix findings or record why the language is intentional.

3Gate deliberatelylintlang scan AGENTS.md --fail-on fail

A normal scan reports findings without failing the process. --fail-on failblocks only HIGH and CRITICAL findings; --fail-on review also blocks MEDIUM findings. Missing or malformed requested inputs remain errors either way.

GitHub Action

Scan a chosen instruction path on every push or pull request. lintlang init --github writes a pinned Code Scanning workflow instead.

- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
  with:
    persist-credentials: false
- uses: hermes-labs-ai/lintlang@v0.6.0
  with:
    path: AGENTS.md
Action setup

pre-commit

Scan the configured paths before each commit. Findings stay advisory until you add --fail-on fail.

repos:
  - repo: https://github.com/hermes-labs-ai/lintlang
    rev: v0.6.0
    hooks:
      - id: lintlang
        args: [AGENTS.md]
pre-commit setup

Claude Code plugin

A non-blocking PostToolUse hook returns repair guidance after Write or Edit changes a supported file.

$ pipx install lintlang==0.6.0

# then, inside Claude Code
/plugin marketplace add hermes-labs-ai/lintlang
/plugin install lintlang@lintlang
Plugin guide

Gemini CLI extension

A non-blocking AfterTool hook returns repair guidance after write_file or replace changes a supported file. Requires uv; the current guide remains pinned to the upstream-verified 0.5.3 source.

Extension guide

MegaLinter

Opt-in external plugin AI_LINTLANG for repositories that already run MegaLinter.

MegaLinter setup

GitHub Code Scanning

SARIF 2.1.0 output places instruction findings beside code findings.

SARIF setup

Replace AGENTS.md with the instruction paths your repository owns. The editor hooks never block or rewrite a file. These integration points are maintained by Hermes Labs in the LintLang repository; they are not endorsements by GitHub, Anthropic, Google, or MegaLinter.

GitHub Code Scanning

Put instruction findings beside code findings.

Since 0.4.1, LintLang emits deterministic SARIF 2.1.0 with stable rule IDs, repository-relative paths, and evidence-supported line spans where the parser can justify them. Structured inputs remain file-level rather than inventing precision.

Copy the least-privilege workflow
Generate SARIF0.6.0
$ lintlang scan AGENTS.md \
    --format sarif \
    --fail-on fail \
    > lintlang.sarif

MegaLinter · opt-in external plugin

Check agent instructions in your existing MegaLinter workflow.

Start with MegaLinter already installed and running in your repository. Merge these entries into .mega-linter.yml, preserving your existing plugins and linter selections. If you do not already use ENABLE_LINTERS, list the other linters you want to keep too: this setting limits which linters run.

AI_LINTLANG selects conventional instruction files such as AGENTS.md, CLAUDE.md, and prompt or tool files by name. The guide explains how to adjust that scope. It runs lintlang scan --fail-on fail: FAIL exits nonzero; REVIEW stays advisory.

Read the MegaLinter setup guide
.mega-linter.ymlMerge with existing configuration
PLUGINS:
  - https://raw.githubusercontent.com/hermes-labs-ai/lintlang/main/mega-linter-plugin-lintlang/lintlang.megalinter-descriptor.yml

ENABLE_LINTERS:
  - AI_LINTLANG

The boundary

Static analysis can narrow risk. It cannot certify an agent.

LintLang does not run models, evaluate runtime behavior, prove semantic correctness, or establish that an agent is safe in production.

Use it before prompt tests, guardrails, and production monitoring—not instead of them.

LintLang 0.6.0 is published and maintained by Hermes Labs. Canonical repository: https://github.com/hermes-labs-ai/lintlang.

See where static linting fits in the stack →Compare LintLang with adjacent tools →

Start with one real instruction file

Catch the defect while it is still just text.

$ uvx --from lintlang==0.6.0 lintlang scan AGENTS.md