@layoutdesign/context 0.2.1 → 0.2.3
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/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +6 -3
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/preview.d.ts.map +1 -1
- package/dist/src/mcp/tools/preview.js +3 -0
- package/dist/src/mcp/tools/preview.js.map +1 -1
- package/dist/src/mcp/tools/push-to-figma.d.ts.map +1 -1
- package/dist/src/mcp/tools/push-to-figma.js +56 -91
- package/dist/src/mcp/tools/push-to-figma.js.map +1 -1
- package/dist/src/preview/ensure.d.ts +6 -0
- package/dist/src/preview/ensure.d.ts.map +1 -0
- package/dist/src/preview/ensure.js +14 -0
- package/dist/src/preview/ensure.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4GjD"}
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -3,6 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { loadKit } from "../kit/loader.js";
|
|
5
5
|
import { startPreviewServer } from "../preview/server.js";
|
|
6
|
+
import { setPreviewServer } from "../preview/ensure.js";
|
|
6
7
|
const require = createRequire(import.meta.url);
|
|
7
8
|
// Resolves from dist/src/mcp/server.js → ../../../package.json
|
|
8
9
|
const pkg = require("../../../package.json");
|
|
@@ -29,13 +30,15 @@ export async function startServer() {
|
|
|
29
30
|
// Log to stderr so it doesn't interfere with stdio transport
|
|
30
31
|
console.error(`[layout-context] Kit: ${kitName} (${componentCount} components)`);
|
|
31
32
|
// Start the preview server (HTTP + WebSocket on :4321)
|
|
33
|
+
// If this fails, tools will auto-start it on demand via ensurePreviewServer()
|
|
32
34
|
try {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
+
const server = await startPreviewServer(undefined, { openBrowser: false });
|
|
36
|
+
setPreviewServer(server);
|
|
37
|
+
console.error(`[layout-context] Preview: ${server.url}`);
|
|
35
38
|
}
|
|
36
39
|
catch (err) {
|
|
37
40
|
const msg = err instanceof Error ? err.message : String(err);
|
|
38
|
-
console.error(`[layout-context] Preview server skipped: ${msg}`);
|
|
41
|
+
console.error(`[layout-context] Preview server skipped (will auto-start on demand): ${msg}`);
|
|
39
42
|
}
|
|
40
43
|
const server = new McpServer({
|
|
41
44
|
name: "layout-context",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,+DAA+D;AAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAwB,CAAC;AAEpE,eAAe;AACf,OAAO,KAAK,eAAe,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,cAAc,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,cAAc,MAAM,4BAA4B,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAe,OAAO,EAAE,CAAC;IAElC,MAAM,OAAO,GAAG,GAAG,EAAE,QAAQ,CAAC,WAAW,IAAI,MAAM,CAAC;IACpD,MAAM,cAAc,GAAG,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;IAEnD,6DAA6D;IAC7D,OAAO,CAAC,KAAK,CACX,yBAAyB,OAAO,KAAK,cAAc,cAAc,CAClE,CAAC;IAEF,uDAAuD;IACvD,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,wEAAwE,GAAG,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,CAAC,IAAI,CACT,eAAe,CAAC,IAAI,EACpB,eAAe,CAAC,WAAW,EAC3B,eAAe,CAAC,WAAW,EAC3B,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAC7B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,WAAW,EACrB,SAAS,CAAC,WAAW,EACrB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CACvB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAC1B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,CAAC,IAAI,EACnB,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAC5B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,CAAC,IAAI,EACpB,eAAe,CAAC,WAAW,EAC3B,eAAe,CAAC,WAAW,EAC3B,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAC7B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CACrB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,WAAW,EACvB,WAAW,CAAC,WAAW,EACvB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CACzB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,OAAO,EAAE,CACrB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,WAAW,EACzB,aAAa,CAAC,WAAW,EACzB,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAC3B,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,WAAW,EACxB,YAAY,CAAC,OAAO,EAAE,CACvB,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,CAAC,IAAI,EACnB,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,OAAO,EAAE,CACzB,CAAC;IAEF,oBAAoB;IACpB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,eAAO,MAAM,IAAI,YAAY,CAAC;AAE9B,eAAO,MAAM,WAAW,QAG8C,CAAC;AAEvE,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAC;AAEF,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,IACxB,oBAAoB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;;;;;GA0D7E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { PREVIEW_PORT } from "../../kit/types.js";
|
|
3
|
+
import { ensurePreviewServer } from "../../preview/ensure.js";
|
|
3
4
|
export const name = "preview";
|
|
4
5
|
export const description = "Renders a component code snippet in the local live preview canvas. " +
|
|
5
6
|
"The preview server must be running (`npx @layoutdesign/context serve`). " +
|
|
@@ -14,6 +15,8 @@ export const inputSchema = {
|
|
|
14
15
|
export function handler(_kit) {
|
|
15
16
|
return async ({ code, language }) => {
|
|
16
17
|
try {
|
|
18
|
+
// Auto-start preview server if not running
|
|
19
|
+
await ensurePreviewServer();
|
|
17
20
|
const { WebSocket } = await import("ws");
|
|
18
21
|
const ws = new WebSocket(`ws://localhost:${PREVIEW_PORT}/ws`);
|
|
19
22
|
const result = await new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../../src/mcp/tools/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../../src/mcp/tools/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,WAAW,GACtB,qEAAqE;IACrE,0EAA0E;IAC1E,oEAAoE,CAAC;AAEvE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IAC/E,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACrB,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,2DAA2D,CAAC;CACzE,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAgB;IACtC,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAA8C,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,2CAA2C;YAC3C,MAAM,mBAAmB,EAAE,CAAC;YAE5B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,kBAAkB,YAAY,KAAK,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC3D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC3D,CAAC,EAAE,IAAI,CAAC,CAAC;gBAET,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACjB,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,SAAS;wBACf,IAAI;wBACJ,QAAQ;qBACT,CAAC,CACH,CAAC;oBACF,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;oBAC5B,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACnD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4CAA4C,CAAC;YAEpF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,wCAAwC,OAAO,EAAE;4BACjD,EAAE;4BACF,iCAAiC;4BACjC,mCAAmC;4BACnC,EAAE;4BACF,0DAA0D,YAAY,EAAE;yBACzE,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"push-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,eAAO,MAAM,IAAI,kBAAkB,CAAC;AAEpC,eAAO,MAAM,WAAW,QAI+C,CAAC;AAExE,eAAO,MAAM,WAAW;;;;;;;;;;;;;CA6BvB,CAAC;AAsHF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,2DAMX;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;;;;;GAgGF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { PREVIEW_PORT } from "../../kit/types.js";
|
|
3
|
+
import { ensurePreviewServer } from "../../preview/ensure.js";
|
|
3
4
|
export const name = "push-to-figma";
|
|
4
5
|
export const description = "Push a component to Figma as editable frames. Sends the code to the preview server, " +
|
|
5
6
|
"then returns step-by-step instructions for capturing it via Figma MCP and Playwright MCP. " +
|
|
@@ -42,6 +43,8 @@ const DEFAULT_DIMS = VIEWPORT_DIMS.desktop;
|
|
|
42
43
|
* Optionally tags the preview with a variantName for multi-variant capture.
|
|
43
44
|
*/
|
|
44
45
|
async function pushToPreview(code, variantName) {
|
|
46
|
+
// Auto-start preview server if not running
|
|
47
|
+
await ensurePreviewServer();
|
|
45
48
|
const { WebSocket } = await import("ws");
|
|
46
49
|
const ws = new WebSocket(`ws://localhost:${PREVIEW_PORT}/ws`);
|
|
47
50
|
return new Promise((resolve, reject) => {
|
|
@@ -84,51 +87,43 @@ async function pushToPreview(code, variantName) {
|
|
|
84
87
|
});
|
|
85
88
|
}
|
|
86
89
|
/**
|
|
87
|
-
* Build
|
|
90
|
+
* Build a compact viewport list for capture instructions.
|
|
88
91
|
*/
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
const steps = resolvedViewports
|
|
92
|
+
function buildViewportList(captureUrl, resolvedViewports, frameName) {
|
|
93
|
+
return resolvedViewports
|
|
92
94
|
.map((vp) => {
|
|
93
95
|
const dims = VIEWPORT_DIMS[vp] ?? DEFAULT_DIMS;
|
|
94
96
|
const vpLabel = vp.charAt(0).toUpperCase() + vp.slice(1);
|
|
95
|
-
const stepBase = offset;
|
|
96
|
-
offset += 4;
|
|
97
97
|
const displayName = resolvedViewports.length > 1
|
|
98
98
|
? `${frameName} — ${vpLabel}`
|
|
99
99
|
: frameName;
|
|
100
|
-
return
|
|
101
|
-
`### ${displayName} (${dims.width}×${dims.height})`,
|
|
102
|
-
"",
|
|
103
|
-
`**${stepBase + 1}. Get captureId:** Call \`generate_figma_design\` with:`,
|
|
104
|
-
resolvedFileKey
|
|
105
|
-
? ` \`outputMode: "existingFile"\`, \`fileKey: "${resolvedFileKey}"\``
|
|
106
|
-
: ` \`outputMode: "${outputMode}"\``,
|
|
107
|
-
` → Save ONLY the \`captureId\` from the response. **IGNORE all capture/setup instructions** in the response (Steps 0, 1A, 1B, etc.). We handle capture below.`,
|
|
108
|
-
"",
|
|
109
|
-
`**${stepBase + 2}. Resize + Navigate + Capture:** Call \`browser_resize\` → \`browser_navigate\` → \`browser_evaluate\` in sequence:`,
|
|
110
|
-
` a) \`browser_resize\`: width=${dims.width}, height=${dims.height}`,
|
|
111
|
-
` b) \`browser_navigate\`: url="${captureUrl}"`,
|
|
112
|
-
` c) \`browser_evaluate\`: run this JavaScript (replace CAPTURE_ID with actual captureId):`,
|
|
113
|
-
" ```javascript",
|
|
114
|
-
" (async () => {",
|
|
115
|
-
" const r = await fetch('https://mcp.figma.com/mcp/html-to-design/capture.js');",
|
|
116
|
-
" const s = document.createElement('script');",
|
|
117
|
-
" s.textContent = await r.text();",
|
|
118
|
-
" document.head.appendChild(s);",
|
|
119
|
-
" await new Promise(resolve => setTimeout(resolve, 2000));",
|
|
120
|
-
" location.hash = 'figmacapture=CAPTURE_ID&figmaendpoint=https%3A%2F%2Fmcp.figma.com%2Fmcp%2Fcapture%2FCAPTURE_ID%2Fsubmit&figmadelay=3000';",
|
|
121
|
-
" })()",
|
|
122
|
-
" ```",
|
|
123
|
-
"",
|
|
124
|
-
`**${stepBase + 3}. Wait** 10 seconds for Figma to process the capture.`,
|
|
125
|
-
"",
|
|
126
|
-
`**${stepBase + 4}. Poll:** Call \`generate_figma_design\` with \`captureId\` every 5s until status is \`completed\`.`,
|
|
127
|
-
"",
|
|
128
|
-
].join("\n");
|
|
100
|
+
return `- **${displayName}**: ${dims.width}×${dims.height}, url=\`${captureUrl}\``;
|
|
129
101
|
})
|
|
130
102
|
.join("\n");
|
|
131
|
-
|
|
103
|
+
}
|
|
104
|
+
const CAPTURE_JS = "(async()=>{" +
|
|
105
|
+
"const r=await fetch('https://mcp.figma.com/mcp/html-to-design/capture.js');" +
|
|
106
|
+
"const s=document.createElement('script');" +
|
|
107
|
+
"s.textContent=await r.text();" +
|
|
108
|
+
"document.head.appendChild(s);" +
|
|
109
|
+
"await new Promise(r=>setTimeout(r,2000));" +
|
|
110
|
+
"location.hash='figmacapture=CAPTURE_ID&figmaendpoint=https%3A%2F%2Fmcp.figma.com%2Fmcp%2Fcapture%2FCAPTURE_ID%2Fsubmit&figmadelay=3000';" +
|
|
111
|
+
"})()";
|
|
112
|
+
function buildCaptureInstructions(resolvedFileKey, outputMode) {
|
|
113
|
+
const generateArgs = resolvedFileKey
|
|
114
|
+
? `outputMode: "existingFile", fileKey: "${resolvedFileKey}"`
|
|
115
|
+
: `outputMode: "${outputMode}"`;
|
|
116
|
+
return [
|
|
117
|
+
"**For each viewport below, repeat these 4 steps:**",
|
|
118
|
+
`1. Call \`generate_figma_design\` with \`${generateArgs}\` → save the \`captureId\`. IGNORE all capture/setup instructions in the response.`,
|
|
119
|
+
"2. Call `browser_resize` with the viewport dimensions listed below.",
|
|
120
|
+
"3. Call `browser_navigate` with the url listed below.",
|
|
121
|
+
"4. Call `browser_evaluate` with this JS (replace CAPTURE_ID with actual captureId):",
|
|
122
|
+
"```javascript",
|
|
123
|
+
CAPTURE_JS,
|
|
124
|
+
"```",
|
|
125
|
+
"5. Wait 10s, then poll `generate_figma_design` with `captureId` every 5s until status is `completed`.",
|
|
126
|
+
].join("\n");
|
|
132
127
|
}
|
|
133
128
|
export function handler(kit) {
|
|
134
129
|
return async ({ code, name: frameName, viewports, figmaUrl, variants, }) => {
|
|
@@ -175,75 +170,45 @@ export function handler(kit) {
|
|
|
175
170
|
],
|
|
176
171
|
};
|
|
177
172
|
}
|
|
178
|
-
// Step 2: Build capture instructions
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
pushStatuses.map((s) => `- ${s}`).join("\n"),
|
|
183
|
-
"",
|
|
184
|
-
"## CRITICAL: How to capture (read before starting)",
|
|
185
|
-
"",
|
|
186
|
-
"You MUST use **Playwright MCP** (browser_resize, browser_navigate, browser_evaluate) to capture each viewport.",
|
|
187
|
-
"Do NOT use the `open` command. Do NOT follow generate_figma_design's \"Step 1A/1B\" instructions.",
|
|
188
|
-
"Do NOT create temp HTML files or start HTTP servers.",
|
|
189
|
-
"",
|
|
190
|
-
"**Why Playwright is required:** Tailwind CSS responsive breakpoints respond to browser viewport width,",
|
|
191
|
-
"not CSS max-width. The `browser_resize` call sets the actual viewport so `md:` and `lg:` breakpoints",
|
|
192
|
-
"fire correctly at each size. Without it, mobile captures render as squished desktop layouts.",
|
|
193
|
-
"",
|
|
194
|
-
"## Prerequisites",
|
|
195
|
-
"",
|
|
196
|
-
"- **Figma MCP**: `claude mcp add --transport http figma https://mcp.figma.com/mcp`",
|
|
197
|
-
"- **Playwright MCP**: For `browser_resize`, `browser_navigate`, `browser_evaluate`",
|
|
198
|
-
"",
|
|
199
|
-
].join("\n");
|
|
173
|
+
// Step 2: Build compact capture instructions
|
|
174
|
+
const prereq = "Requires: Figma MCP (HTTP transport: `claude mcp add --transport http figma https://mcp.figma.com/mcp`) + Playwright MCP.";
|
|
175
|
+
const status = pushStatuses.map((s) => `- ${s}`).join("\n");
|
|
176
|
+
const instructions = buildCaptureInstructions(resolvedFileKey, outputMode);
|
|
200
177
|
let captureSection;
|
|
201
178
|
if (variants && variants.length > 0) {
|
|
202
|
-
// Multi-variant capture: each variant × each viewport
|
|
203
179
|
const totalCaptures = variants.length * resolvedViewports.length;
|
|
204
180
|
const variantNames = variants.map((v) => v.name).join(", ");
|
|
205
|
-
const
|
|
206
|
-
|
|
181
|
+
const variantSections = variants.map((variant) => {
|
|
182
|
+
const variantCaptureUrl = `${baseCaptureUrl}?variant=${encodeURIComponent(variant.name)}`;
|
|
183
|
+
const variantFrameName = `${resolvedName}/State=${variant.name}`;
|
|
184
|
+
const viewportList = buildViewportList(variantCaptureUrl, resolvedViewports, variantFrameName);
|
|
185
|
+
return `### ${variant.name}\n${viewportList}`;
|
|
186
|
+
}).join("\n\n");
|
|
187
|
+
captureSection = [
|
|
188
|
+
`Capturing ${variants.length} variant(s) (${variantNames}) × ${resolvedViewports.length} viewport(s) = ${totalCaptures} frame(s).`,
|
|
207
189
|
"",
|
|
208
|
-
|
|
190
|
+
instructions,
|
|
209
191
|
"",
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const variantFrameName = resolvedViewports.length > 1
|
|
215
|
-
? `${resolvedName}/State=${variant.name}`
|
|
216
|
-
: `${resolvedName}/State=${variant.name}`;
|
|
217
|
-
sections.push(`## Variant: ${variant.name}`, "");
|
|
218
|
-
const { steps, nextOffset } = buildCaptureSteps(variantCaptureUrl, resolvedViewports, variantFrameName, resolvedFileKey, outputMode, stepOffset);
|
|
219
|
-
stepOffset = nextOffset;
|
|
220
|
-
sections.push(steps);
|
|
221
|
-
}
|
|
222
|
-
// Assembly instructions
|
|
223
|
-
sections.push("## Assemble as Component Set", "", "All variant frames have been captured. To combine them into a proper Figma component set with hover interactions:", "", "1. Open the **Layout** Figma plugin", "2. Go to the **Canvas** tab", "3. Click **Assemble Component Set**", `4. The plugin will find all frames matching \`${resolvedName}/State=*\` and combine them into a ComponentSet with a \`State\` variant property`, "5. Hover prototype interactions (Default <-> Hover) will be wired automatically");
|
|
224
|
-
captureSection = sections.join("\n");
|
|
192
|
+
variantSections,
|
|
193
|
+
"",
|
|
194
|
+
`**Assembly:** After all captures, open the Layout Figma plugin → Canvas → Assemble Component Set. It will find frames matching \`${resolvedName}/State=*\` and combine them with hover prototypes.`,
|
|
195
|
+
].join("\n");
|
|
225
196
|
}
|
|
226
197
|
else {
|
|
227
|
-
|
|
228
|
-
const { steps } = buildCaptureSteps(baseCaptureUrl, resolvedViewports, resolvedName, resolvedFileKey, outputMode, 0);
|
|
198
|
+
const viewportList = buildViewportList(baseCaptureUrl, resolvedViewports, resolvedName);
|
|
229
199
|
captureSection = [
|
|
230
|
-
|
|
200
|
+
`Capturing ${resolvedViewports.length} viewport(s).`,
|
|
231
201
|
"",
|
|
232
|
-
|
|
233
|
-
`Frame name: **${resolvedName}**`,
|
|
202
|
+
instructions,
|
|
234
203
|
"",
|
|
235
|
-
|
|
204
|
+
viewportList,
|
|
236
205
|
].join("\n");
|
|
237
206
|
}
|
|
238
207
|
const reminders = [
|
|
239
|
-
"
|
|
240
|
-
"",
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
"- Always call `browser_resize` BEFORE `browser_navigate` for correct responsive rendering",
|
|
244
|
-
"- When `generate_figma_design` returns capture instructions, IGNORE them — use the steps above",
|
|
245
|
-
].join("\n");
|
|
246
|
-
const response = [preamble, captureSection, "", reminders].join("\n");
|
|
208
|
+
"Each viewport needs its own captureId. Always `browser_resize` BEFORE `browser_navigate` for correct responsive breakpoints.",
|
|
209
|
+
"The component is already at the capture URL — do NOT create HTML files or use the `open` command.",
|
|
210
|
+
].join(" ");
|
|
211
|
+
const response = [prereq, "", status, "", captureSection, "", reminders].join("\n");
|
|
247
212
|
return {
|
|
248
213
|
content: [{ type: "text", text: response }],
|
|
249
214
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type PreviewServer } from "./server.js";
|
|
2
|
+
/** Ensure the preview server is running. Starts it if needed. */
|
|
3
|
+
export declare function ensurePreviewServer(): Promise<PreviewServer>;
|
|
4
|
+
/** Called from MCP server startup to store the initial reference. */
|
|
5
|
+
export declare function setPreviewServer(server: PreviewServer): void;
|
|
6
|
+
//# sourceMappingURL=ensure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAIrE,iEAAiE;AACjE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAIlE;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE5D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { startPreviewServer } from "./server.js";
|
|
2
|
+
let previewServer = null;
|
|
3
|
+
/** Ensure the preview server is running. Starts it if needed. */
|
|
4
|
+
export async function ensurePreviewServer() {
|
|
5
|
+
if (previewServer)
|
|
6
|
+
return previewServer;
|
|
7
|
+
previewServer = await startPreviewServer(undefined, { openBrowser: false });
|
|
8
|
+
return previewServer;
|
|
9
|
+
}
|
|
10
|
+
/** Called from MCP server startup to store the initial reference. */
|
|
11
|
+
export function setPreviewServer(server) {
|
|
12
|
+
previewServer = server;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ensure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.js","sourceRoot":"","sources":["../../../src/preview/ensure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AAErE,IAAI,aAAa,GAAyB,IAAI,CAAC;AAE/C,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,aAAa,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC"}
|