@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.
- package/README.md +34 -70
- package/dist/commands/dev.d.ts +4 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +143 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/implement.d.ts.map +1 -1
- package/dist/commands/implement.js +56 -16
- package/dist/commands/implement.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +76 -37
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +36 -0
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +144 -60
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +29 -251
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/action-tools.d.ts.map +1 -1
- package/dist/mcp/tools/action-tools.js +192 -4
- package/dist/mcp/tools/action-tools.js.map +1 -1
- package/dist/mcp/tools/governance-tools.d.ts.map +1 -1
- package/dist/mcp/tools/governance-tools.js +290 -0
- package/dist/mcp/tools/governance-tools.js.map +1 -1
- package/dist/mcp/tools/info-tools.d.ts.map +1 -1
- package/dist/mcp/tools/info-tools.js +142 -1
- package/dist/mcp/tools/info-tools.js.map +1 -1
- package/dist/mcp/tools/setup-mcp-tool.d.ts +22 -0
- package/dist/mcp/tools/setup-mcp-tool.d.ts.map +1 -0
- package/dist/mcp/tools/setup-mcp-tool.js +150 -0
- package/dist/mcp/tools/setup-mcp-tool.js.map +1 -0
- package/dist/mcp/tools/verify-tool.d.ts.map +1 -1
- package/dist/mcp/tools/verify-tool.js +71 -3
- package/dist/mcp/tools/verify-tool.js.map +1 -1
- package/dist/verify/run-verify.d.ts +16 -0
- package/dist/verify/run-verify.d.ts.map +1 -0
- package/dist/verify/run-verify.js +217 -0
- package/dist/verify/run-verify.js.map +1 -0
- 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;
|
|
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("
|
|
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
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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.
|
|
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.
|
|
28
|
-
"@calibrate-ds/
|
|
29
|
-
"@calibrate-ds/
|
|
30
|
-
"@calibrate-ds/
|
|
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",
|