fallow 2.104.0 → 3.1.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.
@@ -242,9 +242,10 @@ fallow:
242
242
  variables:
243
243
  FALLOW_COMMENT: "true"
244
244
  FALLOW_SUMMARY_SCOPE: "diff"
245
+ FALLOW_PR_COMMENT_LAYOUT: "gate-only"
245
246
  ```
246
247
 
247
- Posts a summary comment on the MR with issue counts and findings. In MR pipelines, `--changed-since` is auto-detected from `$CI_MERGE_REQUEST_TARGET_BRANCH_NAME`, so only issues from changed files are reported. `FALLOW_SUMMARY_SCOPE: "diff"` also hides project-level dependency/catalog/override findings whose anchor line is outside the diff. Requires `GITLAB_TOKEN` CI/CD variable (project access token with `api` scope); `CI_JOB_TOKEN` is read-only for MR notes in the official GitLab API.
248
+ Posts a summary comment on the MR with issue counts and findings. In MR pipelines, `--changed-since` is auto-detected from `$CI_MERGE_REQUEST_TARGET_BRANCH_NAME`, so only issues from changed files are reported. `FALLOW_SUMMARY_SCOPE: "diff"` also hides project-level dependency/catalog/override findings whose anchor line is outside the diff. `FALLOW_PR_COMMENT_LAYOUT: "gate-only"` keeps the sticky comment compact when GitLab Code Quality is the primary review surface. Requires `GITLAB_TOKEN` CI/CD variable (project access token with `api` scope); `CI_JOB_TOKEN` is read-only for MR notes in the official GitLab API.
248
249
 
249
250
  ### GitLab CI: With Inline Code Review Comments
250
251
 
@@ -272,12 +273,13 @@ fallow:
272
273
  variables:
273
274
  FALLOW_COMMENT: "true"
274
275
  FALLOW_SUMMARY_SCOPE: "diff"
276
+ FALLOW_PR_COMMENT_LAYOUT: "gate-only"
275
277
  FALLOW_REVIEW: "true"
276
278
  FALLOW_REVIEW_GUIDANCE: "true"
277
279
  FALLOW_FAIL_ON_ISSUES: "true"
278
280
  ```
279
281
 
280
- Posts both a summary comment and inline review comments on the MR. `FALLOW_SUMMARY_SCOPE: "diff"` only affects the sticky summary; inline review comments remain anchored to diff lines. The template auto-detects the package manager (npm/pnpm/yarn) from lockfiles, so review comments show the correct commands for the project (e.g., `pnpm remove` instead of `npm uninstall`).
282
+ Posts both a summary comment and inline review comments on the MR. `FALLOW_SUMMARY_SCOPE: "diff"` and `FALLOW_PR_COMMENT_LAYOUT` only affect the sticky summary; inline review comments remain anchored to diff lines. The template auto-detects the package manager (npm/pnpm/yarn) from lockfiles, so review comments show the correct commands for the project (e.g., `pnpm remove` instead of `npm uninstall`).
281
283
 
282
284
  ### GitLab CI: With Health Score and Trend
283
285
 
@@ -2,7 +2,7 @@
2
2
  * AUTOGENERATED FILE. DO NOT EDIT.
3
3
  *
4
4
  * Generated from `docs/output-schema.json` by
5
- * `editors/vscode/scripts/codegen-types.mjs`. The same file is written to
5
+ * `editors/vscode/scripts/codegen-contracts.mjs`. The same file is written to
6
6
  * `editors/vscode/src/generated/output-contract.d.ts` (extension internal) and
7
7
  * `npm/fallow/types/output-contract.d.ts` (published as `fallow/types`).
8
8
  *
@@ -10,15 +10,14 @@
10
10
  * 1. Edit the Rust struct in `crates/types/src/results.rs` (or the
11
11
  * duplicates crate at `crates/core/src/duplicates/types.rs`). The Rust
12
12
  * side is the runtime source of truth for the JSON output.
13
- * 2. Update `docs/output-schema.json` to match. The schema is
14
- * hand-maintained against the Rust structs; the drift-guard test in
15
- * `crates/cli/src/report/json.rs` enforces only a subset of the
16
- * contract (the `HealthFindingAction` enum). Field-level drift between
17
- * Rust and the schema is currently caught by code review.
18
- * 3. Run `pnpm --filter fallow-vscode codegen:types` from anywhere.
19
- * 4. Commit both regenerated files alongside the schema edit.
13
+ * 2. Regenerate `docs/output-schema.json` with
14
+ * `cargo run -p fallow-cli --features schema-emit --bin fallow-schema-emit`.
15
+ * The schema-emit drift tests compare the committed schema against the
16
+ * Rust-derived definitions.
17
+ * 3. Run `pnpm --filter fallow-vscode codegen:contracts` from anywhere.
18
+ * 4. Commit the regenerated schema and generated contract files together.
20
19
  *
21
- * CI runs `pnpm --filter fallow-vscode check:codegen` which fails when
20
+ * CI runs `pnpm --filter fallow-vscode check:contracts` which fails when
22
21
  * either committed file disagrees with what regen would produce.
23
22
  */
24
23
  /* eslint-disable */
@@ -187,7 +186,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
187
186
  * Discriminant string for [`FixAction`]. Kebab-case per the JSON output
188
187
  * contract.
189
188
  */
190
- 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" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "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")
189
+ 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" | "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")
191
190
  /**
192
191
  * Singleton discriminant for [`SuppressLineAction`].
193
192
  */
@@ -252,7 +251,7 @@ export type ReExportCycleKind = ("multi-node" | "self-loop")
252
251
  /**
253
252
  * Which rule-pack rule kind produced a [`PolicyViolation`].
254
253
  */
255
- export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect")
254
+ export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect" | "banned-export")
256
255
  /**
257
256
  * Effective severity of a single [`PolicyViolation`]. Per-rule `severity`
258
257
  * overrides the `rules."policy-violation"` master; `off` rules emit nothing,
@@ -594,7 +593,7 @@ export type FrameworkHealthDetectorStatus = ("active" | "disabled_by_config" | "
594
593
  /**
595
594
  * Discriminant for [`CssCandidateAction::kind`].
596
595
  */
597
- export type CssCandidateActionType = ("verify-unused" | "verify-undefined" | "consolidate" | "replace-with-token" | "standardize")
596
+ export type CssCandidateActionType = ("verify-unused" | "verify-undefined" | "consolidate" | "replace-with-token" | "standardize" | "simplify-selector")
598
597
  /**
599
598
  * Discriminant for [`UnusedAtRule::kind`].
600
599
  */
@@ -602,12 +601,12 @@ export type UnusedAtRuleKind = ("property-registration" | "layer")
602
601
  /**
603
602
  * The surface through which a design token is consumed. The `theme-var` /
604
603
  * `css-var` / `utility` / `apply` kinds are Tailwind v4 `@theme` consumption; the
605
- * `js-member` kind is CSS-in-JS consumption (a cross-module member access on an
606
- * imported StyleX/vanilla-extract token binding). The kind is the disjoint origin
607
- * signal that distinguishes a Tailwind token entry from a CSS-in-JS token entry in
608
- * the shared `token_consumers` list.
604
+ * `js-member` / `js-call` kinds are CSS-in-JS consumption (member access on an
605
+ * imported StyleX/vanilla-extract token binding, or a PandaCSS `token('...')`
606
+ * call). The kind is the disjoint origin signal that distinguishes a Tailwind
607
+ * token entry from a CSS-in-JS token entry in the shared `token_consumers` list.
609
608
  */
610
- export type ConsumerKind = ("theme-var" | "css-var" | "utility" | "apply" | "js-member")
609
+ export type ConsumerKind = ("theme-var" | "css-var" | "utility" | "apply" | "js-member" | "js-call")
611
610
  /**
612
611
  * Trust level for a [`StylingHealth`] grade. TWO variants (not the three-tier
613
612
  * `high`/`medium`/`low` of [`crate::Confidence`] / `FeatureFlagConfidence`) ON
@@ -617,6 +616,18 @@ export type ConsumerKind = ("theme-var" | "css-var" | "utility" | "apply" | "js-
617
616
  * `"low"`), matching the sibling confidence enums' vocabulary.
618
617
  */
619
618
  export type StylingHealthConfidence = ("high" | "low")
619
+ /**
620
+ * Effective configured severity for a styling finding.
621
+ */
622
+ export type StylingFindingSeverity = ("warn" | "error")
623
+ /**
624
+ * Confidence hint for a [`StylingFinding`].
625
+ */
626
+ export type StylingFindingConfidence = ("high" | "low")
627
+ /**
628
+ * Agent handling hint for a [`StylingFinding`].
629
+ */
630
+ export type StylingAgentDisposition = ("fix-confidently" | "verify-first")
620
631
  export type InspectTargetDescriptor = ({
621
632
  file: string
622
633
  type: "file"
@@ -1096,6 +1107,13 @@ type_only_dependencies: TypeOnlyDependencyFinding[]
1096
1107
  * devDependencies). Wrapped in [`TestOnlyDependencyFinding`].
1097
1108
  */
1098
1109
  test_only_dependencies?: TestOnlyDependencyFinding[]
1110
+ /**
1111
+ * devDependencies imported by production (non-test, non-config) source code
1112
+ * via a runtime/value import; they should be promoted to dependencies.
1113
+ * The promote-side mirror of [`TestOnlyDependencyFinding`]. Wrapped in
1114
+ * [`DevDependencyInProductionFinding`].
1115
+ */
1116
+ dev_dependencies_in_production?: DevDependencyInProductionFinding[]
1099
1117
  /**
1100
1118
  * Circular dependency chains detected in the module graph. Wrapped in
1101
1119
  * [`CircularDependencyFinding`] so each entry carries a typed `actions`
@@ -1454,6 +1472,11 @@ type_only_dependencies: number
1454
1472
  * devDependencies).
1455
1473
  */
1456
1474
  test_only_dependencies: number
1475
+ /**
1476
+ * devDependencies imported by production source code with a runtime/value
1477
+ * import (should be promoted to dependencies).
1478
+ */
1479
+ dev_dependencies_in_production: number
1457
1480
  /**
1458
1481
  * Cycles detected in the import graph.
1459
1482
  */
@@ -2258,6 +2281,37 @@ actions: IssueAction[]
2258
2281
  */
2259
2282
  introduced?: (AuditIntroduced | null)
2260
2283
  }
2284
+ /**
2285
+ * Wire-shape envelope for a [`DevDependencyInProduction`] finding. Carries a
2286
+ * `move-to-prod` primary (the promote-side mirror of
2287
+ * [`TestOnlyDependencyFinding`]'s `move-to-dev`) plus the standard
2288
+ * `ignoreDependencies` config suppress.
2289
+ */
2290
+ export interface DevDependencyInProductionFinding {
2291
+ /**
2292
+ * devDependency imported at runtime from production code, consider moving
2293
+ * to dependencies.
2294
+ */
2295
+ package_name: string
2296
+ /**
2297
+ * Path to the package.json where the dependency is listed.
2298
+ */
2299
+ path: string
2300
+ /**
2301
+ * 1-based line number of the dependency entry in package.json.
2302
+ */
2303
+ line: number
2304
+ /**
2305
+ * Suggested next steps. Always emitted (possibly empty for
2306
+ * forward-compat).
2307
+ */
2308
+ actions: IssueAction[]
2309
+ /**
2310
+ * Set by the audit pass when this finding is introduced relative to
2311
+ * the merge-base.
2312
+ */
2313
+ introduced?: (AuditIntroduced | null)
2314
+ }
2261
2315
  /**
2262
2316
  * Wire-shape envelope for a [`CircularDependency`] finding. Mirrors
2263
2317
  * [`UnusedFileFinding`]: flattens the bare finding and carries a typed
@@ -2506,7 +2560,8 @@ kind: PolicyRuleKind
2506
2560
  /**
2507
2561
  * What matched: the written callee path for `banned-call` (e.g.
2508
2562
  * `cp.exec`), the raw import specifier for `banned-import` (e.g.
2509
- * `moment/locale/nl`), or `<effect>: <callee>` for `banned-effect`.
2563
+ * `moment/locale/nl`), `<effect>: <callee>` for `banned-effect`, or the
2564
+ * exported name for `banned-export`.
2510
2565
  */
2511
2566
  matched: string
2512
2567
  severity: PolicyViolationSeverity
@@ -4043,6 +4098,15 @@ css_analytics?: (CssAnalyticsReport | null)
4043
4098
  * code score is never affected by this field.
4044
4099
  */
4045
4100
  styling_health?: (StylingHealth | null)
4101
+ /**
4102
+ * Advisory STYLING FINDINGS: the graduation of the descriptive css
4103
+ * candidates into first-class, severity-aware, suppressible findings
4104
+ * surfaced in `fallow audit`. Verdict-neutral by default (the rule defaults
4105
+ * to `warn`); the styling domain's OWN findings collection, not the dead-code
4106
+ * `AnalysisResults`. Present only with `--css`; empty is skipped so a plain
4107
+ * run is byte-unchanged.
4108
+ */
4109
+ styling_findings?: StylingFinding[]
4046
4110
  }
4047
4111
  /**
4048
4112
  * Wire envelope for a single complexity finding.
@@ -5852,6 +5916,19 @@ undefined_keyframes?: UndefinedKeyframes[]
5852
5916
  * descending.
5853
5917
  */
5854
5918
  duplicate_declaration_blocks?: CssDuplicateBlock[]
5919
+ /**
5920
+ * CVA / shadcn variant class strings that repeat the same normalized class
5921
+ * block in several variant values. Kept separate from CSS declaration-block
5922
+ * duplication because the source is JS config, not parsed CSS rules.
5923
+ */
5924
+ cva_duplicate_variant_blocks?: CvaDuplicateVariantBlock[]
5925
+ /**
5926
+ * CVA / shadcn variant class strings that hardcode a Tailwind arbitrary
5927
+ * value even though an existing token has the same or nearest comparable
5928
+ * value. Advisory: variants often encode product semantics, so agents
5929
+ * should verify intent before replacing.
5930
+ */
5931
+ cva_variant_token_drifts?: CvaVariantTokenDrift[]
5855
5932
  /**
5856
5933
  * Tailwind arbitrary-value utilities (`w-[13px]`, `bg-[#abc]`) found in
5857
5934
  * markup, which hardcode a one-off value instead of a configured scale
@@ -5860,6 +5937,13 @@ duplicate_declaration_blocks?: CssDuplicateBlock[]
5860
5937
  * value is sometimes the right call.
5861
5938
  */
5862
5939
  tailwind_arbitrary_values?: TailwindArbitraryValue[]
5940
+ /**
5941
+ * Located raw CSS declaration values that bypass token surfaces (`var()`,
5942
+ * `token()`, `theme()`) on scale-sensitive axes such as color, font-size,
5943
+ * line-height, radius, and shadow. Conservative candidates: a raw value can
5944
+ * be intentional, but introduced raw values are useful audit feedback.
5945
+ */
5946
+ raw_style_values?: RawStyleValue[]
5863
5947
  /**
5864
5948
  * Unused CSS at-rule entities: an `@property` registered but never read via
5865
5949
  * `var()` in any stylesheet, or an `@layer` declared but never populated by
@@ -5908,6 +5992,12 @@ unused_font_faces?: UnusedFontFace[]
5908
5992
  * downstream repo. Sorted by `(path, line, token)`.
5909
5993
  */
5910
5994
  unused_theme_tokens?: UnusedThemeToken[]
5995
+ /**
5996
+ * Tailwind v4 theme tokens whose comparable values are close to another
5997
+ * token in the same theme dictionary. These are opt-in `--css-deep`
5998
+ * candidates because they need whole-project token context.
5999
+ */
6000
+ near_duplicate_theme_tokens?: NearDuplicateThemeToken[]
5911
6001
  /**
5912
6002
  * A location-aware reverse index of Tailwind v4 `@theme` token consumers:
5913
6003
  * per token, where it is consumed (`var()` reads, `@apply` bodies, generated
@@ -6227,6 +6317,22 @@ tailwind_arbitrary_values: number
6227
6317
  * Total Tailwind arbitrary-value occurrences across markup.
6228
6318
  */
6229
6319
  tailwind_arbitrary_value_uses: number
6320
+ /**
6321
+ * Preprocessor stylesheets (`.scss`, `.sass`, `.less`) seen by the styling
6322
+ * scan. These are parsed textually for local candidates, not compiled.
6323
+ */
6324
+ preprocessor_stylesheets: number
6325
+ /**
6326
+ * True when project-wide class reachability was skipped because
6327
+ * preprocessor stylesheets outnumber plain CSS, making generated classes
6328
+ * invisible without a Sass/Less compiler.
6329
+ */
6330
+ preprocessor_reachability_abstained: boolean
6331
+ /**
6332
+ * Located raw CSS declaration values that bypass token surfaces on
6333
+ * scale-sensitive axes. Located in `raw_style_values`.
6334
+ */
6335
+ raw_style_values: number
6230
6336
  /**
6231
6337
  * `@property` registrations never referenced via `var()` in any stylesheet
6232
6338
  * (located in `unused_at_rules`). Cleanup candidates.
@@ -6262,6 +6368,12 @@ unused_font_faces: number
6262
6368
  * partial-scope run gated the scan out.
6263
6369
  */
6264
6370
  unused_theme_tokens: number
6371
+ /**
6372
+ * Tailwind v4 theme tokens whose comparable values are close to another
6373
+ * token in the same theme dictionary. Located in
6374
+ * `near_duplicate_theme_tokens`.
6375
+ */
6376
+ near_duplicate_theme_tokens: number
6265
6377
  /**
6266
6378
  * Number of distinct `font-size` units (`px` / `rem` / `em` / `%`) authored
6267
6379
  * across the codebase. Mixing units is a type-scale consistency smell,
@@ -6411,6 +6523,85 @@ path: string
6411
6523
  */
6412
6524
  line: number
6413
6525
  }
6526
+ /**
6527
+ * A duplicated CVA / shadcn variant class block.
6528
+ */
6529
+ export interface CvaDuplicateVariantBlock {
6530
+ /**
6531
+ * Normalized class block shared by several variant values.
6532
+ */
6533
+ value: string
6534
+ /**
6535
+ * Number of variant values with this class block.
6536
+ */
6537
+ occurrence_count: number
6538
+ /**
6539
+ * First locations of the duplicate values, sorted by path and line.
6540
+ */
6541
+ occurrences: CssBlockOccurrence[]
6542
+ /**
6543
+ * Read-only guidance step(s), so consumers can iterate `actions`
6544
+ * uniformly across every candidate type.
6545
+ */
6546
+ actions: CssCandidateAction[]
6547
+ }
6548
+ /**
6549
+ * A CVA / shadcn variant class value that can reuse an existing styling token.
6550
+ */
6551
+ export interface CvaVariantTokenDrift {
6552
+ /**
6553
+ * Tailwind arbitrary-value utility inside the variant class string.
6554
+ */
6555
+ class_token: string
6556
+ /**
6557
+ * Normalized value inside the arbitrary utility.
6558
+ */
6559
+ value: string
6560
+ /**
6561
+ * Full normalized variant class block containing the token.
6562
+ */
6563
+ variant_classes: string
6564
+ /**
6565
+ * Project-root-relative, forward-slash path to the variant definition.
6566
+ */
6567
+ path: string
6568
+ /**
6569
+ * 1-based line of the variant class string.
6570
+ */
6571
+ line: number
6572
+ nearest_token: NearestStylingToken
6573
+ /**
6574
+ * Read-only guidance step(s), so consumers can iterate `actions`
6575
+ * uniformly across every candidate type.
6576
+ */
6577
+ actions: CssCandidateAction[]
6578
+ }
6579
+ /**
6580
+ * A styling token candidate that can replace or explain a finding.
6581
+ */
6582
+ export interface NearestStylingToken {
6583
+ /**
6584
+ * Token name, e.g. `--color-brand`.
6585
+ */
6586
+ name: string
6587
+ /**
6588
+ * Normalized token value.
6589
+ */
6590
+ value: string
6591
+ /**
6592
+ * Project-root-relative, forward-slash definition path.
6593
+ */
6594
+ path: string
6595
+ /**
6596
+ * 1-based definition line.
6597
+ */
6598
+ line: number
6599
+ /**
6600
+ * Distance from the finding value. Lower is closer; units depend on the
6601
+ * comparable token namespace.
6602
+ */
6603
+ distance: number
6604
+ }
6414
6605
  /**
6415
6606
  * A distinct Tailwind arbitrary-value utility token used in markup, with its
6416
6607
  * total use count and first location (a design-token-bypass candidate).
@@ -6440,6 +6631,39 @@ line: number
6440
6631
  */
6441
6632
  actions: CssCandidateAction[]
6442
6633
  }
6634
+ /**
6635
+ * A located raw CSS declaration value on a scale-sensitive styling axis.
6636
+ */
6637
+ export interface RawStyleValue {
6638
+ /**
6639
+ * Value axis, e.g. `color`, `font-size`, `line-height`, `radius`, or `shadow`.
6640
+ */
6641
+ axis: string
6642
+ /**
6643
+ * CSS property where the raw value appears.
6644
+ */
6645
+ property: string
6646
+ /**
6647
+ * Rendered declaration value.
6648
+ */
6649
+ value: string
6650
+ /**
6651
+ * Project-root-relative, forward-slash path to the stylesheet.
6652
+ */
6653
+ path: string
6654
+ /**
6655
+ * 1-based line of the containing style rule.
6656
+ */
6657
+ line: number
6658
+ /**
6659
+ * Concrete token with the same or nearest comparable value, when resolved.
6660
+ */
6661
+ nearest_token?: (NearestStylingToken | null)
6662
+ /**
6663
+ * Read-only guidance step(s). Never auto-fixable.
6664
+ */
6665
+ actions: CssCandidateAction[]
6666
+ }
6443
6667
  /**
6444
6668
  * An unused CSS at-rule entity (an `@property` registration with no `var()`
6445
6669
  * reference, or an `@layer` declaration never populated), located by its first
@@ -6569,6 +6793,34 @@ line: number
6569
6793
  */
6570
6794
  actions: CssCandidateAction[]
6571
6795
  }
6796
+ /**
6797
+ * A Tailwind v4 `@theme` token that appears to duplicate an existing token by
6798
+ * value. Emitted conservatively for comparable token namespaces, with the
6799
+ * nearest existing token named so an agent has a concrete reuse target.
6800
+ */
6801
+ export interface NearDuplicateThemeToken {
6802
+ /**
6803
+ * The full custom property as authored, including the `--` prefix.
6804
+ */
6805
+ token: string
6806
+ /**
6807
+ * The normalized authored token value.
6808
+ */
6809
+ value: string
6810
+ /**
6811
+ * Project-root-relative, forward-slash path to the token definition.
6812
+ */
6813
+ path: string
6814
+ /**
6815
+ * 1-based line of the token definition inside the `@theme` block.
6816
+ */
6817
+ line: number
6818
+ nearest_token: NearestStylingToken
6819
+ /**
6820
+ * Read-only guidance step(s) before replacing the token reference.
6821
+ */
6822
+ actions: CssCandidateAction[]
6823
+ }
6572
6824
  /**
6573
6825
  * A location-aware reverse index of where one design token is consumed, so an
6574
6826
  * agent editing the token can see its blast radius before changing or removing
@@ -6584,12 +6836,13 @@ actions: CssCandidateAction[]
6584
6836
  * `apply`), built from the same gated candidate set as `unused_theme_tokens`
6585
6837
  * (v4 + non-plugin + non-published + whole-scope), so a `consumer_count: 0`
6586
6838
  * corroborates the `unused_theme_tokens` "nothing consumes this" finding.
6587
- * - CSS-in-JS tokens (kind `js-member`) from StyleX `defineVars` /
6588
- * vanilla-extract `createTheme` family definitions, consumed via cross-module
6589
- * member access. NOTE: CSS-in-JS has NO corroborating dead-token finding (there
6590
- * is no `unused_theme_tokens` analogue), so a CSS-in-JS `consumer_count: 0` is a
6591
- * weaker signal than the Tailwind case (and the cross-file scan is relative-import
6592
- * only, so alias / bare-package imports are not counted).
6839
+ * - CSS-in-JS tokens (kind `js-member` / `js-call`) from StyleX `defineVars`,
6840
+ * vanilla-extract `createTheme` family definitions, and PandaCSS `defineTokens`,
6841
+ * consumed via cross-module member access or PandaCSS `token('...')` calls. NOTE:
6842
+ * CSS-in-JS has NO corroborating dead-token finding (there is no
6843
+ * `unused_theme_tokens` analogue), so a CSS-in-JS `consumer_count: 0` is a weaker
6844
+ * signal than the Tailwind case (and the cross-file scan is relative-import or
6845
+ * generated-token-helper only, so alias / bare-package imports are not counted).
6593
6846
  *
6594
6847
  * This is DESCRIPTIVE context (a blast-radius lookup), not a finding, so it
6595
6848
  * deliberately carries no `actions` array (unlike the cleanup-candidate types in
@@ -6762,6 +7015,66 @@ token_erosion: number
6762
7015
  */
6763
7016
  structural: number
6764
7017
  }
7018
+ /**
7019
+ * One advisory STYLING FINDING: the graduation of a descriptive css candidate
7020
+ * into a first-class, severity-aware, suppressible finding surfaced in
7021
+ * `fallow audit`. The styling domain's OWN finding type (not borrowed into the
7022
+ * dead-code `AnalysisResults`, and not glued in the CLI). `code` is the kebab
7023
+ * IssueKind code (e.g. `css-token-drift`), so severity / inline suppression /
7024
+ * SARIF / MCP all resolve via the shared `issue_meta` contract through
7025
+ * `IssueKind::parse(code)`. One `Vec<StylingFinding>` carries every styling
7026
+ * family; the `code` discriminates.
7027
+ */
7028
+ export interface StylingFinding {
7029
+ /**
7030
+ * The kebab IssueKind code, e.g. `css-token-drift`.
7031
+ */
7032
+ code: string
7033
+ /**
7034
+ * The specific sub-kind within the family, e.g. `tailwind-arbitrary-value`.
7035
+ */
7036
+ sub_kind: string
7037
+ /**
7038
+ * Workspace-relative path of the finding.
7039
+ */
7040
+ path: string
7041
+ /**
7042
+ * 1-based line of the finding.
7043
+ */
7044
+ line: number
7045
+ /**
7046
+ * The offending literal value, e.g. `w-[13px]`.
7047
+ */
7048
+ value: string
7049
+ effective_severity: StylingFindingSeverity
7050
+ /**
7051
+ * Optional static lower-bound blast radius. For a dead design token this is
7052
+ * `0`; for other styling findings it is omitted.
7053
+ */
7054
+ blast_radius?: (number | null)
7055
+ /**
7056
+ * Confidence hint for agents and review UIs. Structural findings are high,
7057
+ * reachability findings are low because dynamic consumers may exist.
7058
+ */
7059
+ confidence?: (StylingFindingConfidence | null)
7060
+ /**
7061
+ * Suggested handling posture for agents. This is advisory data, fallow
7062
+ * still never applies styling changes automatically.
7063
+ */
7064
+ agent_disposition?: (StylingAgentDisposition | null)
7065
+ /**
7066
+ * Concrete reuse target for token-drift findings, when one can be resolved.
7067
+ */
7068
+ nearest_token?: (NearestStylingToken | null)
7069
+ /**
7070
+ * One concise machine-readable edit hint for agent consumers.
7071
+ */
7072
+ fix_hint?: (string | null)
7073
+ /**
7074
+ * Suggested next steps (verify / suppress; never an auto-fix).
7075
+ */
7076
+ actions: CssCandidateAction[]
7077
+ }
6765
7078
  /**
6766
7079
  * Envelope emitted by `fallow explain <issue-type> --format json`.
6767
7080
  *
@@ -7197,6 +7510,15 @@ css_analytics?: (CssAnalyticsReport | null)
7197
7510
  * code score is never affected by this field.
7198
7511
  */
7199
7512
  styling_health?: (StylingHealth | null)
7513
+ /**
7514
+ * Advisory STYLING FINDINGS: the graduation of the descriptive css
7515
+ * candidates into first-class, severity-aware, suppressible findings
7516
+ * surfaced in `fallow audit`. Verdict-neutral by default (the rule defaults
7517
+ * to `warn`); the styling domain's OWN findings collection, not the dead-code
7518
+ * `AnalysisResults`. Present only with `--css`; empty is skipped so a plain
7519
+ * run is byte-unchanged.
7520
+ */
7521
+ styling_findings?: StylingFinding[]
7200
7522
  grouped_by?: (GroupByMode | null)
7201
7523
  groups?: (HealthGroup[] | null)
7202
7524
  _meta?: (Meta | null)
@@ -7582,6 +7904,13 @@ type_only_dependencies: TypeOnlyDependencyFinding[]
7582
7904
  * devDependencies). Wrapped in [`TestOnlyDependencyFinding`].
7583
7905
  */
7584
7906
  test_only_dependencies?: TestOnlyDependencyFinding[]
7907
+ /**
7908
+ * devDependencies imported by production (non-test, non-config) source code
7909
+ * via a runtime/value import; they should be promoted to dependencies.
7910
+ * The promote-side mirror of [`TestOnlyDependencyFinding`]. Wrapped in
7911
+ * [`DevDependencyInProductionFinding`].
7912
+ */
7913
+ dev_dependencies_in_production?: DevDependencyInProductionFinding[]
7585
7914
  /**
7586
7915
  * Circular dependency chains detected in the module graph. Wrapped in
7587
7916
  * [`CircularDependencyFinding`] so each entry carries a typed `actions`
@@ -9641,6 +9970,16 @@ export type BoundaryViolation = BoundaryViolationFinding;
9641
9970
  */
9642
9971
  export type CircularDependency = CircularDependencyFinding;
9643
9972
 
9973
+ /**
9974
+ * Backwards-compat alias for the pre-#384 bare `DevDependencyInProduction` name.
9975
+ * The wire shape is byte-identical: `DevDependencyInProductionFinding` flattens the bare
9976
+ * finding's fields via `#[serde(flatten)]` and adds `actions[]` plus
9977
+ * the optional audit-mode `introduced` flag. Consumers that imported
9978
+ * `DevDependencyInProduction` from `fallow/types` pre-migration continue to work via
9979
+ * this alias; new code should prefer `DevDependencyInProductionFinding`.
9980
+ */
9981
+ export type DevDependencyInProduction = DevDependencyInProductionFinding;
9982
+
9644
9983
  /**
9645
9984
  * Backwards-compat alias for the pre-#384 bare `DuplicateExport` name.
9646
9985
  * The wire shape is byte-identical: `DuplicateExportFinding` flattens the bare