fallow 3.34.0 → 3.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/capabilities.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.34.0",
3
+ "version": "3.34.1",
4
4
  "manifest_version": "1",
5
5
  "description": "Codebase analyzer for TypeScript/JavaScript: unused code, circular dependencies, code duplication, complexity hotspots, and architecture boundary violations",
6
6
  "global_flags": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.34.0",
3
+ "version": "3.34.1",
4
4
  "mcpName": "io.github.fallow-rs/fallow",
5
5
  "description": "Codebase intelligence for TypeScript and JavaScript: health, complexity, duplication, architecture, styling drift, and unused code from one graph. CLI, LSP, and MCP server. Zero config for over 100 frameworks.",
6
6
  "license": "MIT",
@@ -89,14 +89,14 @@
89
89
  "@tanstack/intent": "0.5.5"
90
90
  },
91
91
  "optionalDependencies": {
92
- "@fallow-cli/darwin-arm64": "3.34.0",
93
- "@fallow-cli/darwin-x64": "3.34.0",
94
- "@fallow-cli/linux-x64-gnu": "3.34.0",
95
- "@fallow-cli/linux-arm64-gnu": "3.34.0",
96
- "@fallow-cli/linux-x64-musl": "3.34.0",
97
- "@fallow-cli/linux-arm64-musl": "3.34.0",
98
- "@fallow-cli/win32-arm64-msvc": "3.34.0",
99
- "@fallow-cli/win32-x64-msvc": "3.34.0",
100
- "fallow-type-aware": "3.34.0"
92
+ "@fallow-cli/darwin-arm64": "3.34.1",
93
+ "@fallow-cli/darwin-x64": "3.34.1",
94
+ "@fallow-cli/linux-x64-gnu": "3.34.1",
95
+ "@fallow-cli/linux-arm64-gnu": "3.34.1",
96
+ "@fallow-cli/linux-x64-musl": "3.34.1",
97
+ "@fallow-cli/linux-arm64-musl": "3.34.1",
98
+ "@fallow-cli/win32-arm64-msvc": "3.34.1",
99
+ "@fallow-cli/win32-x64-msvc": "3.34.1",
100
+ "fallow-type-aware": "3.34.1"
101
101
  }
102
102
  }
@@ -440,7 +440,7 @@ The `--entry-weight` JSON output carries `entry_weight.entries[]`, one row per r
440
440
 
441
441
  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.
442
442
 
443
- 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.
443
+ 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`, `workspace-glob-outside-root`, `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.
444
444
 
445
445
  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`.
446
446
 
@@ -526,7 +526,7 @@ Human output groups paths under "Shared with your team (commit these)" and "Loca
526
526
  {
527
527
  "kind": "agent-install",
528
528
  "schema_version": 1,
529
- "fallow_version": "3.34.0",
529
+ "fallow_version": "3.34.1",
530
530
  "root": "/abs/path",
531
531
  "mode": "install",
532
532
  "dry_run": false,
@@ -737,7 +737,7 @@ fallow health --format json --quiet --trend
737
737
  {
738
738
  "kind": "health",
739
739
  "schema_version": 7,
740
- "version": "3.34.0",
740
+ "version": "3.34.1",
741
741
  "elapsed_ms": 32,
742
742
  "summary": {
743
743
  "files_analyzed": 482,
@@ -1200,7 +1200,7 @@ fallow audit \
1200
1200
  {
1201
1201
  "kind": "audit",
1202
1202
  "schema_version": 7,
1203
- "version": "3.34.0",
1203
+ "version": "3.34.1",
1204
1204
  "command": "audit",
1205
1205
  "verdict": "fail",
1206
1206
  "changed_files_count": 12,
@@ -1288,7 +1288,7 @@ fallow flags --format json --quiet --workspace my-package
1288
1288
  ```json
1289
1289
  {
1290
1290
  "schema_version": 7,
1291
- "version": "3.34.0",
1291
+ "version": "3.34.1",
1292
1292
  "elapsed_ms": 116,
1293
1293
  "feature_flags": [],
1294
1294
  "total_flags": 0
@@ -1389,7 +1389,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1389
1389
  {
1390
1390
  "kind": "security",
1391
1391
  "schema_version": "4",
1392
- "version": "3.34.0",
1392
+ "version": "3.34.1",
1393
1393
  "elapsed_ms": 42,
1394
1394
  "config": {
1395
1395
  "rules": {
@@ -1418,7 +1418,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1418
1418
  {
1419
1419
  "kind": "security",
1420
1420
  "schema_version": "4",
1421
- "version": "3.34.0",
1421
+ "version": "3.34.1",
1422
1422
  "elapsed_ms": 42,
1423
1423
  "config": {
1424
1424
  "rules": {
@@ -2233,7 +2233,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
2233
2233
  {
2234
2234
  "kind": "dead-code",
2235
2235
  "schema_version": 7,
2236
- "version": "3.34.0",
2236
+ "version": "3.34.1",
2237
2237
  "elapsed_ms": 45,
2238
2238
  "total_issues": 12,
2239
2239
  "entry_points": {
@@ -2393,7 +2393,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
2393
2393
  {
2394
2394
  "kind": "dupes",
2395
2395
  "schema_version": 7,
2396
- "version": "3.34.0",
2396
+ "version": "3.34.1",
2397
2397
  "elapsed_ms": 82,
2398
2398
  "total_clones": 15,
2399
2399
  "total_lines_duplicated": 230,
@@ -2437,11 +2437,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
2437
2437
  {
2438
2438
  "kind": "combined",
2439
2439
  "schema_version": 7,
2440
- "version": "3.34.0",
2440
+ "version": "3.34.1",
2441
2441
  "elapsed_ms": 159,
2442
2442
  "check": {
2443
2443
  "schema_version": 7,
2444
- "version": "3.34.0",
2444
+ "version": "3.34.1",
2445
2445
  "elapsed_ms": 45,
2446
2446
  "total_issues": 12,
2447
2447
  "unused_files": [],
@@ -571,6 +571,12 @@ kind: "malformed-package-json"
571
571
  pattern: string
572
572
  kind: "glob-matched-no-package-json"
573
573
  } | {
574
+ /**
575
+ * The workspace entry, as written in the file.
576
+ */
577
+ pattern: string
578
+ kind: "workspace-glob-outside-root"
579
+ } | {
574
580
  /**
575
581
  * JSONC parse error text.
576
582
  */
@@ -3372,7 +3378,8 @@ _meta?: (Meta | null)
3372
3378
  *
3373
3379
  * - workspace discovery, at config load: `undeclared-workspace`,
3374
3380
  * `malformed-package-json`, `glob-matched-no-package-json`,
3375
- * `malformed-tsconfig`, `tsconfig-reference-dir-missing`;
3381
+ * `workspace-glob-outside-root`, `malformed-tsconfig`,
3382
+ * `tsconfig-reference-dir-missing`;
3376
3383
  * - source discovery, during the file walk: `skipped-large-file`,
3377
3384
  * `skipped-minified-file`, `skipped-source-dotdir`,
3378
3385
  * `excluded-by-default-ignore`, `source-read-failure`,
@@ -16643,7 +16650,8 @@ _meta?: (Meta | null)
16643
16650
  *
16644
16651
  * - workspace discovery, at config load: `undeclared-workspace`,
16645
16652
  * `malformed-package-json`, `glob-matched-no-package-json`,
16646
- * `malformed-tsconfig`, `tsconfig-reference-dir-missing`;
16653
+ * `workspace-glob-outside-root`, `malformed-tsconfig`,
16654
+ * `tsconfig-reference-dir-missing`;
16647
16655
  * - source discovery, during the file walk: `skipped-large-file`,
16648
16656
  * `skipped-minified-file`, `skipped-source-dotdir`,
16649
16657
  * `excluded-by-default-ignore`, `source-read-failure`,