fallow 3.31.0 → 3.32.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.
@@ -112,7 +112,7 @@ kind: "similar-code-review"
112
112
  /**
113
113
  * Schema projection for the audit envelope's exact version.
114
114
  */
115
- export type AuditSchemaVersion = 11
115
+ export type AuditSchemaVersion = 12
116
116
  /**
117
117
  * Fallow CLI version that produced this envelope. Renders to the JSON wire as
118
118
  * a bare string (e.g. `"2.74.0"`).
@@ -204,7 +204,7 @@ export type TypeAwareAbstentionReason = ("no-project" | "ambiguous-project" | "b
204
204
  /**
205
205
  * Schema projection for the dead-code envelope's exact version.
206
206
  */
207
- export type CheckSchemaVersion = 9
207
+ export type CheckSchemaVersion = 10
208
208
  /**
209
209
  * A suggested action attached to a finding in the JSON output. Each finding
210
210
  * carries an `actions` array; consumers (agents, IDE clients, CI bots) can
@@ -261,7 +261,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
261
261
  * Discriminant string for [`FixAction`]. Kebab-case per the JSON output
262
262
  * contract.
263
263
  */
264
- export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "emit-component-event" | "wire-svelte-event" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
264
+ export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "review-component-prop" | "emit-component-event" | "wire-svelte-event" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
265
265
  /**
266
266
  * Singleton discriminant for [`SuppressLineAction`].
267
267
  */
@@ -380,7 +380,7 @@ export type ReExportCycleKind = ("multi-node" | "self-loop")
380
380
  /**
381
381
  * Which rule-pack rule kind produced a [`PolicyViolation`].
382
382
  */
383
- export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect" | "banned-export")
383
+ export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect" | "banned-export" | "gdp-proof-producer")
384
384
  /**
385
385
  * Effective severity of a single [`PolicyViolation`]. Per-rule `severity`
386
386
  * overrides the `rules."policy-violation"` master; `off` rules emit nothing,
@@ -562,7 +562,7 @@ kind: "malformed-tsconfig"
562
562
  kind: "tsconfig-reference-dir-missing"
563
563
  } | {
564
564
  /**
565
- * `serde_yaml_ng` parse error text.
565
+ * YAML parse error text.
566
566
  */
567
567
  error: string
568
568
  kind: "malformed-pnpm-workspace-yaml"
@@ -602,8 +602,15 @@ kind: "bun-lockb-override-resolution-skipped"
602
602
  } | {
603
603
  kind: "bun-lock-override-resolution-skipped"
604
604
  } | {
605
+ kind: "pnpm-lock-override-resolution-skipped"
606
+ } | {
607
+ kind: "npm-lock-override-resolution-skipped"
608
+ } | {
605
609
  kind: "bun-resolutions-shadowed-by-overrides"
606
610
  } | {
611
+ cause: PnpmWorkspaceOverridesIgnoredCause
612
+ kind: "pnpm-workspace-overrides-ignored"
613
+ } | {
607
614
  kind: "node-modules-missing"
608
615
  } | {
609
616
  kind: "boundaries-not-configured"
@@ -690,6 +697,13 @@ kind: "ownership-unavailable"
690
697
  error: string
691
698
  kind: "trend-snapshot-unreadable"
692
699
  } | {
700
+ /**
701
+ * Why the groups have no baseline, as a kebab-case token:
702
+ * `snapshot-has-no-groups` or `grouped-by-mismatch`. The set is open.
703
+ */
704
+ cause: string
705
+ kind: "trend-group-baseline-unavailable"
706
+ } | {
693
707
  /**
694
708
  * The plugin that read the config, as it labels itself:
695
709
  * `module-federation` for a standalone `module-federation.config.*`,
@@ -761,6 +775,11 @@ kind: "ignore-dependencies-glob-unmatched"
761
775
  pattern: string
762
776
  kind: "ignore-findings-pattern-unmatched"
763
777
  })
778
+ /**
779
+ * Why the declared pnpm version ignores the `overrides` section of
780
+ * `pnpm-workspace.yaml`.
781
+ */
782
+ export type PnpmWorkspaceOverridesIgnoredCause = ("package-json-overrides" | "pnpm-version")
764
783
  /**
765
784
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
766
785
  * emitted by the legacy `build_clone_group_actions` walker.
@@ -839,6 +858,15 @@ export type CoverageInputFormat = ("istanbul" | "v8")
839
858
  * Whether CRAP findings in the report used one coverage-source kind or a mix.
840
859
  */
841
860
  export type CoverageSourceConsistency = ("uniform" | "mixed")
861
+ /**
862
+ * One health section that a run produced.
863
+ *
864
+ * A section is in [`HealthReport::sections`] when the run computed it and
865
+ * the report carries its result, also when that result is empty. The value
866
+ * set is OPEN: a later release can add a section, so a consumer must accept
867
+ * a token that it does not know.
868
+ */
869
+ export type HealthSection = ("complexity" | "vital-signs" | "score" | "file-scores" | "coverage-gaps" | "hotspots" | "targets" | "trend" | "runtime-coverage" | "css")
842
870
  /**
843
871
  * Lifecycle state for a configured threshold override.
844
872
  */
@@ -1202,6 +1230,12 @@ export type HealthSchemaVersion = 11
1202
1230
  * groups by GitLab CODEOWNERS `[Section]` header name.
1203
1231
  */
1204
1232
  export type GroupByMode = ("owner" | "directory" | "package" | "section")
1233
+ /**
1234
+ * What the group trend compared, for one group.
1235
+ *
1236
+ * The value set is open: read an unknown value as "no trend for this group".
1237
+ */
1238
+ export type GroupTrendStatus = ("compared" | "new_group" | "no_group_baseline")
1205
1239
  /**
1206
1240
  * Schema projection for the duplication envelope's CLI and programmatic
1207
1241
  * version lineages.
@@ -1318,7 +1352,7 @@ export type SecurityBlindSpotsSchemaVersion = "1"
1318
1352
  /**
1319
1353
  * Schema projection for the combined envelope's exact version.
1320
1354
  */
1321
- export type CombinedSchemaVersion = 12
1355
+ export type CombinedSchemaVersion = 13
1322
1356
  /**
1323
1357
  * Schema projection for the feature-flags envelope's exact version.
1324
1358
  */
@@ -1363,7 +1397,7 @@ export type VendorFlagState = ("on" | "off" | "rolled_out" | "archived" | "exper
1363
1397
  * Independently-versioned wire-version newtype for the brief envelope.
1364
1398
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
1365
1399
  */
1366
- export type ReviewBriefSchemaVersion = 11
1400
+ export type ReviewBriefSchemaVersion = 12
1367
1401
  /**
1368
1402
  * The exactly-three shippable decision categories (the SOLID-3). No cut category
1369
1403
  * (abstraction / deletion / convention / irreversibility) is representable: this
@@ -1687,7 +1721,8 @@ duplication_demoted: number
1687
1721
  * gate and leaves the object absent.
1688
1722
  *
1689
1723
  * The names this build can emit are `error-severity-findings`, `regression`,
1690
- * `stale-baseline`, `baseline-growth`, `duplication-threshold`, `health-min-score`,
1724
+ * `stale-baseline`, `baseline-growth`, `duplication-threshold`,
1725
+ * `duplication-findings`, `health-min-score`,
1691
1726
  * `health-min-severity`, `health-findings`, `health-coverage-gaps`,
1692
1727
  * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`,
1693
1728
  * `type-aware-require` and `parse-error`. The set is OPEN: a name a consumer does not
@@ -1725,7 +1760,9 @@ enforced: boolean
1725
1760
  /**
1726
1761
  * The measured value the gate compared, when there is one: the duplication
1727
1762
  * percentage, the health score, the number of findings at or above the
1728
- * severity floor, or the number of files in `files`. Whole numbers are
1763
+ * severity floor, the number of `error` findings of `health-findings` and
1764
+ * of `error-severity-findings`, or
1765
+ * the number of files in `files`. Whole numbers are
1729
1766
  * carried as JSON numbers, so a count of three reads as `3.0`. Absent for
1730
1767
  * gates that compare no number.
1731
1768
  */
@@ -1738,7 +1775,9 @@ threshold?: (number | null)
1738
1775
  /**
1739
1776
  * How the limit was spelled, for a gate whose `threshold` number does not
1740
1777
  * carry its own unit. `health-min-severity` sets it to the severity floor
1741
- * (`moderate`, `high` or `critical`); `regression` sets it to the
1778
+ * (`moderate`, `high` or `critical`); `health-findings` and
1779
+ * `error-severity-findings` set it to `error`, the rule severity they
1780
+ * count; `regression` sets it to the
1742
1781
  * tolerance as the user wrote it (`"50%"` or `"5"`), because `threshold`
1743
1782
  * there is the allowance in issues and the percentage would otherwise be
1744
1783
  * unrecoverable on the grouped envelope, which carries no `regression`
@@ -2976,6 +3015,10 @@ dynamic_segment_name_conflicts?: DynamicSegmentNameConflictFinding[]
2976
3015
  * array natively. Default severity is `warn`.
2977
3016
  */
2978
3017
  unused_component_props?: UnusedComponentPropFinding[]
3018
+ /**
3019
+ * Used optional component inputs absent from inspected reachable callers. Off by default.
3020
+ */
3021
+ absent_component_props?: AbsentComponentPropFinding[]
2979
3022
  /**
2980
3023
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
2981
3024
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -3252,6 +3295,10 @@ unrendered_components?: number
3252
3295
  * Vue, Svelte, or React props referenced nowhere inside their own component.
3253
3296
  */
3254
3297
  unused_component_props?: number
3298
+ /**
3299
+ * Optional consumed props omitted by known reachable callers, for manual review.
3300
+ */
3301
+ absent_component_props?: number
3255
3302
  /**
3256
3303
  * Vue `<script setup>` emits emitted nowhere inside their own SFC.
3257
3304
  */
@@ -3942,6 +3989,12 @@ line: number
3942
3989
  * Workspace roots that import this package even though the declaring workspace does not.
3943
3990
  */
3944
3991
  used_in_workspaces?: string[]
3992
+ /**
3993
+ * Workspace roots whose package.json declares this package for the files
3994
+ * that import it. Only a root finding fills this field: these imports use
3995
+ * the nearer workspace declaration, so the root declaration stays unused.
3996
+ */
3997
+ declared_and_imported_in?: string[]
3945
3998
  /**
3946
3999
  * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3947
4000
  * `~<k>` suffix when several findings of one type share an identity.
@@ -4003,6 +4056,12 @@ line: number
4003
4056
  * Workspace roots that import this package even though the declaring workspace does not.
4004
4057
  */
4005
4058
  used_in_workspaces?: string[]
4059
+ /**
4060
+ * Workspace roots whose package.json declares this package for the files
4061
+ * that import it. Only a root finding fills this field: these imports use
4062
+ * the nearer workspace declaration, so the root declaration stays unused.
4063
+ */
4064
+ declared_and_imported_in?: string[]
4006
4065
  /**
4007
4066
  * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4008
4067
  * `~<k>` suffix when several findings of one type share an identity.
@@ -4064,6 +4123,12 @@ line: number
4064
4123
  * Workspace roots that import this package even though the declaring workspace does not.
4065
4124
  */
4066
4125
  used_in_workspaces?: string[]
4126
+ /**
4127
+ * Workspace roots whose package.json declares this package for the files
4128
+ * that import it. Only a root finding fills this field: these imports use
4129
+ * the nearer workspace declaration, so the root declaration stays unused.
4130
+ */
4131
+ declared_and_imported_in?: string[]
4067
4132
  /**
4068
4133
  * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4069
4134
  * `~<k>` suffix when several findings of one type share an identity.
@@ -5043,7 +5108,8 @@ kind: PolicyRuleKind
5043
5108
  * What matched: the written callee path for `banned-call` (e.g.
5044
5109
  * `cp.exec`), the raw import specifier for `banned-import` (e.g.
5045
5110
  * `moment/locale/nl`), `<effect>: <callee>` for `banned-effect`, or the
5046
- * exported name for `banned-export`.
5111
+ * exported name for `banned-export`. For `gdp-proof-producer`, the canonical
5112
+ * factory with its JSON-quoted literal label or `...` for a dynamic label.
5047
5113
  */
5048
5114
  matched: string
5049
5115
  severity: PolicyViolationSeverity
@@ -5866,6 +5932,92 @@ introduced?: (AuditIntroduced | null)
5866
5932
  */
5867
5933
  effective_severity?: (EffectiveSeverity | null)
5868
5934
  }
5935
+ /**
5936
+ * Wire-shape envelope for an [`AbsentComponentProp`] finding. There is no safe
5937
+ * auto-fix: removing a declared prop is judgement-bearing (the prop may be part
5938
+ * of a deliberately-stable public component API). Actions are manual
5939
+ * remediation guidance plus a line-level suppress at the prop declaration.
5940
+ */
5941
+ export interface AbsentComponentPropFinding {
5942
+ /**
5943
+ * Source path of the input declaration.
5944
+ */
5945
+ path: string
5946
+ /**
5947
+ * Semantic declaration name, or SFC filename stem.
5948
+ */
5949
+ component_name: string
5950
+ /**
5951
+ * Public framework token.
5952
+ */
5953
+ framework: string
5954
+ /**
5955
+ * Public optional input name.
5956
+ */
5957
+ prop_name: string
5958
+ /**
5959
+ * 1-based declaration line.
5960
+ */
5961
+ line: number
5962
+ /**
5963
+ * 0-based declaration byte column.
5964
+ */
5965
+ col: number
5966
+ /**
5967
+ * Whether omission has a declared default.
5968
+ */
5969
+ has_default: boolean
5970
+ /**
5971
+ * Every inspected reachable caller, deterministically ordered.
5972
+ */
5973
+ inspected_call_sites: ComponentPropCallSite[]
5974
+ /**
5975
+ * Manual-review meaning and limits of static evidence.
5976
+ */
5977
+ explanation: string
5978
+ /**
5979
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5980
+ * `~<k>` suffix when several findings of one type share an identity.
5981
+ * Line and column are not inputs, so the id survives line shifts,
5982
+ * reformats and reorders. A rename of the file or the symbol gives a
5983
+ * new id. Absent in output from older versions.
5984
+ */
5985
+ finding_id?: (string | null)
5986
+ /**
5987
+ * Suggested next steps. Always emitted (possibly empty for
5988
+ * forward-compat).
5989
+ */
5990
+ actions: IssueAction[]
5991
+ /**
5992
+ * Set by the audit pass when this finding is introduced relative to
5993
+ * the merge-base.
5994
+ */
5995
+ introduced?: (AuditIntroduced | null)
5996
+ /**
5997
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5998
+ * resolve for its path. CI formats read it for the annotation, SARIF
5999
+ * and CodeClimate level. Absent in output from older versions. Not
6000
+ * part of the finding identity, baseline keys or fingerprints.
6001
+ */
6002
+ effective_severity?: (EffectiveSeverity | null)
6003
+ }
6004
+ /**
6005
+ * One inspected reachable component invocation.
6006
+ */
6007
+ export interface ComponentPropCallSite {
6008
+ /**
6009
+ * Caller source path.
6010
+ */
6011
+ path: string
6012
+ /**
6013
+ * 1-based opening-tag line.
6014
+ */
6015
+ line: number
6016
+ /**
6017
+ * 0-based original-source byte column.
6018
+ */
6019
+ col: number
6020
+ }
5869
6021
  /**
5870
6022
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
5871
6023
  * auto-fix: removing a declared emit is judgement-bearing (the event may be
@@ -6486,6 +6638,18 @@ stale_entries: number
6486
6638
  * when every entry went unmatched.
6487
6639
  */
6488
6640
  current_findings: number
6641
+ /**
6642
+ * Health only: the number of functions above a complexity threshold that
6643
+ * the baseline does not accept. This is a count of functions, like
6644
+ * `summary.functions_above_threshold`, not a count of baseline entries,
6645
+ * and it is the value before `--top`. A run that does not list the
6646
+ * complexity findings (for example `--score`) still reports it, so a
6647
+ * reader can tell the new functions from the accepted ones.
6648
+ *
6649
+ * `dead-code` and `dupes` do not emit it. An envelope from a fallow
6650
+ * version before this member does not carry it either.
6651
+ */
6652
+ remaining_findings?: (number | null)
6489
6653
  /**
6490
6654
  * True when this run analyzed only part of the project, so a whole-project
6491
6655
  * baseline matches less of it for reasons that are not rot. The channels
@@ -6701,7 +6865,7 @@ reason?: (string | null)
6701
6865
  * all of it applied, which is a different and false claim.
6702
6866
  *
6703
6867
  * The names this build can emit are `changed-since`, `diff-filter`,
6704
- * `package-baselines` and `sarif-file`. The reasons are `git-missing`,
6868
+ * `package-baselines`, `sarif-file` and `group-filter`. The reasons are `git-missing`,
6705
6869
  * `not-a-repository`, `git-failed` and `invalid-ref` for `changed-since`,
6706
6870
  * `unknown-workspace`, `git-missing`, `not-a-repository` and `git-failed`
6707
6871
  * for `package-baselines`, `oversize`,
@@ -6719,8 +6883,9 @@ reason?: (string | null)
6719
6883
  * whole object narrows the report tells its reader an unwritten SARIF file
6720
6884
  * widened the analysis, which is what `affects` exists to prevent.
6721
6885
  *
6722
- * `scope_size` is emitted for `diff-filter`, in added lines, and for
6723
- * `changed-since`, in changed files that the run analyzed. `package-baselines`
6886
+ * `scope_size` is emitted for `diff-filter`, in added lines, for
6887
+ * `changed-since`, in changed files that the run analyzed, and for
6888
+ * `group-filter`, in groups that the run kept. `package-baselines`
6724
6889
  * and `sarif-file` measure no scope; the applied package refs travel in
6725
6890
  * `package_baselines`. A consumer reads the unit off the name, so a name that
6726
6891
  * starts to measure its own scope in a later release needs no change here.
@@ -6749,7 +6914,8 @@ affects: RequestEffect
6749
6914
  * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`, or
6750
6915
  * `diffFile pr.diff` for the programmatic option) for `diff-filter`,
6751
6916
  * `workspaces.changedSince` for `package-baselines`, the target path for
6752
- * `sarif-file`. Echoed rather than normalised, so a
6917
+ * `sarif-file`, the comma-joined selector patterns for `group-filter`.
6918
+ * Echoed rather than normalised, so a
6753
6919
  * consumer must not join it to the project root the way it joins every
6754
6920
  * other path-shaped field.
6755
6921
  */
@@ -6766,7 +6932,7 @@ requested: string
6766
6932
  * rule dropped does not count, so a change to a README only gives `0`. A
6767
6933
  * combined run counts a file that any of its analyses kept, because a
6768
6934
  * per-analysis `production` setting can give its analyses different
6769
- * files.
6935
+ * files. `group-filter` counts the groups that the run kept.
6770
6936
  * Read the unit off the name the entry is keyed under, never across names,
6771
6937
  * and read an absent member as "not measured" rather than as zero.
6772
6938
  *
@@ -6983,6 +7149,15 @@ end_col: number
6983
7149
  * wants the source reads it from the file.
6984
7150
  */
6985
7151
  fragment?: string
7152
+ /**
7153
+ * Whether the file path is a symlink, or lies under a symlinked
7154
+ * directory, inside the project root. Omitted when `false`.
7155
+ *
7156
+ * A clone with a symlinked instance can be the same file under two
7157
+ * paths, not copied code. `duplicates.ignoreSymlinks` (or
7158
+ * `fallow dupes --ignore-symlinks`) removes these instances.
7159
+ */
7160
+ is_symlink?: boolean
6986
7161
  }
6987
7162
  /**
6988
7163
  * Per-action wire shape attached to each `CloneGroupFinding` and
@@ -7197,6 +7372,15 @@ export interface HealthReport {
7197
7372
  */
7198
7373
  findings: HealthFinding[]
7199
7374
  summary: HealthSummary
7375
+ /**
7376
+ * The sections that this run produced, in a fixed order. A renderer
7377
+ * reads it to tell an empty section from a section that the run did not
7378
+ * produce: `findings` is the complexity list only when `complexity` is
7379
+ * in this array. The value set is OPEN (see [`HealthSection`]). Absent
7380
+ * in an envelope from a fallow version before this member, and on a
7381
+ * report that no health run built.
7382
+ */
7383
+ sections?: (HealthSection[] | null)
7200
7384
  /**
7201
7385
  * Configured threshold override states. Entries are emitted for active
7202
7386
  * exceptions, stale exceptions, and full-run no-match cleanup hints.
@@ -9633,6 +9817,11 @@ score?: (number | null)
9633
9817
  * Letter grade from the snapshot.
9634
9818
  */
9635
9819
  grade?: (string | null)
9820
+ /**
9821
+ * Formula used for the stored score; absent on legacy snapshots.
9822
+ * A score delta is emitted only when this matches the current score formula.
9823
+ */
9824
+ score_formula_version?: (number | null)
9636
9825
  /**
9637
9826
  * Coverage model used for CRAP computation in this snapshot.
9638
9827
  */
@@ -11460,17 +11649,26 @@ imported_by: string[]
11460
11649
  */
11461
11650
  type_only_imported_by: string[]
11462
11651
  /**
11463
- * Whether the dependency is invoked from package.json scripts or CI configs.
11652
+ * Whether the dependency is invoked from package.json scripts, CI configs
11653
+ * or git hooks.
11464
11654
  */
11465
11655
  used_in_scripts: boolean
11466
11656
  /**
11467
- * Whether the dependency is used at all.
11657
+ * Whether the dependency is used at all: imported, invoked from scripts,
11658
+ * or listed as a peer by a used package (`peer_of`).
11468
11659
  */
11469
11660
  is_used: boolean
11470
11661
  /**
11471
11662
  * Total import count.
11472
11663
  */
11473
11664
  import_count: number
11665
+ /**
11666
+ * Used packages that list this dependency in their installed
11667
+ * `peerDependencies`, required or optional, sorted by name. The
11668
+ * unused-dependency check credits such a peer, because the package that
11669
+ * lists it loads it at runtime. Absent when no used package lists it.
11670
+ */
11671
+ peer_of?: string[]
11474
11672
  /**
11475
11673
  * The configs that declare this name as a Module Federation remote alias
11476
11674
  * under `remotes`, one per config. A remote alias is provided by a
@@ -11478,6 +11676,58 @@ import_count: number
11478
11676
  * Federation config declares the name (issue #2796).
11479
11677
  */
11480
11678
  sources?: TraceSource[]
11679
+ /**
11680
+ * Why the unused devDependency check credits the dependency as tooling
11681
+ * when no file imports it and no script, CI workflow or git hook runs it.
11682
+ * When present, `is_used` is `true`. Absent otherwise.
11683
+ */
11684
+ tooling_credit?: (ToolingCredit | null)
11685
+ /**
11686
+ * The manifests that the unused-dependency check flags for this name,
11687
+ * relative to the project root and sorted. The check reads each
11688
+ * declaring manifest on its own. An import credits the nearest manifest
11689
+ * that installs the package, so a name that one workspace uses can still
11690
+ * be unused in the root manifest or in another workspace. Absent when no
11691
+ * manifest is flagged.
11692
+ */
11693
+ unused_in?: string[]
11694
+ }
11695
+ /**
11696
+ * Why the unused devDependency check counts a dependency as used tooling
11697
+ * although no source file imports it.
11698
+ */
11699
+ export interface ToolingCredit {
11700
+ /**
11701
+ * The evidence: `plugin-config` when the plugin that declares the
11702
+ * dependency found its own config file, `plugin-reference` when a
11703
+ * package.json script, a CI workflow or a git hook runs one of that
11704
+ * plugin's packages, `ambient-types` for a type package that declares
11705
+ * globals, `types-target` when the project declares or imports the
11706
+ * package that a `@types/` package types, `types-config` when a config
11707
+ * file, such as a tsconfig `types` entry, names the type package,
11708
+ * `known-tooling` for a library from the tooling catalogue,
11709
+ * `known-tooling-config` when a command-line tool from the catalogue has
11710
+ * its own config file, and `own-peer` when the same manifest lists the
11711
+ * devDependency in `peerDependencies`. The set is open.
11712
+ */
11713
+ reason: string
11714
+ /**
11715
+ * The plugin that declares the dependency as tooling.
11716
+ */
11717
+ plugin?: (string | null)
11718
+ /**
11719
+ * The config file found, relative to the project root, for
11720
+ * `plugin-config` and `known-tooling-config`. A `package.json` path when
11721
+ * the config is a package.json key. For `own-peer`, the manifest that
11722
+ * lists the dependency.
11723
+ */
11724
+ config?: (string | null)
11725
+ /**
11726
+ * The package that a script, CI workflow or git hook runs, for
11727
+ * `plugin-reference`, or the package that a `@types/` package types,
11728
+ * for `types-target`.
11729
+ */
11730
+ reference?: (string | null)
11481
11731
  }
11482
11732
  /**
11483
11733
  * Result of tracing a clone: all groups containing the code at a source
@@ -12467,6 +12717,15 @@ elapsed_ms: ElapsedMs
12467
12717
  */
12468
12718
  findings: HealthFinding[]
12469
12719
  summary: HealthSummary
12720
+ /**
12721
+ * The sections that this run produced, in a fixed order. A renderer
12722
+ * reads it to tell an empty section from a section that the run did not
12723
+ * produce: `findings` is the complexity list only when `complexity` is
12724
+ * in this array. The value set is OPEN (see [`HealthSection`]). Absent
12725
+ * in an envelope from a fallow version before this member, and on a
12726
+ * report that no health run built.
12727
+ */
12728
+ sections?: (HealthSection[] | null)
12470
12729
  /**
12471
12730
  * Configured threshold override states. Entries are emitted for active
12472
12731
  * exceptions, stale exceptions, and full-run no-match cleanup hints.
@@ -12591,6 +12850,12 @@ grouped_by?: (GroupByMode | null)
12591
12850
  * Per-bucket recomputed metrics; present only in grouped output.
12592
12851
  */
12593
12852
  groups?: (HealthGroup[] | null)
12853
+ /**
12854
+ * The `--group` selector patterns, as given, when the run kept only some
12855
+ * groups. A group that is not in `groups` was filtered out by this
12856
+ * selector. The project-level sections are not filtered.
12857
+ */
12858
+ group_filter?: (string[] | null)
12594
12859
  /**
12595
12860
  * The verdict of every gate this run evaluated, keyed by name. The CLI
12596
12861
  * always emits it, with the command's default exit rule in it also when
@@ -12640,6 +12905,11 @@ next_steps?: NextStep[]
12640
12905
  * a single invocation. `files_analyzed` and `functions_above_threshold`
12641
12906
  * summarise the subset for parity with the project-level
12642
12907
  * project-level health summary.
12908
+ *
12909
+ * A group carries a per-file list (`findings`, `file_scores`, `hotspots`,
12910
+ * `large_functions`, `targets`) only when the project report shows the same
12911
+ * list. A `--score` run keeps the score and the counts of each group and
12912
+ * omits the lists.
12643
12913
  */
12644
12914
  export interface HealthGroup {
12645
12915
  /**
@@ -12664,9 +12934,37 @@ files_analyzed: number
12664
12934
  * Number of findings in this group, mirroring the project-level
12665
12935
  * `summary.functions_above_threshold` semantics post-baseline /
12666
12936
  * post-`--top` truncation. When `--top` was supplied this reflects the
12667
- * rendered finding count, not the un-truncated total.
12937
+ * rendered finding count of the group, not the un-truncated total.
12668
12938
  */
12669
12939
  functions_above_threshold: number
12940
+ /**
12941
+ * Number of critical-severity findings in this group, after the baseline
12942
+ * filter and before `--top`. The project `summary.severity_critical_count`
12943
+ * counts before the baseline filter, so with `--baseline` the group
12944
+ * counts can add up to less.
12945
+ */
12946
+ severity_critical_count: number
12947
+ /**
12948
+ * Number of high-severity findings in this group, after the baseline
12949
+ * filter and before `--top`. The project `summary.severity_high_count`
12950
+ * counts before the baseline filter, so with `--baseline` the group
12951
+ * counts can add up to less.
12952
+ */
12953
+ severity_high_count: number
12954
+ /**
12955
+ * Number of moderate-severity findings in this group, after the baseline
12956
+ * filter and before `--top`. The project `summary.severity_moderate_count`
12957
+ * counts before the baseline filter, so with `--baseline` the group
12958
+ * counts can add up to less.
12959
+ */
12960
+ severity_moderate_count: number
12961
+ /**
12962
+ * Number of ranked hotspot entries in this group, before `--top`. This
12963
+ * is the length of the group's ranked hotspot list. It is not
12964
+ * `vital_signs.hotspot_count`, which counts only the files with a
12965
+ * hotspot score of 50 or more and feeds the health score.
12966
+ */
12967
+ hotspot_count: number
12670
12968
  /**
12671
12969
  * Whether CRAP findings in this group share a single coverage-source kind
12672
12970
  * (`uniform`) or combine Istanbul / estimated / inherited sources
@@ -12680,9 +12978,24 @@ coverage_source_consistency?: (CoverageSourceConsistency | null)
12680
12978
  vital_signs?: (VitalSigns | null)
12681
12979
  /**
12682
12980
  * Per-group health score recomputed from the per-group vital signs. Absent
12683
- * when --score was not requested.
12981
+ * when --score was not requested. The duplication penalty counts each
12982
+ * clone group with two or more instances in total and one or more in
12983
+ * this group, and counts only the lines of the instances in this group.
12984
+ * A clone that spans two groups thus lowers the score of each group.
12985
+ * `dupes --group-by` assigns each clone group to one owner instead.
12684
12986
  */
12685
12987
  health_score?: (HealthScore | null)
12988
+ /**
12989
+ * Trend of this group against the same group in the baseline snapshot.
12990
+ * Present only when `--trend` or `--trend-from` was requested and the
12991
+ * baseline holds this group with the same `grouped_by` mode.
12992
+ */
12993
+ trend?: (HealthTrend | null)
12994
+ /**
12995
+ * Why `trend` is present or absent. Present only when a trend was
12996
+ * requested and a baseline snapshot was loaded.
12997
+ */
12998
+ trend_status?: (GroupTrendStatus | null)
12686
12999
  /**
12687
13000
  * Findings restricted to files in this group. Each entry is the typed
12688
13001
  * [`HealthFinding`] wrapper around a
@@ -12797,9 +13110,10 @@ baseline_staleness?: (BaselineStaleness | null)
12797
13110
  /**
12798
13111
  * The verdict of every gate this run armed, keyed by name, absent when
12799
13112
  * it armed none. `dupes` has no default exit rule: a run with no armed
12800
- * gate always exits 0, so an absent object means that the run passed. A
12801
- * gate fails the build when `status` is `fail` AND `enforced` is true.
12802
- * See [`crate::GateOutcomes`].
13113
+ * gate always exits 0, so an absent object means that the run passed.
13114
+ * `--fail-on-issues` and `--ci` arm `duplication-findings`, which fails
13115
+ * on any clone group. A gate fails the build when `status` is `fail` AND
13116
+ * `enforced` is true. See [`crate::GateOutcomes`].
12803
13117
  */
12804
13118
  gate_outcomes?: (GateOutcomes | null)
12805
13119
  /**
@@ -12947,6 +13261,15 @@ end_col: number
12947
13261
  * wants the source reads it from the file.
12948
13262
  */
12949
13263
  fragment?: string
13264
+ /**
13265
+ * Whether the file path is a symlink, or lies under a symlinked
13266
+ * directory, inside the project root. Omitted when `false`.
13267
+ *
13268
+ * A clone with a symlinked instance can be the same file under two
13269
+ * paths, not copied code. `duplicates.ignoreSymlinks` (or
13270
+ * `fallow dupes --ignore-symlinks`) removes these instances.
13271
+ */
13272
+ is_symlink?: boolean
12950
13273
  /**
12951
13274
  * Resolver key for this specific instance (per-instance, not the
12952
13275
  * group-level largest-owner).
@@ -13320,6 +13643,10 @@ dynamic_segment_name_conflicts?: DynamicSegmentNameConflictFinding[]
13320
13643
  * array natively. Default severity is `warn`.
13321
13644
  */
13322
13645
  unused_component_props?: UnusedComponentPropFinding[]
13646
+ /**
13647
+ * Used optional component inputs absent from inspected reachable callers. Off by default.
13648
+ */
13649
+ absent_component_props?: AbsentComponentPropFinding[]
13323
13650
  /**
13324
13651
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
13325
13652
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -14660,7 +14987,8 @@ elapsed_ms: ElapsedMs
14660
14987
  * `--fail-on-issues` or `--ci`, the machine formats of the combined run
14661
14988
  * exit 0 for findings, so most entries have `enforced: false`. With one of
14662
14989
  * these flags, the findings rules and `duplication-threshold` are
14663
- * `enforced`, and every format exits 1 when one fails. For the default
14990
+ * `enforced`, the dupes section adds an enforced `duplication-findings`
14991
+ * entry, and every format exits 1 when one fails. For the default
14664
14992
  * exit rules (`error-severity-findings`,
14665
14993
  * `health-findings`), `status` gives the verdict of the human run. An
14666
14994
  * advisory entry can report `fail` without a failure of the human run: an