codeloop-mcp-server 0.1.11 → 0.1.12
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/dist/index.js +76 -27
- package/dist/index.js.map +1 -1
- package/dist/runners/figma_fetcher.d.ts +48 -0
- package/dist/runners/figma_fetcher.d.ts.map +1 -0
- package/dist/runners/figma_fetcher.js +149 -0
- package/dist/runners/figma_fetcher.js.map +1 -0
- package/dist/tools/design_compare.d.ts +51 -3
- package/dist/tools/design_compare.d.ts.map +1 -1
- package/dist/tools/design_compare.js +407 -76
- package/dist/tools/design_compare.js.map +1 -1
- package/dist/tools/gate_check.d.ts.map +1 -1
- package/dist/tools/gate_check.js +55 -2
- package/dist/tools/gate_check.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +31 -3
- package/dist/tools/verify.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { join, resolve } from "path";
|
|
3
|
+
const FIGMA_API_BASE = "https://api.figma.com/v1";
|
|
4
|
+
export function parseFigmaFileKey(input) {
|
|
5
|
+
if (!input)
|
|
6
|
+
return null;
|
|
7
|
+
if (!input.includes("/") && !input.includes("?"))
|
|
8
|
+
return input;
|
|
9
|
+
const match = input.match(/\/(?:file|design)\/([A-Za-z0-9]+)/);
|
|
10
|
+
return match ? match[1] : null;
|
|
11
|
+
}
|
|
12
|
+
export function loadFigmaConfig(cwd) {
|
|
13
|
+
const configPath = join(cwd, ".codeloop", "figma.json");
|
|
14
|
+
if (!existsSync(configPath))
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
if (!parsed || !Array.isArray(parsed.frames))
|
|
20
|
+
return null;
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function resolveFigmaToken(config) {
|
|
28
|
+
if (config?.token)
|
|
29
|
+
return config.token;
|
|
30
|
+
const envName = config?.token_env || "FIGMA_API_TOKEN";
|
|
31
|
+
return process.env[envName] || process.env.FIGMA_API_TOKEN || undefined;
|
|
32
|
+
}
|
|
33
|
+
export async function fetchFigmaFrames(opts) {
|
|
34
|
+
const errors = [];
|
|
35
|
+
const fetched = [];
|
|
36
|
+
if (!opts.token) {
|
|
37
|
+
errors.push("Missing Figma token. Set FIGMA_API_TOKEN env var or add `token` to .codeloop/figma.json.");
|
|
38
|
+
return { fetched, errors, source: "figma" };
|
|
39
|
+
}
|
|
40
|
+
const fileKey = opts.fileKey || (opts.fileUrl ? parseFigmaFileKey(opts.fileUrl) : null);
|
|
41
|
+
if (!fileKey) {
|
|
42
|
+
errors.push("Missing Figma file key. Provide --file <figma-url> or set file_key in .codeloop/figma.json.");
|
|
43
|
+
return { fetched, errors, source: "figma" };
|
|
44
|
+
}
|
|
45
|
+
const frames = opts.frames || [];
|
|
46
|
+
if (frames.length === 0) {
|
|
47
|
+
errors.push("No frames listed. Add `frames: [{ node_id, screen_name, scales }]` to .codeloop/figma.json.");
|
|
48
|
+
return { fetched, errors, source: "figma" };
|
|
49
|
+
}
|
|
50
|
+
mkdirSync(opts.outDir, { recursive: true });
|
|
51
|
+
// Group frames by scale to minimize API calls.
|
|
52
|
+
const byScale = new Map();
|
|
53
|
+
for (const frame of frames) {
|
|
54
|
+
const scales = frame.scales && frame.scales.length > 0 ? frame.scales : [2];
|
|
55
|
+
for (const scale of scales) {
|
|
56
|
+
const list = byScale.get(scale) || [];
|
|
57
|
+
list.push(frame);
|
|
58
|
+
byScale.set(scale, list);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const [scale, group] of byScale.entries()) {
|
|
62
|
+
const ids = group.map((f) => f.node_id).join(",");
|
|
63
|
+
const format = group[0].format || "png";
|
|
64
|
+
const url = `${FIGMA_API_BASE}/images/${fileKey}?ids=${encodeURIComponent(ids)}&format=${format}&scale=${scale}`;
|
|
65
|
+
let response;
|
|
66
|
+
try {
|
|
67
|
+
response = await fetch(url, {
|
|
68
|
+
headers: { "X-Figma-Token": opts.token },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
errors.push(`Network error contacting Figma at scale ${scale}: ${err.message}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
errors.push(`Figma API ${response.status} ${response.statusText} for scale ${scale}.`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
let payload;
|
|
80
|
+
try {
|
|
81
|
+
payload = (await response.json());
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
errors.push(`Malformed JSON from Figma at scale ${scale}: ${err.message}`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (payload.err) {
|
|
88
|
+
errors.push(`Figma error for scale ${scale}: ${payload.err}`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const images = payload.images || {};
|
|
92
|
+
for (const frame of group) {
|
|
93
|
+
const imgUrl = images[frame.node_id];
|
|
94
|
+
if (!imgUrl) {
|
|
95
|
+
errors.push(`No image returned for node ${frame.node_id} (${frame.screen_name}) at scale ${scale}.`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const fileName = scale === 1
|
|
99
|
+
? `${frame.screen_name}.${format}`
|
|
100
|
+
: `${frame.screen_name}@${scale}x.${format}`;
|
|
101
|
+
const outPath = join(opts.outDir, fileName);
|
|
102
|
+
try {
|
|
103
|
+
const imgResp = await fetch(imgUrl);
|
|
104
|
+
if (!imgResp.ok) {
|
|
105
|
+
errors.push(`Failed to download ${frame.screen_name}@${scale}x: HTTP ${imgResp.status}.`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const buf = Buffer.from(await imgResp.arrayBuffer());
|
|
109
|
+
writeFileSync(outPath, buf);
|
|
110
|
+
fetched.push({
|
|
111
|
+
node_id: frame.node_id,
|
|
112
|
+
screen_name: frame.screen_name,
|
|
113
|
+
scale,
|
|
114
|
+
path: outPath,
|
|
115
|
+
viewport: frame.viewport,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
errors.push(`Download error for ${frame.screen_name}@${scale}x: ${err.message}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { fetched, errors, source: "figma" };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Convenience helper: read `.codeloop/figma.json`, resolve token, fetch all
|
|
127
|
+
* configured frames into `<cwd>/designs/`. Used by the CLI and by
|
|
128
|
+
* `runDesignCompareAll` when a Figma config is present.
|
|
129
|
+
*/
|
|
130
|
+
export async function syncFigmaDesigns(cwd, overrideOutDir) {
|
|
131
|
+
const config = loadFigmaConfig(cwd);
|
|
132
|
+
if (!config) {
|
|
133
|
+
return {
|
|
134
|
+
fetched: [],
|
|
135
|
+
errors: ["No .codeloop/figma.json found — skipping Figma sync."],
|
|
136
|
+
source: "figma",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const token = resolveFigmaToken(config);
|
|
140
|
+
const outDir = resolve(cwd, overrideOutDir || "designs");
|
|
141
|
+
return fetchFigmaFrames({
|
|
142
|
+
outDir,
|
|
143
|
+
fileKey: config.file_key,
|
|
144
|
+
fileUrl: config.file_url,
|
|
145
|
+
token,
|
|
146
|
+
frames: config.frames,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=figma_fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma_fetcher.js","sourceRoot":"","sources":["../../src/runners/figma_fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DesignCompareInput, DesignCompareOutput } from "@codelooptech/shared";
|
|
1
|
+
import type { DesignCompareInput, DesignCompareOutput, PerScreenResult } from "@codelooptech/shared";
|
|
2
2
|
import type { CodeLoopConfig } from "@codelooptech/shared";
|
|
3
3
|
export interface DesignCompareResult {
|
|
4
4
|
output: DesignCompareOutput;
|
|
@@ -8,10 +8,58 @@ export interface DesignCompareResult {
|
|
|
8
8
|
diff?: string;
|
|
9
9
|
};
|
|
10
10
|
uxChecklist?: string;
|
|
11
|
+
/** All per-screen results (for multi-screen / multi-viewport mode). Empty in single mode. */
|
|
12
|
+
perScreen: PerScreenResult[];
|
|
13
|
+
source: "files" | "figma" | "mixed";
|
|
11
14
|
}
|
|
15
|
+
interface ReferenceFile {
|
|
16
|
+
path: string;
|
|
17
|
+
screenName: string;
|
|
18
|
+
viewport?: string;
|
|
19
|
+
scale?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Detects whether the project has any design references that should drive
|
|
23
|
+
* the design_compare loop. Used by gate_check and verify auto-trigger.
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasDesignReferences(cwd: string, designsDir?: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Walks `designs/` (and one level of subdirs treated as viewports) and returns
|
|
28
|
+
* every reference image with its derived screen_name and optional viewport.
|
|
29
|
+
*
|
|
30
|
+
* Conventions:
|
|
31
|
+
* - `designs/home.png` -> screen=home
|
|
32
|
+
* - `designs/home@2x.png` -> screen=home, scale=2
|
|
33
|
+
* - `designs/mobile/home.png` -> screen=home, viewport=mobile
|
|
34
|
+
* - `designs/desktop/home@1x.png` -> screen=home, viewport=desktop, scale=1
|
|
35
|
+
*/
|
|
36
|
+
export declare function listReferenceFiles(cwd: string, designsDir?: string): ReferenceFile[];
|
|
12
37
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
38
|
+
* Single-screen comparison (legacy entry point preserved for the existing
|
|
39
|
+
* `runDesignCompare` MCP tool signature).
|
|
15
40
|
*/
|
|
16
41
|
export declare function runDesignCompare(input: DesignCompareInput, config: CodeLoopConfig, cwd?: string): Promise<DesignCompareResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Multi-screen / multi-viewport comparison. Auto-discovers references in
|
|
44
|
+
* `designs/` and from `.codeloop/figma.json`, maps each to the latest
|
|
45
|
+
* actual screenshot, runs pixelmatch, and writes a summary that gate_check
|
|
46
|
+
* consumes.
|
|
47
|
+
*/
|
|
48
|
+
export declare function runDesignCompareAll(input: DesignCompareInput, config: CodeLoopConfig, cwd?: string): Promise<DesignCompareResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Reads the design-compare summary written by `runDesignCompareAll` for a run.
|
|
51
|
+
* Used by gate_check to enforce the design_compare_evidence blocker gate.
|
|
52
|
+
*/
|
|
53
|
+
export interface DesignCompareSummary {
|
|
54
|
+
threshold: number;
|
|
55
|
+
per_screen: PerScreenResult[];
|
|
56
|
+
min_score: number;
|
|
57
|
+
avg_score: number;
|
|
58
|
+
failed_screens: string[];
|
|
59
|
+
source: "files" | "figma" | "mixed";
|
|
60
|
+
generated_at?: string;
|
|
61
|
+
figma_errors?: string[];
|
|
62
|
+
}
|
|
63
|
+
export declare function loadDesignCompareSummary(runDir: string): DesignCompareSummary | null;
|
|
64
|
+
export {};
|
|
17
65
|
//# sourceMappingURL=design_compare.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design_compare.d.ts","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"design_compare.d.ts","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAsB3D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACrC;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAeD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,OAAO,CA+BlG;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,aAAa,EAAE,CAiCzG;AAqDD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAoH9B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAsK9B;AA6CD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAUpF"}
|