Added
[[overrides]]per-file rule suppression (closes #909). New.agnix.tomlarray-of-tables lets users disable specific rules for files matching a glob list without losing the rule globally. Each entry haspaths(glob list, matched withrequire_literal_separator = trueto mirror[files].excludesemantics) anddisabled_rules(rule IDs). Multiple blocks stack as a set union; the layer is additive only - overrides can never re-enable a globally or category-disabled rule. Targets the original use case from #909:~/.claude/CLAUDE.md-style memory files that legitimately contain quoted-example patterns ("in the future we should...","make sure to verify ...") which would otherwise trip CC-MEM-005 / CC-MEM-007.- Schema validation: glob syntax, traversal (
..), and absolute paths are rejected at config load; unknown rule-ID prefixes warn via the same code path as[rules].disabled_rules(validate_rule_idshelper). - Per-file dispatch: validators now receive a
PerFileLintConfig<'_>view bound to the file being linted;config.is_rule_enabled(rule_id)consultsglobal disabled_rules ∪ matching [[overrides]].disabled_rulesfor that file.Validator::validate_per_fileis the new abstract trait method; the originalvalidate(&LintConfig)remains as a default impl that builds the view and dispatches, so externalValidatorimpls (LSP, etc.) keep working unchanged. - Project-level rules (
AGM-006,XP-004,XP-005,XP-006,VER-001) also honor[[overrides]]. For cross-file rules the participating file set is filtered up front byconfig.for_path(path).is_rule_enabled(rule_id)before the detector runs, so an overridden file is invisible to the rule - it neither fires nor appears in other files' diagnostic messages. This makes suppression deterministic regardless of which file the cross-file detector picks as the diagnostic report path.VER-001(single report path) honors an override targeting.agnix.toml(or the project root when.agnix.tomlis absent). - Symlink resolution:
for_pathretriesstrip_prefixonce via the configuredFileSystem::canonicalizewhen the direct path remains absolute (typical for dotfile-manager symlinks like~/.claude/→ mackup/stow/chezmoi stores). Non-symlinked paths pay no syscall cost. - Covered by 27 unit tests (12 schema + 3 wiring + 12 matching + symlink regression) and 8 end-to-end integration tests via
validate_project(CC-MEM-005 carve-out, AGM-006 full + partial, XP-004 full + partial, VER-001). Documented indocs/CONFIGURATION.mdandSPEC.md.
- Schema validation: glob syntax, traversal (
Changed
- Tool baselines: triaged the three auto-opened release-watch issues and bumped baselines for
claude-codev2.1.141->v2.1.142(#920),clinev3.83.0->cli-v3.0.3(#921), andopencodev1.14.50->v1.15.0(#922). No new validator, rule,ToolVersions, orSpecRevisionsupdate is required: Claude Code's root-level pluginSKILL.mdbehavior is already covered by genericSKILL.mddetection, plugin LSP server metadata is already covered byCC-PL-011,skills: ["./"]is already accepted by the component path checks, and the Cline/OpenCode releases are runtime, CLI, TUI, desktop, or SDK changes outside currently validated config surfaces. - Tool baselines: triaged the three open release-watch issues and bumped baselines for
ampneo->npm-package-changes(#916),cursor3.4.16->3.4.17(#917), andopencodev1.14.49->v1.14.50(#918). All three are agnix-irrelevant for current validated config surfaces: Amp changed npm packaging and package names only, Cursor's stable endpoint exposed only a version marker, and OpenCode v1.14.50 contains runtime/SDK/TUI fixes already covered by existing config validators. No validator,ToolVersions, orSpecRevisionsupdate required.