fallow 3.22.0 → 3.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/capabilities.json +110 -7
- package/package.json +11 -11
- package/schema.json +1 -1
- package/scripts/lazy-verify.js +3 -2
- package/scripts/verify-binary.js +9 -6
- package/skills/fallow/SKILL.md +14 -119
- package/skills/fallow/references/cli-reference.md +84 -17
- package/skills/fallow/references/issue-types.md +79 -0
- package/skills/fallow/references/mcp.md +5 -0
- package/types/output-contract.d.ts +796 -45
package/capabilities.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.24.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": [
|
|
@@ -875,7 +875,7 @@
|
|
|
875
875
|
"name": "--top",
|
|
876
876
|
"type": "string",
|
|
877
877
|
"required": false,
|
|
878
|
-
"description": "Show only the top N items per category"
|
|
878
|
+
"description": "Show only the top N items per category. Human output only: the JSON, SARIF, and CodeClimate envelopes drive exit codes and CI baselines, so they always carry every finding and a consumer slices the arrays itself"
|
|
879
879
|
},
|
|
880
880
|
{
|
|
881
881
|
"name": "--file",
|
|
@@ -906,6 +906,11 @@
|
|
|
906
906
|
"description": "Inspect the optional TypeScript semantic companion",
|
|
907
907
|
"flags": []
|
|
908
908
|
},
|
|
909
|
+
{
|
|
910
|
+
"name": "doctor",
|
|
911
|
+
"description": "Diagnose project readiness without analysis or mutation",
|
|
912
|
+
"flags": []
|
|
913
|
+
},
|
|
909
914
|
{
|
|
910
915
|
"name": "similar-code",
|
|
911
916
|
"description": "Find semantically similar functions with a pinned local model (opt-in)",
|
|
@@ -976,13 +981,19 @@
|
|
|
976
981
|
},
|
|
977
982
|
{
|
|
978
983
|
"name": "trace",
|
|
979
|
-
"description": "Trace a symbol's call chain (best-effort, syntactic; OFF the ranked path)",
|
|
984
|
+
"description": "Trace a symbol's call chain, or the shortest import path between two modules (best-effort, syntactic; OFF the ranked path)",
|
|
980
985
|
"flags": [
|
|
981
986
|
{
|
|
982
987
|
"name": "symbol",
|
|
983
988
|
"type": "string",
|
|
984
|
-
"required":
|
|
985
|
-
"description": "Target symbol, formatted as FILE:SYMBOL (e.g. src/utils.ts:formatDate)"
|
|
989
|
+
"required": false,
|
|
990
|
+
"description": "Target symbol, formatted as FILE:SYMBOL (e.g. src/utils.ts:formatDate). Omitted when `--path` is used"
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
"name": "--path",
|
|
994
|
+
"type": "string",
|
|
995
|
+
"required": false,
|
|
996
|
+
"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"
|
|
986
997
|
},
|
|
987
998
|
{
|
|
988
999
|
"name": "--callers",
|
|
@@ -1012,6 +1023,18 @@
|
|
|
1012
1023
|
}
|
|
1013
1024
|
]
|
|
1014
1025
|
},
|
|
1026
|
+
{
|
|
1027
|
+
"name": "trace-error",
|
|
1028
|
+
"description": "Resolve a runtime stack trace's frames to the definitions they name (best-effort, syntactic; OFF the ranked path)",
|
|
1029
|
+
"flags": [
|
|
1030
|
+
{
|
|
1031
|
+
"name": "trace_file",
|
|
1032
|
+
"type": "string",
|
|
1033
|
+
"required": false,
|
|
1034
|
+
"description": "Stack trace file, or `-` to read stdin. Defaults to stdin. A relative path is resolved against the project root, matching `--diff-file`"
|
|
1035
|
+
}
|
|
1036
|
+
]
|
|
1037
|
+
},
|
|
1015
1038
|
{
|
|
1016
1039
|
"name": "fix",
|
|
1017
1040
|
"description": "Auto-fix issues: remove unused exports, dependencies, and enum members; add duplicate-export rules to a fallow config file",
|
|
@@ -1328,7 +1351,17 @@
|
|
|
1328
1351
|
"name": "--top",
|
|
1329
1352
|
"type": "string",
|
|
1330
1353
|
"required": false,
|
|
1331
|
-
"description": "Show only the N highest-ranked clone groups. Ranking combines clone size, occurrence count, and capped directory or line spread"
|
|
1354
|
+
"description": "Show only the N highest-ranked clone groups. Ranking combines clone size, occurrence count, and capped directory or line spread. `clone_families[]` is rebuilt from the groups that survive, so it narrows too. `stats` keeps describing the whole corpus; `clone_groups_shown` / `clone_groups_omitted` and `clone_families_shown` / `clone_families_omitted` report the split. Refused with exit code 2 alongside `--group-by`: grouped output reports per-bucket stats over every clone group in the bucket, which a global top-N truncation would silently contradict"
|
|
1355
|
+
},
|
|
1356
|
+
{
|
|
1357
|
+
"name": "--no-fragments",
|
|
1358
|
+
"type": "bool",
|
|
1359
|
+
"required": false,
|
|
1360
|
+
"description": "Omit the verbatim source text from each clone instance in `--format json`. The file and line/column range still address the same code, and this is most of the payload on a duplicated codebase",
|
|
1361
|
+
"possible_values": [
|
|
1362
|
+
"true",
|
|
1363
|
+
"false"
|
|
1364
|
+
]
|
|
1332
1365
|
},
|
|
1333
1366
|
{
|
|
1334
1367
|
"name": "--trace",
|
|
@@ -6022,7 +6055,7 @@
|
|
|
6022
6055
|
"FALLOW_RUNTIME_COVERAGE_SOURCE": "Set to cloud to select cloud runtime coverage in fallow coverage analyze without passing --cloud.",
|
|
6023
6056
|
"FALLOW_REPO": "owner/repo fallback for fallow coverage analyze --cloud when --repo is not passed (otherwise parsed from the git origin remote).",
|
|
6024
6057
|
"FALLOW_API_URL": "Base URL override for fallow cloud API calls (license refresh, trial, coverage uploads).",
|
|
6025
|
-
"FALLOW_API_KEY": "fallow cloud bearer token for coverage upload commands.",
|
|
6058
|
+
"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.",
|
|
6026
6059
|
"FALLOW_CA_BUNDLE": "Path to a PEM certificate bundle for fallow cloud and provider HTTP calls (replaces the default WebPKI roots).",
|
|
6027
6060
|
"FALLOW_UPDATE_CHECK": "Set to off/0/false to disable the human-TTY upgrade nudge and its background version check.",
|
|
6028
6061
|
"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.",
|
|
@@ -6749,6 +6782,23 @@
|
|
|
6749
6782
|
"read_only": true,
|
|
6750
6783
|
"code_mode_alias": "getCleanupCandidates"
|
|
6751
6784
|
},
|
|
6785
|
+
{
|
|
6786
|
+
"name": "get_cloud_runtime_context",
|
|
6787
|
+
"kind": "runtime-coverage",
|
|
6788
|
+
"description": "Runtime coverage pulled from fallow cloud for a repository, merged into the same runtime_coverage block the local runtime-coverage tools return",
|
|
6789
|
+
"cli_command": "fallow coverage analyze --cloud --repo <owner/repo> --format json --quiet",
|
|
6790
|
+
"key_params": [
|
|
6791
|
+
"repo",
|
|
6792
|
+
"period_days",
|
|
6793
|
+
"environment",
|
|
6794
|
+
"commit_sha",
|
|
6795
|
+
"top"
|
|
6796
|
+
],
|
|
6797
|
+
"license": "freemium",
|
|
6798
|
+
"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.",
|
|
6799
|
+
"read_only": true,
|
|
6800
|
+
"code_mode_alias": null
|
|
6801
|
+
},
|
|
6752
6802
|
{
|
|
6753
6803
|
"name": "get_token_blast_radius",
|
|
6754
6804
|
"kind": "analysis",
|
|
@@ -6989,6 +7039,33 @@
|
|
|
6989
7039
|
"read_only": true,
|
|
6990
7040
|
"code_mode_alias": "traceFile"
|
|
6991
7041
|
},
|
|
7042
|
+
{
|
|
7043
|
+
"name": "trace_import_path",
|
|
7044
|
+
"kind": "trace",
|
|
7045
|
+
"description": "Trace the shortest import path between two modules, hop by hop",
|
|
7046
|
+
"cli_command": "fallow trace --path <from> <to> --format json --quiet",
|
|
7047
|
+
"key_params": [
|
|
7048
|
+
"from",
|
|
7049
|
+
"to"
|
|
7050
|
+
],
|
|
7051
|
+
"license": "free",
|
|
7052
|
+
"license_note": null,
|
|
7053
|
+
"read_only": true,
|
|
7054
|
+
"code_mode_alias": null
|
|
7055
|
+
},
|
|
7056
|
+
{
|
|
7057
|
+
"name": "trace_error",
|
|
7058
|
+
"kind": "trace",
|
|
7059
|
+
"description": "Resolve a runtime stack trace's frames against the project graph",
|
|
7060
|
+
"cli_command": "fallow trace-error - --format json --quiet",
|
|
7061
|
+
"key_params": [
|
|
7062
|
+
"trace"
|
|
7063
|
+
],
|
|
7064
|
+
"license": "free",
|
|
7065
|
+
"license_note": null,
|
|
7066
|
+
"read_only": true,
|
|
7067
|
+
"code_mode_alias": null
|
|
7068
|
+
},
|
|
6992
7069
|
{
|
|
6993
7070
|
"name": "impact_closure",
|
|
6994
7071
|
"kind": "trace",
|
|
@@ -7094,6 +7171,22 @@
|
|
|
7094
7171
|
"mime_type": "application/json",
|
|
7095
7172
|
"template": false
|
|
7096
7173
|
},
|
|
7174
|
+
{
|
|
7175
|
+
"uri": "fallow://schema/similar-code-snapshot",
|
|
7176
|
+
"name": "schema-similar-code-snapshot",
|
|
7177
|
+
"title": "Similar-code snapshot JSON Schema",
|
|
7178
|
+
"description": "JSON Schema of the inspect_similar_code `snapshot` object: the bounded candidate handoff find_similar_code returns, passed back unchanged",
|
|
7179
|
+
"mime_type": "application/json",
|
|
7180
|
+
"template": false
|
|
7181
|
+
},
|
|
7182
|
+
{
|
|
7183
|
+
"uri": "fallow://tools/{name}",
|
|
7184
|
+
"name": "tool-guide",
|
|
7185
|
+
"title": "Long-form guide for one tool",
|
|
7186
|
+
"description": "Per-flag detail for one MCP tool (payload shapes, unit vocabularies, suppression placements) kept out of its tools/list description; name is the wire tool name. Not every tool has a guide",
|
|
7187
|
+
"mime_type": "application/json",
|
|
7188
|
+
"template": true
|
|
7189
|
+
},
|
|
7097
7190
|
{
|
|
7098
7191
|
"uri": "fallow://explain/{issue_type}",
|
|
7099
7192
|
"name": "explain-issue-type",
|
|
@@ -7246,6 +7339,11 @@
|
|
|
7246
7339
|
"command": "fallow dead-code --type-aware --symbol-impact <file>:<export-or-class.method>",
|
|
7247
7340
|
"note": null
|
|
7248
7341
|
},
|
|
7342
|
+
{
|
|
7343
|
+
"task": "find how one module reaches another",
|
|
7344
|
+
"command": "fallow trace --path <from> <to>",
|
|
7345
|
+
"note": "Reports `reachable: false` instead of failing when no import path exists; type-only hops are reported, not skipped."
|
|
7346
|
+
},
|
|
7249
7347
|
{
|
|
7250
7348
|
"task": "delete an \"unused\" dependency",
|
|
7251
7349
|
"command": "fallow dead-code --trace-dependency <name>",
|
|
@@ -7256,6 +7354,11 @@
|
|
|
7256
7354
|
"command": "fallow audit --base <ref>",
|
|
7257
7355
|
"note": null
|
|
7258
7356
|
},
|
|
7357
|
+
{
|
|
7358
|
+
"task": "read a diff before approving it",
|
|
7359
|
+
"command": "fallow review --base <ref> --brief",
|
|
7360
|
+
"note": "orientation, never gates: deterministic and always exit 0, unlike the audit row"
|
|
7361
|
+
},
|
|
7259
7362
|
{
|
|
7260
7363
|
"task": "prioritize refactoring",
|
|
7261
7364
|
"command": "fallow health --hotspots --targets",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.24.0",
|
|
4
4
|
"mcpName": "io.github.fallow-rs/fallow",
|
|
5
5
|
"description": "Codebase intelligence for TypeScript and JavaScript. Free static analysis of code and styles, optional paid runtime intelligence (Fallow Runtime). Quality, risk, architecture, dependencies, duplication, and design-system drift for humans, CI, and the agents writing your code. Zero-config framework support.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -85,17 +85,17 @@
|
|
|
85
85
|
"detect-libc": "2.1.2"
|
|
86
86
|
},
|
|
87
87
|
"devDependencies": {
|
|
88
|
-
"@tanstack/intent": "0.3.
|
|
88
|
+
"@tanstack/intent": "0.3.8"
|
|
89
89
|
},
|
|
90
90
|
"optionalDependencies": {
|
|
91
|
-
"@fallow-cli/darwin-arm64": "3.
|
|
92
|
-
"@fallow-cli/darwin-x64": "3.
|
|
93
|
-
"@fallow-cli/linux-x64-gnu": "3.
|
|
94
|
-
"@fallow-cli/linux-arm64-gnu": "3.
|
|
95
|
-
"@fallow-cli/linux-x64-musl": "3.
|
|
96
|
-
"@fallow-cli/linux-arm64-musl": "3.
|
|
97
|
-
"@fallow-cli/win32-arm64-msvc": "3.
|
|
98
|
-
"@fallow-cli/win32-x64-msvc": "3.
|
|
99
|
-
"fallow-type-aware": "3.
|
|
91
|
+
"@fallow-cli/darwin-arm64": "3.24.0",
|
|
92
|
+
"@fallow-cli/darwin-x64": "3.24.0",
|
|
93
|
+
"@fallow-cli/linux-x64-gnu": "3.24.0",
|
|
94
|
+
"@fallow-cli/linux-arm64-gnu": "3.24.0",
|
|
95
|
+
"@fallow-cli/linux-x64-musl": "3.24.0",
|
|
96
|
+
"@fallow-cli/linux-arm64-musl": "3.24.0",
|
|
97
|
+
"@fallow-cli/win32-arm64-msvc": "3.24.0",
|
|
98
|
+
"@fallow-cli/win32-x64-msvc": "3.24.0",
|
|
99
|
+
"fallow-type-aware": "3.24.0"
|
|
100
100
|
}
|
|
101
101
|
}
|
package/schema.json
CHANGED
|
@@ -905,7 +905,7 @@
|
|
|
905
905
|
"type": "array",
|
|
906
906
|
"items": {
|
|
907
907
|
"type": "string",
|
|
908
|
-
"pattern": "^dup:(?:[0-9a-f]{8}|[0-9a-f]{16}(?:-[1-9][0-9]*)?):(?:[2-9]|[1-9][0-9]+)$"
|
|
908
|
+
"pattern": "^dup:(?:[0-9a-f]{8}|[0-9a-f]{16}(?:-r?[1-9][0-9]*)?):(?:[2-9]|[1-9][0-9]+)$"
|
|
909
909
|
},
|
|
910
910
|
"default": []
|
|
911
911
|
},
|
package/scripts/lazy-verify.js
CHANGED
|
@@ -27,8 +27,9 @@ const { resolveSentinelPath } = require("./sentinel-path");
|
|
|
27
27
|
const { verifyInstalledSync, SKIP_ENV } = require("./verify-binary");
|
|
28
28
|
|
|
29
29
|
// Bumped to 2 when SHA-256 + platformPkgDir binding landed (closes the
|
|
30
|
-
// cross-install reuse gap in the shared $XDG fallback cache)
|
|
31
|
-
//
|
|
30
|
+
// cross-install reuse gap in the shared $XDG fallback cache), and to 3 when
|
|
31
|
+
// the sentinel started tracking fallow-similar-code alongside the multicall
|
|
32
|
+
// CLI. Sentinels written under an older schema are invalidated automatically.
|
|
32
33
|
const SENTINEL_SCHEMA_VERSION = 3;
|
|
33
34
|
const VERIFY_LOG_ENV = "FALLOW_VERIFY_LOG";
|
|
34
35
|
|
package/scripts/verify-binary.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// by `.github/scripts/sign-binary.mjs` using the workflow's
|
|
7
7
|
// ED25519_BINARY_SIGNING_PRIVATE_KEY secret. The matching public key (32 raw
|
|
8
8
|
// bytes) is embedded below and is identical to the value already trusted by
|
|
9
|
-
// the VS Code extension at editors/vscode/src/download.ts
|
|
9
|
+
// the VS Code extension at editors/vscode/src/download.ts.
|
|
10
10
|
//
|
|
11
11
|
// SHA-256 digest source (in order of preference, refs #465 and #597):
|
|
12
12
|
// 1. `fallowDigests` field in the platform package's package.json, written
|
|
@@ -18,9 +18,12 @@
|
|
|
18
18
|
// pooled GHA runners) can exceed the 60 req/hr unauthenticated limit;
|
|
19
19
|
// that failure mode is what motivated #597.
|
|
20
20
|
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// is
|
|
21
|
+
// Reached from scripts/lazy-verify.js on every bin/fallow, bin/fallow-lsp and
|
|
22
|
+
// bin/fallow-mcp invocation, and from the GitHub Action installer at
|
|
23
|
+
// action/scripts/install.sh. There is no postinstall hook: npm RFC 868 made
|
|
24
|
+
// lifecycle scripts unreliable, and a CI gate fails the build if
|
|
25
|
+
// scripts/postinstall.js reappears in the packed tarball. The escape hatch
|
|
26
|
+
// FALLOW_SKIP_BINARY_VERIFY=1 is documented in SECURITY.md.
|
|
24
27
|
//
|
|
25
28
|
// No external dependencies: uses node:crypto and node:fs only.
|
|
26
29
|
|
|
@@ -34,7 +37,7 @@ const GITHUB_REPO = "fallow-rs/fallow";
|
|
|
34
37
|
const DIGEST_TIMEOUT_MS = 10000;
|
|
35
38
|
|
|
36
39
|
// 32-byte Ed25519 public key, identical to BINARY_SIGNING_PUBLIC_KEY in
|
|
37
|
-
// editors/vscode/src/download.ts
|
|
40
|
+
// editors/vscode/src/download.ts and to the ED25519_BINARY_SIGNING_PUBLIC_KEY
|
|
38
41
|
// repo variable on fallow-rs/fallow. Embedded rather than fetched so verification
|
|
39
42
|
// works offline and cannot be silently downgraded by tampering with the network
|
|
40
43
|
// path.
|
|
@@ -501,7 +504,7 @@ async function verifyOneBinary(target, dir, pkg, manifestPath, verifyFn, digestP
|
|
|
501
504
|
}
|
|
502
505
|
|
|
503
506
|
// Locate the platform package the wrapper would use at runtime and verify
|
|
504
|
-
//
|
|
507
|
+
// every binary binaryTargetsForPlatform lists. Returns the same result shape as
|
|
505
508
|
// verifyBinaryAt, with `binary` populated on failure so callers can produce
|
|
506
509
|
// a useful error.
|
|
507
510
|
//
|
package/skills/fallow/SKILL.md
CHANGED
|
@@ -66,8 +66,10 @@ Route by intent before reaching for the big analysis commands. Same matrix as `f
|
|
|
66
66
|
|---|---|
|
|
67
67
|
| delete an "unused" export or file | `fallow dead-code --trace <file>:<export>` |
|
|
68
68
|
| prove a TypeScript symbol's exact consumers before refactoring | `fallow dead-code --type-aware --symbol-impact <file>:<export-or-class.method>` |
|
|
69
|
+
| find how one module reaches another | `fallow trace --path <from> <to>`; Reports `reachable: false` instead of failing when no import path exists; type-only hops are reported, not skipped. |
|
|
69
70
|
| delete an "unused" dependency | `fallow dead-code --trace-dependency <name>` |
|
|
70
71
|
| commit or open a PR | `fallow audit --base <ref>` |
|
|
72
|
+
| read a diff before approving it | `fallow review --base <ref> --brief`; orientation, never gates: deterministic and always exit 0, unlike the audit row |
|
|
71
73
|
| prioritize refactoring | `fallow health --hotspots --targets` |
|
|
72
74
|
| ask who owns code | `fallow health --ownership` |
|
|
73
75
|
| check untested-but-reachable code | `fallow health --coverage-gaps` |
|
|
@@ -80,126 +82,18 @@ Route by intent before reaching for the big analysis commands. Same matrix as `f
|
|
|
80
82
|
<!-- generated:task-matrix:end -->
|
|
81
83
|
|
|
82
84
|
## Commands
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
| `dead-code` | Dead code analysis (`check` is an alias) | `--unused-exports`, `--changed-since`, `--changed-workspaces`, `--production`, `--file`, `--include-entry-exports`, `--stale-suppressions`, `--ci`, `--group-by`, `--summary`, `--fail-on-regression`, `--tolerance`, `--regression-baseline`, `--save-regression-baseline` |
|
|
88
|
-
| `watch` | Watch for changes and re-run analysis | `--no-clear` |
|
|
89
|
-
| `type-aware` | Inspect the optional TypeScript semantic companion | |
|
|
90
|
-
| `similar-code` | Find semantically similar functions with a pinned local model (opt-in) | `--threshold`, `--min-lines`, `--top`, `--file` |
|
|
91
|
-
| `inspect` | Compose one evidence bundle for a file or exported symbol | `--file <path>`, `--symbol <file>:<export>` |
|
|
92
|
-
| `trace` | Trace a symbol's call chain (best-effort, syntactic; OFF the ranked path) | `symbol`, `--callers`, `--callees`, `--depth` |
|
|
93
|
-
| `fix` | Auto-remove unused exports/deps | `--dry-run`, `--yes` (required in non-TTY) |
|
|
94
|
-
| `init` | Generate config file, AGENTS.md agent guide, or pre-commit hook | `--toml`, `--agents`, `--hooks`, `--branch` |
|
|
95
|
-
| `hooks` | Inspect, install, or remove fallow-managed Git and agent hooks | `status`, `install --target git`, `install --target agent`, `uninstall --target git`, `uninstall --target agent` |
|
|
96
|
-
| `agent` | Wire fallow into Claude Code, Codex, or Cursor in one pass: AGENTS.md task map, skill, MCP server, commit/push gate; `status` and `uninstall` cover the same surfaces | `install --harness auto\|claude\|codex\|cursor`, `install --dry-run`, `install --approve`, `install --without <guide\|skill\|mcp\|hooks>`, `status`, `uninstall` |
|
|
97
|
-
| `ci` | CI helpers for PR/MR feedback envelopes | |
|
|
98
|
-
| `ci reconcile-review` | Resolve stale review threads on a PR/MR by joining a typed review envelope (`--format review-github` / `review-gitlab`) against the provider's existing comments + threads. Posts an idempotent "Resolved in `<sha>`" follow-up per stale fingerprint, marker keyed on (fingerprint, short-sha) so re-runs on the same commit don't duplicate. Provider mutations are fail-fast; JSON can include `apply_hint`, `failed_fingerprints`, and `unapplied_fingerprints` when `apply_errors` is non-empty. | `--provider`, `--pr` (GH) / `--mr` (GL), `--repo` / `--project-id`, `--api-url`, `--envelope`, `--dry-run` |
|
|
99
|
-
| `config-schema` | Print the JSON Schema for fallow configuration files | |
|
|
100
|
-
| `plugin-schema` | Print the JSON Schema for external plugin files | |
|
|
101
|
-
| `plugin-check` | Dry-run external plugins: reports activation + what each `manifestEntries` rule matched/seeded/warned. Verify a `fallow-plugin-*.jsonc` before a full run. Always exits 0. | `--format json`, `--root` |
|
|
102
|
-
| `rule-pack-schema` | Print the JSON Schema for rule pack files | |
|
|
103
|
-
| `rule-pack` | Manage declarative rule packs (policy-as-code) | |
|
|
104
|
-
| `guard` | Show which architecture rules apply to files before changing them | `files` |
|
|
105
|
-
| `config` | Show the loaded config path and resolved config (verifies which `.fallowrc.json` is in effect) | `--path` |
|
|
106
|
-
| `recommend` | Recommend a project-tailored config for an agent to author | |
|
|
107
|
-
| `list` | Inspect project structure | `--files`, `--entry-points`, `--plugins`, `--boundaries`, `--workspaces` |
|
|
108
|
-
| `workspaces` | Inspect monorepo workspaces + discovery diagnostics (shorthand for `list --workspaces`) | (no flags) |
|
|
109
|
-
| `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` |
|
|
110
|
-
| `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` |
|
|
111
|
-
| `flags` | Detect feature flag patterns (env vars, SDK calls, config objects) | `--top` |
|
|
112
|
-
| `suppressions` | List active fallow-ignore suppression markers (read-only inventory) | `--file` |
|
|
113
|
-
| `explain` | Explain one issue type without running analysis | `<issue-type>`, `--format json` |
|
|
114
|
-
| `audit` | Combined dead-code + complexity + duplication + styling for changed files, returns a verdict; `fallow review` is an alias for `fallow audit --brief` (advisory orientation brief, always exits 0) | `--base`, `--gate`, `--brief`, `--max-decisions`, `--walkthrough-guide`, `--walkthrough-file`, `--show-deprioritized`, `--production`, `--production-dead-code`, `--production-health`, `--production-dupes`, `--workspace`, `--changed-workspaces`, `--ci`, `--fail-on-issues`, `--explain`, `--explain-skipped`, `--dead-code-baseline`, `--health-baseline`, `--dupes-baseline`, `--max-crap`, `--coverage`, `--coverage-root`, `--no-css`, `--css-deep`, `--no-css-deep`, `--include-entry-exports` |
|
|
115
|
-
| `audit-cache` | Maintain reusable audit base-snapshot caches | |
|
|
116
|
-
| `decision-surface` | Surface the consequential structural DECISIONS a change embeds (the apex of the review brief), each framed as a judgment question with the routed expert to ask | `--max-decisions` |
|
|
117
|
-
| `impact` | Show what fallow has done for you: how many issues it is surfacing, the trend since the last recorded run, and how many commits it contained at the pre-commit gate | `--all`, `--sort`, `--limit` |
|
|
118
|
-
| `security` | Surface opt-in local security candidates for agent verification (not confirmed vulnerabilities). Rule families include the graph rule `client-server-leak`, a data-driven `tainted-sink` catalogue, and the include-required `hardcoded-secret` category for provider-prefix credentials and high-entropy literals assigned to secret-shaped identifiers. Most catalogue rows require non-literal input; narrowly literal-aware rows flag deterministic unsafe literals. Rules default off; suppress a file with `// fallow-ignore-file security-sink`; scope categories with `security.categories`. Add project-local request object names with `security.requestReceivers`; it extends the built-in `req` / `request` / `ctx` / `context` / `event` allowlist for HTTP `query`, `params`, and `body` reads. `hardcoded-secret` runs only when listed in `security.categories.include`. | `--format human\|json\|sarif`, `--changed-since`, `--file`, `--diff-file`, `--workspace`, `--changed-workspaces`, `--surface`, `--ci`, `--fail-on-issues`, `--sarif-file`, `--summary` |
|
|
119
|
-
| `report` | Render a saved `--format json` results file in another format without re-running analysis (analyze once, render annotations and the job summary from the same file). | `--from` |
|
|
120
|
-
| `schema` | Dump CLI definition as JSON | |
|
|
121
|
-
| `ci-template` | Print or vendor CI integration templates | |
|
|
122
|
-
| `migrate` | Convert knip/jscpd config | `--dry-run`, `--from PATH` |
|
|
123
|
-
| `license` | Manage the local license JWT for continuous/cloud runtime monitoring (activate, status, refresh, deactivate) | `activate --trial --email <addr>`, `activate --from-file`, `activate --stdin`, `status`, `refresh`, `deactivate` |
|
|
124
|
-
| `telemetry` | Manage opt-in, off-by-default product telemetry (never collects code, paths, or names). Agents must not enable it; only the user may | `status`, `enable`, `disable`, `inspect --example` |
|
|
125
|
-
| `coverage` | Runtime coverage setup, focused analysis, and cloud inventory workflow helper | `setup`, `setup --yes`, `setup --non-interactive`, `analyze --runtime-coverage <path>`, `analyze --cloud --repo owner/repo`, `upload-inventory` |
|
|
126
|
-
| `coverage upload-source-maps` | Upload build source maps from CI so bundled runtime coverage resolves to original source paths. Retries 429 `Retry-After` and transient gateway failures. Use `FALLOW_CA_BUNDLE` for complete custom PEM trust bundles. | `--dir dist`, `--git-sha <sha>`, `--repo <name>`, `--strip-path=false`, `--dry-run` |
|
|
127
|
-
| `setup-hooks` | Deprecated (removed in the next major): use `agent install` or `hooks install --target agent`; still installs the Claude Code PreToolUse gate with a stderr warning | `--agent`, `--dry-run`, `--force`, `--user`, `--gitignore-claude`, `--uninstall` |
|
|
128
|
-
| `viz` | Render the codebase as a self-contained interactive HTML map (treemap + import graph) with six primary lenses (Overview, Unused, Duplication, Architecture, Health, Security) and Dependencies, Frameworks, Styling, and Feature flags under an adaptive More menu, each with click-through detail panels. Every lens carries an availability state (complete, disabled, not applicable, unavailable) next to its count, so an analysis that did not run reads as missing data instead of as zero findings. Or emit the import graph as text. Read-only. | `--out <path>`, `--no-open`, `--viz-format html\|dot\|mermaid`, `--root`, `--config`, `--production`, `--no-cache` |
|
|
129
|
-
|
|
130
|
-
Run `fallow <command> --help` for the full flag list per command (see also references/cli-reference.md).
|
|
131
|
-
<!-- generated:commands:end -->
|
|
85
|
+
|
|
86
|
+
`fallow <command> --help` prints the live flag list for any command; `fallow schema` dumps the whole CLI definition as JSON.
|
|
87
|
+
|
|
88
|
+
Full command catalogue, one row per command: **[references/cli-reference.md](references/cli-reference.md)**.
|
|
132
89
|
|
|
133
90
|
## Issue Types
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
| `private-type-leak` | `--private-type-leaks` | - | `// fallow-ignore-next-line private-type-leak` | Opt-in API hygiene check (default `off`) for exported signatures whose type references a same-file private type |
|
|
141
|
-
| `unused-dependency` | `--unused-deps` | yes | - | Packages in `dependencies` never imported. In monorepos, internal workspace package names (e.g., `@repo/ui`) declared in another workspace's `package.json` but never imported are reported here too. `--unused-deps` also covers the dev/optional/type-only/test-only sibling rows below. |
|
|
142
|
-
| `unused-dev-dependency` | `--unused-deps` | yes | - | Packages in `devDependencies` never imported by test files, config files, or scripts |
|
|
143
|
-
| `unused-optional-dependency` | `--unused-deps` | yes | - | Packages in `optionalDependencies` never imported (often platform-specific; verify before removing) |
|
|
144
|
-
| `type-only-dependency` | `--unused-deps` | - | - | Production dependency only used via type-only imports; Only reported in --production mode; --unused-deps scopes it together with the other dependency kinds |
|
|
145
|
-
| `test-only-dependency` | `--unused-deps` | - | - | Production deps only imported from test files (should be devDependencies) |
|
|
146
|
-
| `dev-dependency-in-production` | `--unused-deps` | - | - | devDependency imported by production code with a runtime import |
|
|
147
|
-
| `unused-enum-member` | `--unused-enum-members` | yes | `// fallow-ignore-next-line unused-enum-member` | Enum values never referenced |
|
|
148
|
-
| `unused-class-member` | `--unused-class-members` | - | `// fallow-ignore-next-line unused-class-member` | Methods and properties |
|
|
149
|
-
| `unused-store-member` | `--unused-store-members` | - | `// fallow-ignore-next-line unused-store-member` | Pinia store state/getter/action (needs `pinia` dep) |
|
|
150
|
-
| `unresolved-import` | `--unresolved-imports` | - | `// fallow-ignore-next-line unresolved-import` | Imports that can't be resolved |
|
|
151
|
-
| `unlisted-dependency` | `--unlisted-deps` | - | - | Used packages missing from package.json. In monorepos, importing a workspace package from a workspace whose own `package.json` does not list it is reported here too; self-references stay allowed without requiring a package to depend on itself. |
|
|
152
|
-
| `duplicate-export` | `--duplicate-exports` | - | `// fallow-ignore-file duplicate-export` | Same symbol exported from multiple modules |
|
|
153
|
-
| `circular-dependency` | `--circular-deps` | - | `// fallow-ignore-next-line circular-dependency` | Import cycles in the module graph |
|
|
154
|
-
| `re-export-cycle` | `--re-export-cycles` | - | `// fallow-ignore-file re-export-cycle` | Barrel files re-exporting from each other in a loop (`kind: "multi-node"`) or a barrel re-exporting from itself (`kind: "self-loop"`). Chain propagation through the loop is a structural no-op so imports through any member may silently come up empty. Default `warn`. Distinct from `circular-dependencies` (runtime cycles, sometimes intentional). File-scoped suppression only: `// fallow-ignore-file re-export-cycle` on any member breaks the cycle. |
|
|
155
|
-
| `boundary-violation` | `--boundary-violations` | - | `// fallow-ignore-next-line boundary-violation` | Imports crossing architecture zone boundaries. Presets: `layered`, `hexagonal`, `feature-sliced`, `bulletproof`; `autoDiscover` can create one zone per feature directory; per-rule `allowTypeOnly: [zones]` admits `import type` / `export type` crossings while still blocking value imports. Optional sections: `boundaries.coverage.requireAllFiles` reports unzoned source files (`allowUnmatched` globs exempt intentional ones), and `boundaries.calls.forbidden` bans callee patterns per zone (segment-aware and import-resolved, so `child_process.*` covers `node:child_process` named/namespace/default imports; direct callees only, zoned files only). The whole family shares the `boundary-violation` rule and suppression token (`boundary-call-violation` and `boundary-call-violations` accepted as aliases); start the rule at `warn` for a staged rollout |
|
|
156
|
-
| `boundary-coverage` | `--boundary-violations` | - | `// fallow-ignore-file boundary-violation` | Source file matches no configured architecture boundary zone; Requires boundaries.coverage.requireAllFiles |
|
|
157
|
-
| `boundary-call-violation` | `--boundary-violations` | - | `// fallow-ignore-next-line boundary-call-violation` | Zoned file calls a callee its zone forbids; Requires boundaries.calls.forbidden patterns |
|
|
158
|
-
| `policy-violation` | `--policy-violations` | - | `// fallow-ignore-next-line policy-violation` | Calls, imports, or catalogue-derived effects banned by a declarative rule pack (`rulePacks` config key lists standalone JSON/JSONC files of `banned-call`, `banned-import`, and `banned-effect` rules; pure data, no project code executes). Findings identified as `<pack>/<rule-id>`. Default `warn` master; per-rule `severity` overrides per finding and the exit gate reads the effective severity. Invalid or missing packs fail config load with exit 2. `fallow rule-pack-schema` prints the pack JSON Schema. Use the scoped token to suppress one rule; bare `policy-violation` still covers every pack rule on the line or file. |
|
|
159
|
-
| `stale-suppression` | `--stale-suppressions` | - | - | `fallow-ignore` comments or `@expected-unused` JSDoc tags that no longer match any issue |
|
|
160
|
-
| `missing-suppression-reason` | `--stale-suppressions` | - | - | Suppression comment omits a required reason |
|
|
161
|
-
| `unused-catalog-entry` | `--unused-catalog-entries` | yes | - | `pnpm-workspace.yaml` entries no workspace package.json references via `catalog:` (default `warn`) |
|
|
162
|
-
| `empty-catalog-group` | `--empty-catalog-groups` | - | - | Named `catalogs.<name>:` groups in `pnpm-workspace.yaml` with no entries. Top-level `catalog:` placeholders are ignored. Default `warn`. |
|
|
163
|
-
| `unresolved-catalog-reference` | `--unresolved-catalog-references` | - | - | `package.json` references to `catalog:` / `catalog:<name>` whose catalog does not declare the package; `pnpm install` would fail. Default `error`. Suppress via `ignoreCatalogReferences: [{ package, catalog?, consumer? }]` in fallow config (package.json has no comment syntax). |
|
|
164
|
-
| `unused-dependency-override` | `--unused-dependency-overrides` | - | - | Entries in `pnpm-workspace.yaml#overrides`, `package.json#pnpm.overrides`, npm or Bun `package.json#overrides`, or Bun `package.json#resolutions` whose target package is not declared by any workspace `package.json` and is not present in the active readable lockfile. Default `warn`. pnpm and npm projects without a readable lockfile degrade to a manifest-only fallback with a verification `hint`; Bun projects with only binary `bun.lockb` fail closed and emit no finding. Suppress via `ignoreDependencyOverrides: [{ package, source? }]` in fallow config. |
|
|
165
|
-
| `misconfigured-dependency-override` | `--misconfigured-dependency-overrides` | - | - | Package-manager override entries whose key is unparsable or whose value is missing or empty. The active package manager may reject or ignore the entry. Default `error`. Suppression: same `ignoreDependencyOverrides` config rule. |
|
|
166
|
-
| `invalid-client-export` | - | - | `// fallow-ignore-next-line invalid-client-export` | "use client" file exports a server-only / route-config name; Requires the project to declare next |
|
|
167
|
-
| `mixed-client-server-barrel` | - | - | `// fallow-ignore-next-line mixed-client-server-barrel` | Barrel re-exports both a "use client" module and a server-only module; Requires the project to declare next |
|
|
168
|
-
| `misplaced-directive` | - | - | `// fallow-ignore-next-line misplaced-directive` | "use client" / "use server" directive is not in the leading position and is ignored; Requires the project to declare next |
|
|
169
|
-
| `unprovided-inject` | `--unprovided-injects` | - | `// fallow-ignore-next-line unprovided-inject` | inject() / getContext() reads a key that no provide() / setContext() supplies |
|
|
170
|
-
| `unrendered-component` | `--unrendered-components` | - | `// fallow-ignore-next-line unrendered-component` | A Vue / Svelte component is reachable through a barrel but rendered nowhere |
|
|
171
|
-
| `unused-component-prop` | `--unused-component-props` | - | `// fallow-ignore-next-line unused-component-prop` | A Vue defineProps prop or React component prop is referenced nowhere in its own component |
|
|
172
|
-
| `unused-component-emit` | `--unused-component-emits` | - | `// fallow-ignore-next-line unused-component-emit` | A Vue <script setup> defineEmits event is emitted nowhere in its own component |
|
|
173
|
-
| `unused-component-input` | `--unused-component-inputs` | - | `// fallow-ignore-next-line unused-component-input` | An Angular @Input() / signal input() / model() is read nowhere in its own component (class body or template); needs `@angular/core` dep |
|
|
174
|
-
| `unused-component-output` | `--unused-component-outputs` | - | `// fallow-ignore-next-line unused-component-output` | An Angular @Output() / signal output() is emitted (.emit()) nowhere in its own component; needs `@angular/core` dep |
|
|
175
|
-
| `unused-svelte-event` | `--unused-svelte-events` | - | `// fallow-ignore-next-line unused-svelte-event` | A Svelte createEventDispatcher event is listened to nowhere in the project; needs `svelte` dep |
|
|
176
|
-
| `unused-server-action` | `--unused-server-actions` | - | `// fallow-ignore-next-line unused-server-action` | A Next.js Server Action exported from a "use server" file is referenced by no code in the project |
|
|
177
|
-
| `unused-load-data-key` | `--unused-load-data-keys` | - | `// fallow-ignore-next-line unused-load-data-key` | A SvelteKit load() return-object key is read by no consumer (needs @sveltejs/kit dep) |
|
|
178
|
-
| `prop-drilling` | - | - | `// fallow-ignore-next-line prop-drilling` | A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer; Opt-in: set rules.prop-drilling to warn or error to enable. Defaults to off. |
|
|
179
|
-
| `thin-wrapper` | - | - | `// fallow-ignore-next-line thin-wrapper` | A React/Preact component whose whole body is a single spread-forwarded child render (a candidate for inlining); Opt-in: set rules.thin-wrapper to warn or error to enable. Defaults to off. |
|
|
180
|
-
| `duplicate-prop-shape` | - | - | `// fallow-ignore-next-line duplicate-prop-shape` | Three or more React/Preact components across two or more files declare an identical prop-name set (a missing shared Props type); Opt-in: set rules.duplicate-prop-shape to warn or error to enable. Defaults to off. |
|
|
181
|
-
| `route-collision` | - | - | `// fallow-ignore-file route-collision` | Two or more Next.js App Router route files resolve to the same URL |
|
|
182
|
-
| `dynamic-segment-name-conflict` | - | - | `// fallow-ignore-file dynamic-segment-name-conflict` | Sibling Next.js dynamic route segments use different slug names at the same position |
|
|
183
|
-
| `high-cyclomatic-complexity` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function has high cyclomatic complexity |
|
|
184
|
-
| `high-cognitive-complexity` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function has high cognitive complexity |
|
|
185
|
-
| `high-complexity` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function exceeds both complexity thresholds |
|
|
186
|
-
| `high-crap-score` | `--complexity` | - | `// fallow-ignore-next-line complexity` | Function has a high CRAP score (complexity combined with low coverage) |
|
|
187
|
-
| `refactoring-target` | `--targets` | - | - | File identified as a high-priority refactoring candidate |
|
|
188
|
-
| `css-token-drift` | - | - | `// fallow-ignore-next-line css-token-drift` | CSS or CSS-in-JS hardcoded styling value bypasses the design token system |
|
|
189
|
-
| `css-duplicate-block` | - | - | `// fallow-ignore-next-line css-duplicate-block` | CSS or CSS-in-JS declaration block is duplicated across rules |
|
|
190
|
-
| `css-selector-complexity` | - | - | `// fallow-ignore-next-line css-selector-complexity` | CSS selector, nesting, or important usage is structurally complex |
|
|
191
|
-
| `css-dead-surface` | - | - | `// fallow-ignore-next-line css-dead-surface` | CSS or CSS-in-JS surface appears unused |
|
|
192
|
-
| `css-broken-reference` | - | - | `// fallow-ignore-next-line css-broken-reference` | CSS or CSS-in-JS reference resolves to no stylesheet definition |
|
|
193
|
-
| `untested-file` | `--coverage-gaps` | - | `// fallow-ignore-file coverage-gaps` | Runtime-reachable file has no test dependency path |
|
|
194
|
-
| `untested-export` | `--coverage-gaps` | - | `// fallow-ignore-file coverage-gaps` | Runtime-reachable export has no test dependency path |
|
|
195
|
-
| `code-duplication` | - | - | `// fallow-ignore-next-line code-duplication` | Duplicated code block; Reported by fallow dupes (and bare fallow / fallow audit) |
|
|
196
|
-
| `feature-flag` | - | - | `// fallow-ignore-next-line feature-flag` | Detected feature flag pattern; Reported by fallow flags |
|
|
197
|
-
| `tainted-sink` | - | - | `// fallow-ignore-next-line security-sink` | Syntactic security sink candidates require verification |
|
|
198
|
-
| `client-server-leak` | - | - | `// fallow-ignore-file security-client-server-leak` | Client-bound code reaches a non-public env read |
|
|
199
|
-
| `hardcoded-secret` | - | - | `// fallow-ignore-next-line security-sink` | Provider-prefixed or contextual secret literals require verification; Include-required category: enable via security.categories.include |
|
|
200
|
-
|
|
201
|
-
Runtime-coverage verdicts and the full security sink catalogue are listed by `fallow schema` (`issue_types`).
|
|
202
|
-
<!-- generated:issue-types:end -->
|
|
91
|
+
|
|
92
|
+
Dead-code filter flags are one per issue type (`--unused-exports`, `--unused-types`, `--unused-deps`, `--circular-deps`, and so on). Passing one or more narrows `fallow dead-code` to those types; passing none reports every type. Every type suppresses the same way: `// fallow-ignore-next-line <issue-type>` above the finding, or `// fallow-ignore-file <issue-type>` at the top of the file; the bare form without a type suppresses all of them.
|
|
93
|
+
|
|
94
|
+
`fallow explain <issue-type>` describes one type without running analysis, and the MCP server serves the same catalogue as the `fallow://issue-types` resource.
|
|
95
|
+
|
|
96
|
+
Full catalogue, one row per type: **[references/issue-types.md](references/issue-types.md)**.
|
|
203
97
|
|
|
204
98
|
## MCP server
|
|
205
99
|
|
|
@@ -210,8 +104,9 @@ The server also serves read-only reference resources (no subprocess, no analysis
|
|
|
210
104
|
Full tool catalogue, resource catalogue, key params, runtime source-map confidence tiers, shared timeouts, and the `next_steps` dispatch mapping: **[references/mcp.md](references/mcp.md)**.
|
|
211
105
|
|
|
212
106
|
## References
|
|
213
|
-
- [CLI Reference](references/cli-reference.md):
|
|
107
|
+
- [CLI Reference](references/cli-reference.md): the command catalogue, complete flag specifications, and configuration field details
|
|
214
108
|
- [MCP Tools](references/mcp.md): MCP server tool and resource catalogues, CLI fallbacks, params, and agent dispatch guidance
|
|
109
|
+
- [Issue Types](references/issue-types.md): every issue type with its filter flag, fixability, and suppression comment
|
|
215
110
|
- [Gotchas](references/gotchas.md): common pitfalls, edge cases, and correct usage patterns
|
|
216
111
|
- [Patterns](references/patterns.md): workflow recipes for CI, monorepos, migration, and incremental adoption
|
|
217
112
|
- [Similar Code](references/similar-code.md): snapshot-stable discovery, inspection, and verdict workflow
|