@fragments-sdk/cli 0.13.0 → 0.14.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.
Files changed (50) hide show
  1. package/dist/bin.js +163 -17
  2. package/dist/bin.js.map +1 -1
  3. package/dist/{chunk-3SOAPJDX.js → chunk-55KERLWL.js} +2 -2
  4. package/dist/{chunk-4K7EAQ5L.js → chunk-7K3VROEP.js} +2 -2
  5. package/dist/{chunk-RF3C6LGA.js → chunk-FZLPVN32.js} +5 -5
  6. package/dist/{chunk-QM7SVOGF.js → chunk-I34BC3CU.js} +10 -1
  7. package/dist/chunk-I34BC3CU.js.map +1 -0
  8. package/dist/{chunk-DXX6HADE.js → chunk-PJT5IZ37.js} +2 -2
  9. package/dist/{chunk-UV5JQV3R.js → chunk-TXFCEDOC.js} +2 -2
  10. package/dist/{chunk-FO6EBJWP.js → chunk-Z5BUXIFJ.js} +5 -5
  11. package/dist/{chunk-SM674YAS.js → chunk-ZKTFKHWN.js} +2 -2
  12. package/dist/core/index.js +1 -1
  13. package/dist/{discovery-VSGC76JN.js → discovery-VDANZAJ2.js} +3 -3
  14. package/dist/{generate-QZXOXYFW.js → generate-RYWIPDN2.js} +4 -4
  15. package/dist/index.js +6 -6
  16. package/dist/{init-XK6PRUE5.js → init-U6534EMZ.js} +5 -5
  17. package/dist/init-cloud-REQ3XLHO.js +279 -0
  18. package/dist/init-cloud-REQ3XLHO.js.map +1 -0
  19. package/dist/mcp-bin.js +2 -2
  20. package/dist/{scan-CHQHXWVD.js → scan-LE2JEIJ4.js} +6 -6
  21. package/dist/{scan-generate-U3RFVDTX.js → scan-generate-TFZVL3BT.js} +4 -4
  22. package/dist/{service-MMEKG4MZ.js → service-S5LXPKV4.js} +3 -3
  23. package/dist/{snapshot-53TUR3HW.js → snapshot-C5DYIGIV.js} +2 -2
  24. package/dist/{static-viewer-KKCR4KXR.js → static-viewer-DUVC4UIM.js} +3 -3
  25. package/dist/{test-5UCKXYSC.js → test-JW7JIDFG.js} +4 -4
  26. package/dist/{tokens-L46MK5AW.js → tokens-OPVTVITP.js} +5 -5
  27. package/dist/{viewer-M2EQQSGE.js → viewer-OBTEPVY7.js} +13 -13
  28. package/package.json +6 -6
  29. package/src/bin.ts +32 -3
  30. package/src/commands/govern.ts +158 -1
  31. package/src/commands/init-cloud.ts +354 -0
  32. package/dist/chunk-QM7SVOGF.js.map +0 -1
  33. /package/dist/{chunk-3SOAPJDX.js.map → chunk-55KERLWL.js.map} +0 -0
  34. /package/dist/{chunk-4K7EAQ5L.js.map → chunk-7K3VROEP.js.map} +0 -0
  35. /package/dist/{chunk-RF3C6LGA.js.map → chunk-FZLPVN32.js.map} +0 -0
  36. /package/dist/{chunk-DXX6HADE.js.map → chunk-PJT5IZ37.js.map} +0 -0
  37. /package/dist/{chunk-UV5JQV3R.js.map → chunk-TXFCEDOC.js.map} +0 -0
  38. /package/dist/{chunk-FO6EBJWP.js.map → chunk-Z5BUXIFJ.js.map} +0 -0
  39. /package/dist/{chunk-SM674YAS.js.map → chunk-ZKTFKHWN.js.map} +0 -0
  40. /package/dist/{discovery-VSGC76JN.js.map → discovery-VDANZAJ2.js.map} +0 -0
  41. /package/dist/{generate-QZXOXYFW.js.map → generate-RYWIPDN2.js.map} +0 -0
  42. /package/dist/{init-XK6PRUE5.js.map → init-U6534EMZ.js.map} +0 -0
  43. /package/dist/{scan-CHQHXWVD.js.map → scan-LE2JEIJ4.js.map} +0 -0
  44. /package/dist/{scan-generate-U3RFVDTX.js.map → scan-generate-TFZVL3BT.js.map} +0 -0
  45. /package/dist/{service-MMEKG4MZ.js.map → service-S5LXPKV4.js.map} +0 -0
  46. /package/dist/{snapshot-53TUR3HW.js.map → snapshot-C5DYIGIV.js.map} +0 -0
  47. /package/dist/{static-viewer-KKCR4KXR.js.map → static-viewer-DUVC4UIM.js.map} +0 -0
  48. /package/dist/{test-5UCKXYSC.js.map → test-JW7JIDFG.js.map} +0 -0
  49. /package/dist/{tokens-L46MK5AW.js.map → tokens-OPVTVITP.js.map} +0 -0
  50. /package/dist/{viewer-M2EQQSGE.js.map → viewer-OBTEPVY7.js.map} +0 -0
@@ -0,0 +1,279 @@
1
+ import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
+ import "./chunk-D2CDBRNU.js";
3
+ import {
4
+ BRAND
5
+ } from "./chunk-I34BC3CU.js";
6
+ import "./chunk-Z7EY4VHE.js";
7
+
8
+ // src/commands/init-cloud.ts
9
+ import { createServer } from "http";
10
+ import { randomBytes } from "crypto";
11
+ import { execSync, exec } from "child_process";
12
+ import { readFileSync, writeFileSync, existsSync, appendFileSync } from "fs";
13
+ import { resolve, join } from "path";
14
+ import { platform } from "os";
15
+ import pc from "picocolors";
16
+ function detectPackageManager() {
17
+ let dir = process.cwd();
18
+ const root = resolve("/");
19
+ while (dir !== root) {
20
+ if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock"))) return "bun";
21
+ if (existsSync(join(dir, "pnpm-lock.yaml"))) return "pnpm";
22
+ if (existsSync(join(dir, "yarn.lock"))) return "yarn";
23
+ const parent = resolve(dir, "..");
24
+ if (parent === dir) break;
25
+ dir = parent;
26
+ }
27
+ return "npm";
28
+ }
29
+ function detectFramework() {
30
+ try {
31
+ const pkg = JSON.parse(readFileSync(resolve("package.json"), "utf-8"));
32
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
33
+ if (allDeps["next"]) return "Next.js";
34
+ if (allDeps["nuxt"]) return "Nuxt";
35
+ if (allDeps["@sveltejs/kit"]) return "SvelteKit";
36
+ if (allDeps["svelte"]) return "Svelte";
37
+ if (allDeps["vue"]) return "Vue";
38
+ if (allDeps["astro"]) return "Astro";
39
+ if (allDeps["react"]) return "React";
40
+ return "Unknown";
41
+ } catch {
42
+ return "Unknown";
43
+ }
44
+ }
45
+ function inferInputGlob(framework) {
46
+ switch (framework) {
47
+ case "Next.js":
48
+ return ["./app/**/*.{tsx,jsx}", "./components/**/*.{tsx,jsx}"];
49
+ case "Nuxt":
50
+ case "Vue":
51
+ return ["./**/*.vue"];
52
+ case "SvelteKit":
53
+ case "Svelte":
54
+ return ["./src/**/*.svelte"];
55
+ case "Astro":
56
+ return ["./src/**/*.{astro,tsx,jsx}"];
57
+ default:
58
+ return "./src/**/*.{tsx,jsx}";
59
+ }
60
+ }
61
+ function openBrowser(url) {
62
+ const os = platform();
63
+ const cmd = os === "darwin" ? "open" : os === "win32" ? 'start ""' : "xdg-open";
64
+ exec(`${cmd} "${url}"`);
65
+ }
66
+ function installCommand(pm) {
67
+ switch (pm) {
68
+ case "pnpm":
69
+ return "pnpm add";
70
+ case "yarn":
71
+ return "yarn add";
72
+ case "bun":
73
+ return "bun add";
74
+ default:
75
+ return "npm install";
76
+ }
77
+ }
78
+ function isMonorepoWorkspaceDep() {
79
+ try {
80
+ const pkg = JSON.parse(readFileSync(resolve("package.json"), "utf-8"));
81
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
82
+ return allDeps["@fragments-sdk/govern"]?.startsWith("workspace:") || allDeps["@fragments-sdk/cli"]?.startsWith("workspace:");
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+ function waitForAuth(cloudUrl, port, timeoutMs) {
88
+ const nonce = randomBytes(16).toString("hex");
89
+ return new Promise((resolve2, reject) => {
90
+ const timeout = setTimeout(() => {
91
+ server.close();
92
+ reject(new Error("Authentication timed out. Please try again."));
93
+ }, timeoutMs);
94
+ const server = createServer((req, res) => {
95
+ const url = new URL(req.url, `http://localhost:${port}`);
96
+ if (url.pathname === "/callback") {
97
+ const key = url.searchParams.get("key");
98
+ const org = url.searchParams.get("org");
99
+ const returnedNonce = url.searchParams.get("nonce");
100
+ if (returnedNonce !== nonce) {
101
+ res.writeHead(400, { "Content-Type": "text/plain" });
102
+ res.end("Nonce mismatch \u2014 please try again.");
103
+ return;
104
+ }
105
+ if (!key) {
106
+ res.writeHead(400, { "Content-Type": "text/plain" });
107
+ res.end("Missing API key in callback.");
108
+ return;
109
+ }
110
+ res.writeHead(200, { "Content-Type": "text/html" });
111
+ res.end(`<!DOCTYPE html>
112
+ <html><head><title>Fragments CLI</title>
113
+ <style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#e5e5e5}
114
+ .box{text-align:center;padding:48px}.check{font-size:48px;margin-bottom:16px}p{color:#888;margin-top:8px}</style>
115
+ </head><body><div class="box"><div class="check">&#10003;</div><h2>CLI Authorized</h2><p>You can close this tab and return to your terminal.</p></div>
116
+ <script>setTimeout(()=>window.close(),3000)</script>
117
+ </body></html>`);
118
+ clearTimeout(timeout);
119
+ server.close();
120
+ resolve2({ apiKey: key, orgName: org ?? "your organization" });
121
+ } else {
122
+ res.writeHead(404);
123
+ res.end();
124
+ }
125
+ });
126
+ server.on("error", (err) => {
127
+ if (err.code === "EADDRINUSE") {
128
+ clearTimeout(timeout);
129
+ reject(new Error(`Port ${port} is in use. Try: fragments init --cloud --port ${port + 1}`));
130
+ } else {
131
+ clearTimeout(timeout);
132
+ reject(err);
133
+ }
134
+ });
135
+ server.listen(port, "127.0.0.1", () => {
136
+ const authUrl = `${cloudUrl}/cli-auth?port=${port}&nonce=${nonce}`;
137
+ openBrowser(authUrl);
138
+ });
139
+ });
140
+ }
141
+ function saveApiKey(apiKey, cloudUrl) {
142
+ const envPath = resolve(".env");
143
+ const entry = `FRAGMENTS_API_KEY=${apiKey}`;
144
+ if (existsSync(envPath)) {
145
+ const content = readFileSync(envPath, "utf-8");
146
+ if (content.includes("FRAGMENTS_API_KEY=")) {
147
+ const updated = content.replace(/^FRAGMENTS_API_KEY=.*$/m, entry);
148
+ writeFileSync(envPath, updated, "utf-8");
149
+ } else {
150
+ appendFileSync(envPath, `
151
+ ${entry}
152
+ `, "utf-8");
153
+ }
154
+ } else {
155
+ writeFileSync(envPath, `${entry}
156
+ `, "utf-8");
157
+ }
158
+ if (cloudUrl !== "https://app.usefragments.com") {
159
+ const content = readFileSync(envPath, "utf-8");
160
+ if (!content.includes("FRAGMENTS_URL=")) {
161
+ appendFileSync(envPath, `FRAGMENTS_URL=${cloudUrl}
162
+ `, "utf-8");
163
+ }
164
+ }
165
+ const gitignorePath = resolve(".gitignore");
166
+ if (existsSync(gitignorePath)) {
167
+ const gitignore = readFileSync(gitignorePath, "utf-8");
168
+ if (!gitignore.split("\n").some((line) => line.trim() === ".env")) {
169
+ appendFileSync(gitignorePath, "\n.env\n", "utf-8");
170
+ }
171
+ } else {
172
+ writeFileSync(gitignorePath, ".env\n", "utf-8");
173
+ }
174
+ }
175
+ function writeGovernConfig(input) {
176
+ const configPath = resolve(BRAND.configFile);
177
+ if (existsSync(configPath)) return;
178
+ const inputStr = Array.isArray(input) ? `[${input.map((p) => `'${p}'`).join(", ")}]` : `'${input}'`;
179
+ const template = `import { defineConfig } from '@fragments-sdk/govern';
180
+
181
+ export default defineConfig({
182
+ cloud: true,
183
+ checks: ['accessibility', 'consistency', 'responsive'],
184
+ input: ${inputStr},
185
+ });
186
+ `;
187
+ writeFileSync(configPath, template, "utf-8");
188
+ }
189
+ async function initCloud(options = {}) {
190
+ const cloudUrl = options.url ?? process.env.FRAGMENTS_URL ?? "https://app.usefragments.com";
191
+ const port = options.port ?? 9876;
192
+ const timeoutMs = options.timeout ?? 12e4;
193
+ console.log(pc.bold(`
194
+ ${BRAND.name}
195
+ `));
196
+ if (!options.authOnly) {
197
+ if (!existsSync(resolve("package.json"))) {
198
+ console.log(pc.red(" No package.json found. Run this from a project directory.\n"));
199
+ process.exit(1);
200
+ }
201
+ const pm2 = detectPackageManager();
202
+ const framework2 = detectFramework();
203
+ console.log(pc.dim(` Project: ${framework2}`));
204
+ console.log(pc.dim(` Package manager: ${pm2}
205
+ `));
206
+ }
207
+ console.log(pc.dim(" Opening browser to sign in...\n"));
208
+ let auth;
209
+ try {
210
+ auth = await waitForAuth(cloudUrl, port, timeoutMs);
211
+ } catch (err) {
212
+ console.log(pc.red(`
213
+ ${err instanceof Error ? err.message : "Auth failed"}
214
+ `));
215
+ process.exit(1);
216
+ }
217
+ console.log(pc.green(` \u2713 Authenticated \u2014 ${auth.orgName}
218
+ `));
219
+ saveApiKey(auth.apiKey, cloudUrl);
220
+ console.log(pc.green(" \u2713 API key saved to .env"));
221
+ if (options.authOnly) {
222
+ console.log(pc.green("\n \u2713 All set!\n"));
223
+ console.log(pc.dim(` Dashboard: ${cloudUrl}
224
+ `));
225
+ return;
226
+ }
227
+ const pm = detectPackageManager();
228
+ if (!isMonorepoWorkspaceDep()) {
229
+ const deps = "@fragments-sdk/govern @fragments-sdk/cli";
230
+ console.log(pc.dim(`
231
+ Installing ${deps}...`));
232
+ try {
233
+ execSync(`${installCommand(pm)} ${deps}`, {
234
+ stdio: "pipe",
235
+ cwd: process.cwd()
236
+ });
237
+ console.log(pc.green(" \u2713 Dependencies installed"));
238
+ } catch (err) {
239
+ console.log(pc.yellow(" \u26A0 Install failed \u2014 you may need to install manually:"));
240
+ console.log(pc.dim(` ${installCommand(pm)} ${deps}
241
+ `));
242
+ }
243
+ } else {
244
+ console.log(pc.dim("\n Workspace deps detected \u2014 skipping install"));
245
+ }
246
+ const framework = detectFramework();
247
+ const input = inferInputGlob(framework);
248
+ const configPath = resolve(BRAND.configFile);
249
+ if (existsSync(configPath)) {
250
+ console.log(pc.dim(` Config already exists: ${BRAND.configFile}`));
251
+ } else {
252
+ writeGovernConfig(input);
253
+ console.log(pc.green(` \u2713 Created ${BRAND.configFile}`));
254
+ }
255
+ if (!options.skipCheck) {
256
+ console.log(pc.dim("\n Running first governance check...\n"));
257
+ try {
258
+ const output = execSync("npx fragments govern check --cloud", {
259
+ stdio: "pipe",
260
+ cwd: process.cwd(),
261
+ env: { ...process.env, FRAGMENTS_API_KEY: auth.apiKey }
262
+ });
263
+ console.log(output.toString());
264
+ } catch (err) {
265
+ if (err.stdout) {
266
+ console.log(err.stdout.toString());
267
+ }
268
+ console.log(pc.dim(" (check completed with violations \u2014 see dashboard for details)"));
269
+ }
270
+ }
271
+ console.log(pc.green("\n \u2713 All set!") + " Your project is connected to Fragments Cloud.\n");
272
+ console.log(pc.dim(` Dashboard: ${cloudUrl}`));
273
+ console.log(pc.dim(" Run checks: fragments govern check --cloud"));
274
+ console.log(pc.dim(" View config: fragments.config.ts\n"));
275
+ }
276
+ export {
277
+ initCloud
278
+ };
279
+ //# sourceMappingURL=init-cloud-REQ3XLHO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init-cloud.ts"],"sourcesContent":["/**\n * fragments init --cloud\n *\n * Zero-config cloud setup: opens browser for auth, receives API key\n * via localhost callback, detects project, installs deps, creates config,\n * runs first check.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { randomBytes } from 'node:crypto';\nimport { execSync, exec } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, appendFileSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { platform } from 'node:os';\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface AuthResult {\n apiKey: string;\n orgName: string;\n}\n\nexport interface InitCloudOptions {\n /** Cloud dashboard URL */\n url?: string;\n /** Port for localhost callback server */\n port?: number;\n /** Timeout in ms for auth */\n timeout?: number;\n /** Skip project detection and setup */\n authOnly?: boolean;\n /** Skip the first governance check */\n skipCheck?: boolean;\n}\n\n// ─── Utilities ──────────────────────────────────────────────────────────────\n\nfunction detectPackageManager(): 'pnpm' | 'yarn' | 'bun' | 'npm' {\n // Check current dir and parent dirs (for monorepos)\n let dir = process.cwd();\n const root = resolve('/');\n while (dir !== root) {\n if (existsSync(join(dir, 'bun.lockb')) || existsSync(join(dir, 'bun.lock'))) return 'bun';\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(dir, 'yarn.lock'))) return 'yarn';\n const parent = resolve(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n return 'npm';\n}\n\nfunction detectFramework(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (allDeps['next']) return 'Next.js';\n if (allDeps['nuxt']) return 'Nuxt';\n if (allDeps['@sveltejs/kit']) return 'SvelteKit';\n if (allDeps['svelte']) return 'Svelte';\n if (allDeps['vue']) return 'Vue';\n if (allDeps['astro']) return 'Astro';\n if (allDeps['react']) return 'React';\n return 'Unknown';\n } catch {\n return 'Unknown';\n }\n}\n\nfunction inferInputGlob(framework: string): string | string[] {\n switch (framework) {\n case 'Next.js':\n return ['./app/**/*.{tsx,jsx}', './components/**/*.{tsx,jsx}'];\n case 'Nuxt':\n case 'Vue':\n return ['./**/*.vue'];\n case 'SvelteKit':\n case 'Svelte':\n return ['./src/**/*.svelte'];\n case 'Astro':\n return ['./src/**/*.{astro,tsx,jsx}'];\n default:\n return './src/**/*.{tsx,jsx}';\n }\n}\n\nfunction openBrowser(url: string): void {\n const os = platform();\n const cmd =\n os === 'darwin' ? 'open' :\n os === 'win32' ? 'start \"\"' :\n 'xdg-open';\n\n exec(`${cmd} \"${url}\"`);\n}\n\nfunction installCommand(pm: string): string {\n switch (pm) {\n case 'pnpm': return 'pnpm add';\n case 'yarn': return 'yarn add';\n case 'bun': return 'bun add';\n default: return 'npm install';\n }\n}\n\nfunction isMonorepoWorkspaceDep(): boolean {\n try {\n const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return (\n allDeps['@fragments-sdk/govern']?.startsWith('workspace:') ||\n allDeps['@fragments-sdk/cli']?.startsWith('workspace:')\n );\n } catch {\n return false;\n }\n}\n\n// ─── Localhost Auth Server ──────────────────────────────────────────────────\n\nfunction waitForAuth(\n cloudUrl: string,\n port: number,\n timeoutMs: number,\n): Promise<AuthResult> {\n const nonce = randomBytes(16).toString('hex');\n\n return new Promise<AuthResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out. Please try again.'));\n }, timeoutMs);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url!, `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const key = url.searchParams.get('key');\n const org = url.searchParams.get('org');\n const returnedNonce = url.searchParams.get('nonce');\n\n if (returnedNonce !== nonce) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Nonce mismatch — please try again.');\n return;\n }\n\n if (!key) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing API key in callback.');\n return;\n }\n\n // Show \"you can close this tab\" page\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html>\n<html><head><title>Fragments CLI</title>\n<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#e5e5e5}\n.box{text-align:center;padding:48px}.check{font-size:48px;margin-bottom:16px}p{color:#888;margin-top:8px}</style>\n</head><body><div class=\"box\"><div class=\"check\">&#10003;</div><h2>CLI Authorized</h2><p>You can close this tab and return to your terminal.</p></div>\n<script>setTimeout(()=>window.close(),3000)</script>\n</body></html>`);\n\n clearTimeout(timeout);\n server.close();\n resolve({ apiKey: key, orgName: org ?? 'your organization' });\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n clearTimeout(timeout);\n reject(new Error(`Port ${port} is in use. Try: fragments init --cloud --port ${port + 1}`));\n } else {\n clearTimeout(timeout);\n reject(err);\n }\n });\n\n server.listen(port, '127.0.0.1', () => {\n const authUrl = `${cloudUrl}/cli-auth?port=${port}&nonce=${nonce}`;\n openBrowser(authUrl);\n });\n });\n}\n\n// ─── Save to .env ───────────────────────────────────────────────────────────\n\nfunction saveApiKey(apiKey: string, cloudUrl: string): void {\n const envPath = resolve('.env');\n const entry = `FRAGMENTS_API_KEY=${apiKey}`;\n\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, 'utf-8');\n if (content.includes('FRAGMENTS_API_KEY=')) {\n const updated = content.replace(/^FRAGMENTS_API_KEY=.*$/m, entry);\n writeFileSync(envPath, updated, 'utf-8');\n } else {\n appendFileSync(envPath, `\\n${entry}\\n`, 'utf-8');\n }\n } else {\n writeFileSync(envPath, `${entry}\\n`, 'utf-8');\n }\n\n // Add FRAGMENTS_URL if non-default\n if (cloudUrl !== 'https://app.usefragments.com') {\n const content = readFileSync(envPath, 'utf-8');\n if (!content.includes('FRAGMENTS_URL=')) {\n appendFileSync(envPath, `FRAGMENTS_URL=${cloudUrl}\\n`, 'utf-8');\n }\n }\n\n // Ensure .env is in .gitignore\n const gitignorePath = resolve('.gitignore');\n if (existsSync(gitignorePath)) {\n const gitignore = readFileSync(gitignorePath, 'utf-8');\n if (!gitignore.split('\\n').some((line) => line.trim() === '.env')) {\n appendFileSync(gitignorePath, '\\n.env\\n', 'utf-8');\n }\n } else {\n writeFileSync(gitignorePath, '.env\\n', 'utf-8');\n }\n}\n\n// ─── Write governance config ────────────────────────────────────────────────\n\nfunction writeGovernConfig(input: string | string[]): void {\n const configPath = resolve(BRAND.configFile);\n if (existsSync(configPath)) return; // Don't overwrite\n\n const inputStr = Array.isArray(input)\n ? `[${input.map((p) => `'${p}'`).join(', ')}]`\n : `'${input}'`;\n\n const template = `import { defineConfig } from '@fragments-sdk/govern';\n\nexport default defineConfig({\n cloud: true,\n checks: ['accessibility', 'consistency', 'responsive'],\n input: ${inputStr},\n});\n`;\n\n writeFileSync(configPath, template, 'utf-8');\n}\n\n// ─── Main ───────────────────────────────────────────────────────────────────\n\nexport async function initCloud(options: InitCloudOptions = {}): Promise<void> {\n const cloudUrl = options.url ?? process.env.FRAGMENTS_URL ?? 'https://app.usefragments.com';\n const port = options.port ?? 9876;\n const timeoutMs = options.timeout ?? 120_000;\n\n console.log(pc.bold(`\\n ${BRAND.name}\\n`));\n\n // ── 1. Detect project ─────────────────────────────────────────────\n if (!options.authOnly) {\n if (!existsSync(resolve('package.json'))) {\n console.log(pc.red(' No package.json found. Run this from a project directory.\\n'));\n process.exit(1);\n }\n\n const pm = detectPackageManager();\n const framework = detectFramework();\n console.log(pc.dim(` Project: ${framework}`));\n console.log(pc.dim(` Package manager: ${pm}\\n`));\n }\n\n // ── 2. Authenticate ───────────────────────────────────────────────\n console.log(pc.dim(' Opening browser to sign in...\\n'));\n\n let auth: AuthResult;\n try {\n auth = await waitForAuth(cloudUrl, port, timeoutMs);\n } catch (err) {\n console.log(pc.red(`\\n ${err instanceof Error ? err.message : 'Auth failed'}\\n`));\n process.exit(1);\n }\n\n console.log(pc.green(` ✓ Authenticated — ${auth.orgName}\\n`));\n\n // ── 3. Save API key ──────────────────────────────────────────────\n saveApiKey(auth.apiKey, cloudUrl);\n console.log(pc.green(' ✓ API key saved to .env'));\n\n if (options.authOnly) {\n console.log(pc.green('\\n ✓ All set!\\n'));\n console.log(pc.dim(` Dashboard: ${cloudUrl}\\n`));\n return;\n }\n\n // ── 4. Install dependencies ───────────────────────────────────────\n const pm = detectPackageManager();\n\n if (!isMonorepoWorkspaceDep()) {\n const deps = '@fragments-sdk/govern @fragments-sdk/cli';\n console.log(pc.dim(`\\n Installing ${deps}...`));\n try {\n execSync(`${installCommand(pm)} ${deps}`, {\n stdio: 'pipe',\n cwd: process.cwd(),\n });\n console.log(pc.green(' ✓ Dependencies installed'));\n } catch (err) {\n console.log(pc.yellow(' ⚠ Install failed — you may need to install manually:'));\n console.log(pc.dim(` ${installCommand(pm)} ${deps}\\n`));\n }\n } else {\n console.log(pc.dim('\\n Workspace deps detected — skipping install'));\n }\n\n // ── 5. Create governance config ───────────────────────────────────\n const framework = detectFramework();\n const input = inferInputGlob(framework);\n const configPath = resolve(BRAND.configFile);\n\n if (existsSync(configPath)) {\n console.log(pc.dim(` Config already exists: ${BRAND.configFile}`));\n } else {\n writeGovernConfig(input);\n console.log(pc.green(` ✓ Created ${BRAND.configFile}`));\n }\n\n // ── 6. Run first check ────────────────────────────────────────────\n if (!options.skipCheck) {\n console.log(pc.dim('\\n Running first governance check...\\n'));\n try {\n const output = execSync('npx fragments govern check --cloud', {\n stdio: 'pipe',\n cwd: process.cwd(),\n env: { ...process.env, FRAGMENTS_API_KEY: auth.apiKey },\n });\n console.log(output.toString());\n } catch (err: any) {\n // Check may \"fail\" with violations — that's OK\n if (err.stdout) {\n console.log(err.stdout.toString());\n }\n console.log(pc.dim(' (check completed with violations — see dashboard for details)'));\n }\n }\n\n // ── 7. Done ───────────────────────────────────────────────────────\n console.log(pc.green('\\n ✓ All set!') + ' Your project is connected to Fragments Cloud.\\n');\n console.log(pc.dim(` Dashboard: ${cloudUrl}`));\n console.log(pc.dim(' Run checks: fragments govern check --cloud'));\n console.log(pc.dim(' View config: fragments.config.ts\\n'));\n}\n"],"mappings":"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","names":["resolve","pm","framework"]}
package/dist/mcp-bin.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  BRAND,
6
6
  DEFAULTS,
7
7
  generateContext
8
- } from "./chunk-QM7SVOGF.js";
8
+ } from "./chunk-I34BC3CU.js";
9
9
  import "./chunk-Z7EY4VHE.js";
10
10
 
11
11
  // src/mcp/server.ts
@@ -58,7 +58,7 @@ var _service = null;
58
58
  async function getService() {
59
59
  if (!_service) {
60
60
  try {
61
- _service = await import("./service-MMEKG4MZ.js");
61
+ _service = await import("./service-S5LXPKV4.js");
62
62
  } catch {
63
63
  throw new Error(
64
64
  "Visual tools require playwright. Install it with: npm install playwright"
@@ -1,14 +1,14 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  scan
4
- } from "./chunk-FO6EBJWP.js";
5
- import "./chunk-3SOAPJDX.js";
6
- import "./chunk-SM674YAS.js";
7
- import "./chunk-4K7EAQ5L.js";
4
+ } from "./chunk-Z5BUXIFJ.js";
5
+ import "./chunk-55KERLWL.js";
6
+ import "./chunk-ZKTFKHWN.js";
7
+ import "./chunk-7K3VROEP.js";
8
8
  import "./chunk-D2CDBRNU.js";
9
- import "./chunk-QM7SVOGF.js";
9
+ import "./chunk-I34BC3CU.js";
10
10
  import "./chunk-Z7EY4VHE.js";
11
11
  export {
12
12
  scan
13
13
  };
14
- //# sourceMappingURL=scan-CHQHXWVD.js.map
14
+ //# sourceMappingURL=scan-LE2JEIJ4.js.map
@@ -2,14 +2,14 @@ import { createRequire as __banner_createRequire } from 'module'; const require
2
2
  import {
3
3
  createComponentExtractor
4
4
  } from "./chunk-EYXVAMEX.js";
5
- import "./chunk-3SOAPJDX.js";
5
+ import "./chunk-55KERLWL.js";
6
6
  import {
7
7
  discoverAllComponents
8
- } from "./chunk-SM674YAS.js";
8
+ } from "./chunk-ZKTFKHWN.js";
9
9
  import "./chunk-D2CDBRNU.js";
10
10
  import {
11
11
  BRAND
12
- } from "./chunk-QM7SVOGF.js";
12
+ } from "./chunk-I34BC3CU.js";
13
13
  import "./chunk-Z7EY4VHE.js";
14
14
 
15
15
  // src/commands/scan-generate.ts
@@ -1112,4 +1112,4 @@ export {
1112
1112
  parseEnrichmentResponse,
1113
1113
  scanGenerate
1114
1114
  };
1115
- //# sourceMappingURL=scan-generate-U3RFVDTX.js.map
1115
+ //# sourceMappingURL=scan-generate-TFZVL3BT.js.map
@@ -97,12 +97,12 @@ import {
97
97
  shutdownSharedPool,
98
98
  sleep,
99
99
  summarizePatternsForPrompt
100
- } from "./chunk-4K7EAQ5L.js";
100
+ } from "./chunk-7K3VROEP.js";
101
101
  import "./chunk-D2CDBRNU.js";
102
102
  import {
103
103
  BRAND,
104
104
  DEFAULTS
105
- } from "./chunk-QM7SVOGF.js";
105
+ } from "./chunk-I34BC3CU.js";
106
106
  import "./chunk-Z7EY4VHE.js";
107
107
  export {
108
108
  BRAND,
@@ -206,4 +206,4 @@ export {
206
206
  sleep,
207
207
  summarizePatternsForPrompt
208
208
  };
209
- //# sourceMappingURL=service-MMEKG4MZ.js.map
209
+ //# sourceMappingURL=service-S5LXPKV4.js.map
@@ -2,7 +2,7 @@ import { createRequire as __banner_createRequire } from 'module'; const require
2
2
  import "./chunk-D2CDBRNU.js";
3
3
  import {
4
4
  BRAND
5
- } from "./chunk-QM7SVOGF.js";
5
+ } from "./chunk-I34BC3CU.js";
6
6
  import "./chunk-Z7EY4VHE.js";
7
7
 
8
8
  // src/commands/snapshot.ts
@@ -136,4 +136,4 @@ ${BRAND.name} Visual Snapshots
136
136
  export {
137
137
  snapshot
138
138
  };
139
- //# sourceMappingURL=snapshot-53TUR3HW.js.map
139
+ //# sourceMappingURL=snapshot-C5DYIGIV.js.map
@@ -2,12 +2,12 @@ import { createRequire as __banner_createRequire } from 'module'; const require
2
2
  import {
3
3
  generateStaticViewer,
4
4
  generateViewerFromJson
5
- } from "./chunk-UV5JQV3R.js";
5
+ } from "./chunk-TXFCEDOC.js";
6
6
  import "./chunk-D2CDBRNU.js";
7
- import "./chunk-QM7SVOGF.js";
7
+ import "./chunk-I34BC3CU.js";
8
8
  import "./chunk-Z7EY4VHE.js";
9
9
  export {
10
10
  generateStaticViewer,
11
11
  generateViewerFromJson
12
12
  };
13
- //# sourceMappingURL=static-viewer-KKCR4KXR.js.map
13
+ //# sourceMappingURL=static-viewer-DUVC4UIM.js.map
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  parseFragmentFile
4
- } from "./chunk-3SOAPJDX.js";
4
+ } from "./chunk-55KERLWL.js";
5
5
  import {
6
6
  discoverFragmentFiles
7
- } from "./chunk-SM674YAS.js";
8
- import "./chunk-QM7SVOGF.js";
7
+ } from "./chunk-ZKTFKHWN.js";
8
+ import "./chunk-I34BC3CU.js";
9
9
  import "./chunk-Z7EY4VHE.js";
10
10
 
11
11
  // src/test/index.ts
@@ -1071,4 +1071,4 @@ export {
1071
1071
  listTests,
1072
1072
  runTestCommand
1073
1073
  };
1074
- //# sourceMappingURL=test-5UCKXYSC.js.map
1074
+ //# sourceMappingURL=test-JW7JIDFG.js.map
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  loadConfig
4
- } from "./chunk-3SOAPJDX.js";
5
- import "./chunk-SM674YAS.js";
4
+ } from "./chunk-55KERLWL.js";
5
+ import "./chunk-ZKTFKHWN.js";
6
6
  import {
7
7
  parseTokenFiles
8
- } from "./chunk-4K7EAQ5L.js";
8
+ } from "./chunk-7K3VROEP.js";
9
9
  import "./chunk-D2CDBRNU.js";
10
10
  import {
11
11
  BRAND
12
- } from "./chunk-QM7SVOGF.js";
12
+ } from "./chunk-I34BC3CU.js";
13
13
  import "./chunk-Z7EY4VHE.js";
14
14
 
15
15
  // src/commands/tokens.ts
@@ -172,4 +172,4 @@ export {
172
172
  tokens_default as default,
173
173
  tokens
174
174
  };
175
- //# sourceMappingURL=tokens-L46MK5AW.js.map
175
+ //# sourceMappingURL=tokens-OPVTVITP.js.map
@@ -5,16 +5,16 @@ import {
5
5
  generatePreviewModule,
6
6
  loadConfig,
7
7
  parseFragmentFile
8
- } from "./chunk-3SOAPJDX.js";
8
+ } from "./chunk-55KERLWL.js";
9
9
  import {
10
10
  discoverFragmentFiles,
11
11
  discoverInstalledFragments
12
- } from "./chunk-SM674YAS.js";
12
+ } from "./chunk-ZKTFKHWN.js";
13
13
  import "./chunk-D2CDBRNU.js";
14
14
  import {
15
15
  BRAND,
16
16
  generateContext
17
- } from "./chunk-QM7SVOGF.js";
17
+ } from "./chunk-I34BC3CU.js";
18
18
  import "./chunk-Z7EY4VHE.js";
19
19
 
20
20
  // src/viewer/server.ts
@@ -373,7 +373,7 @@ var sharedRenderPool = null;
373
373
  var browserPoolModule = null;
374
374
  async function getSharedRenderPool() {
375
375
  if (!browserPoolModule) {
376
- browserPoolModule = await import("./service-MMEKG4MZ.js");
376
+ browserPoolModule = await import("./service-S5LXPKV4.js");
377
377
  }
378
378
  if (!sharedRenderPool) {
379
379
  sharedRenderPool = new browserPoolModule.BrowserPool({
@@ -616,7 +616,7 @@ function fragmentsPlugin(options) {
616
616
  const address = _server.httpServer?.address();
617
617
  const port = typeof address === "object" && address ? address.port : 6006;
618
618
  const renderViewport = viewport || { width: 800, height: 600 };
619
- const { FigmaClient, bufferToBase64Url } = await import("./service-MMEKG4MZ.js");
619
+ const { FigmaClient, bufferToBase64Url } = await import("./service-S5LXPKV4.js");
620
620
  const figmaClient = new FigmaClient({
621
621
  accessToken: figmaToken
622
622
  });
@@ -707,7 +707,7 @@ function fragmentsPlugin(options) {
707
707
  );
708
708
  return;
709
709
  }
710
- const { FigmaClient } = await import("./service-MMEKG4MZ.js");
710
+ const { FigmaClient } = await import("./service-S5LXPKV4.js");
711
711
  const figmaClient = new FigmaClient({ accessToken: figmaToken });
712
712
  const { fileKey, nodeId } = figmaClient.parseUrl(figmaUrl);
713
713
  const figmaDesignProps = await figmaClient.getNodeProperties(
@@ -748,7 +748,7 @@ function fragmentsPlugin(options) {
748
748
  }));
749
749
  return;
750
750
  }
751
- const { getSharedTokenRegistry } = await import("./service-MMEKG4MZ.js");
751
+ const { getSharedTokenRegistry } = await import("./service-S5LXPKV4.js");
752
752
  const registry = getSharedTokenRegistry();
753
753
  if (!registry.isInitialized()) {
754
754
  await registry.initialize(config.tokens, projectRoot);
@@ -808,7 +808,7 @@ function fragmentsPlugin(options) {
808
808
  }));
809
809
  return;
810
810
  }
811
- const { getSharedTokenRegistry } = await import("./service-MMEKG4MZ.js");
811
+ const { getSharedTokenRegistry } = await import("./service-S5LXPKV4.js");
812
812
  const registry = getSharedTokenRegistry();
813
813
  if (!registry.isInitialized()) {
814
814
  await registry.initialize(config.tokens, projectRoot);
@@ -870,7 +870,7 @@ function fragmentsPlugin(options) {
870
870
  res.end(JSON.stringify({ error: "Could not resolve fragment file path" }));
871
871
  return;
872
872
  }
873
- const { getSharedTokenRegistry } = await import("./service-MMEKG4MZ.js");
873
+ const { getSharedTokenRegistry } = await import("./service-S5LXPKV4.js");
874
874
  const registry = getSharedTokenRegistry();
875
875
  if (!registry.isInitialized()) {
876
876
  await registry.initialize(config.tokens, projectRoot);
@@ -1048,7 +1048,7 @@ function fragmentsPlugin(options) {
1048
1048
  }
1049
1049
  if (!config.tokens || !config.tokens.include || config.tokens.include.length === 0) {
1050
1050
  try {
1051
- const { discoverTokenFiles } = await import("./discovery-VSGC76JN.js");
1051
+ const { discoverTokenFiles } = await import("./discovery-VDANZAJ2.js");
1052
1052
  const discovered = await discoverTokenFiles(projectRoot);
1053
1053
  if (discovered.length > 0) {
1054
1054
  config.tokens = {
@@ -1085,7 +1085,7 @@ function fragmentsPlugin(options) {
1085
1085
  const {
1086
1086
  getSharedTokenRegistry,
1087
1087
  generateTokenPatches
1088
- } = await import("./service-MMEKG4MZ.js");
1088
+ } = await import("./service-S5LXPKV4.js");
1089
1089
  const registry = getSharedTokenRegistry();
1090
1090
  if (!registry.isInitialized()) {
1091
1091
  await registry.initialize(config.tokens, projectRoot);
@@ -2194,7 +2194,7 @@ async function loadFullFragmentForCompare(_server, _fragmentFiles, componentName
2194
2194
  }
2195
2195
  }
2196
2196
  async function compareImages(image1Base64, image2Base64, threshold) {
2197
- const { DiffEngine, base64UrlToBuffer, bufferToBase64Url } = await import("./service-MMEKG4MZ.js");
2197
+ const { DiffEngine, base64UrlToBuffer, bufferToBase64Url } = await import("./service-S5LXPKV4.js");
2198
2198
  const { PNG } = await import("pngjs");
2199
2199
  const buffer1 = base64UrlToBuffer(image1Base64);
2200
2200
  const buffer2 = base64UrlToBuffer(image2Base64);
@@ -2727,4 +2727,4 @@ export {
2727
2727
  createDevServer,
2728
2728
  fragmentsPlugin
2729
2729
  };
2730
- //# sourceMappingURL=viewer-M2EQQSGE.js.map
2730
+ //# sourceMappingURL=viewer-OBTEPVY7.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fragments-sdk/cli",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
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",
@@ -80,11 +80,11 @@
80
80
  "vite": "^6.0.0",
81
81
  "vite-plugin-svgr": "^4.5.0",
82
82
  "zod": "^3.24.1",
83
- "@fragments-sdk/context": "0.5.0",
84
- "@fragments-sdk/core": "1.0.0",
85
- "@fragments-sdk/viewer": "0.2.4",
86
- "@fragments-sdk/webmcp": "2.0.0",
87
- "@fragments-sdk/govern": "^0.2.0"
83
+ "@fragments-sdk/context": "0.5.1",
84
+ "@fragments-sdk/viewer": "0.2.5",
85
+ "@fragments-sdk/govern": "^0.2.1",
86
+ "@fragments-sdk/core": "1.0.1",
87
+ "@fragments-sdk/webmcp": "2.0.1"
88
88
  },
89
89
  "devDependencies": {
90
90
  "@types/babel__generator": "^7.6.8",