fallow 3.32.0 → 3.33.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.
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
  /**
27
- * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `trace-error`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `doctor`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
27
+ * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `trace-error`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `architecture-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `architecture`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `doctor`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`, `similar-code-status`, `similar-code-cache-clear`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
28
28
  */
29
29
  export type FallowJsonOutput = (FallowOutput | CodeClimateOutput | ErrorOutput)
30
30
  /**
@@ -72,6 +72,8 @@ kind: "health"
72
72
  kind: "dupes"
73
73
  }) | (CheckGroupedOutput & {
74
74
  kind: "dead-code-grouped"
75
+ }) | (ArchitectureGroupedOutput & {
76
+ kind: "architecture-grouped"
75
77
  }) | ((ImpactReport | SemanticSymbolImpact) & {
76
78
  kind: "impact"
77
79
  }) | (CrossRepoImpactReport & {
@@ -84,6 +86,8 @@ kind: "security-survivors"
84
86
  kind: "security-blind-spots"
85
87
  }) | (CheckOutput & {
86
88
  kind: "dead-code"
89
+ }) | (ArchitectureOutput & {
90
+ kind: "architecture"
87
91
  }) | (CombinedOutput & {
88
92
  kind: "combined"
89
93
  }) | (FeatureFlagsOutput & {
@@ -108,6 +112,10 @@ kind: "similar-code"
108
112
  kind: "similar-code-inspect"
109
113
  }) | (SimilarCodeReviewOutput & {
110
114
  kind: "similar-code-review"
115
+ }) | (SimilarCodeStatusOutput & {
116
+ kind: "similar-code-status"
117
+ }) | (SimilarCodeCacheClearOutput & {
118
+ kind: "similar-code-cache-clear"
111
119
  }))
112
120
  /**
113
121
  * Schema projection for the audit envelope's exact version.
@@ -1121,6 +1129,21 @@ export type InspectSectionStatus = ("ok" | "partial" | "unavailable" | "error")
1121
1129
  * Granularity an [`InspectEvidenceSection`] payload covers.
1122
1130
  */
1123
1131
  export type InspectEvidenceScope = ("symbol" | "file" | "project_filtered_to_file")
1132
+ /**
1133
+ * Wire-shape version of the [`DependencyUsage`] object.
1134
+ *
1135
+ * The object has its own version, because it is an optional part of the
1136
+ * `DependencyTrace` envelope.
1137
+ */
1138
+ export type DependencyUsageSchemaVersion = "1"
1139
+ /**
1140
+ * How the usage was found.
1141
+ */
1142
+ export type UsageConfidence = "syntactic"
1143
+ /**
1144
+ * The shape of a project wrapper.
1145
+ */
1146
+ export type WrapperShape = ("call" | "alias")
1124
1147
  /**
1125
1148
  * Wire-version discriminator for [`ImportPathTrace`]. Independent from the
1126
1149
  * global `SchemaVersion`: the import-path payload versions on its own cadence,
@@ -1241,6 +1264,13 @@ export type GroupTrendStatus = ("compared" | "new_group" | "no_group_baseline")
1241
1264
  * version lineages.
1242
1265
  */
1243
1266
  export type DupesSchemaVersion = (4 | 10)
1267
+ /**
1268
+ * Schema projection for the architecture envelope's exact version.
1269
+ *
1270
+ * The schema emitter registers this type by name and points the
1271
+ * `ArchitectureOutput` and `ArchitectureGroupedOutput` definitions at it.
1272
+ */
1273
+ export type ArchitectureSchemaVersion = 1
1244
1274
  /**
1245
1275
  * Wire-version discriminator for [`ImpactReport`]. Independent from the global
1246
1276
  * `SchemaVersion` (the impact report versions on its own cadence) and from the
@@ -1562,6 +1592,14 @@ export type SimilarCodeDomainOutcome = ("same-responsibility" | "related-but-dis
1562
1592
  * How review matched an external verdict to the current candidate.
1563
1593
  */
1564
1594
  export type SimilarCodeVerdictMatch = ("candidate-id" | "review-key" | "unverified" | "ambiguous-review-key")
1595
+ /**
1596
+ * Version singleton for local-provider status output.
1597
+ */
1598
+ export type SimilarCodeStatusSchemaVersion = "1"
1599
+ /**
1600
+ * Version singleton for vector-cache clear output.
1601
+ */
1602
+ export type SimilarCodeCacheClearSchemaVersion = "1"
1565
1603
  /**
1566
1604
  * Discriminator value for [`CodeClimateIssue::kind`].
1567
1605
  */
@@ -3098,6 +3136,16 @@ thin_wrappers?: ThinWrapperFinding[]
3098
3136
  * enables it.
3099
3137
  */
3100
3138
  duplicate_prop_shapes?: DuplicatePropShapeFinding[]
3139
+ /**
3140
+ * Number of `unused_exports`, `unused_types`, `unused_class_members` and
3141
+ * `unused_enum_members` findings that this run did not report because
3142
+ * their file is an unused file. Deleting the file removes them, so they
3143
+ * add no information. `--show-cascade` or the `showCascade` config key
3144
+ * keeps them in the report, and then this count is zero. The count is
3145
+ * taken after the scope and the rules and before a baseline. Serialized
3146
+ * only when not zero, so a run without such findings keeps its JSON.
3147
+ */
3148
+ cascade_hidden?: number
3101
3149
  /**
3102
3150
  * Count deltas against the matched baseline, in baseline runs.
3103
3151
  */
@@ -6722,11 +6770,12 @@ unrecognised_format?: boolean
6722
6770
  */
6723
6771
  saved_by?: string
6724
6772
  /**
6725
- * `legacy` when the loaded dead-code baseline has no `identity`, so its
6726
- * entries use the old key forms and some of them hold a line. The run
6727
- * still applies the file. `--save-baseline` rewrites it with line-free
6728
- * keys. Absent for a current baseline and on `dupes` and `health`. The
6729
- * value set is OPEN.
6773
+ * `legacy` when the loaded baseline uses an old key form. For dead-code,
6774
+ * the file has no `identity`, so some entries hold a line. For `dupes`,
6775
+ * some entries use the clone key that older versions shared between
6776
+ * unrelated groups whose code did not parse on its own. The run still
6777
+ * applies the file. `--save-baseline` rewrites it with current keys.
6778
+ * Absent for a current baseline and on `health`. The value set is OPEN.
6730
6779
  */
6731
6780
  format?: string
6732
6781
  /**
@@ -7620,7 +7669,9 @@ threshold_source?: (ThresholdSource | null)
7620
7669
  actions: HealthFindingAction[]
7621
7670
  /**
7622
7671
  * Audit-mode flag indicating whether the finding is new versus the base
7623
- * snapshot.
7672
+ * snapshot. A complexity finding is new when no base finding has the same
7673
+ * path and function name, or when a metric that it exceeds has a higher
7674
+ * value than in that base finding.
7624
7675
  */
7625
7676
  introduced?: (boolean | null)
7626
7677
  }
@@ -11641,11 +11692,12 @@ export interface DependencyTrace {
11641
11692
  */
11642
11693
  package_name: string
11643
11694
  /**
11644
- * Files that import this dependency.
11695
+ * Files that import this dependency, each listed once.
11645
11696
  */
11646
11697
  imported_by: string[]
11647
11698
  /**
11648
- * Files that import this dependency with type-only imports.
11699
+ * Files whose every import of this dependency is type-only, each listed
11700
+ * once.
11649
11701
  */
11650
11702
  type_only_imported_by: string[]
11651
11703
  /**
@@ -11659,7 +11711,7 @@ used_in_scripts: boolean
11659
11711
  */
11660
11712
  is_used: boolean
11661
11713
  /**
11662
- * Total import count.
11714
+ * Number of files that import this dependency.
11663
11715
  */
11664
11716
  import_count: number
11665
11717
  /**
@@ -11691,6 +11743,14 @@ tooling_credit?: (ToolingCredit | null)
11691
11743
  * manifest is flagged.
11692
11744
  */
11693
11745
  unused_in?: string[]
11746
+ /**
11747
+ * How the code uses each imported name of the dependency. Present on
11748
+ * `fallow trace --dependency`, and on the MCP `trace_dependency` tool
11749
+ * when a usage parameter is set. Absent on
11750
+ * `fallow dead-code --trace-dependency`. The object has its own
11751
+ * `schema_version`.
11752
+ */
11753
+ usage?: (DependencyUsage | null)
11694
11754
  }
11695
11755
  /**
11696
11756
  * Why the unused devDependency check counts a dependency as used tooling
@@ -11729,6 +11789,253 @@ config?: (string | null)
11729
11789
  */
11730
11790
  reference?: (string | null)
11731
11791
  }
11792
+ /**
11793
+ * How the code uses each imported name of a dependency.
11794
+ */
11795
+ export interface DependencyUsage {
11796
+ schema_version: DependencyUsageSchemaVersion
11797
+ confidence: UsageConfidence
11798
+ /**
11799
+ * One entry per imported name, sorted by `name` in byte order. With a
11800
+ * specifier filter, only the selected names, each present even when no
11801
+ * file imports it.
11802
+ */
11803
+ specifiers: SpecifierUsage[]
11804
+ unresolved: FileLevelUnresolved
11805
+ /**
11806
+ * One page of usage sites. Absent unless sites were requested.
11807
+ */
11808
+ sites?: (UsageSitePage | null)
11809
+ /**
11810
+ * The files that import the users of the dependency. Absent unless a
11811
+ * closure depth was requested.
11812
+ */
11813
+ closure?: (ConsumerClosure | null)
11814
+ }
11815
+ /**
11816
+ * The usage of one imported name.
11817
+ */
11818
+ export interface SpecifierUsage {
11819
+ /**
11820
+ * The imported name: `default` for a default import, the first member for
11821
+ * a namespace member, and `*` for a bare namespace use.
11822
+ */
11823
+ name: string
11824
+ /**
11825
+ * Files with a static import binding of the name, a namespace member use
11826
+ * of it, or a re-export of it from the package.
11827
+ */
11828
+ file_count: number
11829
+ /**
11830
+ * The files in `file_count` where every binding of the name is type-only:
11831
+ * an `import type`, or a value import that the file reads only in type
11832
+ * positions.
11833
+ */
11834
+ type_only_file_count: number
11835
+ /**
11836
+ * Direct calls of the name, not through a project wrapper. The
11837
+ * initializer of a call wrapper (`useSelector.withTypes()`) is a direct
11838
+ * call and counts here.
11839
+ */
11840
+ call_site_count: number
11841
+ unresolved: SpecifierUnresolved
11842
+ /**
11843
+ * Project wrappers of the name, sorted by `file`, then `export`.
11844
+ */
11845
+ wrappers: UsageWrapper[]
11846
+ }
11847
+ /**
11848
+ * Uses of one imported name that the trace cannot resolve to a call. The key
11849
+ * set is closed in schema version 1.
11850
+ */
11851
+ export interface SpecifierUnresolved {
11852
+ /**
11853
+ * The name is the whole initializer of a declarator that is not a
11854
+ * wrapper: `const s = useSelector`.
11855
+ */
11856
+ value_alias: number
11857
+ /**
11858
+ * Any other value use that is not a call: an argument, an array
11859
+ * element, a property value or an optional call.
11860
+ */
11861
+ non_call_reference: number
11862
+ /**
11863
+ * The name is a JSX element: `<Provider>`.
11864
+ */
11865
+ jsx_element: number
11866
+ /**
11867
+ * The file re-exports the name from the package, or re-exports a
11868
+ * project wrapper of the name. The trace does not follow the consumers
11869
+ * of the re-export.
11870
+ */
11871
+ re_export: number
11872
+ /**
11873
+ * A wrapper consumer that exports the wrapper again. The trace does not
11874
+ * follow the second hop.
11875
+ */
11876
+ nested_wrapper: number
11877
+ /**
11878
+ * Files with a runtime binding of the name and no usage site, for
11879
+ * example a use in a Vue, Svelte or Astro template.
11880
+ */
11881
+ binding_without_site: number
11882
+ }
11883
+ /**
11884
+ * A top-level exported declarator that wraps an imported name. The trace
11885
+ * follows one hop from the wrapper to its consumers.
11886
+ */
11887
+ export interface UsageWrapper {
11888
+ /**
11889
+ * The file that declares the wrapper, root-relative.
11890
+ */
11891
+ file: string
11892
+ /**
11893
+ * The exported name of the wrapper.
11894
+ */
11895
+ export: string
11896
+ shape: WrapperShape
11897
+ /**
11898
+ * 1-based line of the wrapper initializer.
11899
+ */
11900
+ line: number
11901
+ /**
11902
+ * Distinct files with a call of the wrapper, the file of the wrapper
11903
+ * included.
11904
+ */
11905
+ consumer_file_count: number
11906
+ /**
11907
+ * Calls of the wrapper itself. A call of a member of the value that a
11908
+ * call wrapper returns (`store.dispatch()`) is a `non_call_reference`.
11909
+ */
11910
+ call_site_count: number
11911
+ }
11912
+ /**
11913
+ * Uses that hide which names a file reads. The key set is closed in schema
11914
+ * version 1.
11915
+ */
11916
+ export interface FileLevelUnresolved {
11917
+ /**
11918
+ * `import("package")` expressions.
11919
+ */
11920
+ dynamic_import: number
11921
+ /**
11922
+ * `require("package")` calls.
11923
+ */
11924
+ require: number
11925
+ /**
11926
+ * `import "package"` statements.
11927
+ */
11928
+ side_effect_import: number
11929
+ /**
11930
+ * `export * from "package"` statements.
11931
+ */
11932
+ star_re_export: number
11933
+ /**
11934
+ * Files that import the package through a specifier that does not name
11935
+ * the package, for example a path alias.
11936
+ */
11937
+ unattributed_file: number
11938
+ }
11939
+ /**
11940
+ * One page of usage sites.
11941
+ */
11942
+ export interface UsageSitePage {
11943
+ /**
11944
+ * The sites on this page, sorted by `file`, `line`, `col`, kind,
11945
+ * `specifier`, then `via`.
11946
+ */
11947
+ items: UsageSite[]
11948
+ /**
11949
+ * The number of sites on all pages.
11950
+ */
11951
+ total: number
11952
+ /**
11953
+ * The largest number of items on a page.
11954
+ */
11955
+ limit: number
11956
+ /**
11957
+ * An opaque token for the next page. Absent on the last page.
11958
+ */
11959
+ next_cursor?: (string | null)
11960
+ }
11961
+ /**
11962
+ * One use of the dependency in the code.
11963
+ */
11964
+ export interface UsageSite {
11965
+ /**
11966
+ * The file, root-relative.
11967
+ */
11968
+ file: string
11969
+ /**
11970
+ * 1-based line.
11971
+ */
11972
+ line: number
11973
+ /**
11974
+ * 0-based byte column.
11975
+ */
11976
+ col: number
11977
+ /**
11978
+ * The imported name. Absent on file-level kinds.
11979
+ */
11980
+ specifier?: (string | null)
11981
+ /**
11982
+ * The local binding that the code uses. Absent on file-level kinds.
11983
+ */
11984
+ local_name?: (string | null)
11985
+ /**
11986
+ * The static member after the imported name, for example `withTypes`.
11987
+ */
11988
+ member?: (string | null)
11989
+ /**
11990
+ * How the code uses the dependency at this site. The known values are
11991
+ * `call`, `wrapper_definition`, `value_alias`, `non_call_reference`,
11992
+ * `jsx_element`, `re_export`, `nested_wrapper`, `dynamic_import`,
11993
+ * `require`, `side_effect_import` and `star_re_export`. The set is open:
11994
+ * read an unknown kind as an unresolved site.
11995
+ */
11996
+ kind: string
11997
+ /**
11998
+ * The wrapper that the site goes through, as `FILE:EXPORT`.
11999
+ */
12000
+ via?: (string | null)
12001
+ }
12002
+ /**
12003
+ * The files that import the users of the dependency, found by a reverse walk
12004
+ * of the import graph.
12005
+ */
12006
+ export interface ConsumerClosure {
12007
+ /**
12008
+ * The largest depth of the walk.
12009
+ */
12010
+ depth: number
12011
+ /**
12012
+ * The number of files in `files`.
12013
+ */
12014
+ file_count: number
12015
+ /**
12016
+ * The files, sorted by `depth`, then `file`. The seed files are not
12017
+ * listed.
12018
+ */
12019
+ files: ClosureFile[]
12020
+ /**
12021
+ * Whether a file at the largest depth has an importer that the walk did
12022
+ * not visit.
12023
+ */
12024
+ truncated: boolean
12025
+ }
12026
+ /**
12027
+ * One file of a [`ConsumerClosure`].
12028
+ */
12029
+ export interface ClosureFile {
12030
+ /**
12031
+ * The file, root-relative.
12032
+ */
12033
+ file: string
12034
+ /**
12035
+ * The number of import edges from the nearest seed file.
12036
+ */
12037
+ depth: number
12038
+ }
11732
12039
  /**
11733
12040
  * Result of tracing a clone: all groups containing the code at a source
11734
12041
  * location or addressed by a stable clone fingerprint.
@@ -13305,6 +13612,13 @@ groups: CheckGroupedEntry[]
13305
13612
  * only when `true`, like the flat `CheckOutput` field.
13306
13613
  */
13307
13614
  unused_load_data_keys_global_abstain?: boolean
13615
+ /**
13616
+ * Number of export and member findings that the run hid because their
13617
+ * file is an unused file. The count covers the whole run, so it is on
13618
+ * the root and not in a group. Serialized only when not zero, like the
13619
+ * flat `CheckOutput` field.
13620
+ */
13621
+ cascade_hidden?: number
13308
13622
  /**
13309
13623
  * This run's view of the loaded baseline, present only in baseline runs.
13310
13624
  * Carries the staleness counts, the advisory verdict and `gate_trips`, the
@@ -13726,6 +14040,106 @@ thin_wrappers?: ThinWrapperFinding[]
13726
14040
  * enables it.
13727
14041
  */
13728
14042
  duplicate_prop_shapes?: DuplicatePropShapeFinding[]
14043
+ /**
14044
+ * Number of `unused_exports`, `unused_types`, `unused_class_members` and
14045
+ * `unused_enum_members` findings that this run did not report because
14046
+ * their file is an unused file. Deleting the file removes them, so they
14047
+ * add no information. `--show-cascade` or the `showCascade` config key
14048
+ * keeps them in the report, and then this count is zero. The count is
14049
+ * taken after the scope and the rules and before a baseline. Serialized
14050
+ * only when not zero, so a run without such findings keeps its JSON.
14051
+ */
14052
+ cascade_hidden?: number
14053
+ }
14054
+ /**
14055
+ * Envelope emitted by `fallow architecture --group-by ... --format json`.
14056
+ *
14057
+ * The body is the `CheckGroupedOutput` body of `fallow dead-code`: issues are partitioned into resolver buckets (CODEOWNERS team, directory prefix, workspace package, or GitLab CODEOWNERS section), and each bucket carries the same issue-array shape as `ArchitectureOutput`, plus per-group `key` / `owners` / `total_issues`.
14058
+ */
14059
+ export interface ArchitectureGroupedOutput {
14060
+ schema_version: ArchitectureSchemaVersion
14061
+ version: ToolVersion
14062
+ elapsed_ms: ElapsedMs
14063
+ grouped_by: GroupByMode
14064
+ /**
14065
+ * Total findings across all groups.
14066
+ */
14067
+ total_issues: number
14068
+ /**
14069
+ * One bucket per resolver key.
14070
+ */
14071
+ groups: CheckGroupedEntry[]
14072
+ /**
14073
+ * `true` when the `unused-load-data-key` detector abstained for the whole
14074
+ * project. The abstain has no file, so it is on the root and not in a
14075
+ * group. An empty `unused_load_data_keys` with this flag set does not
14076
+ * mean the project is clean: the rule could not run safely. Serialized
14077
+ * only when `true`, like the flat `CheckOutput` field.
14078
+ */
14079
+ unused_load_data_keys_global_abstain?: boolean
14080
+ /**
14081
+ * Number of export and member findings that the run hid because their
14082
+ * file is an unused file. The count covers the whole run, so it is on
14083
+ * the root and not in a group. Serialized only when not zero, like the
14084
+ * flat `CheckOutput` field.
14085
+ */
14086
+ cascade_hidden?: number
14087
+ /**
14088
+ * This run's view of the loaded baseline, present only in baseline runs.
14089
+ * Carries the staleness counts, the advisory verdict and `gate_trips`, the
14090
+ * same boolean `--fail-on-stale-baseline` exits on, so a CI integration
14091
+ * reads one field instead of restating the rule. Read `change_scoped`
14092
+ * before dividing `matched_entries` by `baseline_entries`: a narrowed run
14093
+ * can report `matched_entries: 0` on a healthy baseline.
14094
+ */
14095
+ baseline_staleness?: (BaselineStaleness | null)
14096
+ /**
14097
+ * The answer to `--finding-id`, present only when the run received one
14098
+ * or more `--finding-id` values. The report then holds only the
14099
+ * requested findings. Read `missing` as resolved only when `conclusive`
14100
+ * is true; a scope, a baseline or a filter can hide a finding that still
14101
+ * exists. See [`crate::FindingIdQuery`].
14102
+ */
14103
+ finding_id_query?: (FindingIdQuery | null)
14104
+ /**
14105
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
14106
+ * always emits it, with the command's default exit rule in it also when
14107
+ * no flag armed a gate, so a CI integration reads the verdict instead of
14108
+ * guessing from a process status it usually cannot see. A gate fails the
14109
+ * build when `status` is `fail` AND `enforced` is true. The typed
14110
+ * programmatic API runs no CLI gate and leaves it absent. See
14111
+ * [`crate::GateOutcomes`].
14112
+ */
14113
+ gate_outcomes?: (GateOutcomes | null)
14114
+ /**
14115
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
14116
+ * absent when it was asked for nothing. An entry whose `status` is not
14117
+ * `applied` means the run could not do what it was asked and reported
14118
+ * something WIDER instead, so what follows is a valid report of a scope
14119
+ * nobody requested. Honoured requests are published too, with
14120
+ * `status: "applied"`, so an absent object means "nothing was asked for",
14121
+ * never "nothing failed". See [`crate::RequestOutcomes`].
14122
+ */
14123
+ request_outcomes?: (RequestOutcomes | null)
14124
+ /**
14125
+ * Applied package Git refs, omitted outside package-baseline runs.
14126
+ */
14127
+ package_baselines?: PackageBaselineStatus[]
14128
+ /**
14129
+ * `_meta` block with docs and rule definitions, when `--explain` was
14130
+ * passed.
14131
+ */
14132
+ _meta?: (Meta | null)
14133
+ /**
14134
+ * Diagnostics collected for the full analysis before issue grouping.
14135
+ * See [`CheckOutput::workspace_diagnostics`] for the contract.
14136
+ */
14137
+ workspace_diagnostics?: WorkspaceDiagnostic[]
14138
+ /**
14139
+ * Read-only follow-up commands computed from the full (ungrouped) findings.
14140
+ * See [`CheckOutput::next_steps`] for the contract.
14141
+ */
14142
+ next_steps?: NextStep[]
13729
14143
  }
13730
14144
  /**
13731
14145
  * The rendered impact report, derived purely from the store.
@@ -14974,34 +15388,527 @@ path: string
14974
15388
  sampled_count: number
14975
15389
  }
14976
15390
  /**
14977
- * Bare `fallow --format json` envelope.
15391
+ * Envelope emitted by `fallow architecture --format json`.
15392
+ *
15393
+ * The body is the `CheckOutput` body of `fallow dead-code`: the same issue arrays, `summary`, `entry_points`, actions and `gate_outcomes`. The architecture arrays (`circular_dependencies`, `re_export_cycles`, `package_cycles`, `boundary_violations`, `boundary_coverage_violations`, `boundary_call_violations`, `policy_violations`) carry the findings. The combined and audit envelopes do not use this envelope; their `check` block stays `CheckOutput`.
14978
15394
  */
14979
- export interface CombinedOutput {
14980
- schema_version: CombinedSchemaVersion
15395
+ export interface ArchitectureOutput {
15396
+ schema_version: ArchitectureSchemaVersion
14981
15397
  version: ToolVersion
14982
15398
  elapsed_ms: ElapsedMs
14983
15399
  /**
14984
- * The verdict of every gate this run evaluated, keyed by name. The CLI
14985
- * always emits it, with the default exit rule of each section that ran
14986
- * (`error-severity-findings`, `health-findings`). Without
14987
- * `--fail-on-issues` or `--ci`, the machine formats of the combined run
14988
- * exit 0 for findings, so most entries have `enforced: false`. With one of
14989
- * these flags, the findings rules and `duplication-threshold` are
14990
- * `enforced`, the dupes section adds an enforced `duplication-findings`
14991
- * entry, and every format exits 1 when one fails. For the default
14992
- * exit rules (`error-severity-findings`,
14993
- * `health-findings`), `status` gives the verdict of the human run. An
14994
- * advisory entry can report `fail` without a failure of the human run: an
14995
- * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
14996
- * not arm. A gate fails the build when `status` is `fail` AND `enforced`
14997
- * is true. The typed
14998
- * programmatic API leaves it absent. See [`crate::GateOutcomes`].
15400
+ * Total findings across all issue arrays; excludes `next_steps`.
14999
15401
  */
15000
- gate_outcomes?: (GateOutcomes | null)
15402
+ total_issues: number
15001
15403
  /**
15002
- * Every narrowing or shaping request this run RECEIVED, keyed by name,
15003
- * absent when it was asked for nothing. An entry whose `status` is not
15004
- * `applied` means the run could not do what it was asked and reported
15404
+ * Entry-point totals per source, when the analysis recorded them.
15405
+ */
15406
+ entry_points?: (EntryPoints | null)
15407
+ summary: CheckSummary
15408
+ /**
15409
+ * Files not reachable from any entry point. Wrapped in
15410
+ * [`UnusedFileFinding`] so each entry carries a typed `actions` array
15411
+ * natively, replacing the pre-2.76 post-pass injection.
15412
+ */
15413
+ unused_files: UnusedFileFinding[]
15414
+ /**
15415
+ * Exports never imported by other modules. Wrapped in
15416
+ * [`UnusedExportFinding`] so each entry carries a typed `actions`
15417
+ * array natively.
15418
+ */
15419
+ unused_exports: UnusedExportFinding[]
15420
+ /**
15421
+ * Type exports never imported by other modules. Wrapped in
15422
+ * [`UnusedTypeFinding`]: the inner [`UnusedExport`] struct is shared
15423
+ * with `unused_exports` but the wrapper emits a type-targeted fix
15424
+ * description.
15425
+ */
15426
+ unused_types: UnusedTypeFinding[]
15427
+ /**
15428
+ * Exported symbols whose public signature references same-file private
15429
+ * types. Wrapped in [`PrivateTypeLeakFinding`] so each entry carries a
15430
+ * typed `actions` array natively.
15431
+ */
15432
+ private_type_leaks: PrivateTypeLeakFinding[]
15433
+ /**
15434
+ * Exports marked `@deprecated` that still have at least one consumer in
15435
+ * a reachable file. Wrapped in [`DeprecatedExportInUseFinding`]. Opt-in: the
15436
+ * `deprecated-exports-in-use` rule defaults to `off`.
15437
+ */
15438
+ deprecated_exports_in_use?: DeprecatedExportInUseFinding[]
15439
+ /**
15440
+ * Dependencies listed in package.json but never imported. Wrapped in
15441
+ * [`UnusedDependencyFinding`] so each entry carries a typed `actions`
15442
+ * array natively. The fix action swaps from `remove-dependency` to
15443
+ * `move-dependency` when `used_in_workspaces` is non-empty.
15444
+ */
15445
+ unused_dependencies: UnusedDependencyFinding[]
15446
+ /**
15447
+ * Dev dependencies listed in package.json but never imported. Wrapped
15448
+ * in [`UnusedDevDependencyFinding`]: same bare struct as
15449
+ * `unused_dependencies` with a `devDependencies`-targeted fix
15450
+ * description.
15451
+ */
15452
+ unused_dev_dependencies: UnusedDevDependencyFinding[]
15453
+ /**
15454
+ * Optional dependencies listed in package.json but never imported.
15455
+ * Wrapped in [`UnusedOptionalDependencyFinding`] with an
15456
+ * `optionalDependencies`-targeted fix description.
15457
+ */
15458
+ unused_optional_dependencies: UnusedOptionalDependencyFinding[]
15459
+ /**
15460
+ * Enum members never accessed. Wrapped in
15461
+ * [`UnusedEnumMemberFinding`] so each entry carries a typed `actions`
15462
+ * array natively.
15463
+ */
15464
+ unused_enum_members: UnusedEnumMemberFinding[]
15465
+ /**
15466
+ * Class members never accessed. Wrapped in
15467
+ * [`UnusedClassMemberFinding`]: same inner [`UnusedMember`] struct as
15468
+ * `unused_enum_members`, with a class-targeted fix description and the
15469
+ * `auto_fixable: false` default to reflect dependency-injection
15470
+ * patterns.
15471
+ */
15472
+ unused_class_members: UnusedClassMemberFinding[]
15473
+ /**
15474
+ * Store members (Pinia `state` / `getters` / `actions` key, or a
15475
+ * setup-store returned key) declared but never accessed by any consumer
15476
+ * project-wide. Wrapped in [`UnusedStoreMemberFinding`]: same inner
15477
+ * [`UnusedMember`] struct as `unused_class_members`, with a
15478
+ * store-targeted fix description. Cross-graph: the store binding is
15479
+ * imported (the module is reachable) yet a specific member is dead.
15480
+ */
15481
+ unused_store_members?: UnusedStoreMemberFinding[]
15482
+ /**
15483
+ * Import specifiers that could not be resolved. Wrapped in
15484
+ * [`UnresolvedImportFinding`] so each entry carries a typed `actions`
15485
+ * array natively.
15486
+ */
15487
+ unresolved_imports: UnresolvedImportFinding[]
15488
+ /**
15489
+ * Dependencies used in code but not listed in package.json. Wrapped in
15490
+ * [`UnlistedDependencyFinding`].
15491
+ */
15492
+ unlisted_dependencies: UnlistedDependencyFinding[]
15493
+ /**
15494
+ * Exports with the same name across multiple modules. Wrapped in
15495
+ * [`DuplicateExportFinding`] so each entry carries a typed `actions`
15496
+ * array natively, with the position-0 `add-to-config` `ignoreExports`
15497
+ * snippet wired in at wrapper construction.
15498
+ */
15499
+ duplicate_exports: DuplicateExportFinding[]
15500
+ /**
15501
+ * Production dependencies only used via type-only imports (could be
15502
+ * devDependencies). Only populated in production mode. Wrapped in
15503
+ * [`TypeOnlyDependencyFinding`].
15504
+ */
15505
+ type_only_dependencies: TypeOnlyDependencyFinding[]
15506
+ /**
15507
+ * Production dependencies only imported by test files (could be
15508
+ * devDependencies). Wrapped in [`TestOnlyDependencyFinding`].
15509
+ */
15510
+ test_only_dependencies?: TestOnlyDependencyFinding[]
15511
+ /**
15512
+ * devDependencies imported by production (non-test, non-config) source code
15513
+ * via a runtime/value import; they should be promoted to dependencies.
15514
+ * The promote-side mirror of [`TestOnlyDependencyFinding`]. Wrapped in
15515
+ * [`DevDependencyInProductionFinding`].
15516
+ */
15517
+ dev_dependencies_in_production?: DevDependencyInProductionFinding[]
15518
+ /**
15519
+ * Circular dependency chains detected in the module graph. Wrapped in
15520
+ * [`CircularDependencyFinding`] so each entry carries a typed `actions`
15521
+ * array natively.
15522
+ */
15523
+ circular_dependencies: CircularDependencyFinding[]
15524
+ /**
15525
+ * Cycles or self-loops in the re-export edge subgraph (barrel files
15526
+ * re-exporting from each other in a loop). Wrapped in
15527
+ * [`ReExportCycleFinding`] so each entry carries a typed `actions`
15528
+ * array natively (a `refactor-re-export-cycle` informational primary
15529
+ * plus a `suppress-file` secondary; cycles are file-scoped so a single
15530
+ * suppression breaks the cycle).
15531
+ */
15532
+ re_export_cycles?: ReExportCycleFinding[]
15533
+ /**
15534
+ * Dependency cycles between workspace packages, built from resolved
15535
+ * cross-package imports. Wrapped in [`PackageCycleFinding`] so each
15536
+ * entry carries a typed `actions` array natively.
15537
+ */
15538
+ package_cycles?: PackageCycleFinding[]
15539
+ /**
15540
+ * Imports that cross architecture boundary rules. Wrapped in
15541
+ * [`BoundaryViolationFinding`] so each entry carries a typed `actions`
15542
+ * array natively.
15543
+ */
15544
+ boundary_violations?: BoundaryViolationFinding[]
15545
+ /**
15546
+ * Files that matched no architecture boundary zone while
15547
+ * `boundaries.coverage.requireAllFiles` was enabled.
15548
+ */
15549
+ boundary_coverage_violations?: BoundaryCoverageViolationFinding[]
15550
+ /**
15551
+ * Calls from zoned files to callees forbidden for that zone via
15552
+ * `boundaries.calls.forbidden`. Wrapped in
15553
+ * [`BoundaryCallViolationFinding`] so each entry carries a typed
15554
+ * `actions` array natively.
15555
+ */
15556
+ boundary_call_violations?: BoundaryCallViolationFinding[]
15557
+ /**
15558
+ * Banned calls, imports, and catalogue-derived effects matched by
15559
+ * declarative rule packs
15560
+ * (`rulePacks` config). Wrapped in [`PolicyViolationFinding`] so each
15561
+ * entry carries a typed `actions` array natively. Each finding carries
15562
+ * its effective per-rule severity.
15563
+ */
15564
+ policy_violations?: PolicyViolationFinding[]
15565
+ /**
15566
+ * Suppression comments or JSDoc tags that no longer match any issue.
15567
+ */
15568
+ stale_suppressions?: StaleSuppression[]
15569
+ /**
15570
+ * Entries in package manager catalog sections not referenced by any
15571
+ * workspace package via the catalog: protocol. Supports
15572
+ * `pnpm-workspace.yaml` catalogs and Bun root `package.json` catalogs.
15573
+ * Wrapped in [`UnusedCatalogEntryFinding`] so each entry carries a typed
15574
+ * `actions` array natively, with per-instance `auto_fixable` derived
15575
+ * from `hardcoded_consumers` and the catalog source file.
15576
+ */
15577
+ unused_catalog_entries?: UnusedCatalogEntryFinding[]
15578
+ /**
15579
+ * Named groups under package manager catalogs sections that declare no
15580
+ * package entries. The top-level catalog: map is not reported. Wrapped in
15581
+ * [`EmptyCatalogGroupFinding`].
15582
+ */
15583
+ empty_catalog_groups?: EmptyCatalogGroupFinding[]
15584
+ /**
15585
+ * Workspace package.json references to catalogs (`catalog:` or
15586
+ * `catalog:<name>`) that do not declare the consumed package. The package
15587
+ * manager install will error until the named catalog grows to include the
15588
+ * package or the reference is switched / removed. Wrapped in
15589
+ * [`UnresolvedCatalogReferenceFinding`] with the discriminated
15590
+ * `add-catalog-entry` / `update-catalog-reference` primary at position 0.
15591
+ */
15592
+ unresolved_catalog_references?: UnresolvedCatalogReferenceFinding[]
15593
+ /**
15594
+ * Entries in pnpm-workspace.yaml's overrides section, package.json's
15595
+ * pnpm.overrides block, npm or Bun's top-level overrides object, or Bun's
15596
+ * top-level resolutions object,
15597
+ * whose target package is not declared by any workspace package and is
15598
+ * not present in pnpm-lock.yaml, package-lock.json, npm-shrinkwrap.json,
15599
+ * or bun.lock. Default severity is warn because projects without a
15600
+ * readable lockfile fall back to manifest-only checks; the hint field
15601
+ * flags those conservative cases. When the only lockfile is bun's binary
15602
+ * bun.lockb, resolution cannot be read and the check emits nothing.
15603
+ * Wrapped in [`UnusedDependencyOverrideFinding`].
15604
+ */
15605
+ unused_dependency_overrides?: UnusedDependencyOverrideFinding[]
15606
+ /**
15607
+ * Package-manager override or resolution entries whose key or value does
15608
+ * not parse in the declaration source's grammar (empty key, empty value,
15609
+ * malformed selector, unbalanced parent matcher). The package manager may
15610
+ * reject or ignore these at install time. Default severity is error. Wrapped in
15611
+ * [`MisconfiguredDependencyOverrideFinding`].
15612
+ */
15613
+ misconfigured_dependency_overrides?: MisconfiguredDependencyOverrideFinding[]
15614
+ /**
15615
+ * `"use client"` files that export a Next.js server-only / route-segment
15616
+ * config name (e.g. `metadata`, `revalidate`, `GET`). Next.js rejects this
15617
+ * at build time. Wrapped in [`InvalidClientExportFinding`] so each entry
15618
+ * carries a typed `actions` array natively. Default severity is `warn`.
15619
+ */
15620
+ invalid_client_exports?: InvalidClientExportFinding[]
15621
+ /**
15622
+ * Barrel files that re-export BOTH a `"use client"` origin module AND a
15623
+ * server-only origin module (the Next.js App Router footgun). Wrapped in
15624
+ * [`MixedClientServerBarrelFinding`] so each entry carries a typed
15625
+ * `actions` array natively. Default severity is `warn`.
15626
+ */
15627
+ mixed_client_server_barrels?: MixedClientServerBarrelFinding[]
15628
+ /**
15629
+ * `"use client"` / `"use server"` directives written as expression
15630
+ * statements after a non-directive statement, so the RSC bundler parses
15631
+ * them as ordinary strings and silently ignores them. Wrapped in
15632
+ * [`MisplacedDirectiveFinding`] so each entry carries a typed `actions`
15633
+ * array natively. Default severity is `warn`.
15634
+ */
15635
+ misplaced_directives?: MisplacedDirectiveFinding[]
15636
+ /**
15637
+ * Vue `inject(KEY)` / Svelte `getContext(KEY)` calls whose symbol KEY is
15638
+ * provided nowhere in the project (the injected-never-provided dead-half).
15639
+ * Wrapped in [`UnprovidedInjectFinding`] so each entry carries a typed
15640
+ * `actions` array natively. Default severity is `warn`.
15641
+ */
15642
+ unprovided_injects?: UnprovidedInjectFinding[]
15643
+ /**
15644
+ * Vue/Svelte single-file components that are reachable but rendered nowhere
15645
+ * (the imported-but-never-rendered dead-half). Wrapped in
15646
+ * [`UnrenderedComponentFinding`] so each entry carries a typed `actions`
15647
+ * array natively. Default severity is `warn`.
15648
+ */
15649
+ unrendered_components?: UnrenderedComponentFinding[]
15650
+ /**
15651
+ * Next.js App Router route files that resolve to the same URL within one
15652
+ * app-root (a guaranteed `next build` failure). Wrapped in
15653
+ * [`RouteCollisionFinding`] so each entry carries a typed `actions` array
15654
+ * natively. One finding per colliding file. Default severity is `warn`.
15655
+ */
15656
+ route_collisions?: RouteCollisionFinding[]
15657
+ /**
15658
+ * Sibling Next.js dynamic route segments at one tree position using
15659
+ * different param spellings (a dev / runtime error; `next build` does NOT
15660
+ * catch it). Wrapped in [`DynamicSegmentNameConflictFinding`] so each entry
15661
+ * carries a typed `actions` array natively. Default severity is `warn`.
15662
+ */
15663
+ dynamic_segment_name_conflicts?: DynamicSegmentNameConflictFinding[]
15664
+ /**
15665
+ * Vue `<script setup>` `defineProps`, Svelte 5 `$props()`, and React props
15666
+ * referenced nowhere in their own component. Wrapped in
15667
+ * [`UnusedComponentPropFinding`] so each entry carries a typed `actions`
15668
+ * array natively. Default severity is `warn`.
15669
+ */
15670
+ unused_component_props?: UnusedComponentPropFinding[]
15671
+ /**
15672
+ * Used optional component inputs absent from inspected reachable callers. Off by default.
15673
+ */
15674
+ absent_component_props?: AbsentComponentPropFinding[]
15675
+ /**
15676
+ * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
15677
+ * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
15678
+ * each entry carries a typed `actions` array natively. Default severity is
15679
+ * `warn`.
15680
+ */
15681
+ unused_component_emits?: UnusedComponentEmitFinding[]
15682
+ /**
15683
+ * Angular `@Input()` / signal `input()` / `model()` inputs read nowhere in
15684
+ * their own component (neither the template nor the class body). Wrapped in
15685
+ * [`UnusedComponentInputFinding`] so each entry carries a typed `actions`
15686
+ * array natively. Default severity is `warn`.
15687
+ */
15688
+ unused_component_inputs?: UnusedComponentInputFinding[]
15689
+ /**
15690
+ * Angular `@Output()` / signal `output()` outputs emitted nowhere in their
15691
+ * own component (no `this.<output>.emit(...)`). Wrapped in
15692
+ * [`UnusedComponentOutputFinding`] so each entry carries a typed `actions`
15693
+ * array natively. Default severity is `warn`.
15694
+ */
15695
+ unused_component_outputs?: UnusedComponentOutputFinding[]
15696
+ /**
15697
+ * Svelte components dispatching a custom event via `createEventDispatcher()`
15698
+ * whose event name is listened to nowhere project-wide (cross-file
15699
+ * dead-output direction). Wrapped in [`UnusedSvelteEventFinding`] so each
15700
+ * entry carries a typed `actions` array natively. Default severity is
15701
+ * `warn`.
15702
+ */
15703
+ unused_svelte_events?: UnusedSvelteEventFinding[]
15704
+ /**
15705
+ * Next.js Server Actions (exports of `"use server"` files) that no code in
15706
+ * the project references. Reclassified out of `unused_exports` for
15707
+ * `"use server"` files. Wrapped in [`UnusedServerActionFinding`] so each
15708
+ * entry carries a typed `actions` array natively. Default severity is
15709
+ * `warn`.
15710
+ */
15711
+ unused_server_actions?: UnusedServerActionFinding[]
15712
+ /**
15713
+ * SvelteKit `+page.{ts,server.ts,js,server.js}` `load()` return-object keys
15714
+ * read by no consumer. Wrapped in [`UnusedLoadDataKeyFinding`] so each entry
15715
+ * carries a typed `actions` array natively. Default severity is `warn`.
15716
+ */
15717
+ unused_load_data_keys?: UnusedLoadDataKeyFinding[]
15718
+ /**
15719
+ * `true` when the `unused-load-data-key` detector abstained project-wide
15720
+ * because a whole-object use of `page.data` / `$page.data` was seen
15721
+ * somewhere (S1 observability: an empty `unused_load_data_keys` with this
15722
+ * flag set is NOT a clean bill, it means the rule could not run safely).
15723
+ * Serialized only when `true` so the default JSON contract is unchanged.
15724
+ */
15725
+ unused_load_data_keys_global_abstain?: boolean
15726
+ /**
15727
+ * React/Preact props forwarded unchanged through `>= N` intermediate
15728
+ * pass-through components until a consumer (located per-chain records).
15729
+ * Wrapped in [`PropDrillingChainFinding`] so each entry carries a typed
15730
+ * `actions` array natively. Health signal: the rule defaults to `off`
15731
+ * (opt-in), so this is dormant and populated ONLY when the user enables it.
15732
+ */
15733
+ prop_drilling_chains?: PropDrillingChainFinding[]
15734
+ /**
15735
+ * React/Preact components whose entire body is a single spread-forwarded
15736
+ * child render (`return <Child {...props}/>`): pure structural indirection,
15737
+ * a candidate for inlining at call sites. Wrapped in [`ThinWrapperFinding`]
15738
+ * so each entry carries a typed `actions` array natively. Health signal: the
15739
+ * rule defaults to `off` (opt-in), so this is dormant and populated ONLY
15740
+ * when the user enables it.
15741
+ */
15742
+ thin_wrappers?: ThinWrapperFinding[]
15743
+ /**
15744
+ * React/Preact components that participate in a duplicate-prop-shape group:
15745
+ * three or more components across two or more files whose statically-known
15746
+ * prop NAME set is identical after stripping ubiquitous DOM / passthrough
15747
+ * names (a missing shared `Props` type / base component). Wrapped in
15748
+ * [`DuplicatePropShapeFinding`] so each entry carries a typed `actions`
15749
+ * array and its sibling roster natively. Health signal: the rule defaults to
15750
+ * `off` (opt-in), so this is dormant and populated ONLY when the user
15751
+ * enables it.
15752
+ */
15753
+ duplicate_prop_shapes?: DuplicatePropShapeFinding[]
15754
+ /**
15755
+ * Number of `unused_exports`, `unused_types`, `unused_class_members` and
15756
+ * `unused_enum_members` findings that this run did not report because
15757
+ * their file is an unused file. Deleting the file removes them, so they
15758
+ * add no information. `--show-cascade` or the `showCascade` config key
15759
+ * keeps them in the report, and then this count is zero. The count is
15760
+ * taken after the scope and the rules and before a baseline. Serialized
15761
+ * only when not zero, so a run without such findings keeps its JSON.
15762
+ */
15763
+ cascade_hidden?: number
15764
+ /**
15765
+ * Count deltas against the matched baseline, in baseline runs.
15766
+ */
15767
+ baseline_deltas?: (BaselineDeltas | null)
15768
+ /**
15769
+ * Which baseline snapshot was matched, in baseline runs.
15770
+ */
15771
+ baseline?: (BaselineMatch | null)
15772
+ /**
15773
+ * This run's view of the loaded baseline, present only in baseline runs.
15774
+ * Carries the staleness counts, the advisory verdict and `gate_trips`, the
15775
+ * same boolean `--fail-on-stale-baseline` exits on, so a CI integration
15776
+ * reads one field instead of restating the rule. Read `change_scoped`
15777
+ * before dividing `matched_entries` by `baseline_entries`: a narrowed run
15778
+ * can report `matched_entries: 0` on a healthy baseline.
15779
+ */
15780
+ baseline_staleness?: (BaselineStaleness | null)
15781
+ /**
15782
+ * The answer to `--finding-id`, present only when the run received one
15783
+ * or more `--finding-id` values. The report then holds only the
15784
+ * requested findings. Read `missing` as resolved only when `conclusive`
15785
+ * is true; a scope, a baseline or a filter can hide a finding that still
15786
+ * exists. See [`crate::FindingIdQuery`].
15787
+ */
15788
+ finding_id_query?: (FindingIdQuery | null)
15789
+ /**
15790
+ * Regression verdict against the baseline, in `--fail-on-regression` runs.
15791
+ */
15792
+ regression?: (RegressionResult | null)
15793
+ /**
15794
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
15795
+ * always emits it, with the command's default exit rule in it also when
15796
+ * no flag armed a gate, so a CI integration reads the verdict instead of
15797
+ * guessing from a process status it usually cannot see. A gate fails the
15798
+ * build when `status` is `fail` AND `enforced` is true. The typed
15799
+ * programmatic API runs no CLI gate and leaves it absent. See
15800
+ * [`crate::GateOutcomes`].
15801
+ */
15802
+ gate_outcomes?: (GateOutcomes | null)
15803
+ /**
15804
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
15805
+ * absent when it was asked for nothing. An entry whose `status` is not
15806
+ * `applied` means the run could not do what it was asked and reported
15807
+ * something WIDER instead, so what follows is a valid report of a scope
15808
+ * nobody requested. Honoured requests are published too, with
15809
+ * `status: "applied"`, so an absent object means "nothing was asked for",
15810
+ * never "nothing failed". See [`crate::RequestOutcomes`].
15811
+ */
15812
+ request_outcomes?: (RequestOutcomes | null)
15813
+ /**
15814
+ * Applied Git refs for exact workspace packages. Absent when no package
15815
+ * baselines were selected, including runs with a global changed-since ref.
15816
+ */
15817
+ package_baselines?: PackageBaselineStatus[]
15818
+ /**
15819
+ * `_meta` block with docs and rule definitions, when `--explain` was
15820
+ * passed.
15821
+ */
15822
+ _meta?: (Meta | null)
15823
+ /**
15824
+ * Non-fatal diagnostics about the project itself, from all three stages
15825
+ * that record them (issue #473):
15826
+ *
15827
+ * - workspace discovery, at config load: `undeclared-workspace`,
15828
+ * `malformed-package-json`, `glob-matched-no-package-json`,
15829
+ * `malformed-tsconfig`, `tsconfig-reference-dir-missing`;
15830
+ * - source discovery, during the file walk: `skipped-large-file`,
15831
+ * `skipped-minified-file`, `skipped-source-dotdir`,
15832
+ * `excluded-by-default-ignore`, `source-read-failure`,
15833
+ * `source-parse-degraded`;
15834
+ * - dead-code analysis, from the dependency-catalog and override
15835
+ * detectors: `malformed-pnpm-workspace-yaml`,
15836
+ * `bun-lockb-override-resolution-skipped`;
15837
+ * - framework plugins, while they read their own build configs:
15838
+ * `plugin-config-unreadable`, `plugin-effect-not-modeled`;
15839
+ * - the dead-code result, for config patterns that matched nothing:
15840
+ * `ignore-dependencies-glob-unmatched`,
15841
+ * `ignore-findings-pattern-unmatched`.
15842
+ *
15843
+ * Analysis-stage and plugin-stage kinds therefore reach only the envelopes
15844
+ * whose run includes a dead-code analyze pass, never a standalone
15845
+ * `fallow dupes --format json`. `path` is project-root-relative with
15846
+ * forward slashes; the array is omitted when empty. The same list is
15847
+ * repeated on each top-level command's envelope so single-command
15848
+ * consumers see it without having to look at a separate top-level field.
15849
+ *
15850
+ * A diagnostic here is advisory and never withholds a finding. Where an
15851
+ * entry reports a source file this run never fully analyzed
15852
+ * (`source-parse-degraded`, `source-read-failure`, `skipped-large-file`,
15853
+ * `skipped-minified-file`, `skipped-source-dotdir`) it can distort a
15854
+ * verdict, so the affected `unused_files[]`, `unused_exports[]`, and
15855
+ * dependency entries additionally carry the caveat themselves in their own
15856
+ * optional `reachability_caveats[]` array, and a reader who never scrolls
15857
+ * back up to this list still sees it. `fallow fix` reads the same array
15858
+ * and withholds the removal while a caveat stands.
15859
+ *
15860
+ * `excluded-by-default-ignore` is the one source-discovery kind that
15861
+ * reports unseen files WITHOUT raising a caveat. It names a built-in
15862
+ * ignore pattern (`** /dist/**`, `** /build/**`, `** /coverage/**`, or one
15863
+ * of the four minified-bundle globs) that removed candidate source files
15864
+ * from the walk, which is designed behavior on generated output rather
15865
+ * than a degraded run, so it is advisory only and no finding inherits it.
15866
+ * One entry per pattern, never per file, so the array stays bounded on a
15867
+ * project of any size. Gitignored trees are pruned before the walk sees
15868
+ * them and count zero, and `** /node_modules/**` is never reported:
15869
+ * installed dependencies are not the first-party source the kind is
15870
+ * about.
15871
+ */
15872
+ workspace_diagnostics?: WorkspaceDiagnostic[]
15873
+ /**
15874
+ * Read-only follow-up commands computed from this run's findings, emitted
15875
+ * at the JSON root so an agent acting on the output is pointed at fallow's
15876
+ * adjacent verification capabilities (trace, complexity breakdown, audit,
15877
+ * workspace scoping). Each command is runnable as-is and never mutating;
15878
+ * see [`NextStep`] for both contracts. Omitted when empty or when
15879
+ * `FALLOW_SUGGESTIONS=off`; does NOT contribute to `total_issues`.
15880
+ */
15881
+ next_steps?: NextStep[]
15882
+ }
15883
+ /**
15884
+ * Bare `fallow --format json` envelope.
15885
+ */
15886
+ export interface CombinedOutput {
15887
+ schema_version: CombinedSchemaVersion
15888
+ version: ToolVersion
15889
+ elapsed_ms: ElapsedMs
15890
+ /**
15891
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
15892
+ * always emits it, with the default exit rule of each section that ran
15893
+ * (`error-severity-findings`, `health-findings`). Without
15894
+ * `--fail-on-issues` or `--ci`, the machine formats of the combined run
15895
+ * exit 0 for findings, so most entries have `enforced: false`. With one of
15896
+ * these flags, the findings rules and `duplication-threshold` are
15897
+ * `enforced`, the dupes section adds an enforced `duplication-findings`
15898
+ * entry, and every format exits 1 when one fails. For the default
15899
+ * exit rules (`error-severity-findings`,
15900
+ * `health-findings`), `status` gives the verdict of the human run. An
15901
+ * advisory entry can report `fail` without a failure of the human run: an
15902
+ * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
15903
+ * not arm. A gate fails the build when `status` is `fail` AND `enforced`
15904
+ * is true. The typed
15905
+ * programmatic API leaves it absent. See [`crate::GateOutcomes`].
15906
+ */
15907
+ gate_outcomes?: (GateOutcomes | null)
15908
+ /**
15909
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
15910
+ * absent when it was asked for nothing. An entry whose `status` is not
15911
+ * `applied` means the run could not do what it was asked and reported
15005
15912
  * something WIDER instead, so what follows is a valid report of a scope
15006
15913
  * nobody requested. Honoured requests are published too, with
15007
15914
  * `status: "applied"`, so an absent object means "nothing was asked for",
@@ -17667,6 +18574,88 @@ outcome: SimilarCodeDomainOutcome
17667
18574
  */
17668
18575
  rationale: string
17669
18576
  }
18577
+ /**
18578
+ * Machine-readable readiness of the exact local companion and pinned model.
18579
+ */
18580
+ export interface SimilarCodeStatusOutput {
18581
+ schema_version: SimilarCodeStatusSchemaVersion
18582
+ version: ToolVersion
18583
+ /**
18584
+ * Companion protocol version.
18585
+ */
18586
+ protocol_version: number
18587
+ /**
18588
+ * Embedding calculation semantics implemented by the companion.
18589
+ */
18590
+ embedding_semantics_version: number
18591
+ /**
18592
+ * Exact companion package version.
18593
+ */
18594
+ companion_version: string
18595
+ /**
18596
+ * Whether every pinned model artifact is ready and verified.
18597
+ */
18598
+ model_ready: boolean
18599
+ /**
18600
+ * Immutable model identifier.
18601
+ */
18602
+ model_id: string
18603
+ /**
18604
+ * Immutable model revision.
18605
+ */
18606
+ model_revision: string
18607
+ /**
18608
+ * Embedding width.
18609
+ */
18610
+ dimensions: number
18611
+ /**
18612
+ * Maximum tokenizer length.
18613
+ */
18614
+ max_tokens: number
18615
+ /**
18616
+ * Model license identifier.
18617
+ */
18618
+ license: string
18619
+ /**
18620
+ * Local model cache directory.
18621
+ */
18622
+ cache_dir: string
18623
+ /**
18624
+ * Expected download size for all pinned artifacts.
18625
+ */
18626
+ download_bytes: number
18627
+ /**
18628
+ * Whether source analysis stays local and offline.
18629
+ */
18630
+ analysis_offline: boolean
18631
+ /**
18632
+ * Whether all installed artifacts passed integrity validation.
18633
+ */
18634
+ integrity_verified: boolean
18635
+ /**
18636
+ * Actionable readiness problem when the model is unavailable.
18637
+ */
18638
+ problem?: (string | null)
18639
+ /**
18640
+ * Whether this setup invocation downloaded new bytes.
18641
+ */
18642
+ downloaded?: (boolean | null)
18643
+ }
18644
+ /**
18645
+ * Result of explicitly clearing the derived project-namespaced vector cache.
18646
+ */
18647
+ export interface SimilarCodeCacheClearOutput {
18648
+ schema_version: SimilarCodeCacheClearSchemaVersion
18649
+ version: ToolVersion
18650
+ /**
18651
+ * Whether an existing vector cache was removed.
18652
+ */
18653
+ removed: boolean
18654
+ /**
18655
+ * Whether model artifacts were removed. Version 1 always emits false.
18656
+ */
18657
+ model_removed: boolean
18658
+ }
17670
18659
  /**
17671
18660
  * Single CodeClimate-compatible issue inside [`CodeClimateOutput`].
17672
18661
  */