fallow 3.37.0 → 3.38.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/capabilities.json +92 -4
- package/issue-registry.json +30 -0
- package/package.json +10 -10
- package/schema.json +33 -1
- package/skills/fallow/SKILL.md +1 -1
- package/skills/fallow/references/cli-reference.md +79 -12
- package/skills/fallow/references/issue-types.md +1 -0
- package/skills/fallow/references/mcp.md +3 -3
- package/skills/fallow/references/patterns.md +1 -1
- package/types/output-contract.d.ts +409 -20
package/capabilities.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.38.1",
|
|
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": [
|
|
@@ -67,6 +67,26 @@
|
|
|
67
67
|
"false"
|
|
68
68
|
]
|
|
69
69
|
},
|
|
70
|
+
{
|
|
71
|
+
"name": "--lean",
|
|
72
|
+
"type": "bool",
|
|
73
|
+
"required": false,
|
|
74
|
+
"description": "Trim JSON for agent context: leave out empty arrays and zero dead-code summary counts, group workspace diagnostics, cap health tables, and move repeated action text to `_meta.actions`. Requires JSON output. Applies to dead-code, health and the combined report; other commands reject it. Run without `--lean` for the full diagnostic list and the complete tables",
|
|
75
|
+
"possible_values": [
|
|
76
|
+
"true",
|
|
77
|
+
"false"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "--full-tables",
|
|
82
|
+
"type": "bool",
|
|
83
|
+
"required": false,
|
|
84
|
+
"description": "With `--lean`, keep every row of the health tables (`hotspots`, `file_scores`, `large_functions`)",
|
|
85
|
+
"possible_values": [
|
|
86
|
+
"true",
|
|
87
|
+
"false"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
70
90
|
{
|
|
71
91
|
"name": "--quiet",
|
|
72
92
|
"type": "bool",
|
|
@@ -1299,6 +1319,16 @@
|
|
|
1299
1319
|
"false"
|
|
1300
1320
|
]
|
|
1301
1321
|
},
|
|
1322
|
+
{
|
|
1323
|
+
"name": "--kill-matrix",
|
|
1324
|
+
"type": "bool",
|
|
1325
|
+
"required": false,
|
|
1326
|
+
"description": "Collect all killing tests and report redundant-test candidates for individual review. Run every covering test without stopping at a failure",
|
|
1327
|
+
"possible_values": [
|
|
1328
|
+
"true",
|
|
1329
|
+
"false"
|
|
1330
|
+
]
|
|
1331
|
+
},
|
|
1302
1332
|
{
|
|
1303
1333
|
"name": "paths",
|
|
1304
1334
|
"type": "string",
|
|
@@ -1342,9 +1372,30 @@
|
|
|
1342
1372
|
"true",
|
|
1343
1373
|
"false"
|
|
1344
1374
|
]
|
|
1375
|
+
},
|
|
1376
|
+
{
|
|
1377
|
+
"name": "--cloud",
|
|
1378
|
+
"type": "bool",
|
|
1379
|
+
"required": false,
|
|
1380
|
+
"description": "OPT-IN: attach Fallow Cloud production evidence for a `--file` target as the `cloud` evidence section: calls, errors, CPU and never-run branches per function. The API key is $FALLOW_API_KEY, else the key that `fallow cloud login` stored. A missing key, a plan gate or an unreachable cloud is a section status, never a failed run",
|
|
1381
|
+
"possible_values": [
|
|
1382
|
+
"true",
|
|
1383
|
+
"false"
|
|
1384
|
+
]
|
|
1385
|
+
},
|
|
1386
|
+
{
|
|
1387
|
+
"name": "--repo",
|
|
1388
|
+
"type": "string",
|
|
1389
|
+
"required": false,
|
|
1390
|
+
"description": "Fallow Cloud repository for `--cloud`. Precedence: this flag > $FALLOW_REPO > the `origin` git remote"
|
|
1345
1391
|
}
|
|
1346
1392
|
]
|
|
1347
1393
|
},
|
|
1394
|
+
{
|
|
1395
|
+
"name": "cloud",
|
|
1396
|
+
"description": "Connect this machine to Fallow Cloud",
|
|
1397
|
+
"flags": []
|
|
1398
|
+
},
|
|
1348
1399
|
{
|
|
1349
1400
|
"name": "trace",
|
|
1350
1401
|
"description": "Trace a symbol's call chain, or the shortest import path between two modules (best-effort, syntactic; OFF the ranked path)",
|
|
@@ -1851,6 +1902,12 @@
|
|
|
1851
1902
|
"required": false,
|
|
1852
1903
|
"description": "Maximum CRAP score threshold (overrides config, default 30.0). Functions meeting or exceeding this score are reported alongside complexity findings. Pair with `--coverage` for accurate scoring"
|
|
1853
1904
|
},
|
|
1905
|
+
{
|
|
1906
|
+
"name": "--max-file-lines",
|
|
1907
|
+
"type": "string",
|
|
1908
|
+
"required": false,
|
|
1909
|
+
"description": "Maximum physical lines per file (overrides config `health.maxFileLines`, default 0 = off). A longer file is reported as a complexity finding with `exceeded: \"file_lines\"`"
|
|
1910
|
+
},
|
|
1854
1911
|
{
|
|
1855
1912
|
"name": "--top",
|
|
1856
1913
|
"type": "string",
|
|
@@ -4794,6 +4851,36 @@
|
|
|
4794
4851
|
"license_note": null,
|
|
4795
4852
|
"docs_url": "https://fallow.tools/docs/explanations/health/#crap-score"
|
|
4796
4853
|
},
|
|
4854
|
+
{
|
|
4855
|
+
"id": "long-file",
|
|
4856
|
+
"rule_id": "fallow/long-file",
|
|
4857
|
+
"command": "health",
|
|
4858
|
+
"category": "Health",
|
|
4859
|
+
"description": "File has more lines than the file-length threshold",
|
|
4860
|
+
"label": null,
|
|
4861
|
+
"config_key": null,
|
|
4862
|
+
"registry_index": null,
|
|
4863
|
+
"aliases": [],
|
|
4864
|
+
"lsp": false,
|
|
4865
|
+
"filter_flag": "--complexity",
|
|
4866
|
+
"result_key": null,
|
|
4867
|
+
"summary_label": null,
|
|
4868
|
+
"summary_docs_anchor": null,
|
|
4869
|
+
"sarif_rule_ids": null,
|
|
4870
|
+
"codeclimate_check_names": null,
|
|
4871
|
+
"ts_alias": null,
|
|
4872
|
+
"counts_in_total": false,
|
|
4873
|
+
"fixable": false,
|
|
4874
|
+
"suppressible": true,
|
|
4875
|
+
"suppress_comment": "// fallow-ignore-file complexity",
|
|
4876
|
+
"default_severity": null,
|
|
4877
|
+
"opt_in": null,
|
|
4878
|
+
"frameworks": [],
|
|
4879
|
+
"note": null,
|
|
4880
|
+
"license": "free",
|
|
4881
|
+
"license_note": null,
|
|
4882
|
+
"docs_url": "https://fallow.tools/docs/explanations/health/#file-length"
|
|
4883
|
+
},
|
|
4797
4884
|
{
|
|
4798
4885
|
"id": "refactoring-target",
|
|
4799
4886
|
"rule_id": "fallow/refactoring-target",
|
|
@@ -7048,7 +7135,7 @@
|
|
|
7048
7135
|
"FALLOW_MAX_FILE_SIZE": "Per-file size ceiling in megabytes for source discovery (default 5; 0 = no limit). CLI --max-file-size flag overrides this.",
|
|
7049
7136
|
"FALLOW_TYPE_AWARE": "Enable or disable TypeScript semantic (type-aware) analysis for the run (true/false/1/0/yes/no/on/off). Precedence: --type-aware/--no-type-aware CLI flags, then FALLOW_TYPE_AWARE, then the audit.typeAware config field, then typeAware.enabled.",
|
|
7050
7137
|
"FALLOW_TYPE_AWARE_TIMEOUT_SECS": "Wall clock in seconds allowed for one TypeScript semantic sidecar request (default 120; unset, 0, or a non-numeric value keeps the default). Raise it for very large TypeScript programs, where a semantic query scans the whole program.",
|
|
7051
|
-
"FALLOW_TYPE_AWARE_BACKEND": "Experimental. Type-checker backend for the TypeScript semantic sidecar: typescript-go (default) or tsrs. The tsrs backend needs
|
|
7138
|
+
"FALLOW_TYPE_AWARE_BACKEND": "Experimental. Type-checker backend for the TypeScript semantic sidecar: typescript-go (default) or tsrs. The tsrs backend needs a tsrs npm package in the supported range of the type-aware protocol manifest, where fallow-type-aware can resolve it. An unknown value makes the type-aware pass unavailable.",
|
|
7052
7139
|
"FALLOW_TYPE_AWARE_BIN": "Trusted executable override for the TypeScript semantic refinement sidecar used by dead-code --type-aware. Relative paths resolve from the caller's working directory before --root is applied; project node_modules and PATH are intentionally not searched. Default: sibling of the active Fallow executable.",
|
|
7053
7140
|
"FALLOW_AUDIT_BASE": "Pins the fallow audit comparison base ref when no --base/--changed-since is passed (e.g. upstream/main).",
|
|
7054
7141
|
"FALLOW_AUDIT_CACHE_MAX_AGE_DAYS": "GC threshold in days for reusable audit base-snapshot caches (default 30; 0 disables the sweep).",
|
|
@@ -7060,9 +7147,10 @@
|
|
|
7060
7147
|
"FALLOW_COV_BIN": "Explicit path override for the fallow-cov runtime-coverage sidecar binary.",
|
|
7061
7148
|
"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).",
|
|
7062
7149
|
"FALLOW_RUNTIME_COVERAGE_SOURCE": "Set to cloud to select cloud runtime coverage in fallow coverage analyze without passing --cloud.",
|
|
7063
|
-
"FALLOW_REPO": "owner/repo fallback for fallow coverage analyze --cloud when --repo is not passed (otherwise parsed from the git origin remote).",
|
|
7150
|
+
"FALLOW_REPO": "owner/repo fallback for fallow coverage analyze --cloud and fallow inspect --cloud when --repo is not passed (otherwise parsed from the git origin remote).",
|
|
7064
7151
|
"FALLOW_API_URL": "Base URL override for Fallow Cloud API calls (license refresh, trial, coverage uploads).",
|
|
7065
|
-
"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.",
|
|
7152
|
+
"FALLOW_API_KEY": "Fallow Cloud bearer token for coverage upload and cloud read commands (wins over the key that fallow cloud login stored), and the fallback bearer for fallow license refresh when the stored license JWT is missing or too stale.",
|
|
7153
|
+
"FALLOW_CREDENTIAL_STORE": "Credential store for the key that fallow cloud login writes: auto (default: OS keychain, else ~/.config/fallow/credentials), file (credentials file only) or none (no stored key is read or written).",
|
|
7066
7154
|
"FALLOW_CA_BUNDLE": "Path to a PEM certificate bundle for Fallow Cloud and provider HTTP calls (replaces the default WebPKI roots).",
|
|
7067
7155
|
"FALLOW_UPDATE_CHECK": "Set to off/0/false to disable the human-TTY upgrade nudge and its background version check.",
|
|
7068
7156
|
"FALLOW_CLAUDE_CODE_HINT": "Set to off/0/false/no/disabled to suppress the one-line Claude Code plugin hint on stderr. Fallow writes the hint only inside a Claude Code session (CLAUDECODE or CLAUDE_CODE_CHILD_SESSION), for human output without --quiet, outside CI, and when no Fallow plugin or skill is set up for the project. Default on.",
|
package/issue-registry.json
CHANGED
|
@@ -3161,6 +3161,36 @@
|
|
|
3161
3161
|
"license_note": null,
|
|
3162
3162
|
"docs_url": "https://fallow.tools/docs/cli/security/"
|
|
3163
3163
|
},
|
|
3164
|
+
{
|
|
3165
|
+
"id": "long-file",
|
|
3166
|
+
"rule_id": "fallow/long-file",
|
|
3167
|
+
"command": "health",
|
|
3168
|
+
"category": "Health",
|
|
3169
|
+
"description": "File has more lines than the file-length threshold",
|
|
3170
|
+
"label": null,
|
|
3171
|
+
"config_key": null,
|
|
3172
|
+
"registry_index": null,
|
|
3173
|
+
"aliases": [],
|
|
3174
|
+
"lsp": false,
|
|
3175
|
+
"filter_flag": "--complexity",
|
|
3176
|
+
"result_key": null,
|
|
3177
|
+
"summary_label": null,
|
|
3178
|
+
"summary_docs_anchor": null,
|
|
3179
|
+
"sarif_rule_ids": null,
|
|
3180
|
+
"codeclimate_check_names": null,
|
|
3181
|
+
"ts_alias": null,
|
|
3182
|
+
"counts_in_total": false,
|
|
3183
|
+
"fixable": false,
|
|
3184
|
+
"suppressible": true,
|
|
3185
|
+
"suppress_comment": "// fallow-ignore-file complexity",
|
|
3186
|
+
"default_severity": null,
|
|
3187
|
+
"opt_in": null,
|
|
3188
|
+
"frameworks": [],
|
|
3189
|
+
"note": null,
|
|
3190
|
+
"license": "free",
|
|
3191
|
+
"license_note": null,
|
|
3192
|
+
"docs_url": "https://fallow.tools/docs/explanations/health/#file-length"
|
|
3193
|
+
},
|
|
3164
3194
|
{
|
|
3165
3195
|
"id": "mass-assignment",
|
|
3166
3196
|
"rule_id": "security/mass-assignment",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.38.1",
|
|
4
4
|
"mcpName": "io.github.fallow-rs/fallow",
|
|
5
5
|
"description": "Codebase intelligence for TypeScript and JavaScript: health, complexity, duplication, architecture, styling drift, and unused code from one graph. CLI, LSP, and MCP server. Zero config for over 100 frameworks.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -92,14 +92,14 @@
|
|
|
92
92
|
"@tanstack/intent": "0.5.6"
|
|
93
93
|
},
|
|
94
94
|
"optionalDependencies": {
|
|
95
|
-
"@fallow-cli/darwin-arm64": "3.
|
|
96
|
-
"@fallow-cli/darwin-x64": "3.
|
|
97
|
-
"@fallow-cli/linux-x64-gnu": "3.
|
|
98
|
-
"@fallow-cli/linux-arm64-gnu": "3.
|
|
99
|
-
"@fallow-cli/linux-x64-musl": "3.
|
|
100
|
-
"@fallow-cli/linux-arm64-musl": "3.
|
|
101
|
-
"@fallow-cli/win32-arm64-msvc": "3.
|
|
102
|
-
"@fallow-cli/win32-x64-msvc": "3.
|
|
103
|
-
"fallow-type-aware": "3.
|
|
95
|
+
"@fallow-cli/darwin-arm64": "3.38.1",
|
|
96
|
+
"@fallow-cli/darwin-x64": "3.38.1",
|
|
97
|
+
"@fallow-cli/linux-x64-gnu": "3.38.1",
|
|
98
|
+
"@fallow-cli/linux-arm64-gnu": "3.38.1",
|
|
99
|
+
"@fallow-cli/linux-x64-musl": "3.38.1",
|
|
100
|
+
"@fallow-cli/linux-arm64-musl": "3.38.1",
|
|
101
|
+
"@fallow-cli/win32-arm64-msvc": "3.38.1",
|
|
102
|
+
"@fallow-cli/win32-x64-msvc": "3.38.1",
|
|
103
|
+
"fallow-type-aware": "3.38.1"
|
|
104
104
|
}
|
|
105
105
|
}
|
package/schema.json
CHANGED
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
"$ref": "#/$defs/MutationConfig"
|
|
180
180
|
},
|
|
181
181
|
"health": {
|
|
182
|
-
"description": "Sets complexity and health thresholds for `fallow health` (also applied in combined `fallow` and `fallow audit`): `maxCyclomatic` (20), `maxCognitive` (15), `maxCrap` (30.0, findings at or above this are reported), `crapRefactorBand` (5, cyclomatic band below `maxCyclomatic` where a secondary refactor action is added), `maxUnitSize` (max function lines before a large-function finding, 60), `coverage`/`coverageRoot` (Istanbul coverage path and path-prefix strip for accurate CRAP), `ignore` globs (remove files from findings AND the health score), `thresholdOverrides` (per-file/per-function ceilings via `files`/`functions`/`maxCyclomatic`/`maxCognitive`/`maxCrap`/`maxUnitSize`/`reason`), `ownership` (`botPatterns` and `emailMode` for `--ownership`), and `suggestInlineSuppression` (true, emit `suppress-line` action hints in JSON). Raise thresholds to relax which functions are flagged, wire `coverage` for real CRAP scores, or exempt generated/test files via `ignore` (drops them from the score too) or `thresholdOverrides` (keeps them visible under a higher ceiling). The
|
|
182
|
+
"description": "Sets complexity and health thresholds for `fallow health` (also applied in combined `fallow` and `fallow audit`): `maxCyclomatic` (20), `maxCognitive` (15), `maxCrap` (30.0, findings at or above this are reported), `crapRefactorBand` (5, cyclomatic band below `maxCyclomatic` where a secondary refactor action is added), `maxUnitSize` (max function lines before a large-function finding, 60), `maxFileLines` (max physical lines per file before a file-level finding, 0 means off), `coverage`/`coverageRoot` (Istanbul coverage path and path-prefix strip for accurate CRAP), `ignore` globs (remove files from findings AND the health score), `thresholdOverrides` (per-file/per-function ceilings via `files`/`functions`/`maxCyclomatic`/`maxCognitive`/`maxCrap`/`maxUnitSize`/`maxFileLines`/`reason`), `ownership` (`botPatterns` and `emailMode` for `--ownership`), and `suggestInlineSuppression` (true, emit `suppress-line` action hints in JSON). Raise thresholds to relax which functions are flagged, wire `coverage` for real CRAP scores, or exempt generated/test files via `ignore` (drops them from the score too) or `thresholdOverrides` (keeps them visible under a higher ceiling). The `max*` thresholds govern findings only and never move `health_score`: its penalties use fixed calibration so grades stay comparable across projects, and `ignore` is the lever that removes files from the score.",
|
|
183
183
|
"$ref": "#/$defs/HealthConfig",
|
|
184
184
|
"default": {
|
|
185
185
|
"maxCyclomatic": 20,
|
|
@@ -253,6 +253,7 @@
|
|
|
253
253
|
"complexity-cyclomatic": "error",
|
|
254
254
|
"complexity-cognitive": "error",
|
|
255
255
|
"complexity-crap": "error",
|
|
256
|
+
"complexity-file-lines": "error",
|
|
256
257
|
"unresolved-imports": "error",
|
|
257
258
|
"unlisted-dependencies": "error",
|
|
258
259
|
"duplicate-exports": "error",
|
|
@@ -1309,6 +1310,12 @@
|
|
|
1309
1310
|
"minimum": 0,
|
|
1310
1311
|
"default": 60
|
|
1311
1312
|
},
|
|
1313
|
+
"maxFileLines": {
|
|
1314
|
+
"description": "Maximum file length in physical lines before the file is reported as a\ncomplexity finding with `exceeded: \"file_lines\"` (default: `0`, off).\nEvery line counts, also blank lines and comment lines. A final newline\ndoes not add a line. Set a limit such as `500` to enable the check, and\nraise it per file via `thresholdOverrides[].maxFileLines`. The\n`complexity-file-lines` rule decides if a finding fails the run. In\n`fallow audit`, a long file that did not grow stays inherited. Older\nfallow versions reject this key as unknown, so pair it with\n`minimumVersion`.",
|
|
1315
|
+
"type": "integer",
|
|
1316
|
+
"format": "uint32",
|
|
1317
|
+
"minimum": 0
|
|
1318
|
+
},
|
|
1312
1319
|
"coverage": {
|
|
1313
1320
|
"description": "Path to Istanbul coverage data (coverage-final.json) or raw V8 coverage\n(a `NODE_V8_COVERAGE` directory or one V8 JSON file) for accurate\nper-function CRAP scores. Relative paths resolve against the project root. The CLI\n`--coverage` flag and `FALLOW_COVERAGE` environment variable override\nthis value. Consulted by `fallow health`, bare `fallow`, `fallow audit`,\n`fallow viz`, and the MCP `audit` / `check_health` tools.",
|
|
1314
1321
|
"type": [
|
|
@@ -1443,6 +1450,15 @@
|
|
|
1443
1450
|
"format": "uint32",
|
|
1444
1451
|
"minimum": 0
|
|
1445
1452
|
},
|
|
1453
|
+
"maxFileLines": {
|
|
1454
|
+
"description": "Local file-length ceiling in physical lines. `0` turns the file-length\ncheck off for the matching files. The ceiling applies to whole files,\nso an entry that sets it must leave `functions` empty.",
|
|
1455
|
+
"type": [
|
|
1456
|
+
"integer",
|
|
1457
|
+
"null"
|
|
1458
|
+
],
|
|
1459
|
+
"format": "uint32",
|
|
1460
|
+
"minimum": 0
|
|
1461
|
+
},
|
|
1446
1462
|
"reason": {
|
|
1447
1463
|
"description": "Human-readable rationale for the exception.",
|
|
1448
1464
|
"type": [
|
|
@@ -1761,6 +1777,11 @@
|
|
|
1761
1777
|
"$ref": "#/$defs/Severity",
|
|
1762
1778
|
"default": "error"
|
|
1763
1779
|
},
|
|
1780
|
+
"complexity-file-lines": {
|
|
1781
|
+
"description": "A file above the file-length ceiling (`health.maxFileLines` or a\n`thresholdOverrides` entry). The threshold decides if the finding\nexists, and it is off by default; this rule decides if it fails the\nrun. Defaults to `error`.",
|
|
1782
|
+
"$ref": "#/$defs/Severity",
|
|
1783
|
+
"default": "error"
|
|
1784
|
+
},
|
|
1764
1785
|
"unresolved-imports": {
|
|
1765
1786
|
"description": "An import specifier that resolves to no file or package. Defaults to\n`error`.",
|
|
1766
1787
|
"$ref": "#/$defs/Severity",
|
|
@@ -2774,6 +2795,17 @@
|
|
|
2774
2795
|
}
|
|
2775
2796
|
]
|
|
2776
2797
|
},
|
|
2798
|
+
"complexity-file-lines": {
|
|
2799
|
+
"description": "Optional override for [`RulesConfig::complexity_file_lines`].",
|
|
2800
|
+
"anyOf": [
|
|
2801
|
+
{
|
|
2802
|
+
"$ref": "#/$defs/Severity"
|
|
2803
|
+
},
|
|
2804
|
+
{
|
|
2805
|
+
"type": "null"
|
|
2806
|
+
}
|
|
2807
|
+
]
|
|
2808
|
+
},
|
|
2777
2809
|
"unresolved-imports": {
|
|
2778
2810
|
"description": "Optional override for [`RulesConfig::unresolved_imports`].",
|
|
2779
2811
|
"anyOf": [
|
package/skills/fallow/SKILL.md
CHANGED
|
@@ -67,7 +67,7 @@ Offer setup after showing the findings from a human-requested analysis, only whe
|
|
|
67
67
|
|
|
68
68
|
Offer these choices: guard commits and PRs, baseline the existing backlog and clean by category, add AGENTS.md guidance, or keep as-is. Mutate only after consent. On decline, run `fallow init --decline --quiet` and stay silent for this project.
|
|
69
69
|
|
|
70
|
-
For
|
|
70
|
+
For complete agent onboarding, use the `fallow-setup` skill: preview `fallow agent install --dry-run`, apply the approved setup, then run `fallow agent status --format json --quiet`. Report runtime blockers and pending harness trust before calling the setup ready. For an explicit guard-only request, inspect `fallow hooks status --format json --quiet` and install the requested agent or Git hook. For large backlogs, pair the gate with `--save-baseline` and new-only guidance.
|
|
71
71
|
|
|
72
72
|
Offer `fallow impact enable` for local value tracking. Impact is separate from telemetry. Also offer it once on an already-configured project when `fallow impact status --format json` has `enabled: false` and `explicit_decision: false`. Record a decline with `fallow impact disable --quiet`.
|
|
73
73
|
|
|
@@ -54,7 +54,8 @@ Every fallow command with its purpose and key flags. The table is regenerated fr
|
|
|
54
54
|
| `doctor` | Diagnose project readiness without analysis or mutation | |
|
|
55
55
|
| `similar-code` | Find semantically similar functions with a pinned local model (opt-in) | `--threshold`, `--min-lines`, `--top`, `--file` |
|
|
56
56
|
| `mutation` | Measure how well the tests detect changes in the code (opt-in) | `--all`, `--plan`, `--max-mutants`, `--time-budget`, `--concurrency`, `--runtime`, `--runner-config`, `--allow-dirty`, `--allow-side-effects` |
|
|
57
|
-
| `inspect` | Compose one evidence bundle for a file or exported symbol | `--file <path>`, `--symbol <file>:<export>` |
|
|
57
|
+
| `inspect` | Compose one evidence bundle for a file or exported symbol, with optional Fallow Cloud production data | `--file <path>`, `--symbol <file>:<export>`, `--cloud`, `--repo <owner/repo>` |
|
|
58
|
+
| `cloud` | Log in to Fallow Cloud with the device flow and store a read-only API key (login, logout) | `login --machine-name <name>`, `login --api-url <url>`, `logout` |
|
|
58
59
|
| `trace` | Trace a symbol's call chain, or with `--path` the shortest import path between two modules (best-effort, syntactic; OFF the ranked path) | `symbol`, `--path <FROM> <TO>`, `--eager-only`, `--callers`, `--callees`, `--depth` |
|
|
59
60
|
| `trace-error` | Resolve a runtime stack trace's frames to the definitions they name (best-effort, syntactic; OFF the ranked path) | `trace_file` |
|
|
60
61
|
| `fix` | Auto-remove unused exports/deps | `--dry-run`, `--yes` (required in non-TTY) |
|
|
@@ -74,7 +75,7 @@ Every fallow command with its purpose and key flags. The table is regenerated fr
|
|
|
74
75
|
| `list` | Inspect project structure | `--files`, `--entry-points`, `--plugins`, `--boundaries`, `--workspaces`, `--entry-weight` |
|
|
75
76
|
| `workspaces` | Inspect monorepo workspaces + discovery diagnostics (shorthand for `list --workspaces`) | (no flags) |
|
|
76
77
|
| `dupes` | Code duplication detection | `--mode`, `--near`, `--threshold`, `--top`, `--changed-since`, `--workspace`, `--changed-workspaces`, `--skip-local`, `--cross-language`, `--ignore-imports`, `--explain-skipped`, `--fail-on-regression`, `--tolerance`, `--regression-baseline`, `--save-regression-baseline` |
|
|
77
|
-
| `health` | Function complexity analysis (also covers component templates as synthetic `<template>` findings: Angular external `.html` files via `templateUrl` AND inline `@Component({ template: \`...\` })` literals, plus Vue, Svelte and Astro single-file components; suppress an Angular external template with `<!-- fallow-ignore-file complexity -->` at the top of the `.html` file, an Angular inline template with `// fallow-ignore-next-line complexity` directly above the `@Component` decorator, and a `.svelte` / `.vue` / `.astro` template with `<!-- fallow-ignore-next-line complexity -->` on the line immediately above the reported line) | `--complexity`, `--max-cyclomatic`, `--max-cognitive`, `--max-crap`, `--top`, `--sort`, `--file-scores`, `--hotspots`, `--ownership`, `--ownership-emails`, `--targets`, `--effort`, `--score`, `--min-score`, `--since`, `--min-commits`, `--save-snapshot`, `--trend`, `--coverage-gaps`, `--coverage`, `--coverage-root`, `--runtime-coverage`, `--min-invocations-hot`, `--min-observation-volume`, `--low-traffic-threshold`, `--css`, `--complexity-breakdown`, `--min-severity`, `--report-only`, `--workspace`, `--changed-workspaces`, `--baseline`, `--save-baseline` |
|
|
78
|
+
| `health` | Function complexity analysis (also covers component templates as synthetic `<template>` findings: Angular external `.html` files via `templateUrl` AND inline `@Component({ template: \`...\` })` literals, plus Vue, Svelte and Astro single-file components; suppress an Angular external template with `<!-- fallow-ignore-file complexity -->` at the top of the `.html` file, an Angular inline template with `// fallow-ignore-next-line complexity` directly above the `@Component` decorator, and a `.svelte` / `.vue` / `.astro` template with `<!-- fallow-ignore-next-line complexity -->` on the line immediately above the reported line) | `--complexity`, `--max-cyclomatic`, `--max-cognitive`, `--max-crap`, `--max-file-lines`, `--top`, `--sort`, `--file-scores`, `--hotspots`, `--ownership`, `--ownership-emails`, `--targets`, `--effort`, `--score`, `--min-score`, `--since`, `--min-commits`, `--save-snapshot`, `--trend`, `--coverage-gaps`, `--coverage`, `--coverage-root`, `--runtime-coverage`, `--min-invocations-hot`, `--min-observation-volume`, `--low-traffic-threshold`, `--css`, `--complexity-breakdown`, `--min-severity`, `--report-only`, `--workspace`, `--changed-workspaces`, `--baseline`, `--save-baseline` |
|
|
78
79
|
| `flags` | Detect feature flag patterns (env vars, SDK calls, config objects) | `--top`, `--retirement`, `--reason`, `--min-age`, `--flag-state`, `--max-flag-age` |
|
|
79
80
|
| `suppressions` | List active fallow-ignore suppression markers (read-only inventory) | `--file` |
|
|
80
81
|
| `explain` | Explain one issue type without running analysis | `<issue-type>`, `--format json` |
|
|
@@ -526,7 +527,7 @@ Human output groups paths under "Shared with your team (commit these)" and "Loca
|
|
|
526
527
|
{
|
|
527
528
|
"kind": "agent-install",
|
|
528
529
|
"schema_version": 1,
|
|
529
|
-
"fallow_version": "3.
|
|
530
|
+
"fallow_version": "3.38.1",
|
|
530
531
|
"root": "/abs/path",
|
|
531
532
|
"mode": "install",
|
|
532
533
|
"dry_run": false,
|
|
@@ -605,6 +606,7 @@ Angular templates contribute synthetic `<template>` complexity findings whenever
|
|
|
605
606
|
| `--max-cyclomatic` | `string` | - | Fail if any function exceeds this cyclomatic complexity |
|
|
606
607
|
| `--max-cognitive` | `string` | - | Fail if any function exceeds this cognitive complexity |
|
|
607
608
|
| `--max-crap` | `string` | - | Fail if any function has CRAP score >= threshold. CRAP combines complexity with coverage (`CC^2 * (1 - cov/100)^3 + CC`). Pair with `--coverage` for accurate per-function CRAP; without coverage data fallow estimates coverage from the module graph. |
|
|
609
|
+
| `--max-file-lines` | `string` | - | Maximum physical lines per file (overrides config `health.maxFileLines`, default 0 = off). A longer file is reported as a complexity finding with `exceeded: "file_lines"` |
|
|
608
610
|
| `--top` | `string` | - | Only show the top N most complex functions (and file scores/hotspots/targets) |
|
|
609
611
|
| `--sort` | `severity\|cyclomatic\|cognitive\|lines` | `cyclomatic` | Sort order for complexity findings |
|
|
610
612
|
| `--complexity` | `bool` | `false` | Show only function complexity findings. When no section flags are set, all sections are shown by default. |
|
|
@@ -737,7 +739,7 @@ fallow health --format json --quiet --trend
|
|
|
737
739
|
{
|
|
738
740
|
"kind": "health",
|
|
739
741
|
"schema_version": 7,
|
|
740
|
-
"version": "3.
|
|
742
|
+
"version": "3.38.1",
|
|
741
743
|
"elapsed_ms": 32,
|
|
742
744
|
"summary": {
|
|
743
745
|
"files_analyzed": 482,
|
|
@@ -1212,7 +1214,7 @@ fallow audit \
|
|
|
1212
1214
|
{
|
|
1213
1215
|
"kind": "audit",
|
|
1214
1216
|
"schema_version": 7,
|
|
1215
|
-
"version": "3.
|
|
1217
|
+
"version": "3.38.1",
|
|
1216
1218
|
"command": "audit",
|
|
1217
1219
|
"verdict": "fail",
|
|
1218
1220
|
"changed_files_count": 12,
|
|
@@ -1300,7 +1302,7 @@ fallow flags --format json --quiet --workspace my-package
|
|
|
1300
1302
|
```json
|
|
1301
1303
|
{
|
|
1302
1304
|
"schema_version": 7,
|
|
1303
|
-
"version": "3.
|
|
1305
|
+
"version": "3.38.1",
|
|
1304
1306
|
"elapsed_ms": 116,
|
|
1305
1307
|
"feature_flags": [],
|
|
1306
1308
|
"total_flags": 0
|
|
@@ -1401,7 +1403,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1401
1403
|
{
|
|
1402
1404
|
"kind": "security",
|
|
1403
1405
|
"schema_version": "4",
|
|
1404
|
-
"version": "3.
|
|
1406
|
+
"version": "3.38.1",
|
|
1405
1407
|
"elapsed_ms": 42,
|
|
1406
1408
|
"config": {
|
|
1407
1409
|
"rules": {
|
|
@@ -1430,7 +1432,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1430
1432
|
{
|
|
1431
1433
|
"kind": "security",
|
|
1432
1434
|
"schema_version": "4",
|
|
1433
|
-
"version": "3.
|
|
1435
|
+
"version": "3.38.1",
|
|
1434
1436
|
"elapsed_ms": 42,
|
|
1435
1437
|
"config": {
|
|
1436
1438
|
"rules": {
|
|
@@ -1504,6 +1506,8 @@ Compose one evidence bundle before editing a file or exported symbol. This is th
|
|
|
1504
1506
|
fallow inspect --file src/api.ts --format json --quiet
|
|
1505
1507
|
fallow inspect --symbol src/api.ts:fetchUser --format json --quiet
|
|
1506
1508
|
fallow inspect --file src/api.ts --churn --format json --quiet
|
|
1509
|
+
fallow inspect --file src/api.ts --cloud --format json --quiet
|
|
1510
|
+
fallow inspect --file src/api.ts --cloud --format compact
|
|
1507
1511
|
```
|
|
1508
1512
|
|
|
1509
1513
|
### Target Flags
|
|
@@ -1513,6 +1517,12 @@ fallow inspect --file src/api.ts --churn --format json --quiet
|
|
|
1513
1517
|
| `--file <PATH>` | Inspect one project-relative file |
|
|
1514
1518
|
| `--symbol <FILE:EXPORT>` | Inspect one exported symbol. Supporting dead-code, duplication, complexity, and security evidence is file-scoped in the first version |
|
|
1515
1519
|
| `--churn` | Add target-level git churn evidence. Off by default; missing git history is reported as `unavailable` |
|
|
1520
|
+
| `--cloud` | Add the `cloud` evidence section for a `--file` target: Fallow Cloud production data per local function (state, calls, error groups, CPU ms per hour, never-run branches). Off by default. Key: `$FALLOW_API_KEY`, else the key that `fallow cloud login` stored. The section `status` is `ok`, `no_key`, `plan_required`, `unavailable` or `untracked`; a status other than `ok` never fails the run. Requires fallow 3.38.0 or later |
|
|
1521
|
+
| `--repo <OWNER/REPO>` | Fallow Cloud repository for `--cloud`. Precedence: this flag > `$FALLOW_REPO` > the `origin` git remote |
|
|
1522
|
+
|
|
1523
|
+
`--format compact` for `inspect` requires fallow 3.38.0 or later. It prints plain text of about 1 KB, one line per item and no colors: a `fallow <path>` header, `finding <kind> <path:line> <text>` lines, `prod <name:line> <text>` lines (functions with errors first, then `never_called`, then local functions without production data, then the rest), a `cloud <status>: <text>` line for a status other than `ok`, and `truncated <n> more` when the byte cap cuts lines.
|
|
1524
|
+
|
|
1525
|
+
Local functions pair with deployed functions by `stable_id` first, then by the name plus the ordinal among the same-name functions of the file. A local function without a pair goes to `unpaired_local` with the note `no production data (new or moved since deploy)`. A `null` count means "not measured", never zero.
|
|
1516
1526
|
|
|
1517
1527
|
Common global flags: `--format`, `--quiet`, `--root`, `--config`, `--workspace`, `--production`, `--no-cache`, `--threads`.
|
|
1518
1528
|
|
|
@@ -1696,6 +1706,27 @@ Pack files can also reference the published schema directly: `"$schema": "https:
|
|
|
1696
1706
|
|
|
1697
1707
|
---
|
|
1698
1708
|
|
|
1709
|
+
## `cloud`: Log In to Fallow Cloud
|
|
1710
|
+
|
|
1711
|
+
Requires fallow 3.38.0 or later. Connect this machine to Fallow Cloud without copying a key. `login` runs the device flow: it prints a code and a URL, and after a user approves the code in the dashboard the cloud creates a read-only API key (`fallow_read_k1_`) for that user, organization and machine. The CLI stores the key and never prints it. Agents must not run `login`; only the user may approve it.
|
|
1712
|
+
|
|
1713
|
+
```bash
|
|
1714
|
+
fallow cloud login
|
|
1715
|
+
fallow cloud login --machine-name build-box
|
|
1716
|
+
fallow cloud logout
|
|
1717
|
+
```
|
|
1718
|
+
|
|
1719
|
+
| Flag | Description |
|
|
1720
|
+
|------|-------------|
|
|
1721
|
+
| `--machine-name <NAME>` | Name of the machine on the key (`login` only). Default: the host name |
|
|
1722
|
+
| `--api-url <URL>` | Fallow Cloud API base URL. Default: `$FALLOW_API_URL`, else `https://api.fallow.cloud` |
|
|
1723
|
+
|
|
1724
|
+
Storage: the OS keychain (service `fallow-cloud`, account = the API base URL; `security` on macOS, `secret-tool` on Linux), else `~/.config/fallow/credentials` (mode 0600). `FALLOW_CREDENTIAL_STORE=file` skips the keychain; `FALLOW_CREDENTIAL_STORE=none` turns stored keys off. `logout` removes the stored key; the key stays valid until you revoke it in Settings.
|
|
1725
|
+
|
|
1726
|
+
Every command that reads a cloud key uses one order: `--api-key` > `$FALLOW_API_KEY` > the keychain > the credentials file.
|
|
1727
|
+
|
|
1728
|
+
---
|
|
1729
|
+
|
|
1699
1730
|
## `license`: Manage the Fallow Cloud License
|
|
1700
1731
|
|
|
1701
1732
|
Manage the local JWT used to unlock continuous/cloud runtime monitoring. Single-capture local runtime analysis does not require a license. Verification is fully offline against an Ed25519 public key compiled into the binary. Only `--trial` and `refresh` hit the network (`api.fallow.cloud`, 5s connect / 10s total timeout).
|
|
@@ -2014,6 +2045,8 @@ Available on all commands:
|
|
|
2014
2045
|
| `--allow-remote-extends` | `bool` | `false` | Allow trusted config files to extend HTTPS URLs |
|
|
2015
2046
|
| `-f, --format` | `human\|json\|sarif\|compact\|markdown\|codeclimate\|pr-comment-github\|pr-comment-gitlab\|review-github\|review-gitlab\|badge\|github-annotations\|github-summary` | `human` | Output format (alias: --output) |
|
|
2016
2047
|
| `--pretty` | `bool` | `false` | Indent JSON output for manual inspection. Requires the final output format to be JSON |
|
|
2048
|
+
| `--lean` | `bool` | `false` | Trim JSON for agent context: leave out empty arrays and zero dead-code summary counts, group workspace diagnostics, cap health tables, and move repeated action text to `_meta.actions`. Requires JSON output. Applies to dead-code, health and the combined report; other commands reject it. Run without `--lean` for the full diagnostic list and the complete tables |
|
|
2049
|
+
| `--full-tables` | `bool` | `false` | With `--lean`, keep every row of the health tables (`hotspots`, `file_scores`, `large_functions`) |
|
|
2017
2050
|
| `-q, --quiet` | `bool` | `false` | Suppress progress output |
|
|
2018
2051
|
| `--no-cache` | `bool` | `false` | Disable incremental caching |
|
|
2019
2052
|
| `--threads` | `string` | - | Number of parser threads |
|
|
@@ -2183,6 +2216,40 @@ Set `FALLOW_FORMAT=json` and `FALLOW_QUIET=1` in your agent environment to avoid
|
|
|
2183
2216
|
|
|
2184
2217
|
---
|
|
2185
2218
|
|
|
2219
|
+
## `mutation --kill-matrix`: Redundant test evidence
|
|
2220
|
+
|
|
2221
|
+
```bash
|
|
2222
|
+
fallow mutation --all --kill-matrix --format json --quiet
|
|
2223
|
+
```
|
|
2224
|
+
|
|
2225
|
+
This opt-in mode runs all covering tests with bail disabled. It can increase execution time.
|
|
2226
|
+
Read the matrix evidence status before you review candidates. Normal mode reports `kill-matrix-disabled` and no candidates.
|
|
2227
|
+
Incomplete evidence also produces no candidates.
|
|
2228
|
+
|
|
2229
|
+
`kills` and `unique_kills` are arrays of mutant IDs.
|
|
2230
|
+
Individual subsumers cover a candidate's full kill set. Other tests can also cover that set collectively.
|
|
2231
|
+
Review each candidate separately, including equal kill sets. Removing equal candidates together can remove their shared protection.
|
|
2232
|
+
A candidate does not prove safe removal. Baseline-failing tests cannot become candidates or subsumers.
|
|
2233
|
+
|
|
2234
|
+
Tests with runtime coverage and no observed kills appear separately. Zero kills do not prove that a test has no assertions.
|
|
2235
|
+
Sole-file notes use observed instrumented-file coverage. Public-export notes use static test-file reach, without per-test export coverage claims.
|
|
2236
|
+
|
|
2237
|
+
The `mutation` and `mutation-inspect` JSON envelopes use schema version `"2"`. The `mutation-plan` envelope and verdict document keep schema version `"1"`.
|
|
2238
|
+
|
|
2239
|
+
The `kill_matrix` object has these fields:
|
|
2240
|
+
|
|
2241
|
+
| Field | Meaning |
|
|
2242
|
+
|---|---|
|
|
2243
|
+
| `status` | `complete`, `incomplete`, or `unavailable`, separate from mutation completion. |
|
|
2244
|
+
| `reasons` | Evidence limitations, such as `kill-matrix-disabled`, `incomplete-mutant-results`, `baseline-failure`, `partial-mutation-run`, or `missing-test-file-metadata`. |
|
|
2245
|
+
| `tests` | Entries with `test_id`, `file`, `kills`, `unique_kills`, `subsuming_tests`, and `notes`. |
|
|
2246
|
+
| `candidates` | Test IDs whose observed kill sets other tests cover. |
|
|
2247
|
+
| `coverage_without_kills` | Test IDs with runtime coverage and no observed kills. |
|
|
2248
|
+
|
|
2249
|
+
Each mutant and attempt records `killing_tests` and `kill_matrix_complete`. The existing `killed_by` field keeps the first observed killer. Outside matrix mode, `killing_tests` is empty.
|
|
2250
|
+
|
|
2251
|
+
Matrix mode does not add the other tests of the covering test files to the retry of a survivor. A survivor that normal mode kills in that retry can stay `survived` in matrix mode, so the two modes can give different scores.
|
|
2252
|
+
|
|
2186
2253
|
## `ci`: Provider-Aware Review Automation
|
|
2187
2254
|
|
|
2188
2255
|
`fallow ci reconcile-review` reads a typed review envelope (`--format review-github` / `review-gitlab`), looks up existing fingerprints on the PR/MR, and resolves stale review threads when their finding is no longer present in the new envelope. Posts an idempotent "Resolved in `<sha>`" follow-up comment per stale finding (skipped if a marker for the same fingerprint at the current SHA already exists).
|
|
@@ -2245,7 +2312,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
|
|
|
2245
2312
|
{
|
|
2246
2313
|
"kind": "dead-code",
|
|
2247
2314
|
"schema_version": 7,
|
|
2248
|
-
"version": "3.
|
|
2315
|
+
"version": "3.38.1",
|
|
2249
2316
|
"elapsed_ms": 45,
|
|
2250
2317
|
"total_issues": 12,
|
|
2251
2318
|
"entry_points": {
|
|
@@ -2405,7 +2472,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
|
|
|
2405
2472
|
{
|
|
2406
2473
|
"kind": "dupes",
|
|
2407
2474
|
"schema_version": 7,
|
|
2408
|
-
"version": "3.
|
|
2475
|
+
"version": "3.38.1",
|
|
2409
2476
|
"elapsed_ms": 82,
|
|
2410
2477
|
"total_clones": 15,
|
|
2411
2478
|
"total_lines_duplicated": 230,
|
|
@@ -2449,11 +2516,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
|
|
|
2449
2516
|
{
|
|
2450
2517
|
"kind": "combined",
|
|
2451
2518
|
"schema_version": 7,
|
|
2452
|
-
"version": "3.
|
|
2519
|
+
"version": "3.38.1",
|
|
2453
2520
|
"elapsed_ms": 159,
|
|
2454
2521
|
"check": {
|
|
2455
2522
|
"schema_version": 7,
|
|
2456
|
-
"version": "3.
|
|
2523
|
+
"version": "3.38.1",
|
|
2457
2524
|
"elapsed_ms": 45,
|
|
2458
2525
|
"total_issues": 12,
|
|
2459
2526
|
"unused_files": [],
|
|
@@ -67,6 +67,7 @@ The `generated:issue-types` table below is regenerated from `fallow schema` by s
|
|
|
67
67
|
| `high-cognitive-complexity` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function has high cognitive complexity |
|
|
68
68
|
| `high-complexity` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function exceeds both complexity thresholds |
|
|
69
69
|
| `high-crap-score` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function has a high CRAP score (complexity combined with low coverage) |
|
|
70
|
+
| `long-file` | `--complexity` | - | `// fallow-ignore-file complexity` | File has more lines than the file-length threshold |
|
|
70
71
|
| `refactoring-target` | `--targets` | - | - | File identified as a high-priority refactoring candidate |
|
|
71
72
|
| `css-token-drift` | - | - | `// fallow-ignore-next-line css-token-drift` | CSS or CSS-in-JS hardcoded styling value bypasses the design token system |
|
|
72
73
|
| `css-duplicate-block` | - | - | `// fallow-ignore-next-line css-duplicate-block` | CSS or CSS-in-JS declaration block is duplicated across rules |
|
|
@@ -33,7 +33,7 @@ When using fallow via MCP (`fallow-mcp`), the following tools are available:
|
|
|
33
33
|
| `get_cloud_review_packet` | runtime-coverage | freemium | `fallow coverage review-packet --repo <owner/repo> --file <path> --format json --quiet` | `repo`, `files`, `functions`, `period_days`, `project_id` | Production facts of a few changed files or functions, read from fallow cloud without the full runtime-context pull |
|
|
34
34
|
| `get_cloud_deployment_changes` | runtime-coverage | freemium | `fallow coverage deployment-changes --repo <owner/repo> --sha <sha> --format json --quiet` | `repo`, `sha`, `base`, `change` | How production behavior changed between two deployments, read from the fallow cloud change report |
|
|
35
35
|
| `get_token_blast_radius` | analysis | free | `fallow health --css --format json --quiet` | - | Design-token blast radius for Tailwind v4 @theme tokens and CSS-in-JS token definitions (StyleX, vanilla-extract, PandaCSS): per token, a consumer_count (static lower bound) and a capped located consumers[] sample tagged theme-var/css-var/utility/apply (Tailwind), js-member (member access), or js-call (StyleX theme-group and Panda token calls); descriptive context for sizing a token change, never a deletion gate |
|
|
36
|
-
| `audit` | analysis | free | `fallow audit --format json --quiet` | `gate`, `base`, `skip`, `css_deep`, `max_crap`, `coverage`, `runtime_coverage` | Combined dead-code + complexity + duplication + styling + diff risk for changed files, returns verdict. The diff-risk rules (`weakened-tests`, `added-suppression`, `test-only-branch`, and the opt-in `diverged-clone-sibling` and `added-dependency`, both off by default) report facts about the change in `diff_risk.findings`. Styling analytics are enabled by default; CSS and CSS-in-JS evidence can add `styling_findings`, `css_analytics`, and `styling_health` under the
|
|
36
|
+
| `audit` | analysis | free | `fallow audit --format json --quiet` | `gate`, `base`, `skip`, `css_deep`, `max_crap`, `coverage`, `runtime_coverage` | Combined dead-code + complexity + duplication + styling + diff risk for changed files, returns verdict. The diff-risk rules (`weakened-tests`, `added-suppression`, `test-only-branch`, and the opt-in `diverged-clone-sibling` and `added-dependency`, both off by default) report facts about the change in `diff_risk.findings`. Styling analytics are enabled by default; CSS and CSS-in-JS evidence can add `styling_findings`, `css_analytics`, and `styling_health` under the audit `complexity` sub-result. Set `gate` to `"new-only"` or `"all"`. Set `css_deep: false` to skip project-wide styling reachability while keeping local styling checks, or `css_deep: true` to force it back on when config disables it. Optional `runtime_coverage` (V8 dir / V8 JSON / Istanbul JSON) folds runtime findings into the same call; `min_invocations_hot` tunes the hot-path threshold (default 100). Runtime evidence appears under the audit `complexity` sub-result, including `coverage_intelligence` when combined evidence yields actionable recommendations. |
|
|
37
37
|
| `decision_surface` | analysis | free | `fallow decision-surface --format json --quiet` | `base`, `max_decisions`, `workspace` | Surface the few consequential structural decisions a change embeds (coupling, public API, dependency), each as a judgment question with the routed expert; ranked, capped, and signal_id-anchored |
|
|
38
38
|
| `fallow_explain` | introspection | free | `fallow explain <issue-type> --format json --quiet` | `issue_type` | Explain one issue type without running analysis. Required `issue_type`; returns rationale, examples, fix guidance, and docs URL |
|
|
39
39
|
| `fix_preview` | fix | free | `fallow fix --dry-run --format json --quiet` | `no_create_config` | Dry-run auto-fix preview |
|
|
@@ -119,7 +119,7 @@ Use these reads when the project sends production coverage to Fallow Cloud. The
|
|
|
119
119
|
|
|
120
120
|
- `hit_count`: the production call count. Rank hot functions by it, not by `prod_hit_count`, which counts tagged traffic only.
|
|
121
121
|
- `tracking_state`: `called`, `never_called`, or `untracked` in the current deployment.
|
|
122
|
-
- `covered_by_test`: `true` or `null`. `null` means no test evidence, not "no test". A hot function with `covered_by_test: null` is a high-risk edit.
|
|
122
|
+
- `covered_by_test`: `true`, `false`, or `null`. `true` means a test or CI run called the function. `false` means a test or CI run tracked the function and never called it. `null` means no test evidence, not "no test". A hot function with `covered_by_test: false` or `null` is a high-risk edit.
|
|
123
123
|
- `blast_radius.caller_count` and `blast_radius.caller_sites`: callers when the data exists; `null` is unknown, not zero.
|
|
124
124
|
|
|
125
125
|
An entry in `not_found` has no cloud data. Absence is not evidence that the code is cold.
|
|
@@ -149,7 +149,7 @@ Most tools accept `root`, `config`, `no_cache`, and `threads` params. Exceptions
|
|
|
149
149
|
|
|
150
150
|
Every dead-code, health, and duplication finding in JSON responses includes a structured `actions` array for programmatic fixes or suppression.
|
|
151
151
|
|
|
152
|
-
`health.thresholdOverrides[]` lets projects keep known legacy functions visible as configured local ceilings instead of hiding them with suppressions. Each entry has `files` globs, optional exact `functions`, one or more of `maxCyclomatic`, `maxCognitive`, `maxCrap`, or `
|
|
152
|
+
`health.thresholdOverrides[]` lets projects keep known legacy functions visible as configured local ceilings instead of hiding them with suppressions. Each entry has `files` globs, optional exact `functions`, one or more of `maxCyclomatic`, `maxCognitive`, `maxCrap`, `maxUnitSize`, or `maxFileLines`, and optional `reason`. An entry that sets `maxFileLines` must leave `functions` empty, because the ceiling applies to whole files. Health JSON may include top-level `threshold_overrides[]` entries with `active`, `stale`, `insufficient`, or `no_match` status, and complexity findings that use an override carry `effective_thresholds` plus `threshold_source: "override"`. Each entry also names its `dimension` (`complexity` or `crap`), so one configured override yields one entry per dimension it participates in: group on `override_index` to count configured overrides. `insufficient` means the raised ceiling is still exceeded. An entry's `outstanding[]` lists every dimension the matched unit still breaches after the override applied, which is how an `active` override can sit next to a surviving finding.
|
|
153
153
|
|
|
154
154
|
`dead-code`, `health`, `dupes`, bare `fallow`, and `audit` JSON output may include a top-level `next_steps` array of read-only follow-up commands computed from the run's findings. Each entry is `{ id, command, reason }`. The `command` is runnable as-is (never a placeholder, never `fix` or any other mutating command); the stable kebab-case `id` (`setup`, `impact-report`, `trace-unused-export`, `trace-deprecated-export`, `trace-clone`, `complexity-breakdown`, `scope-workspaces`, `audit-changed`) maps to a verification step to run before acting, for example tracing an export before deleting it.
|
|
155
155
|
|
|
@@ -786,7 +786,7 @@ Behavior you can rely on:
|
|
|
786
786
|
- The hook process can start in a directory that is not the session directory, for example in the main checkout when the session works in a nested git worktree. The script reads the session directory from the `cwd` field of the hook input and finds the audit root from it with the same walk. When the walk finds no script, for example with the user-scope script in `$HOME`, the audit root is the directory of the hook process when it is in the git work tree of the session. Else it is the git top level of the session directory, or the session directory outside a git repository. The audit root is never `$HOME`. The script compares physical paths, so a symlink does not change the walk. When the hook input has no usable `cwd`, the audit runs in the directory of the hook process.
|
|
787
787
|
- A `git commit` or `git push` can name another work tree. The script audits only that target when the command has the strict form `[cd <dir> &&] git [-C <dir>]... commit|push [<option or name>]...` and git reports another work tree for the target (`git rev-parse --show-toplevel --absolute-git-dir` gives a different top level and a different git directory than for the session directory). For a push, the common git directory must differ too: linked worktrees share refs, so a push from another linked worktree of the session repository audits the session tree and the target. The one exception is a push that cannot send the session branch: the options are only `-u`, `-q`, `--set-upstream`, `--force-with-lease` and `--force-if-includes`, `git rev-parse --symbolic-full-name` gives the checked-out branch of the target for each refspec source, that branch is not the session branch, and a push without a refspec has `push.default` unset or `simple`, `current`, `upstream` or `nothing` and no remote `push` or `mirror` setting. That push audits only the target. A git error during this check keeps the session audit. A target in the same work tree keeps the session audit, because `git commit` commits the whole index. Each word in the strict form must be inert: a `-C` directory resolves physically as in git, a `cd` directory starts with `/`, `./` or `../`, a double-quoted word holds no `$`, backquote or backslash, and only a short list of options such as `-m`, `--amend`, `-S` and `-u` is allowed. Any other command audits the session tree as before, plus each directory that it names in another work tree. The gate blocks when one audit fails.
|
|
788
788
|
- Runs only when the intercepted command is a `git commit` or `git push`, including invocations that pass git-level options before the subcommand (`git -c user.name=x commit`, `git --no-pager commit`, `git -C dir push`, `git --git-dir=/x push`); anything else exits 0. Set `FALLOW_GATE_DEBUG=1` to log skipped commands to stderr.
|
|
789
|
-
-
|
|
789
|
+
- Prefers a native Fallow JSON reader discovered from PATH, the process directory or the script's project root; jq remains a compatibility fallback. Audit runner lookup tries PATH, project-local `node_modules/.bin/fallow`, Yarn Plug'n'Play, then `npx --no-install fallow`. A missing JSON reader or audit runner causes a stderr skip notice. Check `fallow agent status --format json --quiet` after setup for missing or unverified runtimes. Approve project trust and the hook in the harness before relying on the gate.
|
|
790
790
|
- Enforces a version floor via `FALLOW_GATE_MIN_VERSION`. The installed gate script holds the default floor (currently `2.85.0`). Fallow maintainers raise that default by hand; `fallow hooks install` does not set it to the installed version. Binaries below the floor are blocked with an upgrade hint. Set the env var to the empty string to disable the check.
|
|
791
791
|
- Runs `fallow audit --format json --quiet --explain --gate-marker agent`. On verdict=`fail`, it writes a short block message to stderr: the line `fallow-gate: blocked by fallow <version> at <binary>`, the verdict, one line for each finding that caused the block (`<kind> <path>:<line> <name>`, at most 50 lines), and the path of the full JSON report. Under the default `gate = "new-only"` the listed findings are the ones with `introduced: true`; under `gate = "all"` they are all findings that are not warnings. The full report goes to `.fallow/gate-report.json` in the audited tree, or to `FALLOW_GATE_REPORT` when set (a relative path resolves against the audited tree). Set `FALLOW_GATE_OUTPUT=json` to write the full JSON envelope to stderr instead, preceded by `fallow-gate: blocked by fallow <version> at <binary>` so the responsible binary is always identifiable. The gate marker lets local Impact record blocked-then-cleared agent gate events when Impact is enabled.
|
|
792
792
|
- On runtime error (`{"error": true, ...}`) or unexpected non-zero exit, fails open with a one-line stderr notice; warn verdicts pass through silently.
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `trace-error`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `architecture-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `architecture`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `doctor`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`, `similar-code-status`, `similar-code-cache-clear`, `mutation`, `mutation-plan`, `mutation-inspect`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
|
|
27
|
+
* Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `trace-error`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `architecture-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `architecture`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `doctor`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`, `similar-code-status`, `similar-code-cache-clear`, `mutation`, `mutation-plan`, `mutation-inspect`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field. A `--lean` document is not a root branch: it validates against `LeanOutput`.
|
|
28
28
|
*/
|
|
29
29
|
export type FallowJsonOutput = (FallowOutput | CodeClimateOutput | ErrorOutput)
|
|
30
30
|
/**
|
|
@@ -889,7 +889,7 @@ export type CloneFamilyActionType = ("extract-shared" | "apply-suggestion" | "su
|
|
|
889
889
|
/**
|
|
890
890
|
* Which complexity threshold was exceeded.
|
|
891
891
|
*/
|
|
892
|
-
export type ExceededThreshold = ("cyclomatic" | "cognitive" | "both" | "crap" | "cyclomatic_crap" | "cognitive_crap" | "all")
|
|
892
|
+
export type ExceededThreshold = ("cyclomatic" | "cognitive" | "both" | "crap" | "cyclomatic_crap" | "cognitive_crap" | "all" | "file_lines")
|
|
893
893
|
/**
|
|
894
894
|
* Severity tier indicating how far a function exceeds complexity thresholds.
|
|
895
895
|
*
|
|
@@ -937,7 +937,7 @@ export type ThresholdSource = "override"
|
|
|
937
937
|
* BOTH `increase-coverage` AND `refactor-function`, plus the trailing
|
|
938
938
|
* `suppress-line`.
|
|
939
939
|
*/
|
|
940
|
-
export type HealthFindingActionType = ("refactor-function" | "add-tests" | "increase-coverage" | "suppress-file" | "suppress-line")
|
|
940
|
+
export type HealthFindingActionType = ("refactor-function" | "add-tests" | "increase-coverage" | "suppress-file" | "suppress-line" | "split-file")
|
|
941
941
|
/**
|
|
942
942
|
* Audit-mode class of a complexity finding against the base snapshot.
|
|
943
943
|
*/
|
|
@@ -1254,6 +1254,14 @@ export type InspectSectionStatus = ("ok" | "partial" | "unavailable" | "error")
|
|
|
1254
1254
|
* Granularity an [`InspectEvidenceSection`] payload covers.
|
|
1255
1255
|
*/
|
|
1256
1256
|
export type InspectEvidenceScope = ("symbol" | "file" | "project_filtered_to_file")
|
|
1257
|
+
/**
|
|
1258
|
+
* Status of the [`InspectCloudEvidence`] section.
|
|
1259
|
+
*/
|
|
1260
|
+
export type InspectCloudStatus = ("ok" | "no_key" | "plan_required" | "unavailable" | "untracked")
|
|
1261
|
+
/**
|
|
1262
|
+
* How a local function was paired with a deployed function.
|
|
1263
|
+
*/
|
|
1264
|
+
export type InspectCloudMatch = ("stable_id" | "name_ordinal")
|
|
1257
1265
|
/**
|
|
1258
1266
|
* Whether a whole-word text search for an export name finds a consumer that
|
|
1259
1267
|
* the module graph resolves. The levels sort from best to worst.
|
|
@@ -1368,6 +1376,14 @@ export type CoverageSetupPackageManager = ("npm" | "pnpm" | "yarn" | "bun")
|
|
|
1368
1376
|
* Runtime environment coverage capture must instrument.
|
|
1369
1377
|
*/
|
|
1370
1378
|
export type CoverageSetupRuntimeTarget = ("node" | "browser")
|
|
1379
|
+
/**
|
|
1380
|
+
* CI provider of a Fallow Cloud setup plan.
|
|
1381
|
+
*/
|
|
1382
|
+
export type CoverageSetupCiProvider = "github_actions"
|
|
1383
|
+
/**
|
|
1384
|
+
* Outcome of `fallow coverage setup --cloud --wait`.
|
|
1385
|
+
*/
|
|
1386
|
+
export type CoverageSetupWaitOutcome = ("complete" | "timeout" | "error")
|
|
1371
1387
|
/**
|
|
1372
1388
|
* Schema-version discriminator for [`CoverageAnalyzeOutput`].
|
|
1373
1389
|
*/
|
|
@@ -1760,11 +1776,15 @@ export type SimilarCodeCacheClearSchemaVersion = "1"
|
|
|
1760
1776
|
/**
|
|
1761
1777
|
* Version singleton for a mutation report.
|
|
1762
1778
|
*/
|
|
1763
|
-
export type MutationSchemaVersion = "
|
|
1779
|
+
export type MutationSchemaVersion = "2"
|
|
1764
1780
|
/**
|
|
1765
1781
|
* Why a run is partial.
|
|
1766
1782
|
*/
|
|
1767
1783
|
export type MutationIncompleteReason = ("runtime-error" | "mutant-limit" | "time-budget" | "skipped-files" | "unloaded-files" | "test-files-not-discovered" | "baseline-failure" | "worktree-changed" | "typecheck-failed" | "worktree-unchecked")
|
|
1784
|
+
/**
|
|
1785
|
+
* The quality of observed test-to-mutant evidence.
|
|
1786
|
+
*/
|
|
1787
|
+
export type MutationKillMatrixStatus = ("complete" | "incomplete" | "unavailable")
|
|
1768
1788
|
/**
|
|
1769
1789
|
* Which code a run mutates.
|
|
1770
1790
|
*/
|
|
@@ -1792,7 +1812,7 @@ export type MutationPlanDisposition = ("planned" | "pending" | "no_coverage" | "
|
|
|
1792
1812
|
/**
|
|
1793
1813
|
* Version singleton for a mutation inspect packet.
|
|
1794
1814
|
*/
|
|
1795
|
-
export type MutationInspectSchemaVersion = "
|
|
1815
|
+
export type MutationInspectSchemaVersion = "2"
|
|
1796
1816
|
/**
|
|
1797
1817
|
* Whether the saved report still describes the current file.
|
|
1798
1818
|
*/
|
|
@@ -8027,11 +8047,12 @@ export interface HealthFinding {
|
|
|
8027
8047
|
*/
|
|
8028
8048
|
path: string
|
|
8029
8049
|
/**
|
|
8030
|
-
* Function name, or a synthesized name for anonymous functions.
|
|
8050
|
+
* Function name, or a synthesized name for anonymous functions. A
|
|
8051
|
+
* file-length finding has the name `<file>`.
|
|
8031
8052
|
*/
|
|
8032
8053
|
name: string
|
|
8033
8054
|
/**
|
|
8034
|
-
* 1-based line the function starts on.
|
|
8055
|
+
* 1-based line the function starts on. A file-length finding has `1`.
|
|
8035
8056
|
*/
|
|
8036
8057
|
line: number
|
|
8037
8058
|
/**
|
|
@@ -8055,7 +8076,8 @@ standard_cyclomatic?: (number | null)
|
|
|
8055
8076
|
*/
|
|
8056
8077
|
cognitive: number
|
|
8057
8078
|
/**
|
|
8058
|
-
* Lines of code in the function body.
|
|
8079
|
+
* Lines of code in the function body. On a file-length finding, the
|
|
8080
|
+
* physical line count of the file.
|
|
8059
8081
|
*/
|
|
8060
8082
|
line_count: number
|
|
8061
8083
|
/**
|
|
@@ -8151,6 +8173,12 @@ effective_thresholds?: (HealthEffectiveThresholds | null)
|
|
|
8151
8173
|
* Source of the effective thresholds. Omitted when thresholds are global.
|
|
8152
8174
|
*/
|
|
8153
8175
|
threshold_source?: (ThresholdSource | null)
|
|
8176
|
+
/**
|
|
8177
|
+
* File-length ceiling in physical lines that the file exceeded. Present
|
|
8178
|
+
* only on a file-level finding (`exceeded: "file_lines"`), where
|
|
8179
|
+
* `line_count` holds the physical line count of the file.
|
|
8180
|
+
*/
|
|
8181
|
+
max_file_lines?: (number | null)
|
|
8154
8182
|
/**
|
|
8155
8183
|
* Machine-actionable fix and suppress hints.
|
|
8156
8184
|
*/
|
|
@@ -8497,7 +8525,9 @@ files_analyzed: number
|
|
|
8497
8525
|
*/
|
|
8498
8526
|
functions_analyzed: number
|
|
8499
8527
|
/**
|
|
8500
|
-
*
|
|
8528
|
+
* Complexity findings before `--top`: functions exceeding at least one
|
|
8529
|
+
* complexity or CRAP threshold, plus file-length findings
|
|
8530
|
+
* (`exceeded: "file_lines"`).
|
|
8501
8531
|
*/
|
|
8502
8532
|
functions_above_threshold: number
|
|
8503
8533
|
/**
|
|
@@ -8525,6 +8555,12 @@ max_crap_threshold: number
|
|
|
8525
8555
|
* here; this is the global default.
|
|
8526
8556
|
*/
|
|
8527
8557
|
max_unit_size_threshold: number
|
|
8558
|
+
/**
|
|
8559
|
+
* Global file-length ceiling (`health.maxFileLines` or
|
|
8560
|
+
* `--max-file-lines`) in physical lines. Absent when the file-length
|
|
8561
|
+
* check is off.
|
|
8562
|
+
*/
|
|
8563
|
+
max_file_lines_threshold?: (number | null)
|
|
8528
8564
|
/**
|
|
8529
8565
|
* Files with a computed maintainability score; absent when file scoring
|
|
8530
8566
|
* did not run.
|
|
@@ -8654,6 +8690,10 @@ max_crap?: (number | null)
|
|
|
8654
8690
|
* Unit-size ceiling set by the override, when it sets one.
|
|
8655
8691
|
*/
|
|
8656
8692
|
max_unit_size?: (number | null)
|
|
8693
|
+
/**
|
|
8694
|
+
* File-length ceiling set by the override, when it sets one.
|
|
8695
|
+
*/
|
|
8696
|
+
max_file_lines?: (number | null)
|
|
8657
8697
|
}
|
|
8658
8698
|
/**
|
|
8659
8699
|
* Current complexity metrics for a matched threshold override entry.
|
|
@@ -11085,13 +11125,10 @@ defined_font_faces: string[]
|
|
|
11085
11125
|
referenced_font_families: string[]
|
|
11086
11126
|
}
|
|
11087
11127
|
/**
|
|
11088
|
-
* Structural CSS metrics for
|
|
11089
|
-
*
|
|
11090
|
-
*
|
|
11091
|
-
*
|
|
11092
|
-
*
|
|
11093
|
-
* Not persisted in the extraction cache: `fallow health` computes these
|
|
11094
|
-
* on demand from the CSS source, so there is no `bitcode` derive.
|
|
11128
|
+
* Structural CSS metrics for one style rule of the parsed CSS. Only a rule
|
|
11129
|
+
* over a structural floor (an id selector, a complex selector, `!important`,
|
|
11130
|
+
* or deep nesting) is recorded, so the vector stays bounded. Not cached:
|
|
11131
|
+
* `fallow health` computes these from the CSS source (no `bitcode` derive).
|
|
11095
11132
|
*/
|
|
11096
11133
|
export interface CssRuleMetric {
|
|
11097
11134
|
/**
|
|
@@ -12276,6 +12313,12 @@ symbol_impact?: (InspectEvidenceSection | null)
|
|
|
12276
12313
|
* Present only for a symbol target in type-aware mode.
|
|
12277
12314
|
*/
|
|
12278
12315
|
targeted_tests?: (InspectEvidenceSection | null)
|
|
12316
|
+
/**
|
|
12317
|
+
* OPT-IN Fallow Cloud production evidence for a file target. Present
|
|
12318
|
+
* only when `--cloud` was requested. A missing key, a plan gate or an
|
|
12319
|
+
* unreachable cloud is a section status, never a failed run.
|
|
12320
|
+
*/
|
|
12321
|
+
cloud?: (InspectCloudEvidence | null)
|
|
12279
12322
|
}
|
|
12280
12323
|
/**
|
|
12281
12324
|
* One evidence section: status, the scope the evidence covers, and either a
|
|
@@ -12295,6 +12338,161 @@ data?: {
|
|
|
12295
12338
|
[k: string]: unknown
|
|
12296
12339
|
}
|
|
12297
12340
|
}
|
|
12341
|
+
/**
|
|
12342
|
+
* `evidence.cloud` block: production data of the target file from Fallow
|
|
12343
|
+
* Cloud, paired with the functions of the local file.
|
|
12344
|
+
*
|
|
12345
|
+
* `null` in a count means "not measured", never zero.
|
|
12346
|
+
*/
|
|
12347
|
+
export interface InspectCloudEvidence {
|
|
12348
|
+
status: InspectCloudStatus
|
|
12349
|
+
/**
|
|
12350
|
+
* Explanation for a status other than `ok`, or a note on an `ok`
|
|
12351
|
+
* section (for example that the cloud left out functions).
|
|
12352
|
+
*/
|
|
12353
|
+
message?: (string | null)
|
|
12354
|
+
/**
|
|
12355
|
+
* Fallow Cloud repository that was read, when it was resolved.
|
|
12356
|
+
*/
|
|
12357
|
+
repo?: (string | null)
|
|
12358
|
+
/**
|
|
12359
|
+
* Newest deployment commit with data for the file.
|
|
12360
|
+
*/
|
|
12361
|
+
latest_sha?: (string | null)
|
|
12362
|
+
/**
|
|
12363
|
+
* Days of production data the cloud read covers.
|
|
12364
|
+
*/
|
|
12365
|
+
period_days?: (number | null)
|
|
12366
|
+
/**
|
|
12367
|
+
* File summary from the cloud. `None` when the cloud was not read.
|
|
12368
|
+
*/
|
|
12369
|
+
summary?: (InspectCloudSummary | null)
|
|
12370
|
+
/**
|
|
12371
|
+
* Local functions paired with a deployed function.
|
|
12372
|
+
*/
|
|
12373
|
+
functions: InspectCloudFunction[]
|
|
12374
|
+
/**
|
|
12375
|
+
* Local functions without a deployed function.
|
|
12376
|
+
*/
|
|
12377
|
+
unpaired_local: InspectCloudUnpairedFunction[]
|
|
12378
|
+
}
|
|
12379
|
+
/**
|
|
12380
|
+
* File summary of the [`InspectCloudEvidence`] section.
|
|
12381
|
+
*/
|
|
12382
|
+
export interface InspectCloudSummary {
|
|
12383
|
+
/**
|
|
12384
|
+
* Deployed functions of the file.
|
|
12385
|
+
*/
|
|
12386
|
+
functions: number
|
|
12387
|
+
/**
|
|
12388
|
+
* Functions that ran in the period.
|
|
12389
|
+
*/
|
|
12390
|
+
called: number
|
|
12391
|
+
/**
|
|
12392
|
+
* Functions that were tracked and did not run.
|
|
12393
|
+
*/
|
|
12394
|
+
never_called: number
|
|
12395
|
+
/**
|
|
12396
|
+
* Functions without production data.
|
|
12397
|
+
*/
|
|
12398
|
+
untracked: number
|
|
12399
|
+
/**
|
|
12400
|
+
* Calls of all functions of the file. `None` when not measured.
|
|
12401
|
+
*/
|
|
12402
|
+
calls?: (number | null)
|
|
12403
|
+
/**
|
|
12404
|
+
* Error groups of the file. `None` when not measured.
|
|
12405
|
+
*/
|
|
12406
|
+
error_groups?: (number | null)
|
|
12407
|
+
/**
|
|
12408
|
+
* Error events of the file. `None` when not measured.
|
|
12409
|
+
*/
|
|
12410
|
+
error_events?: (number | null)
|
|
12411
|
+
/**
|
|
12412
|
+
* One-line summary from the cloud.
|
|
12413
|
+
*/
|
|
12414
|
+
text: string
|
|
12415
|
+
}
|
|
12416
|
+
/**
|
|
12417
|
+
* One local function with its production data.
|
|
12418
|
+
*/
|
|
12419
|
+
export interface InspectCloudFunction {
|
|
12420
|
+
/**
|
|
12421
|
+
* Function name in the local file.
|
|
12422
|
+
*/
|
|
12423
|
+
name: string
|
|
12424
|
+
/**
|
|
12425
|
+
* 1-based start line in the local file.
|
|
12426
|
+
*/
|
|
12427
|
+
line: number
|
|
12428
|
+
/**
|
|
12429
|
+
* Stable id of the deployed function.
|
|
12430
|
+
*/
|
|
12431
|
+
stable_id?: (string | null)
|
|
12432
|
+
match: InspectCloudMatch
|
|
12433
|
+
/**
|
|
12434
|
+
* Tracking state in the current deployment: `called`, `never_called` or
|
|
12435
|
+
* `untracked`.
|
|
12436
|
+
*/
|
|
12437
|
+
state: string
|
|
12438
|
+
/**
|
|
12439
|
+
* Tracking state over the whole period, earlier deployments included.
|
|
12440
|
+
* `called` with `state` `never_called` means that the function did not
|
|
12441
|
+
* run in this deployment, but ran in an earlier one. `None` when the
|
|
12442
|
+
* cloud does not say.
|
|
12443
|
+
*/
|
|
12444
|
+
period_state?: (string | null)
|
|
12445
|
+
/**
|
|
12446
|
+
* Calls in the period. `None` when not measured.
|
|
12447
|
+
*/
|
|
12448
|
+
calls?: (number | null)
|
|
12449
|
+
/**
|
|
12450
|
+
* Error counts. `None` when error capture did not cover the function.
|
|
12451
|
+
*/
|
|
12452
|
+
errors?: (InspectCloudErrors | null)
|
|
12453
|
+
/**
|
|
12454
|
+
* Self CPU milliseconds per profiled hour. `None` when not measured.
|
|
12455
|
+
*/
|
|
12456
|
+
cpu_ms_per_hour?: (number | null)
|
|
12457
|
+
/**
|
|
12458
|
+
* Branch ranges that never ran. `None` when not measured.
|
|
12459
|
+
*/
|
|
12460
|
+
never_run_ranges?: (number | null)
|
|
12461
|
+
/**
|
|
12462
|
+
* One-line summary from the cloud.
|
|
12463
|
+
*/
|
|
12464
|
+
summary: string
|
|
12465
|
+
}
|
|
12466
|
+
/**
|
|
12467
|
+
* Error counts of one function.
|
|
12468
|
+
*/
|
|
12469
|
+
export interface InspectCloudErrors {
|
|
12470
|
+
/**
|
|
12471
|
+
* Error groups attributed to the function.
|
|
12472
|
+
*/
|
|
12473
|
+
groups: number
|
|
12474
|
+
/**
|
|
12475
|
+
* Error events attributed to the function.
|
|
12476
|
+
*/
|
|
12477
|
+
events: number
|
|
12478
|
+
}
|
|
12479
|
+
/**
|
|
12480
|
+
* One local function without a deployed function.
|
|
12481
|
+
*/
|
|
12482
|
+
export interface InspectCloudUnpairedFunction {
|
|
12483
|
+
/**
|
|
12484
|
+
* Function name in the local file.
|
|
12485
|
+
*/
|
|
12486
|
+
name: string
|
|
12487
|
+
/**
|
|
12488
|
+
* 1-based start line in the local file.
|
|
12489
|
+
*/
|
|
12490
|
+
line: number
|
|
12491
|
+
/**
|
|
12492
|
+
* Why the function has no production data.
|
|
12493
|
+
*/
|
|
12494
|
+
note: string
|
|
12495
|
+
}
|
|
12298
12496
|
/**
|
|
12299
12497
|
* Result of tracing an export: why it is considered used or unused.
|
|
12300
12498
|
*/
|
|
@@ -13693,6 +13891,10 @@ next_steps: string[]
|
|
|
13693
13891
|
* Non-fatal problems encountered during detection.
|
|
13694
13892
|
*/
|
|
13695
13893
|
warnings: string[]
|
|
13894
|
+
/**
|
|
13895
|
+
* Fallow Cloud plan, present only for `fallow coverage setup --cloud`.
|
|
13896
|
+
*/
|
|
13897
|
+
cloud?: (CoverageSetupCloud | null)
|
|
13696
13898
|
/**
|
|
13697
13899
|
* `_meta` block with docs and field definitions, when requested.
|
|
13698
13900
|
*/
|
|
@@ -13768,6 +13970,112 @@ path: string
|
|
|
13768
13970
|
*/
|
|
13769
13971
|
content: string
|
|
13770
13972
|
}
|
|
13973
|
+
/**
|
|
13974
|
+
* Fallow Cloud plan of `fallow coverage setup --cloud`.
|
|
13975
|
+
*
|
|
13976
|
+
* The beacon, the inventory, the source maps and the deployment registration
|
|
13977
|
+
* must all carry the same commit SHA. The plan names only the environment
|
|
13978
|
+
* variable names of keys, never a key value.
|
|
13979
|
+
*/
|
|
13980
|
+
export interface CoverageSetupCloud {
|
|
13981
|
+
/**
|
|
13982
|
+
* Fallow Cloud project id (`owner/repo`), or null when it was not detected.
|
|
13983
|
+
*/
|
|
13984
|
+
project_id?: (string | null)
|
|
13985
|
+
/**
|
|
13986
|
+
* Commit SHA that `--wait` checks: `--git-sha`, else `HEAD` of the
|
|
13987
|
+
* working tree, or null outside a git repository.
|
|
13988
|
+
*/
|
|
13989
|
+
git_sha?: (string | null)
|
|
13990
|
+
/**
|
|
13991
|
+
* Fallow Cloud API base URL.
|
|
13992
|
+
*/
|
|
13993
|
+
endpoint: string
|
|
13994
|
+
/**
|
|
13995
|
+
* Environment variable that holds the full API key in CI and on the server.
|
|
13996
|
+
*/
|
|
13997
|
+
api_key_env: string
|
|
13998
|
+
/**
|
|
13999
|
+
* Environment variable that holds the ingest-only browser key, when a
|
|
14000
|
+
* member runs in the browser.
|
|
14001
|
+
*/
|
|
14002
|
+
browser_key_env?: (string | null)
|
|
14003
|
+
/**
|
|
14004
|
+
* Environment variables the server snippets read the deployed commit SHA
|
|
14005
|
+
* from, in order.
|
|
14006
|
+
*/
|
|
14007
|
+
commit_sha_env: string[]
|
|
14008
|
+
ci: CoverageSetupCi
|
|
14009
|
+
source_maps: CoverageSetupSourceMaps
|
|
14010
|
+
/**
|
|
14011
|
+
* Activation endpoint that reports each setup step, or null without a
|
|
14012
|
+
* project id.
|
|
14013
|
+
*/
|
|
14014
|
+
activation_url?: (string | null)
|
|
14015
|
+
/**
|
|
14016
|
+
* Command that waits until the cloud reports every step as done.
|
|
14017
|
+
*/
|
|
14018
|
+
wait_command: string
|
|
14019
|
+
/**
|
|
14020
|
+
* Result of `--wait`, present only when the command waited.
|
|
14021
|
+
*/
|
|
14022
|
+
wait?: (CoverageSetupWait | null)
|
|
14023
|
+
}
|
|
14024
|
+
/**
|
|
14025
|
+
* CI steps of a Fallow Cloud setup plan.
|
|
14026
|
+
*/
|
|
14027
|
+
export interface CoverageSetupCi {
|
|
14028
|
+
provider: CoverageSetupCiProvider
|
|
14029
|
+
/**
|
|
14030
|
+
* Existing workflow files that look like a deploy workflow, relative to
|
|
14031
|
+
* the project root.
|
|
14032
|
+
*/
|
|
14033
|
+
workflows_detected: string[]
|
|
14034
|
+
/**
|
|
14035
|
+
* Workflow steps to add to the job that builds and deploys.
|
|
14036
|
+
*/
|
|
14037
|
+
steps: string
|
|
14038
|
+
/**
|
|
14039
|
+
* Where the steps go and what they need.
|
|
14040
|
+
*/
|
|
14041
|
+
instructions: string
|
|
14042
|
+
}
|
|
14043
|
+
/**
|
|
14044
|
+
* Source map guidance of a Fallow Cloud setup plan.
|
|
14045
|
+
*/
|
|
14046
|
+
export interface CoverageSetupSourceMaps {
|
|
14047
|
+
/**
|
|
14048
|
+
* Whether the CI steps upload source maps.
|
|
14049
|
+
*/
|
|
14050
|
+
needed: boolean
|
|
14051
|
+
/**
|
|
14052
|
+
* Build output directories the maps are uploaded from, one per bundled
|
|
14053
|
+
* workspace member, relative to the project root. Empty when no upload
|
|
14054
|
+
* is needed.
|
|
14055
|
+
*/
|
|
14056
|
+
dirs: string[]
|
|
14057
|
+
/**
|
|
14058
|
+
* Why the upload is or is not needed.
|
|
14059
|
+
*/
|
|
14060
|
+
reason: string
|
|
14061
|
+
}
|
|
14062
|
+
/**
|
|
14063
|
+
* Result of `fallow coverage setup --cloud --wait`.
|
|
14064
|
+
*/
|
|
14065
|
+
export interface CoverageSetupWait {
|
|
14066
|
+
outcome: CoverageSetupWaitOutcome
|
|
14067
|
+
/**
|
|
14068
|
+
* The last activation response body (`data`) from the cloud, unchanged,
|
|
14069
|
+
* or null when no read succeeded. New step ids and states can appear.
|
|
14070
|
+
*/
|
|
14071
|
+
activation?: {
|
|
14072
|
+
[k: string]: unknown
|
|
14073
|
+
}
|
|
14074
|
+
/**
|
|
14075
|
+
* Error text when the outcome is `error`.
|
|
14076
|
+
*/
|
|
14077
|
+
message?: (string | null)
|
|
14078
|
+
}
|
|
13771
14079
|
/**
|
|
13772
14080
|
* Envelope emitted by `fallow coverage analyze --format json`.
|
|
13773
14081
|
*/
|
|
@@ -17870,7 +18178,7 @@ affected_count: number
|
|
|
17870
18178
|
* representative files, NEVER to enumerate the blast radius or to infer its
|
|
17871
18179
|
* shape. Because it is a prefix of the sorted set, it clusters in whichever
|
|
17872
18180
|
* directory sorts first. To reconstruct the full set, run
|
|
17873
|
-
* `fallow
|
|
18181
|
+
* `fallow dead-code --impact-closure <path>` once per changed file and union the
|
|
17874
18182
|
* results: that flag seeds from a single file, so no single command
|
|
17875
18183
|
* reproduces this changeset-wide union.
|
|
17876
18184
|
*/
|
|
@@ -19911,6 +20219,7 @@ schema_version: MutationSchemaVersion
|
|
|
19911
20219
|
version: ToolVersion
|
|
19912
20220
|
elapsed_ms: ElapsedMs
|
|
19913
20221
|
completion: MutationCompletion
|
|
20222
|
+
kill_matrix: MutationKillMatrix
|
|
19914
20223
|
scope: MutationScopeOutput
|
|
19915
20224
|
/**
|
|
19916
20225
|
* The runner. Absent when no companion started, for example when no
|
|
@@ -19988,6 +20297,58 @@ status: MutationCompletionStatus
|
|
|
19988
20297
|
*/
|
|
19989
20298
|
reasons: MutationIncompleteReason[]
|
|
19990
20299
|
}
|
|
20300
|
+
/**
|
|
20301
|
+
* Redundancy signals over the observed mutants. Candidates need review.
|
|
20302
|
+
* Removing candidates together can remove all tests for a mutant.
|
|
20303
|
+
*/
|
|
20304
|
+
export interface MutationKillMatrix {
|
|
20305
|
+
status: MutationKillMatrixStatus
|
|
20306
|
+
/**
|
|
20307
|
+
* Why evidence is unavailable or incomplete, sorted.
|
|
20308
|
+
*/
|
|
20309
|
+
reasons: string[]
|
|
20310
|
+
/**
|
|
20311
|
+
* Each eligible test with observed coverage, sorted by test id.
|
|
20312
|
+
*/
|
|
20313
|
+
tests: MutationTestKillRow[]
|
|
20314
|
+
/**
|
|
20315
|
+
* Tests with nonempty kills and no unique kills, sorted by test id.
|
|
20316
|
+
*/
|
|
20317
|
+
candidates: string[]
|
|
20318
|
+
/**
|
|
20319
|
+
* Tests with coverage and no observed kills, sorted by test id.
|
|
20320
|
+
*/
|
|
20321
|
+
coverage_without_kills: string[]
|
|
20322
|
+
}
|
|
20323
|
+
/**
|
|
20324
|
+
* The observed mutant kills of one eligible test.
|
|
20325
|
+
*/
|
|
20326
|
+
export interface MutationTestKillRow {
|
|
20327
|
+
/**
|
|
20328
|
+
* The runner test id.
|
|
20329
|
+
*/
|
|
20330
|
+
test_id: string
|
|
20331
|
+
/**
|
|
20332
|
+
* The root-relative test file.
|
|
20333
|
+
*/
|
|
20334
|
+
file: string
|
|
20335
|
+
/**
|
|
20336
|
+
* The observed killed mutant ids, sorted.
|
|
20337
|
+
*/
|
|
20338
|
+
kills: string[]
|
|
20339
|
+
/**
|
|
20340
|
+
* The mutant ids that no other eligible test kills, sorted.
|
|
20341
|
+
*/
|
|
20342
|
+
unique_kills: string[]
|
|
20343
|
+
/**
|
|
20344
|
+
* The tests whose kill sets contain this full kill set, sorted.
|
|
20345
|
+
*/
|
|
20346
|
+
subsuming_tests: string[]
|
|
20347
|
+
/**
|
|
20348
|
+
* Conservative evidence notes, sorted.
|
|
20349
|
+
*/
|
|
20350
|
+
notes: string[]
|
|
20351
|
+
}
|
|
19991
20352
|
/**
|
|
19992
20353
|
* The scope of a plan or a run.
|
|
19993
20354
|
*/
|
|
@@ -20170,15 +20531,25 @@ prune_reason?: (string | null)
|
|
|
20170
20531
|
* The test that killed the mutant in this run. Absent for a kill by an
|
|
20171
20532
|
* error outside a test.
|
|
20172
20533
|
*
|
|
20173
|
-
* This is evidence of one run, not a stable fact. A run stops at
|
|
20174
|
-
* first failing test
|
|
20175
|
-
*
|
|
20534
|
+
* This is evidence of one run, not a stable fact. A normal run stops at
|
|
20535
|
+
* the first failing test. A kill matrix run retains each failing test
|
|
20536
|
+
* in `killing_tests`. Tests run in measured fastest-first order, so a
|
|
20537
|
+
* second run on the same code can name another first killer. No
|
|
20176
20538
|
* fingerprint or baseline comparison uses this field.
|
|
20177
20539
|
*
|
|
20178
20540
|
* The retry of a survivor also runs the other tests of its test files,
|
|
20179
20541
|
* so this test can be absent from `covering_tests`.
|
|
20180
20542
|
*/
|
|
20181
20543
|
killed_by?: (string | null)
|
|
20544
|
+
/**
|
|
20545
|
+
* All observed failing tests, sorted. Timeouts do not count. Empty
|
|
20546
|
+
* outside `--kill-matrix`; `killed_by` keeps the first killer.
|
|
20547
|
+
*/
|
|
20548
|
+
killing_tests: string[]
|
|
20549
|
+
/**
|
|
20550
|
+
* True only for exact requested membership with terminal pass or fail results.
|
|
20551
|
+
*/
|
|
20552
|
+
kill_matrix_complete: boolean
|
|
20182
20553
|
/**
|
|
20183
20554
|
* The tests that reached the mutant in the dry run, sorted by test id.
|
|
20184
20555
|
*/
|
|
@@ -20287,6 +20658,15 @@ duration_ms?: (number | null)
|
|
|
20287
20658
|
* The test that killed the mutant in this run.
|
|
20288
20659
|
*/
|
|
20289
20660
|
killed_by?: (string | null)
|
|
20661
|
+
/**
|
|
20662
|
+
* All observed failing tests, sorted. Timeouts do not count. Empty
|
|
20663
|
+
* outside `--kill-matrix`; `killed_by` keeps the first killer.
|
|
20664
|
+
*/
|
|
20665
|
+
killing_tests: string[]
|
|
20666
|
+
/**
|
|
20667
|
+
* True only for exact requested membership with terminal pass or fail results.
|
|
20668
|
+
*/
|
|
20669
|
+
kill_matrix_complete: boolean
|
|
20290
20670
|
/**
|
|
20291
20671
|
* How the run detected the mutant. Absent for a run that did not detect
|
|
20292
20672
|
* it, and absent when the runner did not state the kind.
|
|
@@ -20753,6 +21133,15 @@ static_test_files: string[]
|
|
|
20753
21133
|
* The test that killed the mutant in the run of the report.
|
|
20754
21134
|
*/
|
|
20755
21135
|
killed_by?: (string | null)
|
|
21136
|
+
/**
|
|
21137
|
+
* All observed failing tests, sorted. Timeouts do not count. Empty
|
|
21138
|
+
* outside `--kill-matrix`; `killed_by` keeps the first killer.
|
|
21139
|
+
*/
|
|
21140
|
+
killing_tests: string[]
|
|
21141
|
+
/**
|
|
21142
|
+
* True only for exact requested membership with terminal pass or fail results.
|
|
21143
|
+
*/
|
|
21144
|
+
kill_matrix_complete: boolean
|
|
20756
21145
|
}
|
|
20757
21146
|
/**
|
|
20758
21147
|
* The code of one mutant, from the current file.
|