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.
- package/README.md +8 -5
- package/capabilities.json +5987 -0
- package/issue-registry.json +3482 -0
- package/package.json +16 -12
- package/schema.json +122 -9
- package/skills/fallow/SKILL.md +33 -33
- package/skills/fallow/references/cli-reference.md +15 -10
- package/skills/fallow/references/gotchas.md +1 -1
- package/skills/fallow/references/patterns.md +4 -2
- package/types/output-contract.d.ts +363 -24
|
@@ -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
|
|
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-
|
|
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.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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:
|
|
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`
|
|
606
|
-
* imported StyleX/vanilla-extract token binding
|
|
607
|
-
*
|
|
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`),
|
|
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,
|
|
6589
|
-
*
|
|
6590
|
-
*
|
|
6591
|
-
*
|
|
6592
|
-
*
|
|
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
|