fallow 3.20.0 → 3.21.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.20.0",
3
+ "version": "3.21.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": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "3.20.0",
3
+ "version": "3.21.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.6"
89
89
  },
90
90
  "optionalDependencies": {
91
- "@fallow-cli/darwin-arm64": "3.20.0",
92
- "@fallow-cli/darwin-x64": "3.20.0",
93
- "@fallow-cli/linux-x64-gnu": "3.20.0",
94
- "@fallow-cli/linux-arm64-gnu": "3.20.0",
95
- "@fallow-cli/linux-x64-musl": "3.20.0",
96
- "@fallow-cli/linux-arm64-musl": "3.20.0",
97
- "@fallow-cli/win32-arm64-msvc": "3.20.0",
98
- "@fallow-cli/win32-x64-msvc": "3.20.0",
99
- "fallow-type-aware": "3.20.0"
91
+ "@fallow-cli/darwin-arm64": "3.21.0",
92
+ "@fallow-cli/darwin-x64": "3.21.0",
93
+ "@fallow-cli/linux-x64-gnu": "3.21.0",
94
+ "@fallow-cli/linux-arm64-gnu": "3.21.0",
95
+ "@fallow-cli/linux-x64-musl": "3.21.0",
96
+ "@fallow-cli/linux-arm64-musl": "3.21.0",
97
+ "@fallow-cli/win32-arm64-msvc": "3.21.0",
98
+ "@fallow-cli/win32-x64-msvc": "3.21.0",
99
+ "fallow-type-aware": "3.21.0"
100
100
  }
101
101
  }
@@ -299,7 +299,7 @@ fallow list --workspaces --format json --quiet
299
299
  fallow workspaces --format json --quiet # alias of `fallow list --workspaces`
300
300
  ```
301
301
 
302
- 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`, `source-read-failure`, `bun-lockb-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` and `skipped-minified-file`, since those reach an envelope only from the walk that recorded them. The two analysis-stage kinds (`malformed-pnpm-workspace-yaml`, `bun-lockb-override-resolution-skipped`) 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.
302
+ 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`, `bun-lockb-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 two analysis-stage kinds (`malformed-pnpm-workspace-yaml`, `bun-lockb-override-resolution-skipped`) 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.
303
303
 
304
304
  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`.
305
305
 
@@ -589,7 +589,7 @@ fallow health --format json --quiet --trend
589
589
  {
590
590
  "kind": "health",
591
591
  "schema_version": 7,
592
- "version": "3.16.0",
592
+ "version": "3.21.0",
593
593
  "elapsed_ms": 32,
594
594
  "summary": {
595
595
  "files_analyzed": 482,
@@ -987,7 +987,7 @@ fallow audit \
987
987
  {
988
988
  "kind": "audit",
989
989
  "schema_version": 7,
990
- "version": "3.16.0",
990
+ "version": "3.21.0",
991
991
  "command": "audit",
992
992
  "verdict": "fail",
993
993
  "changed_files_count": 12,
@@ -1064,7 +1064,7 @@ fallow flags --format json --quiet --workspace my-package
1064
1064
  ```json
1065
1065
  {
1066
1066
  "schema_version": 7,
1067
- "version": "3.16.0",
1067
+ "version": "3.21.0",
1068
1068
  "elapsed_ms": 116,
1069
1069
  "feature_flags": [],
1070
1070
  "total_flags": 0
@@ -1165,7 +1165,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1165
1165
  {
1166
1166
  "kind": "security",
1167
1167
  "schema_version": "4",
1168
- "version": "3.16.0",
1168
+ "version": "3.21.0",
1169
1169
  "elapsed_ms": 42,
1170
1170
  "config": {
1171
1171
  "rules": {
@@ -1194,7 +1194,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1194
1194
  {
1195
1195
  "kind": "security",
1196
1196
  "schema_version": "4",
1197
- "version": "3.16.0",
1197
+ "version": "3.21.0",
1198
1198
  "elapsed_ms": 42,
1199
1199
  "config": {
1200
1200
  "rules": {
@@ -1959,7 +1959,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
1959
1959
  {
1960
1960
  "kind": "dead-code",
1961
1961
  "schema_version": 7,
1962
- "version": "3.16.0",
1962
+ "version": "3.21.0",
1963
1963
  "elapsed_ms": 45,
1964
1964
  "total_issues": 12,
1965
1965
  "entry_points": {
@@ -2119,7 +2119,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
2119
2119
  {
2120
2120
  "kind": "dupes",
2121
2121
  "schema_version": 7,
2122
- "version": "3.16.0",
2122
+ "version": "3.21.0",
2123
2123
  "elapsed_ms": 82,
2124
2124
  "total_clones": 15,
2125
2125
  "total_lines_duplicated": 230,
@@ -2163,11 +2163,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
2163
2163
  {
2164
2164
  "kind": "combined",
2165
2165
  "schema_version": 7,
2166
- "version": "3.16.0",
2166
+ "version": "3.21.0",
2167
2167
  "elapsed_ms": 159,
2168
2168
  "check": {
2169
2169
  "schema_version": 7,
2170
- "version": "3.16.0",
2170
+ "version": "3.21.0",
2171
2171
  "elapsed_ms": 45,
2172
2172
  "total_issues": 12,
2173
2173
  "unused_files": [],
@@ -442,6 +442,8 @@ kind: "skipped-large-file"
442
442
  size_bytes: number
443
443
  kind: "skipped-minified-file"
444
444
  } | {
445
+ kind: "skipped-source-dotdir"
446
+ } | {
445
447
  /**
446
448
  * Filesystem or UTF-8 decoding error from `read_to_string`.
447
449
  */
@@ -2552,7 +2554,8 @@ _meta?: (Meta | null)
2552
2554
  * `malformed-package-json`, `glob-matched-no-package-json`,
2553
2555
  * `malformed-tsconfig`, `tsconfig-reference-dir-missing`;
2554
2556
  * - source discovery, during the file walk: `skipped-large-file`,
2555
- * `skipped-minified-file`, `source-read-failure`;
2557
+ * `skipped-minified-file`, `skipped-source-dotdir`,
2558
+ * `source-read-failure`;
2556
2559
  * - dead-code analysis, from the dependency-catalog and override
2557
2560
  * detectors: `malformed-pnpm-workspace-yaml`,
2558
2561
  * `bun-lockb-override-resolution-skipped`.
@@ -5442,7 +5445,12 @@ crap?: (number | null)
5442
5445
  */
5443
5446
  coverage_pct?: (number | null)
5444
5447
  /**
5445
- * Coverage tier bucket derived from `coverage_pct`.
5448
+ * Coverage tier bucket.
5449
+ *
5450
+ * Derived from `coverage_pct` when coverage was measured. When
5451
+ * `coverage_source` is estimated, `coverage_pct` is absent and the tier
5452
+ * describes the static estimate behind the CRAP score rather than an
5453
+ * observation, so read the two fields together.
5446
5454
  */
5447
5455
  coverage_tier?: (CoverageTier | null)
5448
5456
  /**
@@ -5742,6 +5750,16 @@ istanbul_matched?: (number | null)
5742
5750
  * Functions in the Istanbul coverage file, in Istanbul mode.
5743
5751
  */
5744
5752
  istanbul_total?: (number | null)
5753
+ /**
5754
+ * Analyzed files the Istanbul coverage file carried an entry for.
5755
+ * Read against `istanbul_files_total`, this separates a coverage file
5756
+ * that did not join from code the coverage file says nothing ran in.
5757
+ */
5758
+ istanbul_files_matched?: (number | null)
5759
+ /**
5760
+ * Files described by the Istanbul coverage file, joined or not.
5761
+ */
5762
+ istanbul_files_total?: (number | null)
5745
5763
  /**
5746
5764
  * Findings with critical severity.
5747
5765
  */