fallow 3.24.1 → 3.26.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 CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.24.1",
3
+ "version": "3.26.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": [
7
+ {
8
+ "name": "path",
9
+ "type": "string",
10
+ "required": false,
11
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
12
+ },
7
13
  {
8
14
  "name": "--root",
9
15
  "type": "string",
@@ -249,7 +255,7 @@
249
255
  "name": "--explain-skipped",
250
256
  "type": "bool",
251
257
  "required": false,
252
- "description": "Show a per-pattern breakdown for default duplicate ignores",
258
+ "description": "Show per-pattern counts for skipped files: default duplicate ignores on dupes and audit, built-in discovery ignores on check, dead-code, audit and the default run",
253
259
  "possible_values": [
254
260
  "true",
255
261
  "false"
@@ -314,6 +320,16 @@
314
320
  "false"
315
321
  ]
316
322
  },
323
+ {
324
+ "name": "--fail-on-stale-baseline",
325
+ "type": "bool",
326
+ "required": false,
327
+ "description": "Exit with code 1 if a loaded --baseline has entries that match nothing in this run",
328
+ "possible_values": [
329
+ "true",
330
+ "false"
331
+ ]
332
+ },
317
333
  {
318
334
  "name": "--tolerance",
319
335
  "type": "string",
@@ -882,6 +898,12 @@
882
898
  "type": "string",
883
899
  "required": false,
884
900
  "description": "Only report issues in the specified file(s). Accepts multiple values. The full project graph is still built, but only issues in matching files are reported. Useful for lint-staged pre-commit hooks"
901
+ },
902
+ {
903
+ "name": "path",
904
+ "type": "string",
905
+ "required": false,
906
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
885
907
  }
886
908
  ]
887
909
  },
@@ -938,6 +960,12 @@
938
960
  "type": "string",
939
961
  "required": false,
940
962
  "description": "Report pairs touching one of these project-relative files"
963
+ },
964
+ {
965
+ "name": "path",
966
+ "type": "string",
967
+ "required": false,
968
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
941
969
  }
942
970
  ]
943
971
  },
@@ -1068,6 +1096,12 @@
1068
1096
  "true",
1069
1097
  "false"
1070
1098
  ]
1099
+ },
1100
+ {
1101
+ "name": "path",
1102
+ "type": "string",
1103
+ "required": false,
1104
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed. Only fixes touching scoped files are planned and applied"
1071
1105
  }
1072
1106
  ]
1073
1107
  },
@@ -1249,6 +1283,12 @@
1249
1283
  "true",
1250
1284
  "false"
1251
1285
  ]
1286
+ },
1287
+ {
1288
+ "name": "path",
1289
+ "type": "string",
1290
+ "required": false,
1291
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
1252
1292
  }
1253
1293
  ]
1254
1294
  },
@@ -1368,6 +1408,12 @@
1368
1408
  "type": "string",
1369
1409
  "required": false,
1370
1410
  "description": "Trace all clones at a specific location (format: `FILE:LINE`)"
1411
+ },
1412
+ {
1413
+ "name": "path",
1414
+ "type": "string",
1415
+ "required": false,
1416
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
1371
1417
  }
1372
1418
  ]
1373
1419
  },
@@ -1626,6 +1672,12 @@
1626
1672
  "type": "string",
1627
1673
  "required": false,
1628
1674
  "description": "Fraction of total trace count below which an invoked function is classified as `low_traffic` rather than `active`. Expressed as a decimal (e.g. `0.001` for 0.1%). Omit to use the sidecar's spec default (0.001)"
1675
+ },
1676
+ {
1677
+ "name": "path",
1678
+ "type": "string",
1679
+ "required": false,
1680
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
1629
1681
  }
1630
1682
  ]
1631
1683
  },
@@ -1857,11 +1909,17 @@
1857
1909
  "name": "--show-deprioritized",
1858
1910
  "type": "bool",
1859
1911
  "required": false,
1860
- "description": "Expand the de-prioritized units in the review brief's weighted focus map (\"show me what you de-prioritized\"). The `deprioritized` escape-hatch list is ALWAYS present in `--format json` regardless; this flag only re-expands the collapse-by-default human focus render. Only consulted on the brief path",
1912
+ "description": "Expand the de-prioritized units in the review brief's weighted focus map (\"show me what you de-prioritized\"). The `deprioritized` escape-hatch list is ALWAYS present in `--format json` regardless; this flag only re-expands the collapse-by-default human focus render. Only consulted on the `--walkthrough` path",
1861
1913
  "possible_values": [
1862
1914
  "true",
1863
1915
  "false"
1864
1916
  ]
1917
+ },
1918
+ {
1919
+ "name": "path",
1920
+ "type": "string",
1921
+ "required": false,
1922
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
1865
1923
  }
1866
1924
  ]
1867
1925
  },
@@ -1960,6 +2018,12 @@
1960
2018
  "true",
1961
2019
  "false"
1962
2020
  ]
2021
+ },
2022
+ {
2023
+ "name": "path",
2024
+ "type": "string",
2025
+ "required": false,
2026
+ "description": "Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed"
1963
2027
  }
1964
2028
  ]
1965
2029
  },
@@ -7198,7 +7262,7 @@
7198
7262
  ]
7199
7263
  },
7200
7264
  "plugins": {
7201
- "count": 125,
7265
+ "count": 126,
7202
7266
  "note": "Built-in framework plugins, auto-activated when their enabler dependency is present; run fallow list --plugins for the set active in a specific project",
7203
7267
  "names": [
7204
7268
  "nextjs",
@@ -7272,6 +7336,7 @@
7272
7336
  "biome",
7273
7337
  "stylelint",
7274
7338
  "prettier",
7339
+ "oxfmt",
7275
7340
  "oxlint",
7276
7341
  "markdownlint",
7277
7342
  "cspell",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.24.1",
3
+ "version": "3.26.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",
@@ -88,14 +88,14 @@
88
88
  "@tanstack/intent": "0.3.8"
89
89
  },
90
90
  "optionalDependencies": {
91
- "@fallow-cli/darwin-arm64": "3.24.1",
92
- "@fallow-cli/darwin-x64": "3.24.1",
93
- "@fallow-cli/linux-x64-gnu": "3.24.1",
94
- "@fallow-cli/linux-arm64-gnu": "3.24.1",
95
- "@fallow-cli/linux-x64-musl": "3.24.1",
96
- "@fallow-cli/linux-arm64-musl": "3.24.1",
97
- "@fallow-cli/win32-arm64-msvc": "3.24.1",
98
- "@fallow-cli/win32-x64-msvc": "3.24.1",
99
- "fallow-type-aware": "3.24.1"
91
+ "@fallow-cli/darwin-arm64": "3.26.0",
92
+ "@fallow-cli/darwin-x64": "3.26.0",
93
+ "@fallow-cli/linux-x64-gnu": "3.26.0",
94
+ "@fallow-cli/linux-arm64-gnu": "3.26.0",
95
+ "@fallow-cli/linux-x64-musl": "3.26.0",
96
+ "@fallow-cli/linux-arm64-musl": "3.26.0",
97
+ "@fallow-cli/win32-arm64-msvc": "3.26.0",
98
+ "@fallow-cli/win32-x64-msvc": "3.26.0",
99
+ "fallow-type-aware": "3.26.0"
100
100
  }
101
101
  }
package/schema.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "default": []
37
37
  },
38
38
  "ignorePatterns": {
39
- "description": "An array of project-root-relative glob patterns for files to exclude from analysis entirely; entries are unioned with fallow's built-in defaults (**/node_modules/**, **/dist/**, build/**, **/.git/**, **/coverage/**, **/*.min.js, **/*.min.mjs, **/*.min.cjs, **/*.bundle.js), so custom globs add to rather than replace them. Set it (e.g. `[\"generated/**\"]`) to drop generated or vendored trees from every detector; patterns are validated at load.",
39
+ "description": "An array of project-root-relative glob patterns for files to exclude from analysis entirely; entries are unioned with fallow's built-in defaults (**/node_modules/**, **/dist/**, **/build/**, **/.git/**, **/coverage/**, **/*.min.js, **/*.min.mjs, **/*.min.cjs, **/*.bundle.js), so custom globs add to rather than replace them. Set it (e.g. `[\"generated/**\"]`) to drop generated or vendored trees from every detector; patterns are validated at load.",
40
40
  "type": "array",
41
41
  "items": {
42
42
  "type": "string"
@@ -373,6 +373,8 @@
373
373
  }
374
374
  },
375
375
  "additionalProperties": false,
376
+ "allowComments": true,
377
+ "allowTrailingCommas": true,
376
378
  "$defs": {
377
379
  "ExternalPluginDef": {
378
380
  "description": "A declarative plugin definition loaded from a standalone file or inline config.\n\nExternal plugins provide the same static pattern capabilities as built-in\nplugins (entry points, always-used files, used exports, tooling dependencies),\nbut are defined in standalone files or inline in the fallow config rather than\ncompiled Rust code.\n\nThey cannot do AST-based config parsing (`resolve_config()`), but cover the\nvast majority of framework integration use cases.\n\nSupports JSONC, JSON, and TOML formats. All use camelCase field names.\n\n```json\n{\n \"$schema\": \"https://raw.githubusercontent.com/fallow-rs/fallow/main/plugin-schema.json\",\n \"name\": \"my-framework\",\n \"enablers\": [\"my-framework\", \"@my-framework/core\"],\n \"entryPoints\": [\"src/routes/**/*.{ts,tsx}\"],\n \"configPatterns\": [\"my-framework.config.{ts,js}\"],\n \"alwaysUsed\": [\"src/setup.ts\"],\n \"toolingDependencies\": [\"my-framework-cli\"],\n \"usedExports\": [\n { \"pattern\": \"src/routes/**/*.{ts,tsx}\", \"exports\": [\"default\", \"loader\", \"action\"] }\n ]\n}\n```",
@@ -446,7 +446,7 @@ Human output groups paths under "Shared with your team (commit these)" and "Loca
446
446
  {
447
447
  "kind": "agent-install",
448
448
  "schema_version": 1,
449
- "fallow_version": "3.24.1",
449
+ "fallow_version": "3.26.0",
450
450
  "root": "/abs/path",
451
451
  "mode": "install",
452
452
  "dry_run": false,
@@ -650,7 +650,7 @@ fallow health --format json --quiet --trend
650
650
  {
651
651
  "kind": "health",
652
652
  "schema_version": 7,
653
- "version": "3.24.1",
653
+ "version": "3.26.0",
654
654
  "elapsed_ms": 32,
655
655
  "summary": {
656
656
  "files_analyzed": 482,
@@ -1053,7 +1053,7 @@ fallow audit \
1053
1053
  {
1054
1054
  "kind": "audit",
1055
1055
  "schema_version": 7,
1056
- "version": "3.24.1",
1056
+ "version": "3.26.0",
1057
1057
  "command": "audit",
1058
1058
  "verdict": "fail",
1059
1059
  "changed_files_count": 12,
@@ -1130,7 +1130,7 @@ fallow flags --format json --quiet --workspace my-package
1130
1130
  ```json
1131
1131
  {
1132
1132
  "schema_version": 7,
1133
- "version": "3.24.1",
1133
+ "version": "3.26.0",
1134
1134
  "elapsed_ms": 116,
1135
1135
  "feature_flags": [],
1136
1136
  "total_flags": 0
@@ -1231,7 +1231,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1231
1231
  {
1232
1232
  "kind": "security",
1233
1233
  "schema_version": "4",
1234
- "version": "3.24.1",
1234
+ "version": "3.26.0",
1235
1235
  "elapsed_ms": 42,
1236
1236
  "config": {
1237
1237
  "rules": {
@@ -1260,7 +1260,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1260
1260
  {
1261
1261
  "kind": "security",
1262
1262
  "schema_version": "4",
1263
- "version": "3.24.1",
1263
+ "version": "3.26.0",
1264
1264
  "elapsed_ms": 42,
1265
1265
  "config": {
1266
1266
  "rules": {
@@ -1808,6 +1808,7 @@ Available on all commands:
1808
1808
  <!-- generated:flags:global:start -->
1809
1809
  | Flag | Type | Default | Description |
1810
1810
  |---|---|---|---|
1811
+ | `path` | `string` | - | Scope reported findings to this file or directory (default: whole project). The full project graph is still built; only reported items are narrowed |
1811
1812
  | `-r, --root` | `string` | - | Project root directory |
1812
1813
  | `-c, --config` | `string` | - | Config file path |
1813
1814
  | `--allow-remote-extends` | `bool` | `false` | Allow trusted config files to extend HTTPS URLs |
@@ -1835,7 +1836,7 @@ Available on all commands:
1835
1836
  | `--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 |
1836
1837
  | `--performance` | `bool` | `false` | Show pipeline timing breakdown |
1837
1838
  | `--explain` | `bool` | `false` | JSON: include metric definitions in `_meta`. Human: print a `Description:` line under each section header. Always on for MCP. |
1838
- | `--explain-skipped` | `bool` | `false` | Show a per-pattern breakdown for default duplicate ignores |
1839
+ | `--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 |
1839
1840
  | `--summary` | `bool` | `false` | Show only category counts without individual items. Useful for dashboards and quick overviews |
1840
1841
  | `--ci` | `bool` | `false` | CI mode: `--format sarif --fail-on-issues --quiet` |
1841
1842
  | `--fail-on-issues` | `bool` | `false` | Exit 1 if any issues found (promotes `warn` to `error`) |
@@ -1843,6 +1844,7 @@ Available on all commands:
1843
1844
  | `-o, --output-file` | `string` | - | Write the report to a file instead of stdout, for any --format (no ANSI codes). Useful on large projects where the terminal scrollback truncates the top. Progress and the confirmation stay on stderr |
1844
1845
  | `--report-path-prefix` | `string` | - | Prefix prepended to every path in the CI-facing formats (`github-annotations`, `github-summary`, `codeclimate`, `review-github`, `review-gitlab`). CI platforms address files by repository-root-relative path, so when the analyzed project lives in a subdirectory (e.g. `packages/app/`), paths need that offset. fallow detects the offset via the git toplevel automatically; this flag overrides the detection. Pass an empty string to disable rebasing and emit paths relative to `--root` |
1845
1846
  | `--fail-on-regression` | `bool` | `false` | Fail if issue count increased beyond tolerance vs a regression baseline |
1847
+ | `--fail-on-stale-baseline` | `bool` | `false` | Exit with code 1 if a loaded --baseline has entries that match nothing in this run |
1846
1848
  | `--tolerance` | `string` | `0` | Allowed increase: `"2%"` (percentage) or `"5"` (absolute). Default: `"0"` |
1847
1849
  | `--regression-baseline` | `string` | - | Path to a standalone regression baseline file. Without it, fallow uses `regression.baseline` from the config |
1848
1850
  | `--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 |
@@ -2028,7 +2030,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
2028
2030
  {
2029
2031
  "kind": "dead-code",
2030
2032
  "schema_version": 7,
2031
- "version": "3.24.1",
2033
+ "version": "3.26.0",
2032
2034
  "elapsed_ms": 45,
2033
2035
  "total_issues": 12,
2034
2036
  "entry_points": {
@@ -2188,7 +2190,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
2188
2190
  {
2189
2191
  "kind": "dupes",
2190
2192
  "schema_version": 7,
2191
- "version": "3.24.1",
2193
+ "version": "3.26.0",
2192
2194
  "elapsed_ms": 82,
2193
2195
  "total_clones": 15,
2194
2196
  "total_lines_duplicated": 230,
@@ -2232,11 +2234,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
2232
2234
  {
2233
2235
  "kind": "combined",
2234
2236
  "schema_version": 7,
2235
- "version": "3.24.1",
2237
+ "version": "3.26.0",
2236
2238
  "elapsed_ms": 159,
2237
2239
  "check": {
2238
2240
  "schema_version": 7,
2239
- "version": "3.24.1",
2241
+ "version": "3.26.0",
2240
2242
  "elapsed_ms": 45,
2241
2243
  "total_issues": 12,
2242
2244
  "unused_files": [],
@@ -500,6 +500,31 @@ kind: "node-modules-missing"
500
500
  kind: "boundaries-not-configured"
501
501
  } | {
502
502
  kind: "rule-packs-not-configured"
503
+ } | {
504
+ /**
505
+ * The built-in glob that matched, verbatim (for example
506
+ * `** /build/**`).
507
+ */
508
+ pattern: string
509
+ /**
510
+ * Candidate source files this pattern excluded in this walk, across
511
+ * every directory it matched, not just the one `path` anchors at.
512
+ * Exact: the walk counts each excluded candidate once.
513
+ */
514
+ file_count: number
515
+ /**
516
+ * Distinct directories this pattern matched at, `path` included, and
517
+ * not the number of directories that held the files. A
518
+ * directory-shaped pattern (`** /dist/**`) matches at the directory it
519
+ * names, so an excluded subtree counts once however many nested
520
+ * directories inside it held source: a `dist/` holding files in three
521
+ * sub-directories reports `1`. A file-shaped pattern (`** /*.min.js`)
522
+ * has no directory to collapse to and counts each matched file's own
523
+ * parent. Exact either way, and anything above `1` says `path` names
524
+ * one matched location out of several.
525
+ */
526
+ directory_count: number
527
+ kind: "excluded-by-default-ignore"
503
528
  })
504
529
  /**
505
530
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
@@ -2663,7 +2688,8 @@ _meta?: (Meta | null)
2663
2688
  * `malformed-tsconfig`, `tsconfig-reference-dir-missing`;
2664
2689
  * - source discovery, during the file walk: `skipped-large-file`,
2665
2690
  * `skipped-minified-file`, `skipped-source-dotdir`,
2666
- * `source-read-failure`, `source-parse-degraded`;
2691
+ * `excluded-by-default-ignore`, `source-read-failure`,
2692
+ * `source-parse-degraded`;
2667
2693
  * - dead-code analysis, from the dependency-catalog and override
2668
2694
  * detectors: `malformed-pnpm-workspace-yaml`,
2669
2695
  * `bun-lockb-override-resolution-skipped`.
@@ -2684,6 +2710,18 @@ _meta?: (Meta | null)
2684
2710
  * optional `reachability_caveats[]` array, and a reader who never scrolls
2685
2711
  * back up to this list still sees it. `fallow fix` reads the same array
2686
2712
  * and withholds the removal while a caveat stands.
2713
+ *
2714
+ * `excluded-by-default-ignore` is the one source-discovery kind that
2715
+ * reports unseen files WITHOUT raising a caveat. It names a built-in
2716
+ * ignore pattern (`** /dist/**`, `** /build/**`, `** /coverage/**`, or one
2717
+ * of the four minified-bundle globs) that removed candidate source files
2718
+ * from the walk, which is designed behavior on generated output rather
2719
+ * than a degraded run, so it is advisory only and no finding inherits it.
2720
+ * One entry per pattern, never per file, so the array stays bounded on a
2721
+ * project of any size. Gitignored trees are pruned before the walk sees
2722
+ * them and count zero, and `** /node_modules/**` is never reported:
2723
+ * installed dependencies are not the first-party source the kind is
2724
+ * about.
2687
2725
  */
2688
2726
  workspace_diagnostics?: WorkspaceDiagnostic[]
2689
2727
  /**
@@ -6034,9 +6072,10 @@ stale_entries: number
6034
6072
  moved_entries: number
6035
6073
  /**
6036
6074
  * True when this run analyzed a subset of the project (changed-file,
6037
- * diff, or workspace scoping), so the baseline was compared against a
6038
- * narrowed finding set and staleness cannot be judged. `stale` is always
6039
- * false on scoped runs.
6075
+ * diff, or workspace scoping, or production mode, which drops test, story
6076
+ * and dev files), so the baseline was compared against a narrowed finding
6077
+ * set and staleness cannot be judged. `stale` is always false on scoped
6078
+ * runs.
6040
6079
  */
6041
6080
  change_scoped: boolean
6042
6081
  /**