fallow 3.14.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/schema.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "FallowConfig",
4
+ "description": "The user-facing fallow configuration as authored in `.fallowrc.json` /\n`.fallowrc.jsonc` / `fallow.toml` (or the `fallow` key of `package.json`).\n\nEvery field documents its serialized meaning, default, and precedence\nagainst CLI flags and environment variables where they exist.\n`FallowConfig::resolve` compiles the loaded config (globs, regexes,\nplugin and rule-pack discovery) into a [`ResolvedConfig`] for analysis.\nUnknown keys are rejected at load so typos fail loud.",
4
5
  "type": "object",
5
6
  "properties": {
6
7
  "$schema": {
@@ -121,16 +122,18 @@
121
122
  "default": []
122
123
  },
123
124
  "duplicates": {
124
- "description": "Configures clone detection: `enabled` (default true), `mode` (`strict`, `mild` default, `weak`, `semantic`, from least to most identifier/literal blinding; `strict` and `mild` are equivalent under fallow's AST tokenizer, `weak` blinds string literals, `semantic` blinds all identifiers and literals for Type-2 renamed-variable detection), `minTokens` (50), `minLines` (5), `minOccurrences` (integer >= 2, deserialization fails below 2), `threshold` (max duplication percentage, 0 = no limit), `ignore` globs, `ignoreDefaults` (true, merge built-in generated-file ignores), `skipLocal` (only report cross-directory clones), `crossLanguage` (strip TS type annotations to match .ts against .js), `ignoreImports` (true, strip ES import/re-export/top-level require wiring from the token stream), and `normalization` (per-flag `ignoreIdentifiers`/`ignoreStringValues`/`ignoreNumericValues` overrides on top of `mode`). Raise `minOccurrences` to focus on widespread copy-paste, or set `mode` to `semantic` to catch renamed-variable clones.",
125
+ "description": "Configures clone detection: `enabled` (default true), `mode` (`strict`, `mild` default, `weak`, `semantic`, from least to most identifier/literal blinding; `strict` and `mild` are equivalent under fallow's AST tokenizer, `weak` blinds string literals, `semantic` blinds all identifiers and literals for Type-2 renamed-variable detection), `near` (false, add bounded function-scoped near-miss detection), `minTokens` (50), `minLines` (5), `minOccurrences` (integer >= 2, deserialization fails below 2), `threshold` (max duplication percentage, 0 = no limit), `ignore` globs, `ignoredClones` (reviewed clone keys to hide until their content or occurrence count changes), `ignoreDefaults` (true, merge built-in generated-file ignores), `skipLocal` (only report cross-directory clones), `crossLanguage` (strip TS type annotations to match .ts against .js), `ignoreImports` (true, strip ES import/re-export/top-level require wiring from the token stream), and `normalization` (per-flag `ignoreIdentifiers`/`ignoreStringValues`/`ignoreNumericValues` overrides on top of `mode`). Raise `minOccurrences` to focus on widespread copy-paste, enable `near` for gapped structural clones, or set `mode` to `semantic` to catch renamed-variable exact clones.",
125
126
  "$ref": "#/$defs/DuplicatesConfig",
126
127
  "default": {
127
128
  "enabled": true,
128
129
  "mode": "mild",
130
+ "near": false,
129
131
  "minTokens": 50,
130
132
  "minLines": 5,
131
133
  "minOccurrences": 2,
132
134
  "threshold": 0.0,
133
135
  "ignore": [],
136
+ "ignoredClones": [],
134
137
  "ignoreDefaults": true,
135
138
  "skipLocal": false,
136
139
  "crossLanguage": false,
@@ -457,6 +460,7 @@
457
460
  "type": "object",
458
461
  "properties": {
459
462
  "package": {
463
+ "description": "Exact package name looked up in the project's declared dependencies.",
460
464
  "type": "string"
461
465
  },
462
466
  "type": {
@@ -474,6 +478,7 @@
474
478
  "type": "object",
475
479
  "properties": {
476
480
  "pattern": {
481
+ "description": "Project-root-relative glob; the plugin activates when any\ndiscovered file matches it. Validated at load like other user\nglobs (no absolute paths or `..` segments).",
477
482
  "type": "string"
478
483
  },
479
484
  "type": {
@@ -491,6 +496,7 @@
491
496
  "type": "object",
492
497
  "properties": {
493
498
  "conditions": {
499
+ "description": "Sub-conditions combined with logical AND.",
494
500
  "type": "array",
495
501
  "items": {
496
502
  "$ref": "#/$defs/PluginDetection"
@@ -511,6 +517,7 @@
511
517
  "type": "object",
512
518
  "properties": {
513
519
  "conditions": {
520
+ "description": "Sub-conditions combined with logical OR.",
514
521
  "type": "array",
515
522
  "items": {
516
523
  "$ref": "#/$defs/PluginDetection"
@@ -562,9 +569,11 @@
562
569
  "default": "jsonc"
563
570
  },
564
571
  "when": {
565
- "description": "Manifest-level gate: a map of dotted field path to an expected scalar\nvalue. ALL entries must match by STRICT EQUALITY for the manifest to be\nprocessed. An empty map matches every manifest.",
572
+ "description": "Manifest-level gate: a map of field path to an equality expectation or\nan explicit `exists` predicate. Paths use dotted object keys and may\ntraverse arrays with `[*]`. ALL entries must match; a wildcard equality\nmatches when any yielded value equals the expectation. An empty map\nmatches every manifest.",
566
573
  "type": "object",
567
- "additionalProperties": true,
574
+ "additionalProperties": {
575
+ "$ref": "#/$defs/ManifestCondition"
576
+ },
568
577
  "default": {}
569
578
  },
570
579
  "entries": {
@@ -595,18 +604,46 @@
595
604
  }
596
605
  ]
597
606
  },
607
+ "ManifestCondition": {
608
+ "description": "A typed condition used by a manifest entry gate.\n\nPlain JSON values retain strict equality semantics. The reserved\n`{ \"exists\": bool }` object tests field presence without truthiness.",
609
+ "anyOf": [
610
+ {
611
+ "description": "Require the field path to resolve (`true`) or not resolve (`false`).",
612
+ "$ref": "#/$defs/ManifestExistsPredicate"
613
+ },
614
+ {
615
+ "description": "Require at least one yielded value to equal this JSON value exactly."
616
+ }
617
+ ]
618
+ },
619
+ "ManifestExistsPredicate": {
620
+ "description": "The explicit field-presence predicate accepted by [`ManifestCondition`].",
621
+ "type": "object",
622
+ "properties": {
623
+ "exists": {
624
+ "description": "Whether the field path must resolve to at least one value.",
625
+ "type": "boolean"
626
+ }
627
+ },
628
+ "additionalProperties": false,
629
+ "required": [
630
+ "exists"
631
+ ]
632
+ },
598
633
  "ManifestSeedRule": {
599
634
  "description": "A single entry seeded by a [`ManifestEntryRule`], resolved relative to the\nmanifest's directory.",
600
635
  "type": "object",
601
636
  "properties": {
602
637
  "path": {
603
- "description": "Entry glob relative to the manifest directory. May contain\n`${dotted.field}` interpolation that fans out over string / array\nmanifest field values (a missing or empty field seeds nothing). The glob\nmust encode its own extension (e.g. `public/index.{ts,tsx}`); glob entry\npatterns are matched literally against discovered files without\nsource-extension probing.",
638
+ "description": "Entry glob relative to the manifest directory. May contain\n`${dotted.field}` interpolation that fans out over string / array\nmanifest field values; `[*]` traverses object arrays. A missing or empty\nfield seeds nothing. The glob must encode its own extension, such as\n`public/index.{ts,tsx}`. Glob entry patterns are matched literally\nagainst discovered files without\nsource-extension probing.",
604
639
  "type": "string"
605
640
  },
606
641
  "when": {
607
- "description": "Per-entry gate (strict equality), evaluated against the same manifest.\nAn empty map always passes.",
642
+ "description": "Per-entry gate, using the same strict equality and `[*]` traversal as the\nmanifest-level gate. An empty map always passes.",
608
643
  "type": "object",
609
- "additionalProperties": true,
644
+ "additionalProperties": {
645
+ "$ref": "#/$defs/ManifestCondition"
646
+ },
610
647
  "default": {}
611
648
  }
612
649
  },
@@ -709,6 +746,7 @@
709
746
  }
710
747
  }
711
748
  },
749
+ "additionalProperties": false,
712
750
  "required": [
713
751
  "file",
714
752
  "exports"
@@ -764,16 +802,20 @@
764
802
  ]
765
803
  },
766
804
  "IgnoreExportsUsedInFileConfig": {
805
+ "description": "Value of the `ignoreExportsUsedInFile` config key: whether an export\nreferenced elsewhere in its own file is suppressed from `unused-export`.",
767
806
  "anyOf": [
768
807
  {
808
+ "description": "Blanket toggle: `true` suppresses any export with a same-file use,\nregardless of kind. The default is `false`.",
769
809
  "type": "boolean"
770
810
  },
771
811
  {
812
+ "description": "Knip-parity object form restricting the suppression to type-only\nexports.",
772
813
  "$ref": "#/$defs/IgnoreExportsUsedInFileByKind"
773
814
  }
774
815
  ]
775
816
  },
776
817
  "IgnoreExportsUsedInFileByKind": {
818
+ "description": "Object form of `ignoreExportsUsedInFile` (`{ \"type\": ..., \"interface\": ... }`),\nrestricting the same-file-use suppression to type-only exports.",
777
819
  "type": "object",
778
820
  "properties": {
779
821
  "type": {
@@ -802,6 +844,11 @@
802
844
  "$ref": "#/$defs/DetectionMode",
803
845
  "default": "mild"
804
846
  },
847
+ "near": {
848
+ "description": "Detect structurally similar function bodies with small edits.",
849
+ "type": "boolean",
850
+ "default": false
851
+ },
805
852
  "minTokens": {
806
853
  "description": "Minimum number of tokens for a clone.",
807
854
  "type": "integer",
@@ -837,6 +884,15 @@
837
884
  },
838
885
  "default": []
839
886
  },
887
+ "ignoredClones": {
888
+ "description": "Reviewed clone groups to omit from duplication results.\n\nEach entry is `<fingerprint>:<instance_count>`, for example\n`dup:6f12ab34:2`. A content or occurrence-count change produces a new key\nand makes the group reportable again.",
889
+ "type": "array",
890
+ "items": {
891
+ "type": "string",
892
+ "pattern": "^dup:(?:[0-9a-f]{8}|[0-9a-f]{16}(?:-[1-9][0-9]*)?):(?:[2-9]|[1-9][0-9]+)$"
893
+ },
894
+ "default": []
895
+ },
840
896
  "ignoreDefaults": {
841
897
  "description": "Merge built-in generated-framework ignore patterns with `ignore`.\n\nSet to `false` to use only the user-provided `ignore` list.",
842
898
  "type": "boolean",
@@ -951,7 +1007,7 @@
951
1007
  "default": 15
952
1008
  },
953
1009
  "maxCrap": {
954
- "description": "Maximum allowed CRAP (Change Risk Anti-Patterns) score per function\n(default: 30.0). CRAP combines cyclomatic complexity with test\ncoverage: high complexity plus low coverage produces a high CRAP\nscore. Functions meeting or exceeding this threshold are reported.\nUse `--coverage` with Istanbul data for accurate per-function CRAP;\notherwise fallow estimates coverage from the module graph. Governs\nfindings only, never the health score.",
1010
+ "description": "Maximum allowed CRAP (Change Risk Anti-Patterns) score per function\n(default: 30.0). CRAP combines cyclomatic complexity with test\ncoverage: high complexity plus low coverage produces a high CRAP\nscore. Functions meeting or exceeding this threshold are reported.\nUse `--coverage` with Istanbul data for accurate per-function CRAP;\notherwise fallow estimates coverage from the module graph. Governs\nfindings and the threshold-relative file-score signals\n(`crap_above_threshold`, the `risk` triage tag, and the\n`add_test_coverage` refactoring target); measured values such as\n`crap_max` and the overall health score never move with it. Set to\n`0` to disable CRAP enforcement entirely: no findings, nothing counts\nabove threshold, and file-score rows disclose baseline breaches as\nexempt instead.",
955
1011
  "type": "number",
956
1012
  "format": "double",
957
1013
  "default": 30.0
@@ -1187,38 +1243,47 @@
1187
1243
  "type": "object",
1188
1244
  "properties": {
1189
1245
  "unused-files": {
1246
+ "description": "A file reachable from no entry point. Defaults to `error`.",
1190
1247
  "$ref": "#/$defs/Severity",
1191
1248
  "default": "error"
1192
1249
  },
1193
1250
  "unused-exports": {
1251
+ "description": "An exported symbol no other module imports. Defaults to `error`.",
1194
1252
  "$ref": "#/$defs/Severity",
1195
1253
  "default": "error"
1196
1254
  },
1197
1255
  "unused-types": {
1256
+ "description": "An exported type no other module uses. Defaults to `error`.",
1198
1257
  "$ref": "#/$defs/Severity",
1199
1258
  "default": "error"
1200
1259
  },
1201
1260
  "private-type-leaks": {
1261
+ "description": "An exported signature referencing a same-file private type. Opt-in;\ndefaults to `off`.",
1202
1262
  "$ref": "#/$defs/Severity",
1203
1263
  "default": "off"
1204
1264
  },
1205
1265
  "unused-dependencies": {
1266
+ "description": "A declared `dependencies` entry never observed used. Defaults to\n`error`.",
1206
1267
  "$ref": "#/$defs/Severity",
1207
1268
  "default": "error"
1208
1269
  },
1209
1270
  "unused-dev-dependencies": {
1271
+ "description": "A declared `devDependencies` entry never observed used. Defaults to\n`warn`; production mode forces it to `off`.",
1210
1272
  "$ref": "#/$defs/Severity",
1211
1273
  "default": "warn"
1212
1274
  },
1213
1275
  "unused-optional-dependencies": {
1276
+ "description": "A declared `optionalDependencies` entry never observed used. Defaults\nto `warn`; production mode forces it to `off`.",
1214
1277
  "$ref": "#/$defs/Severity",
1215
1278
  "default": "warn"
1216
1279
  },
1217
1280
  "unused-enum-members": {
1281
+ "description": "An enum member read nowhere in the project. Defaults to `error`.",
1218
1282
  "$ref": "#/$defs/Severity",
1219
1283
  "default": "error"
1220
1284
  },
1221
1285
  "unused-class-members": {
1286
+ "description": "A class member used nowhere; `usedClassMembers` and decorator\nexemptions carve out framework-invoked members. Defaults to `error`.",
1222
1287
  "$ref": "#/$defs/Severity",
1223
1288
  "default": "error"
1224
1289
  },
@@ -1313,50 +1378,62 @@
1313
1378
  "default": "warn"
1314
1379
  },
1315
1380
  "unresolved-imports": {
1381
+ "description": "An import specifier that resolves to no file or package. Defaults to\n`error`.",
1316
1382
  "$ref": "#/$defs/Severity",
1317
1383
  "default": "error"
1318
1384
  },
1319
1385
  "unlisted-dependencies": {
1386
+ "description": "An imported package not declared in any relevant `package.json`.\nDefaults to `error`.",
1320
1387
  "$ref": "#/$defs/Severity",
1321
1388
  "default": "error"
1322
1389
  },
1323
1390
  "duplicate-exports": {
1391
+ "description": "The same export name provided by multiple modules; `ignoreExports`\nexcludes intentional barrel re-exports. Defaults to `error`.",
1324
1392
  "$ref": "#/$defs/Severity",
1325
1393
  "default": "error"
1326
1394
  },
1327
1395
  "type-only-dependencies": {
1396
+ "description": "A production dependency imported only via type-only imports (a\n`devDependencies` candidate). Defaults to `warn`.",
1328
1397
  "$ref": "#/$defs/Severity",
1329
1398
  "default": "warn"
1330
1399
  },
1331
1400
  "test-only-dependencies": {
1401
+ "description": "A production dependency imported only by test files. Defaults to\n`warn`.",
1332
1402
  "$ref": "#/$defs/Severity",
1333
1403
  "default": "warn"
1334
1404
  },
1335
1405
  "dev-dependencies-in-production": {
1406
+ "description": "A `devDependencies` entry imported by production code, which a\nproduction-only install would omit and break at runtime. Defaults to\n`warn`.",
1336
1407
  "$ref": "#/$defs/Severity",
1337
1408
  "default": "warn"
1338
1409
  },
1339
1410
  "circular-dependencies": {
1411
+ "description": "A circular import chain between modules. Defaults to `error`.",
1340
1412
  "$ref": "#/$defs/Severity",
1341
1413
  "default": "error"
1342
1414
  },
1343
1415
  "re-export-cycle": {
1416
+ "description": "A cycle or self-loop in the re-export subgraph (barrel files\nre-exporting from each other in a loop). Defaults to `warn`.",
1344
1417
  "$ref": "#/$defs/Severity",
1345
1418
  "default": "warn"
1346
1419
  },
1347
1420
  "boundary-violation": {
1421
+ "description": "An import crossing a forbidden architecture-boundary edge declared in\nthe `boundaries` config. Defaults to `error`.",
1348
1422
  "$ref": "#/$defs/Severity",
1349
1423
  "default": "error"
1350
1424
  },
1351
1425
  "coverage-gaps": {
1426
+ "description": "A runtime file or export with no test dependency path. Opt-in;\ndefaults to `off`.",
1352
1427
  "$ref": "#/$defs/Severity",
1353
1428
  "default": "off"
1354
1429
  },
1355
1430
  "feature-flags": {
1431
+ "description": "A detected feature-flag pattern (tuned via the `flags` config).\nOpt-in; defaults to `off`.",
1356
1432
  "$ref": "#/$defs/Severity",
1357
1433
  "default": "off"
1358
1434
  },
1359
1435
  "stale-suppressions": {
1436
+ "description": "A `fallow-ignore` comment or `@expected-unused` tag that no longer\nmatches any issue. Defaults to `warn`.",
1360
1437
  "$ref": "#/$defs/Severity",
1361
1438
  "default": "warn"
1362
1439
  },
@@ -1366,22 +1443,27 @@
1366
1443
  "default": "off"
1367
1444
  },
1368
1445
  "unused-catalog-entries": {
1446
+ "description": "A `pnpm-workspace.yaml` catalog entry referenced by no workspace\npackage. Defaults to `warn`.",
1369
1447
  "$ref": "#/$defs/Severity",
1370
1448
  "default": "warn"
1371
1449
  },
1372
1450
  "empty-catalog-groups": {
1451
+ "description": "A named pnpm catalog group declaring no entries. Defaults to `warn`.",
1373
1452
  "$ref": "#/$defs/Severity",
1374
1453
  "default": "warn"
1375
1454
  },
1376
1455
  "unresolved-catalog-references": {
1456
+ "description": "A workspace `package.json` `catalog:` / `catalog:<name>` reference\npointing at a catalog that does not declare the consumed package.\nDefaults to `error`; suppressible only via `ignoreCatalogReferences`.",
1377
1457
  "$ref": "#/$defs/Severity",
1378
1458
  "default": "error"
1379
1459
  },
1380
1460
  "unused-dependency-overrides": {
1461
+ "description": "A pnpm `overrides:` / `pnpm.overrides` entry whose target package no\nworkspace `package.json` declares. Defaults to `warn`.",
1381
1462
  "$ref": "#/$defs/Severity",
1382
1463
  "default": "warn"
1383
1464
  },
1384
1465
  "misconfigured-dependency-overrides": {
1466
+ "description": "A pnpm `overrides:` / `pnpm.overrides` entry whose key or value cannot\nbe parsed into a valid pnpm shape. Defaults to `error`.",
1385
1467
  "$ref": "#/$defs/Severity",
1386
1468
  "default": "error"
1387
1469
  },
@@ -1758,6 +1840,7 @@
1758
1840
  "additionalProperties": false
1759
1841
  },
1760
1842
  "FixConfig": {
1843
+ "description": "The `fix` config section: settings for `fallow fix` apply behavior.",
1761
1844
  "type": "object",
1762
1845
  "properties": {
1763
1846
  "catalog": {
@@ -1770,6 +1853,7 @@
1770
1853
  }
1771
1854
  },
1772
1855
  "CatalogFixConfig": {
1856
+ "description": "The `fix.catalog` section: how `fallow fix` cleans up unused\n`pnpm-workspace.yaml` catalog entries.",
1773
1857
  "type": "object",
1774
1858
  "properties": {
1775
1859
  "deletePrecedingComments": {
@@ -1780,11 +1864,23 @@
1780
1864
  }
1781
1865
  },
1782
1866
  "CatalogPrecedingCommentPolicy": {
1783
- "type": "string",
1784
- "enum": [
1785
- "auto",
1786
- "always",
1787
- "never"
1867
+ "description": "Value of `fix.catalog.deletePrecedingComments`: what happens to comment\nlines directly above a catalog entry that `fallow fix` removes. A\n`fallow-keep` marker in the block always preserves it regardless of policy.",
1868
+ "oneOf": [
1869
+ {
1870
+ "description": "Delete the adjacent comment block only when heuristics attribute it to\nthe entry (preceded by a blank line or directly under the catalog\nheader) and it is not a section banner. The default.",
1871
+ "type": "string",
1872
+ "const": "auto"
1873
+ },
1874
+ {
1875
+ "description": "Always delete the adjacent comment block with the entry.",
1876
+ "type": "string",
1877
+ "const": "always"
1878
+ },
1879
+ {
1880
+ "description": "Never delete preceding comments.",
1881
+ "type": "string",
1882
+ "const": "never"
1883
+ }
1788
1884
  ]
1789
1885
  },
1790
1886
  "ResolveConfig": {
@@ -1801,16 +1897,20 @@
1801
1897
  }
1802
1898
  },
1803
1899
  "ProductionConfig": {
1900
+ "description": "Value of the `production` config key: excludes test/spec/story/dev files\nfrom discovery, either globally or per analysis family.",
1804
1901
  "anyOf": [
1805
1902
  {
1903
+ "description": "Boolean form applying to every analysis. The default is `false`.",
1806
1904
  "type": "boolean"
1807
1905
  },
1808
1906
  {
1907
+ "description": "Object form (`{ deadCode?, health?, dupes? }`) scoping production mode\nper analysis family.",
1809
1908
  "$ref": "#/$defs/PerAnalysisProductionConfig"
1810
1909
  }
1811
1910
  ]
1812
1911
  },
1813
1912
  "PerAnalysisProductionConfig": {
1913
+ "description": "Object form of the `production` config key, scoping production mode to\nindividual analysis families in combined `fallow` and `fallow audit`.",
1814
1914
  "type": "object",
1815
1915
  "properties": {
1816
1916
  "deadCode": {
@@ -1848,6 +1948,7 @@
1848
1948
  "default": {}
1849
1949
  }
1850
1950
  },
1951
+ "additionalProperties": false,
1851
1952
  "required": [
1852
1953
  "files"
1853
1954
  ]
@@ -1857,6 +1958,7 @@
1857
1958
  "type": "object",
1858
1959
  "properties": {
1859
1960
  "unused-files": {
1961
+ "description": "Optional override for [`RulesConfig::unused_files`].",
1860
1962
  "anyOf": [
1861
1963
  {
1862
1964
  "$ref": "#/$defs/Severity"
@@ -1867,6 +1969,7 @@
1867
1969
  ]
1868
1970
  },
1869
1971
  "unused-exports": {
1972
+ "description": "Optional override for [`RulesConfig::unused_exports`].",
1870
1973
  "anyOf": [
1871
1974
  {
1872
1975
  "$ref": "#/$defs/Severity"
@@ -1877,6 +1980,7 @@
1877
1980
  ]
1878
1981
  },
1879
1982
  "unused-types": {
1983
+ "description": "Optional override for [`RulesConfig::unused_types`].",
1880
1984
  "anyOf": [
1881
1985
  {
1882
1986
  "$ref": "#/$defs/Severity"
@@ -1887,6 +1991,7 @@
1887
1991
  ]
1888
1992
  },
1889
1993
  "private-type-leaks": {
1994
+ "description": "Optional override for [`RulesConfig::private_type_leaks`].",
1890
1995
  "anyOf": [
1891
1996
  {
1892
1997
  "$ref": "#/$defs/Severity"
@@ -1897,6 +2002,7 @@
1897
2002
  ]
1898
2003
  },
1899
2004
  "unused-dependencies": {
2005
+ "description": "Optional override for [`RulesConfig::unused_dependencies`].",
1900
2006
  "anyOf": [
1901
2007
  {
1902
2008
  "$ref": "#/$defs/Severity"
@@ -1907,6 +2013,7 @@
1907
2013
  ]
1908
2014
  },
1909
2015
  "unused-dev-dependencies": {
2016
+ "description": "Optional override for [`RulesConfig::unused_dev_dependencies`].",
1910
2017
  "anyOf": [
1911
2018
  {
1912
2019
  "$ref": "#/$defs/Severity"
@@ -1917,6 +2024,7 @@
1917
2024
  ]
1918
2025
  },
1919
2026
  "unused-optional-dependencies": {
2027
+ "description": "Optional override for [`RulesConfig::unused_optional_dependencies`].",
1920
2028
  "anyOf": [
1921
2029
  {
1922
2030
  "$ref": "#/$defs/Severity"
@@ -1927,6 +2035,7 @@
1927
2035
  ]
1928
2036
  },
1929
2037
  "unused-enum-members": {
2038
+ "description": "Optional override for [`RulesConfig::unused_enum_members`].",
1930
2039
  "anyOf": [
1931
2040
  {
1932
2041
  "$ref": "#/$defs/Severity"
@@ -1937,6 +2046,7 @@
1937
2046
  ]
1938
2047
  },
1939
2048
  "unused-class-members": {
2049
+ "description": "Optional override for [`RulesConfig::unused_class_members`].",
1940
2050
  "anyOf": [
1941
2051
  {
1942
2052
  "$ref": "#/$defs/Severity"
@@ -1947,6 +2057,7 @@
1947
2057
  ]
1948
2058
  },
1949
2059
  "unused-store-members": {
2060
+ "description": "Optional override for [`RulesConfig::unused_store_members`].",
1950
2061
  "anyOf": [
1951
2062
  {
1952
2063
  "$ref": "#/$defs/Severity"
@@ -1957,6 +2068,7 @@
1957
2068
  ]
1958
2069
  },
1959
2070
  "unprovided-injects": {
2071
+ "description": "Optional override for [`RulesConfig::unprovided_injects`].",
1960
2072
  "anyOf": [
1961
2073
  {
1962
2074
  "$ref": "#/$defs/Severity"
@@ -1967,6 +2079,7 @@
1967
2079
  ]
1968
2080
  },
1969
2081
  "unrendered-components": {
2082
+ "description": "Optional override for [`RulesConfig::unrendered_components`].",
1970
2083
  "anyOf": [
1971
2084
  {
1972
2085
  "$ref": "#/$defs/Severity"
@@ -1977,6 +2090,7 @@
1977
2090
  ]
1978
2091
  },
1979
2092
  "unused-component-props": {
2093
+ "description": "Optional override for [`RulesConfig::unused_component_props`].",
1980
2094
  "anyOf": [
1981
2095
  {
1982
2096
  "$ref": "#/$defs/Severity"
@@ -1987,6 +2101,7 @@
1987
2101
  ]
1988
2102
  },
1989
2103
  "unused-component-emits": {
2104
+ "description": "Optional override for [`RulesConfig::unused_component_emits`].",
1990
2105
  "anyOf": [
1991
2106
  {
1992
2107
  "$ref": "#/$defs/Severity"
@@ -1997,6 +2112,7 @@
1997
2112
  ]
1998
2113
  },
1999
2114
  "unused-component-inputs": {
2115
+ "description": "Optional override for [`RulesConfig::unused_component_inputs`].",
2000
2116
  "anyOf": [
2001
2117
  {
2002
2118
  "$ref": "#/$defs/Severity"
@@ -2007,6 +2123,7 @@
2007
2123
  ]
2008
2124
  },
2009
2125
  "unused-component-outputs": {
2126
+ "description": "Optional override for [`RulesConfig::unused_component_outputs`].",
2010
2127
  "anyOf": [
2011
2128
  {
2012
2129
  "$ref": "#/$defs/Severity"
@@ -2017,6 +2134,7 @@
2017
2134
  ]
2018
2135
  },
2019
2136
  "unused-svelte-events": {
2137
+ "description": "Optional override for [`RulesConfig::unused_svelte_events`].",
2020
2138
  "anyOf": [
2021
2139
  {
2022
2140
  "$ref": "#/$defs/Severity"
@@ -2027,6 +2145,7 @@
2027
2145
  ]
2028
2146
  },
2029
2147
  "unused-server-actions": {
2148
+ "description": "Optional override for [`RulesConfig::unused_server_actions`].",
2030
2149
  "anyOf": [
2031
2150
  {
2032
2151
  "$ref": "#/$defs/Severity"
@@ -2037,6 +2156,7 @@
2037
2156
  ]
2038
2157
  },
2039
2158
  "unused-load-data-keys": {
2159
+ "description": "Optional override for [`RulesConfig::unused_load_data_keys`].",
2040
2160
  "anyOf": [
2041
2161
  {
2042
2162
  "$ref": "#/$defs/Severity"
@@ -2047,6 +2167,7 @@
2047
2167
  ]
2048
2168
  },
2049
2169
  "prop-drilling": {
2170
+ "description": "Optional override for [`RulesConfig::prop_drilling`].",
2050
2171
  "anyOf": [
2051
2172
  {
2052
2173
  "$ref": "#/$defs/Severity"
@@ -2057,6 +2178,7 @@
2057
2178
  ]
2058
2179
  },
2059
2180
  "thin-wrapper": {
2181
+ "description": "Optional override for [`RulesConfig::thin_wrapper`].",
2060
2182
  "anyOf": [
2061
2183
  {
2062
2184
  "$ref": "#/$defs/Severity"
@@ -2067,6 +2189,7 @@
2067
2189
  ]
2068
2190
  },
2069
2191
  "duplicate-prop-shape": {
2192
+ "description": "Optional override for [`RulesConfig::duplicate_prop_shape`].",
2070
2193
  "anyOf": [
2071
2194
  {
2072
2195
  "$ref": "#/$defs/Severity"
@@ -2077,6 +2200,7 @@
2077
2200
  ]
2078
2201
  },
2079
2202
  "css-token-drift": {
2203
+ "description": "Optional override for [`RulesConfig::css_token_drift`].",
2080
2204
  "anyOf": [
2081
2205
  {
2082
2206
  "$ref": "#/$defs/Severity"
@@ -2087,6 +2211,7 @@
2087
2211
  ]
2088
2212
  },
2089
2213
  "css-duplicate-block": {
2214
+ "description": "Optional override for [`RulesConfig::css_duplicate_block`].",
2090
2215
  "anyOf": [
2091
2216
  {
2092
2217
  "$ref": "#/$defs/Severity"
@@ -2097,6 +2222,7 @@
2097
2222
  ]
2098
2223
  },
2099
2224
  "css-selector-complexity": {
2225
+ "description": "Optional override for [`RulesConfig::css_selector_complexity`].",
2100
2226
  "anyOf": [
2101
2227
  {
2102
2228
  "$ref": "#/$defs/Severity"
@@ -2107,6 +2233,7 @@
2107
2233
  ]
2108
2234
  },
2109
2235
  "css-dead-surface": {
2236
+ "description": "Optional override for [`RulesConfig::css_dead_surface`].",
2110
2237
  "anyOf": [
2111
2238
  {
2112
2239
  "$ref": "#/$defs/Severity"
@@ -2117,6 +2244,7 @@
2117
2244
  ]
2118
2245
  },
2119
2246
  "css-broken-reference": {
2247
+ "description": "Optional override for [`RulesConfig::css_broken_reference`].",
2120
2248
  "anyOf": [
2121
2249
  {
2122
2250
  "$ref": "#/$defs/Severity"
@@ -2127,6 +2255,7 @@
2127
2255
  ]
2128
2256
  },
2129
2257
  "unresolved-imports": {
2258
+ "description": "Optional override for [`RulesConfig::unresolved_imports`].",
2130
2259
  "anyOf": [
2131
2260
  {
2132
2261
  "$ref": "#/$defs/Severity"
@@ -2137,6 +2266,7 @@
2137
2266
  ]
2138
2267
  },
2139
2268
  "unlisted-dependencies": {
2269
+ "description": "Optional override for [`RulesConfig::unlisted_dependencies`].",
2140
2270
  "anyOf": [
2141
2271
  {
2142
2272
  "$ref": "#/$defs/Severity"
@@ -2147,6 +2277,7 @@
2147
2277
  ]
2148
2278
  },
2149
2279
  "duplicate-exports": {
2280
+ "description": "Optional override for [`RulesConfig::duplicate_exports`].",
2150
2281
  "anyOf": [
2151
2282
  {
2152
2283
  "$ref": "#/$defs/Severity"
@@ -2157,6 +2288,7 @@
2157
2288
  ]
2158
2289
  },
2159
2290
  "type-only-dependencies": {
2291
+ "description": "Optional override for [`RulesConfig::type_only_dependencies`].",
2160
2292
  "anyOf": [
2161
2293
  {
2162
2294
  "$ref": "#/$defs/Severity"
@@ -2167,6 +2299,7 @@
2167
2299
  ]
2168
2300
  },
2169
2301
  "test-only-dependencies": {
2302
+ "description": "Optional override for [`RulesConfig::test_only_dependencies`].",
2170
2303
  "anyOf": [
2171
2304
  {
2172
2305
  "$ref": "#/$defs/Severity"
@@ -2177,6 +2310,7 @@
2177
2310
  ]
2178
2311
  },
2179
2312
  "dev-dependencies-in-production": {
2313
+ "description": "Optional override for [`RulesConfig::dev_dependencies_in_production`].",
2180
2314
  "anyOf": [
2181
2315
  {
2182
2316
  "$ref": "#/$defs/Severity"
@@ -2187,6 +2321,7 @@
2187
2321
  ]
2188
2322
  },
2189
2323
  "circular-dependencies": {
2324
+ "description": "Optional override for [`RulesConfig::circular_dependencies`].",
2190
2325
  "anyOf": [
2191
2326
  {
2192
2327
  "$ref": "#/$defs/Severity"
@@ -2197,6 +2332,7 @@
2197
2332
  ]
2198
2333
  },
2199
2334
  "re-export-cycle": {
2335
+ "description": "Optional override for [`RulesConfig::re_export_cycle`].",
2200
2336
  "anyOf": [
2201
2337
  {
2202
2338
  "$ref": "#/$defs/Severity"
@@ -2207,6 +2343,7 @@
2207
2343
  ]
2208
2344
  },
2209
2345
  "boundary-violation": {
2346
+ "description": "Optional override for [`RulesConfig::boundary_violation`].",
2210
2347
  "anyOf": [
2211
2348
  {
2212
2349
  "$ref": "#/$defs/Severity"
@@ -2217,6 +2354,7 @@
2217
2354
  ]
2218
2355
  },
2219
2356
  "coverage-gaps": {
2357
+ "description": "Optional override for [`RulesConfig::coverage_gaps`].",
2220
2358
  "anyOf": [
2221
2359
  {
2222
2360
  "$ref": "#/$defs/Severity"
@@ -2227,6 +2365,7 @@
2227
2365
  ]
2228
2366
  },
2229
2367
  "feature-flags": {
2368
+ "description": "Optional override for [`RulesConfig::feature_flags`].",
2230
2369
  "anyOf": [
2231
2370
  {
2232
2371
  "$ref": "#/$defs/Severity"
@@ -2237,6 +2376,7 @@
2237
2376
  ]
2238
2377
  },
2239
2378
  "stale-suppressions": {
2379
+ "description": "Optional override for [`RulesConfig::stale_suppressions`].",
2240
2380
  "anyOf": [
2241
2381
  {
2242
2382
  "$ref": "#/$defs/Severity"
@@ -2247,6 +2387,7 @@
2247
2387
  ]
2248
2388
  },
2249
2389
  "require-suppression-reason": {
2390
+ "description": "Optional override for [`RulesConfig::require_suppression_reason`].",
2250
2391
  "anyOf": [
2251
2392
  {
2252
2393
  "$ref": "#/$defs/Severity"
@@ -2257,6 +2398,7 @@
2257
2398
  ]
2258
2399
  },
2259
2400
  "unused-catalog-entries": {
2401
+ "description": "Optional override for [`RulesConfig::unused_catalog_entries`].",
2260
2402
  "anyOf": [
2261
2403
  {
2262
2404
  "$ref": "#/$defs/Severity"
@@ -2267,6 +2409,7 @@
2267
2409
  ]
2268
2410
  },
2269
2411
  "empty-catalog-groups": {
2412
+ "description": "Optional override for [`RulesConfig::empty_catalog_groups`].",
2270
2413
  "anyOf": [
2271
2414
  {
2272
2415
  "$ref": "#/$defs/Severity"
@@ -2277,6 +2420,7 @@
2277
2420
  ]
2278
2421
  },
2279
2422
  "unresolved-catalog-references": {
2423
+ "description": "Optional override for [`RulesConfig::unresolved_catalog_references`].",
2280
2424
  "anyOf": [
2281
2425
  {
2282
2426
  "$ref": "#/$defs/Severity"
@@ -2287,6 +2431,7 @@
2287
2431
  ]
2288
2432
  },
2289
2433
  "unused-dependency-overrides": {
2434
+ "description": "Optional override for [`RulesConfig::unused_dependency_overrides`].",
2290
2435
  "anyOf": [
2291
2436
  {
2292
2437
  "$ref": "#/$defs/Severity"
@@ -2297,6 +2442,7 @@
2297
2442
  ]
2298
2443
  },
2299
2444
  "misconfigured-dependency-overrides": {
2445
+ "description": "Optional override for [`RulesConfig::misconfigured_dependency_overrides`].",
2300
2446
  "anyOf": [
2301
2447
  {
2302
2448
  "$ref": "#/$defs/Severity"
@@ -2307,6 +2453,7 @@
2307
2453
  ]
2308
2454
  },
2309
2455
  "security-client-server-leak": {
2456
+ "description": "Optional override for [`RulesConfig::security_client_server_leak`].",
2310
2457
  "anyOf": [
2311
2458
  {
2312
2459
  "$ref": "#/$defs/Severity"
@@ -2317,6 +2464,7 @@
2317
2464
  ]
2318
2465
  },
2319
2466
  "security-sink": {
2467
+ "description": "Optional override for [`RulesConfig::security_sink`].",
2320
2468
  "anyOf": [
2321
2469
  {
2322
2470
  "$ref": "#/$defs/Severity"
@@ -2327,6 +2475,7 @@
2327
2475
  ]
2328
2476
  },
2329
2477
  "policy-violation": {
2478
+ "description": "Optional override for [`RulesConfig::policy_violation`].",
2330
2479
  "anyOf": [
2331
2480
  {
2332
2481
  "$ref": "#/$defs/Severity"
@@ -2337,6 +2486,7 @@
2337
2486
  ]
2338
2487
  },
2339
2488
  "invalid-client-export": {
2489
+ "description": "Optional override for [`RulesConfig::invalid_client_export`].",
2340
2490
  "anyOf": [
2341
2491
  {
2342
2492
  "$ref": "#/$defs/Severity"
@@ -2347,6 +2497,7 @@
2347
2497
  ]
2348
2498
  },
2349
2499
  "mixed-client-server-barrel": {
2500
+ "description": "Optional override for [`RulesConfig::mixed_client_server_barrel`].",
2350
2501
  "anyOf": [
2351
2502
  {
2352
2503
  "$ref": "#/$defs/Severity"
@@ -2357,6 +2508,7 @@
2357
2508
  ]
2358
2509
  },
2359
2510
  "misplaced-directive": {
2511
+ "description": "Optional override for [`RulesConfig::misplaced_directive`].",
2360
2512
  "anyOf": [
2361
2513
  {
2362
2514
  "$ref": "#/$defs/Severity"
@@ -2367,6 +2519,7 @@
2367
2519
  ]
2368
2520
  },
2369
2521
  "route-collision": {
2522
+ "description": "Optional override for [`RulesConfig::route_collision`].",
2370
2523
  "anyOf": [
2371
2524
  {
2372
2525
  "$ref": "#/$defs/Severity"
@@ -2377,6 +2530,7 @@
2377
2530
  ]
2378
2531
  },
2379
2532
  "dynamic-segment-name-conflict": {
2533
+ "description": "Optional override for [`RulesConfig::dynamic_segment_name_conflict`].",
2380
2534
  "anyOf": [
2381
2535
  {
2382
2536
  "$ref": "#/$defs/Severity"
@@ -2389,6 +2543,7 @@
2389
2543
  }
2390
2544
  },
2391
2545
  "RegressionConfig": {
2546
+ "description": "The `regression` config section holding the saved issue-count baseline for\nthe `--fail-on-regression` gate.",
2392
2547
  "type": "object",
2393
2548
  "properties": {
2394
2549
  "baseline": {
@@ -2405,6 +2560,7 @@
2405
2560
  }
2406
2561
  },
2407
2562
  "RegressionBaseline": {
2563
+ "description": "Saved per-issue-type counts written by `--save-baseline` and compared by\n`--fail-on-regression`. Every count defaults to `0` when its key is missing,\nso hand-trimmed baselines stay loadable.",
2408
2564
  "type": "object",
2409
2565
  "properties": {
2410
2566
  "analysisIdentity": {
@@ -2420,126 +2576,147 @@
2420
2576
  }
2421
2577
  },
2422
2578
  "totalIssues": {
2579
+ "description": "Baseline count across all issue types.",
2423
2580
  "type": "integer",
2424
2581
  "format": "uint",
2425
2582
  "minimum": 0,
2426
2583
  "default": 0
2427
2584
  },
2428
2585
  "unusedFiles": {
2586
+ "description": "Baseline count of `unused-files` findings.",
2429
2587
  "type": "integer",
2430
2588
  "format": "uint",
2431
2589
  "minimum": 0,
2432
2590
  "default": 0
2433
2591
  },
2434
2592
  "unusedExports": {
2593
+ "description": "Baseline count of `unused-exports` findings.",
2435
2594
  "type": "integer",
2436
2595
  "format": "uint",
2437
2596
  "minimum": 0,
2438
2597
  "default": 0
2439
2598
  },
2440
2599
  "unusedTypes": {
2600
+ "description": "Baseline count of `unused-types` findings.",
2441
2601
  "type": "integer",
2442
2602
  "format": "uint",
2443
2603
  "minimum": 0,
2444
2604
  "default": 0
2445
2605
  },
2446
2606
  "unusedDependencies": {
2607
+ "description": "Baseline count of `unused-dependencies` findings.",
2447
2608
  "type": "integer",
2448
2609
  "format": "uint",
2449
2610
  "minimum": 0,
2450
2611
  "default": 0
2451
2612
  },
2452
2613
  "unusedDevDependencies": {
2614
+ "description": "Baseline count of `unused-dev-dependencies` findings.",
2453
2615
  "type": "integer",
2454
2616
  "format": "uint",
2455
2617
  "minimum": 0,
2456
2618
  "default": 0
2457
2619
  },
2458
2620
  "unusedOptionalDependencies": {
2621
+ "description": "Baseline count of `unused-optional-dependencies` findings.",
2459
2622
  "type": "integer",
2460
2623
  "format": "uint",
2461
2624
  "minimum": 0,
2462
2625
  "default": 0
2463
2626
  },
2464
2627
  "unusedEnumMembers": {
2628
+ "description": "Baseline count of `unused-enum-members` findings.",
2465
2629
  "type": "integer",
2466
2630
  "format": "uint",
2467
2631
  "minimum": 0,
2468
2632
  "default": 0
2469
2633
  },
2470
2634
  "unusedClassMembers": {
2635
+ "description": "Baseline count of `unused-class-members` findings.",
2471
2636
  "type": "integer",
2472
2637
  "format": "uint",
2473
2638
  "minimum": 0,
2474
2639
  "default": 0
2475
2640
  },
2476
2641
  "unresolvedImports": {
2642
+ "description": "Baseline count of `unresolved-imports` findings.",
2477
2643
  "type": "integer",
2478
2644
  "format": "uint",
2479
2645
  "minimum": 0,
2480
2646
  "default": 0
2481
2647
  },
2482
2648
  "unlistedDependencies": {
2649
+ "description": "Baseline count of `unlisted-dependencies` findings.",
2483
2650
  "type": "integer",
2484
2651
  "format": "uint",
2485
2652
  "minimum": 0,
2486
2653
  "default": 0
2487
2654
  },
2488
2655
  "duplicateExports": {
2656
+ "description": "Baseline count of `duplicate-exports` findings.",
2489
2657
  "type": "integer",
2490
2658
  "format": "uint",
2491
2659
  "minimum": 0,
2492
2660
  "default": 0
2493
2661
  },
2494
2662
  "circularDependencies": {
2663
+ "description": "Baseline count of `circular-dependencies` findings.",
2495
2664
  "type": "integer",
2496
2665
  "format": "uint",
2497
2666
  "minimum": 0,
2498
2667
  "default": 0
2499
2668
  },
2500
2669
  "reExportCycles": {
2670
+ "description": "Baseline count of `re-export-cycle` findings.",
2501
2671
  "type": "integer",
2502
2672
  "format": "uint",
2503
2673
  "minimum": 0,
2504
2674
  "default": 0
2505
2675
  },
2506
2676
  "typeOnlyDependencies": {
2677
+ "description": "Baseline count of `type-only-dependencies` findings.",
2507
2678
  "type": "integer",
2508
2679
  "format": "uint",
2509
2680
  "minimum": 0,
2510
2681
  "default": 0
2511
2682
  },
2512
2683
  "testOnlyDependencies": {
2684
+ "description": "Baseline count of `test-only-dependencies` findings.",
2513
2685
  "type": "integer",
2514
2686
  "format": "uint",
2515
2687
  "minimum": 0,
2516
2688
  "default": 0
2517
2689
  },
2518
2690
  "devDependenciesInProduction": {
2691
+ "description": "Baseline count of `dev-dependencies-in-production` findings.",
2519
2692
  "type": "integer",
2520
2693
  "format": "uint",
2521
2694
  "minimum": 0,
2522
2695
  "default": 0
2523
2696
  },
2524
2697
  "boundaryViolations": {
2698
+ "description": "Baseline count of `boundary-violation` findings.",
2525
2699
  "type": "integer",
2526
2700
  "format": "uint",
2527
2701
  "minimum": 0,
2528
2702
  "default": 0
2529
2703
  },
2530
2704
  "boundaryCoverageViolations": {
2705
+ "description": "Baseline count of boundary-coverage-violation findings.",
2531
2706
  "type": "integer",
2532
2707
  "format": "uint",
2533
2708
  "minimum": 0,
2534
2709
  "default": 0
2535
2710
  },
2536
2711
  "boundaryCallViolations": {
2712
+ "description": "Baseline count of boundary-call-violation findings.",
2537
2713
  "type": "integer",
2538
2714
  "format": "uint",
2539
2715
  "minimum": 0,
2540
2716
  "default": 0
2541
2717
  },
2542
2718
  "policyViolations": {
2719
+ "description": "Baseline count of `policy-violation` findings.",
2543
2720
  "type": "integer",
2544
2721
  "format": "uint",
2545
2722
  "minimum": 0,
@@ -2656,6 +2833,7 @@
2656
2833
  ]
2657
2834
  },
2658
2835
  "AuditConfig": {
2836
+ "description": "The `audit` config section: in-repo defaults for `fallow audit`, each\noverridable by its matching CLI flag.",
2659
2837
  "type": "object",
2660
2838
  "properties": {
2661
2839
  "gate": {
@@ -2698,7 +2876,7 @@
2698
2876
  ]
2699
2877
  },
2700
2878
  "cacheMaxAgeDays": {
2701
- "description": "Garbage-collection threshold, in whole days, for the persistent reusable base-snapshot worktree caches `fallow audit` creates: entries older than this window are swept on each audit run. Set to control cache accumulation; `0` disables the sweep and unset defaults to 30 days. The `FALLOW_AUDIT_CACHE_MAX_AGE_DAYS` environment variable overrides this field.",
2879
+ "description": "Garbage-collection threshold, in whole days, for the persistent reusable base-snapshot worktree caches `fallow audit` creates: entries older than this window are swept on each audit run. Set to control cache accumulation; `0` disables the sweep and unset defaults to 30 days. Each sweep also reclaims abandoned entries minted under other repo identities (deleted or moved repos, other git worktrees) once they age past this repo's threshold; entries whose recorded owner root still exists are skipped and stay governed by that repo's own setting. The `FALLOW_AUDIT_CACHE_MAX_AGE_DAYS` environment variable overrides this field.",
2702
2880
  "type": [
2703
2881
  "integer",
2704
2882
  "null"
@@ -2716,13 +2894,22 @@
2716
2894
  }
2717
2895
  },
2718
2896
  "AuditGate": {
2719
- "type": "string",
2720
- "enum": [
2721
- "new-only",
2722
- "all"
2897
+ "description": "Value of `audit.gate`: which findings drive the `fallow audit` verdict.",
2898
+ "oneOf": [
2899
+ {
2900
+ "description": "Fail only on findings the current changeset introduced, determined by\na base-snapshot attribution pass. The default.",
2901
+ "type": "string",
2902
+ "const": "new-only"
2903
+ },
2904
+ {
2905
+ "description": "Fail on every finding in changed files, skipping the attribution pass.",
2906
+ "type": "string",
2907
+ "const": "all"
2908
+ }
2723
2909
  ]
2724
2910
  },
2725
2911
  "CacheConfig": {
2912
+ "description": "The `cache` config section: location and size ceiling of fallow's\npersistent caches (default directory `<root>/.fallow`).",
2726
2913
  "type": "object",
2727
2914
  "properties": {
2728
2915
  "dir": {