@usefragments/core 1.5.0 → 1.5.2

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.
Files changed (65) hide show
  1. package/dist/{chunk-HXGE3O2F.js → chunk-BAHCOAVG.js} +133 -7
  2. package/dist/chunk-BAHCOAVG.js.map +1 -0
  3. package/dist/{chunk-57QDBEHQ.js → chunk-ZHS52OT4.js} +3 -9
  4. package/dist/chunk-ZHS52OT4.js.map +1 -0
  5. package/dist/codes/index.d.ts +2 -2
  6. package/dist/codes/index.js +2 -2
  7. package/dist/compiled-types/index.d.ts +1 -1
  8. package/dist/generate/index.d.ts +1 -1
  9. package/dist/{governance-BLsyk56o.d.ts → governance-pKrfh517.d.ts} +264 -4
  10. package/dist/{index-h_yWj15D.d.ts → index-DbkPE46t.d.ts} +40 -0
  11. package/dist/index.d.ts +472 -28
  12. package/dist/index.js +561 -39
  13. package/dist/index.js.map +1 -1
  14. package/dist/react-types.d.ts +1 -1
  15. package/dist/schemas/index.d.ts +1 -1
  16. package/dist/schemas/index.js +1 -1
  17. package/dist/test-utils.d.ts +1 -1
  18. package/package.json +1 -1
  19. package/src/agent-format.test.ts +1 -0
  20. package/src/canonical-bridge.ts +46 -0
  21. package/src/canonical-direction.ts +118 -0
  22. package/src/codes/__tests__/codes.test.ts +1 -1
  23. package/src/codes/codes.ts +29 -0
  24. package/src/config.ts +20 -0
  25. package/src/contract/preimage.test.ts +40 -0
  26. package/src/contract/preimage.ts +20 -0
  27. package/src/effective-governance-inputs.test.ts +52 -0
  28. package/src/effective-governance-inputs.ts +106 -0
  29. package/src/facts/builders.ts +25 -1
  30. package/src/facts/compile.ts +20 -2
  31. package/src/facts/fact-index.ts +12 -1
  32. package/src/facts/facts.test.ts +14 -18
  33. package/src/facts/types.ts +25 -6
  34. package/src/governance-integrity.test.ts +127 -0
  35. package/src/governance-integrity.ts +326 -4
  36. package/src/governance.test.ts +87 -1
  37. package/src/governance.ts +121 -0
  38. package/src/index.ts +34 -5
  39. package/src/rules/__tests__/fix-emission-invariant.test.ts +35 -4
  40. package/src/rules/components-prefer-library.test.ts +103 -0
  41. package/src/rules/components-prefer-library.ts +30 -4
  42. package/src/rules/fix-availability.ts +1 -0
  43. package/src/rules/index.ts +7 -0
  44. package/src/rules/jsx-preferred-import-path.ts +45 -9
  45. package/src/rules/rules.test.ts +202 -6
  46. package/src/rules/spacing-resolution.ts +2 -2
  47. package/src/rules/styles-no-raw-color.test.ts +6 -1
  48. package/src/rules/styles-no-raw-color.ts +3 -2
  49. package/src/rules/styles-no-raw-dimensions.ts +5 -7
  50. package/src/rules/styles-no-raw-spacing.test.ts +48 -0
  51. package/src/rules/styles-no-raw-spacing.ts +10 -7
  52. package/src/rules/styles-no-raw-typography.ts +7 -4
  53. package/src/rules/taxonomy.test.ts +3 -0
  54. package/src/rules/tiers.ts +2 -0
  55. package/src/rules/token-candidates.ts +36 -0
  56. package/src/rules/tokens-require-dual-fallback.ts +2 -1
  57. package/src/rules/tokens-upstream-drift.test.ts +111 -0
  58. package/src/rules/tokens-upstream-drift.ts +57 -0
  59. package/src/rules/utils.ts +22 -14
  60. package/src/schema.ts +13 -0
  61. package/src/schemas/index.ts +5 -8
  62. package/src/token-types.ts +71 -1
  63. package/src/types.ts +27 -3
  64. package/dist/chunk-57QDBEHQ.js.map +0 -1
  65. package/dist/chunk-HXGE3O2F.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ FactIndex,
4
+ makeStyleDeclarationFact,
5
+ makeStyleRawColorForbiddenFact,
6
+ makeTokenDefinitionFact,
7
+ } from "../facts/index.js";
8
+ import { ruleStylesNoRawColor } from "./styles-no-raw-color.js";
9
+ import { ruleTokensUpstreamDrift } from "./tokens-upstream-drift.js";
10
+
11
+ function token(input: {
12
+ name: string;
13
+ value: string;
14
+ role: "local" | "upstream";
15
+ file: string;
16
+ upstreamName?: string;
17
+ }) {
18
+ return makeTokenDefinitionFact({
19
+ name: input.name,
20
+ value: input.value,
21
+ category: "color",
22
+ role: input.role,
23
+ authority: input.role === "local" ? "authored" : "declared-package",
24
+ sourceIdentity: input.file,
25
+ upstreamName: input.upstreamName,
26
+ location: { file: input.file, line: 1, column: 1 },
27
+ });
28
+ }
29
+
30
+ describe("tokens/upstream-drift", () => {
31
+ it("retains same-name authorities and emits one stable mismatch", () => {
32
+ const ix = new FactIndex();
33
+ const local = token({ name: "--brand", value: "#111111", role: "local", file: "tokens.css" });
34
+ const upstream = token({
35
+ name: "--brand",
36
+ value: "#222222",
37
+ role: "upstream",
38
+ file: "@fixture/ui/fragments.json",
39
+ });
40
+ ix.addMany([local, upstream]);
41
+
42
+ expect(ix.tokens.list()).toHaveLength(2);
43
+ expect(ruleTokensUpstreamDrift(ix)).toEqual([
44
+ expect.objectContaining({
45
+ code: "FUI2017",
46
+ ruleId: "tokens/upstream-drift",
47
+ location: expect.objectContaining({ file: "tokens.css" }),
48
+ }),
49
+ ]);
50
+ });
51
+
52
+ it("accepts matching values and compares differing names only through an authored alias", () => {
53
+ const ix = new FactIndex();
54
+ ix.addMany([
55
+ token({
56
+ name: "--local-brand",
57
+ value: "#222222",
58
+ role: "local",
59
+ file: "tokens.css",
60
+ upstreamName: "--upstream-brand",
61
+ }),
62
+ token({
63
+ name: "--upstream-brand",
64
+ value: "#222222",
65
+ role: "upstream",
66
+ file: "@fixture/ui/fragments.json",
67
+ }),
68
+ ]);
69
+
70
+ expect(ruleTokensUpstreamDrift(ix)).toEqual([]);
71
+ });
72
+
73
+ it("does not index upstream tokens as local raw-value replacement candidates", () => {
74
+ const ix = new FactIndex();
75
+ ix.add(
76
+ token({
77
+ name: "--upstream-brand",
78
+ value: "#222222",
79
+ role: "upstream",
80
+ file: "@fixture/ui/fragments.json",
81
+ })
82
+ );
83
+ expect(ix.tokens.definitionForSymbol("--upstream-brand")).toBeUndefined();
84
+ });
85
+
86
+ it("does not recommend a known-drift local token for an upstream-correct raw value", () => {
87
+ const ix = new FactIndex();
88
+ ix.addMany([
89
+ makeStyleRawColorForbiddenFact({ except: [], prefer: "token", severity: "error" }),
90
+ makeStyleDeclarationFact({
91
+ file: "Card.css",
92
+ selector: ".card",
93
+ declarationPath: "0",
94
+ property: "color",
95
+ value: "#222222",
96
+ location: { file: "Card.css", line: 1, column: 1 },
97
+ }),
98
+ token({ name: "--brand", value: "#111111", role: "local", file: "tokens.css" }),
99
+ token({
100
+ name: "--brand",
101
+ value: "#222222",
102
+ role: "upstream",
103
+ file: "@fixture/ui/fragments.json",
104
+ }),
105
+ ]);
106
+
107
+ const [finding] = ruleStylesNoRawColor(ix);
108
+ expect(finding.attributes?.suggestedToken).toBeUndefined();
109
+ expect(finding.fix).toBeUndefined();
110
+ });
111
+ });
@@ -0,0 +1,57 @@
1
+ import type { FactIndex, TokenDefinitionFact } from "../facts/index.js";
2
+ import { makeFinding } from "./finding.js";
3
+ import { normalizedTokenValue } from "./token-candidates.js";
4
+ import type { Finding } from "./types.js";
5
+
6
+ export const RULE_ID = "tokens/upstream-drift";
7
+ export const RULE_VERSION = "1";
8
+
9
+ /** Compare only authored same-name or explicit-alias local/upstream pairs. */
10
+ export function ruleTokensUpstreamDrift(ix: FactIndex): Finding[] {
11
+ const local = ix.tokens.list().filter((token) => token.role !== "upstream");
12
+ const upstream = ix.tokens.list().filter((token) => token.role === "upstream");
13
+ const upstreamByName = new Map<string, TokenDefinitionFact[]>();
14
+ for (const token of upstream) {
15
+ const matches = upstreamByName.get(token.name) ?? [];
16
+ matches.push(token);
17
+ upstreamByName.set(token.name, matches);
18
+ }
19
+
20
+ const findings: Finding[] = [];
21
+ for (const token of local) {
22
+ const upstreamName = token.upstreamName ?? token.name;
23
+ const matches = (upstreamByName.get(upstreamName) ?? []).sort((a, b) =>
24
+ (a.sourceIdentity ?? "").localeCompare(b.sourceIdentity ?? "")
25
+ );
26
+ if (matches.length !== 1) continue;
27
+ const expected = matches[0];
28
+ if (normalizedTokenValue(token) === normalizedTokenValue(expected)) continue;
29
+ const location = token.location ?? {
30
+ file: token.sourceIdentity ?? "tokens",
31
+ line: 1,
32
+ column: 1,
33
+ };
34
+ findings.push(
35
+ makeFinding({
36
+ ruleId: RULE_ID,
37
+ ruleVersion: RULE_VERSION,
38
+ severity: "warn",
39
+ message: `Local token ${token.name} is ${token.value}, but upstream ${upstreamName} is ${expected.value}.`,
40
+ location,
41
+ evidence: ix.evidence([token.id, expected.id]),
42
+ fingerprintIdentity: {
43
+ local: token.name,
44
+ upstream: upstreamName,
45
+ localSource: token.sourceIdentity,
46
+ upstreamSource: expected.sourceIdentity,
47
+ },
48
+ attributes: {
49
+ local: { name: token.name, value: token.value, location: token.location },
50
+ upstream: { name: expected.name, value: expected.value, location: expected.location },
51
+ autoFix: false,
52
+ },
53
+ })
54
+ );
55
+ }
56
+ return findings;
57
+ }
@@ -622,29 +622,37 @@ export function isExemptColor(value: string, except: readonly string[]): boolean
622
622
  }
623
623
 
624
624
  /**
625
- * Render a token name as the reference an author would write: SCSS `$vars`
626
- * pass through, dotted/bare names become a `var(--…)` custom property. Shared by
627
- * the color and spacing rules so a "use the token" fix is expressed the same way
628
- * everywhere.
625
+ * Render a token using only its proven authored reference form. Non-applicable
626
+ * formats retain their source spelling for an advisory suggestion; they never
627
+ * get rewritten into an invented CSS custom property.
629
628
  */
630
- export function tokenReference(name: string): string {
631
- if (name.startsWith("$")) return name;
632
- const cssVarName = name.startsWith("--") ? name : `--${name.replace(/\./g, "-")}`;
633
- return `var(${cssVarName})`;
629
+ export function tokenReference(token: TokenDefinitionFact): string {
630
+ if (token.referenceFormat === "css-var") {
631
+ const cssVarName = [token.name, ...(token.sourceNames ?? [])].find((name) =>
632
+ name.startsWith("--")
633
+ );
634
+ return cssVarName ? `var(${cssVarName})` : token.name;
635
+ }
636
+ if (token.referenceFormat === "scss-var") {
637
+ return (
638
+ [token.name, ...(token.sourceNames ?? [])].find((name) => name.startsWith("$")) ??
639
+ (token.name.startsWith("--") ? `$${token.name.slice(2)}` : token.name)
640
+ );
641
+ }
642
+ return token.sourceNames?.[0] ?? token.name;
634
643
  }
635
644
 
636
645
  /**
637
646
  * Whether a token reference can be *applied* automatically (written verbatim
638
647
  * and still compile). A `css-var` / `scss-var` token resolves on its own; a
639
648
  * `scss-map` member (synthetic `$colors-primary` minted from a Sass map) or a
640
- * `dtcg` JSON token (no CSS custom property emitted by default) does not, so
641
- * those fixes are surfaced as suggestions rather than deterministic rewrites.
642
- * Tokens without a known format (legacy/hand-built facts) are treated as safe.
649
+ * `dtcg` JSON token (no CSS custom property emitted by default), or a JS member
650
+ * path does not, so those fixes are surfaced as suggestions rather than
651
+ * deterministic rewrites. Tokens without a known format fail closed: unknown
652
+ * provenance is not proof that a replacement compiles.
643
653
  */
644
654
  export function isApplicableTokenReference(
645
655
  referenceFormat: TokenDefinitionFact["referenceFormat"]
646
656
  ): boolean {
647
- return (
648
- referenceFormat === undefined || referenceFormat === "css-var" || referenceFormat === "scss-var"
649
- );
657
+ return referenceFormat === "css-var" || referenceFormat === "scss-var";
650
658
  }
package/src/schema.ts CHANGED
@@ -248,6 +248,19 @@ const tokenConfigSchema = z
248
248
  // vocabulary seeds the known-token set (#7c). A packages-only tokens block
249
249
  // is valid — see the superRefine below.
250
250
  packages: z.array(z.string().min(1)).optional(),
251
+ aliases: z.record(z.string().min(1)).optional(),
252
+ upstream: z
253
+ .array(
254
+ z.object({
255
+ packageName: z.string().min(1),
256
+ version: z.string().min(1).optional(),
257
+ digest: z
258
+ .string()
259
+ .regex(/^[a-f0-9]{64}$/u)
260
+ .optional(),
261
+ })
262
+ )
263
+ .optional(),
251
264
  exclude: z.array(repoRelativePathSchema).optional(),
252
265
  themeSelectors: z.record(z.string()).optional(),
253
266
  enabled: z.boolean().optional(),
@@ -254,18 +254,15 @@ const agentRunProvenanceSchema = z.object({
254
254
  fcid: z.string().min(1),
255
255
  baselineId: z.string().min(1).optional(),
256
256
  scope: z.object({
257
- method: z.enum([
258
- "three-dot",
259
- "tree-diff",
260
- "status",
261
- "fallback-full",
262
- "explicit",
263
- "full",
264
- ]),
257
+ method: z.enum(["three-dot", "tree-diff", "status", "fallback-full", "explicit", "full"]),
265
258
  gitOk: z.boolean(),
266
259
  }),
267
260
  engineVersion: z.string().min(1),
268
261
  scopeHash: z.string().regex(/^[a-f0-9]{64}$/),
262
+ inputsHash: z
263
+ .string()
264
+ .regex(/^[a-f0-9]{64}$/)
265
+ .optional(),
269
266
  inputFilesHash: z.string().regex(/^[a-f0-9]{64}$/),
270
267
  });
271
268
 
@@ -25,6 +25,63 @@ export type TokenCategory =
25
25
  | "z-index"
26
26
  | "other";
27
27
 
28
+ /** Stable, renderer-independent token catalog contract. */
29
+ export interface TokenCatalog {
30
+ schemaVersion: "token-catalog:v1";
31
+ configuredSources: string[];
32
+ parsedSources: string[];
33
+ definitions: TokenCatalogDefinition[];
34
+ diagnostics: TokenCatalogDiagnostic[];
35
+ references: TokenCatalogReference[];
36
+ sourceStates?: TokenCatalogSourceState[];
37
+ }
38
+
39
+ export interface TokenCatalogSourceState {
40
+ source: string;
41
+ role: "local" | "upstream";
42
+ state:
43
+ | "verified"
44
+ | "version_mismatch"
45
+ | "digest_mismatch"
46
+ | "source_unavailable"
47
+ | "cache_unverified";
48
+ installedVersion?: string;
49
+ contentDigest?: string;
50
+ expectedVersion?: string;
51
+ expectedDigest?: string;
52
+ }
53
+
54
+ export interface TokenCatalogLocation {
55
+ file: string;
56
+ line: number;
57
+ column: number;
58
+ }
59
+
60
+ export interface TokenCatalogDefinition {
61
+ /** Authored member path, for example `spacing.smaller` or `theme.palette.primary.main`. */
62
+ name: string;
63
+ value: string;
64
+ category: TokenCategory;
65
+ location: TokenCatalogLocation;
66
+ exportName?: string;
67
+ referenceSyntax: "css-var" | "scss-var" | "scss-map" | "dtcg" | "js-member";
68
+ authority: "authored" | "declared-package";
69
+ role: "local" | "upstream";
70
+ }
71
+
72
+ export interface TokenCatalogDiagnostic {
73
+ code: "tokens/unsupported-static-value" | "tokens/source-unavailable";
74
+ severity: "warning";
75
+ message: string;
76
+ location: TokenCatalogLocation;
77
+ }
78
+
79
+ export interface TokenCatalogReference {
80
+ name: string;
81
+ location: TokenCatalogLocation;
82
+ syntax: "css-var" | "scss-var" | "scss-map" | "dtcg" | "js-member";
83
+ }
84
+
28
85
  /**
29
86
  * A single design token (CSS custom property)
30
87
  */
@@ -60,7 +117,7 @@ export interface DesignToken {
60
117
  sourceFile: string;
61
118
 
62
119
  /** Authored reference form, when the parser can prove it from the source. */
63
- referenceFormat?: "css-var" | "scss-var" | "scss-map" | "dtcg";
120
+ referenceFormat?: "css-var" | "scss-var" | "scss-map" | "dtcg" | "js-member";
64
121
 
65
122
  /** Authored spellings preserved before normalization (for example `$x` and `--x`). */
66
123
  sourceNames?: string[];
@@ -205,6 +262,16 @@ export interface TokenConfig {
205
262
  */
206
263
  packages?: string[];
207
264
 
265
+ /** Explicit local-name -> upstream-name mappings for cross-authority drift checks. */
266
+ aliases?: Record<string, string>;
267
+
268
+ /** Deterministic pins for upstream token manifests; local scans never fetch them. */
269
+ upstream?: Array<{
270
+ packageName: string;
271
+ version?: string;
272
+ digest?: string;
273
+ }>;
274
+
208
275
  /**
209
276
  * Map CSS selectors to theme names
210
277
  * @example { ":root": "default", "[data-theme='dark']": "dark" }
@@ -230,6 +297,9 @@ export interface TokenParseResult {
230
297
 
231
298
  /** Parse time in ms */
232
299
  parseTimeMs: number;
300
+
301
+ /** The shared catalog used to produce `tokens`. Additive for compatibility. */
302
+ catalog?: TokenCatalog;
233
303
  }
234
304
 
235
305
  /**
package/src/types.ts CHANGED
@@ -567,7 +567,10 @@ export interface TokenSourceConfig {
567
567
  /** Repo-root-relative token file or glob. */
568
568
  path: RepoRelativePath;
569
569
 
570
- /** Explicit token format, or "auto" to infer from extension/content. */
570
+ /**
571
+ * Explicit token format, or "auto" to infer from extension/content. Use
572
+ * "auto" for statically analyzable TypeScript and JavaScript token modules.
573
+ */
571
574
  format?: TokenSourceFormat;
572
575
  }
573
576
 
@@ -578,7 +581,10 @@ export interface TokenConfig {
578
581
  */
579
582
  include?: string[];
580
583
 
581
- /** Repo-root-relative token source files/globs for monorepos and Cloud setup. */
584
+ /**
585
+ * Repo-root-relative token source files/globs for monorepos and Cloud setup.
586
+ * Set each source to format "auto" for TypeScript or JavaScript token modules.
587
+ */
582
588
  sources?: TokenSourceConfig[];
583
589
 
584
590
  /**
@@ -592,6 +598,12 @@ export interface TokenConfig {
592
598
  */
593
599
  packages?: string[];
594
600
 
601
+ /** Explicit local-name -> upstream-name mappings for cross-authority drift checks. */
602
+ aliases?: Record<string, string>;
603
+
604
+ /** Deterministic pins for upstream token manifests; local scans never fetch them. */
605
+ upstream?: Array<{ packageName: string; version?: string; digest?: string }>;
606
+
595
607
  /**
596
608
  * Glob patterns to exclude
597
609
  * @example ["node_modules"]
@@ -607,7 +619,10 @@ export interface TokenConfig {
607
619
  /** Enable token comparison in style diffs (default: true) */
608
620
  enabled?: boolean;
609
621
 
610
- /** Token source format detection ('auto' detects from file extension) */
622
+ /**
623
+ * Token source format detection. "auto" infers supported formats from the
624
+ * file extension, including statically analyzable TypeScript/JavaScript modules.
625
+ */
611
626
  format?: TokenSourceFormat;
612
627
 
613
628
  /** Vendor namespace for Fragments extensions in DTCG files (default: 'com.usefragments') */
@@ -807,12 +822,21 @@ export interface FragmentsConfig {
807
822
 
808
823
  /** Local component-identity decisions used when Cloud does not own the key. */
809
824
  identity?: {
825
+ /** Authored sanctions, rejections, and dismissals keyed by portable component identity. */
810
826
  decisions?: Array<{
811
827
  /** Portable component key (`file#exportName`). */
812
828
  component: string;
829
+
830
+ /** The identity disposition recorded for this component. */
813
831
  kind: "sanction" | "reject" | "dismiss";
832
+
833
+ /** Optional canonical target (`moduleSpecifier#exportName`) for sanctions. */
814
834
  canonicalTarget?: string;
835
+
836
+ /** Human-readable rationale stored with the decision. */
815
837
  reason?: string;
838
+
839
+ /** Stable external identifier used to reconcile an existing decision. */
816
840
  decisionId?: string;
817
841
  }>;
818
842
  };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schemas/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport {\n legacySeverityLevelSchema,\n severityFromLevel,\n severityLevel,\n severityLevelSchema,\n severitySchema,\n} from \"../severity.js\";\nimport type { LegacySeverityLevel, Severity } from \"../severity.js\";\nimport type { EvidenceGrade } from \"../evidence.js\";\n\nconst evidenceGradeSchema: z.ZodType<EvidenceGrade> = z.enum([\n \"none\",\n \"runtime_advisory\",\n \"provenance_bound\",\n \"source_backed\",\n \"receipt_backed\",\n]);\n\nexport { legacySeverityLevelSchema, severityLevelSchema, severitySchema };\nexport type { LegacySeverityLevel, Severity, SeverityLevel } from \"../severity.js\";\n\nexport const factLocationSchema = z.object({\n file: z.string(),\n line: z.number().int().nonnegative(),\n column: z.number().int().nonnegative(),\n endLine: z.number().int().nonnegative().optional(),\n endColumn: z.number().int().nonnegative().optional(),\n});\nexport type FactLocation = z.infer<typeof factLocationSchema>;\n\nexport const findingReplacePropValueFixSchema = z.object({\n kind: z.literal(\"replacePropValue\"),\n title: z.string(),\n prop: z.string(),\n value: z.unknown(),\n deterministic: z.boolean().optional(),\n});\n\nexport const findingReplaceStyleValueFixSchema = z.object({\n kind: z.literal(\"replaceStyleValue\"),\n title: z.string(),\n property: z.string(),\n value: z.string(),\n deterministic: z.boolean().optional(),\n});\n\nexport const findingReplaceImportFixSchema = z.object({\n kind: z.literal(\"replaceImport\"),\n title: z.string(),\n from: z.string(),\n to: z.string(),\n deterministic: z.boolean().optional(),\n});\n\nexport const findingReplaceComponentFixSchema = z.object({\n kind: z.literal(\"replaceComponent\"),\n title: z.string(),\n from: z.string(),\n to: z.string(),\n deterministic: z.boolean().optional(),\n});\n\nexport const findingReplaceClassTokenFixSchema = z.object({\n kind: z.literal(\"replaceClassToken\"),\n title: z.string(),\n from: z.string(),\n to: z.string().nullable(),\n utility: z.string(),\n deterministic: z.boolean().optional(),\n});\n\nexport const findingFixSchema = z.discriminatedUnion(\"kind\", [\n findingReplacePropValueFixSchema,\n findingReplaceStyleValueFixSchema,\n findingReplaceImportFixSchema,\n findingReplaceComponentFixSchema,\n findingReplaceClassTokenFixSchema,\n]);\nexport type FindingFix = z.infer<typeof findingFixSchema>;\nexport type FindingReplacePropValueFix = z.infer<typeof findingReplacePropValueFixSchema>;\nexport type FindingReplaceStyleValueFix = z.infer<typeof findingReplaceStyleValueFixSchema>;\nexport type FindingReplaceImportFix = z.infer<typeof findingReplaceImportFixSchema>;\nexport type FindingReplaceComponentFix = z.infer<typeof findingReplaceComponentFixSchema>;\nexport type FindingReplaceClassTokenFix = z.infer<typeof findingReplaceClassTokenFixSchema>;\n\nexport interface FactEvidence {\n factId: string;\n fact: {\n kind: string;\n location?: FactLocation;\n };\n}\n\nexport const factEvidenceSchema: z.ZodType<FactEvidence> = z.object({\n factId: z.string(),\n fact: z\n .object({\n kind: z.string(),\n location: factLocationSchema.optional(),\n })\n .passthrough(),\n});\n\nexport const findingSchema = z.object({\n ruleId: z.string(),\n ruleVersion: z.string(),\n severity: severitySchema,\n level: severityLevelSchema,\n code: z\n .string()\n .regex(/^FUI\\d{4}$/)\n .optional(),\n helpUrl: z.string().url().optional(),\n message: z.string(),\n fingerprint: z.string(),\n location: factLocationSchema,\n evidence: z.array(factEvidenceSchema).min(1),\n evidenceGrade: evidenceGradeSchema.optional(),\n fix: findingFixSchema.optional(),\n attributes: z.record(z.unknown()).optional(),\n /**\n * Product area this finding's file resolved to (topology layer). Optional —\n * absent when the repo has no `topology` config. See `topology/resolve-area`.\n */\n area: z\n .object({\n areaId: z.string(),\n areaName: z.string(),\n criticality: z.enum([\"low\", \"medium\", \"high\", \"revenue\", \"regulated\"]),\n owners: z.array(z.string()),\n matchedGlob: z.string(),\n })\n .optional(),\n});\nexport type Finding = z.infer<typeof findingSchema>;\n\nexport const violationSchema = z.object({\n nodeId: z.string(),\n nodeType: z.string(),\n rule: z.string(),\n severity: severitySchema,\n level: severityLevelSchema.optional(),\n code: z\n .string()\n .regex(/^FUI\\d{4}$/)\n .optional(),\n helpUrl: z.string().url().optional(),\n message: z.string(),\n path: z.string().optional(),\n suggestion: z.string().optional(),\n prop: z.string().optional(),\n filePath: z.string().optional(),\n line: z.number().int().nonnegative().optional(),\n column: z.number().int().nonnegative().optional(),\n rawValue: z.string().optional(),\n extra: z.record(z.unknown()).optional(),\n});\nexport type Violation = z.infer<typeof violationSchema>;\n\nexport const fixSchema = z.object({\n nodeId: z.string(),\n prop: z.string().optional(),\n action: z.enum([\"remove\", \"replace\", \"add\"]),\n value: z.unknown().optional(),\n description: z.string(),\n});\nexport type Fix = z.infer<typeof fixSchema>;\n\nexport const validatorResultSchema = z.object({\n validator: z.string(),\n severity: severitySchema,\n passed: z.boolean(),\n violations: z.array(violationSchema),\n findings: z.array(findingSchema).optional(),\n suggestions: z.array(fixSchema).optional(),\n});\nexport type ValidatorResult = z.infer<typeof validatorResultSchema>;\n\nexport const governanceVerdictMetadataSchema = z.object({\n runner: z.string(),\n policyVersion: z.string().optional(),\n duration: z.number().nonnegative(),\n nodeCount: z.number().int().nonnegative(),\n componentTypes: z.array(z.string()),\n});\nexport type GovernanceVerdictMetadata = z.infer<typeof governanceVerdictMetadataSchema>;\n\nexport const governanceVerdictSchema = z.object({\n verdict: z.enum([\"pass\", \"warn\", \"fail\"]).optional(),\n passed: z.boolean(),\n score: z.number(),\n results: z.array(validatorResultSchema),\n metadata: governanceVerdictMetadataSchema,\n});\nexport type GovernanceVerdict = z.infer<typeof governanceVerdictSchema>;\n\nexport const suppressionDirectiveSchema = z.object({\n ruleId: z.string().optional(),\n reason: z.string().min(1),\n expiresAt: z.string().datetime().optional(),\n expiresOn: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/)\n .optional(),\n scope: z.enum([\"line\", \"block\", \"file\"]).default(\"line\"),\n code: z\n .string()\n .regex(/^FUI\\d{4}$/)\n .optional(),\n});\nexport type SuppressionDirective = z.infer<typeof suppressionDirectiveSchema>;\n\nexport const agentPlanSchema = z.object({\n tool: z.enum([\n \"design_system/list_primitives\",\n \"design_system/conform\",\n \"design_system/prove_compliant\",\n ]),\n args: z.record(z.unknown()),\n confidence: z.number().min(0).max(1),\n});\n\nexport const agentFindingSchema = z.object({\n code: z\n .string()\n .regex(/^FUI\\d{4}$/)\n .optional(),\n ruleId: z.string(),\n filePath: z.string(),\n line: z.number().int().nonnegative(),\n col: z.number().int().nonnegative(),\n severity: severitySchema,\n level: severityLevelSchema,\n message: z.string(),\n evidenceGrade: evidenceGradeSchema.optional(),\n evidence: z.array(factEvidenceSchema),\n plan: agentPlanSchema,\n});\n\nexport const AGENT_FORMAT_SCHEMA_VERSION = \"typestyle.agent.v2\" as const;\n\nexport const agentIntegritySchema = z.object({\n rulesLoaded: z.number().int().nonnegative(),\n status: z.enum([\"healthy\", \"degraded\", \"inert\"]),\n healthy: z.boolean(),\n inert: z.boolean(),\n reasons: z.array(z.string()),\n});\n\nconst agentRunProvenanceSchema = z.object({\n runId: z.string().regex(/^run_[a-f0-9]{12}$/),\n fcid: z.string().min(1),\n baselineId: z.string().min(1).optional(),\n scope: z.object({\n method: z.enum([\n \"three-dot\",\n \"tree-diff\",\n \"status\",\n \"fallback-full\",\n \"explicit\",\n \"full\",\n ]),\n gitOk: z.boolean(),\n }),\n engineVersion: z.string().min(1),\n scopeHash: z.string().regex(/^[a-f0-9]{64}$/),\n inputFilesHash: z.string().regex(/^[a-f0-9]{64}$/),\n});\n\nconst agentRunVerdictSchema = z.object({\n exitCode: z.union([z.literal(0), z.literal(1)]),\n reasons: z.array(z.string()),\n gatingFindingCount: z.number().int().nonnegative(),\n});\n\nconst agentFormatBaseSchema = z.object({\n schemaVersion: z.literal(AGENT_FORMAT_SCHEMA_VERSION),\n summary: z.string(),\n integrity: agentIntegritySchema,\n fix_first: z.array(agentFindingSchema),\n remaining: z.array(agentFindingSchema),\n suppression_template: z.object({\n directive: z.string(),\n requiredFields: z.array(z.string()),\n example: z.string(),\n }),\n budget: z.object({\n iteration: z.number().int().nonnegative(),\n maxIterations: z.number().int().positive(),\n scoreDelta: z.number(),\n }),\n findings: z.array(findingSchema).optional(),\n suppressions: z.array(suppressionDirectiveSchema).optional(),\n provenance: agentRunProvenanceSchema.optional(),\n verdict: agentRunVerdictSchema.optional(),\n});\n\nexport const agentFormatSchema = z.union([\n agentFormatBaseSchema.extend({\n passed: z.boolean(),\n score: z.number(),\n status: z.never().optional(),\n reasons: z.never().optional(),\n integrity: agentIntegritySchema.extend({\n rulesLoaded: z.number().int().positive(),\n }),\n }),\n agentFormatBaseSchema.extend({\n passed: z.literal(false),\n score: z.never().optional(),\n status: z.literal(\"indeterminate\"),\n reasons: z.tuple([z.literal(\"zero_rules_loaded\")]),\n integrity: agentIntegritySchema.extend({\n rulesLoaded: z.literal(0),\n }),\n }),\n // A finalized Run can explicitly allow inert governance. Preserve the\n // indeterminate integrity truth while making `passed` match that Run's sole\n // verdict; requiring Run pins prevents generic zero-rule envelopes from\n // accidentally becoming green.\n agentFormatBaseSchema.extend({\n passed: z.literal(true),\n score: z.never().optional(),\n status: z.literal(\"indeterminate\"),\n reasons: z.tuple([z.literal(\"zero_rules_loaded\")]),\n integrity: agentIntegritySchema.extend({\n rulesLoaded: z.literal(0),\n }),\n provenance: agentRunProvenanceSchema,\n verdict: agentRunVerdictSchema.extend({ exitCode: z.literal(0) }),\n }),\n]);\nexport type AgentFormat = z.infer<typeof agentFormatSchema>;\n\nexport const agentErrorEnvelopeSchema = z.object({\n schemaVersion: z.literal(AGENT_FORMAT_SCHEMA_VERSION),\n passed: z.literal(false),\n error: z.object({\n code: z.string().min(1),\n message: z.string().min(1),\n }),\n provenance: agentRunProvenanceSchema.optional(),\n verdict: agentRunVerdictSchema.optional(),\n cloudReport: z.enum([\"reported\", \"failed\", \"skipped\"]).optional(),\n notices: z.array(z.string()).optional(),\n});\nexport type AgentErrorEnvelope = z.infer<typeof agentErrorEnvelopeSchema>;\n\nexport const agentOutputSchema = z.union([agentFormatSchema, agentErrorEnvelopeSchema]);\nexport type AgentOutput = z.infer<typeof agentOutputSchema>;\n\nexport function normalizeSeverity(severity: Severity | LegacySeverityLevel): Severity {\n return severitySchema.safeParse(severity).success\n ? (severity as Severity)\n : severityFromLevel(legacySeverityLevelSchema.parse(severity));\n}\n\nexport function normalizeFinding(\n input: Omit<Finding, \"level\"> & { level?: Finding[\"level\"] }\n): Finding {\n return {\n ...input,\n evidenceGrade: input.evidenceGrade ?? \"source_backed\",\n level: input.level ?? severityLevel(input.severity),\n };\n}\n\nexport function normalizeViolation(\n input: Omit<Violation, \"level\"> & { level?: Violation[\"level\"] }\n): Violation {\n return {\n ...input,\n level: input.level ?? severityLevel(input.severity),\n };\n}\n"],"mappings":"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","names":[]}