github agent-sh/agnix v0.27.0

4 hours ago

Added

  • [[overrides]] per-file rule suppression (closes #909). New .agnix.toml array-of-tables lets users disable specific rules for files matching a glob list without losing the rule globally. Each entry has paths (glob list, matched with require_literal_separator = true to mirror [files].exclude semantics) and disabled_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_ids helper).
    • Per-file dispatch: validators now receive a PerFileLintConfig<'_> view bound to the file being linted; config.is_rule_enabled(rule_id) consults global disabled_rules ∪ matching [[overrides]].disabled_rules for that file. Validator::validate_per_file is the new abstract trait method; the original validate(&LintConfig) remains as a default impl that builds the view and dispatches, so external Validator impls (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 by config.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.toml is absent).
    • Symlink resolution: for_path retries strip_prefix once via the configured FileSystem::canonicalize when 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 in docs/CONFIGURATION.md and SPEC.md.

Changed

  • Tool baselines: triaged the three auto-opened release-watch issues and bumped baselines for claude-code v2.1.141 -> v2.1.142 (#920), cline v3.83.0 -> cli-v3.0.3 (#921), and opencode v1.14.50 -> v1.15.0 (#922). No new validator, rule, ToolVersions, or SpecRevisions update is required: Claude Code's root-level plugin SKILL.md behavior is already covered by generic SKILL.md detection, plugin LSP server metadata is already covered by CC-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 amp neo -> npm-package-changes (#916), cursor 3.4.16 -> 3.4.17 (#917), and opencode v1.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, or SpecRevisions update required.

Don't miss a new agnix release

NewReleases is sending notifications on new releases.