@fragments-sdk/cli 0.14.3 → 0.15.1

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 (181) hide show
  1. package/README.md +0 -3
  2. package/dist/{ai-client-I6MDWNYA.js → ai-client-LSLQGOMM.js} +1 -2
  3. package/dist/bin.js +4745 -3817
  4. package/dist/bin.js.map +1 -1
  5. package/dist/{chunk-TXFCEDOC.js → chunk-2WXKALIG.js} +2 -2
  6. package/dist/{chunk-I34BC3CU.js → chunk-32LIWN2P.js} +1006 -3
  7. package/dist/chunk-32LIWN2P.js.map +1 -0
  8. package/dist/chunk-5JF26E55.js +1255 -0
  9. package/dist/chunk-5JF26E55.js.map +1 -0
  10. package/dist/{chunk-APTQIBS5.js → chunk-6SQPP47U.js} +153 -1342
  11. package/dist/chunk-6SQPP47U.js.map +1 -0
  12. package/dist/chunk-7DZC4YEV.js +294 -0
  13. package/dist/chunk-7DZC4YEV.js.map +1 -0
  14. package/dist/{chunk-PJT5IZ37.js → chunk-BJE3425I.js} +19 -52
  15. package/dist/{chunk-PJT5IZ37.js.map → chunk-BJE3425I.js.map} +1 -1
  16. package/dist/{chunk-55KERLWL.js → chunk-HQ6A6DTV.js} +1587 -1073
  17. package/dist/chunk-HQ6A6DTV.js.map +1 -0
  18. package/dist/chunk-MHIBEEW4.js +511 -0
  19. package/dist/chunk-MHIBEEW4.js.map +1 -0
  20. package/dist/{chunk-5A6X2Y73.js → chunk-ONUP6Z4W.js} +25 -13
  21. package/dist/chunk-ONUP6Z4W.js.map +1 -0
  22. package/dist/chunk-QCN35LJU.js +630 -0
  23. package/dist/chunk-QCN35LJU.js.map +1 -0
  24. package/dist/chunk-T47OLCSF.js +36 -0
  25. package/dist/chunk-T47OLCSF.js.map +1 -0
  26. package/dist/codebase-scanner-MQHUZC2G.js +21 -0
  27. package/dist/converter-7XM3Y6NJ.js +33 -0
  28. package/dist/converter-7XM3Y6NJ.js.map +1 -0
  29. package/dist/core/index.js +43 -2
  30. package/dist/create-IH4R45GE.js +806 -0
  31. package/dist/create-IH4R45GE.js.map +1 -0
  32. package/dist/{generate-RYWIPDN2.js → generate-PVOLUAAC.js} +4 -6
  33. package/dist/{generate-RYWIPDN2.js.map → generate-PVOLUAAC.js.map} +1 -1
  34. package/dist/govern-scan-OYFZYOQW.js +413 -0
  35. package/dist/govern-scan-OYFZYOQW.js.map +1 -0
  36. package/dist/index.d.ts +4 -23
  37. package/dist/index.js +15 -14
  38. package/dist/index.js.map +1 -1
  39. package/dist/{init-WRUSW7R5.js → init-SSGUSP7Z.js} +131 -129
  40. package/dist/init-SSGUSP7Z.js.map +1 -0
  41. package/dist/{init-cloud-REQ3XLHO.js → init-cloud-3DNKPWFB.js} +30 -5
  42. package/dist/{init-cloud-REQ3XLHO.js.map → init-cloud-3DNKPWFB.js.map} +1 -1
  43. package/dist/mcp-bin.js +5 -37
  44. package/dist/mcp-bin.js.map +1 -1
  45. package/dist/node-37AUE74M.js +65 -0
  46. package/dist/push-contracts-WY32TFP6.js +84 -0
  47. package/dist/push-contracts-WY32TFP6.js.map +1 -0
  48. package/dist/scan-PKSYSTRR.js +15 -0
  49. package/dist/{scan-generate-TFZVL3BT.js → scan-generate-VY27PIOX.js} +340 -52
  50. package/dist/scan-generate-VY27PIOX.js.map +1 -0
  51. package/dist/scanner-4KZNOXAK.js +12 -0
  52. package/dist/{service-HKJ6B7P7.js → service-QJGWUIVL.js} +41 -30
  53. package/dist/{snapshot-C5DYIGIV.js → snapshot-WIJMEIFT.js} +2 -3
  54. package/dist/{snapshot-C5DYIGIV.js.map → snapshot-WIJMEIFT.js.map} +1 -1
  55. package/dist/{static-viewer-DUVC4UIM.js → static-viewer-7QIBQZRC.js} +3 -4
  56. package/dist/static-viewer-7QIBQZRC.js.map +1 -0
  57. package/dist/{test-JW7JIDFG.js → test-64Z5BKBA.js} +4 -7
  58. package/dist/{test-JW7JIDFG.js.map → test-64Z5BKBA.js.map} +1 -1
  59. package/dist/token-normalizer-TEPOVBPV.js +312 -0
  60. package/dist/token-normalizer-TEPOVBPV.js.map +1 -0
  61. package/dist/token-parser-32KOIOFN.js +22 -0
  62. package/dist/token-parser-32KOIOFN.js.map +1 -0
  63. package/dist/{tokens-KE73G5JC.js → tokens-NZWFQIAB.js} +10 -9
  64. package/dist/{tokens-KE73G5JC.js.map → tokens-NZWFQIAB.js.map} +1 -1
  65. package/dist/tokens-generate-5JQSJ27E.js +85 -0
  66. package/dist/tokens-generate-5JQSJ27E.js.map +1 -0
  67. package/dist/tokens-push-HY3KO36V.js +148 -0
  68. package/dist/tokens-push-HY3KO36V.js.map +1 -0
  69. package/package.json +8 -6
  70. package/src/bin.ts +300 -48
  71. package/src/commands/__fixtures__/shadcn-label-wrapper/package.json +7 -0
  72. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +42 -0
  73. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.tsx +11 -0
  74. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +20 -0
  75. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.tsx +14 -0
  76. package/src/commands/__fixtures__/shadcn-label-wrapper/tsconfig.app.json +23 -0
  77. package/src/commands/__tests__/build-freshness.test.ts +231 -0
  78. package/src/commands/__tests__/create.test.ts +71 -0
  79. package/src/commands/__tests__/drift-sync.test.ts +1 -1
  80. package/src/commands/__tests__/govern.test.ts +258 -0
  81. package/src/commands/__tests__/init.test.ts +113 -0
  82. package/src/commands/__tests__/scan-generate.test.ts +189 -70
  83. package/src/commands/__tests__/verify.test.ts +91 -0
  84. package/src/commands/build.ts +54 -1
  85. package/src/commands/context.ts +1 -1
  86. package/src/commands/create.ts +536 -0
  87. package/src/commands/discover.ts +151 -0
  88. package/src/commands/doctor.ts +3 -2
  89. package/src/commands/enhance.ts +3 -1
  90. package/src/commands/govern-scan.ts +565 -0
  91. package/src/commands/govern.ts +67 -4
  92. package/src/commands/init-cloud.ts +32 -4
  93. package/src/commands/init.ts +152 -28
  94. package/src/commands/inspect.ts +290 -0
  95. package/src/commands/migrate-contract.ts +85 -0
  96. package/src/commands/push-contracts.ts +112 -0
  97. package/src/commands/scan-generate.ts +439 -51
  98. package/src/commands/scan.ts +14 -0
  99. package/src/commands/setup.ts +27 -50
  100. package/src/commands/sync.ts +2 -2
  101. package/src/commands/tokens-generate.ts +113 -0
  102. package/src/commands/tokens-push.ts +199 -0
  103. package/src/commands/verify.ts +195 -1
  104. package/src/core/__fixtures__/shadcn-input/input.tsx +7 -0
  105. package/src/core/__fixtures__/shadcn-input/tsconfig.json +14 -0
  106. package/src/core/__fixtures__/shadcn-label/label.tsx +11 -0
  107. package/src/core/__fixtures__/shadcn-label/primitive.tsx +14 -0
  108. package/src/core/__fixtures__/shadcn-label/tsconfig.json +14 -0
  109. package/src/core/__fixtures__/shadcn-radix-label/label.tsx +11 -0
  110. package/src/core/__fixtures__/shadcn-radix-label/node_modules/radix-ui/index.d.ts +12 -0
  111. package/src/core/__fixtures__/shadcn-radix-label/tsconfig.json +14 -0
  112. package/src/core/__tests__/contract-parity.test.ts +316 -0
  113. package/src/core/__tests__/token-resolver.test.ts +1 -1
  114. package/src/core/component-extractor.test.ts +40 -1
  115. package/src/core/config.ts +2 -1
  116. package/src/core/discovery.ts +13 -2
  117. package/src/core/drift-verifier.ts +123 -0
  118. package/src/core/extractor-adapter.ts +80 -0
  119. package/src/index.ts +3 -3
  120. package/src/mcp/__tests__/projectFields.test.ts +1 -1
  121. package/src/mcp/utils.ts +1 -50
  122. package/src/migrate/converter.ts +3 -3
  123. package/src/migrate/fragment-to-contract.ts +253 -0
  124. package/src/migrate/report.ts +1 -1
  125. package/src/scripts/token-benchmark.ts +121 -0
  126. package/src/service/__tests__/props-extractor.test.ts +94 -0
  127. package/src/service/__tests__/token-normalizer.test.ts +690 -0
  128. package/src/service/ast-utils.ts +4 -23
  129. package/src/service/babel-config.ts +23 -0
  130. package/src/service/enhance/converter.ts +61 -0
  131. package/src/service/enhance/props-extractor.ts +25 -8
  132. package/src/service/enhance/scanner.ts +5 -24
  133. package/src/service/index.ts +8 -0
  134. package/src/service/snippet-validation.ts +9 -3
  135. package/src/service/tailwind-v4-parser.ts +314 -0
  136. package/src/service/token-normalizer.ts +510 -0
  137. package/src/service/token-parser.ts +56 -0
  138. package/src/setup.ts +10 -39
  139. package/src/shared/index.ts +1 -0
  140. package/src/shared/project-fields.ts +46 -0
  141. package/src/theme/__tests__/component-contrast.test.ts +2 -2
  142. package/src/theme/__tests__/serializer.test.ts +1 -1
  143. package/src/theme/generator.ts +16 -1
  144. package/src/theme/schema.ts +8 -0
  145. package/src/theme/serializer.ts +13 -9
  146. package/src/theme/types.ts +8 -0
  147. package/src/validators.ts +1 -2
  148. package/src/viewer/__tests__/viewer-integration.test.ts +8 -8
  149. package/src/viewer/style-utils.ts +27 -412
  150. package/src/viewer/vite-plugin.ts +2 -2
  151. package/dist/chunk-55KERLWL.js.map +0 -1
  152. package/dist/chunk-5A6X2Y73.js.map +0 -1
  153. package/dist/chunk-APTQIBS5.js.map +0 -1
  154. package/dist/chunk-EYXVAMEX.js +0 -626
  155. package/dist/chunk-EYXVAMEX.js.map +0 -1
  156. package/dist/chunk-I34BC3CU.js.map +0 -1
  157. package/dist/chunk-LOYS64QS.js +0 -2453
  158. package/dist/chunk-LOYS64QS.js.map +0 -1
  159. package/dist/chunk-Z7EY4VHE.js +0 -50
  160. package/dist/chunk-ZKTFKHWN.js +0 -324
  161. package/dist/chunk-ZKTFKHWN.js.map +0 -1
  162. package/dist/discovery-VDANZAJ2.js +0 -28
  163. package/dist/init-WRUSW7R5.js.map +0 -1
  164. package/dist/sass.node-4XJK6YBF.js +0 -130708
  165. package/dist/sass.node-4XJK6YBF.js.map +0 -1
  166. package/dist/scan-YJHQIRKG.js +0 -14
  167. package/dist/scan-generate-TFZVL3BT.js.map +0 -1
  168. package/dist/viewer-2TZS3NDL.js +0 -2730
  169. package/dist/viewer-2TZS3NDL.js.map +0 -1
  170. package/src/build.ts +0 -612
  171. package/src/commands/dev.ts +0 -107
  172. package/src/core/auto-props.ts +0 -464
  173. package/src/core/component-extractor.ts +0 -1030
  174. package/src/core/token-resolver.ts +0 -155
  175. /package/dist/{ai-client-I6MDWNYA.js.map → ai-client-LSLQGOMM.js.map} +0 -0
  176. /package/dist/{chunk-TXFCEDOC.js.map → chunk-2WXKALIG.js.map} +0 -0
  177. /package/dist/{chunk-Z7EY4VHE.js.map → codebase-scanner-MQHUZC2G.js.map} +0 -0
  178. /package/dist/{discovery-VDANZAJ2.js.map → node-37AUE74M.js.map} +0 -0
  179. /package/dist/{scan-YJHQIRKG.js.map → scan-PKSYSTRR.js.map} +0 -0
  180. /package/dist/{service-HKJ6B7P7.js.map → scanner-4KZNOXAK.js.map} +0 -0
  181. /package/dist/{static-viewer-DUVC4UIM.js.map → service-QJGWUIVL.js.map} +0 -0
@@ -0,0 +1,148 @@
1
+ import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
+
3
+ // src/commands/tokens-push.ts
4
+ import { resolve } from "path";
5
+ import pc from "picocolors";
6
+ async function tokensPush(options) {
7
+ const startTime = Date.now();
8
+ const apiKey = process.env.FRAGMENTS_API_KEY;
9
+ const baseUrl = process.env.FRAGMENTS_URL || "https://app.usefragments.com";
10
+ if (!apiKey && !options.dryRun) {
11
+ console.error(pc.red("Error: FRAGMENTS_API_KEY environment variable is required"));
12
+ console.error(pc.dim("Get your API key from https://app.usefragments.com/api-keys"));
13
+ process.exit(1);
14
+ }
15
+ const flatMap = {};
16
+ if (options.tailwindV4) {
17
+ const { parseTailwindV4File } = await import("./token-parser-32KOIOFN.js");
18
+ const filePath = resolve(process.cwd(), options.tailwindV4);
19
+ const result = parseTailwindV4File(filePath);
20
+ if (result.errors.length > 0) {
21
+ for (const err of result.errors) {
22
+ console.error(pc.red(` Error: ${err.message}`));
23
+ }
24
+ }
25
+ if (options.verbose && result.warnings.length > 0) {
26
+ for (const warn of result.warnings) {
27
+ console.warn(pc.yellow(` Warning: ${warn}`));
28
+ }
29
+ }
30
+ for (const token of result.tokens) {
31
+ flatMap[token.name] = token.resolvedValue;
32
+ }
33
+ if (options.verbose) {
34
+ console.log(
35
+ pc.dim(` Parsed ${result.tokens.length} tokens from ${options.tailwindV4} (${result.parseTimeMs.toFixed(1)}ms)`)
36
+ );
37
+ }
38
+ } else if (options.config) {
39
+ try {
40
+ const { loadConfig } = await import("./node-37AUE74M.js");
41
+ const { parseTokenFiles } = await import("./service-QJGWUIVL.js");
42
+ const { config, configDir } = await loadConfig(options.config);
43
+ if (config.tokens?.include?.length) {
44
+ const result = await parseTokenFiles(config.tokens, configDir);
45
+ for (const token of result.tokens) {
46
+ flatMap[token.name] = token.resolvedValue;
47
+ }
48
+ if (options.verbose) {
49
+ console.log(
50
+ pc.dim(` Parsed ${result.tokens.length} tokens from config (${result.parseTimeMs.toFixed(1)}ms)`)
51
+ );
52
+ }
53
+ } else {
54
+ console.error(pc.red("Error: Config file has no tokens.include patterns"));
55
+ process.exit(1);
56
+ }
57
+ } catch (error) {
58
+ console.error(pc.red("Error loading config:"), error instanceof Error ? error.message : error);
59
+ process.exit(1);
60
+ }
61
+ } else {
62
+ try {
63
+ const { loadConfig } = await import("./node-37AUE74M.js");
64
+ const { parseTokenFiles } = await import("./service-QJGWUIVL.js");
65
+ const { config, configDir } = await loadConfig();
66
+ if (config.tokens?.include?.length) {
67
+ const result = await parseTokenFiles(config.tokens, configDir);
68
+ for (const token of result.tokens) {
69
+ flatMap[token.name] = token.resolvedValue;
70
+ }
71
+ if (options.verbose) {
72
+ console.log(
73
+ pc.dim(` Parsed ${result.tokens.length} tokens from auto-detected config (${result.parseTimeMs.toFixed(1)}ms)`)
74
+ );
75
+ }
76
+ }
77
+ } catch {
78
+ }
79
+ if (Object.keys(flatMap).length === 0) {
80
+ console.error(pc.red("Error: No token source specified"));
81
+ console.error(pc.dim("Provide one of:"));
82
+ console.error(pc.dim(" --tailwind-v4 <path> Path to Tailwind v4 CSS file with @theme block"));
83
+ console.error(pc.dim(" --config <path> Path to fragments config with tokens.include"));
84
+ console.error(pc.dim("\nExample: fragments tokens push --tailwind-v4 ./app.css"));
85
+ process.exit(1);
86
+ }
87
+ }
88
+ const tokenCount = Object.keys(flatMap).length;
89
+ if (tokenCount === 0) {
90
+ console.log(pc.yellow("No tokens found."));
91
+ return;
92
+ }
93
+ console.log(pc.cyan(`Found ${tokenCount} tokens`));
94
+ if (options.dryRun) {
95
+ console.log(pc.dim("\nDry run \u2014 tokens that would be pushed:\n"));
96
+ const entries = Object.entries(flatMap);
97
+ for (const [name, value] of entries.slice(0, 20)) {
98
+ console.log(` ${pc.bold(name)}: ${value}`);
99
+ }
100
+ if (entries.length > 20) {
101
+ console.log(pc.dim(` ... and ${entries.length - 20} more`));
102
+ }
103
+ return;
104
+ }
105
+ try {
106
+ const response = await fetch(`${baseUrl}/api/ingest`, {
107
+ method: "POST",
108
+ headers: {
109
+ "Content-Type": "application/json",
110
+ "Authorization": `Bearer ${apiKey}`
111
+ },
112
+ body: JSON.stringify({
113
+ codeTokens: JSON.stringify(flatMap)
114
+ })
115
+ });
116
+ if (!response.ok) {
117
+ const errorText = await response.text();
118
+ console.error(pc.red(`Error: API returned ${response.status}`));
119
+ console.error(pc.dim(errorText));
120
+ process.exit(1);
121
+ }
122
+ const result = await response.json();
123
+ console.log(pc.green(`
124
+ Pushed ${tokenCount} tokens to Fragments Cloud`));
125
+ if (result.tokenDrift) {
126
+ const drift = result.tokenDrift;
127
+ const summary = drift.summary;
128
+ if (summary) {
129
+ console.log(pc.cyan("\nDrift Summary:"));
130
+ if (summary.total !== void 0) console.log(pc.dim(` Total issues: ${summary.total}`));
131
+ if (summary.missingInCode > 0) console.log(pc.yellow(` Missing in code: ${summary.missingInCode}`));
132
+ if (summary.missingInFigma > 0) console.log(pc.yellow(` Missing in Figma: ${summary.missingInFigma}`));
133
+ if (summary.valueMismatch > 0) console.log(pc.yellow(` Value mismatches: ${summary.valueMismatch}`));
134
+ if (summary.score !== void 0) console.log(` Health score: ${summary.score}%`);
135
+ }
136
+ }
137
+ console.log(pc.dim(`
138
+ View dashboard: ${baseUrl}/tokens`));
139
+ console.log(pc.dim(`Completed in ${Date.now() - startTime}ms`));
140
+ } catch (error) {
141
+ console.error(pc.red("Error pushing tokens:"), error instanceof Error ? error.message : error);
142
+ process.exit(1);
143
+ }
144
+ }
145
+ export {
146
+ tokensPush
147
+ };
148
+ //# sourceMappingURL=tokens-push-HY3KO36V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/tokens-push.ts"],"sourcesContent":["/**\n * fragments tokens push — Push code tokens to Fragments Cloud for drift comparison.\n *\n * Extracts CSS custom properties from Tailwind v4 @theme blocks (or config-based\n * token files) and POSTs them to the Fragments Cloud /api/ingest endpoint.\n * Supports --dry-run for local inspection without pushing.\n */\n\nimport { resolve } from 'node:path';\nimport pc from 'picocolors';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface TokensPushOptions {\n /** Path to fragments config file */\n config?: string;\n /** Path to Tailwind v4 CSS file with @theme block */\n tailwindV4?: string;\n /** Parse and display tokens without pushing */\n dryRun?: boolean;\n /** Show detailed output */\n verbose?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// tokensPush\n// ---------------------------------------------------------------------------\n\nexport async function tokensPush(options: TokensPushOptions): Promise<void> {\n const startTime = Date.now();\n\n // 1. Resolve API credentials\n const apiKey = process.env.FRAGMENTS_API_KEY;\n const baseUrl = process.env.FRAGMENTS_URL || 'https://app.usefragments.com';\n\n if (!apiKey && !options.dryRun) {\n console.error(pc.red('Error: FRAGMENTS_API_KEY environment variable is required'));\n console.error(pc.dim('Get your API key from https://app.usefragments.com/api-keys'));\n process.exit(1);\n }\n\n // 2. Token extraction\n const flatMap: Record<string, string> = {};\n\n if (options.tailwindV4) {\n // Use @theme parser for Tailwind v4 CSS files\n const { parseTailwindV4File } = await import('../service/token-parser.js');\n\n const filePath = resolve(process.cwd(), options.tailwindV4);\n const result = parseTailwindV4File(filePath);\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n console.error(pc.red(` Error: ${err.message}`));\n }\n }\n\n if (options.verbose && result.warnings.length > 0) {\n for (const warn of result.warnings) {\n console.warn(pc.yellow(` Warning: ${warn}`));\n }\n }\n\n for (const token of result.tokens) {\n flatMap[token.name] = token.resolvedValue;\n }\n\n if (options.verbose) {\n console.log(\n pc.dim(` Parsed ${result.tokens.length} tokens from ${options.tailwindV4} (${result.parseTimeMs.toFixed(1)}ms)`),\n );\n }\n } else if (options.config) {\n // Use config-based token extraction\n try {\n const { loadConfig } = await import('../core/node.js');\n const { parseTokenFiles } = await import('../service/index.js');\n\n const { config, configDir } = await loadConfig(options.config);\n if (config.tokens?.include?.length) {\n const result = await parseTokenFiles(config.tokens, configDir);\n for (const token of result.tokens) {\n flatMap[token.name] = token.resolvedValue;\n }\n\n if (options.verbose) {\n console.log(\n pc.dim(` Parsed ${result.tokens.length} tokens from config (${result.parseTimeMs.toFixed(1)}ms)`),\n );\n }\n } else {\n console.error(pc.red('Error: Config file has no tokens.include patterns'));\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error loading config:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n } else {\n // No source specified — try auto-detection\n try {\n const { loadConfig } = await import('../core/node.js');\n const { parseTokenFiles } = await import('../service/index.js');\n\n const { config, configDir } = await loadConfig();\n if (config.tokens?.include?.length) {\n const result = await parseTokenFiles(config.tokens, configDir);\n for (const token of result.tokens) {\n flatMap[token.name] = token.resolvedValue;\n }\n\n if (options.verbose) {\n console.log(\n pc.dim(` Parsed ${result.tokens.length} tokens from auto-detected config (${result.parseTimeMs.toFixed(1)}ms)`),\n );\n }\n }\n } catch {\n // No config found — fall through to error\n }\n\n if (Object.keys(flatMap).length === 0) {\n console.error(pc.red('Error: No token source specified'));\n console.error(pc.dim('Provide one of:'));\n console.error(pc.dim(' --tailwind-v4 <path> Path to Tailwind v4 CSS file with @theme block'));\n console.error(pc.dim(' --config <path> Path to fragments config with tokens.include'));\n console.error(pc.dim('\\nExample: fragments tokens push --tailwind-v4 ./app.css'));\n process.exit(1);\n }\n }\n\n const tokenCount = Object.keys(flatMap).length;\n\n if (tokenCount === 0) {\n console.log(pc.yellow('No tokens found.'));\n return;\n }\n\n console.log(pc.cyan(`Found ${tokenCount} tokens`));\n\n // 3. Dry run — display tokens and exit\n if (options.dryRun) {\n console.log(pc.dim('\\nDry run — tokens that would be pushed:\\n'));\n const entries = Object.entries(flatMap);\n for (const [name, value] of entries.slice(0, 20)) {\n console.log(` ${pc.bold(name)}: ${value}`);\n }\n if (entries.length > 20) {\n console.log(pc.dim(` ... and ${entries.length - 20} more`));\n }\n return;\n }\n\n // 4. POST to Fragments Cloud\n try {\n const response = await fetch(`${baseUrl}/api/ingest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n codeTokens: JSON.stringify(flatMap),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(pc.red(`Error: API returned ${response.status}`));\n console.error(pc.dim(errorText));\n process.exit(1);\n }\n\n const result = await response.json() as Record<string, unknown>;\n\n console.log(pc.green(`\\nPushed ${tokenCount} tokens to Fragments Cloud`));\n\n if (result.tokenDrift) {\n const drift = result.tokenDrift as Record<string, unknown>;\n const summary = drift.summary as Record<string, number> | undefined;\n if (summary) {\n console.log(pc.cyan('\\nDrift Summary:'));\n if (summary.total !== undefined) console.log(pc.dim(` Total issues: ${summary.total}`));\n if (summary.missingInCode > 0) console.log(pc.yellow(` Missing in code: ${summary.missingInCode}`));\n if (summary.missingInFigma > 0) console.log(pc.yellow(` Missing in Figma: ${summary.missingInFigma}`));\n if (summary.valueMismatch > 0) console.log(pc.yellow(` Value mismatches: ${summary.valueMismatch}`));\n if (summary.score !== undefined) console.log(` Health score: ${summary.score}%`);\n }\n }\n\n console.log(pc.dim(`\\nView dashboard: ${baseUrl}/tokens`));\n console.log(pc.dim(`Completed in ${Date.now() - startTime}ms`));\n } catch (error) {\n console.error(pc.red('Error pushing tokens:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fragments-sdk/cli",
3
- "version": "0.14.3",
3
+ "version": "0.15.1",
4
4
  "license": "FSL-1.1-MIT",
5
5
  "description": "CLI, MCP server, and dev tools for Fragments design system",
6
6
  "author": "Conan McNicholl",
@@ -81,11 +81,13 @@
81
81
  "vite": "^6.0.0",
82
82
  "vite-plugin-svgr": "^4.5.0",
83
83
  "zod": "^3.24.1",
84
- "@fragments-sdk/context": "0.5.1",
85
- "@fragments-sdk/core": "1.0.1",
86
- "@fragments-sdk/govern": "^0.2.1",
87
- "@fragments-sdk/webmcp": "2.0.1",
88
- "@fragments-sdk/viewer": "0.2.6"
84
+ "@fragments-sdk/compiler": "0.2.0",
85
+ "@fragments-sdk/context": "0.6.0",
86
+ "@fragments-sdk/core": "2.0.0",
87
+ "@fragments-sdk/viewer": "0.2.8",
88
+ "@fragments-sdk/webmcp": "3.0.0",
89
+ "@fragments-sdk/extract": "0.1.0",
90
+ "@fragments-sdk/govern": "^0.3.0"
89
91
  },
90
92
  "devDependencies": {
91
93
  "@types/babel__generator": "^7.6.8",