--- description: Lint config shape: every non-nursery Oxlint category on, plugins via `all`, a blacklist of offs in configs.project, per-file exceptions only in projectOverrides, ignorePatterns only for generated output --- Policy (2026-10-19): a blacklist, not a whitelist. Replaces the older category-subset and "no overrides" notes. - **Categories:** `correctness`, `suspicious`, `pedantic`, `perf`, `style`, `restriction` at `error`. `nursery` stays off (no line for it). - **Plugins** are enabled whole through their `all` config (`explicitTypes.configs.all.rules`, `importStructure.configs.all.rules`). - **Blacklist:** repo-wide offs and option tweaks live in `projectLint.configs.project.rules` in `scripts/project-lint.ts`, spread last in `rules`, each with a one-line reason. Never re-list a rule a category already turns on. bot-agents runs on Node everywhere, so `import/no-nodejs-modules`, `unicorn/no-process-exit`, and `no-console` are off repo-wide. - **Per-file exceptions** only via `projectOverrides`, the whole `overrides` array exported from `scripts/project-lint.ts`: the Node code entry (`vite.config.ts`, `scripts/**`, `nodeRules`) first, then one entry per exception with a why-comment. `vite.config.ts` has exactly `overrides: projectOverrides`. - **No `allowFiles`** options in custom rules, and no disable comments ([[lint-no-disable-comments]]). - **`ignorePatterns`** only for generated or build output, never hand-written code. A hand-written file is linted, with override entries for only what it legitimately breaks. bot-agents has no generated code, so none. - **Precedence:** categories < `rules` (a later spread wins) < `overrides` (a later entry wins). - Size and complexity limits (`complexity`, `max-lines`, ...) are set to the smallest value the current code passes. ```ts // scripts/project-lint.ts export const projectOverrides: OxlintOverride[] = [ { files: ["vite.config.ts", "scripts/**"], rules: nodeRules }, // Why: src/example.ts must ... (a per-file exception, if one is ever needed) // { files: ["src/example.ts"], rules: { "some-rule": "off" } }, ]; // vite.config.ts rules: { ...explicitTypes.configs.all.rules, ...importStructure.configs.all.rules, ...projectLint.configs.project.rules, }, overrides: projectOverrides, ``` A new category hit is fixed in the code; an off or exception is added only for a real collision or churn, with its reason. Rules: [[project-lint-plugin]].