fallow 3.25.0 → 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,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.25.0",
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": [
@@ -255,7 +255,7 @@
255
255
  "name": "--explain-skipped",
256
256
  "type": "bool",
257
257
  "required": false,
258
- "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",
259
259
  "possible_values": [
260
260
  "true",
261
261
  "false"
@@ -320,6 +320,16 @@
320
320
  "false"
321
321
  ]
322
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
+ },
323
333
  {
324
334
  "name": "--tolerance",
325
335
  "type": "string",
@@ -7252,7 +7262,7 @@
7252
7262
  ]
7253
7263
  },
7254
7264
  "plugins": {
7255
- "count": 125,
7265
+ "count": 126,
7256
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",
7257
7267
  "names": [
7258
7268
  "nextjs",
@@ -7326,6 +7336,7 @@
7326
7336
  "biome",
7327
7337
  "stylelint",
7328
7338
  "prettier",
7339
+ "oxfmt",
7329
7340
  "oxlint",
7330
7341
  "markdownlint",
7331
7342
  "cspell",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.25.0",
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.25.0",
92
- "@fallow-cli/darwin-x64": "3.25.0",
93
- "@fallow-cli/linux-x64-gnu": "3.25.0",
94
- "@fallow-cli/linux-arm64-gnu": "3.25.0",
95
- "@fallow-cli/linux-x64-musl": "3.25.0",
96
- "@fallow-cli/linux-arm64-musl": "3.25.0",
97
- "@fallow-cli/win32-arm64-msvc": "3.25.0",
98
- "@fallow-cli/win32-x64-msvc": "3.25.0",
99
- "fallow-type-aware": "3.25.0"
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.25.0",
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.25.0",
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.25.0",
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.25.0",
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.25.0",
1263
+ "version": "3.26.0",
1264
1264
  "elapsed_ms": 42,
1265
1265
  "config": {
1266
1266
  "rules": {
@@ -1836,7 +1836,7 @@ Available on all commands:
1836
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 |
1837
1837
  | `--performance` | `bool` | `false` | Show pipeline timing breakdown |
1838
1838
  | `--explain` | `bool` | `false` | JSON: include metric definitions in `_meta`. Human: print a `Description:` line under each section header. Always on for MCP. |
1839
- | `--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 |
1840
1840
  | `--summary` | `bool` | `false` | Show only category counts without individual items. Useful for dashboards and quick overviews |
1841
1841
  | `--ci` | `bool` | `false` | CI mode: `--format sarif --fail-on-issues --quiet` |
1842
1842
  | `--fail-on-issues` | `bool` | `false` | Exit 1 if any issues found (promotes `warn` to `error`) |
@@ -1844,6 +1844,7 @@ Available on all commands:
1844
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 |
1845
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` |
1846
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 |
1847
1848
  | `--tolerance` | `string` | `0` | Allowed increase: `"2%"` (percentage) or `"5"` (absolute). Default: `"0"` |
1848
1849
  | `--regression-baseline` | `string` | - | Path to a standalone regression baseline file. Without it, fallow uses `regression.baseline` from the config |
1849
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 |
@@ -2029,7 +2030,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
2029
2030
  {
2030
2031
  "kind": "dead-code",
2031
2032
  "schema_version": 7,
2032
- "version": "3.25.0",
2033
+ "version": "3.26.0",
2033
2034
  "elapsed_ms": 45,
2034
2035
  "total_issues": 12,
2035
2036
  "entry_points": {
@@ -2189,7 +2190,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
2189
2190
  {
2190
2191
  "kind": "dupes",
2191
2192
  "schema_version": 7,
2192
- "version": "3.25.0",
2193
+ "version": "3.26.0",
2193
2194
  "elapsed_ms": 82,
2194
2195
  "total_clones": 15,
2195
2196
  "total_lines_duplicated": 230,
@@ -2233,11 +2234,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
2233
2234
  {
2234
2235
  "kind": "combined",
2235
2236
  "schema_version": 7,
2236
- "version": "3.25.0",
2237
+ "version": "3.26.0",
2237
2238
  "elapsed_ms": 159,
2238
2239
  "check": {
2239
2240
  "schema_version": 7,
2240
- "version": "3.25.0",
2241
+ "version": "3.26.0",
2241
2242
  "elapsed_ms": 45,
2242
2243
  "total_issues": 12,
2243
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
  /**