Configuration

Every field in .trackline.json.

One file, .trackline.json, at the root of your project. Every field is optional; anything you leave out keeps its default.

{
  "mode": "warn",
  "modes": { "off-limits": "auto", "scope": "ask" },
  "offLimits": ["config/prod.yaml", "migrations/**"],
  "ruleFiles": ["AGENTS.md", "CLAUDE.md", ".cursorrules"],
  "disabled": ["diff-size"],
  "tools": {
    "never": ["drop_database"],
    "requireApproval": { "fintech_change_limit": "request_human_approval" }
  },
  "judge": { "provider": "cli", "binary": "codex" }
}
Field Default Meaning
mode warn the mode for any check without its own
modes none a mode per check: warn, ask or auto (modes)
offLimits secrets and keys extra protected patterns, added to the defaults; a leading ! makes an exception
ruleFiles AGENTS.md, CLAUDE.md, .cursorrules where your project's rules are read from
disabled none checks that should not run
tools none the production tool policy
judge off provider (cli or http), and binary, or baseUrl, model and apiKeyEnv

Check names: off-limits, dependency-added, scope, diff-size, repetition, tool-policy.

For the http judge, apiKeyEnv names an environment variable that holds the key, so a key is never written into a file that gets committed.

If the file is broken

A config file that will not parse is reported on every action and never stops your work: the defaults carry on. A rules file that exists but cannot be read is reported too, naming the file, rather than treated as a project with no rules.