fallow 3.29.0 → 3.31.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 +2 -4
- package/capabilities.json +288 -49
- package/issue-registry.json +106 -37
- package/package.json +12 -11
- package/schema.json +67 -7
- package/skills/fallow/SKILL.md +4 -2
- package/skills/fallow/references/cli-reference.md +54 -18
- package/skills/fallow/references/gotchas.md +24 -0
- package/skills/fallow/references/issue-types.md +3 -1
- package/skills/fallow/references/mcp.md +32 -2
- package/types/output-contract.d.ts +1133 -15
package/capabilities.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.31.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": [
|
|
@@ -100,6 +100,16 @@
|
|
|
100
100
|
"required": false,
|
|
101
101
|
"description": "Only report issues in files changed since this git ref (e.g., main, HEAD~5)"
|
|
102
102
|
},
|
|
103
|
+
{
|
|
104
|
+
"name": "--no-package-baselines",
|
|
105
|
+
"type": "bool",
|
|
106
|
+
"required": false,
|
|
107
|
+
"description": "Ignore the per-package refs of `workspaces.changedSince` for this run",
|
|
108
|
+
"possible_values": [
|
|
109
|
+
"true",
|
|
110
|
+
"false"
|
|
111
|
+
]
|
|
112
|
+
},
|
|
103
113
|
{
|
|
104
114
|
"name": "--diff-file",
|
|
105
115
|
"type": "string",
|
|
@@ -330,6 +340,22 @@
|
|
|
330
340
|
"false"
|
|
331
341
|
]
|
|
332
342
|
},
|
|
343
|
+
{
|
|
344
|
+
"name": "--fail-on-baseline-growth",
|
|
345
|
+
"type": "bool",
|
|
346
|
+
"required": false,
|
|
347
|
+
"description": "Exit with code 1 if a loaded baseline has a key that the same file at the base ref does not have",
|
|
348
|
+
"possible_values": [
|
|
349
|
+
"true",
|
|
350
|
+
"false"
|
|
351
|
+
]
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"name": "--baseline-base",
|
|
355
|
+
"type": "string",
|
|
356
|
+
"required": false,
|
|
357
|
+
"description": "The git ref that --fail-on-baseline-growth compares the baseline with"
|
|
358
|
+
},
|
|
333
359
|
{
|
|
334
360
|
"name": "--fail-on-parse-error",
|
|
335
361
|
"type": "bool",
|
|
@@ -799,6 +825,16 @@
|
|
|
799
825
|
"false"
|
|
800
826
|
]
|
|
801
827
|
},
|
|
828
|
+
{
|
|
829
|
+
"name": "--package-cycles",
|
|
830
|
+
"type": "bool",
|
|
831
|
+
"required": false,
|
|
832
|
+
"description": "Only report dependency cycles between workspace packages",
|
|
833
|
+
"possible_values": [
|
|
834
|
+
"true",
|
|
835
|
+
"false"
|
|
836
|
+
]
|
|
837
|
+
},
|
|
802
838
|
{
|
|
803
839
|
"name": "--boundary-violations",
|
|
804
840
|
"type": "bool",
|
|
@@ -931,6 +967,12 @@
|
|
|
931
967
|
"required": false,
|
|
932
968
|
"description": "Only report issues in the specified file(s). Accepts multiple values. The full project graph is still built, but only issues in matching files are reported. Useful for lint-staged pre-commit hooks"
|
|
933
969
|
},
|
|
970
|
+
{
|
|
971
|
+
"name": "--finding-id",
|
|
972
|
+
"type": "string",
|
|
973
|
+
"required": false,
|
|
974
|
+
"description": "Only report the findings with these `finding_id` values. Repeat the flag or pass a comma-separated list. Ids stay the same under every filter. The JSON output adds `finding_id_query`: a missing id means \"resolved\" only when `conclusive` is true"
|
|
975
|
+
},
|
|
934
976
|
{
|
|
935
977
|
"name": "path",
|
|
936
978
|
"type": "string",
|
|
@@ -1055,6 +1097,16 @@
|
|
|
1055
1097
|
"required": false,
|
|
1056
1098
|
"description": "Shortest import path between two modules, as two file paths (e.g. `--path src/app.ts src/db.ts`). Mutually exclusive with the symbol target and the call-chain flags"
|
|
1057
1099
|
},
|
|
1100
|
+
{
|
|
1101
|
+
"name": "--eager-only",
|
|
1102
|
+
"type": "bool",
|
|
1103
|
+
"required": false,
|
|
1104
|
+
"description": "With `--path`, follow only static value imports, so the route explains why TO loads before FROM runs",
|
|
1105
|
+
"possible_values": [
|
|
1106
|
+
"true",
|
|
1107
|
+
"false"
|
|
1108
|
+
]
|
|
1109
|
+
},
|
|
1058
1110
|
{
|
|
1059
1111
|
"name": "--callers",
|
|
1060
1112
|
"type": "bool",
|
|
@@ -1264,7 +1316,7 @@
|
|
|
1264
1316
|
},
|
|
1265
1317
|
{
|
|
1266
1318
|
"name": "list",
|
|
1267
|
-
"description": "List discovered entry points, files, plugins, boundaries, and
|
|
1319
|
+
"description": "List discovered entry points, files, plugins, boundaries, workspaces, and the startup import weight",
|
|
1268
1320
|
"flags": [
|
|
1269
1321
|
{
|
|
1270
1322
|
"name": "--entry-points",
|
|
@@ -1316,6 +1368,16 @@
|
|
|
1316
1368
|
"false"
|
|
1317
1369
|
]
|
|
1318
1370
|
},
|
|
1371
|
+
{
|
|
1372
|
+
"name": "--entry-weight",
|
|
1373
|
+
"type": "bool",
|
|
1374
|
+
"required": false,
|
|
1375
|
+
"description": "Show the startup import weight of each runtime entry point, in source bytes (not bundle size)",
|
|
1376
|
+
"possible_values": [
|
|
1377
|
+
"true",
|
|
1378
|
+
"false"
|
|
1379
|
+
]
|
|
1380
|
+
},
|
|
1319
1381
|
{
|
|
1320
1382
|
"name": "path",
|
|
1321
1383
|
"type": "string",
|
|
@@ -1722,6 +1784,77 @@
|
|
|
1722
1784
|
"type": "string",
|
|
1723
1785
|
"required": false,
|
|
1724
1786
|
"description": "Show only the top N flags"
|
|
1787
|
+
},
|
|
1788
|
+
{
|
|
1789
|
+
"name": "--retirement",
|
|
1790
|
+
"type": "bool",
|
|
1791
|
+
"required": false,
|
|
1792
|
+
"description": "Add a retirement report: one row per flag, with the reasons the flag can be retired. Advisory only; nothing is removed",
|
|
1793
|
+
"possible_values": [
|
|
1794
|
+
"true",
|
|
1795
|
+
"false"
|
|
1796
|
+
]
|
|
1797
|
+
},
|
|
1798
|
+
{
|
|
1799
|
+
"name": "--reason",
|
|
1800
|
+
"type": "string",
|
|
1801
|
+
"required": false,
|
|
1802
|
+
"description": "Keep only retirement rows with this reason (repeatable)",
|
|
1803
|
+
"possible_values": [
|
|
1804
|
+
"single-read-site",
|
|
1805
|
+
"test-only",
|
|
1806
|
+
"literal-constant",
|
|
1807
|
+
"identical-branches",
|
|
1808
|
+
"empty-branch",
|
|
1809
|
+
"guards-dead-code",
|
|
1810
|
+
"defined-never-read",
|
|
1811
|
+
"fully-rolled-out",
|
|
1812
|
+
"archived-in-vendor",
|
|
1813
|
+
"missing-in-vendor",
|
|
1814
|
+
"vendor-only"
|
|
1815
|
+
]
|
|
1816
|
+
},
|
|
1817
|
+
{
|
|
1818
|
+
"name": "--sort",
|
|
1819
|
+
"type": "string",
|
|
1820
|
+
"required": false,
|
|
1821
|
+
"description": "Order of the retirement rows",
|
|
1822
|
+
"default": "age",
|
|
1823
|
+
"possible_values": [
|
|
1824
|
+
"age",
|
|
1825
|
+
"sites",
|
|
1826
|
+
"name"
|
|
1827
|
+
]
|
|
1828
|
+
},
|
|
1829
|
+
{
|
|
1830
|
+
"name": "--flag-age",
|
|
1831
|
+
"type": "string",
|
|
1832
|
+
"required": false,
|
|
1833
|
+
"description": "How to measure flag age: blame (lower bound), pickaxe (first commit with the name, slower) or off",
|
|
1834
|
+
"default": "blame",
|
|
1835
|
+
"possible_values": [
|
|
1836
|
+
"blame",
|
|
1837
|
+
"pickaxe",
|
|
1838
|
+
"off"
|
|
1839
|
+
]
|
|
1840
|
+
},
|
|
1841
|
+
{
|
|
1842
|
+
"name": "--min-age",
|
|
1843
|
+
"type": "string",
|
|
1844
|
+
"required": false,
|
|
1845
|
+
"description": "Keep only retirement rows at least this many days old"
|
|
1846
|
+
},
|
|
1847
|
+
{
|
|
1848
|
+
"name": "--flag-state",
|
|
1849
|
+
"type": "string",
|
|
1850
|
+
"required": false,
|
|
1851
|
+
"description": "Vendor flag export (JSON, read offline) that adds the fully-rolled-out, archived-in-vendor, missing-in-vendor and vendor-only reasons"
|
|
1852
|
+
},
|
|
1853
|
+
{
|
|
1854
|
+
"name": "--max-flag-age",
|
|
1855
|
+
"type": "string",
|
|
1856
|
+
"required": false,
|
|
1857
|
+
"description": "Exit with code 1 when a flag in scope is older than this many days. Opt-in; needs a flag age"
|
|
1725
1858
|
}
|
|
1726
1859
|
]
|
|
1727
1860
|
},
|
|
@@ -2956,6 +3089,45 @@
|
|
|
2956
3089
|
"license_note": null,
|
|
2957
3090
|
"docs_url": "https://docs.fallow.tools/explanations/dead-code#re-export-cycles"
|
|
2958
3091
|
},
|
|
3092
|
+
{
|
|
3093
|
+
"id": "package-cycle",
|
|
3094
|
+
"rule_id": "fallow/package-cycle",
|
|
3095
|
+
"command": "dead-code",
|
|
3096
|
+
"category": "Architecture",
|
|
3097
|
+
"description": "Two or more workspace packages import each other in a loop",
|
|
3098
|
+
"label": "Package Cycles",
|
|
3099
|
+
"config_key": "package-cycle",
|
|
3100
|
+
"registry_index": 20,
|
|
3101
|
+
"aliases": [
|
|
3102
|
+
"package-cycles"
|
|
3103
|
+
],
|
|
3104
|
+
"lsp": true,
|
|
3105
|
+
"filter_flag": "--package-cycles",
|
|
3106
|
+
"result_key": "package_cycles",
|
|
3107
|
+
"summary_label": "Package cycles",
|
|
3108
|
+
"summary_docs_anchor": "package-cycles",
|
|
3109
|
+
"sarif_rule_ids": [
|
|
3110
|
+
"fallow/package-cycle"
|
|
3111
|
+
],
|
|
3112
|
+
"codeclimate_check_names": [
|
|
3113
|
+
"fallow/package-cycle"
|
|
3114
|
+
],
|
|
3115
|
+
"ts_alias": {
|
|
3116
|
+
"name": "PackageCycle",
|
|
3117
|
+
"parent": "PackageCycleFinding"
|
|
3118
|
+
},
|
|
3119
|
+
"counts_in_total": true,
|
|
3120
|
+
"fixable": false,
|
|
3121
|
+
"suppressible": true,
|
|
3122
|
+
"suppress_comment": "// fallow-ignore-next-line package-cycle",
|
|
3123
|
+
"default_severity": "warn",
|
|
3124
|
+
"opt_in": false,
|
|
3125
|
+
"frameworks": [],
|
|
3126
|
+
"note": "Requires a workspace with two or more packages",
|
|
3127
|
+
"license": "free",
|
|
3128
|
+
"license_note": null,
|
|
3129
|
+
"docs_url": "https://docs.fallow.tools/explanations/dead-code#package-cycles"
|
|
3130
|
+
},
|
|
2959
3131
|
{
|
|
2960
3132
|
"id": "boundary-violation",
|
|
2961
3133
|
"rule_id": "fallow/boundary-violation",
|
|
@@ -2964,7 +3136,7 @@
|
|
|
2964
3136
|
"description": "Import crosses a configured architecture boundary",
|
|
2965
3137
|
"label": "Boundary Violations",
|
|
2966
3138
|
"config_key": "boundary-violation",
|
|
2967
|
-
"registry_index":
|
|
3139
|
+
"registry_index": 21,
|
|
2968
3140
|
"aliases": [],
|
|
2969
3141
|
"lsp": true,
|
|
2970
3142
|
"filter_flag": "--boundary-violations",
|
|
@@ -3001,7 +3173,7 @@
|
|
|
3001
3173
|
"description": "Source file matches no configured architecture boundary zone",
|
|
3002
3174
|
"label": "Boundary Coverage",
|
|
3003
3175
|
"config_key": "boundary-violation",
|
|
3004
|
-
"registry_index":
|
|
3176
|
+
"registry_index": 22,
|
|
3005
3177
|
"aliases": [
|
|
3006
3178
|
"boundary-coverage-violations"
|
|
3007
3179
|
],
|
|
@@ -3037,7 +3209,7 @@
|
|
|
3037
3209
|
"description": "Zoned file calls a callee its zone forbids",
|
|
3038
3210
|
"label": "Boundary Call Violations",
|
|
3039
3211
|
"config_key": "boundary-violation",
|
|
3040
|
-
"registry_index":
|
|
3212
|
+
"registry_index": 23,
|
|
3041
3213
|
"aliases": [
|
|
3042
3214
|
"boundary-calls",
|
|
3043
3215
|
"boundary-call-violations"
|
|
@@ -3074,7 +3246,7 @@
|
|
|
3074
3246
|
"description": "Banned usage matched a rule-pack rule",
|
|
3075
3247
|
"label": "Policy Violations",
|
|
3076
3248
|
"config_key": "policy-violation",
|
|
3077
|
-
"registry_index":
|
|
3249
|
+
"registry_index": 24,
|
|
3078
3250
|
"aliases": [
|
|
3079
3251
|
"policy-violations"
|
|
3080
3252
|
],
|
|
@@ -3110,7 +3282,7 @@
|
|
|
3110
3282
|
"description": "Suppression comment or tag no longer matches any issue",
|
|
3111
3283
|
"label": "Stale Suppressions",
|
|
3112
3284
|
"config_key": "stale-suppressions",
|
|
3113
|
-
"registry_index":
|
|
3285
|
+
"registry_index": 39,
|
|
3114
3286
|
"aliases": [],
|
|
3115
3287
|
"lsp": true,
|
|
3116
3288
|
"filter_flag": "--stale-suppressions",
|
|
@@ -3146,7 +3318,7 @@
|
|
|
3146
3318
|
"description": "Suppression comment omits a required reason",
|
|
3147
3319
|
"label": "Missing Suppression Reasons",
|
|
3148
3320
|
"config_key": "require-suppression-reason",
|
|
3149
|
-
"registry_index":
|
|
3321
|
+
"registry_index": 40,
|
|
3150
3322
|
"aliases": [
|
|
3151
3323
|
"missing-suppression-reasons"
|
|
3152
3324
|
],
|
|
@@ -3178,7 +3350,7 @@
|
|
|
3178
3350
|
"description": "Catalog entry not referenced by any workspace package",
|
|
3179
3351
|
"label": "Unused Catalog Entries",
|
|
3180
3352
|
"config_key": "unused-catalog-entries",
|
|
3181
|
-
"registry_index":
|
|
3353
|
+
"registry_index": 41,
|
|
3182
3354
|
"aliases": [
|
|
3183
3355
|
"catalog",
|
|
3184
3356
|
"unused-catalog-entries"
|
|
@@ -3218,7 +3390,7 @@
|
|
|
3218
3390
|
"description": "Named catalog group has no entries",
|
|
3219
3391
|
"label": "Empty Catalog Groups",
|
|
3220
3392
|
"config_key": "empty-catalog-groups",
|
|
3221
|
-
"registry_index":
|
|
3393
|
+
"registry_index": 42,
|
|
3222
3394
|
"aliases": [
|
|
3223
3395
|
"empty-catalog",
|
|
3224
3396
|
"empty-catalog-groups"
|
|
@@ -3258,7 +3430,7 @@
|
|
|
3258
3430
|
"description": "package.json references a catalog that does not declare the package",
|
|
3259
3431
|
"label": "Unresolved Catalog References",
|
|
3260
3432
|
"config_key": "unresolved-catalog-references",
|
|
3261
|
-
"registry_index":
|
|
3433
|
+
"registry_index": 43,
|
|
3262
3434
|
"aliases": [
|
|
3263
3435
|
"unresolved-catalog",
|
|
3264
3436
|
"unresolved-catalog-references"
|
|
@@ -3298,7 +3470,7 @@
|
|
|
3298
3470
|
"description": "Package-manager override target is not declared or resolved",
|
|
3299
3471
|
"label": "Unused Dependency Overrides",
|
|
3300
3472
|
"config_key": "unused-dependency-overrides",
|
|
3301
|
-
"registry_index":
|
|
3473
|
+
"registry_index": 44,
|
|
3302
3474
|
"aliases": [
|
|
3303
3475
|
"unused-dependency-overrides",
|
|
3304
3476
|
"unused-override",
|
|
@@ -3339,7 +3511,7 @@
|
|
|
3339
3511
|
"description": "Package-manager override has an unparsable key or value",
|
|
3340
3512
|
"label": "Misconfigured Dependency Overrides",
|
|
3341
3513
|
"config_key": "misconfigured-dependency-overrides",
|
|
3342
|
-
"registry_index":
|
|
3514
|
+
"registry_index": 45,
|
|
3343
3515
|
"aliases": [
|
|
3344
3516
|
"misconfigured-dependency-overrides",
|
|
3345
3517
|
"misconfigured-override",
|
|
@@ -3380,7 +3552,7 @@
|
|
|
3380
3552
|
"description": "\"use client\" file exports a server-only / route-config name",
|
|
3381
3553
|
"label": "Invalid Client Exports",
|
|
3382
3554
|
"config_key": "invalid-client-export",
|
|
3383
|
-
"registry_index":
|
|
3555
|
+
"registry_index": 25,
|
|
3384
3556
|
"aliases": [
|
|
3385
3557
|
"invalid-client-exports"
|
|
3386
3558
|
],
|
|
@@ -3418,7 +3590,7 @@
|
|
|
3418
3590
|
"description": "Barrel re-exports both a \"use client\" module and a server-only module",
|
|
3419
3591
|
"label": "Mixed Client/Server Barrels",
|
|
3420
3592
|
"config_key": "mixed-client-server-barrel",
|
|
3421
|
-
"registry_index":
|
|
3593
|
+
"registry_index": 26,
|
|
3422
3594
|
"aliases": [
|
|
3423
3595
|
"mixed-client-server-barrels"
|
|
3424
3596
|
],
|
|
@@ -3454,7 +3626,7 @@
|
|
|
3454
3626
|
"description": "\"use client\" / \"use server\" directive is not in the leading position and is ignored",
|
|
3455
3627
|
"label": "Misplaced Directives",
|
|
3456
3628
|
"config_key": "misplaced-directive",
|
|
3457
|
-
"registry_index":
|
|
3629
|
+
"registry_index": 27,
|
|
3458
3630
|
"aliases": [
|
|
3459
3631
|
"misplaced-directives"
|
|
3460
3632
|
],
|
|
@@ -3490,7 +3662,7 @@
|
|
|
3490
3662
|
"description": "inject() / getContext() reads a key that no provide() / setContext() supplies",
|
|
3491
3663
|
"label": "Unprovided Injects",
|
|
3492
3664
|
"config_key": "unprovided-injects",
|
|
3493
|
-
"registry_index":
|
|
3665
|
+
"registry_index": 28,
|
|
3494
3666
|
"aliases": [
|
|
3495
3667
|
"unprovided-injects"
|
|
3496
3668
|
],
|
|
@@ -3526,7 +3698,7 @@
|
|
|
3526
3698
|
"description": "A Vue / Svelte component is reachable through a barrel but rendered nowhere",
|
|
3527
3699
|
"label": "Unrendered Components",
|
|
3528
3700
|
"config_key": "unrendered-components",
|
|
3529
|
-
"registry_index":
|
|
3701
|
+
"registry_index": 29,
|
|
3530
3702
|
"aliases": [
|
|
3531
3703
|
"unrendered-components"
|
|
3532
3704
|
],
|
|
@@ -3562,7 +3734,7 @@
|
|
|
3562
3734
|
"description": "A Vue, Svelte, or React component prop is referenced nowhere in its own component",
|
|
3563
3735
|
"label": "Unused Component Props",
|
|
3564
3736
|
"config_key": "unused-component-props",
|
|
3565
|
-
"registry_index":
|
|
3737
|
+
"registry_index": 30,
|
|
3566
3738
|
"aliases": [
|
|
3567
3739
|
"unused-component-props"
|
|
3568
3740
|
],
|
|
@@ -3598,7 +3770,7 @@
|
|
|
3598
3770
|
"description": "A Vue <script setup> defineEmits event is emitted nowhere in its own component",
|
|
3599
3771
|
"label": "Unused Component Emits",
|
|
3600
3772
|
"config_key": "unused-component-emits",
|
|
3601
|
-
"registry_index":
|
|
3773
|
+
"registry_index": 31,
|
|
3602
3774
|
"aliases": [
|
|
3603
3775
|
"unused-component-emits"
|
|
3604
3776
|
],
|
|
@@ -3634,7 +3806,7 @@
|
|
|
3634
3806
|
"description": "An Angular @Input() / signal input() / model() input is read nowhere in its own component",
|
|
3635
3807
|
"label": "Unused Component Inputs",
|
|
3636
3808
|
"config_key": "unused-component-inputs",
|
|
3637
|
-
"registry_index":
|
|
3809
|
+
"registry_index": 32,
|
|
3638
3810
|
"aliases": [
|
|
3639
3811
|
"unused-component-inputs"
|
|
3640
3812
|
],
|
|
@@ -3670,7 +3842,7 @@
|
|
|
3670
3842
|
"description": "An Angular @Output() / signal output() output is emitted nowhere in its own component",
|
|
3671
3843
|
"label": "Unused Component Outputs",
|
|
3672
3844
|
"config_key": "unused-component-outputs",
|
|
3673
|
-
"registry_index":
|
|
3845
|
+
"registry_index": 33,
|
|
3674
3846
|
"aliases": [
|
|
3675
3847
|
"unused-component-outputs"
|
|
3676
3848
|
],
|
|
@@ -3706,7 +3878,7 @@
|
|
|
3706
3878
|
"description": "A Svelte component dispatches a createEventDispatcher event whose name is listened to nowhere in the project",
|
|
3707
3879
|
"label": "Unused Svelte Events",
|
|
3708
3880
|
"config_key": "unused-svelte-events",
|
|
3709
|
-
"registry_index":
|
|
3881
|
+
"registry_index": 34,
|
|
3710
3882
|
"aliases": [
|
|
3711
3883
|
"unused-svelte-events"
|
|
3712
3884
|
],
|
|
@@ -3742,7 +3914,7 @@
|
|
|
3742
3914
|
"description": "A Next.js Server Action exported from a \"use server\" file is referenced by no code in the project",
|
|
3743
3915
|
"label": "Unused Server Actions",
|
|
3744
3916
|
"config_key": "unused-server-actions",
|
|
3745
|
-
"registry_index":
|
|
3917
|
+
"registry_index": 35,
|
|
3746
3918
|
"aliases": [
|
|
3747
3919
|
"unused-server-actions"
|
|
3748
3920
|
],
|
|
@@ -3778,7 +3950,7 @@
|
|
|
3778
3950
|
"description": "A SvelteKit load() return-object key is read by no consumer",
|
|
3779
3951
|
"label": "Unused Load Data Keys",
|
|
3780
3952
|
"config_key": "unused-load-data-keys",
|
|
3781
|
-
"registry_index":
|
|
3953
|
+
"registry_index": 36,
|
|
3782
3954
|
"aliases": [
|
|
3783
3955
|
"unused-load-data-keys"
|
|
3784
3956
|
],
|
|
@@ -3814,9 +3986,9 @@
|
|
|
3814
3986
|
"description": "A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer",
|
|
3815
3987
|
"label": "Prop Drilling",
|
|
3816
3988
|
"config_key": "prop-drilling",
|
|
3817
|
-
"registry_index":
|
|
3989
|
+
"registry_index": 51,
|
|
3818
3990
|
"aliases": [],
|
|
3819
|
-
"lsp":
|
|
3991
|
+
"lsp": true,
|
|
3820
3992
|
"filter_flag": null,
|
|
3821
3993
|
"result_key": "prop_drilling_chains",
|
|
3822
3994
|
"summary_label": "Prop drilling",
|
|
@@ -3846,11 +4018,11 @@
|
|
|
3846
4018
|
"description": "A React/Preact component whose whole body is a single spread-forwarded child render (a candidate for inlining)",
|
|
3847
4019
|
"label": "Thin Wrappers",
|
|
3848
4020
|
"config_key": "thin-wrapper",
|
|
3849
|
-
"registry_index":
|
|
4021
|
+
"registry_index": 52,
|
|
3850
4022
|
"aliases": [
|
|
3851
4023
|
"thin-wrappers"
|
|
3852
4024
|
],
|
|
3853
|
-
"lsp":
|
|
4025
|
+
"lsp": true,
|
|
3854
4026
|
"filter_flag": null,
|
|
3855
4027
|
"result_key": "thin_wrappers",
|
|
3856
4028
|
"summary_label": "Thin wrappers",
|
|
@@ -3880,11 +4052,11 @@
|
|
|
3880
4052
|
"description": "Three or more React/Preact components across two or more files declare an identical prop-name set (a missing shared Props type)",
|
|
3881
4053
|
"label": "Duplicate Prop Shapes",
|
|
3882
4054
|
"config_key": "duplicate-prop-shape",
|
|
3883
|
-
"registry_index":
|
|
4055
|
+
"registry_index": 53,
|
|
3884
4056
|
"aliases": [
|
|
3885
4057
|
"duplicate-prop-shapes"
|
|
3886
4058
|
],
|
|
3887
|
-
"lsp":
|
|
4059
|
+
"lsp": true,
|
|
3888
4060
|
"filter_flag": null,
|
|
3889
4061
|
"result_key": "duplicate_prop_shapes",
|
|
3890
4062
|
"summary_label": "Duplicate prop shapes",
|
|
@@ -3914,7 +4086,7 @@
|
|
|
3914
4086
|
"description": "Two or more Next.js App Router route files resolve to the same URL",
|
|
3915
4087
|
"label": "Route Collisions",
|
|
3916
4088
|
"config_key": "route-collision",
|
|
3917
|
-
"registry_index":
|
|
4089
|
+
"registry_index": 37,
|
|
3918
4090
|
"aliases": [
|
|
3919
4091
|
"route-collisions"
|
|
3920
4092
|
],
|
|
@@ -3952,7 +4124,7 @@
|
|
|
3952
4124
|
"description": "Sibling Next.js dynamic route segments use different slug names at the same position",
|
|
3953
4125
|
"label": "Dynamic Segment Conflicts",
|
|
3954
4126
|
"config_key": "dynamic-segment-name-conflict",
|
|
3955
|
-
"registry_index":
|
|
4127
|
+
"registry_index": 38,
|
|
3956
4128
|
"aliases": [
|
|
3957
4129
|
"dynamic-segment-name-conflicts"
|
|
3958
4130
|
],
|
|
@@ -4140,7 +4312,7 @@
|
|
|
4140
4312
|
"description": "CSS or CSS-in-JS hardcoded styling value bypasses the design token system",
|
|
4141
4313
|
"label": "CSS Token Drift",
|
|
4142
4314
|
"config_key": "css-token-drift",
|
|
4143
|
-
"registry_index":
|
|
4315
|
+
"registry_index": 54,
|
|
4144
4316
|
"aliases": [],
|
|
4145
4317
|
"lsp": false,
|
|
4146
4318
|
"filter_flag": null,
|
|
@@ -4170,7 +4342,7 @@
|
|
|
4170
4342
|
"description": "CSS or CSS-in-JS declaration block is duplicated across rules",
|
|
4171
4343
|
"label": "CSS Duplicate Block",
|
|
4172
4344
|
"config_key": "css-duplicate-block",
|
|
4173
|
-
"registry_index":
|
|
4345
|
+
"registry_index": 55,
|
|
4174
4346
|
"aliases": [],
|
|
4175
4347
|
"lsp": false,
|
|
4176
4348
|
"filter_flag": null,
|
|
@@ -4200,7 +4372,7 @@
|
|
|
4200
4372
|
"description": "CSS selector, nesting, or important usage is structurally complex",
|
|
4201
4373
|
"label": "CSS Selector Complexity",
|
|
4202
4374
|
"config_key": "css-selector-complexity",
|
|
4203
|
-
"registry_index":
|
|
4375
|
+
"registry_index": 56,
|
|
4204
4376
|
"aliases": [],
|
|
4205
4377
|
"lsp": false,
|
|
4206
4378
|
"filter_flag": null,
|
|
@@ -4230,7 +4402,7 @@
|
|
|
4230
4402
|
"description": "CSS or CSS-in-JS surface appears unused",
|
|
4231
4403
|
"label": "CSS Dead Surface",
|
|
4232
4404
|
"config_key": "css-dead-surface",
|
|
4233
|
-
"registry_index":
|
|
4405
|
+
"registry_index": 57,
|
|
4234
4406
|
"aliases": [],
|
|
4235
4407
|
"lsp": false,
|
|
4236
4408
|
"filter_flag": null,
|
|
@@ -4260,7 +4432,7 @@
|
|
|
4260
4432
|
"description": "CSS or CSS-in-JS reference resolves to no stylesheet definition",
|
|
4261
4433
|
"label": "CSS Broken Reference",
|
|
4262
4434
|
"config_key": "css-broken-reference",
|
|
4263
|
-
"registry_index":
|
|
4435
|
+
"registry_index": 58,
|
|
4264
4436
|
"aliases": [],
|
|
4265
4437
|
"lsp": false,
|
|
4266
4438
|
"filter_flag": null,
|
|
@@ -4650,7 +4822,7 @@
|
|
|
4650
4822
|
"description": "Detected feature flag pattern",
|
|
4651
4823
|
"label": "Feature Flags",
|
|
4652
4824
|
"config_key": "feature-flags",
|
|
4653
|
-
"registry_index":
|
|
4825
|
+
"registry_index": 49,
|
|
4654
4826
|
"aliases": [],
|
|
4655
4827
|
"lsp": false,
|
|
4656
4828
|
"filter_flag": null,
|
|
@@ -4672,6 +4844,36 @@
|
|
|
4672
4844
|
"license_note": null,
|
|
4673
4845
|
"docs_url": "https://docs.fallow.tools/cli/flags"
|
|
4674
4846
|
},
|
|
4847
|
+
{
|
|
4848
|
+
"id": "flag-retirement-candidate",
|
|
4849
|
+
"rule_id": "fallow/flag-retirement-candidate",
|
|
4850
|
+
"command": "flags",
|
|
4851
|
+
"category": "Flags",
|
|
4852
|
+
"description": "Feature flag is a retirement candidate",
|
|
4853
|
+
"label": null,
|
|
4854
|
+
"config_key": null,
|
|
4855
|
+
"registry_index": null,
|
|
4856
|
+
"aliases": [],
|
|
4857
|
+
"lsp": false,
|
|
4858
|
+
"filter_flag": null,
|
|
4859
|
+
"result_key": null,
|
|
4860
|
+
"summary_label": null,
|
|
4861
|
+
"summary_docs_anchor": null,
|
|
4862
|
+
"sarif_rule_ids": null,
|
|
4863
|
+
"codeclimate_check_names": null,
|
|
4864
|
+
"ts_alias": null,
|
|
4865
|
+
"counts_in_total": false,
|
|
4866
|
+
"fixable": false,
|
|
4867
|
+
"suppressible": false,
|
|
4868
|
+
"suppress_comment": null,
|
|
4869
|
+
"default_severity": null,
|
|
4870
|
+
"opt_in": null,
|
|
4871
|
+
"frameworks": [],
|
|
4872
|
+
"note": null,
|
|
4873
|
+
"license": "free",
|
|
4874
|
+
"license_note": null,
|
|
4875
|
+
"docs_url": "https://docs.fallow.tools/cli/flags#retirement-report"
|
|
4876
|
+
},
|
|
4675
4877
|
{
|
|
4676
4878
|
"id": "tainted-sink",
|
|
4677
4879
|
"rule_id": "security/tainted-sink",
|
|
@@ -6169,6 +6371,7 @@
|
|
|
6169
6371
|
"FALLOW_API_RETRY_DELAY": "Floor delay in seconds between HTTP retry attempts (default 2); a server-supplied Retry-After overrides it on 429 responses.",
|
|
6170
6372
|
"FALLOW_CACHE_DIR": "Directory for fallow's persistent analysis cache. Relative paths resolve from the project root and override cache.dir.",
|
|
6171
6373
|
"FALLOW_CACHE_MAX_SIZE": "Extraction cache size cap in megabytes (default 256). Wins over the cache.maxSizeMb config field.",
|
|
6374
|
+
"FALLOW_PACKAGE_BASELINES": "Set to false, 0, no or off to ignore workspaces.changedSince for every run of the process, like --no-package-baselines.",
|
|
6172
6375
|
"FALLOW_EXTENDS_TIMEOUT_SECS": "Timeout in seconds for fetching https:// configs referenced via the extends field (default 5).",
|
|
6173
6376
|
"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.",
|
|
6174
6377
|
"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.",
|
|
@@ -6180,16 +6383,16 @@
|
|
|
6180
6383
|
"FALLOW_AUDIT_CACHE_MAX_AGE_DAYS": "GC threshold in days for reusable audit base-snapshot caches (default 30; 0 disables the sweep).",
|
|
6181
6384
|
"FALLOW_IMPACT_STORE_MAX_AGE_DAYS": "GC threshold in days for per-project fallow impact stores; a recorded run reclaims stores older than this (unset/0 keeps every store forever).",
|
|
6182
6385
|
"FALLOW_ROOT": "Project root used by the review-github/review-gitlab renderers to read source for suggestion blocks. Set it alongside --root when rendering review formats outside the bundled CI integrations.",
|
|
6183
|
-
"FALLOW_LICENSE": "License JWT (full string) for the paid
|
|
6386
|
+
"FALLOW_LICENSE": "License JWT (full string) for Fallow Cloud, the paid product; intended for shared CI runners.",
|
|
6184
6387
|
"FALLOW_LICENSE_PATH": "File path containing the license JWT.",
|
|
6185
6388
|
"FALLOW_LICENSE_SKEW_TOLERANCE_SECONDS": "Clock-skew tolerance applied to the license JWT's iat claim (default 86400).",
|
|
6186
6389
|
"FALLOW_COV_BIN": "Explicit path override for the fallow-cov runtime-coverage sidecar binary.",
|
|
6187
6390
|
"FALLOW_COV_BINARY_PATH": "Secondary explicit path override for the fallow-cov sidecar, checked after FALLOW_COV_BIN (air-gapped installs, distro-packaged sidecars, shared Docker images).",
|
|
6188
6391
|
"FALLOW_RUNTIME_COVERAGE_SOURCE": "Set to cloud to select cloud runtime coverage in fallow coverage analyze without passing --cloud.",
|
|
6189
6392
|
"FALLOW_REPO": "owner/repo fallback for fallow coverage analyze --cloud when --repo is not passed (otherwise parsed from the git origin remote).",
|
|
6190
|
-
"FALLOW_API_URL": "Base URL override for
|
|
6191
|
-
"FALLOW_API_KEY": "
|
|
6192
|
-
"FALLOW_CA_BUNDLE": "Path to a PEM certificate bundle for
|
|
6393
|
+
"FALLOW_API_URL": "Base URL override for Fallow Cloud API calls (license refresh, trial, coverage uploads).",
|
|
6394
|
+
"FALLOW_API_KEY": "Fallow Cloud bearer token for coverage upload commands, and the fallback bearer for fallow license refresh when the stored license JWT is missing or too stale.",
|
|
6395
|
+
"FALLOW_CA_BUNDLE": "Path to a PEM certificate bundle for Fallow Cloud and provider HTTP calls (replaces the default WebPKI roots).",
|
|
6193
6396
|
"FALLOW_UPDATE_CHECK": "Set to off/0/false to disable the human-TTY upgrade nudge and its background version check.",
|
|
6194
6397
|
"FALLOW_SUGGESTIONS": "Set to off/0/false/no/disabled to suppress the next_steps[] array of read-only follow-up commands in JSON output (and the human Next: line). Useful for CI consumers that snapshot-diff raw --format json output. Default on.",
|
|
6195
6398
|
"FALLOW_TELEMETRY": "Opt-in telemetry mode: off, on, or inspect (print the payload to stderr without sending). Telemetry is off by default.",
|
|
@@ -6201,8 +6404,10 @@
|
|
|
6201
6404
|
"FALLOW_TIMEOUT_SECS": "MCP server: per-tool-call CLI subprocess timeout in seconds (default 120). Raise for long runs like production coverage on large dumps.",
|
|
6202
6405
|
"FALLOW_DIFF_FILE": "MCP server: path to a unified diff that scopes all findings by changed line.",
|
|
6203
6406
|
"FALLOW_CHANGED_SINCE": "MCP server: git ref that scopes file discovery for analysis tools.",
|
|
6407
|
+
"FALLOW_MCP_WARM_SESSION": "MCP server: set to 0, false, off or no to stop typed tool calls from keeping parsed modules in memory between calls (default on).",
|
|
6204
6408
|
"FALLOW_INTEGRATION_SURFACE": "Telemetry integration_surface override for non-CLI surfaces (mcp/lsp/vscode/napi/programmatic). Set by the MCP server on the CLI it spawns.",
|
|
6205
|
-
"FALLOW_MCP_TOOL": "Telemetry mcp_tool dimension, validated against the MCP tool-name allowlist. Set by the MCP server alongside FALLOW_INTEGRATION_SURFACE=mcp."
|
|
6409
|
+
"FALLOW_MCP_TOOL": "Telemetry mcp_tool dimension, validated against the MCP tool-name allowlist. Set by the MCP server alongside FALLOW_INTEGRATION_SURFACE=mcp.",
|
|
6410
|
+
"FALLOW_LSP_REUSE_SESSION": "Language server: set to 0/false/off/no to load a new project session on each analysis run. By default the server keeps one session per project root between saves and parses only the changed files."
|
|
6206
6411
|
},
|
|
6207
6412
|
"severity_levels": [
|
|
6208
6413
|
"error",
|
|
@@ -6697,7 +6902,7 @@
|
|
|
6697
6902
|
{
|
|
6698
6903
|
"name": "analyze",
|
|
6699
6904
|
"kind": "analysis",
|
|
6700
|
-
"description": "Full dead-code analysis: unused files, exports, types, dependencies, circular dependencies, and boundary violations",
|
|
6905
|
+
"description": "Full dead-code analysis: unused files, exports, types, dependencies, circular dependencies, and boundary violations, each with a stable finding_id",
|
|
6701
6906
|
"cli_command": "fallow dead-code --format json --quiet",
|
|
6702
6907
|
"key_params": [
|
|
6703
6908
|
"issue_types",
|
|
@@ -6715,7 +6920,7 @@
|
|
|
6715
6920
|
{
|
|
6716
6921
|
"name": "check_changed",
|
|
6717
6922
|
"kind": "analysis",
|
|
6718
|
-
"description": "Incremental dead-code analysis scoped to files changed since a git ref (ideal for PR review)",
|
|
6923
|
+
"description": "Incremental dead-code analysis scoped to files changed since a git ref (ideal for PR review); findings keep their finding_id",
|
|
6719
6924
|
"cli_command": "fallow dead-code --changed-since <ref> --format json --quiet",
|
|
6720
6925
|
"key_params": [
|
|
6721
6926
|
"since",
|
|
@@ -6918,7 +7123,7 @@
|
|
|
6918
7123
|
{
|
|
6919
7124
|
"name": "get_cloud_runtime_context",
|
|
6920
7125
|
"kind": "runtime-coverage",
|
|
6921
|
-
"description": "Runtime coverage pulled from
|
|
7126
|
+
"description": "Runtime coverage pulled from Fallow Cloud for a repository, merged into the same runtime_coverage block the local runtime-coverage tools return",
|
|
6922
7127
|
"cli_command": "fallow coverage analyze --cloud --repo <owner/repo> --format json --quiet",
|
|
6923
7128
|
"key_params": [
|
|
6924
7129
|
"repo",
|
|
@@ -6928,7 +7133,40 @@
|
|
|
6928
7133
|
"top"
|
|
6929
7134
|
],
|
|
6930
7135
|
"license": "freemium",
|
|
6931
|
-
"license_note": "Reading runtime coverage from
|
|
7136
|
+
"license_note": "Reading runtime coverage from Fallow Cloud needs a FALLOW_API_KEY for an org on the Team tier; the cloud refuses the request otherwise. No local license is involved.",
|
|
7137
|
+
"read_only": true,
|
|
7138
|
+
"code_mode_alias": null
|
|
7139
|
+
},
|
|
7140
|
+
{
|
|
7141
|
+
"name": "get_cloud_review_packet",
|
|
7142
|
+
"kind": "runtime-coverage",
|
|
7143
|
+
"description": "Production facts of a few changed files or functions, read from fallow cloud without the full runtime-context pull",
|
|
7144
|
+
"cli_command": "fallow coverage review-packet --repo <owner/repo> --file <path> --format json --quiet",
|
|
7145
|
+
"key_params": [
|
|
7146
|
+
"repo",
|
|
7147
|
+
"files",
|
|
7148
|
+
"functions",
|
|
7149
|
+
"period_days",
|
|
7150
|
+
"project_id"
|
|
7151
|
+
],
|
|
7152
|
+
"license": "freemium",
|
|
7153
|
+
"license_note": "Reading runtime coverage from Fallow Cloud needs a FALLOW_API_KEY for an org on the Team tier; the cloud refuses the request otherwise. No local license is involved.",
|
|
7154
|
+
"read_only": true,
|
|
7155
|
+
"code_mode_alias": null
|
|
7156
|
+
},
|
|
7157
|
+
{
|
|
7158
|
+
"name": "get_cloud_deployment_changes",
|
|
7159
|
+
"kind": "runtime-coverage",
|
|
7160
|
+
"description": "How production behavior changed between two deployments, read from the fallow cloud change report",
|
|
7161
|
+
"cli_command": "fallow coverage deployment-changes --repo <owner/repo> --sha <sha> --format json --quiet",
|
|
7162
|
+
"key_params": [
|
|
7163
|
+
"repo",
|
|
7164
|
+
"sha",
|
|
7165
|
+
"base",
|
|
7166
|
+
"change"
|
|
7167
|
+
],
|
|
7168
|
+
"license": "freemium",
|
|
7169
|
+
"license_note": "Reading runtime coverage from Fallow Cloud needs a FALLOW_API_KEY for an org on the Team tier; the cloud refuses the request otherwise. No local license is involved.",
|
|
6932
7170
|
"read_only": true,
|
|
6933
7171
|
"code_mode_alias": null
|
|
6934
7172
|
},
|
|
@@ -7331,7 +7569,7 @@
|
|
|
7331
7569
|
]
|
|
7332
7570
|
},
|
|
7333
7571
|
"plugins": {
|
|
7334
|
-
"count":
|
|
7572
|
+
"count": 128,
|
|
7335
7573
|
"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",
|
|
7336
7574
|
"names": [
|
|
7337
7575
|
"nextjs",
|
|
@@ -7345,6 +7583,7 @@
|
|
|
7345
7583
|
"react-router",
|
|
7346
7584
|
"redwoodsdk",
|
|
7347
7585
|
"tanstack-router",
|
|
7586
|
+
"waku",
|
|
7348
7587
|
"react-native",
|
|
7349
7588
|
"expo",
|
|
7350
7589
|
"expo-router",
|