Skip to main content
meow lint analyzes your source for syntax and semantic problems over the same Oxc syntax tree the runtime and formatter are built on. There’s no second parser to warm up and no ESLint config to assemble.

What it checks

For each file, meow builds the concrete syntax tree and the semantic graph (scopes, bindings, references) and surfaces three kinds of findings:
  • Parse errors — malformed syntax, caught with precise spans. These always fail the run.
  • Semantic errors — problems that need scope/binding analysis.
  • Curated rules — a focused set of correctness checks that walk the shared syntax tree:
Rules you don’t mention in config keep these recommended defaults; anything outside the set is off. Every finding is rendered as a structured diagnostic with the offending line and a caret marker, labeled by rule id:

Exit codes

meow lint follows standard lint semantics:
  • Errors fail the run (exit non-zero), so they gate CI cleanly.
  • Warnings print but pass (exit zero) — they surface issues without blocking.
A clean run is quiet and green:
When only warnings fired:

Configuring rules

Rule severities live in your one config file, keyed by rule id. A rule you don’t list keeps its recommended default:
meow.config.json
Each value is "error", "warn", or "off". Setting a rule to "off" suppresses it; promoting a warning to "error" makes it fail the run. See the configuration reference.
meow lint and meow fmt are built on the same Oxc parser and syntax-tree engine (meow-graph) the runtime runs on — there’s no separate linter toolchain to install or keep in sync. meow check is the exception: it delegates to the TypeScript compiler (tsc) for full type analysis. See the architecture overview for how the pieces fit together.

Format next

Reprint your code from the same tree.