fallow 3.42.0 → 3.43.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/README.md +3 -1
- package/capabilities.json +127 -40
- package/issue-registry.json +68 -32
- package/package.json +9 -10
- package/schema.json +51 -4
- package/scripts/lazy-verify.js +5 -4
- package/scripts/platform-package.js +25 -0
- package/scripts/run-binary.js +149 -30
- package/scripts/verify-binary.js +25 -21
- package/skills/fallow/SKILL.md +25 -3
- package/skills/fallow/references/cli-reference.md +53 -29
- package/skills/fallow/references/gotchas.md +2 -0
- package/skills/fallow/references/issue-types.md +1 -0
- package/skills/fallow/references/mcp.md +3 -3
- package/skills/fallow/references/similar-code.md +1 -1
- package/types/output-contract.d.ts +758 -29
package/README.md
CHANGED
|
@@ -54,9 +54,11 @@ Every issue carries an `actions[]` array with an `auto_fixable` flag, so scripts
|
|
|
54
54
|
|
|
55
55
|
Default analysis stays Rust-native and syntactic. Use `--type-aware` when a
|
|
56
56
|
cleanup or refactor needs exact checker-backed identity across aliases,
|
|
57
|
-
re-exports, packages, or tests
|
|
57
|
+
re-exports, packages, or tests. It needs the `fallow-type-aware` companion at
|
|
58
|
+
the same version as `fallow`, which brings TypeScript 7:
|
|
58
59
|
|
|
59
60
|
```bash
|
|
61
|
+
npm install --save-dev fallow-type-aware@<fallow version>
|
|
60
62
|
npx fallow dead-code --unused-class-members --type-aware --format json --quiet
|
|
61
63
|
npx fallow fix --type-aware --dry-run --format json --quiet
|
|
62
64
|
npx fallow dead-code --type-aware --symbol-impact src/api.ts:Client --format json --quiet
|
package/capabilities.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.43.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": [
|
|
@@ -577,7 +577,7 @@
|
|
|
577
577
|
"name": "--coverage",
|
|
578
578
|
"type": "string",
|
|
579
579
|
"required": false,
|
|
580
|
-
"description": "Path to Istanbul or raw V8 coverage data for
|
|
580
|
+
"description": "Path to Istanbul or raw V8 coverage data for measured CRAP scores in combined mode. Also settable via `FALLOW_COVERAGE` or `health.coverage`"
|
|
581
581
|
},
|
|
582
582
|
{
|
|
583
583
|
"name": "--coverage-root",
|
|
@@ -799,6 +799,16 @@
|
|
|
799
799
|
"false"
|
|
800
800
|
]
|
|
801
801
|
},
|
|
802
|
+
{
|
|
803
|
+
"name": "--constant-parameters",
|
|
804
|
+
"type": "bool",
|
|
805
|
+
"required": false,
|
|
806
|
+
"description": "Review parameters that each visible call passes in one way (enables this rule)",
|
|
807
|
+
"possible_values": [
|
|
808
|
+
"true",
|
|
809
|
+
"false"
|
|
810
|
+
]
|
|
811
|
+
},
|
|
802
812
|
{
|
|
803
813
|
"name": "--unused-component-emits",
|
|
804
814
|
"type": "bool",
|
|
@@ -1119,6 +1129,16 @@
|
|
|
1119
1129
|
"name": "architecture",
|
|
1120
1130
|
"description": "Check import cycles, boundaries and policy rules after editing",
|
|
1121
1131
|
"flags": [
|
|
1132
|
+
{
|
|
1133
|
+
"name": "--shared-state",
|
|
1134
|
+
"type": "bool",
|
|
1135
|
+
"required": false,
|
|
1136
|
+
"description": "Inventory direct imported writes and custom global access sites",
|
|
1137
|
+
"possible_values": [
|
|
1138
|
+
"true",
|
|
1139
|
+
"false"
|
|
1140
|
+
]
|
|
1141
|
+
},
|
|
1122
1142
|
{
|
|
1123
1143
|
"name": "--cycles",
|
|
1124
1144
|
"type": "bool",
|
|
@@ -1315,6 +1335,16 @@
|
|
|
1315
1335
|
"false"
|
|
1316
1336
|
]
|
|
1317
1337
|
},
|
|
1338
|
+
{
|
|
1339
|
+
"name": "--record-args",
|
|
1340
|
+
"type": "string",
|
|
1341
|
+
"required": false,
|
|
1342
|
+
"description": "Record the arguments of the changed exported functions in a record pass (off by default). `shapes` keeps their types, `values` keeps the values for `fallow mutation inspect --replay`. The values stay in the gitignored cache directory for 7 days, and an input with a secret (by key name or by entropy) is not kept",
|
|
1343
|
+
"possible_values": [
|
|
1344
|
+
"shapes",
|
|
1345
|
+
"values"
|
|
1346
|
+
]
|
|
1347
|
+
},
|
|
1318
1348
|
{
|
|
1319
1349
|
"name": "--min-score",
|
|
1320
1350
|
"type": "string",
|
|
@@ -1325,7 +1355,7 @@
|
|
|
1325
1355
|
"name": "--operators",
|
|
1326
1356
|
"type": "string",
|
|
1327
1357
|
"required": false,
|
|
1328
|
-
"description": "The operators to use, comma-separated. Default: the default set. The opt-in operators (block-statement, array-literal, object-literal, method-expression, switch-case, call-expression, throw-statement, regex-constructor, regex-assertion) run only when named here"
|
|
1358
|
+
"description": "The operators to use, comma-separated. Default: the default set. The opt-in operators (block-statement, array-literal, object-literal, method-expression, switch-case, call-expression, throw-statement, regex-constructor, regex-assertion, nullish-fallback) run only when named here"
|
|
1329
1359
|
},
|
|
1330
1360
|
{
|
|
1331
1361
|
"name": "--verdicts",
|
|
@@ -1349,7 +1379,7 @@
|
|
|
1349
1379
|
"name": "--typecheck",
|
|
1350
1380
|
"type": "bool",
|
|
1351
1381
|
"required": false,
|
|
1352
|
-
"description": "Type-check each survived mutant through the `--type-aware` companion. A survivor that does not type-check becomes `compile_error` and leaves the score. An optional-chaining survivor on a receiver whose type excludes `null` and `undefined` gets an advisory `equivalence_hint`. Its status and the score do not change",
|
|
1382
|
+
"description": "Type-check each survived mutant through the `--type-aware` companion. A survivor that does not type-check becomes `compile_error` and leaves the score. An optional-chaining or nullish-fallback survivor on a receiver whose type excludes `null` and `undefined` gets an advisory `equivalence_hint`. Its status and the score do not change",
|
|
1353
1383
|
"possible_values": [
|
|
1354
1384
|
"true",
|
|
1355
1385
|
"false"
|
|
@@ -1385,7 +1415,7 @@
|
|
|
1385
1415
|
"name": "--recheck",
|
|
1386
1416
|
"type": "bool",
|
|
1387
1417
|
"required": false,
|
|
1388
|
-
"description": "Rerun the open tasks of a saved report (its `survived` and `no_coverage` mutants) against the current tests. The worktree may change test files only. The run replaces the saved report, so `fallow mutation tasks` then lists the mutants that are still open",
|
|
1418
|
+
"description": "Rerun the open tasks of a saved report (its `survived` and `no_coverage` mutants) against the current tests. The worktree may change test files only. The report keeps the earlier result of each other mutant, so its summary counts the full set. The recheck does not run those mutants again: after you remove or change a test that killed them, run `fallow mutation` without `--recheck`. The run replaces the saved report, so `fallow mutation tasks` then lists the mutants that are still open",
|
|
1389
1419
|
"possible_values": [
|
|
1390
1420
|
"true",
|
|
1391
1421
|
"false"
|
|
@@ -1395,7 +1425,7 @@
|
|
|
1395
1425
|
"name": "--report",
|
|
1396
1426
|
"type": "string",
|
|
1397
1427
|
"required": false,
|
|
1398
|
-
"description": "The saved report of `--recheck` (default: the report of the last run). A recheck without `--mutant` replaces the
|
|
1428
|
+
"description": "The saved report of `--recheck` (default: the report of the last run). A recheck without `--mutant` replaces this file and the report of the last run"
|
|
1399
1429
|
},
|
|
1400
1430
|
{
|
|
1401
1431
|
"name": "--mutant",
|
|
@@ -1656,7 +1686,7 @@
|
|
|
1656
1686
|
"name": "--branch",
|
|
1657
1687
|
"type": "string",
|
|
1658
1688
|
"required": false,
|
|
1659
|
-
"description": "
|
|
1689
|
+
"description": "Has no effect. The pre-commit hook runs `fallow audit --staged`, which compares the staged changes with HEAD. Kept so that existing install scripts still run"
|
|
1660
1690
|
},
|
|
1661
1691
|
{
|
|
1662
1692
|
"name": "--decline",
|
|
@@ -2195,7 +2225,7 @@
|
|
|
2195
2225
|
"name": "--coverage",
|
|
2196
2226
|
"type": "string",
|
|
2197
2227
|
"required": false,
|
|
2198
|
-
"description": "Path to coverage data for
|
|
2228
|
+
"description": "Path to coverage data for measured 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"
|
|
2199
2229
|
},
|
|
2200
2230
|
{
|
|
2201
2231
|
"name": "--coverage-root",
|
|
@@ -2507,12 +2537,28 @@
|
|
|
2507
2537
|
"description": "Threshold for hot-path classification, forwarded to the sidecar when `--runtime-coverage` is set",
|
|
2508
2538
|
"default": "100"
|
|
2509
2539
|
},
|
|
2540
|
+
{
|
|
2541
|
+
"name": "--mutation-report",
|
|
2542
|
+
"type": "string",
|
|
2543
|
+
"required": false,
|
|
2544
|
+
"description": "Saved `fallow mutation --format json` report (for example `.fallow/mutation/last-report.json`). The review brief counts the surviving mutants on the added lines of each changed file in the `mutation` component of the focus score. A file whose source changed since the run adds nothing. Reads the file only; it runs no test. Only the review brief reads it"
|
|
2545
|
+
},
|
|
2510
2546
|
{
|
|
2511
2547
|
"name": "--gate-marker",
|
|
2512
2548
|
"type": "string",
|
|
2513
2549
|
"required": false,
|
|
2514
2550
|
"description": "Internal marker identifying a gate run (e.g. `pre-commit`), set by the generated git hook so Fallow Impact can record a containment event when the gate blocks then clears. Hidden; never changes the verdict, exit code, or output"
|
|
2515
2551
|
},
|
|
2552
|
+
{
|
|
2553
|
+
"name": "--staged",
|
|
2554
|
+
"type": "bool",
|
|
2555
|
+
"required": false,
|
|
2556
|
+
"description": "Audit the staged index instead of the working tree. The changed files are the staged changes against HEAD (`git diff --cached`), and the analysis reads every file from the index, so unstaged edits and untracked files do not affect the verdict. A file that is staged and then deleted from the working tree is still audited. The base is HEAD, so `--base` and `--changed-since` are rejected. The generated pre-commit hook uses this flag",
|
|
2557
|
+
"possible_values": [
|
|
2558
|
+
"true",
|
|
2559
|
+
"false"
|
|
2560
|
+
]
|
|
2561
|
+
},
|
|
2516
2562
|
{
|
|
2517
2563
|
"name": "--brief",
|
|
2518
2564
|
"type": "bool",
|
|
@@ -3922,7 +3968,7 @@
|
|
|
3922
3968
|
"description": "Suppression comment or tag no longer matches any issue",
|
|
3923
3969
|
"label": "Stale Suppressions",
|
|
3924
3970
|
"config_key": "stale-suppressions",
|
|
3925
|
-
"registry_index":
|
|
3971
|
+
"registry_index": 47,
|
|
3926
3972
|
"aliases": [],
|
|
3927
3973
|
"lsp": true,
|
|
3928
3974
|
"filter_flag": "--stale-suppressions",
|
|
@@ -3958,7 +4004,7 @@
|
|
|
3958
4004
|
"description": "Suppression comment omits a required reason",
|
|
3959
4005
|
"label": "Missing Suppression Reasons",
|
|
3960
4006
|
"config_key": "require-suppression-reason",
|
|
3961
|
-
"registry_index":
|
|
4007
|
+
"registry_index": 48,
|
|
3962
4008
|
"aliases": [
|
|
3963
4009
|
"missing-suppression-reasons"
|
|
3964
4010
|
],
|
|
@@ -3990,7 +4036,7 @@
|
|
|
3990
4036
|
"description": "Catalog entry not referenced by any workspace package",
|
|
3991
4037
|
"label": "Unused Catalog Entries",
|
|
3992
4038
|
"config_key": "unused-catalog-entries",
|
|
3993
|
-
"registry_index":
|
|
4039
|
+
"registry_index": 49,
|
|
3994
4040
|
"aliases": [
|
|
3995
4041
|
"catalog",
|
|
3996
4042
|
"unused-catalog-entries"
|
|
@@ -4030,7 +4076,7 @@
|
|
|
4030
4076
|
"description": "Named catalog group has no entries",
|
|
4031
4077
|
"label": "Empty Catalog Groups",
|
|
4032
4078
|
"config_key": "empty-catalog-groups",
|
|
4033
|
-
"registry_index":
|
|
4079
|
+
"registry_index": 50,
|
|
4034
4080
|
"aliases": [
|
|
4035
4081
|
"empty-catalog",
|
|
4036
4082
|
"empty-catalog-groups"
|
|
@@ -4070,7 +4116,7 @@
|
|
|
4070
4116
|
"description": "package.json references a catalog that does not declare the package",
|
|
4071
4117
|
"label": "Unresolved Catalog References",
|
|
4072
4118
|
"config_key": "unresolved-catalog-references",
|
|
4073
|
-
"registry_index":
|
|
4119
|
+
"registry_index": 51,
|
|
4074
4120
|
"aliases": [
|
|
4075
4121
|
"unresolved-catalog",
|
|
4076
4122
|
"unresolved-catalog-references"
|
|
@@ -4110,7 +4156,7 @@
|
|
|
4110
4156
|
"description": "Package-manager override target is not declared or resolved",
|
|
4111
4157
|
"label": "Unused Dependency Overrides",
|
|
4112
4158
|
"config_key": "unused-dependency-overrides",
|
|
4113
|
-
"registry_index":
|
|
4159
|
+
"registry_index": 52,
|
|
4114
4160
|
"aliases": [
|
|
4115
4161
|
"unused-dependency-overrides",
|
|
4116
4162
|
"unused-override",
|
|
@@ -4151,7 +4197,7 @@
|
|
|
4151
4197
|
"description": "Package-manager override has an unparsable key or value",
|
|
4152
4198
|
"label": "Misconfigured Dependency Overrides",
|
|
4153
4199
|
"config_key": "misconfigured-dependency-overrides",
|
|
4154
|
-
"registry_index":
|
|
4200
|
+
"registry_index": 53,
|
|
4155
4201
|
"aliases": [
|
|
4156
4202
|
"misconfigured-dependency-overrides",
|
|
4157
4203
|
"misconfigured-override",
|
|
@@ -4402,6 +4448,42 @@
|
|
|
4402
4448
|
"license_note": null,
|
|
4403
4449
|
"docs_url": "https://fallow.tools/docs/explanations/dead-code/#absent-component-props"
|
|
4404
4450
|
},
|
|
4451
|
+
{
|
|
4452
|
+
"id": "constant-parameter",
|
|
4453
|
+
"rule_id": "fallow/constant-parameter",
|
|
4454
|
+
"command": "dead-code",
|
|
4455
|
+
"category": "Dead code",
|
|
4456
|
+
"description": "Each visible call passes a function parameter in the same way",
|
|
4457
|
+
"label": "Constant Parameters",
|
|
4458
|
+
"config_key": "constant-parameters",
|
|
4459
|
+
"registry_index": 35,
|
|
4460
|
+
"aliases": [
|
|
4461
|
+
"constant-parameters"
|
|
4462
|
+
],
|
|
4463
|
+
"lsp": true,
|
|
4464
|
+
"filter_flag": "--constant-parameters",
|
|
4465
|
+
"result_key": "constant_parameters",
|
|
4466
|
+
"summary_label": "Constant parameters",
|
|
4467
|
+
"summary_docs_anchor": "constant-parameters",
|
|
4468
|
+
"sarif_rule_ids": [
|
|
4469
|
+
"fallow/constant-parameter"
|
|
4470
|
+
],
|
|
4471
|
+
"codeclimate_check_names": [
|
|
4472
|
+
"fallow/constant-parameter"
|
|
4473
|
+
],
|
|
4474
|
+
"ts_alias": null,
|
|
4475
|
+
"counts_in_total": true,
|
|
4476
|
+
"fixable": false,
|
|
4477
|
+
"suppressible": true,
|
|
4478
|
+
"suppress_comment": "// fallow-ignore-next-line constant-parameter",
|
|
4479
|
+
"default_severity": "off",
|
|
4480
|
+
"opt_in": true,
|
|
4481
|
+
"frameworks": [],
|
|
4482
|
+
"note": "Opt-in manual review candidate; defaults to off. Inspect the calls and the intent of the parameter before changing the function. No automatic fix.",
|
|
4483
|
+
"license": "free",
|
|
4484
|
+
"license_note": null,
|
|
4485
|
+
"docs_url": "https://fallow.tools/docs/explanations/dead-code/#constant-parameters"
|
|
4486
|
+
},
|
|
4405
4487
|
{
|
|
4406
4488
|
"id": "unused-component-prop",
|
|
4407
4489
|
"rule_id": "fallow/unused-component-prop",
|
|
@@ -4446,7 +4528,7 @@
|
|
|
4446
4528
|
"description": "A Vue <script setup> defineEmits event is emitted nowhere in its own component",
|
|
4447
4529
|
"label": "Unused Component Emits",
|
|
4448
4530
|
"config_key": "unused-component-emits",
|
|
4449
|
-
"registry_index":
|
|
4531
|
+
"registry_index": 36,
|
|
4450
4532
|
"aliases": [
|
|
4451
4533
|
"unused-component-emits"
|
|
4452
4534
|
],
|
|
@@ -4482,7 +4564,7 @@
|
|
|
4482
4564
|
"description": "An Angular @Input() / signal input() / model() input is read nowhere in its own component",
|
|
4483
4565
|
"label": "Unused Component Inputs",
|
|
4484
4566
|
"config_key": "unused-component-inputs",
|
|
4485
|
-
"registry_index":
|
|
4567
|
+
"registry_index": 37,
|
|
4486
4568
|
"aliases": [
|
|
4487
4569
|
"unused-component-inputs"
|
|
4488
4570
|
],
|
|
@@ -4518,7 +4600,7 @@
|
|
|
4518
4600
|
"description": "An Angular @Output() / signal output() output is emitted nowhere in its own component",
|
|
4519
4601
|
"label": "Unused Component Outputs",
|
|
4520
4602
|
"config_key": "unused-component-outputs",
|
|
4521
|
-
"registry_index":
|
|
4603
|
+
"registry_index": 38,
|
|
4522
4604
|
"aliases": [
|
|
4523
4605
|
"unused-component-outputs"
|
|
4524
4606
|
],
|
|
@@ -4554,7 +4636,7 @@
|
|
|
4554
4636
|
"description": "A Svelte component dispatches a createEventDispatcher event whose name is listened to nowhere in the project",
|
|
4555
4637
|
"label": "Unused Svelte Events",
|
|
4556
4638
|
"config_key": "unused-svelte-events",
|
|
4557
|
-
"registry_index":
|
|
4639
|
+
"registry_index": 39,
|
|
4558
4640
|
"aliases": [
|
|
4559
4641
|
"unused-svelte-events"
|
|
4560
4642
|
],
|
|
@@ -4590,7 +4672,7 @@
|
|
|
4590
4672
|
"description": "An Effect layer is composed only into layers that nothing uses",
|
|
4591
4673
|
"label": "Unused Effect Layers",
|
|
4592
4674
|
"config_key": "unused-effect-layers",
|
|
4593
|
-
"registry_index":
|
|
4675
|
+
"registry_index": 42,
|
|
4594
4676
|
"aliases": [
|
|
4595
4677
|
"unused-effect-layers"
|
|
4596
4678
|
],
|
|
@@ -4626,7 +4708,7 @@
|
|
|
4626
4708
|
"description": "An Effect tagged error class is referenced only as a type or a catchTag string, and no code constructs or fails with it",
|
|
4627
4709
|
"label": "Unused Tagged Errors",
|
|
4628
4710
|
"config_key": "unused-tagged-errors",
|
|
4629
|
-
"registry_index":
|
|
4711
|
+
"registry_index": 43,
|
|
4630
4712
|
"aliases": [
|
|
4631
4713
|
"unused-tagged-errors"
|
|
4632
4714
|
],
|
|
@@ -4662,7 +4744,7 @@
|
|
|
4662
4744
|
"description": "A catchTag handler names a project error tag that no code produces",
|
|
4663
4745
|
"label": "Unproduced Catch Tags",
|
|
4664
4746
|
"config_key": "unproduced-catch-tags",
|
|
4665
|
-
"registry_index":
|
|
4747
|
+
"registry_index": 44,
|
|
4666
4748
|
"aliases": [
|
|
4667
4749
|
"unproduced-catch-tags"
|
|
4668
4750
|
],
|
|
@@ -4698,7 +4780,7 @@
|
|
|
4698
4780
|
"description": "A Next.js Server Action exported from a \"use server\" file is referenced by no code in the project",
|
|
4699
4781
|
"label": "Unused Server Actions",
|
|
4700
4782
|
"config_key": "unused-server-actions",
|
|
4701
|
-
"registry_index":
|
|
4783
|
+
"registry_index": 40,
|
|
4702
4784
|
"aliases": [
|
|
4703
4785
|
"unused-server-actions"
|
|
4704
4786
|
],
|
|
@@ -4734,7 +4816,7 @@
|
|
|
4734
4816
|
"description": "A SvelteKit load() return-object key is read by no consumer",
|
|
4735
4817
|
"label": "Unused Load Data Keys",
|
|
4736
4818
|
"config_key": "unused-load-data-keys",
|
|
4737
|
-
"registry_index":
|
|
4819
|
+
"registry_index": 41,
|
|
4738
4820
|
"aliases": [
|
|
4739
4821
|
"unused-load-data-keys"
|
|
4740
4822
|
],
|
|
@@ -4770,7 +4852,7 @@
|
|
|
4770
4852
|
"description": "A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer",
|
|
4771
4853
|
"label": "Prop Drilling",
|
|
4772
4854
|
"config_key": "prop-drilling",
|
|
4773
|
-
"registry_index":
|
|
4855
|
+
"registry_index": 59,
|
|
4774
4856
|
"aliases": [],
|
|
4775
4857
|
"lsp": true,
|
|
4776
4858
|
"filter_flag": null,
|
|
@@ -4804,7 +4886,7 @@
|
|
|
4804
4886
|
"description": "A React/Preact component whose whole body is a single spread-forwarded child render (a candidate for inlining)",
|
|
4805
4887
|
"label": "Thin Wrappers",
|
|
4806
4888
|
"config_key": "thin-wrapper",
|
|
4807
|
-
"registry_index":
|
|
4889
|
+
"registry_index": 60,
|
|
4808
4890
|
"aliases": [
|
|
4809
4891
|
"thin-wrappers"
|
|
4810
4892
|
],
|
|
@@ -4840,7 +4922,7 @@
|
|
|
4840
4922
|
"description": "Three or more React/Preact components across two or more files declare an identical prop-name set (a missing shared Props type)",
|
|
4841
4923
|
"label": "Duplicate Prop Shapes",
|
|
4842
4924
|
"config_key": "duplicate-prop-shape",
|
|
4843
|
-
"registry_index":
|
|
4925
|
+
"registry_index": 61,
|
|
4844
4926
|
"aliases": [
|
|
4845
4927
|
"duplicate-prop-shapes"
|
|
4846
4928
|
],
|
|
@@ -4876,7 +4958,7 @@
|
|
|
4876
4958
|
"description": "Two or more Next.js App Router route files resolve to the same URL",
|
|
4877
4959
|
"label": "Route Collisions",
|
|
4878
4960
|
"config_key": "route-collision",
|
|
4879
|
-
"registry_index":
|
|
4961
|
+
"registry_index": 45,
|
|
4880
4962
|
"aliases": [
|
|
4881
4963
|
"route-collisions"
|
|
4882
4964
|
],
|
|
@@ -4914,7 +4996,7 @@
|
|
|
4914
4996
|
"description": "Sibling Next.js dynamic route segments use different slug names at the same position",
|
|
4915
4997
|
"label": "Dynamic Segment Conflicts",
|
|
4916
4998
|
"config_key": "dynamic-segment-name-conflict",
|
|
4917
|
-
"registry_index":
|
|
4999
|
+
"registry_index": 46,
|
|
4918
5000
|
"aliases": [
|
|
4919
5001
|
"dynamic-segment-name-conflicts"
|
|
4920
5002
|
],
|
|
@@ -5132,7 +5214,7 @@
|
|
|
5132
5214
|
"description": "CSS or CSS-in-JS hardcoded styling value bypasses the design token system",
|
|
5133
5215
|
"label": "CSS Token Drift",
|
|
5134
5216
|
"config_key": "css-token-drift",
|
|
5135
|
-
"registry_index":
|
|
5217
|
+
"registry_index": 62,
|
|
5136
5218
|
"aliases": [],
|
|
5137
5219
|
"lsp": false,
|
|
5138
5220
|
"filter_flag": null,
|
|
@@ -5162,7 +5244,7 @@
|
|
|
5162
5244
|
"description": "CSS or CSS-in-JS declaration block is duplicated across rules",
|
|
5163
5245
|
"label": "CSS Duplicate Block",
|
|
5164
5246
|
"config_key": "css-duplicate-block",
|
|
5165
|
-
"registry_index":
|
|
5247
|
+
"registry_index": 63,
|
|
5166
5248
|
"aliases": [],
|
|
5167
5249
|
"lsp": false,
|
|
5168
5250
|
"filter_flag": null,
|
|
@@ -5192,7 +5274,7 @@
|
|
|
5192
5274
|
"description": "CSS selector, nesting, or important usage is structurally complex",
|
|
5193
5275
|
"label": "CSS Selector Complexity",
|
|
5194
5276
|
"config_key": "css-selector-complexity",
|
|
5195
|
-
"registry_index":
|
|
5277
|
+
"registry_index": 64,
|
|
5196
5278
|
"aliases": [],
|
|
5197
5279
|
"lsp": false,
|
|
5198
5280
|
"filter_flag": null,
|
|
@@ -5222,7 +5304,7 @@
|
|
|
5222
5304
|
"description": "CSS or CSS-in-JS surface appears unused",
|
|
5223
5305
|
"label": "CSS Dead Surface",
|
|
5224
5306
|
"config_key": "css-dead-surface",
|
|
5225
|
-
"registry_index":
|
|
5307
|
+
"registry_index": 65,
|
|
5226
5308
|
"aliases": [],
|
|
5227
5309
|
"lsp": false,
|
|
5228
5310
|
"filter_flag": null,
|
|
@@ -5252,7 +5334,7 @@
|
|
|
5252
5334
|
"description": "CSS or CSS-in-JS reference resolves to no stylesheet definition",
|
|
5253
5335
|
"label": "CSS Broken Reference",
|
|
5254
5336
|
"config_key": "css-broken-reference",
|
|
5255
|
-
"registry_index":
|
|
5337
|
+
"registry_index": 66,
|
|
5256
5338
|
"aliases": [],
|
|
5257
5339
|
"lsp": false,
|
|
5258
5340
|
"filter_flag": null,
|
|
@@ -5642,7 +5724,7 @@
|
|
|
5642
5724
|
"description": "Detected feature flag pattern",
|
|
5643
5725
|
"label": "Feature Flags",
|
|
5644
5726
|
"config_key": "feature-flags",
|
|
5645
|
-
"registry_index":
|
|
5727
|
+
"registry_index": 57,
|
|
5646
5728
|
"aliases": [],
|
|
5647
5729
|
"lsp": false,
|
|
5648
5730
|
"filter_flag": null,
|
|
@@ -7142,7 +7224,7 @@
|
|
|
7142
7224
|
"description": "The change weakens tests or a coverage threshold",
|
|
7143
7225
|
"label": "Weakened Tests",
|
|
7144
7226
|
"config_key": "weakened-tests",
|
|
7145
|
-
"registry_index":
|
|
7227
|
+
"registry_index": 67,
|
|
7146
7228
|
"aliases": [],
|
|
7147
7229
|
"lsp": false,
|
|
7148
7230
|
"filter_flag": null,
|
|
@@ -7172,7 +7254,7 @@
|
|
|
7172
7254
|
"description": "The change adds a suppression comment",
|
|
7173
7255
|
"label": "Added Suppressions",
|
|
7174
7256
|
"config_key": "added-suppression",
|
|
7175
|
-
"registry_index":
|
|
7257
|
+
"registry_index": 68,
|
|
7176
7258
|
"aliases": [],
|
|
7177
7259
|
"lsp": false,
|
|
7178
7260
|
"filter_flag": null,
|
|
@@ -7202,7 +7284,7 @@
|
|
|
7202
7284
|
"description": "The change adds a test-environment branch to source code",
|
|
7203
7285
|
"label": "Test-Only Branches",
|
|
7204
7286
|
"config_key": "test-only-branch",
|
|
7205
|
-
"registry_index":
|
|
7287
|
+
"registry_index": 69,
|
|
7206
7288
|
"aliases": [],
|
|
7207
7289
|
"lsp": false,
|
|
7208
7290
|
"filter_flag": null,
|
|
@@ -7232,7 +7314,7 @@
|
|
|
7232
7314
|
"description": "The change edits one copy of duplicated code but not its siblings",
|
|
7233
7315
|
"label": "Diverged Clone Siblings",
|
|
7234
7316
|
"config_key": "diverged-clone-sibling",
|
|
7235
|
-
"registry_index":
|
|
7317
|
+
"registry_index": 70,
|
|
7236
7318
|
"aliases": [],
|
|
7237
7319
|
"lsp": false,
|
|
7238
7320
|
"filter_flag": null,
|
|
@@ -7262,7 +7344,7 @@
|
|
|
7262
7344
|
"description": "The change adds a dependency",
|
|
7263
7345
|
"label": "Added Dependencies",
|
|
7264
7346
|
"config_key": "added-dependency",
|
|
7265
|
-
"registry_index":
|
|
7347
|
+
"registry_index": 71,
|
|
7266
7348
|
"aliases": [],
|
|
7267
7349
|
"lsp": false,
|
|
7268
7350
|
"filter_flag": null,
|
|
@@ -8854,6 +8936,11 @@
|
|
|
8854
8936
|
"command": "fallow health --coverage-gaps",
|
|
8855
8937
|
"note": null
|
|
8856
8938
|
},
|
|
8939
|
+
{
|
|
8940
|
+
"task": "improve or check the tests of a change",
|
|
8941
|
+
"command": "fallow mutation --plan --base <ref>",
|
|
8942
|
+
"note": "The plan runs no code. Without `--plan`, the command runs the project tests against each mutant, so ask the user first."
|
|
8943
|
+
},
|
|
8857
8944
|
{
|
|
8858
8945
|
"task": "consolidate duplication",
|
|
8859
8946
|
"command": "fallow dupes --trace dup:<fingerprint>",
|