Summary
Allow users to configure lint rules via a .winn-lint.json file in the project root. Each rule can be set to false (disabled), "warning" (informational), or "error" (fails CI with exit code 1).
Config Format
{
"rules": {
"single_pipe": false,
"unused_variable": "warning",
"empty_function_body": "error"
}
}
- Only rules that differ from defaults need to be listed
- Without a config file, all rules default to
"warning" (current behavior)
- Unknown rule names produce a warning on stderr
- Invalid values fall back to default with a warning
Behavior
| Scenario |
Exit code |
| No violations |
0 |
| Only warnings |
0 |
| Any errors |
1 |
This changes the current behavior where all warnings cause exit code 1. With config, "warning" rules become informational only — only "error" rules fail CI.
New: winn lint --init
Generates a default .winn-lint.json with all 10 rules set to "warning" as a starting point.
Implementation
- Config loading in
winn_lint.erl — load_config/0 reads .winn-lint.json, parses with jsone, merges over defaults
- Thread config through checks —
check_string/2, check_file/2 accept config; each rule checks its config before emitting
- CLI changes —
run_lint loads config once, separates error vs warning counts, exits 1 only on errors
--init subcommand — generates default config file
- Tests — config loading, rule suppression, severity-based exit codes
- Docs — update
cli.md, getting-started.md, CHANGELOG.md
Files to Modify
apps/winn/src/winn_lint.erl
apps/winn/src/winn_cli.erl
apps/winn/test/winn_lint_tests.erl
docs/cli.md
docs/getting-started.md
CHANGELOG.md
Part of v0.9.0 — Developer Tooling
Summary
Allow users to configure lint rules via a
.winn-lint.jsonfile in the project root. Each rule can be set tofalse(disabled),"warning"(informational), or"error"(fails CI with exit code 1).Config Format
{ "rules": { "single_pipe": false, "unused_variable": "warning", "empty_function_body": "error" } }"warning"(current behavior)Behavior
This changes the current behavior where all warnings cause exit code 1. With config,
"warning"rules become informational only — only"error"rules fail CI.New:
winn lint --initGenerates a default
.winn-lint.jsonwith all 10 rules set to"warning"as a starting point.Implementation
winn_lint.erl—load_config/0reads.winn-lint.json, parses withjsone, merges over defaultscheck_string/2,check_file/2accept config; each rule checks its config before emittingrun_lintloads config once, separates error vs warning counts, exits 1 only on errors--initsubcommand — generates default config filecli.md,getting-started.md,CHANGELOG.mdFiles to Modify
apps/winn/src/winn_lint.erlapps/winn/src/winn_cli.erlapps/winn/test/winn_lint_tests.erldocs/cli.mddocs/getting-started.mdCHANGELOG.mdPart of v0.9.0 — Developer Tooling