Linting & Formatting

Use lintro for linting and formatting checks.

Rustume uses lintro for all linting and formatting — run uv run lintro chk to check and uv run lintro fmt to auto-fix. Do not run native tools directly; lintro orchestrates the same toolchain CI uses.

Quick commands

# Check for issues (CI mode — fails on warnings)
uv run lintro chk

# Auto-fix formatting
uv run lintro fmt

# Run tests with coverage reporting
uv run lintro tst

Run these from the Rustume repository root where pyproject.toml lives — requires uv.

What lintro runs

lintro auto-detects and runs 28 tools across the monorepo (see uv run lintro tools):

CategoryTools
Rustrustfmt, clippy, cargo_audit, cargo_deny
Pythonruff, black, bandit, mypy, pydoclint, pytest
TypeScript / JavaScriptoxlint, oxfmt, prettier, tsc*
Shellshellcheck, shfmt
Markup / configmarkdownlint, yamllint, taplo, prettier
CI / containersactionlint, hadolint
Securitygitleaks, osv_scanner, semgrep, bandit, cargo_audit, cargo_deny
SQLsqlfluff
Framework checkers†astro-check, svelte-check, vue-tsc

* tsc and † astro-check are disabled in .lintro-config.yaml for this repo — the docs site type-checks via make site-test instead.

Configuration lives in .lintro-config.yaml. CI runs the same checks via scripts/ci/lintro/.

Pre-commit workflow

Before pushing:

make test
uv run lintro chk

Fix formatting issues:

uv run lintro fmt
uv run lintro chk   # verify clean

See Development setup for make test.

CI integration

Pull requests trigger ci-lintro-analysis.yml which:

  1. Pulls the lintro Docker image (or runs locally)
  2. Executes lintro chk across the workspace
  3. Posts results as PR comment on failure

Conventional Commits PR titles are enforced separately (semantic-pr-title.yml).

Makefile alternatives

The Makefile includes native Rust / JavaScript lint targets for quick local checks:

make lint    # cargo clippy + bun lint
make fmt     # cargo fmt + bun fmt

Prefer uv run lintro chk/fmt for parity with CI. Use Makefile targets only for fast iteration on Rust-only changes.

CI parity

CI runs lintro in Docker via reusable-quality-lint. Match it locally with:

uv run lintro chk
uv run lintro fmt

Common fixes

Clippy -D warnings — all clippy warnings are errors. Fix or allow explicitly with justification.

Import orderlintro fmt handles import sorting in TypeScript files.

Trailing whitespace / final newline — auto-fixed by lintro fmt.

Conventional commits — PR titles must follow Conventional Commits format (enforced by CI, not lintro).

Adding new tools

To add a linter to lintro, follow the lintro plugin guide. Rustume-specific CI wiring goes in scripts/ci/.

Editor integration

Configure your editor to run uv run lintro fmt on save, or use separate formatters that match lintro output (rustfmt for Rust, Prettier for TypeScript). The source of truth is always lintro chk in CI.