fallow 3.31.0 → 3.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/capabilities.json +420 -172
- package/issue-registry.json +190 -154
- package/package.json +12 -12
- package/schema.json +36 -1
- package/scripts/lazy-verify.js +14 -2
- package/scripts/lazy-verify.test.js +6 -4
- package/scripts/run-binary.js +7 -1
- package/scripts/run-binary.test.js +71 -12
- package/skills/fallow/SKILL.md +35 -11
- package/skills/fallow/references/cli-reference.md +155 -44
- package/skills/fallow/references/gotchas.md +22 -14
- package/skills/fallow/references/issue-types.md +3 -2
- package/skills/fallow/references/mcp.md +19 -6
- package/skills/fallow/references/node-bindings.md +9 -3
- package/skills/fallow/references/patterns.md +43 -15
- package/skills/fallow-setup/SKILL.md +50 -0
- package/skills/fallow-setup/agents/openai.yaml +4 -0
- package/skills/fallow-setup/references/ci-gate.md +61 -0
- package/skills/fallow-setup/references/configure-and-install.md +56 -0
- package/skills/fallow-setup/references/tooling-detection.md +44 -0
- package/types/output-contract.d.ts +1528 -211
|
@@ -8,6 +8,7 @@ Complete command and flag specifications for all fallow CLI commands.
|
|
|
8
8
|
|
|
9
9
|
- [Commands](#commands)
|
|
10
10
|
- [`dead-code`: Dead Code Analysis](#dead-code-dead-code-analysis)
|
|
11
|
+
- [`architecture`: Cycles, Boundaries and Policy Rules](#architecture-cycles-boundaries-and-policy-rules)
|
|
11
12
|
- [`dupes`: Duplication Detection](#dupes-duplication-detection)
|
|
12
13
|
- [`fix`: Auto-Remove Unused Code](#fix-auto-remove-unused-code)
|
|
13
14
|
- [`list`: Project Introspection](#list-project-introspection)
|
|
@@ -47,12 +48,13 @@ Every fallow command with its purpose and key flags. The table is regenerated fr
|
|
|
47
48
|
|---|---|---|
|
|
48
49
|
| `fallow` | Run full codebase analysis: cleanup + duplication + health (default) | `--only`, `--skip`, `--production`, `--production-dead-code`, `--production-health`, `--production-dupes`, `--ci`, `--fail-on-issues`, `--group-by`, `--summary`, `--fail-on-regression`, `--tolerance`, `--regression-baseline`, `--save-regression-baseline`, `--score`, `--trend`, `--save-snapshot`, `--include-entry-exports` |
|
|
49
50
|
| `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` |
|
|
51
|
+
| `architecture` | Check import cycles, boundaries and policy rules after editing | `--cycles`, `--boundaries`, `--policy`, `--file`, `--finding-id`, `path` |
|
|
50
52
|
| `watch` | Watch for changes and re-run analysis | `--no-clear` |
|
|
51
53
|
| `type-aware` | Inspect the optional TypeScript semantic companion | |
|
|
52
54
|
| `doctor` | Diagnose project readiness without analysis or mutation | |
|
|
53
55
|
| `similar-code` | Find semantically similar functions with a pinned local model (opt-in) | `--threshold`, `--min-lines`, `--top`, `--file` |
|
|
54
56
|
| `inspect` | Compose one evidence bundle for a file or exported symbol | `--file <path>`, `--symbol <file>:<export>` |
|
|
55
|
-
| `trace` | Trace a symbol's call chain (best-effort, syntactic; OFF the ranked path) | `symbol`, `--
|
|
57
|
+
| `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` |
|
|
56
58
|
| `trace-error` | Resolve a runtime stack trace's frames to the definitions they name (best-effort, syntactic; OFF the ranked path) | `trace_file` |
|
|
57
59
|
| `fix` | Auto-remove unused exports/deps | `--dry-run`, `--yes` (required in non-TTY) |
|
|
58
60
|
| `init` | Generate config file, AGENTS.md agent guide, or pre-commit hook | `--toml`, `--agents`, `--hooks`, `--branch` |
|
|
@@ -77,6 +79,7 @@ Every fallow command with its purpose and key flags. The table is regenerated fr
|
|
|
77
79
|
| `explain` | Explain one issue type without running analysis | `<issue-type>`, `--format json` |
|
|
78
80
|
| `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` |
|
|
79
81
|
| `audit-cache` | Maintain reusable audit base-snapshot caches | |
|
|
82
|
+
| `baselines` | Maintain committed baselines: `baselines prune` removes the entries of fixed findings and never adds one | `prune --check`, `prune --dead-code-baseline`, `prune --health-baseline`, `prune --dupes-baseline` |
|
|
80
83
|
| `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` |
|
|
81
84
|
| `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` |
|
|
82
85
|
| `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` |
|
|
@@ -134,6 +137,7 @@ Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#
|
|
|
134
137
|
| `--unprovided-injects` | inject() / getContext() reads a key that no provide() / setContext() supplies |
|
|
135
138
|
| `--unrendered-components` | A Vue / Svelte component is reachable through a barrel but rendered nowhere |
|
|
136
139
|
| `--unused-component-props` | A Vue defineProps prop or React component prop is referenced nowhere in its own component |
|
|
140
|
+
| `--absent-component-props` | Known reachable callers omit an optional prop consumed inside its component |
|
|
137
141
|
| `--unused-component-emits` | A Vue <script setup> defineEmits event is emitted nowhere in its own component |
|
|
138
142
|
| `--unused-component-inputs` | An Angular @Input() / signal input() / model() is read nowhere in its own component (class body or template); needs `@angular/core` dep |
|
|
139
143
|
| `--unused-component-outputs` | An Angular @Output() / signal output() is emitted (.emit()) nowhere in its own component; needs `@angular/core` dep |
|
|
@@ -155,6 +159,9 @@ Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#
|
|
|
155
159
|
| `--unused-dependency-overrides` | Unused package-manager dependency overrides |
|
|
156
160
|
| `--misconfigured-dependency-overrides` | Misconfigured package-manager dependency overrides |
|
|
157
161
|
<!-- generated:flags:dead-code-filters:end -->
|
|
162
|
+
|
|
163
|
+
`--deprecated-exports-in-use` is an opt-in migration sweep (default `off`). Each finding has the exact `consumer_count` and a sample of up to 10 consumers. `fallow dead-code --trace FILE:EXPORT` lists all of them. Enable it with this flag or with `deprecated-exports-in-use: "warn"` or `"error"` in [`rules`](#configuration-file-format).
|
|
164
|
+
|
|
158
165
|
### Examples
|
|
159
166
|
|
|
160
167
|
```bash
|
|
@@ -209,6 +216,56 @@ fallow dead-code --format json --quiet --include-entry-exports
|
|
|
209
216
|
|
|
210
217
|
---
|
|
211
218
|
|
|
219
|
+
## `architecture`: Cycles, Boundaries and Policy Rules
|
|
220
|
+
|
|
221
|
+
Reports circular dependencies, re-export cycles, package cycles, boundary violations (with boundary coverage and forbidden calls) and rule-pack policy violations. The command runs the `dead-code` analysis with these issue types selected. The JSON output has `kind: "architecture"` (with `--group-by`: `architecture-grouped`) and its own `schema_version`. The arrays, finding ids, actions, exit codes, gate outcomes and baselines are the same as on `dead-code`. A saved baseline keeps `kind: "dead-code"`. `fallow report --from` renders a saved architecture envelope in every format. The global scope and output flags (`--format`, `--changed-since`, `--workspace`, `--baseline`, `--save-baseline`) work as on `dead-code`.
|
|
222
|
+
|
|
223
|
+
`fallow dead-code` still reports these findings by default until the next major version. Its `--circular-deps`, `--re-export-cycles`, `--package-cycles`, `--boundary-violations` and `--policy-violations` flags are deprecated aliases. `fallow architecture` reports only part of the issue types, so `--fail-on-stale-baseline` does not gate on it, with any baseline. A baseline that `fallow architecture --save-baseline` writes lists only the architecture findings, and `fallow dead-code` warns when it reads such a baseline.
|
|
224
|
+
|
|
225
|
+
| Flag | Selects |
|
|
226
|
+
|---|---|
|
|
227
|
+
| `--cycles` | Circular dependencies, re-export cycles and package cycles (`dead-code --circular-deps --re-export-cycles --package-cycles`) |
|
|
228
|
+
| `--boundaries` | Boundary violations, boundary coverage and forbidden calls (`dead-code --boundary-violations`) |
|
|
229
|
+
| `--policy` | Rule-pack policy violations (`dead-code --policy-violations`) |
|
|
230
|
+
| `--file <PATH>` | Only report findings in these files |
|
|
231
|
+
| `--finding-id <ID>` | Only report the findings with these ids |
|
|
232
|
+
|
|
233
|
+
Without a selection flag, the command reports every architecture issue type.
|
|
234
|
+
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"kind": "architecture",
|
|
238
|
+
"schema_version": 1,
|
|
239
|
+
"total_issues": 1,
|
|
240
|
+
"circular_dependencies": [
|
|
241
|
+
{ "files": ["src/a.ts", "src/b.ts"], "length": 2, "finding_id": "dc1:circular-dependency:...", "actions": [] }
|
|
242
|
+
],
|
|
243
|
+
"boundary_violations": [],
|
|
244
|
+
"policy_violations": []
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
The MCP tool is `check_architecture` and the Node binding is `detectArchitecture`.
|
|
249
|
+
|
|
250
|
+
With `--group-by`, each group shows its findings under one "Architecture" heading.
|
|
251
|
+
|
|
252
|
+
Bare `fallow --only architecture` runs the `dead-code` analysis and reports only these findings in the `check` section. Bare `fallow --skip architecture` removes them from the `check` section. The health score, the duplication section and the file that `--save-baseline` writes stay the same as in a run without the value. The regression counts follow the narrowed section.
|
|
253
|
+
|
|
254
|
+
### Examples
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Before an edit: the rules that apply to the files
|
|
258
|
+
fallow guard src/ui/App.ts --format json --quiet
|
|
259
|
+
|
|
260
|
+
# After an edit: cycles, boundaries and policy rules
|
|
261
|
+
fallow architecture --format json --quiet
|
|
262
|
+
|
|
263
|
+
# Only import cycles on the changed files
|
|
264
|
+
fallow architecture --cycles --changed-since main --format json --quiet
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
212
269
|
## `dupes`: Duplication Detection
|
|
213
270
|
|
|
214
271
|
Finds code duplication and clones across the project.
|
|
@@ -230,12 +287,17 @@ By default, `fallow dupes` skips generated framework output matching `**/.next/*
|
|
|
230
287
|
| `--cross-language` | `bool` | `false` | Strip type annotations for TS↔JS matching |
|
|
231
288
|
| `--ignore-imports` | `bool` | `false` | Exclude module wiring from clone detection |
|
|
232
289
|
| `--no-ignore-imports` | `bool` | `false` | Count module wiring as clone candidates (opt out of the default exclusion) |
|
|
290
|
+
| `--ignore-symlinks` | `bool` | `false` | Omit clone instances whose path is a symlink, or lies under a symlinked directory. A clone group with fewer than two remaining instances is not reported. Without this flag, JSON output marks these instances with `is_symlink: true` |
|
|
291
|
+
| `--no-ignore-symlinks` | `bool` | `false` | Report symlinked clone instances (opt out of a config `duplicates.ignoreSymlinks: true`) |
|
|
233
292
|
| `--top` | `string` | - | Show only the N highest-ranked clone groups. Ranking multiplies token count and occurrences, then adds a capped spread boost for distant files or same-file locations. `clone_families[]` narrows with the groups. Summary stats reflect the scoped project; `clone_groups_shown` / `clone_groups_omitted` and `clone_families_shown` / `clone_families_omitted` report both splits. Refused with exit code 2 alongside `--group-by`, which reports per-bucket stats over every clone group in a bucket that a global top-N truncation would contradict. |
|
|
234
293
|
| `--no-fragments` | `bool` | `false` | 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 |
|
|
235
294
|
| `--trace` | `string` | - | Deep-dive clones. `FILE:LINE` traces all clones at a location; `dup:<id>` traces a clone group by the stable fingerprint shown in the listing and on `clone_groups[].fingerprint` in JSON. Fingerprints are usually `dup:<8hex>` and widen only on rare report collisions. Trace output adds an extract-function suggestion, estimated savings, and a best-effort proposed name per group |
|
|
236
295
|
|
|
237
296
|
Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#global-flags), [`--changed-since`](#global-flags), [`--baseline`](#global-flags), [`--save-baseline`](#global-flags), [`--workspace`](#global-flags), [`--changed-workspaces`](#global-flags), [`--group-by`](#global-flags), [`--explain-skipped`](#global-flags).
|
|
238
297
|
<!-- generated:flags:dupes:end -->
|
|
298
|
+
|
|
299
|
+
With `--group-by`, each clone group goes to its **largest owner** (the most instances; an alphabetical tiebreak): a group split 2 `src` / 1 `lib` appears under `src`. JSON adds `grouped_by` plus a `groups` array. Each bucket carries dedup-aware `stats`, `clone_groups` (each group has `primary_owner` and a per-instance `owner`), and `clone_families`. SARIF results carry `properties.group`, and CodeClimate issues carry a top-level `group` field. Compact and markdown output fall back to ungrouped output with a stderr note.
|
|
300
|
+
|
|
239
301
|
### Detection Modes
|
|
240
302
|
|
|
241
303
|
| Mode | Behavior |
|
|
@@ -291,6 +353,9 @@ Auto-removes unused exports, dependencies, enum members, and pnpm catalog entrie
|
|
|
291
353
|
|
|
292
354
|
Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#global-flags).
|
|
293
355
|
<!-- generated:flags:fix:end -->
|
|
356
|
+
|
|
357
|
+
`--force` is an alias for `--yes`.
|
|
358
|
+
|
|
294
359
|
### What gets fixed
|
|
295
360
|
|
|
296
361
|
- Unused exports (removes the `export` keyword; whole-enum block when every member is unused)
|
|
@@ -369,7 +434,7 @@ The `--entry-weight` JSON output carries `entry_weight.entries[]`, one row per r
|
|
|
369
434
|
|
|
370
435
|
To gate eager growth in CI, save a baseline file on the main branch with `fallow list --entry-weight --save-regression-baseline <PATH>`. A later run with `--regression-baseline <PATH>` adds `entry_weight.regression`: per-entry `baseline_eager_bytes`, `current_eager_bytes`, `new_eager_packages` and `exceeded`. The comparison is report-only until you add `--fail-on-regression`; then an entry that grew more than `--tolerance` (bytes, or a percentage such as `5%`) exits 1. A new entry never fails the gate.
|
|
371
436
|
|
|
372
|
-
The `--workspaces` JSON output carries `workspaces[]` (name, project-root-relative path, `is_internal_dependency` bool) plus `workspace_diagnostics[]`. Each diagnostic has a `kind` discriminator (`undeclared-workspace`, `malformed-package-json`, `glob-matched-no-package-json`, `malformed-tsconfig`, `tsconfig-reference-dir-missing`, `malformed-pnpm-workspace-yaml`, `skipped-large-file`, `skipped-minified-file`, `skipped-source-dotdir`, `source-read-failure`, `
|
|
437
|
+
The `--workspaces` JSON output carries `workspaces[]` (name, project-root-relative path, `is_internal_dependency` bool) plus `workspace_diagnostics[]`. Each diagnostic has a `kind` discriminator (for example `undeclared-workspace`, `malformed-package-json`, `glob-matched-no-package-json`, `malformed-tsconfig`, `tsconfig-reference-dir-missing`, `malformed-pnpm-workspace-yaml`, `skipped-large-file`, `skipped-minified-file`, `skipped-source-dotdir`, `source-read-failure`, `npm-lock-override-resolution-skipped`) with a typed payload (`error`, `pattern`, or none), and a `path` that is project-root-relative with forward slashes on every envelope that carries the array. The same `workspace_diagnostics[]` array is also surfaced on the `fallow dead-code --format json`, `fallow dupes --format json`, and `fallow health --format json` envelopes, at the top level of the bare combined `fallow --format json` envelope, on `fallow audit --format json` under `dead_code`, and on the `audit-brief` envelope shared by `fallow review --format json` and `fallow audit --brief --format json`, also under `dead_code` (omitted when empty). The combined carrier is the envelope root, not a section, so `--skip check`, `--only health`, and `--only dupes` all still report what their analyses recorded. The combined root is the union of what every analysis in the run recorded, deduplicated on the whole `kind` (typed payload included) plus `path`, so two overlapping globs still report the same package-less directory once per `pattern` (a declared glob's no-op `./` prefix is normalised away, so one glob written `"./apps/**"` in `package.json` and `apps/**` in `pnpm-workspace.yaml` stays one entry): a combined run walks the project once per analysis, and a per-analysis `production` mode (`production: { deadCode, health, dupes }`, `--production-health`) can give those walks different file sets, so only the union reports what the run as a whole saw. Each analysis contributes the workspace-discovery list its own config load produced, the same list `fallow list --workspaces` reports, so the combined root can carry an `undeclared-workspace` or `glob-matched-no-package-json` entry that the standalone `dead-code`, `check`, `health`, and `dupes` envelopes, which read the process diagnostics registry instead, do not. `fallow audit --format json` and the `audit-brief` envelope are on the same broad side: they fold the dead-code analysis's own list into their `dead_code.workspace_diagnostics[]`, so they too report an `undeclared-workspace` entry the standalone envelopes miss. The CLI and the programmatic route (MCP code mode, NAPI, embedders) agree on everything an analysis records: both folds close with the same process-registry read, which covers what an analysis records after its section captured its list (a `source-read-failure`, or the analysis-stage kinds a health run's own dead-code precompute records) and skips `skipped-large-file`, `skipped-minified-file`, and `skipped-source-dotdir`, since those reach an envelope only from the walk that recorded them. The analysis-stage kinds (`malformed-pnpm-workspace-yaml`, `bun-lockb-override-resolution-skipped`, `bun-lock-override-resolution-skipped`, `pnpm-lock-override-resolution-skipped`, `npm-lock-override-resolution-skipped`, `bun-resolutions-shadowed-by-overrides`, `pnpm-workspace-overrides-ignored`, `boundaries-not-configured`, `rule-packs-not-configured`) are recorded by the dead-code analyze pass, so they only appear on runs that include it: `fallow dupes --format json` and `fallow --only dupes` report the workspace-discovery and source-discovery kinds alone. A malformed ROOT `package.json` exits 2 at config load; everything else warns and continues. The dead-code result adds two more kinds, each with a `pattern` payload and `path: "."`: `ignore-dependencies-glob-unmatched` (an `ignoreDependencies` glob matched no declared dependency; omitted when the run reports no dependency finding, for example with `--unused-files` or `--file`) and `ignore-findings-pattern-unmatched` (an `ignoreFindings` pattern matched no finding). SARIF carries the same entries under `invocations[0].toolConfigurationNotifications[]` of the dead-code run. Markdown, `github-summary`, `pr-comment-github`, `pr-comment-gitlab` and the summary `body` of `review-github` and `review-gitlab` add an `Unmatched config patterns` section. Human, compact, CodeClimate and `github-annotations` print a stderr note. `fallow report --from` uses the same place as the live run of that format.
|
|
373
438
|
|
|
374
439
|
The `--boundaries` JSON output carries `boundaries.logical_groups[]` alongside the existing `zones[]` / `rules[]` arrays. Each logical-group entry surfaces a user-authored `autoDiscover` parent zone (which expansion otherwise flattens into per-child zones like `features/auth` / `features/billing`): `name`, `children`, `auto_discover` (verbatim user strings), `status` (`ok` / `empty` / `invalid_path`), `source_zone_index`, summed `file_count`, optional `authored_rule` (the pre-expansion `{ allow, allowTypeOnly }` keyed on the parent), optional `fallback_zone` cross-reference when the parent also kept its own `patterns` (Bulletproof case), optional `merged_from` (parent zone indices when the user declared the same parent name twice; surfaces the duplicate in JSON instead of only in `tracing::warn!`), optional `original_zone_root` (echo of the parent's `root` subtree scope for monorepo patchers), and optional `child_source_indices` (parallel to `children`, attributing each child to a specific `auto_discover` entry when multiple paths were authored). The full shape is documented in `docs/output-schema.json` under `ListBoundariesOutput`.
|
|
375
440
|
|
|
@@ -412,26 +477,26 @@ fallow hooks uninstall --target git
|
|
|
412
477
|
fallow hooks uninstall --target agent
|
|
413
478
|
```
|
|
414
479
|
|
|
415
|
-
`hooks status` is read-only and reports `git`, `claude`, and `codex` surfaces. Each surface includes `installed`, `managed_block_present`, `user_edited`, and `path`; generated agent scripts also include `script_version` and `min_version_floor`. Use it before mutating setup so agents can distinguish fallow-managed artifacts from user-owned hooks or partial managed blocks.
|
|
480
|
+
`hooks status` is read-only and reports `git`, `claude`, `codex` (the `AGENTS.md` routing block), and `codex_gate` (the `.codex/hooks.json` gate) surfaces. Each surface includes `installed`, `managed_block_present`, `user_edited`, and `path`; generated agent scripts also include `script_version` and `min_version_floor`. Use it before mutating setup so agents can distinguish fallow-managed artifacts from user-owned hooks or partial managed blocks.
|
|
416
481
|
|
|
417
482
|
---
|
|
418
483
|
|
|
419
484
|
## `agent`: One-Pass Agent Onboarding
|
|
420
485
|
|
|
421
|
-
Wires fallow into the coding-agent harnesses a project uses. `install` detects Claude Code, Codex, and Cursor from the project (`.claude/`, `CLAUDE.md`, `.mcp.json`, `.codex/`, `.cursor/`; `AGENTS.md` is not a signal because every harness and fallow itself write it), the home directory, and the session environment (`CLAUDECODE`, `CODEX_THREAD_ID`, `CURSOR_AGENT`), or takes `--harness`. When nothing is detected only harness-neutral files are written (`AGENTS.md
|
|
486
|
+
Wires fallow into the coding-agent harnesses a project uses. `install` detects Claude Code, Codex, and Cursor from the project (`.claude/`, `CLAUDE.md`, `.mcp.json`, `.codex/`, `.cursor/`; `AGENTS.md` is not a signal because every harness and fallow itself write it), the home directory, and the session environment (`CLAUDECODE`, `CODEX_THREAD_ID`, `CURSOR_AGENT`), or takes `--harness`. When nothing is detected only harness-neutral files are written (`AGENTS.md`, `.agents/skills/fallow`, and `.agents/skills/fallow-setup`).
|
|
422
487
|
|
|
423
488
|
Steps per harness:
|
|
424
489
|
|
|
425
490
|
| Step | Claude Code | Codex | Cursor |
|
|
426
491
|
|---|---|---|---|
|
|
427
492
|
| `guide` | `AGENTS.md` task map; `CLAUDE.md` gains an `@AGENTS.md` import (created when absent, appended as a marked block otherwise) | `AGENTS.md` task map | `AGENTS.md` task map (Cursor reads it) |
|
|
428
|
-
| `skill` | `.claude/skills/fallow/` | `.agents/skills/fallow/` | `.agents/skills/fallow/` |
|
|
493
|
+
| `skill` | `.claude/skills/fallow/` and `.claude/skills/fallow-setup/` | `.agents/skills/fallow/` and `.agents/skills/fallow-setup/` | `.agents/skills/fallow/` and `.agents/skills/fallow-setup/` |
|
|
429
494
|
| `mcp` | `mcpServers.fallow` in `.mcp.json` (`--approve` also lists it in `.claude/settings.local.json`) | `[mcp_servers.fallow]` in `.codex/config.toml` (applies once the project is trusted; the `codex mcp add` next step works immediately) | `mcpServers.fallow` in `.cursor/mcp.json` |
|
|
430
|
-
| `hooks` | `.claude/settings.json` PreToolUse gate plus `.claude/hooks/fallow-gate.sh` |
|
|
495
|
+
| `hooks` | `.claude/settings.json` PreToolUse gate plus `.claude/hooks/fallow-gate.sh` | `.codex/hooks.json` PreToolUse gate plus `.codex/hooks/fallow-gate.sh` (Codex runs it after you trust it in `/hooks`), and a marked routing block in `AGENTS.md` | skipped (`unsupported_harness`) |
|
|
431
496
|
|
|
432
|
-
The skill is a small pointer to `node_modules/fallow/skills
|
|
497
|
+
The step writes each released skill: `fallow` for analysis and `fallow-setup` for setting up code-quality tooling. Each skill is a small pointer to `node_modules/fallow/skills/<name>` when that copy exists (so it never drifts from the installed binary); otherwise the tree embedded in the binary is written. Each skill picks its source on its own, so an older npm package without `fallow-setup` still gets the embedded copy of that skill. The MCP command is probed before anything is written: `npx --no fallow-mcp` for an npm-installed project, `fallow-mcp` from `PATH`, or the running multicall binary; when none exists the step is `skipped` with `mcp_entry_unavailable` rather than writing a config that cannot start.
|
|
433
498
|
|
|
434
|
-
Every file or block carries a `<!-- fallow:agent-install v1 ... -->` marker. Re-running is byte-stable. An existing skill named `fallow` without a marker is `refused` (`skill_name_taken`) unless `--force
|
|
499
|
+
Every file or block carries a `<!-- fallow:agent-install v1 ... -->` marker. Re-running is byte-stable. An existing skill named `fallow` or `fallow-setup` without a marker is `refused` (`skill_name_taken`) unless `--force`; the other skill is still written. JSON and TOML cannot carry a marker, so a `fallow` MCP entry counts as fallow-managed only when its command is one fallow writes; any other entry is `refused` (`mcp_entry_foreign`) and never removed without `--force`. `--force` on an unparsable config file saves the old bytes as `<file>.fallow-bak` before rewriting. `uninstall` removes managed content, deletes a config file it emptied (and an emptied `.cursor/` or `.codex/` directory), and deletes `AGENTS.md` or `CLAUDE.md` only while the file still matches what fallow authored.
|
|
435
500
|
|
|
436
501
|
### Flags
|
|
437
502
|
|
|
@@ -442,7 +507,7 @@ Every file or block carries a `<!-- fallow:agent-install v1 ... -->` marker. Re-
|
|
|
442
507
|
| `--dry-run` | `install`, `uninstall` | Print the plan without touching the filesystem |
|
|
443
508
|
| `--force` | `install`, `uninstall` | Replace or remove skills, hook scripts, or config files fallow did not write |
|
|
444
509
|
| `--approve` | `install` | Pre-approve the project MCP server for yourself in `.claude/settings.local.json`; refused when that file is tracked by git |
|
|
445
|
-
| `--user` | `install`, `uninstall` | Skill
|
|
510
|
+
| `--user` | `install`, `uninstall` | Skill, MCP config, and gate under `$HOME` (`~/.claude/skills`, `~/.agents/skills`, `~/.codex/config.toml`, `~/.cursor/mcp.json`, `~/.claude/hooks`, `~/.codex/hooks.json`); the guide step and the `AGENTS.md` routing block are skipped, and Claude Code prints the `claude mcp add --scope user` command instead of editing `~/.claude.json` |
|
|
446
511
|
| `--gitignore-claude` | `install` | Append `.claude/` to `.gitignore` |
|
|
447
512
|
|
|
448
513
|
Root: the git toplevel of the current directory unless `--root` is passed explicitly, so a run from a monorepo package still writes where the harnesses read. The chosen root is the first line of output and `root` in JSON.
|
|
@@ -455,7 +520,7 @@ Human output groups paths under "Shared with your team (commit these)" and "Loca
|
|
|
455
520
|
{
|
|
456
521
|
"kind": "agent-install",
|
|
457
522
|
"schema_version": 1,
|
|
458
|
-
"fallow_version": "3.
|
|
523
|
+
"fallow_version": "3.33.0",
|
|
459
524
|
"root": "/abs/path",
|
|
460
525
|
"mode": "install",
|
|
461
526
|
"dry_run": false,
|
|
@@ -555,7 +620,8 @@ Angular templates contribute synthetic `<template>` complexity findings whenever
|
|
|
555
620
|
| `--min-commits` | `string` | - | Minimum number of commits for a file to be included in hotspot ranking. |
|
|
556
621
|
| `--save-snapshot` | `string` | - | Save vital signs snapshot for trend tracking. Forces file-scores + hotspot computation. |
|
|
557
622
|
| `--trend` | `bool` | `false` | Compare current metrics against the most recent saved snapshot. Reads from `.fallow/snapshots/` and shows per-metric deltas with directional indicators (improving/declining/stable). Implies `--score`. |
|
|
558
|
-
| `--
|
|
623
|
+
| `--trend-from` | `string` | - | Compare current metrics against this snapshot file instead of the newest file in `.fallow/snapshots/`. Use it to restore a baseline from external storage in CI. With --group-by, groups are compared by key when the snapshot holds the same grouping. Implies --trend |
|
|
624
|
+
| `--coverage` | `string` | - | Path to coverage data for accurate per-function CRAP scores: an Istanbul map (`coverage-final.json`), a directory containing one, a raw V8 coverage directory (`NODE_V8_COVERAGE=<dir> node --test`), or a single V8 coverage JSON file. Transpiled V8 scripts (tsx, bundles) map back to their source files through the source map that Node records in the dump; a script that differs from the file on disk and has no source map keeps the estimate. Uses `CC^2 * (1-cov/100)^3 + CC` instead of the default estimated coverage. Relative paths resolve against `--root`. Falls back to `FALLOW_COVERAGE`, then `health.coverage`, then auto-detection. |
|
|
559
625
|
| `--coverage-root` | `string` | - | Absolute prefix to strip from file paths in coverage data before prepending the project root. For CI/Docker environments where coverage was generated with different absolute paths. Falls back to `FALLOW_COVERAGE_ROOT`, then `health.coverageRoot`. |
|
|
560
626
|
| `--runtime-coverage` | `string` | - | Merge runtime-coverage input into the health report. Accepts a V8 coverage directory (`NODE_V8_COVERAGE=...`), a single V8 coverage JSON file, or an Istanbul `coverage-final.json`. One local capture is free and does not require a license; continuous/cloud or multi-capture runtime monitoring requires an active license or trial (`fallow license activate --trial --email <addr>`). JSON output gains a `runtime_coverage` object with a top-level report verdict, per-finding `verdict` (`safe_to_delete` / `review_required` / `low_traffic` / `coverage_unavailable` / `active`), a per-finding suppression `id` (`fallow:prod:<hash>`, hashes the current line), an optional cross-surface `stable_id` join key (`fallow:fn:<hash>`, hashes file + name + start line; one value per function across findings / hot-paths / blast-radius / importance and across V8/Istanbul/oxc producers), an optional content-digest `source_hash` (line-move-immune, so baselines survive a pure line shift), an evidence block, and percentile-ranked hot paths. On protocol-0.3+ sidecars the `summary` also carries an optional `capture_quality` block (`window_seconds`, `instances_observed`, `lazy_parse_warning`, `untracked_ratio_percent`) that flags short-window captures where lazy-parsed scripts may not appear. |
|
|
561
627
|
| `--min-invocations-hot` | `string` | `100` | Invocation threshold for hot-path classification. Takes effect only when `--runtime-coverage` is set. |
|
|
@@ -564,6 +630,11 @@ Angular templates contribute synthetic `<template>` complexity findings whenever
|
|
|
564
630
|
|
|
565
631
|
Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#global-flags), [`--changed-since`](#global-flags), [`--churn-file`](#global-flags), [`--workspace`](#global-flags), [`--group-by`](#global-flags), [`--baseline`](#global-flags), [`--baseline-mode`](#global-flags), [`--save-baseline`](#global-flags), [`--production`](#global-flags), [`--no-production`](#global-flags), [`--explain`](#global-flags).
|
|
566
632
|
<!-- generated:flags:health:end -->
|
|
633
|
+
|
|
634
|
+
With `--workspace`, vital signs, the health score, hotspots, file scores, findings, and `summary.files_analyzed` are all recomputed against the scoped subset.
|
|
635
|
+
|
|
636
|
+
With `--group-by`, JSON adds `grouped_by` plus a `groups` array. Each group has its own `vital_signs`, `health_score`, `findings`, `file_scores`, `hotspots`, `large_functions`, and `targets`, recomputed against the files of the group. The top-level metrics stay project-wide, so a consumer that ignores grouping still sees the project headline. Human output adds a per-group score / files / hot / p90 summary block (worst first when `--score` is set). Markdown adds a grouped health table. SARIF results carry `properties.group`, and CodeClimate issues carry a top-level `group` field. Compact and badge output fall back to ungrouped output with a stderr note.
|
|
637
|
+
|
|
567
638
|
### Exit Codes
|
|
568
639
|
|
|
569
640
|
The gate flag in play determines what drives the exit code. Plain `fallow health` (no gate flag) stays advisory but still fails on any finding (back-compat).
|
|
@@ -659,7 +730,7 @@ fallow health --format json --quiet --trend
|
|
|
659
730
|
{
|
|
660
731
|
"kind": "health",
|
|
661
732
|
"schema_version": 7,
|
|
662
|
-
"version": "3.
|
|
733
|
+
"version": "3.33.0",
|
|
663
734
|
"elapsed_ms": 32,
|
|
664
735
|
"summary": {
|
|
665
736
|
"files_analyzed": 482,
|
|
@@ -852,15 +923,19 @@ All `health` JSON output includes a `vital_signs` object with project-wide metri
|
|
|
852
923
|
}
|
|
853
924
|
```
|
|
854
925
|
|
|
855
|
-
Fields are `null` when the corresponding data source is not available (e.g., `hotspot_count` is null without `--hotspots` or when git is not available).
|
|
926
|
+
Fields are `null` when the corresponding data source is not available (e.g., `hotspot_count` is null without `--hotspots` or when git is not available).
|
|
927
|
+
|
|
928
|
+
Health score formula v3 retains the scale-invariant density and tail fields: `critical_complexity_pct`, `maintainability_low_pct`, `unused_deps_per_k_files`, `circular_deps_per_k_files`, and `functions_over_60_loc_per_k`. The hotspot penalty is `hotspot_count / max(ceil(total_files × 0.01), 1) × 10`, capped at 10. Only files with a hotspot score of at least 50 enter `hotspot_count`; an empty scope has no hotspot penalty. `hotspot_top_pct_count` remains a rank diagnostic and does not determine the penalty.
|
|
929
|
+
|
|
930
|
+
The `unit_size_profile` and `unit_interfacing_profile` are risk distribution histograms (low risk / medium risk / high risk / very high risk as percentages). `p95_fan_in` is the 95th percentile of incoming dependencies. `coupling_high_pct` is the percentage of files above the effective coupling threshold.
|
|
856
931
|
|
|
857
932
|
With `--score`, the JSON output includes a `health_score` object:
|
|
858
933
|
|
|
859
934
|
```json
|
|
860
935
|
{
|
|
861
936
|
"health_score": {
|
|
862
|
-
"formula_version":
|
|
863
|
-
"score":
|
|
937
|
+
"formula_version": 3,
|
|
938
|
+
"score": 72.9,
|
|
864
939
|
"grade": "B",
|
|
865
940
|
"penalties": {
|
|
866
941
|
"dead_files": 3.1,
|
|
@@ -878,7 +953,7 @@ With `--score`, the JSON output includes a `health_score` object:
|
|
|
878
953
|
}
|
|
879
954
|
```
|
|
880
955
|
|
|
881
|
-
Score is reproducible: `100 - sum(penalties) == score`. `formula_version` identifies the scoring formula; version
|
|
956
|
+
Score is reproducible: `100 - sum(penalties) == score`. `formula_version` identifies the scoring formula; version 3 retains the density and tail metrics from version 2 and corrects the hotspot penalty to use the thresholded count. Penalty fields are absent when the pipeline didn't run. `--score` automatically runs duplication analysis; add `--hotspots` (or combine `--score --targets`) when the score should include the churn-backed hotspot penalty. Grades: A (>= 85), B (70-84), C (55-69), D (40-54), F (< 40).
|
|
882
957
|
|
|
883
958
|
### Health Trend
|
|
884
959
|
|
|
@@ -890,15 +965,16 @@ With `--trend`, the JSON output includes a `health_trend` object comparing curre
|
|
|
890
965
|
"compared_to": {
|
|
891
966
|
"timestamp": "2026-03-25T14:30:00Z",
|
|
892
967
|
"git_sha": "a1b2c3d",
|
|
893
|
-
"score":
|
|
894
|
-
"grade": "B"
|
|
968
|
+
"score": 70.2,
|
|
969
|
+
"grade": "B",
|
|
970
|
+
"score_formula_version": 3
|
|
895
971
|
},
|
|
896
972
|
"metrics": [
|
|
897
973
|
{
|
|
898
974
|
"name": "score",
|
|
899
975
|
"label": "Health Score",
|
|
900
|
-
"previous":
|
|
901
|
-
"current":
|
|
976
|
+
"previous": 70.2,
|
|
977
|
+
"current": 72.9,
|
|
902
978
|
"delta": 2.7,
|
|
903
979
|
"direction": "improving",
|
|
904
980
|
"unit": ""
|
|
@@ -921,7 +997,7 @@ With `--trend`, the JSON output includes a `health_trend` object comparing curre
|
|
|
921
997
|
}
|
|
922
998
|
```
|
|
923
999
|
|
|
924
|
-
Metrics tracked: `score`, `dead_file_pct`, `dead_export_pct`, `avg_cyclomatic`, `maintainability_avg`, `unused_dep_count`, `circular_dep_count`, `hotspot_count`, `unit_size_very_high_pct`, `p95_fan_in`, `duplication_pct`. Each metric includes `direction` (`improving`, `declining`, `stable`). Percentage metrics include `previous_count`/`current_count` with raw numerator
|
|
1000
|
+
Metrics tracked: `score`, `dead_file_pct`, `dead_export_pct`, `avg_cyclomatic`, `maintainability_avg`, `unused_dep_count`, `circular_dep_count`, `hotspot_count`, `unit_size_very_high_pct`, `p95_fan_in`, `duplication_pct`. Each metric includes `direction` (`improving`, `declining`, `stable`). Percentage metrics include `previous_count`/`current_count` with raw numerator and denominator. `--trend` requires at least one saved snapshot in `.fallow/snapshots/`. Current snapshots use schema version 12 and record `score_formula_version`. A score delta is emitted only when both scores exist and their formula versions are known and equal. An older snapshot without this metadata retains its historical score and grade, but has no score delta. Raw metric trends still compare across formula changes. The JSON baseline exposes the stored formula version when known; human, Markdown, GitHub and compact output explain an omitted score comparison.
|
|
925
1001
|
|
|
926
1002
|
### Vital Signs Snapshots
|
|
927
1003
|
|
|
@@ -929,8 +1005,9 @@ Metrics tracked: `score`, `dead_file_pct`, `dead_export_pct`, `avg_cyclomatic`,
|
|
|
929
1005
|
|
|
930
1006
|
```json
|
|
931
1007
|
{
|
|
932
|
-
"snapshot_schema_version":
|
|
1008
|
+
"snapshot_schema_version": 12,
|
|
933
1009
|
"timestamp": "2025-12-01T10:30:00Z",
|
|
1010
|
+
"score_formula_version": 3,
|
|
934
1011
|
"vital_signs": {
|
|
935
1012
|
"dead_file_pct": 3.2,
|
|
936
1013
|
"dead_export_pct": 8.1,
|
|
@@ -1012,6 +1089,13 @@ Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#
|
|
|
1012
1089
|
|
|
1013
1090
|
With `--gate new-only`, inherited error-severity findings can be present in the JSON output while the verdict remains `pass`; check the `attribution` object and per-finding `introduced` booleans.
|
|
1014
1091
|
|
|
1092
|
+
A complexity finding matches its base finding by file path and function name. The line and the exceeded category do not affect the match, and a renamed file keeps its match. A complexity finding is introduced in these cases:
|
|
1093
|
+
|
|
1094
|
+
- No base finding matches it.
|
|
1095
|
+
- A metric that the head finding exceeds has a higher value than in the base finding.
|
|
1096
|
+
|
|
1097
|
+
An unchanged or decreased metric keeps the finding inherited, also when the exceeded category changes (for example from `both` to `cyclomatic`). When one file has more than one finding with the same function name, each base finding matches at most one head finding. Head findings with unchanged metric values match first. The other findings then match in line order.
|
|
1098
|
+
|
|
1015
1099
|
### JSON contract: which fields are severity-aware
|
|
1016
1100
|
|
|
1017
1101
|
| Field | Severity-aware? | What it counts |
|
|
@@ -1062,7 +1146,7 @@ fallow audit \
|
|
|
1062
1146
|
{
|
|
1063
1147
|
"kind": "audit",
|
|
1064
1148
|
"schema_version": 7,
|
|
1065
|
-
"version": "3.
|
|
1149
|
+
"version": "3.33.0",
|
|
1066
1150
|
"command": "audit",
|
|
1067
1151
|
"verdict": "fail",
|
|
1068
1152
|
"changed_files_count": 12,
|
|
@@ -1150,7 +1234,7 @@ fallow flags --format json --quiet --workspace my-package
|
|
|
1150
1234
|
```json
|
|
1151
1235
|
{
|
|
1152
1236
|
"schema_version": 7,
|
|
1153
|
-
"version": "3.
|
|
1237
|
+
"version": "3.33.0",
|
|
1154
1238
|
"elapsed_ms": 116,
|
|
1155
1239
|
"feature_flags": [],
|
|
1156
1240
|
"total_flags": 0
|
|
@@ -1251,7 +1335,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1251
1335
|
{
|
|
1252
1336
|
"kind": "security",
|
|
1253
1337
|
"schema_version": "4",
|
|
1254
|
-
"version": "3.
|
|
1338
|
+
"version": "3.33.0",
|
|
1255
1339
|
"elapsed_ms": 42,
|
|
1256
1340
|
"config": {
|
|
1257
1341
|
"rules": {
|
|
@@ -1280,7 +1364,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1280
1364
|
{
|
|
1281
1365
|
"kind": "security",
|
|
1282
1366
|
"schema_version": "4",
|
|
1283
|
-
"version": "3.
|
|
1367
|
+
"version": "3.33.0",
|
|
1284
1368
|
"elapsed_ms": 42,
|
|
1285
1369
|
"config": {
|
|
1286
1370
|
"rules": {
|
|
@@ -1414,6 +1498,11 @@ Each `--path` hop carries `type_only` and `dynamic`. A `dynamic` hop loads its t
|
|
|
1414
1498
|
<!-- generated:flags:trace:start -->
|
|
1415
1499
|
| Flag | Type | Default | Description |
|
|
1416
1500
|
|---|---|---|---|
|
|
1501
|
+
| `--dependency` | `string` | - | How the code uses each imported name of a package: file and call counts, one hop through project wrappers, and a count of each use that the trace cannot resolve |
|
|
1502
|
+
| `--specifier` | `string` | - | With `--dependency`, report only these imported names (repeatable or comma-separated). Turns on the site page |
|
|
1503
|
+
| `--sites` | `bool` | `false` | With `--dependency`, list the usage sites with file, line and column |
|
|
1504
|
+
| `--limit` | `string` | - | With `--dependency`, the largest number of sites on a page (1 to 500, default 50). Turns on the site page |
|
|
1505
|
+
| `--cursor` | `string` | - | With `--dependency`, the `next_cursor` of the previous page. Turns on the site page |
|
|
1417
1506
|
| `--path` | `string` | - | 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 |
|
|
1418
1507
|
| `--eager-only` | `bool` | `false` | With `--path`, follow only static value imports, so the route explains why TO loads before FROM runs. `import()`, lazy globs, worker loads and `import type` do not qualify |
|
|
1419
1508
|
| `--callers` | `bool` | `false` | Walk UP to callers (modules that import the symbol). When neither `--callers` nor `--callees` is set, both directions are walked |
|
|
@@ -1471,7 +1560,7 @@ fallow explain fallow/code-duplication --format json --quiet
|
|
|
1471
1560
|
"rationale": "Named exports that are never imported by any other module in the project. Includes both direct exports and re-exports through barrel files. The export may still be used locally within the same file.",
|
|
1472
1561
|
"example": "export const formatPrice = ... exists in src/money.ts, but no module imports formatPrice.",
|
|
1473
1562
|
"how_to_fix": "Remove the export or make it file-local. If it is public API, import it from an entry point or add an intentional suppression with context.",
|
|
1474
|
-
"docs": "https://
|
|
1563
|
+
"docs": "https://fallow.tools/docs/explanations/dead-code/#unused-exports"
|
|
1475
1564
|
}
|
|
1476
1565
|
```
|
|
1477
1566
|
|
|
@@ -1561,7 +1650,7 @@ fallow license deactivate
|
|
|
1561
1650
|
|------------|---------|
|
|
1562
1651
|
| `activate` | Install a JWT or start a 30-day trial. JWT input precedence: positional arg > `--from-file` > `--stdin`. |
|
|
1563
1652
|
| `status` | Print tier, seats, features, days-until-expiry, and (when `refresh_after` has passed) a proactive refresh hint. |
|
|
1564
|
-
| `refresh` | Fetch a fresh JWT using the currently stored one as identity proof. Exit 7 on network failure. |
|
|
1653
|
+
| `refresh` | Fetch a fresh JWT using the currently stored one as identity proof, falling back to a full-access API key when that token is missing or too stale. Exit 7 on network failure. |
|
|
1565
1654
|
| `deactivate` | Remove the local license file. |
|
|
1566
1655
|
|
|
1567
1656
|
### `activate` flags
|
|
@@ -1573,6 +1662,19 @@ fallow license deactivate
|
|
|
1573
1662
|
| `--from-file <PATH>` | path | Read a JWT from a file. |
|
|
1574
1663
|
| `--stdin` | bool | Read a JWT from stdin. Conflicts with `--from-file` and positional JWT. |
|
|
1575
1664
|
|
|
1665
|
+
### `refresh` flags
|
|
1666
|
+
|
|
1667
|
+
| Flag | Type | Description |
|
|
1668
|
+
|------|------|-------------|
|
|
1669
|
+
| `--api-key <KEY>` | string | Full-access API key used as the bearer when the stored license JWT is missing or the cloud reports it as `token_stale`. Precedence: this flag > `$FALLOW_API_KEY`. Prefer the environment variable on shared runners so the key stays out of argv. |
|
|
1670
|
+
|
|
1671
|
+
### Credential order for `refresh`
|
|
1672
|
+
|
|
1673
|
+
1. The stored license JWT (`FALLOW_LICENSE`, `FALLOW_LICENSE_PATH`, or `~/.fallow/license.jwt`).
|
|
1674
|
+
2. A full-access API key, when the stored JWT is absent or the cloud answers `token_stale`.
|
|
1675
|
+
|
|
1676
|
+
A machine that has not run fallow for weeks holds a JWT the cloud refuses, and the trial endpoint rejects an organisation that already pays, so the API key is the recovery path. With neither credential available, `refresh` names that route instead of the trial flow.
|
|
1677
|
+
|
|
1576
1678
|
### Storage precedence
|
|
1577
1679
|
|
|
1578
1680
|
1. `FALLOW_LICENSE` (env var holding the full JWT string)
|
|
@@ -1593,7 +1695,7 @@ On HTTP error from `api.fallow.cloud`, fallow parses the `{error, message, code}
|
|
|
1593
1695
|
|
|
1594
1696
|
| Operation + code | CLI message |
|
|
1595
1697
|
|------------------|-------------|
|
|
1596
|
-
| `refresh` + `token_stale` |
|
|
1698
|
+
| `refresh` + `token_stale` | your stored license is too stale to refresh: set `FALLOW_API_KEY` to a full-access key and run `fallow license refresh` again (generate one at `https://fallow.cloud/settings#api-keys`) |
|
|
1597
1699
|
| `refresh` + `invalid_token` | `your stored license token is missing required claims. Reactivate with: fallow license activate --trial --email <addr>` |
|
|
1598
1700
|
| `refresh` or `trial` + `unauthorized` | `authentication failed. Reactivate with: fallow license activate --trial --email <addr>` |
|
|
1599
1701
|
| `trial` + `rate_limit_exceeded` | `trial creation is rate-limited to 5 per hour per IP. Wait an hour or retry from a different network (in CI, start the trial locally and set FALLOW_LICENSE on the runner).` |
|
|
@@ -1676,7 +1778,7 @@ The command does not enable tracking. Only the user may opt in with
|
|
|
1676
1778
|
|
|
1677
1779
|
## `coverage`: Production-Coverage Workflow
|
|
1678
1780
|
|
|
1679
|
-
|
|
1781
|
+
Use the `coverage` subcommands for runtime setup, analysis, inventory upload, and scoped cloud reads:
|
|
1680
1782
|
|
|
1681
1783
|
- `coverage setup` - resumable state machine that wires sidecar installation, framework-aware coverage recipe writing, optional license activation for continuous monitoring, and automatic handoff into `fallow health --runtime-coverage`.
|
|
1682
1784
|
- `coverage analyze` - focused runtime coverage analysis. Local mode reads `--runtime-coverage <path>`; cloud mode requires explicit `--cloud`, `--runtime-coverage-cloud`, or `FALLOW_RUNTIME_COVERAGE_SOURCE=cloud` and never triggers from `FALLOW_API_KEY` alone.
|
|
@@ -1730,13 +1832,14 @@ fallow coverage upload-source-maps --dry-run # print maps and fileNam
|
|
|
1730
1832
|
| `--top <N>` | integer | unset | Show only the top N runtime findings, hot paths, blast-radius entries, and importance entries. Truncation happens before rendering, so it propagates to JSON, human, and cloud-merge output equally. |
|
|
1731
1833
|
| `--blast-radius` | bool | false | Show the first-class blast-radius section in human output. JSON always includes `runtime_coverage.blast_radius` whenever runtime coverage analysis runs. |
|
|
1732
1834
|
| `--importance` | bool | false | Show the first-class importance section in human output. JSON always includes `runtime_coverage.importance` whenever runtime coverage analysis runs. |
|
|
1835
|
+
| `--debug-unmatched` | bool | false | Cloud mode only. List every cloud runtime function with no local counterpart on stderr, highest traffic first, instead of only counting them in the `cloud_functions_unmatched` warning. Stdout stays machine-readable. |
|
|
1733
1836
|
| `--production` | bool | false | Run analyze in production mode, matching `fallow health --production`. Filters out test files and dev-only code paths before merging runtime data. |
|
|
1734
1837
|
| `--min-invocations-hot <N>` | integer | 100 | Hot-path classification threshold. Functions invoked at least N times during the captured window are classified as hot. Mirrors the same flag on `fallow health --runtime-coverage`. |
|
|
1735
1838
|
| `--min-observation-volume <N>` | integer | 5000 | Minimum total trace volume before the sidecar emits high-confidence `safe_to_delete` / `review_required` verdicts. Below this, confidence is capped at `medium`. |
|
|
1736
1839
|
| `--low-traffic-threshold <RATIO>` | decimal | 0.001 | Fraction of total trace count below which an invoked function is classified `low_traffic` rather than `active`. `0.001` = 0.1%. |
|
|
1737
1840
|
| `--explain` | bool | false | With `--format json`, attach a top-level `_meta` block with field definitions, enum values (`data_source`, `test_coverage`, `v8_tracking`, `action_type`, etc.), warning-code documentation, and the docs URL. |
|
|
1738
1841
|
|
|
1739
|
-
Cloud analysis emits the same `runtime_coverage` JSON block as local mode. Its summary includes `data_source: "cloud"`, `last_received_at`, and `capture_quality` derived from the pulled runtime window. Cloud functions that cannot be matched to the local AST/static index are omitted from findings and reported through a `cloud_functions_unmatched` warning.
|
|
1842
|
+
Cloud analysis emits the same `runtime_coverage` JSON block as local mode. Its summary includes `data_source: "cloud"`, `last_received_at`, and `capture_quality` derived from the pulled runtime window. Cloud functions that cannot be matched to the local AST/static index are omitted from findings and reported through a `cloud_functions_unmatched` warning. Matching resolves a runtime file path onto the local tree by file name plus a segment-wise suffix comparison, so a containerized `/app/src/a.ts` reaches `src/a.ts`, and a function whose runtime name differs from the source name (an anonymous callback carrying its callee's name, an accessor keeping its `get` prefix) is matched on position within that file. Ambiguity is never guessed: two local files equally entitled to a runtime path, or two definitions opening on one line with no end line to separate them, stay unmatched. Pass `--debug-unmatched` to list what remains.
|
|
1740
1843
|
|
|
1741
1844
|
Each finding's `actions[].type` uses the canonical kebab-case vocabulary: `delete-cold-code` is emitted on `verdict=safe_to_delete`, `review-runtime` on `verdict=review_required`. The sidecar may emit additional protocol-specific identifiers, so consumers should treat unknown values as forward-compat extensions rather than schema violations.
|
|
1742
1845
|
|
|
@@ -1779,7 +1882,7 @@ Uploads retry network failures, HTTP 429, and HTTP 502/503/504 up to three attem
|
|
|
1779
1882
|
| `--repo <NAME>` | string | `package.json` `repository.url`, then `git remote get-url origin` parsed to `owner/repo` | Repo identifier used in the source-map API path. Must match the beacon's `projectId` (and `upload-inventory`'s `--project-id`); pass `--repo <bare-name>` explicitly if the beacon reports a bare name. |
|
|
1780
1883
|
| `--git-sha <SHA>` | string | `$GITHUB_SHA` -> `$CI_COMMIT_SHA` -> `$COMMIT_SHA` -> `git rev-parse HEAD` | Commit SHA, 7-40 hex chars. |
|
|
1781
1884
|
| `--endpoint <URL>` | string | `$FALLOW_API_URL` or `https://api.fallow.cloud` | Override for staging / on-prem. |
|
|
1782
|
-
| `--strip-path <BOOL>` | bool | `true` | Upload basename-only `fileName` values. Use `--strip-path=false` when runtime coverage reports paths like `assets/app.js`. |
|
|
1885
|
+
| `--strip-path <BOOL>` | bool | `true` | Upload basename-only `fileName` values. Use `--strip-path=false` when runtime coverage reports paths like `assets/app.js`. Maps that share a basename are sent under their build-directory path, so no map replaces another. The command warns when a map's `sources` do not resolve to files in the repository (for example `sourceRoot: "/"` in `tsconfig.json`). |
|
|
1783
1886
|
| `--dry-run` | bool | `false` | Print what would upload; no API key or network call. |
|
|
1784
1887
|
| `--concurrency <N>` | integer | `4` | Parallel upload fanout. |
|
|
1785
1888
|
| `--fail-fast` | bool | `false` | Stop on the first upload failure. |
|
|
@@ -1866,6 +1969,7 @@ Available on all commands:
|
|
|
1866
1969
|
| `-w, --workspace` | `string` | - | Scope to one or more workspaces (comma-separated, globs, `!` negation) |
|
|
1867
1970
|
| `--changed-workspaces` | `string` | - | Git-derived monorepo CI scoping: scope to workspaces containing any file changed since `REF`. Mutually exclusive with `--workspace`. Missing ref is a hard error. |
|
|
1868
1971
|
| `--group-by` | `owner\|directory\|package\|section` | - | Group output by CODEOWNERS ownership (`owner`), first path component (`directory`), workspace package (`package`, aliases: `workspace`, `pkg`), or GitLab CODEOWNERS `[Section]` headers (`section`, alias: `gl-section`). All output formats partition issues into labeled groups. `section` mode attaches an `owners` array to each group in JSON output |
|
|
1972
|
+
| `--group` | `string` | - | Keep only the matching groups of a `--group-by` health run. Accepts exact group keys, glob patterns, and `!`-prefixed negations. Values can be comma-separated or repeated. Project-level sections are not filtered. Supported by `fallow health` only |
|
|
1869
1973
|
| `--performance` | `bool` | `false` | Show pipeline timing breakdown |
|
|
1870
1974
|
| `--explain` | `bool` | `false` | JSON: include metric definitions in `_meta`. Human: print a `Description:` line under each section header. Always on for MCP. |
|
|
1871
1975
|
| `--explain-skipped` | `bool` | `false` | Human/markdown only: show per-pattern counts for files skipped by the default duplicates ignores. `dupes` prints only that breakdown; on `check`, `dead-code`, `audit` and the default run the same flag reports source files the built-in discovery ignores removed |
|
|
@@ -1883,8 +1987,8 @@ Available on all commands:
|
|
|
1883
1987
|
| `--tolerance` | `string` | `0` | Allowed increase: `"2%"` (percentage) or `"5"` (absolute). Default: `"0"` |
|
|
1884
1988
|
| `--regression-baseline` | `string` | - | Path to a standalone regression baseline file. Without it, fallow uses `regression.baseline` from the config |
|
|
1885
1989
|
| `--save-regression-baseline` | `string` | - | Save current issue counts. With no path, update `regression.baseline` in the discovered fallow config or create `.fallowrc.json`; with a path, write a standalone baseline file |
|
|
1886
|
-
| `--only` | `dead-code\|dupes\|health` | - | Run only specific analyses (e.g., `--only dead-code,dupes`). Values: `dead-code` (alias: `check`), `dupes`, `health` |
|
|
1887
|
-
| `--skip` | `dead-code\|dupes\|health` | - | Skip specific analyses (e.g., `--skip health`). Values: `dead-code` (alias: `check`), `dupes`, `health` |
|
|
1990
|
+
| `--only` | `dead-code\|dupes\|health\|architecture` | - | Run only specific analyses (e.g., `--only dead-code,dupes`). Values: `dead-code` (alias: `check`), `dupes`, `health`, `architecture`. `architecture` alone runs the dead-code analysis and reports only import cycles, boundary violations and policy violations |
|
|
1991
|
+
| `--skip` | `dead-code\|dupes\|health\|architecture` | - | Skip specific analyses (e.g., `--skip health`). Values: `dead-code` (alias: `check`), `dupes`, `health`, `architecture`. `architecture` alone removes import cycles, boundary violations and policy violations from the dead-code section |
|
|
1888
1992
|
| `--dupes-mode` | `strict\|mild\|weak\|semantic` | - | Override duplication detection mode in combined mode |
|
|
1889
1993
|
| `--dupes-near` | `bool` | `false` | Enable function-scoped near-miss clone detection in combined mode |
|
|
1890
1994
|
| `--dupes-threshold` | `string` | - | Override duplication threshold in combined mode |
|
|
@@ -1895,14 +1999,18 @@ Available on all commands:
|
|
|
1895
1999
|
| `--dupes-cross-language` | `bool` | `false` | Enable cross-language duplicate detection in combined mode |
|
|
1896
2000
|
| `--dupes-ignore-imports` | `bool` | `false` | Exclude module wiring from duplicate detection in combined mode |
|
|
1897
2001
|
| `--dupes-no-ignore-imports` | `bool` | `false` | Count module wiring as clone candidates in combined mode (opt out of the default exclusion) |
|
|
2002
|
+
| `--dupes-ignore-symlinks` | `bool` | `false` | Omit clone instances whose path is a symlink, or lies under a symlinked directory, in combined mode |
|
|
2003
|
+
| `--dupes-no-ignore-symlinks` | `bool` | `false` | Report symlinked clone instances in combined mode (opt out of a config `duplicates.ignoreSymlinks: true`) |
|
|
1898
2004
|
| `--score` | `bool` | `false` | Compute health score (0-100 with letter grade) in combined mode. Enables the health delta header in PR comments. JSON includes `health_score` object with `score`, `grade`, and `penalties` breakdown |
|
|
1899
2005
|
| `--trend` | `bool` | `false` | Compare current health metrics against saved snapshot. Implies `--score`. Shows per-metric deltas with directional indicators. Requires at least one saved snapshot in `.fallow/snapshots/` |
|
|
2006
|
+
| `--trend-from` | `string` | - | Compare current health metrics against this snapshot file in combined mode. Implies --trend and --score |
|
|
1900
2007
|
| `--save-snapshot` | `string` | - | Save vital signs snapshot for trend tracking. Default path: `.fallow/snapshots/<timestamp>.json`. Forces file-scores + hotspot computation |
|
|
1901
2008
|
| `--coverage` | `string` | - | Path to Istanbul or raw V8 coverage data for exact CRAP scores in combined mode. Also settable via `FALLOW_COVERAGE` or `health.coverage` |
|
|
1902
2009
|
| `--coverage-root` | `string` | - | Absolute prefix to strip from Istanbul file paths in combined mode. Also settable via `FALLOW_COVERAGE_ROOT` or `health.coverageRoot` |
|
|
1903
2010
|
| `--dupes-baseline` | `string` | - | Compare duplication clone groups against a saved baseline in combined mode (produced by `fallow dupes --save-baseline`) |
|
|
1904
2011
|
| `--health-baseline` | `string` | - | Compare health findings against a saved baseline in combined mode (produced by `fallow health --save-baseline`) |
|
|
1905
2012
|
| `--include-entry-exports` | `bool` | `false` | Report unused exports in entry files instead of auto-marking them as used |
|
|
2013
|
+
| `--show-cascade` | `bool` | `false` | Also report the unused exports, types, class members and enum members of unused files. By default the report hides them, because deleting the file removes them, and counts them in `cascade_hidden` |
|
|
1906
2014
|
| `--type-aware` | `bool` | `false` | Opt in to TypeScript semantic analysis for project-wide symbol evidence. This does not emit compiler diagnostics or typed lint findings |
|
|
1907
2015
|
| `--no-type-aware` | `bool` | `false` | Disable TypeScript semantic analysis even when `typeAware.enabled` or `FALLOW_TYPE_AWARE` opts in, keeping this run fully syntactic |
|
|
1908
2016
|
| `--type-aware-project` | `string` | - | TypeScript project config to use for type-aware analysis (repeatable) |
|
|
@@ -1923,8 +2031,8 @@ guarded edits.
|
|
|
1923
2031
|
<!-- generated:flags:fallow-combined:start -->
|
|
1924
2032
|
| Flag | Type | Default | Description |
|
|
1925
2033
|
|---|---|---|---|
|
|
1926
|
-
| `--only` | `dead-code\|dupes\|health` | - | Run only specific analyses when no subcommand is given |
|
|
1927
|
-
| `--skip` | `dead-code\|dupes\|health` | - | Skip specific analyses when no subcommand is given |
|
|
2034
|
+
| `--only` | `dead-code\|dupes\|health\|architecture` | - | Run only specific analyses when no subcommand is given |
|
|
2035
|
+
| `--skip` | `dead-code\|dupes\|health\|architecture` | - | Skip specific analyses when no subcommand is given |
|
|
1928
2036
|
| `--production` | `bool` | `false` | Production mode: exclude test/story/dev files, only start/build scripts, report type-only dependencies |
|
|
1929
2037
|
| `--no-production` | `bool` | `false` | Force production mode OFF for every analysis, overriding a project config's `production: true` (and `FALLOW_PRODUCTION`). Conflicts with `--production` |
|
|
1930
2038
|
| `--production-dead-code` | `bool` | `false` | Run dead-code analysis in production mode when using bare combined mode |
|
|
@@ -1966,6 +2074,7 @@ These are global flags with behavior specific to bare `fallow` combined mode.
|
|
|
1966
2074
|
| `FALLOW_AUDIT_BASE` | Pin the `fallow audit` comparison base when `--base` / `--changed-since` is unset (precedence: flag > env > auto-detect). Escape hatch for the agent gate and forks, e.g. `FALLOW_AUDIT_BASE=upstream/main`. When unset, audit auto-detects the `git merge-base` against the branch's upstream or the remote default. A malformed value exits 2. |
|
|
1967
2075
|
| `FALLOW_AUDIT_CACHE_MAX_AGE_DAYS` | Max age (in days since last reuse or fresh create) of a persistent reusable `fallow audit` base-snapshot worktree cache. Older entries are reclaimed at the top of the next `fallow audit` invocation (default: `30`). Wins over `audit.cacheMaxAgeDays` config field. `0` disables the GC; invalid values log a warning and fall back to config / default. Each sweep also reclaims abandoned entries from other repo identities (deleted or moved repos, other git worktrees); entries whose recorded owner root still exists are left to that repo's own sweep and setting. |
|
|
1968
2076
|
| `FALLOW_UPDATE_CHECK` | Set to `off`, `0`, `false`, `disabled`, or `no` to disable the human-TTY upgrade nudge and its background latest-version check. `DO_NOT_TRACK`, `FALLOW_TELEMETRY_DISABLED`, and CI also suppress it. |
|
|
2077
|
+
| `FALLOW_CLAUDE_CODE_HINT` | Set to `off`, `0`, `false`, `no`, or `disabled` to suppress the one-line Claude Code plugin hint. Fallow writes the hint to stderr only inside a Claude Code session, for human output without `--quiet`, outside CI, and when the project has no Fallow plugin or skill. |
|
|
1969
2078
|
| `FALLOW_SUGGESTIONS` | Set to `off`, `0`, `false`, `no`, or `disabled` to suppress the top-level `next_steps[]` array of read-only follow-up commands in JSON output (and the human `Next:` line on bare `fallow`). Default on. Inherited by the MCP-spawned CLI, so it disables `next_steps` on MCP responses too. Useful for CI consumers that snapshot-diff raw `--format json`. |
|
|
1970
2079
|
| `FALLOW_COMMAND` | GitLab CI: command to run (default: `dead-code`). |
|
|
1971
2080
|
| `FALLOW_FAIL_ON_ISSUES` | GitLab CI: set to `true` to exit 1 if issues found. |
|
|
@@ -2014,6 +2123,8 @@ Set `FALLOW_FORMAT=json` and `FALLOW_QUIET=1` in your agent environment to avoid
|
|
|
2014
2123
|
|
|
2015
2124
|
Provider mutations are isolated per fingerprint. A failed mutation blocks only the remaining operations of that same fingerprint, which is retried whole on the next run, while every other stale fingerprint is still applied. (A preflight failure is different: preflight runs before any mutation, and a failure there abandons the whole plan because the state snapshot is untrustworthy.) If a preflight check, permission error, or provider mutation fails, JSON output keeps `apply_errors` and can add `apply_hint`, `failed_fingerprints`, and `unapplied_fingerprints` so agents and CI wrappers can report what was not fully applied. `fallow ci post-review` reports those same three fields for the reconcile pass it runs after posting new inline comments.
|
|
2016
2125
|
|
|
2126
|
+
Review comments end with a `<!-- fallow-fingerprint:v3: <fp> -->` marker. A dead-code fingerprint comes from the `finding_id`, so a line shift above the finding keeps the thread. When a comment had another fingerprint in an older release, the envelope comment carries that value as `legacy_fingerprint`. For one release, both commands match an open thread with the older `v2` marker through `legacy_fingerprint`: they do not post the finding again and do not resolve the thread as stale.
|
|
2127
|
+
|
|
2017
2128
|
### Flags
|
|
2018
2129
|
|
|
2019
2130
|
| Flag | Type | Description |
|
|
@@ -2068,7 +2179,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
|
|
|
2068
2179
|
{
|
|
2069
2180
|
"kind": "dead-code",
|
|
2070
2181
|
"schema_version": 7,
|
|
2071
|
-
"version": "3.
|
|
2182
|
+
"version": "3.33.0",
|
|
2072
2183
|
"elapsed_ms": 45,
|
|
2073
2184
|
"total_issues": 12,
|
|
2074
2185
|
"entry_points": {
|
|
@@ -2228,7 +2339,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
|
|
|
2228
2339
|
{
|
|
2229
2340
|
"kind": "dupes",
|
|
2230
2341
|
"schema_version": 7,
|
|
2231
|
-
"version": "3.
|
|
2342
|
+
"version": "3.33.0",
|
|
2232
2343
|
"elapsed_ms": 82,
|
|
2233
2344
|
"total_clones": 15,
|
|
2234
2345
|
"total_lines_duplicated": 230,
|
|
@@ -2272,11 +2383,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
|
|
|
2272
2383
|
{
|
|
2273
2384
|
"kind": "combined",
|
|
2274
2385
|
"schema_version": 7,
|
|
2275
|
-
"version": "3.
|
|
2386
|
+
"version": "3.33.0",
|
|
2276
2387
|
"elapsed_ms": 159,
|
|
2277
2388
|
"check": {
|
|
2278
2389
|
"schema_version": 7,
|
|
2279
|
-
"version": "3.
|
|
2390
|
+
"version": "3.33.0",
|
|
2280
2391
|
"elapsed_ms": 45,
|
|
2281
2392
|
"total_issues": 12,
|
|
2282
2393
|
"unused_files": [],
|
|
@@ -2311,7 +2422,7 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
|
|
|
2311
2422
|
}
|
|
2312
2423
|
```
|
|
2313
2424
|
|
|
2314
|
-
Use `--only` or `--skip` to control which analyses are included in the combined output. Use `--coverage` and `--coverage-root` to feed Istanbul coverage data to the embedded health analysis for exact CRAP scoring.
|
|
2425
|
+
Use `--only` or `--skip` to control which analyses are included in the combined output. The `architecture` value selects the import cycles, boundary violations and policy violations of the dead-code analysis: `--only architecture` reports only them, and `--skip architecture` removes them. Human output shows them in an "Architecture" category after the other dead-code categories, with and without `--quiet`, and also with `--group-by` and `--summary`. Use `--coverage` and `--coverage-root` to feed Istanbul coverage data to the embedded health analysis for exact CRAP scoring.
|
|
2315
2426
|
|
|
2316
2427
|
With `--score`, the combined output's `health` section includes a `health_score` object (same schema as `health --score`). With `--trend`, it includes a `health_trend` object comparing against the most recent saved snapshot. With `--save-snapshot`, a vital signs snapshot is persisted for future trend comparisons.
|
|
2317
2428
|
|
|
@@ -2339,8 +2450,8 @@ Config files are searched in priority order: `.fallowrc.json` > `.fallowrc.jsonc
|
|
|
2339
2450
|
// Files to ignore (glob patterns)
|
|
2340
2451
|
"ignorePatterns": ["**/*.generated.ts", "**/*.d.ts"],
|
|
2341
2452
|
|
|
2342
|
-
// Dependencies to ignore
|
|
2343
|
-
"ignoreDependencies": ["autoprefixer"],
|
|
2453
|
+
// Dependencies to ignore (exact names, or globs such as "@acme/*")
|
|
2454
|
+
"ignoreDependencies": ["autoprefixer", "@acme/*"],
|
|
2344
2455
|
|
|
2345
2456
|
// Suppress unused-export findings when the symbol is referenced inside its
|
|
2346
2457
|
// declaring file (knip parity). Boolean or { type, interface } object form.
|
|
@@ -2383,7 +2494,7 @@ Config files are searched in priority order: `.fallowrc.json` > `.fallowrc.jsonc
|
|
|
2383
2494
|
"ignoreDefaults": true,
|
|
2384
2495
|
"ignoredClones": ["dup:6f12ab34:2"],
|
|
2385
2496
|
"skipLocal": false,
|
|
2386
|
-
"
|
|
2497
|
+
"ignore": ["**/*.generated.ts"]
|
|
2387
2498
|
},
|
|
2388
2499
|
|
|
2389
2500
|
// Extraction cache settings. FALLOW_CACHE_DIR overrides cache.dir.
|