@calibrate-ds/cli 0.1.12 → 0.1.14

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 (45) hide show
  1. package/README.md +34 -70
  2. package/dist/commands/dev.d.ts +4 -0
  3. package/dist/commands/dev.d.ts.map +1 -0
  4. package/dist/commands/dev.js +143 -0
  5. package/dist/commands/dev.js.map +1 -0
  6. package/dist/commands/implement.d.ts.map +1 -1
  7. package/dist/commands/implement.js +56 -16
  8. package/dist/commands/implement.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +76 -37
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/mcp.d.ts +1 -0
  13. package/dist/commands/mcp.d.ts.map +1 -1
  14. package/dist/commands/mcp.js +36 -0
  15. package/dist/commands/mcp.js.map +1 -1
  16. package/dist/commands/status.d.ts +1 -0
  17. package/dist/commands/status.d.ts.map +1 -1
  18. package/dist/commands/status.js +144 -60
  19. package/dist/commands/status.js.map +1 -1
  20. package/dist/commands/verify.d.ts.map +1 -1
  21. package/dist/commands/verify.js +29 -251
  22. package/dist/commands/verify.js.map +1 -1
  23. package/dist/index.js +16 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/tools/action-tools.d.ts.map +1 -1
  26. package/dist/mcp/tools/action-tools.js +192 -4
  27. package/dist/mcp/tools/action-tools.js.map +1 -1
  28. package/dist/mcp/tools/governance-tools.d.ts.map +1 -1
  29. package/dist/mcp/tools/governance-tools.js +290 -0
  30. package/dist/mcp/tools/governance-tools.js.map +1 -1
  31. package/dist/mcp/tools/info-tools.d.ts.map +1 -1
  32. package/dist/mcp/tools/info-tools.js +142 -1
  33. package/dist/mcp/tools/info-tools.js.map +1 -1
  34. package/dist/mcp/tools/setup-mcp-tool.d.ts +22 -0
  35. package/dist/mcp/tools/setup-mcp-tool.d.ts.map +1 -0
  36. package/dist/mcp/tools/setup-mcp-tool.js +150 -0
  37. package/dist/mcp/tools/setup-mcp-tool.js.map +1 -0
  38. package/dist/mcp/tools/verify-tool.d.ts.map +1 -1
  39. package/dist/mcp/tools/verify-tool.js +71 -3
  40. package/dist/mcp/tools/verify-tool.js.map +1 -1
  41. package/dist/verify/run-verify.d.ts +16 -0
  42. package/dist/verify/run-verify.d.ts.map +1 -0
  43. package/dist/verify/run-verify.js +217 -0
  44. package/dist/verify/run-verify.js.map +1 -0
  45. package/package.json +5 -5
@@ -0,0 +1,150 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ import { z } from "zod";
5
+ const HOME = os.homedir();
6
+ export const VALID_IDE_IDS = ["claude-code", "cursor", "windsurf", "antigravity", "vscode"];
7
+ const IDES = {
8
+ "claude-code": {
9
+ label: "Claude Code",
10
+ configFilePath: () => path.join(HOME, ".claude", "mcp.json"),
11
+ buildEntry: (cwd) => ({ command: "ptb", args: ["mcp", "--cwd", cwd] }),
12
+ mergeKey: "mcpServers",
13
+ detectionPath: () => path.join(HOME, ".claude"),
14
+ },
15
+ "cursor": {
16
+ label: "Cursor",
17
+ configFilePath: () => path.join(HOME, ".cursor", "mcp.json"),
18
+ buildEntry: (cwd) => ({ command: "ptb", args: ["mcp", "--cwd", cwd] }),
19
+ mergeKey: "mcpServers",
20
+ detectionPath: () => path.join(HOME, ".cursor"),
21
+ },
22
+ "windsurf": {
23
+ label: "Windsurf",
24
+ configFilePath: () => path.join(HOME, ".codeium", "windsurf", "mcp_config.json"),
25
+ buildEntry: (cwd) => ({ command: "ptb", args: ["mcp", "--cwd", cwd] }),
26
+ mergeKey: "mcpServers",
27
+ detectionPath: () => path.join(HOME, ".codeium", "windsurf"),
28
+ },
29
+ "antigravity": {
30
+ label: "Gemini / Antigravity",
31
+ configFilePath: () => path.join(HOME, ".gemini", "antigravity", "mcp_config.json"),
32
+ buildEntry: (cwd) => ({ command: "ptb", args: ["mcp", "--cwd", cwd] }),
33
+ mergeKey: "mcpServers",
34
+ detectionPath: () => path.join(HOME, ".gemini", "antigravity"),
35
+ },
36
+ "vscode": {
37
+ label: "VS Code (GitHub Copilot)",
38
+ configFilePath: (workspaceRoot) => path.join(workspaceRoot, ".vscode", "mcp.json"),
39
+ buildEntry: () => ({
40
+ type: "stdio",
41
+ command: "ptb",
42
+ args: ["mcp", "--cwd", "${workspaceFolder}"],
43
+ }),
44
+ mergeKey: "servers",
45
+ detectionPath: (workspaceRoot) => path.join(workspaceRoot, ".vscode"),
46
+ },
47
+ };
48
+ async function pathExists(p) {
49
+ return fs.access(p).then(() => true).catch(() => false);
50
+ }
51
+ export async function detectInstalledIDEs(workspaceRoot) {
52
+ const detected = [];
53
+ for (const [id, def] of Object.entries(IDES)) {
54
+ if (await pathExists(def.detectionPath(workspaceRoot))) {
55
+ detected.push(id);
56
+ }
57
+ }
58
+ return detected;
59
+ }
60
+ export async function setupIde(ide, workspaceRoot) {
61
+ const def = IDES[ide];
62
+ const filePath = def.configFilePath(workspaceRoot);
63
+ const entry = def.buildEntry(workspaceRoot);
64
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
65
+ let existing = {};
66
+ let action = "created";
67
+ try {
68
+ existing = JSON.parse(await fs.readFile(filePath, "utf-8"));
69
+ action = "updated";
70
+ }
71
+ catch { /* new file */ }
72
+ existing[def.mergeKey] = existing[def.mergeKey] ?? {};
73
+ existing[def.mergeKey]["ptb"] = entry;
74
+ await fs.writeFile(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
75
+ return { ide, label: def.label, filePath, action };
76
+ }
77
+ export async function runMcpSetup(workspaceRoot, ides) {
78
+ const targets = ides ?? await detectInstalledIDEs(workspaceRoot);
79
+ const result = { configured: [], errors: [] };
80
+ for (const ide of targets) {
81
+ try {
82
+ result.configured.push(await setupIde(ide, workspaceRoot));
83
+ }
84
+ catch (e) {
85
+ result.errors.push({ ide, label: IDES[ide].label, error: e.message });
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ export const setupMcpTool = {
91
+ name: "setup-mcp",
92
+ register(server, getContext) {
93
+ server.tool("setup_mcp", `Configure the PTB MCP server for one or more AI IDEs.
94
+
95
+ Writes (or merges into) the MCP config file for each IDE using this project as the workspace.
96
+ Auto-detects installed IDEs when no ide is specified.
97
+
98
+ For Cursor, Windsurf, Antigravity, and Claude Code (user-level), writes to a global user config
99
+ and supports one active PTB project at a time — re-running replaces the previous project path.
100
+ For VS Code, writes to .vscode/mcp.json at the project root (committed with the repo).
101
+
102
+ After this tool runs, restart the target IDE to pick up the new config.
103
+
104
+ Supported: claude-code, cursor, windsurf, antigravity, vscode`, {
105
+ ide: z.enum(["claude-code", "cursor", "windsurf", "antigravity", "vscode", "all"])
106
+ .optional()
107
+ .describe("Which IDE to configure. Omit to auto-detect all installed IDEs."),
108
+ }, async ({ ide }) => {
109
+ let ctx;
110
+ try {
111
+ ctx = await getContext();
112
+ }
113
+ catch (e) {
114
+ return { content: [{ type: "text", text: e.message }] };
115
+ }
116
+ try {
117
+ const targets = !ide || ide === "all"
118
+ ? undefined
119
+ : [ide];
120
+ const result = await runMcpSetup(ctx.workspaceRoot, targets);
121
+ const lines = [];
122
+ if (result.configured.length > 0) {
123
+ lines.push("MCP configured:\n");
124
+ for (const entry of result.configured) {
125
+ const verb = entry.action === "created" ? "Created" : "Updated";
126
+ lines.push(` ${verb}: ${entry.label}`);
127
+ lines.push(` File: ${entry.filePath}\n`);
128
+ }
129
+ lines.push("Restart each IDE to pick up the new config.");
130
+ }
131
+ if (result.errors.length > 0) {
132
+ if (lines.length)
133
+ lines.push("");
134
+ lines.push("Errors:");
135
+ for (const e of result.errors) {
136
+ lines.push(` ${e.label}: ${e.error}`);
137
+ }
138
+ }
139
+ if (result.configured.length === 0 && result.errors.length === 0) {
140
+ lines.push("No IDEs detected automatically.", "Pass the 'ide' parameter to configure a specific one.", "Supported: claude-code, cursor, windsurf, antigravity, vscode");
141
+ }
142
+ return { content: [{ type: "text", text: lines.join("\n") }] };
143
+ }
144
+ catch (e) {
145
+ return { content: [{ type: "text", text: `setup_mcp failed: ${e.message}` }] };
146
+ }
147
+ });
148
+ },
149
+ };
150
+ //# sourceMappingURL=setup-mcp-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-mcp-tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/setup-mcp-tool.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify-tool.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/verify-tool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,gBAAgB,CAAC;AAO/D,eAAO,MAAM,UAAU,EAAE,YA8ExB,CAAC"}
1
+ {"version":3,"file":"verify-tool.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/verify-tool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,gBAAgB,CAAC;AAgB/D,eAAO,MAAM,UAAU,EAAE,YAkJxB,CAAC"}
@@ -1,13 +1,81 @@
1
1
  import * as fs from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { z } from "zod";
4
+ import { runVerify } from "../../verify/run-verify.js";
4
5
  function toSlug(name) {
5
6
  return name.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
6
7
  }
8
+ function findComponent(snapshot, query) {
9
+ const q = query.toLowerCase();
10
+ const slug = toSlug(query);
11
+ return snapshot.components.find((c) => c.name.toLowerCase() === q || toSlug(c.name) === slug || c.id === query);
12
+ }
7
13
  export const verifyTool = {
8
14
  name: "verify",
9
15
  register(server, getContext) {
10
- server.tool("get_verify_report", "Retrieve the latest visual verification report for a component. Shows pixel match score, AI-detected visual differences, and paths to screenshots. Run 'ptb verify component <name>' first to generate or refresh the report.", { name: z.string().describe("Component name, e.g. 'Button'") }, async ({ name }) => {
16
+ server.tool("run_verify", `Run a visual verification check for a component compares the Figma design to the browser-rendered implementation.
17
+
18
+ Steps performed:
19
+ 1. Fetches a PNG screenshot from Figma via the Images API (requires FIGMA_ACCESS_TOKEN in env)
20
+ 2. Screenshots the component's Storybook story using Playwright (auto-detects localhost:6006–6008)
21
+ 3. Runs a pixel-by-pixel diff (pixelmatch) and returns a match score (0–1)
22
+ 4. Sends both images to Claude Haiku for structured AI visual feedback (requires ANTHROPIC_API_KEY)
23
+
24
+ Storybook must be running for the implementation screenshot step. If it isn't, pass an explicit implScreenshot path instead.
25
+
26
+ Returns: pixel match score, AI assessment ("matches" / "minor-differences" / "significant-differences"), and a list of specific visual differences with property/expected/observed fields.`, {
27
+ name: z.string().describe("Component name to verify, e.g. 'Button'"),
28
+ storybookUrl: z.string().optional().describe("Storybook base URL if not on default port, e.g. 'http://localhost:6007'"),
29
+ implScreenshot: z.string().optional().describe("Path to an existing implementation screenshot to use instead of Playwright"),
30
+ noAi: z.boolean().optional().describe("Skip the Claude Haiku visual feedback step"),
31
+ }, async ({ name, storybookUrl, implScreenshot, noAi }) => {
32
+ let ctx;
33
+ try {
34
+ ctx = await getContext();
35
+ }
36
+ catch (e) {
37
+ return { content: [{ type: "text", text: e.message }] };
38
+ }
39
+ const component = findComponent(ctx.snapshot, name);
40
+ if (!component) {
41
+ const available = ctx.snapshot.components.map((c) => c.name).slice(0, 15).join(", ");
42
+ return { content: [{ type: "text", text: `Component '${name}' not found.\nAvailable (first 15): ${available}` }] };
43
+ }
44
+ try {
45
+ const result = await runVerify(component, ctx.config, ctx.snapshot, {
46
+ storybookUrl,
47
+ implScreenshot,
48
+ noAi,
49
+ });
50
+ const score = result.pixelMatch?.score ?? null;
51
+ const passFail = score === null
52
+ ? "no-comparison"
53
+ : score >= 0.95 ? "pass"
54
+ : score >= 0.80 ? "warn"
55
+ : "fail";
56
+ return {
57
+ content: [{
58
+ type: "text",
59
+ text: JSON.stringify({
60
+ component: result.componentName,
61
+ checkedAt: result.checkedAt,
62
+ passFail,
63
+ pixelMatchScore: score,
64
+ diffPixels: result.pixelMatch?.diffPixels ?? null,
65
+ assessment: result.aiFeedback?.overallAssessment ?? null,
66
+ summary: result.aiFeedback?.summary ?? null,
67
+ differences: result.aiFeedback?.differences ?? [],
68
+ screenshots: result.screenshots,
69
+ warnings: result.warnings,
70
+ }, null, 2),
71
+ }],
72
+ };
73
+ }
74
+ catch (e) {
75
+ return { content: [{ type: "text", text: `run_verify failed: ${e.message}` }] };
76
+ }
77
+ });
78
+ server.tool("get_verify_report", "Retrieve the latest visual verification report for a component. Shows pixel match score, AI-detected visual differences, and paths to screenshots. Run run_verify or 'ptb verify component <name>' first to generate or refresh the report.", { name: z.string().describe("Component name, e.g. 'Button'") }, async ({ name }) => {
11
79
  let ctx;
12
80
  try {
13
81
  ctx = await getContext();
@@ -35,7 +103,7 @@ export const verifyTool = {
35
103
  return {
36
104
  content: [{
37
105
  type: "text",
38
- text: `No verify report found for '${name}'.\nRun: ptb verify component ${name}`,
106
+ text: `No verify report found for '${name}'.\nRun: run_verify or ptb verify component ${name}`,
39
107
  }],
40
108
  };
41
109
  }
@@ -54,7 +122,7 @@ export const verifyTool = {
54
122
  slugDirs = await fs.readdir(verifyDir);
55
123
  }
56
124
  catch {
57
- return { content: [{ type: "text", text: "No verify reports found. Run 'ptb verify component <name>' to generate one." }] };
125
+ return { content: [{ type: "text", text: "No verify reports found. Run run_verify to generate one." }] };
58
126
  }
59
127
  const reports = [];
60
128
  for (const slug of slugDirs) {
@@ -1 +1 @@
1
- {"version":3,"file":"verify-tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/verify-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-tool.js","sourceRoot":"","sources":["../../../src/mcp/tools/verify-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PTBConfig, ComponentDefinition, DesignSystemModel } from "@calibrate-ds/shared-types";
2
+ import type { VerifyReport } from "@calibrate-ds/core";
3
+ export type RunVerifyOptions = {
4
+ storybookUrl?: string;
5
+ implScreenshot?: string;
6
+ noAi?: boolean;
7
+ };
8
+ export type RunVerifyResult = VerifyReport & {
9
+ warnings: string[];
10
+ };
11
+ /**
12
+ * Runs the full verify pipeline for a component.
13
+ * Returns a VerifyReport plus a warnings array (no console output).
14
+ */
15
+ export declare function runVerify(component: ComponentDefinition, config: PTBConfig, snapshot: DesignSystemModel, options?: RunVerifyOptions): Promise<RunVerifyResult>;
16
+ //# sourceMappingURL=run-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-verify.d.ts","sourceRoot":"","sources":["../../src/verify/run-verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAWpG,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAwHF;;;GAGG;AACH,wBAAsB,SAAS,CAC3B,SAAS,EAAE,mBAAmB,EAC9B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAkH1B"}
@@ -0,0 +1,217 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { fetchFigmaScreenshot, runPixelDiff, getComponentContext, loadManifest, resolveDSPaths, createNamingStrategy, isIconComponent, normalizeIconDisplayName, } from "@calibrate-ds/core";
4
+ function buildStorybookIframeUrl(baseUrl, title, story = "Default") {
5
+ const titleSlug = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
6
+ const storySlug = story.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
7
+ return `${baseUrl}/iframe.html?id=${titleSlug}--${storySlug}&viewMode=story`;
8
+ }
9
+ async function isReachable(url) {
10
+ try {
11
+ const res = await fetch(url, { method: "HEAD", signal: AbortSignal.timeout(2000) });
12
+ return res.ok;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function screenshotWithPlaywright(iframeUrl, outputPath, width, height) {
19
+ try {
20
+ const { chromium } = await import("playwright");
21
+ const browser = await chromium.launch({ args: ["--no-sandbox"] });
22
+ const page = await browser.newPage();
23
+ const viewW = Math.max(width + 80, 320);
24
+ const viewH = Math.max(height + 80, 200);
25
+ await page.setViewportSize({ width: viewW, height: viewH });
26
+ await page.goto(iframeUrl, { waitUntil: "networkidle", timeout: 20_000 });
27
+ await page.waitForTimeout(500);
28
+ const box = await page.evaluate(() => {
29
+ const el = document.querySelector("#storybook-root > *");
30
+ if (!el)
31
+ return null;
32
+ const r = el.getBoundingClientRect();
33
+ return { x: r.left, y: r.top, width: r.width, height: r.height };
34
+ });
35
+ await fs.mkdir(path.dirname(outputPath), { recursive: true });
36
+ if (box && box.width > 0 && box.height > 0) {
37
+ await page.screenshot({
38
+ path: outputPath,
39
+ clip: { x: Math.max(0, box.x), y: Math.max(0, box.y), width: box.width, height: box.height },
40
+ });
41
+ }
42
+ else {
43
+ await page.screenshot({
44
+ path: outputPath,
45
+ clip: { x: 0, y: 0, width, height },
46
+ });
47
+ }
48
+ await browser.close();
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ async function getAIFeedback(figmaPath, implPath, componentName) {
56
+ const apiKey = process.env.ANTHROPIC_API_KEY;
57
+ if (!apiKey)
58
+ return null;
59
+ try {
60
+ const Anthropic = (await import("@anthropic-ai/sdk")).default;
61
+ const client = new Anthropic({ apiKey });
62
+ const figmaData = (await fs.readFile(figmaPath)).toString("base64");
63
+ const implData = (await fs.readFile(implPath)).toString("base64");
64
+ const response = await client.messages.create({
65
+ model: "claude-haiku-4-5-20251001",
66
+ max_tokens: 1024,
67
+ messages: [{
68
+ role: "user",
69
+ content: [
70
+ {
71
+ type: "text",
72
+ text: `You are a design QA reviewer comparing a Figma design to its React implementation for the "${componentName}" component.
73
+
74
+ The FIRST image is the Figma design (source of truth).
75
+ The SECOND image is the browser-rendered React implementation.
76
+
77
+ List every visual difference you see. For each difference state:
78
+ - property: what CSS/layout property is wrong (e.g. "padding", "border-radius", "font-size", "color", "gap", "alignment")
79
+ - expected: what the Figma design shows
80
+ - observed: what the implementation shows
81
+
82
+ Then give an overall assessment: "matches" (≥95% identical), "minor-differences" (small spacing/color deviations), or "significant-differences" (structural layout or major style errors).
83
+
84
+ Respond ONLY with valid JSON in this exact shape:
85
+ {
86
+ "summary": "one-sentence summary",
87
+ "differences": [{ "property": "...", "expected": "...", "observed": "..." }],
88
+ "overallAssessment": "matches" | "minor-differences" | "significant-differences"
89
+ }`,
90
+ },
91
+ { type: "image", source: { type: "base64", media_type: "image/png", data: figmaData } },
92
+ { type: "image", source: { type: "base64", media_type: "image/png", data: implData } },
93
+ ],
94
+ }],
95
+ });
96
+ const text = response.content[0].type === "text" ? response.content[0].text : "";
97
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
98
+ if (!jsonMatch)
99
+ return null;
100
+ return JSON.parse(jsonMatch[0]);
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * Runs the full verify pipeline for a component.
108
+ * Returns a VerifyReport plus a warnings array (no console output).
109
+ */
110
+ export async function runVerify(component, config, snapshot, options = {}) {
111
+ const warnings = [];
112
+ const naming = createNamingStrategy(config.naming);
113
+ const normalizedName = isIconComponent(component.name)
114
+ ? normalizeIconDisplayName(component.name)
115
+ : component.name;
116
+ const codeName = naming.formatComponentName(normalizedName);
117
+ const slug = component.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
118
+ const { metadataDir } = resolveDSPaths(config);
119
+ const verifyDir = path.join(metadataDir, "verify", slug);
120
+ await fs.mkdir(verifyDir, { recursive: true });
121
+ const report = {
122
+ componentName: component.name,
123
+ slug,
124
+ checkedAt: new Date().toISOString(),
125
+ figmaNodeId: component.designToolNodeId ?? null,
126
+ screenshots: { figma: null, impl: null, diff: null },
127
+ pixelMatch: null,
128
+ aiFeedback: null,
129
+ };
130
+ // Step 1: Figma screenshot
131
+ const figmaPath = report.figmaNodeId
132
+ ? await fetchFigmaScreenshot(report.figmaNodeId, slug, config)
133
+ : null;
134
+ if (figmaPath) {
135
+ report.screenshots.figma = path.relative(process.cwd(), figmaPath);
136
+ }
137
+ else {
138
+ warnings.push("Figma screenshot unavailable — check FIGMA_ACCESS_TOKEN and component node ID.");
139
+ }
140
+ // Step 2: Implementation screenshot
141
+ let implPath = null;
142
+ if (options.implScreenshot) {
143
+ implPath = path.resolve(options.implScreenshot);
144
+ }
145
+ else {
146
+ const compWidth = component.size?.width?.rawValue ?? 400;
147
+ const compHeight = component.size?.height?.rawValue ?? 300;
148
+ const sbPorts = [6006, 6007, 6008];
149
+ const sbBaseUrl = options.storybookUrl
150
+ ?? await (async () => {
151
+ for (const port of sbPorts) {
152
+ const base = `http://localhost:${port}`;
153
+ if (await isReachable(base))
154
+ return base;
155
+ }
156
+ return null;
157
+ })();
158
+ if (sbBaseUrl) {
159
+ const manifest = await loadManifest(config).catch(() => ({ components: {} }));
160
+ const context = await getComponentContext(component.id, snapshot, config, manifest);
161
+ const category = context
162
+ ? (context.component.categoryPath
163
+ ? `${context.component.categoryPath}/${codeName}`
164
+ : `Components/${codeName}`)
165
+ : `Components/${codeName}`;
166
+ const iframeUrl = buildStorybookIframeUrl(sbBaseUrl, category);
167
+ const implOut = path.join(verifyDir, "impl.png");
168
+ const ok = await screenshotWithPlaywright(iframeUrl, implOut, compWidth, compHeight);
169
+ if (ok) {
170
+ implPath = implOut;
171
+ report.screenshots.impl = path.relative(process.cwd(), implOut);
172
+ }
173
+ else {
174
+ warnings.push("Playwright not available — install with: pnpm add -D playwright && pnpx playwright install chromium");
175
+ }
176
+ }
177
+ else {
178
+ warnings.push("Storybook not detected on ports 6006–6008. Start Storybook or pass storybookUrl / implScreenshot.");
179
+ }
180
+ }
181
+ if (implPath) {
182
+ try {
183
+ await fs.access(implPath);
184
+ if (!report.screenshots.impl) {
185
+ report.screenshots.impl = path.relative(process.cwd(), implPath);
186
+ }
187
+ }
188
+ catch {
189
+ implPath = null;
190
+ warnings.push("Provided implScreenshot path not found.");
191
+ }
192
+ }
193
+ // Step 3: Pixel diff
194
+ if (figmaPath && implPath) {
195
+ const diffOut = path.join(verifyDir, "diff.png");
196
+ const result = await runPixelDiff(figmaPath, implPath, diffOut);
197
+ if (result) {
198
+ report.pixelMatch = result;
199
+ report.screenshots.diff = path.relative(process.cwd(), diffOut);
200
+ }
201
+ }
202
+ // Step 4: AI visual feedback
203
+ if (figmaPath && implPath && !options.noAi) {
204
+ const feedback = await getAIFeedback(figmaPath, implPath, component.name);
205
+ if (feedback) {
206
+ report.aiFeedback = feedback;
207
+ }
208
+ else {
209
+ warnings.push("AI feedback skipped — set ANTHROPIC_API_KEY to enable.");
210
+ }
211
+ }
212
+ // Persist report
213
+ const reportPath = path.join(verifyDir, "report.json");
214
+ await fs.writeFile(reportPath, JSON.stringify(report, null, 2), "utf-8");
215
+ return { ...report, warnings };
216
+ }
217
+ //# sourceMappingURL=run-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-verify.js","sourceRoot":"","sources":["../../src/verify/run-verify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calibrate-ds/cli",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,10 +24,10 @@
24
24
  "commander": "^14.0.3",
25
25
  "openai": "^6.34.0",
26
26
  "zod": "^4.3.6",
27
- "@calibrate-ds/core": "^0.1.12",
28
- "@calibrate-ds/figma-client": "^0.1.12",
29
- "@calibrate-ds/generator-react": "^0.1.12",
30
- "@calibrate-ds/shared-types": "^0.1.12"
27
+ "@calibrate-ds/core": "^0.1.14",
28
+ "@calibrate-ds/shared-types": "^0.1.14",
29
+ "@calibrate-ds/figma-client": "^0.1.14",
30
+ "@calibrate-ds/generator-react": "^0.1.14"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^22.13.5",