fallow 3.27.0 → 3.29.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/capabilities.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.27.0",
3
+ "version": "3.29.0",
4
4
  "manifest_version": "1",
5
5
  "description": "Codebase analyzer for TypeScript/JavaScript: unused code, circular dependencies, code duplication, complexity hotspots, and architecture boundary violations",
6
6
  "global_flags": [
@@ -132,7 +132,7 @@
132
132
  "name": "--baseline",
133
133
  "type": "string",
134
134
  "required": false,
135
- "description": "Compare against a previously saved baseline file"
135
+ "description": "Compare against a previously saved baseline file. Used by bare `fallow`, `dead-code`, `dupes` and `health`; other subcommands reject it"
136
136
  },
137
137
  {
138
138
  "name": "--baseline-mode",
@@ -154,7 +154,7 @@
154
154
  "name": "--save-baseline",
155
155
  "type": "string",
156
156
  "required": false,
157
- "description": "Save the current results as a baseline file"
157
+ "description": "Save the current results as a baseline file. Used by bare `fallow`, `dead-code`, `dupes` and `health`; other subcommands reject it. The path must resolve inside the project root, its Git work tree, the CI workspace or a temp directory"
158
158
  },
159
159
  {
160
160
  "name": "--production",
@@ -295,13 +295,13 @@
295
295
  "name": "--sarif-file",
296
296
  "type": "string",
297
297
  "required": false,
298
- "description": "Write SARIF output to a file (in addition to the primary --format output)"
298
+ "description": "Write SARIF output to a file (in addition to the primary --format output). Used by bare `fallow`, `dead-code` and `security`. The path must resolve inside the project root, its Git work tree, the CI workspace or a temp directory"
299
299
  },
300
300
  {
301
301
  "name": "--output-file",
302
302
  "type": "string",
303
303
  "required": false,
304
- "description": "Write the report to a file instead of stdout, for any --format (no ANSI codes). Useful on large projects where the terminal scrollback truncates the top. Progress and the confirmation stay on stderr",
304
+ "description": "Write the report to a file instead of stdout, for any --format (no ANSI codes). Useful on large projects where the terminal scrollback truncates the top. Progress and the confirmation stay on stderr. The path must resolve inside the project root, its Git work tree, the CI workspace or a temp directory",
305
305
  "short": "-o"
306
306
  },
307
307
  {
@@ -330,6 +330,16 @@
330
330
  "false"
331
331
  ]
332
332
  },
333
+ {
334
+ "name": "--fail-on-parse-error",
335
+ "type": "bool",
336
+ "required": false,
337
+ "description": "Exit with code 1 if fallow could not parse a source file cleanly",
338
+ "possible_values": [
339
+ "true",
340
+ "false"
341
+ ]
342
+ },
333
343
  {
334
344
  "name": "--tolerance",
335
345
  "type": "string",
@@ -347,7 +357,7 @@
347
357
  "name": "--save-regression-baseline",
348
358
  "type": "string",
349
359
  "required": false,
350
- "description": "Save the current issue counts as a regression baseline. Omit PATH to update regression.baseline in the discovered fallow config, or create .fallowrc.json when none exists. Provide PATH to write a standalone file"
360
+ "description": "Save the current issue counts as a regression baseline. Omit PATH to update regression.baseline in the discovered fallow config, or create .fallowrc.json when none exists. Provide PATH to write a standalone file; PATH must resolve inside the project root, its Git work tree, the CI workspace or a temp directory"
351
361
  },
352
362
  {
353
363
  "name": "--only",
@@ -481,13 +491,13 @@
481
491
  "name": "--save-snapshot",
482
492
  "type": "string",
483
493
  "required": false,
484
- "description": "Save a vital signs snapshot for trend tracking in combined mode. Provide a path or omit for the default `.fallow/snapshots/` location"
494
+ "description": "Save a vital signs snapshot for trend tracking in combined mode. Provide a path or omit for the default `.fallow/snapshots/` location. A given path must resolve inside the project root, its Git work tree, the CI workspace or a temp directory"
485
495
  },
486
496
  {
487
497
  "name": "--coverage",
488
498
  "type": "string",
489
499
  "required": false,
490
- "description": "Path to Istanbul coverage data for exact CRAP scores in combined mode. Also settable via `FALLOW_COVERAGE` or `health.coverage`"
500
+ "description": "Path to Istanbul or raw V8 coverage data for exact CRAP scores in combined mode. Also settable via `FALLOW_COVERAGE` or `health.coverage`"
491
501
  },
492
502
  {
493
503
  "name": "--coverage-root",
@@ -495,6 +505,18 @@
495
505
  "required": false,
496
506
  "description": "Absolute prefix to strip from Istanbul file paths in combined mode. Also settable via `FALLOW_COVERAGE_ROOT` or `health.coverageRoot`"
497
507
  },
508
+ {
509
+ "name": "--dupes-baseline",
510
+ "type": "string",
511
+ "required": false,
512
+ "description": "Compare duplication clone groups against a saved baseline in combined mode (produced by `fallow dupes --save-baseline`)"
513
+ },
514
+ {
515
+ "name": "--health-baseline",
516
+ "type": "string",
517
+ "required": false,
518
+ "description": "Compare health findings against a saved baseline in combined mode (produced by `fallow health --save-baseline`)"
519
+ },
498
520
  {
499
521
  "name": "--include-entry-exports",
500
522
  "type": "bool",
@@ -597,6 +619,16 @@
597
619
  "false"
598
620
  ]
599
621
  },
622
+ {
623
+ "name": "--deprecated-exports-in-use",
624
+ "type": "bool",
625
+ "required": false,
626
+ "description": "Opt in to `@deprecated` exports that are still in use and only report that issue type",
627
+ "possible_values": [
628
+ "true",
629
+ "false"
630
+ ]
631
+ },
600
632
  {
601
633
  "name": "--unused-enum-members",
602
634
  "type": "bool",
@@ -1591,7 +1623,7 @@
1591
1623
  "name": "--min-severity",
1592
1624
  "type": "string",
1593
1625
  "required": false,
1594
- "description": "Only exit with error for findings at or above this severity. Use --min-severity critical to ignore moderate/high findings in CI. Composes with --min-score (the run fails if either gate trips)",
1626
+ "description": "Only exit with error for findings at or above this severity. Use --min-severity critical to ignore moderate/high findings in CI. Composes with --min-score (the run fails if either gate trips). The complexity-* rules apply first: a finding whose rule is warn never fails the run, whatever its severity",
1595
1627
  "possible_values": [
1596
1628
  "moderate",
1597
1629
  "high",
@@ -1624,7 +1656,7 @@
1624
1656
  "name": "--save-snapshot",
1625
1657
  "type": "string",
1626
1658
  "required": false,
1627
- "description": "Save a vital signs snapshot for trend tracking. Defaults to `.fallow/snapshots/{timestamp}.json` if no path is given. Forces file-scores, hotspot, and score computation for complete metrics"
1659
+ "description": "Save a vital signs snapshot for trend tracking. Defaults to `.fallow/snapshots/{timestamp}.json` if no path is given. A given path must resolve inside the project root, its Git work tree, the CI workspace or a temp directory. Forces file-scores, hotspot, and score computation for complete metrics"
1628
1660
  },
1629
1661
  {
1630
1662
  "name": "--trend",
@@ -1640,7 +1672,7 @@
1640
1672
  "name": "--coverage",
1641
1673
  "type": "string",
1642
1674
  "required": false,
1643
- "description": "Path to coverage data (coverage-final.json) for exact per-function CRAP scores. Generate with `jest --coverage`, `vitest run --coverage --provider istanbul`, or any Istanbul-compatible tool. Requires Istanbul format (not v8/c8 native format). Accepts a single Istanbul coverage map JSON file or a directory containing coverage-final.json. Use --coverage-root when the file was generated in a different environment (CI runner, Docker). Affects CRAP scores only, not --coverage-gaps. Also configurable via FALLOW_COVERAGE env var"
1675
+ "description": "Path to coverage data for exact per-function CRAP scores. Accepts an Istanbul coverage map JSON file (coverage-final.json, from `jest --coverage`, `vitest run --coverage`, c8 or nyc), a directory containing coverage-final.json, a raw V8 coverage directory (`NODE_V8_COVERAGE=<dir> node --test`), or a single V8 coverage JSON file. Transpiled V8 scripts (tsx, bundles) map back to their source files through the source map that Node records in the dump. A script that differs from the file on disk and has no source map keeps the estimate. Use --coverage-root when the data was generated in a different environment (CI runner, Docker). Affects CRAP scores only, not --coverage-gaps. Also configurable via FALLOW_COVERAGE env var"
1644
1676
  },
1645
1677
  {
1646
1678
  "name": "--coverage-root",
@@ -1652,7 +1684,7 @@
1652
1684
  "name": "--runtime-coverage",
1653
1685
  "type": "string",
1654
1686
  "required": false,
1655
- "description": "File or directory containing runtime coverage input. Accepts a V8 coverage directory, a single V8 JSON file, or a single Istanbul coverage map JSON file (commonly coverage-final.json)"
1687
+ "description": "File or directory containing runtime coverage input. Accepts a V8 coverage directory, a single V8 JSON file, or a single Istanbul coverage map JSON file (commonly coverage-final.json). A single local capture is free. Continuous or multi-capture monitoring needs a license (see `fallow license`)"
1656
1688
  },
1657
1689
  {
1658
1690
  "name": "--min-invocations-hot",
@@ -1779,7 +1811,7 @@
1779
1811
  "name": "--coverage",
1780
1812
  "type": "string",
1781
1813
  "required": false,
1782
- "description": "Path to Istanbul-format coverage data (coverage-final.json) for accurate per-function CRAP scores in the health sub-analysis. Also configurable via FALLOW_COVERAGE or health.coverage"
1814
+ "description": "Path to Istanbul coverage data (coverage-final.json) or raw V8 coverage (a `NODE_V8_COVERAGE` directory or one V8 JSON file) for accurate per-function CRAP scores in the health sub-analysis. Also configurable via FALLOW_COVERAGE or health.coverage"
1783
1815
  },
1784
1816
  {
1785
1817
  "name": "--coverage-root",
@@ -1831,7 +1863,7 @@
1831
1863
  "name": "--runtime-coverage",
1832
1864
  "type": "string",
1833
1865
  "required": false,
1834
- "description": "Paid runtime-coverage sidecar input. Accepts a V8 directory, a single V8 JSON file, or an Istanbul coverage map JSON. Spawns the `fallow-cov` sidecar as part of the audit pipeline so the `hot-path-touched` verdict surfaces alongside dead-code and complexity findings without requiring a second `fallow health` invocation in CI. License-gated; the verdict is informational (no exit code change) until a future `--gate hot-path-touched` knob lands"
1866
+ "description": "Runtime coverage input. Accepts a V8 directory, a single V8 JSON file, or an Istanbul coverage map JSON. Runs the `fallow-cov` sidecar inside the audit, so the `hot-path-touched` verdict shows next to the dead-code and complexity findings without a second `fallow health` run in CI. The verdict is informational and does not change the exit code. A single local capture is free. Continuous or multi-capture monitoring needs a license (see `fallow license`)"
1835
1867
  },
1836
1868
  {
1837
1869
  "name": "--min-invocations-hot",
@@ -1984,7 +2016,7 @@
1984
2016
  "name": "--runtime-coverage",
1985
2017
  "type": "string",
1986
2018
  "required": false,
1987
- "description": "Paid runtime-coverage sidecar input. Accepts a V8 directory, a single V8 JSON file, or an Istanbul coverage map JSON. When set, `fallow security` annotates tainted-sink candidates with production runtime state and uses that state as an additive ranking signal"
2019
+ "description": "Runtime coverage input. Accepts a V8 directory, a single V8 JSON file, or an Istanbul coverage map JSON. When set, `fallow security` adds production runtime state to tainted-sink candidates and uses that state as an extra ranking signal. A single local capture is free. Continuous or multi-capture monitoring needs a license (see `fallow license`)"
1988
2020
  },
1989
2021
  {
1990
2022
  "name": "--min-invocations-hot",
@@ -2355,6 +2387,43 @@
2355
2387
  "license_note": null,
2356
2388
  "docs_url": "https://docs.fallow.tools/explanations/dead-code#private-type-leaks"
2357
2389
  },
2390
+ {
2391
+ "id": "deprecated-export-in-use",
2392
+ "rule_id": "fallow/deprecated-export-in-use",
2393
+ "command": "dead-code",
2394
+ "category": "Dead code",
2395
+ "description": "Export marked @deprecated is still referenced",
2396
+ "label": "Deprecated Exports in Use",
2397
+ "config_key": "deprecated-exports-in-use",
2398
+ "registry_index": 5,
2399
+ "aliases": [],
2400
+ "lsp": false,
2401
+ "filter_flag": "--deprecated-exports-in-use",
2402
+ "result_key": "deprecated_exports_in_use",
2403
+ "summary_label": "Deprecated exports in use",
2404
+ "summary_docs_anchor": "deprecated-exports-in-use",
2405
+ "sarif_rule_ids": [
2406
+ "fallow/deprecated-export-in-use"
2407
+ ],
2408
+ "codeclimate_check_names": [
2409
+ "fallow/deprecated-export-in-use"
2410
+ ],
2411
+ "ts_alias": {
2412
+ "name": "DeprecatedExportInUse",
2413
+ "parent": "DeprecatedExportInUseFinding"
2414
+ },
2415
+ "counts_in_total": true,
2416
+ "fixable": false,
2417
+ "suppressible": true,
2418
+ "suppress_comment": "// fallow-ignore-next-line deprecated-export-in-use",
2419
+ "default_severity": "off",
2420
+ "opt_in": true,
2421
+ "frameworks": [],
2422
+ "note": "Opt-in migration sweep; the rule defaults to off",
2423
+ "license": "free",
2424
+ "license_note": null,
2425
+ "docs_url": "https://docs.fallow.tools/explanations/dead-code#deprecated-exports-in-use"
2426
+ },
2358
2427
  {
2359
2428
  "id": "unused-dependency",
2360
2429
  "rule_id": "fallow/unused-dependency",
@@ -2363,7 +2432,7 @@
2363
2432
  "description": "Dependency listed but never imported",
2364
2433
  "label": "Unused Dependencies",
2365
2434
  "config_key": "unused-dependencies",
2366
- "registry_index": 5,
2435
+ "registry_index": 6,
2367
2436
  "aliases": [],
2368
2437
  "lsp": true,
2369
2438
  "filter_flag": "--unused-deps",
@@ -2400,7 +2469,7 @@
2400
2469
  "description": "Dev dependency listed but never imported",
2401
2470
  "label": "Unused Dev Dependencies",
2402
2471
  "config_key": "unused-dev-dependencies",
2403
- "registry_index": 6,
2472
+ "registry_index": 7,
2404
2473
  "aliases": [
2405
2474
  "unused-dev-deps",
2406
2475
  "unused-dev-dependencies"
@@ -2440,7 +2509,7 @@
2440
2509
  "description": "Optional dependency listed but never imported",
2441
2510
  "label": "Unused Optional Dependencies",
2442
2511
  "config_key": "unused-optional-dependencies",
2443
- "registry_index": 7,
2512
+ "registry_index": 8,
2444
2513
  "aliases": [
2445
2514
  "unused-optional-deps",
2446
2515
  "unused-optional-dependencies"
@@ -2480,7 +2549,7 @@
2480
2549
  "description": "Production dependency only used via type-only imports",
2481
2550
  "label": "Type-Only Dependencies",
2482
2551
  "config_key": "type-only-dependencies",
2483
- "registry_index": 14,
2552
+ "registry_index": 15,
2484
2553
  "aliases": [],
2485
2554
  "lsp": true,
2486
2555
  "filter_flag": "--unused-deps",
@@ -2517,7 +2586,7 @@
2517
2586
  "description": "Production dependency only imported by test files",
2518
2587
  "label": "Test-Only Dependencies",
2519
2588
  "config_key": "test-only-dependencies",
2520
- "registry_index": 15,
2589
+ "registry_index": 16,
2521
2590
  "aliases": [],
2522
2591
  "lsp": true,
2523
2592
  "filter_flag": "--unused-deps",
@@ -2554,7 +2623,7 @@
2554
2623
  "description": "devDependency imported by production code with a runtime import",
2555
2624
  "label": "Dev Dependencies Used in Production",
2556
2625
  "config_key": "dev-dependencies-in-production",
2557
- "registry_index": 16,
2626
+ "registry_index": 17,
2558
2627
  "aliases": [],
2559
2628
  "lsp": true,
2560
2629
  "filter_flag": "--unused-deps",
@@ -2591,7 +2660,7 @@
2591
2660
  "description": "Enum member is never referenced",
2592
2661
  "label": "Unused Enum Members",
2593
2662
  "config_key": "unused-enum-members",
2594
- "registry_index": 8,
2663
+ "registry_index": 9,
2595
2664
  "aliases": [],
2596
2665
  "lsp": true,
2597
2666
  "filter_flag": "--unused-enum-members",
@@ -2628,7 +2697,7 @@
2628
2697
  "description": "Class member is never referenced",
2629
2698
  "label": "Unused Class Members",
2630
2699
  "config_key": "unused-class-members",
2631
- "registry_index": 9,
2700
+ "registry_index": 10,
2632
2701
  "aliases": [],
2633
2702
  "lsp": true,
2634
2703
  "filter_flag": "--unused-class-members",
@@ -2665,7 +2734,7 @@
2665
2734
  "description": "Store member is never accessed by any consumer",
2666
2735
  "label": "Unused Store Members",
2667
2736
  "config_key": "unused-store-members",
2668
- "registry_index": 10,
2737
+ "registry_index": 11,
2669
2738
  "aliases": [
2670
2739
  "unused-store-members"
2671
2740
  ],
@@ -2704,7 +2773,7 @@
2704
2773
  "description": "Import could not be resolved",
2705
2774
  "label": "Unresolved Imports",
2706
2775
  "config_key": "unresolved-imports",
2707
- "registry_index": 11,
2776
+ "registry_index": 12,
2708
2777
  "aliases": [],
2709
2778
  "lsp": true,
2710
2779
  "filter_flag": "--unresolved-imports",
@@ -2741,7 +2810,7 @@
2741
2810
  "description": "Dependency used but not in package.json",
2742
2811
  "label": "Unlisted Dependencies",
2743
2812
  "config_key": "unlisted-dependencies",
2744
- "registry_index": 12,
2813
+ "registry_index": 13,
2745
2814
  "aliases": [],
2746
2815
  "lsp": true,
2747
2816
  "filter_flag": "--unlisted-deps",
@@ -2778,7 +2847,7 @@
2778
2847
  "description": "Export name appears in multiple modules",
2779
2848
  "label": "Duplicate Exports",
2780
2849
  "config_key": "duplicate-exports",
2781
- "registry_index": 13,
2850
+ "registry_index": 14,
2782
2851
  "aliases": [],
2783
2852
  "lsp": true,
2784
2853
  "filter_flag": "--duplicate-exports",
@@ -2815,7 +2884,7 @@
2815
2884
  "description": "Circular dependency chain detected",
2816
2885
  "label": "Circular Dependencies",
2817
2886
  "config_key": "circular-dependencies",
2818
- "registry_index": 17,
2887
+ "registry_index": 18,
2819
2888
  "aliases": [
2820
2889
  "circular-dependencies"
2821
2890
  ],
@@ -2854,7 +2923,7 @@
2854
2923
  "description": "Two or more barrel files re-export from each other in a loop",
2855
2924
  "label": "Re-Export Cycles",
2856
2925
  "config_key": "re-export-cycle",
2857
- "registry_index": 18,
2926
+ "registry_index": 19,
2858
2927
  "aliases": [
2859
2928
  "re-export-cycles",
2860
2929
  "reexport-cycle",
@@ -2895,7 +2964,7 @@
2895
2964
  "description": "Import crosses a configured architecture boundary",
2896
2965
  "label": "Boundary Violations",
2897
2966
  "config_key": "boundary-violation",
2898
- "registry_index": 19,
2967
+ "registry_index": 20,
2899
2968
  "aliases": [],
2900
2969
  "lsp": true,
2901
2970
  "filter_flag": "--boundary-violations",
@@ -2932,7 +3001,7 @@
2932
3001
  "description": "Source file matches no configured architecture boundary zone",
2933
3002
  "label": "Boundary Coverage",
2934
3003
  "config_key": "boundary-violation",
2935
- "registry_index": 20,
3004
+ "registry_index": 21,
2936
3005
  "aliases": [
2937
3006
  "boundary-coverage-violations"
2938
3007
  ],
@@ -2968,7 +3037,7 @@
2968
3037
  "description": "Zoned file calls a callee its zone forbids",
2969
3038
  "label": "Boundary Call Violations",
2970
3039
  "config_key": "boundary-violation",
2971
- "registry_index": 21,
3040
+ "registry_index": 22,
2972
3041
  "aliases": [
2973
3042
  "boundary-calls",
2974
3043
  "boundary-call-violations"
@@ -3005,7 +3074,7 @@
3005
3074
  "description": "Banned usage matched a rule-pack rule",
3006
3075
  "label": "Policy Violations",
3007
3076
  "config_key": "policy-violation",
3008
- "registry_index": 22,
3077
+ "registry_index": 23,
3009
3078
  "aliases": [
3010
3079
  "policy-violations"
3011
3080
  ],
@@ -3041,7 +3110,7 @@
3041
3110
  "description": "Suppression comment or tag no longer matches any issue",
3042
3111
  "label": "Stale Suppressions",
3043
3112
  "config_key": "stale-suppressions",
3044
- "registry_index": 37,
3113
+ "registry_index": 38,
3045
3114
  "aliases": [],
3046
3115
  "lsp": true,
3047
3116
  "filter_flag": "--stale-suppressions",
@@ -3077,7 +3146,7 @@
3077
3146
  "description": "Suppression comment omits a required reason",
3078
3147
  "label": "Missing Suppression Reasons",
3079
3148
  "config_key": "require-suppression-reason",
3080
- "registry_index": 38,
3149
+ "registry_index": 39,
3081
3150
  "aliases": [
3082
3151
  "missing-suppression-reasons"
3083
3152
  ],
@@ -3109,7 +3178,7 @@
3109
3178
  "description": "Catalog entry not referenced by any workspace package",
3110
3179
  "label": "Unused Catalog Entries",
3111
3180
  "config_key": "unused-catalog-entries",
3112
- "registry_index": 39,
3181
+ "registry_index": 40,
3113
3182
  "aliases": [
3114
3183
  "catalog",
3115
3184
  "unused-catalog-entries"
@@ -3149,7 +3218,7 @@
3149
3218
  "description": "Named catalog group has no entries",
3150
3219
  "label": "Empty Catalog Groups",
3151
3220
  "config_key": "empty-catalog-groups",
3152
- "registry_index": 40,
3221
+ "registry_index": 41,
3153
3222
  "aliases": [
3154
3223
  "empty-catalog",
3155
3224
  "empty-catalog-groups"
@@ -3189,7 +3258,7 @@
3189
3258
  "description": "package.json references a catalog that does not declare the package",
3190
3259
  "label": "Unresolved Catalog References",
3191
3260
  "config_key": "unresolved-catalog-references",
3192
- "registry_index": 41,
3261
+ "registry_index": 42,
3193
3262
  "aliases": [
3194
3263
  "unresolved-catalog",
3195
3264
  "unresolved-catalog-references"
@@ -3229,7 +3298,7 @@
3229
3298
  "description": "Package-manager override target is not declared or resolved",
3230
3299
  "label": "Unused Dependency Overrides",
3231
3300
  "config_key": "unused-dependency-overrides",
3232
- "registry_index": 42,
3301
+ "registry_index": 43,
3233
3302
  "aliases": [
3234
3303
  "unused-dependency-overrides",
3235
3304
  "unused-override",
@@ -3270,7 +3339,7 @@
3270
3339
  "description": "Package-manager override has an unparsable key or value",
3271
3340
  "label": "Misconfigured Dependency Overrides",
3272
3341
  "config_key": "misconfigured-dependency-overrides",
3273
- "registry_index": 43,
3342
+ "registry_index": 44,
3274
3343
  "aliases": [
3275
3344
  "misconfigured-dependency-overrides",
3276
3345
  "misconfigured-override",
@@ -3311,7 +3380,7 @@
3311
3380
  "description": "\"use client\" file exports a server-only / route-config name",
3312
3381
  "label": "Invalid Client Exports",
3313
3382
  "config_key": "invalid-client-export",
3314
- "registry_index": 23,
3383
+ "registry_index": 24,
3315
3384
  "aliases": [
3316
3385
  "invalid-client-exports"
3317
3386
  ],
@@ -3349,7 +3418,7 @@
3349
3418
  "description": "Barrel re-exports both a \"use client\" module and a server-only module",
3350
3419
  "label": "Mixed Client/Server Barrels",
3351
3420
  "config_key": "mixed-client-server-barrel",
3352
- "registry_index": 24,
3421
+ "registry_index": 25,
3353
3422
  "aliases": [
3354
3423
  "mixed-client-server-barrels"
3355
3424
  ],
@@ -3385,7 +3454,7 @@
3385
3454
  "description": "\"use client\" / \"use server\" directive is not in the leading position and is ignored",
3386
3455
  "label": "Misplaced Directives",
3387
3456
  "config_key": "misplaced-directive",
3388
- "registry_index": 25,
3457
+ "registry_index": 26,
3389
3458
  "aliases": [
3390
3459
  "misplaced-directives"
3391
3460
  ],
@@ -3421,7 +3490,7 @@
3421
3490
  "description": "inject() / getContext() reads a key that no provide() / setContext() supplies",
3422
3491
  "label": "Unprovided Injects",
3423
3492
  "config_key": "unprovided-injects",
3424
- "registry_index": 26,
3493
+ "registry_index": 27,
3425
3494
  "aliases": [
3426
3495
  "unprovided-injects"
3427
3496
  ],
@@ -3457,7 +3526,7 @@
3457
3526
  "description": "A Vue / Svelte component is reachable through a barrel but rendered nowhere",
3458
3527
  "label": "Unrendered Components",
3459
3528
  "config_key": "unrendered-components",
3460
- "registry_index": 27,
3529
+ "registry_index": 28,
3461
3530
  "aliases": [
3462
3531
  "unrendered-components"
3463
3532
  ],
@@ -3493,7 +3562,7 @@
3493
3562
  "description": "A Vue, Svelte, or React component prop is referenced nowhere in its own component",
3494
3563
  "label": "Unused Component Props",
3495
3564
  "config_key": "unused-component-props",
3496
- "registry_index": 28,
3565
+ "registry_index": 29,
3497
3566
  "aliases": [
3498
3567
  "unused-component-props"
3499
3568
  ],
@@ -3529,7 +3598,7 @@
3529
3598
  "description": "A Vue <script setup> defineEmits event is emitted nowhere in its own component",
3530
3599
  "label": "Unused Component Emits",
3531
3600
  "config_key": "unused-component-emits",
3532
- "registry_index": 29,
3601
+ "registry_index": 30,
3533
3602
  "aliases": [
3534
3603
  "unused-component-emits"
3535
3604
  ],
@@ -3565,7 +3634,7 @@
3565
3634
  "description": "An Angular @Input() / signal input() / model() input is read nowhere in its own component",
3566
3635
  "label": "Unused Component Inputs",
3567
3636
  "config_key": "unused-component-inputs",
3568
- "registry_index": 30,
3637
+ "registry_index": 31,
3569
3638
  "aliases": [
3570
3639
  "unused-component-inputs"
3571
3640
  ],
@@ -3601,7 +3670,7 @@
3601
3670
  "description": "An Angular @Output() / signal output() output is emitted nowhere in its own component",
3602
3671
  "label": "Unused Component Outputs",
3603
3672
  "config_key": "unused-component-outputs",
3604
- "registry_index": 31,
3673
+ "registry_index": 32,
3605
3674
  "aliases": [
3606
3675
  "unused-component-outputs"
3607
3676
  ],
@@ -3637,7 +3706,7 @@
3637
3706
  "description": "A Svelte component dispatches a createEventDispatcher event whose name is listened to nowhere in the project",
3638
3707
  "label": "Unused Svelte Events",
3639
3708
  "config_key": "unused-svelte-events",
3640
- "registry_index": 32,
3709
+ "registry_index": 33,
3641
3710
  "aliases": [
3642
3711
  "unused-svelte-events"
3643
3712
  ],
@@ -3673,7 +3742,7 @@
3673
3742
  "description": "A Next.js Server Action exported from a \"use server\" file is referenced by no code in the project",
3674
3743
  "label": "Unused Server Actions",
3675
3744
  "config_key": "unused-server-actions",
3676
- "registry_index": 33,
3745
+ "registry_index": 34,
3677
3746
  "aliases": [
3678
3747
  "unused-server-actions"
3679
3748
  ],
@@ -3709,7 +3778,7 @@
3709
3778
  "description": "A SvelteKit load() return-object key is read by no consumer",
3710
3779
  "label": "Unused Load Data Keys",
3711
3780
  "config_key": "unused-load-data-keys",
3712
- "registry_index": 34,
3781
+ "registry_index": 35,
3713
3782
  "aliases": [
3714
3783
  "unused-load-data-keys"
3715
3784
  ],
@@ -3745,7 +3814,7 @@
3745
3814
  "description": "A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer",
3746
3815
  "label": "Prop Drilling",
3747
3816
  "config_key": "prop-drilling",
3748
- "registry_index": 49,
3817
+ "registry_index": 50,
3749
3818
  "aliases": [],
3750
3819
  "lsp": false,
3751
3820
  "filter_flag": null,
@@ -3777,7 +3846,7 @@
3777
3846
  "description": "A React/Preact component whose whole body is a single spread-forwarded child render (a candidate for inlining)",
3778
3847
  "label": "Thin Wrappers",
3779
3848
  "config_key": "thin-wrapper",
3780
- "registry_index": 50,
3849
+ "registry_index": 51,
3781
3850
  "aliases": [
3782
3851
  "thin-wrappers"
3783
3852
  ],
@@ -3811,7 +3880,7 @@
3811
3880
  "description": "Three or more React/Preact components across two or more files declare an identical prop-name set (a missing shared Props type)",
3812
3881
  "label": "Duplicate Prop Shapes",
3813
3882
  "config_key": "duplicate-prop-shape",
3814
- "registry_index": 51,
3883
+ "registry_index": 52,
3815
3884
  "aliases": [
3816
3885
  "duplicate-prop-shapes"
3817
3886
  ],
@@ -3845,7 +3914,7 @@
3845
3914
  "description": "Two or more Next.js App Router route files resolve to the same URL",
3846
3915
  "label": "Route Collisions",
3847
3916
  "config_key": "route-collision",
3848
- "registry_index": 35,
3917
+ "registry_index": 36,
3849
3918
  "aliases": [
3850
3919
  "route-collisions"
3851
3920
  ],
@@ -3883,7 +3952,7 @@
3883
3952
  "description": "Sibling Next.js dynamic route segments use different slug names at the same position",
3884
3953
  "label": "Dynamic Segment Conflicts",
3885
3954
  "config_key": "dynamic-segment-name-conflict",
3886
- "registry_index": 36,
3955
+ "registry_index": 37,
3887
3956
  "aliases": [
3888
3957
  "dynamic-segment-name-conflicts"
3889
3958
  ],
@@ -4071,7 +4140,7 @@
4071
4140
  "description": "CSS or CSS-in-JS hardcoded styling value bypasses the design token system",
4072
4141
  "label": "CSS Token Drift",
4073
4142
  "config_key": "css-token-drift",
4074
- "registry_index": 52,
4143
+ "registry_index": 53,
4075
4144
  "aliases": [],
4076
4145
  "lsp": false,
4077
4146
  "filter_flag": null,
@@ -4101,7 +4170,7 @@
4101
4170
  "description": "CSS or CSS-in-JS declaration block is duplicated across rules",
4102
4171
  "label": "CSS Duplicate Block",
4103
4172
  "config_key": "css-duplicate-block",
4104
- "registry_index": 53,
4173
+ "registry_index": 54,
4105
4174
  "aliases": [],
4106
4175
  "lsp": false,
4107
4176
  "filter_flag": null,
@@ -4131,7 +4200,7 @@
4131
4200
  "description": "CSS selector, nesting, or important usage is structurally complex",
4132
4201
  "label": "CSS Selector Complexity",
4133
4202
  "config_key": "css-selector-complexity",
4134
- "registry_index": 54,
4203
+ "registry_index": 55,
4135
4204
  "aliases": [],
4136
4205
  "lsp": false,
4137
4206
  "filter_flag": null,
@@ -4161,7 +4230,7 @@
4161
4230
  "description": "CSS or CSS-in-JS surface appears unused",
4162
4231
  "label": "CSS Dead Surface",
4163
4232
  "config_key": "css-dead-surface",
4164
- "registry_index": 55,
4233
+ "registry_index": 56,
4165
4234
  "aliases": [],
4166
4235
  "lsp": false,
4167
4236
  "filter_flag": null,
@@ -4191,7 +4260,7 @@
4191
4260
  "description": "CSS or CSS-in-JS reference resolves to no stylesheet definition",
4192
4261
  "label": "CSS Broken Reference",
4193
4262
  "config_key": "css-broken-reference",
4194
- "registry_index": 56,
4263
+ "registry_index": 57,
4195
4264
  "aliases": [],
4196
4265
  "lsp": false,
4197
4266
  "filter_flag": null,
@@ -4581,7 +4650,7 @@
4581
4650
  "description": "Detected feature flag pattern",
4582
4651
  "label": "Feature Flags",
4583
4652
  "config_key": "feature-flags",
4584
- "registry_index": 47,
4653
+ "registry_index": 48,
4585
4654
  "aliases": [],
4586
4655
  "lsp": false,
4587
4656
  "filter_flag": null,
@@ -6101,7 +6170,7 @@
6101
6170
  "FALLOW_CACHE_DIR": "Directory for fallow's persistent analysis cache. Relative paths resolve from the project root and override cache.dir.",
6102
6171
  "FALLOW_CACHE_MAX_SIZE": "Extraction cache size cap in megabytes (default 256). Wins over the cache.maxSizeMb config field.",
6103
6172
  "FALLOW_EXTENDS_TIMEOUT_SECS": "Timeout in seconds for fetching https:// configs referenced via the extends field (default 5).",
6104
- "FALLOW_COVERAGE": "Path to Istanbul coverage data (coverage-final.json) for accurate per-function CRAP scores. CLI --coverage flag overrides this; it wins over the health.coverage config field. Honored by the health, bare fallow, audit, and viz CLI commands and by the MCP audit and check_health tools on both their typed route and their CLI fallback, where the explicit coverage parameter overrides it. Viz reads it through the same precedence and has no coverage flag of its own.",
6173
+ "FALLOW_COVERAGE": "Path to Istanbul coverage data (coverage-final.json) or raw V8 coverage (a NODE_V8_COVERAGE directory or one V8 JSON file) for accurate per-function CRAP scores. CLI --coverage flag overrides this; it wins over the health.coverage config field. Honored by the health, bare fallow, audit, and viz CLI commands and by the MCP audit and check_health tools on both their typed route and their CLI fallback, where the explicit coverage parameter overrides it. Viz reads it through the same precedence and has no coverage flag of its own.",
6105
6174
  "FALLOW_COVERAGE_ROOT": "Absolute coverage-data path prefix for rebasing Istanbul paths in CI or containers. CLI --coverage-root flag overrides this; it wins over the health.coverageRoot config field. Honored by the health, bare fallow, audit, and viz CLI commands and by the MCP audit and check_health tools on both their typed route and their CLI fallback, where the explicit coverage_root parameter overrides it. Viz reads it through the same precedence and has no coverage flag of its own.",
6106
6175
  "FALLOW_MAX_FILE_SIZE": "Per-file size ceiling in megabytes for source discovery (default 5; 0 = no limit). CLI --max-file-size flag overrides this.",
6107
6176
  "FALLOW_TYPE_AWARE": "Enable or disable TypeScript semantic (type-aware) analysis for the run (true/false/1/0/yes/no/on/off). Precedence: --type-aware/--no-type-aware CLI flags, then FALLOW_TYPE_AWARE, then the audit.typeAware config field, then typeAware.enabled.",
@@ -6640,7 +6709,7 @@
6640
6709
  ],
6641
6710
  "license": "free",
6642
6711
  "license_note": null,
6643
- "read_only": true,
6712
+ "read_only": false,
6644
6713
  "code_mode_alias": "analyze"
6645
6714
  },
6646
6715
  {
@@ -6655,7 +6724,7 @@
6655
6724
  ],
6656
6725
  "license": "free",
6657
6726
  "license_note": null,
6658
- "read_only": true,
6727
+ "read_only": false,
6659
6728
  "code_mode_alias": "checkChanged"
6660
6729
  },
6661
6730
  {
@@ -6748,7 +6817,7 @@
6748
6817
  ],
6749
6818
  "license": "free",
6750
6819
  "license_note": null,
6751
- "read_only": true,
6820
+ "read_only": false,
6752
6821
  "code_mode_alias": "findDupes"
6753
6822
  },
6754
6823
  {
@@ -6769,7 +6838,7 @@
6769
6838
  ],
6770
6839
  "license": "free",
6771
6840
  "license_note": null,
6772
- "read_only": true,
6841
+ "read_only": false,
6773
6842
  "code_mode_alias": "checkHealth"
6774
6843
  },
6775
6844
  {
@@ -7262,7 +7331,7 @@
7262
7331
  ]
7263
7332
  },
7264
7333
  "plugins": {
7265
- "count": 126,
7334
+ "count": 127,
7266
7335
  "note": "Built-in framework plugins, auto-activated when their enabler dependency is present; run fallow list --plugins for the set active in a specific project",
7267
7336
  "names": [
7268
7337
  "nextjs",
@@ -7314,6 +7383,7 @@
7314
7383
  "rolldown",
7315
7384
  "rspack",
7316
7385
  "rsbuild",
7386
+ "module-federation",
7317
7387
  "tsup",
7318
7388
  "tsdown",
7319
7389
  "pkg-utils",