fallow 3.41.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 +200 -41
- package/issue-registry.json +98 -32
- package/package.json +9 -10
- package/schema.json +116 -8
- 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 +55 -31
- package/skills/fallow/references/gotchas.md +2 -0
- package/skills/fallow/references/issue-types.md +2 -0
- package/skills/fallow/references/mcp.md +4 -4
- package/skills/fallow/references/similar-code.md +1 -1
- package/types/output-contract.d.ts +819 -36
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",
|
|
@@ -1261,6 +1281,22 @@
|
|
|
1261
1281
|
"required": false,
|
|
1262
1282
|
"description": "Run at most N covered mutants, in rank order. Uncovered mutants do not count. The others are `pending`"
|
|
1263
1283
|
},
|
|
1284
|
+
{
|
|
1285
|
+
"name": "--mutants-per-line",
|
|
1286
|
+
"type": "string",
|
|
1287
|
+
"required": false,
|
|
1288
|
+
"description": "Keep at most N mutants on each source line. The plan keeps the most productive mutants of the line (relational, condition, arithmetic and logical operators first). The others are `pending` with the reason `sampled-out` and do not run (default: the `mutation.mutantsPerLine` key, else each mutant)"
|
|
1289
|
+
},
|
|
1290
|
+
{
|
|
1291
|
+
"name": "--function-scope",
|
|
1292
|
+
"type": "bool",
|
|
1293
|
+
"required": false,
|
|
1294
|
+
"description": "Widen each changed line to the whole function that holds it, so that a changed parameter or signature selects the mutants of the function. Only the changed-code scope uses it (default: the `mutation.functionScope` key, else the changed lines only)",
|
|
1295
|
+
"possible_values": [
|
|
1296
|
+
"true",
|
|
1297
|
+
"false"
|
|
1298
|
+
]
|
|
1299
|
+
},
|
|
1264
1300
|
{
|
|
1265
1301
|
"name": "--time-budget",
|
|
1266
1302
|
"type": "string",
|
|
@@ -1299,6 +1335,16 @@
|
|
|
1299
1335
|
"false"
|
|
1300
1336
|
]
|
|
1301
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
|
+
},
|
|
1302
1348
|
{
|
|
1303
1349
|
"name": "--min-score",
|
|
1304
1350
|
"type": "string",
|
|
@@ -1309,7 +1355,7 @@
|
|
|
1309
1355
|
"name": "--operators",
|
|
1310
1356
|
"type": "string",
|
|
1311
1357
|
"required": false,
|
|
1312
|
-
"description": "The operators to use, comma-separated
|
|
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"
|
|
1313
1359
|
},
|
|
1314
1360
|
{
|
|
1315
1361
|
"name": "--verdicts",
|
|
@@ -1333,7 +1379,7 @@
|
|
|
1333
1379
|
"name": "--typecheck",
|
|
1334
1380
|
"type": "bool",
|
|
1335
1381
|
"required": false,
|
|
1336
|
-
"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",
|
|
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",
|
|
1337
1383
|
"possible_values": [
|
|
1338
1384
|
"true",
|
|
1339
1385
|
"false"
|
|
@@ -1369,7 +1415,7 @@
|
|
|
1369
1415
|
"name": "--recheck",
|
|
1370
1416
|
"type": "bool",
|
|
1371
1417
|
"required": false,
|
|
1372
|
-
"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",
|
|
1373
1419
|
"possible_values": [
|
|
1374
1420
|
"true",
|
|
1375
1421
|
"false"
|
|
@@ -1379,7 +1425,7 @@
|
|
|
1379
1425
|
"name": "--report",
|
|
1380
1426
|
"type": "string",
|
|
1381
1427
|
"required": false,
|
|
1382
|
-
"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"
|
|
1383
1429
|
},
|
|
1384
1430
|
{
|
|
1385
1431
|
"name": "--mutant",
|
|
@@ -1640,7 +1686,7 @@
|
|
|
1640
1686
|
"name": "--branch",
|
|
1641
1687
|
"type": "string",
|
|
1642
1688
|
"required": false,
|
|
1643
|
-
"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"
|
|
1644
1690
|
},
|
|
1645
1691
|
{
|
|
1646
1692
|
"name": "--decline",
|
|
@@ -2179,7 +2225,7 @@
|
|
|
2179
2225
|
"name": "--coverage",
|
|
2180
2226
|
"type": "string",
|
|
2181
2227
|
"required": false,
|
|
2182
|
-
"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"
|
|
2183
2229
|
},
|
|
2184
2230
|
{
|
|
2185
2231
|
"name": "--coverage-root",
|
|
@@ -2491,12 +2537,28 @@
|
|
|
2491
2537
|
"description": "Threshold for hot-path classification, forwarded to the sidecar when `--runtime-coverage` is set",
|
|
2492
2538
|
"default": "100"
|
|
2493
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
|
+
},
|
|
2494
2546
|
{
|
|
2495
2547
|
"name": "--gate-marker",
|
|
2496
2548
|
"type": "string",
|
|
2497
2549
|
"required": false,
|
|
2498
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"
|
|
2499
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
|
+
},
|
|
2500
2562
|
{
|
|
2501
2563
|
"name": "--brief",
|
|
2502
2564
|
"type": "bool",
|
|
@@ -2692,6 +2754,24 @@
|
|
|
2692
2754
|
"type": "string",
|
|
2693
2755
|
"required": true,
|
|
2694
2756
|
"description": "Path to a fallow JSON results file produced by `--format json` (dead-code, architecture, dupes, health, audit, security, or bare combined)"
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"name": "--mutation-report",
|
|
2760
|
+
"type": "string",
|
|
2761
|
+
"required": false,
|
|
2762
|
+
"description": "A saved `fallow mutation --format json` report, or the JSON error envelope of a failed run, to render with the results. Applies to the pr-comment, review, github-summary, github-annotations and codeclimate formats only. The paths in the report are relative to the root of the mutation run, which must be the `--root` of this call"
|
|
2763
|
+
},
|
|
2764
|
+
{
|
|
2765
|
+
"name": "--mutation-not-run",
|
|
2766
|
+
"type": "string",
|
|
2767
|
+
"required": false,
|
|
2768
|
+
"description": "Why mutation testing did not run in this job, so the render states it. Applies to the same formats as `--mutation-report`",
|
|
2769
|
+
"possible_values": [
|
|
2770
|
+
"event-refused",
|
|
2771
|
+
"fork-refused",
|
|
2772
|
+
"no-change-scope",
|
|
2773
|
+
"interrupted"
|
|
2774
|
+
]
|
|
2695
2775
|
}
|
|
2696
2776
|
]
|
|
2697
2777
|
},
|
|
@@ -3888,7 +3968,7 @@
|
|
|
3888
3968
|
"description": "Suppression comment or tag no longer matches any issue",
|
|
3889
3969
|
"label": "Stale Suppressions",
|
|
3890
3970
|
"config_key": "stale-suppressions",
|
|
3891
|
-
"registry_index":
|
|
3971
|
+
"registry_index": 47,
|
|
3892
3972
|
"aliases": [],
|
|
3893
3973
|
"lsp": true,
|
|
3894
3974
|
"filter_flag": "--stale-suppressions",
|
|
@@ -3924,7 +4004,7 @@
|
|
|
3924
4004
|
"description": "Suppression comment omits a required reason",
|
|
3925
4005
|
"label": "Missing Suppression Reasons",
|
|
3926
4006
|
"config_key": "require-suppression-reason",
|
|
3927
|
-
"registry_index":
|
|
4007
|
+
"registry_index": 48,
|
|
3928
4008
|
"aliases": [
|
|
3929
4009
|
"missing-suppression-reasons"
|
|
3930
4010
|
],
|
|
@@ -3956,7 +4036,7 @@
|
|
|
3956
4036
|
"description": "Catalog entry not referenced by any workspace package",
|
|
3957
4037
|
"label": "Unused Catalog Entries",
|
|
3958
4038
|
"config_key": "unused-catalog-entries",
|
|
3959
|
-
"registry_index":
|
|
4039
|
+
"registry_index": 49,
|
|
3960
4040
|
"aliases": [
|
|
3961
4041
|
"catalog",
|
|
3962
4042
|
"unused-catalog-entries"
|
|
@@ -3996,7 +4076,7 @@
|
|
|
3996
4076
|
"description": "Named catalog group has no entries",
|
|
3997
4077
|
"label": "Empty Catalog Groups",
|
|
3998
4078
|
"config_key": "empty-catalog-groups",
|
|
3999
|
-
"registry_index":
|
|
4079
|
+
"registry_index": 50,
|
|
4000
4080
|
"aliases": [
|
|
4001
4081
|
"empty-catalog",
|
|
4002
4082
|
"empty-catalog-groups"
|
|
@@ -4036,7 +4116,7 @@
|
|
|
4036
4116
|
"description": "package.json references a catalog that does not declare the package",
|
|
4037
4117
|
"label": "Unresolved Catalog References",
|
|
4038
4118
|
"config_key": "unresolved-catalog-references",
|
|
4039
|
-
"registry_index":
|
|
4119
|
+
"registry_index": 51,
|
|
4040
4120
|
"aliases": [
|
|
4041
4121
|
"unresolved-catalog",
|
|
4042
4122
|
"unresolved-catalog-references"
|
|
@@ -4076,7 +4156,7 @@
|
|
|
4076
4156
|
"description": "Package-manager override target is not declared or resolved",
|
|
4077
4157
|
"label": "Unused Dependency Overrides",
|
|
4078
4158
|
"config_key": "unused-dependency-overrides",
|
|
4079
|
-
"registry_index":
|
|
4159
|
+
"registry_index": 52,
|
|
4080
4160
|
"aliases": [
|
|
4081
4161
|
"unused-dependency-overrides",
|
|
4082
4162
|
"unused-override",
|
|
@@ -4117,7 +4197,7 @@
|
|
|
4117
4197
|
"description": "Package-manager override has an unparsable key or value",
|
|
4118
4198
|
"label": "Misconfigured Dependency Overrides",
|
|
4119
4199
|
"config_key": "misconfigured-dependency-overrides",
|
|
4120
|
-
"registry_index":
|
|
4200
|
+
"registry_index": 53,
|
|
4121
4201
|
"aliases": [
|
|
4122
4202
|
"misconfigured-dependency-overrides",
|
|
4123
4203
|
"misconfigured-override",
|
|
@@ -4368,6 +4448,42 @@
|
|
|
4368
4448
|
"license_note": null,
|
|
4369
4449
|
"docs_url": "https://fallow.tools/docs/explanations/dead-code/#absent-component-props"
|
|
4370
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
|
+
},
|
|
4371
4487
|
{
|
|
4372
4488
|
"id": "unused-component-prop",
|
|
4373
4489
|
"rule_id": "fallow/unused-component-prop",
|
|
@@ -4412,7 +4528,7 @@
|
|
|
4412
4528
|
"description": "A Vue <script setup> defineEmits event is emitted nowhere in its own component",
|
|
4413
4529
|
"label": "Unused Component Emits",
|
|
4414
4530
|
"config_key": "unused-component-emits",
|
|
4415
|
-
"registry_index":
|
|
4531
|
+
"registry_index": 36,
|
|
4416
4532
|
"aliases": [
|
|
4417
4533
|
"unused-component-emits"
|
|
4418
4534
|
],
|
|
@@ -4448,7 +4564,7 @@
|
|
|
4448
4564
|
"description": "An Angular @Input() / signal input() / model() input is read nowhere in its own component",
|
|
4449
4565
|
"label": "Unused Component Inputs",
|
|
4450
4566
|
"config_key": "unused-component-inputs",
|
|
4451
|
-
"registry_index":
|
|
4567
|
+
"registry_index": 37,
|
|
4452
4568
|
"aliases": [
|
|
4453
4569
|
"unused-component-inputs"
|
|
4454
4570
|
],
|
|
@@ -4484,7 +4600,7 @@
|
|
|
4484
4600
|
"description": "An Angular @Output() / signal output() output is emitted nowhere in its own component",
|
|
4485
4601
|
"label": "Unused Component Outputs",
|
|
4486
4602
|
"config_key": "unused-component-outputs",
|
|
4487
|
-
"registry_index":
|
|
4603
|
+
"registry_index": 38,
|
|
4488
4604
|
"aliases": [
|
|
4489
4605
|
"unused-component-outputs"
|
|
4490
4606
|
],
|
|
@@ -4520,7 +4636,7 @@
|
|
|
4520
4636
|
"description": "A Svelte component dispatches a createEventDispatcher event whose name is listened to nowhere in the project",
|
|
4521
4637
|
"label": "Unused Svelte Events",
|
|
4522
4638
|
"config_key": "unused-svelte-events",
|
|
4523
|
-
"registry_index":
|
|
4639
|
+
"registry_index": 39,
|
|
4524
4640
|
"aliases": [
|
|
4525
4641
|
"unused-svelte-events"
|
|
4526
4642
|
],
|
|
@@ -4556,7 +4672,7 @@
|
|
|
4556
4672
|
"description": "An Effect layer is composed only into layers that nothing uses",
|
|
4557
4673
|
"label": "Unused Effect Layers",
|
|
4558
4674
|
"config_key": "unused-effect-layers",
|
|
4559
|
-
"registry_index":
|
|
4675
|
+
"registry_index": 42,
|
|
4560
4676
|
"aliases": [
|
|
4561
4677
|
"unused-effect-layers"
|
|
4562
4678
|
],
|
|
@@ -4592,7 +4708,7 @@
|
|
|
4592
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",
|
|
4593
4709
|
"label": "Unused Tagged Errors",
|
|
4594
4710
|
"config_key": "unused-tagged-errors",
|
|
4595
|
-
"registry_index":
|
|
4711
|
+
"registry_index": 43,
|
|
4596
4712
|
"aliases": [
|
|
4597
4713
|
"unused-tagged-errors"
|
|
4598
4714
|
],
|
|
@@ -4628,7 +4744,7 @@
|
|
|
4628
4744
|
"description": "A catchTag handler names a project error tag that no code produces",
|
|
4629
4745
|
"label": "Unproduced Catch Tags",
|
|
4630
4746
|
"config_key": "unproduced-catch-tags",
|
|
4631
|
-
"registry_index":
|
|
4747
|
+
"registry_index": 44,
|
|
4632
4748
|
"aliases": [
|
|
4633
4749
|
"unproduced-catch-tags"
|
|
4634
4750
|
],
|
|
@@ -4664,7 +4780,7 @@
|
|
|
4664
4780
|
"description": "A Next.js Server Action exported from a \"use server\" file is referenced by no code in the project",
|
|
4665
4781
|
"label": "Unused Server Actions",
|
|
4666
4782
|
"config_key": "unused-server-actions",
|
|
4667
|
-
"registry_index":
|
|
4783
|
+
"registry_index": 40,
|
|
4668
4784
|
"aliases": [
|
|
4669
4785
|
"unused-server-actions"
|
|
4670
4786
|
],
|
|
@@ -4700,7 +4816,7 @@
|
|
|
4700
4816
|
"description": "A SvelteKit load() return-object key is read by no consumer",
|
|
4701
4817
|
"label": "Unused Load Data Keys",
|
|
4702
4818
|
"config_key": "unused-load-data-keys",
|
|
4703
|
-
"registry_index":
|
|
4819
|
+
"registry_index": 41,
|
|
4704
4820
|
"aliases": [
|
|
4705
4821
|
"unused-load-data-keys"
|
|
4706
4822
|
],
|
|
@@ -4736,7 +4852,7 @@
|
|
|
4736
4852
|
"description": "A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer",
|
|
4737
4853
|
"label": "Prop Drilling",
|
|
4738
4854
|
"config_key": "prop-drilling",
|
|
4739
|
-
"registry_index":
|
|
4855
|
+
"registry_index": 59,
|
|
4740
4856
|
"aliases": [],
|
|
4741
4857
|
"lsp": true,
|
|
4742
4858
|
"filter_flag": null,
|
|
@@ -4770,7 +4886,7 @@
|
|
|
4770
4886
|
"description": "A React/Preact component whose whole body is a single spread-forwarded child render (a candidate for inlining)",
|
|
4771
4887
|
"label": "Thin Wrappers",
|
|
4772
4888
|
"config_key": "thin-wrapper",
|
|
4773
|
-
"registry_index":
|
|
4889
|
+
"registry_index": 60,
|
|
4774
4890
|
"aliases": [
|
|
4775
4891
|
"thin-wrappers"
|
|
4776
4892
|
],
|
|
@@ -4806,7 +4922,7 @@
|
|
|
4806
4922
|
"description": "Three or more React/Preact components across two or more files declare an identical prop-name set (a missing shared Props type)",
|
|
4807
4923
|
"label": "Duplicate Prop Shapes",
|
|
4808
4924
|
"config_key": "duplicate-prop-shape",
|
|
4809
|
-
"registry_index":
|
|
4925
|
+
"registry_index": 61,
|
|
4810
4926
|
"aliases": [
|
|
4811
4927
|
"duplicate-prop-shapes"
|
|
4812
4928
|
],
|
|
@@ -4842,7 +4958,7 @@
|
|
|
4842
4958
|
"description": "Two or more Next.js App Router route files resolve to the same URL",
|
|
4843
4959
|
"label": "Route Collisions",
|
|
4844
4960
|
"config_key": "route-collision",
|
|
4845
|
-
"registry_index":
|
|
4961
|
+
"registry_index": 45,
|
|
4846
4962
|
"aliases": [
|
|
4847
4963
|
"route-collisions"
|
|
4848
4964
|
],
|
|
@@ -4880,7 +4996,7 @@
|
|
|
4880
4996
|
"description": "Sibling Next.js dynamic route segments use different slug names at the same position",
|
|
4881
4997
|
"label": "Dynamic Segment Conflicts",
|
|
4882
4998
|
"config_key": "dynamic-segment-name-conflict",
|
|
4883
|
-
"registry_index":
|
|
4999
|
+
"registry_index": 46,
|
|
4884
5000
|
"aliases": [
|
|
4885
5001
|
"dynamic-segment-name-conflicts"
|
|
4886
5002
|
],
|
|
@@ -5098,7 +5214,7 @@
|
|
|
5098
5214
|
"description": "CSS or CSS-in-JS hardcoded styling value bypasses the design token system",
|
|
5099
5215
|
"label": "CSS Token Drift",
|
|
5100
5216
|
"config_key": "css-token-drift",
|
|
5101
|
-
"registry_index":
|
|
5217
|
+
"registry_index": 62,
|
|
5102
5218
|
"aliases": [],
|
|
5103
5219
|
"lsp": false,
|
|
5104
5220
|
"filter_flag": null,
|
|
@@ -5128,7 +5244,7 @@
|
|
|
5128
5244
|
"description": "CSS or CSS-in-JS declaration block is duplicated across rules",
|
|
5129
5245
|
"label": "CSS Duplicate Block",
|
|
5130
5246
|
"config_key": "css-duplicate-block",
|
|
5131
|
-
"registry_index":
|
|
5247
|
+
"registry_index": 63,
|
|
5132
5248
|
"aliases": [],
|
|
5133
5249
|
"lsp": false,
|
|
5134
5250
|
"filter_flag": null,
|
|
@@ -5158,7 +5274,7 @@
|
|
|
5158
5274
|
"description": "CSS selector, nesting, or important usage is structurally complex",
|
|
5159
5275
|
"label": "CSS Selector Complexity",
|
|
5160
5276
|
"config_key": "css-selector-complexity",
|
|
5161
|
-
"registry_index":
|
|
5277
|
+
"registry_index": 64,
|
|
5162
5278
|
"aliases": [],
|
|
5163
5279
|
"lsp": false,
|
|
5164
5280
|
"filter_flag": null,
|
|
@@ -5188,7 +5304,7 @@
|
|
|
5188
5304
|
"description": "CSS or CSS-in-JS surface appears unused",
|
|
5189
5305
|
"label": "CSS Dead Surface",
|
|
5190
5306
|
"config_key": "css-dead-surface",
|
|
5191
|
-
"registry_index":
|
|
5307
|
+
"registry_index": 65,
|
|
5192
5308
|
"aliases": [],
|
|
5193
5309
|
"lsp": false,
|
|
5194
5310
|
"filter_flag": null,
|
|
@@ -5218,7 +5334,7 @@
|
|
|
5218
5334
|
"description": "CSS or CSS-in-JS reference resolves to no stylesheet definition",
|
|
5219
5335
|
"label": "CSS Broken Reference",
|
|
5220
5336
|
"config_key": "css-broken-reference",
|
|
5221
|
-
"registry_index":
|
|
5337
|
+
"registry_index": 66,
|
|
5222
5338
|
"aliases": [],
|
|
5223
5339
|
"lsp": false,
|
|
5224
5340
|
"filter_flag": null,
|
|
@@ -5608,7 +5724,7 @@
|
|
|
5608
5724
|
"description": "Detected feature flag pattern",
|
|
5609
5725
|
"label": "Feature Flags",
|
|
5610
5726
|
"config_key": "feature-flags",
|
|
5611
|
-
"registry_index":
|
|
5727
|
+
"registry_index": 57,
|
|
5612
5728
|
"aliases": [],
|
|
5613
5729
|
"lsp": false,
|
|
5614
5730
|
"filter_flag": null,
|
|
@@ -7108,7 +7224,7 @@
|
|
|
7108
7224
|
"description": "The change weakens tests or a coverage threshold",
|
|
7109
7225
|
"label": "Weakened Tests",
|
|
7110
7226
|
"config_key": "weakened-tests",
|
|
7111
|
-
"registry_index":
|
|
7227
|
+
"registry_index": 67,
|
|
7112
7228
|
"aliases": [],
|
|
7113
7229
|
"lsp": false,
|
|
7114
7230
|
"filter_flag": null,
|
|
@@ -7138,7 +7254,7 @@
|
|
|
7138
7254
|
"description": "The change adds a suppression comment",
|
|
7139
7255
|
"label": "Added Suppressions",
|
|
7140
7256
|
"config_key": "added-suppression",
|
|
7141
|
-
"registry_index":
|
|
7257
|
+
"registry_index": 68,
|
|
7142
7258
|
"aliases": [],
|
|
7143
7259
|
"lsp": false,
|
|
7144
7260
|
"filter_flag": null,
|
|
@@ -7168,7 +7284,7 @@
|
|
|
7168
7284
|
"description": "The change adds a test-environment branch to source code",
|
|
7169
7285
|
"label": "Test-Only Branches",
|
|
7170
7286
|
"config_key": "test-only-branch",
|
|
7171
|
-
"registry_index":
|
|
7287
|
+
"registry_index": 69,
|
|
7172
7288
|
"aliases": [],
|
|
7173
7289
|
"lsp": false,
|
|
7174
7290
|
"filter_flag": null,
|
|
@@ -7198,7 +7314,7 @@
|
|
|
7198
7314
|
"description": "The change edits one copy of duplicated code but not its siblings",
|
|
7199
7315
|
"label": "Diverged Clone Siblings",
|
|
7200
7316
|
"config_key": "diverged-clone-sibling",
|
|
7201
|
-
"registry_index":
|
|
7317
|
+
"registry_index": 70,
|
|
7202
7318
|
"aliases": [],
|
|
7203
7319
|
"lsp": false,
|
|
7204
7320
|
"filter_flag": null,
|
|
@@ -7228,7 +7344,7 @@
|
|
|
7228
7344
|
"description": "The change adds a dependency",
|
|
7229
7345
|
"label": "Added Dependencies",
|
|
7230
7346
|
"config_key": "added-dependency",
|
|
7231
|
-
"registry_index":
|
|
7347
|
+
"registry_index": 71,
|
|
7232
7348
|
"aliases": [],
|
|
7233
7349
|
"lsp": false,
|
|
7234
7350
|
"filter_flag": null,
|
|
@@ -7249,6 +7365,36 @@
|
|
|
7249
7365
|
"license": "free",
|
|
7250
7366
|
"license_note": null,
|
|
7251
7367
|
"docs_url": "https://fallow.tools/docs/cli/audit/#diff-risk-rules"
|
|
7368
|
+
},
|
|
7369
|
+
{
|
|
7370
|
+
"id": "mutation-survived",
|
|
7371
|
+
"rule_id": "fallow/mutation-survived",
|
|
7372
|
+
"command": "mutation",
|
|
7373
|
+
"category": "Tests",
|
|
7374
|
+
"description": "A small code change made no test fail",
|
|
7375
|
+
"label": null,
|
|
7376
|
+
"config_key": null,
|
|
7377
|
+
"registry_index": null,
|
|
7378
|
+
"aliases": [],
|
|
7379
|
+
"lsp": false,
|
|
7380
|
+
"filter_flag": null,
|
|
7381
|
+
"result_key": null,
|
|
7382
|
+
"summary_label": null,
|
|
7383
|
+
"summary_docs_anchor": null,
|
|
7384
|
+
"sarif_rule_ids": null,
|
|
7385
|
+
"codeclimate_check_names": null,
|
|
7386
|
+
"ts_alias": null,
|
|
7387
|
+
"counts_in_total": false,
|
|
7388
|
+
"fixable": false,
|
|
7389
|
+
"suppressible": false,
|
|
7390
|
+
"suppress_comment": null,
|
|
7391
|
+
"default_severity": null,
|
|
7392
|
+
"opt_in": null,
|
|
7393
|
+
"frameworks": [],
|
|
7394
|
+
"note": null,
|
|
7395
|
+
"license": "free",
|
|
7396
|
+
"license_note": null,
|
|
7397
|
+
"docs_url": "https://fallow.tools/docs/cli/mutation/"
|
|
7252
7398
|
}
|
|
7253
7399
|
],
|
|
7254
7400
|
"suppression_comments": {
|
|
@@ -7946,6 +8092,8 @@
|
|
|
7946
8092
|
"all",
|
|
7947
8093
|
"paths",
|
|
7948
8094
|
"max_mutants",
|
|
8095
|
+
"mutants_per_line",
|
|
8096
|
+
"function_scope",
|
|
7949
8097
|
"operators"
|
|
7950
8098
|
],
|
|
7951
8099
|
"license": "free",
|
|
@@ -8576,7 +8724,7 @@
|
|
|
8576
8724
|
]
|
|
8577
8725
|
},
|
|
8578
8726
|
"plugins": {
|
|
8579
|
-
"count":
|
|
8727
|
+
"count": 156,
|
|
8580
8728
|
"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",
|
|
8581
8729
|
"names": [
|
|
8582
8730
|
"nextjs",
|
|
@@ -8592,6 +8740,7 @@
|
|
|
8592
8740
|
"redwoodsdk",
|
|
8593
8741
|
"tanstack-router",
|
|
8594
8742
|
"waku",
|
|
8743
|
+
"solid-start",
|
|
8595
8744
|
"react-native",
|
|
8596
8745
|
"expo",
|
|
8597
8746
|
"expo-router",
|
|
@@ -8612,6 +8761,7 @@
|
|
|
8612
8761
|
"supabase",
|
|
8613
8762
|
"vitepress",
|
|
8614
8763
|
"rspress",
|
|
8764
|
+
"dumi",
|
|
8615
8765
|
"next-intl",
|
|
8616
8766
|
"relay",
|
|
8617
8767
|
"electron",
|
|
@@ -8630,6 +8780,7 @@
|
|
|
8630
8780
|
"ember",
|
|
8631
8781
|
"eve",
|
|
8632
8782
|
"vite",
|
|
8783
|
+
"vite-plugin-pages",
|
|
8633
8784
|
"vscode",
|
|
8634
8785
|
"webpack",
|
|
8635
8786
|
"rollup",
|
|
@@ -8673,6 +8824,7 @@
|
|
|
8673
8824
|
"tailwind",
|
|
8674
8825
|
"postcss",
|
|
8675
8826
|
"unocss",
|
|
8827
|
+
"unplugin-icons",
|
|
8676
8828
|
"pandacss",
|
|
8677
8829
|
"prisma",
|
|
8678
8830
|
"drizzle",
|
|
@@ -8710,10 +8862,12 @@
|
|
|
8710
8862
|
"typedoc",
|
|
8711
8863
|
"openapi-ts",
|
|
8712
8864
|
"plop",
|
|
8865
|
+
"gulp",
|
|
8713
8866
|
"c8",
|
|
8714
8867
|
"nyc",
|
|
8715
8868
|
"msw",
|
|
8716
8869
|
"napi-rs",
|
|
8870
|
+
"n8n",
|
|
8717
8871
|
"opencode",
|
|
8718
8872
|
"nodemon",
|
|
8719
8873
|
"pm2",
|
|
@@ -8782,6 +8936,11 @@
|
|
|
8782
8936
|
"command": "fallow health --coverage-gaps",
|
|
8783
8937
|
"note": null
|
|
8784
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
|
+
},
|
|
8785
8944
|
{
|
|
8786
8945
|
"task": "consolidate duplication",
|
|
8787
8946
|
"command": "fallow dupes --trace dup:<fingerprint>",
|