Skip to content

Linting

To lint one or more Agency files:

agency lint foo.agency
agency lint src/

Arguments may be files, directories (scanned recursively for .agency files), or a mix of both. If no input is given, the linter reads from stdin.

Findings are printed per file, with a 1-indexed line and column and a stable AL#### code:

main.agency
  1:10  AL0001  'now' is imported but never used.

Run `agency explain <code>` for details.

Every code has a long-form explanation: run agency explain AL0001, or see the diagnostics reference.

Lint findings are not errors

The linter reports style and hygiene notices — things worth cleaning up, not things that are wrong. A file with lint findings still compiles and runs. This is the same split every mature ecosystem draws: the type checker (agency tc) answers "is this program correct?", the linter answers "is this program tidy?".

Because of that, agency lint exits 0 on hint-level findings, so putting it in CI reports findings without failing the build. If a future rule ships at warning severity or above, findings at that level will fail the run.

The rules

  • AL0001 — unused import. A named import (or import node) the file never references. Conservative on purpose: if the name appears anywhere — even where a shadowing local is the real target — the import is kept. Never examines std::index imports (every file gets the prelude names without importing them) or import test { … } imports (their names are expected to look unused in a normal compile).
  • AL0002 — missing docstring. An exported function without a docstring. In Agency, functions are tools, and the docstring becomes the tool description the LLM reads — an exported function without one hands every agent that imports it a tool with no description. A comment above the function does not count; only a docstring reaches the LLM. See the documentation guide for docstring conventions.
  • AL0003 — redundant prelude import. An explicit import { map } from "std::index" of a name the prelude already provides. Aliased imports (map as arrMap) and imports carrying a destructive/idempotent marker do real work and are never reported — and std::index exports that are not in the prelude (types like WriteMode) must be imported, so they are never reported either.

The same findings in your editor

The language server surfaces the same findings: unused imports render grayed out, and the lightbulb menu offers "Remove unused import" per name plus a "Remove all unused imports" batch action. See editor integration for removing them automatically on save.