@layoutdesign/context 0.3.1 → 0.5.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 (43) hide show
  1. package/dist/bin/cli.js +10 -0
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/src/cli/scan.d.ts +8 -0
  4. package/dist/src/cli/scan.d.ts.map +1 -0
  5. package/dist/src/cli/scan.js +143 -0
  6. package/dist/src/cli/scan.js.map +1 -0
  7. package/dist/src/cli/setup-utils.d.ts +7 -0
  8. package/dist/src/cli/setup-utils.d.ts.map +1 -1
  9. package/dist/src/cli/setup-utils.js +52 -1
  10. package/dist/src/cli/setup-utils.js.map +1 -1
  11. package/dist/src/integrations/codebase-scan.d.ts +46 -0
  12. package/dist/src/integrations/codebase-scan.d.ts.map +1 -0
  13. package/dist/src/integrations/codebase-scan.js +231 -0
  14. package/dist/src/integrations/codebase-scan.js.map +1 -0
  15. package/dist/src/integrations/storybook.d.ts +36 -0
  16. package/dist/src/integrations/storybook.d.ts.map +1 -0
  17. package/dist/src/integrations/storybook.js +124 -0
  18. package/dist/src/integrations/storybook.js.map +1 -0
  19. package/dist/src/mcp/server.d.ts.map +1 -1
  20. package/dist/src/mcp/server.js +75 -2
  21. package/dist/src/mcp/server.js.map +1 -1
  22. package/dist/src/mcp/tools/check-setup.js +6 -1
  23. package/dist/src/mcp/tools/check-setup.js.map +1 -1
  24. package/dist/src/mcp/tools/design-in-figma.d.ts.map +1 -1
  25. package/dist/src/mcp/tools/design-in-figma.js +73 -80
  26. package/dist/src/mcp/tools/design-in-figma.js.map +1 -1
  27. package/dist/src/mcp/tools/list-components.d.ts +2 -1
  28. package/dist/src/mcp/tools/list-components.d.ts.map +1 -1
  29. package/dist/src/mcp/tools/list-components.js +50 -24
  30. package/dist/src/mcp/tools/list-components.js.map +1 -1
  31. package/dist/src/mcp/tools/push-to-figma.d.ts +8 -3
  32. package/dist/src/mcp/tools/push-to-figma.d.ts.map +1 -1
  33. package/dist/src/mcp/tools/push-to-figma.js +109 -2
  34. package/dist/src/mcp/tools/push-to-figma.js.map +1 -1
  35. package/dist/src/mcp/tools/push-tokens-to-figma.d.ts +16 -0
  36. package/dist/src/mcp/tools/push-tokens-to-figma.d.ts.map +1 -0
  37. package/dist/src/mcp/tools/push-tokens-to-figma.js +141 -0
  38. package/dist/src/mcp/tools/push-tokens-to-figma.js.map +1 -0
  39. package/dist/src/mcp/tools/scan-project.d.ts +30 -0
  40. package/dist/src/mcp/tools/scan-project.d.ts.map +1 -0
  41. package/dist/src/mcp/tools/scan-project.js +97 -0
  42. package/dist/src/mcp/tools/scan-project.js.map +1 -0
  43. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  import type { Kit } from "../../kit/types.js";
2
+ import type { ScanResult } from "../../integrations/codebase-scan.js";
2
3
  export declare const name = "list-components";
3
4
  export declare const description: string;
4
5
  export declare const inputSchema: {};
5
- export declare function handler(kit: Kit | null): () => Promise<{
6
+ export declare function handler(kit: Kit | null, scanResult: ScanResult | null): () => Promise<{
6
7
  content: {
7
8
  type: "text";
8
9
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"list-components.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,eAAO,MAAM,WAAW,QAE2E,CAAC;AAEpG,eAAO,MAAM,WAAW,IAAK,CAAC;AAE9B,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;;;;;GAqCtC"}
1
+ {"version":3,"file":"list-components.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEtE,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,eAAO,MAAM,WAAW,QAG4C,CAAC;AAErE,eAAO,MAAM,WAAW,IAAK,CAAC;AAE9B,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;;;;;GAmDrE"}
@@ -1,38 +1,64 @@
1
1
  export const name = "list-components";
2
- export const description = "Lists all available components in the active design system kit with their names and descriptions. " +
3
- "Use this to discover what components are available before requesting details on a specific one.";
2
+ export const description = "Lists all available components: design system components from layout.md, " +
3
+ "auto-detected React components from the codebase, and Storybook stories. " +
4
+ "Use this to discover existing components before building new UI.";
4
5
  export const inputSchema = {};
5
- export function handler(kit) {
6
+ export function handler(kit, scanResult) {
6
7
  return async () => {
7
- if (!kit) {
8
- return {
9
- content: [
10
- {
11
- type: "text",
12
- text: "No design system kit found. Run `npx @layoutdesign/context init` to set one up.",
13
- },
14
- ],
15
- };
8
+ const sections = [];
9
+ // 1. Design system components from layout.md
10
+ if (kit && kit.components.length > 0) {
11
+ const lines = kit.components.map((c) => `- **${c.name}** — ${c.description || "No description"}`);
12
+ sections.push(`## Design System (from layout.md)\n\n${lines.join("\n")}`);
16
13
  }
17
- if (kit.components.length === 0) {
14
+ // 2. Codebase components (auto-scanned)
15
+ if (scanResult && scanResult.components.length > 0) {
16
+ const lines = scanResult.components
17
+ .slice(0, 100) // cap for context budget
18
+ .map((c) => {
19
+ const propsStr = c.props.length > 0
20
+ ? ` props: ${c.props.map(p => p.name).join(", ")}`
21
+ : "";
22
+ const storyStr = c.storybook
23
+ ? ` [Storybook: ${c.storybook.stories.map(s => s.name).join(", ")}]`
24
+ : "";
25
+ const refStr = c.usesForwardRef ? " (forwardRef)" : "";
26
+ const importPath = buildImportPath(c.filePath);
27
+ const importStatement = c.exportType === "default"
28
+ ? `import ${c.name} from '${importPath}'`
29
+ : `import { ${c.name} } from '${importPath}'`;
30
+ return `- **${c.name}** (${c.filePath})${propsStr}${refStr}${storyStr}\n Import: \`${importStatement}\``;
31
+ });
32
+ sections.push(`## Your Codebase (auto-detected)\n\n${lines.join("\n")}`);
33
+ }
34
+ if (sections.length === 0) {
18
35
  return {
19
- content: [
20
- {
36
+ content: [{
21
37
  type: "text",
22
- text: "No components defined in this kit. Components are parsed from the ## Components section in layout.md.",
23
- },
24
- ],
38
+ text: "No components found. Set up a design system with `npx @layoutdesign/context init` or create React components in this project.",
39
+ }],
25
40
  };
26
41
  }
27
- const lines = kit.components.map((c) => `- **${c.name}** — ${c.description || "No description"}`);
42
+ const total = (kit?.components.length ?? 0) + (scanResult?.components.length ?? 0);
28
43
  return {
29
- content: [
30
- {
44
+ content: [{
31
45
  type: "text",
32
- text: `# Components (${kit.components.length})\n\n${lines.join("\n")}`,
33
- },
34
- ],
46
+ text: `# Components (${total})\n\n${sections.join("\n\n")}\n\n---\n**IMPORTANT:** When building UI, reuse existing components listed above. Import from the paths shown. Do NOT generate a new Button/Card/Input if one already exists.`,
47
+ }],
35
48
  };
36
49
  };
37
50
  }
51
+ function buildImportPath(filePath) {
52
+ // Convert file path to import path: src/components/ui/button.tsx -> @/components/ui/button
53
+ let importPath = filePath
54
+ .replace(/\.(tsx?|jsx?)$/, "")
55
+ .replace(/\/index$/, "");
56
+ if (importPath.startsWith("src/")) {
57
+ importPath = "@/" + importPath.slice(4);
58
+ }
59
+ else if (!importPath.startsWith(".") && !importPath.startsWith("@")) {
60
+ importPath = "./" + importPath;
61
+ }
62
+ return importPath;
63
+ }
38
64
  //# sourceMappingURL=list-components.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GACtB,oGAAoG;IACpG,iGAAiG,CAAC;AAEpG,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE9B,MAAM,UAAU,OAAO,CAAC,GAAe;IACrC,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iFAAiF;qBACxF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uGAAuG;qBAC9G;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAChE,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,iBAAiB,GAAG,CAAC,UAAU,CAAC,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACvE;aACF;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-components.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,12 @@ export declare const inputSchema: {
15
15
  name: z.ZodString;
16
16
  code: z.ZodString;
17
17
  }, z.core.$strip>>>;
18
+ mode: z.ZodOptional<z.ZodEnum<{
19
+ capture: "capture";
20
+ native: "native";
21
+ }>>;
18
22
  };
19
- export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, variants, }: {
23
+ export declare function handler(kit: Kit | null): ({ code, name: frameName, viewports, figmaUrl, variants, mode, }: {
20
24
  code: string;
21
25
  name?: string;
22
26
  viewports?: string[];
@@ -25,10 +29,11 @@ export declare function handler(kit: Kit | null): ({ code, name: frameName, view
25
29
  name: string;
26
30
  code: string;
27
31
  }>;
32
+ mode?: string;
28
33
  }) => Promise<{
29
- content: {
34
+ content: Array<{
30
35
  type: "text";
31
36
  text: string;
32
- }[];
37
+ }>;
33
38
  }>;
34
39
  //# sourceMappingURL=push-to-figma.d.ts.map
@@ -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;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
+ {"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;;;;;;;;;;;;;;;;;CAqCvB,CAAC;AAoOF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,iEAOX;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;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;aA/GY,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;GA6NnD"}
@@ -31,6 +31,12 @@ export const inputSchema = {
31
31
  "named '{name}/State={variantName}'. After all frames are captured, use the Layout Figma plugin's " +
32
32
  "'Assemble Component Set' to combine them into a proper Figma component with variant properties. " +
33
33
  "Tip: render hover states by applying hover styles directly as classes, not via CSS :hover pseudo-class."),
34
+ mode: z
35
+ .enum(["capture", "native"])
36
+ .optional()
37
+ .describe("Push mode. 'capture' (default) renders in browser and captures as flat frames via Playwright. " +
38
+ "'native' uses Figma MCP's use_figma to create editable Figma objects with auto-layout and real text. " +
39
+ "Native mode does not require Playwright MCP."),
34
40
  };
35
41
  const VIEWPORT_DIMS = {
36
42
  desktop: { width: 1280, height: 900 },
@@ -125,11 +131,100 @@ function buildCaptureInstructions(resolvedFileKey, outputMode) {
125
131
  "5. Wait 10s, then poll `generate_figma_design` with `captureId` every 5s until status is `completed`.",
126
132
  ].join("\n");
127
133
  }
134
+ function buildNativeResponse({ code, frameName, viewports, resolvedFileKey, variants, kit, }) {
135
+ const tokenContext = kit?.tokensCss
136
+ ? "\n## Design Tokens\n\nApply these tokens to ensure design system compliance:\n\n```css\n" +
137
+ kit.tokensCss
138
+ .split("\n")
139
+ .filter((l) => l.includes("--"))
140
+ .slice(0, 50)
141
+ .join("\n") +
142
+ "\n```\n"
143
+ : "";
144
+ const viewportDims = {
145
+ desktop: "1280×900",
146
+ tablet: "768×1024",
147
+ mobile: "375×812",
148
+ };
149
+ const viewportList = viewports
150
+ .map((vp) => `- **${frameName} (${vp})**: ${viewportDims[vp] ?? "1280×900"}`)
151
+ .join("\n");
152
+ let componentDescription;
153
+ if (variants && variants.length > 0) {
154
+ const variantDescriptions = variants
155
+ .map((v) => `### Variant: ${v.name}\n\n\`\`\`tsx\n${v.code}\n\`\`\``)
156
+ .join("\n\n");
157
+ componentDescription = [
158
+ `Create a Figma component called "${frameName}" with ${variants.length} variant(s).`,
159
+ "",
160
+ "Each variant should be a separate state (e.g. Default, Hover, Active, Disabled).",
161
+ "Create these as a proper Figma component set with variant properties.",
162
+ "",
163
+ variantDescriptions,
164
+ ].join("\n");
165
+ }
166
+ else {
167
+ componentDescription = [
168
+ `Create a Figma frame called "${frameName}" based on this component:`,
169
+ "",
170
+ "```tsx",
171
+ code,
172
+ "```",
173
+ ].join("\n");
174
+ }
175
+ const response = [
176
+ "# Push to Figma (Native Mode)",
177
+ "",
178
+ "Use Figma MCP's `use_figma` tool to create this component as native, editable Figma objects.",
179
+ "",
180
+ "**Recommended:** Invoke this with the `figma-use` skill for best results.",
181
+ "",
182
+ "---",
183
+ "",
184
+ "## Component",
185
+ "",
186
+ componentDescription,
187
+ "",
188
+ "---",
189
+ tokenContext,
190
+ "## Frames to Create",
191
+ "",
192
+ viewportList,
193
+ "",
194
+ "---",
195
+ "",
196
+ "## NEXT STEP — YOU MUST DO THIS NOW",
197
+ "",
198
+ "Immediately call Figma MCP's `use_figma` tool to create this component. Do not ask the user — just do it.",
199
+ "",
200
+ `Call \`use_figma\` now with:`,
201
+ resolvedFileKey
202
+ ? `- Target file key: \`${resolvedFileKey}\``
203
+ : "- Create a new Figma file",
204
+ "- Analyse the TSX code above to understand the component structure",
205
+ "- Recreate the layout using Figma auto-layout (not absolute positioning)",
206
+ "- Use the exact colours, fonts, spacing, and radius from the code/tokens",
207
+ "- Create real text nodes with correct content, font, and size",
208
+ "- NEVER use fixed pixel widths/heights on auto-layout children — use FILL or HUG",
209
+ "- NEVER leave padding or gap at 0 — use spacing values from the code (e.g. gap-4 = 16px padding, p-6 = 24px)",
210
+ "- Create a frame for each viewport listed above, adapting the layout responsively",
211
+ "",
212
+ variants && variants.length > 0
213
+ ? "Create each variant as a separate component, then combine into a component set with variant properties.\n"
214
+ : "",
215
+ "If `use_figma` is not available, call the Layout MCP `check-setup` tool with `fix: true` to auto-configure the Figma MCP server.",
216
+ ]
217
+ .filter(Boolean)
218
+ .join("\n");
219
+ return {
220
+ content: [{ type: "text", text: response }],
221
+ };
222
+ }
128
223
  export function handler(kit) {
129
- return async ({ code, name: frameName, viewports, figmaUrl, variants, }) => {
224
+ return async ({ code, name: frameName, viewports, figmaUrl, variants, mode, }) => {
130
225
  const resolvedName = frameName ?? "Layout Component";
131
226
  const resolvedViewports = viewports ?? ["desktop"];
132
- const baseCaptureUrl = `http://localhost:${PREVIEW_PORT}/capture`;
227
+ const resolvedMode = mode ?? "capture";
133
228
  // Parse fileKey from Figma URL if provided
134
229
  let resolvedFileKey;
135
230
  if (figmaUrl) {
@@ -137,6 +232,18 @@ export function handler(kit) {
137
232
  if (match)
138
233
  resolvedFileKey = match[1];
139
234
  }
235
+ // Native mode: use use_figma directly, skip preview server + Playwright
236
+ if (resolvedMode === "native") {
237
+ return buildNativeResponse({
238
+ code,
239
+ frameName: resolvedName,
240
+ viewports: resolvedViewports,
241
+ resolvedFileKey,
242
+ variants,
243
+ kit,
244
+ });
245
+ }
246
+ const baseCaptureUrl = `http://localhost:${PREVIEW_PORT}/capture`;
140
247
  const outputMode = resolvedFileKey ? "existingFile" : "newFile";
141
248
  // Step 1: Push code to the preview server
142
249
  const pushStatuses = [];
@@ -1 +1 @@
1
- {"version":3,"file":"push-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-to-figma.ts"],"names":[],"mappings":"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"}
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,16 @@
1
+ import { z } from "zod";
2
+ import type { Kit } from "../../kit/types.js";
3
+ export declare const name = "push-tokens-to-figma";
4
+ export declare const description: string;
5
+ export declare const inputSchema: {
6
+ fileKey: z.ZodOptional<z.ZodString>;
7
+ };
8
+ export declare function handler(kit: Kit | null): ({ fileKey }: {
9
+ fileKey?: string;
10
+ }) => Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ }>;
16
+ //# sourceMappingURL=push-tokens-to-figma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-tokens-to-figma.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/push-tokens-to-figma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,IAAI,yBAAyB,CAAC;AAE3C,eAAO,MAAM,WAAW,QAG0B,CAAC;AAEnD,eAAO,MAAM,WAAW;;CAOvB,CAAC;AAEF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,IACvB,aAAa;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GA4GhD"}
@@ -0,0 +1,141 @@
1
+ import { z } from "zod";
2
+ export const name = "push-tokens-to-figma";
3
+ export const description = "Push design system tokens to Figma as native variables and styles using Figma MCP's use_figma tool. " +
4
+ "Creates a variable collection with colour, spacing, and radius variables, plus text and effect styles. " +
5
+ "Requires the Figma MCP server to be connected.";
6
+ export const inputSchema = {
7
+ fileKey: z
8
+ .string()
9
+ .optional()
10
+ .describe("Figma file key to push tokens into. If omitted, instructions will create a new file."),
11
+ };
12
+ export function handler(kit) {
13
+ return async ({ fileKey }) => {
14
+ if (!kit) {
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: "No design system kit loaded. Run `npx @layoutdesign/context init` to set up a kit first, or import one with `npx @layoutdesign/context import <path-to-zip>`.",
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ if (!kit.tokensCss) {
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: "No CSS tokens found in kit. Extract tokens from a Figma file or website first.",
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ // Parse CSS custom properties into categories
35
+ const colourTokens = parseTokens(kit.tokensCss, [
36
+ "color", "colour", "bg", "background", "text", "border",
37
+ "surface", "accent", "primary", "secondary", "error", "warning", "success",
38
+ ]);
39
+ const spacingTokens = parseTokens(kit.tokensCss, [
40
+ "spacing", "space", "gap", "padding", "margin",
41
+ ]);
42
+ const radiusTokens = parseTokens(kit.tokensCss, [
43
+ "radius", "border-radius", "rounded",
44
+ ]);
45
+ const shadowTokens = parseTokens(kit.tokensCss, [
46
+ "shadow", "elevation", "effect",
47
+ ]);
48
+ const typographyTokens = parseTokens(kit.tokensCss, [
49
+ "font", "size", "weight", "line-height", "letter-spacing",
50
+ "heading", "body", "display", "caption", "label",
51
+ ]);
52
+ const allTokenLines = kit.tokensCss
53
+ .split("\n")
54
+ .filter((line) => line.includes("--") && line.includes(":"))
55
+ .map((line) => line.trim());
56
+ const totalTokenCount = allTokenLines.length;
57
+ const response = [
58
+ "# Push Tokens to Figma",
59
+ "",
60
+ `**Design system:** ${kit.manifest.displayName}`,
61
+ `**Total tokens:** ${totalTokenCount}`,
62
+ "",
63
+ "---",
64
+ "",
65
+ "## Token Inventory",
66
+ "",
67
+ colourTokens.length > 0 ? `### Colours (${colourTokens.length} tokens)\n\n${formatTokens(colourTokens)}` : "",
68
+ "",
69
+ spacingTokens.length > 0 ? `### Spacing (${spacingTokens.length} tokens)\n\n${formatTokens(spacingTokens)}` : "",
70
+ "",
71
+ radiusTokens.length > 0 ? `### Radius (${radiusTokens.length} tokens)\n\n${formatTokens(radiusTokens)}` : "",
72
+ "",
73
+ shadowTokens.length > 0 ? `### Shadows (${shadowTokens.length} tokens)\n\n${formatTokens(shadowTokens)}` : "",
74
+ "",
75
+ typographyTokens.length > 0 ? `### Typography (${typographyTokens.length} tokens)\n\n${formatTokens(typographyTokens)}` : "",
76
+ "",
77
+ "---",
78
+ "",
79
+ "## NEXT STEP — YOU MUST DO THIS NOW",
80
+ "",
81
+ "Immediately call Figma MCP's `use_figma` tool to create these tokens in Figma. Do not ask the user — just do it.",
82
+ "",
83
+ `Call \`use_figma\` now to create a variable collection called "${kit.manifest.displayName} Tokens":`,
84
+ fileKey ? `- Target file key: \`${fileKey}\`` : "- Create a new Figma file",
85
+ "",
86
+ "Create **colour variables** for each colour token above:",
87
+ "- Group by prefix (e.g. `color/primary`, `color/surface`, `bg/app`)",
88
+ "- Use the exact hex values listed",
89
+ "",
90
+ "Create **number variables** for spacing and radius tokens:",
91
+ "- Group spacing as `spacing/1`, `spacing/2`, etc.",
92
+ "- Group radius as `radius/sm`, `radius/md`, etc.",
93
+ "- Values should be the pixel numbers (strip `px` suffix)",
94
+ "",
95
+ "Create **text styles** for typography tokens:",
96
+ "- Map font-family, font-size, font-weight, and line-height",
97
+ "- Name styles by role (e.g. `heading/h1`, `body/default`)",
98
+ "",
99
+ shadowTokens.length > 0
100
+ ? "Create **effect styles** for shadow tokens:\n- Map box-shadow values to Figma drop shadows\n- Name by elevation level"
101
+ : "",
102
+ "",
103
+ "If `use_figma` is not available, call the Layout MCP `check-setup` tool with `fix: true` to auto-configure the Figma MCP server.",
104
+ ]
105
+ .filter(Boolean)
106
+ .join("\n");
107
+ return {
108
+ content: [{ type: "text", text: response }],
109
+ };
110
+ };
111
+ }
112
+ /**
113
+ * Parse CSS custom properties matching any of the given category keywords.
114
+ */
115
+ function parseTokens(css, keywords) {
116
+ return css
117
+ .split("\n")
118
+ .filter((line) => {
119
+ if (!line.includes("--"))
120
+ return false;
121
+ const lower = line.toLowerCase();
122
+ return keywords.some((kw) => lower.includes(kw));
123
+ })
124
+ .map((line) => {
125
+ const match = line.match(/--([\w-]+)\s*:\s*(.+?)\s*;?$/);
126
+ if (!match)
127
+ return null;
128
+ return { name: `--${match[1]}`, value: match[2].replace(/;$/, "").trim() };
129
+ })
130
+ .filter((t) => t !== null)
131
+ .slice(0, 100);
132
+ }
133
+ /**
134
+ * Format token entries as a readable list.
135
+ */
136
+ function formatTokens(tokens) {
137
+ return tokens
138
+ .map((t) => `- \`${t.name}\`: \`${t.value}\``)
139
+ .join("\n");
140
+ }
141
+ //# sourceMappingURL=push-tokens-to-figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-tokens-to-figma.js","sourceRoot":"","sources":["../../../../src/mcp/tools/push-tokens-to-figma.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export declare const name = "scan-project";
3
+ export declare const description: string;
4
+ export declare const inputSchema: {
5
+ path: z.ZodOptional<z.ZodString>;
6
+ type: z.ZodOptional<z.ZodEnum<{
7
+ both: "both";
8
+ storybook: "storybook";
9
+ codebase: "codebase";
10
+ }>>;
11
+ };
12
+ type Input = {
13
+ path?: string;
14
+ type?: "both" | "storybook" | "codebase";
15
+ };
16
+ export declare function handler(): (input: Input) => Promise<{
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ isError?: undefined;
22
+ } | {
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ }>;
29
+ export {};
30
+ //# sourceMappingURL=scan-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-project.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,IAAI,iBAAiB,CAAC;AAEnC,eAAO,MAAM,WAAW,QAG8F,CAAC;AAEvH,eAAO,MAAM,WAAW;;;;;;;CAavB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;CAC1C,CAAC;AAEF,wBAAgB,OAAO,KACP,OAAO,KAAK;;;;;;;;;;;;GA8F3B"}
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ import { resolve } from "node:path";
3
+ import { scanCodebase, scanStorybook } from "../../integrations/codebase-scan.js";
4
+ export const name = "scan-project";
5
+ export const description = "Scan the current project for React components and Storybook stories. " +
6
+ "Returns structured data about component names, props, export types, and story associations. " +
7
+ "Use this to understand the existing component inventory before generating new components or design system context.";
8
+ export const inputSchema = {
9
+ path: z
10
+ .string()
11
+ .optional()
12
+ .describe("Directory to scan. Defaults to the current working directory."),
13
+ type: z
14
+ .enum(["both", "storybook", "codebase"])
15
+ .optional()
16
+ .describe("What to scan: 'both' (default) scans components and stories, 'storybook' scans only stories, 'codebase' scans only components."),
17
+ };
18
+ export function handler() {
19
+ return async (input) => {
20
+ const rootPath = resolve(input.path ?? process.cwd());
21
+ const scanType = input.type ?? "both";
22
+ try {
23
+ if (scanType === "storybook") {
24
+ const stories = await scanStorybook(rootPath);
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: JSON.stringify({
30
+ type: "storybook-scan",
31
+ rootPath,
32
+ storiesFound: stories.length,
33
+ stories,
34
+ }, null, 2),
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ const result = await scanCodebase(rootPath);
40
+ // For "codebase" type, strip storybook data
41
+ if (scanType === "codebase") {
42
+ const components = result.components.map(({ storybook: _sb, ...rest }) => rest);
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: JSON.stringify({
48
+ type: "codebase-scan",
49
+ rootPath,
50
+ componentsFound: components.length,
51
+ filesScanned: result.filesScanned,
52
+ durationMs: result.durationMs,
53
+ components,
54
+ }, null, 2),
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ // Default: both
60
+ const withStories = result.components.filter((c) => c.storybook);
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: JSON.stringify({
66
+ type: "full-scan",
67
+ rootPath,
68
+ summary: {
69
+ componentsFound: result.components.length,
70
+ storiesFound: result.storybookStories.length,
71
+ componentsWithStories: withStories.length,
72
+ unmatchedStories: result.unmatchedStories.length,
73
+ filesScanned: result.filesScanned,
74
+ durationMs: result.durationMs,
75
+ },
76
+ components: result.components,
77
+ unmatchedStories: result.unmatchedStories,
78
+ }, null, 2),
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ catch (err) {
84
+ const msg = err instanceof Error ? err.message : String(err);
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: `Error scanning project: ${msg}`,
90
+ },
91
+ ],
92
+ isError: true,
93
+ };
94
+ }
95
+ };
96
+ }
97
+ //# sourceMappingURL=scan-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-project.js","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-project.ts"],"names":[],"mappings":"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"}