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.
- package/README.md +17 -10
- package/capabilities.json +267 -157
- package/issue-registry.json +190 -154
- package/package.json +12 -12
- package/schema.json +31 -1
- package/skills/fallow/SKILL.md +29 -9
- package/skills/fallow/references/cli-reference.md +83 -38
- package/skills/fallow/references/gotchas.md +21 -13
- package/skills/fallow/references/issue-types.md +3 -2
- package/skills/fallow/references/mcp.md +17 -5
- package/skills/fallow/references/node-bindings.md +9 -3
- package/skills/fallow/references/patterns.md +37 -12
- package/skills/fallow-setup/SKILL.md +50 -0
- package/skills/fallow-setup/agents/openai.yaml +4 -0
- package/skills/fallow-setup/references/ci-gate.md +61 -0
- package/skills/fallow-setup/references/configure-and-install.md +56 -0
- package/skills/fallow-setup/references/tooling-detection.md +44 -0
- package/types/output-contract.d.ts +352 -24
|
@@ -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 =
|
|
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 =
|
|
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
|
-
*
|
|
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 =
|
|
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 =
|
|
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`,
|
|
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,
|
|
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`); `
|
|
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 `
|
|
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,
|
|
6723
|
-
* `changed-since`, in changed files that the run analyzed
|
|
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
|
|
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
|
|
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.
|
|
12801
|
-
*
|
|
12802
|
-
*
|
|
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`,
|
|
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
|