@mcp-consultant-tools/figma 23.0.0 → 26.0.0-beta.1

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.
@@ -2,4 +2,5 @@ export type { ExtractorFn, TraversalContext, TraversalOptions, GlobalVars, Style
2
2
  export { extractFromDesign } from "./node-walker.js";
3
3
  export { simplifyRawFigmaObject } from "./design-extractor.js";
4
4
  export { layoutExtractor, textExtractor, visualsExtractor, componentExtractor, allExtractors, layoutAndText, contentOnly, visualsOnly, layoutOnly, collapseSvgContainers, SVG_ELIGIBLE_TYPES, } from "./built-in.js";
5
+ export { extractSemanticData, categorizeStickyColor, extractUserStories, type SemanticExtract, type SemanticExtractOptions, type StickyCategory, type SectionSummary, type StickyNote, type ComponentSummary, type TextNodeSummary, type ConnectorSummary, type UserStoryRef, } from "./semantic-extractor.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/figma/extractors/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAElB,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EAEV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/figma/extractors/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAElB,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EAEV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,yBAAyB,CAAC"}
@@ -8,4 +8,6 @@ export { layoutExtractor, textExtractor, visualsExtractor, componentExtractor,
8
8
  allExtractors, layoutAndText, contentOnly, visualsOnly, layoutOnly,
9
9
  // afterChildren helpers
10
10
  collapseSvgContainers, SVG_ELIGIBLE_TYPES, } from "./built-in.js";
11
+ // Semantic extraction for FigJam boards
12
+ export { extractSemanticData, categorizeStickyColor, extractUserStories, } from "./semantic-extractor.js";
11
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/figma/extractors/index.ts"],"names":[],"mappings":"AASA,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,uDAAuD;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,gDAAgD;AAChD,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,kBAAkB;AAClB,2BAA2B;AAC3B,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU;AACV,wBAAwB;AACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/figma/extractors/index.ts"],"names":[],"mappings":"AASA,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,uDAAuD;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,gDAAgD;AAChD,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,kBAAkB;AAClB,2BAA2B;AAC3B,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU;AACV,wBAAwB;AACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,wCAAwC;AACxC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GAUnB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Semantic FigJam Data Extractor
3
+ *
4
+ * Extracts semantically meaningful data from FigJam boards while discarding
5
+ * positional/visual information. Produces deterministic, diff-friendly output.
6
+ */
7
+ import type { SimplifiedDesign, SimplifiedNode } from "./types.js";
8
+ export type StickyCategory = "blocker" | "tbd" | "si-investigation" | "done" | "info" | "note" | "unknown";
9
+ export interface SemanticExtract {
10
+ fileKey: string;
11
+ nodeId: string | null;
12
+ title: string;
13
+ fetchedAt: string;
14
+ sections: SectionSummary[];
15
+ stickies: StickyNote[];
16
+ components: ComponentSummary[];
17
+ textNodes: TextNodeSummary[];
18
+ connectors: ConnectorSummary[];
19
+ userStories: UserStoryRef[];
20
+ stats: {
21
+ totalNodes: number;
22
+ nodesDropped: number;
23
+ };
24
+ }
25
+ export interface SectionSummary {
26
+ id: string;
27
+ name: string;
28
+ parentSectionId: string | null;
29
+ }
30
+ export interface StickyNote {
31
+ id: string;
32
+ category: StickyCategory;
33
+ text: string;
34
+ parentSectionId: string | null;
35
+ }
36
+ export interface ComponentSummary {
37
+ id: string;
38
+ type: string;
39
+ name: string;
40
+ text: string;
41
+ parentSectionId: string | null;
42
+ componentId?: string;
43
+ properties?: Record<string, string>;
44
+ }
45
+ export interface TextNodeSummary {
46
+ id: string;
47
+ text: string;
48
+ parentSectionId: string | null;
49
+ }
50
+ export interface ConnectorSummary {
51
+ id: string;
52
+ fromNodeId: string;
53
+ toNodeId: string;
54
+ fromNodeName?: string;
55
+ toNodeName?: string;
56
+ label?: string;
57
+ }
58
+ export interface UserStoryRef {
59
+ id: number;
60
+ type: "US" | "Story" | "Task" | "Bug";
61
+ foundIn: string[];
62
+ contexts: string[];
63
+ }
64
+ export interface SemanticExtractOptions {
65
+ /** Custom sticky color category overrides (hex -> category) */
66
+ stickyColorOverrides?: Record<string, StickyCategory>;
67
+ /** Custom regex pattern for story ID extraction */
68
+ storyIdPattern?: RegExp;
69
+ }
70
+ /**
71
+ * Categorize a sticky note based on its fill color.
72
+ * Accepts fills in the format from SimplifiedNode (string reference to globalVars
73
+ * or direct color value).
74
+ */
75
+ export declare function categorizeStickyColor(fills: string | undefined, globalVars?: {
76
+ styles?: Record<string, unknown>;
77
+ }, overrides?: Record<string, StickyCategory>): StickyCategory;
78
+ /**
79
+ * Extract user story/task/bug IDs from text content.
80
+ * Uses strict pattern requiring prefix.
81
+ */
82
+ export declare function extractUserStories(nodes: SimplifiedNode[], pattern?: RegExp): UserStoryRef[];
83
+ /**
84
+ * Extract semantic data from a simplified Figma design.
85
+ *
86
+ * @param design - The simplified design from getFigmaData
87
+ * @param fileKey - The Figma file key
88
+ * @param nodeId - Optional node ID that was fetched
89
+ * @param options - Extraction options
90
+ * @returns Semantic extract with deterministic, diff-friendly structure
91
+ */
92
+ export declare function extractSemanticData(design: SimplifiedDesign, fileKey: string, nodeId?: string, options?: SemanticExtractOptions): SemanticExtract;
93
+ //# sourceMappingURL=semantic-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-extractor.d.ts","sourceRoot":"","sources":["../../../src/figma/extractors/semantic-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Semantic FigJam Data Extractor
3
+ *
4
+ * Extracts semantically meaningful data from FigJam boards while discarding
5
+ * positional/visual information. Produces deterministic, diff-friendly output.
6
+ */
7
+ // ============================================================================
8
+ // Constants
9
+ // ============================================================================
10
+ /** Strict pattern requiring prefix: US787, Story #787, Task787, Bug #787 */
11
+ const DEFAULT_STORY_PATTERN = /\b(US|Story|Task|Bug)[#:\s]*(\d+)\b/gi;
12
+ /** Section/grouping node types */
13
+ const SECTION_TYPES = new Set(["SECTION", "FRAME"]);
14
+ /** Sticky note node types */
15
+ const STICKY_TYPES = new Set(["STICKY", "STICKY_NOTE"]);
16
+ /** Component instance types */
17
+ const COMPONENT_TYPES = new Set(["INSTANCE", "COMPONENT"]);
18
+ /**
19
+ * Convert RGB (0-1 range) to HSL
20
+ */
21
+ function rgbToHsl(rgb) {
22
+ const r = rgb.r;
23
+ const g = rgb.g;
24
+ const b = rgb.b;
25
+ const max = Math.max(r, g, b);
26
+ const min = Math.min(r, g, b);
27
+ const l = (max + min) / 2;
28
+ if (max === min) {
29
+ // Achromatic (gray)
30
+ return { h: 0, s: 0, l: l * 100 };
31
+ }
32
+ const d = max - min;
33
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
34
+ let h;
35
+ switch (max) {
36
+ case r:
37
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
38
+ break;
39
+ case g:
40
+ h = ((b - r) / d + 2) / 6;
41
+ break;
42
+ case b:
43
+ default:
44
+ h = ((r - g) / d + 4) / 6;
45
+ break;
46
+ }
47
+ return {
48
+ h: h * 360,
49
+ s: s * 100,
50
+ l: l * 100,
51
+ };
52
+ }
53
+ /**
54
+ * Categorize a sticky note color using HSL hue ranges.
55
+ * More robust than exact hex matching.
56
+ */
57
+ function categorizeByHsl(hsl) {
58
+ const { h, s, l } = hsl;
59
+ // Low saturation = gray (note)
60
+ if (s < 15) {
61
+ return "note";
62
+ }
63
+ // Very light colors with low saturation are also notes
64
+ if (l > 90 && s < 30) {
65
+ return "note";
66
+ }
67
+ // Hue-based categorization
68
+ // Red/Pink: 0-30° and 330-360°
69
+ if (h <= 30 || h >= 330) {
70
+ return "blocker";
71
+ }
72
+ // Yellow: 45-65°
73
+ if (h >= 45 && h <= 65) {
74
+ return "info";
75
+ }
76
+ // Green: 90-150°
77
+ if (h >= 90 && h <= 150) {
78
+ return "done";
79
+ }
80
+ // Blue: 200-259°
81
+ if (h >= 200 && h < 260) {
82
+ return "si-investigation";
83
+ }
84
+ // Purple: 260-330° (light purples can have hue as low as 260)
85
+ if (h >= 260 && h <= 330) {
86
+ return "tbd";
87
+ }
88
+ return "unknown";
89
+ }
90
+ /**
91
+ * Parse a CSS color string to RGB values (0-1 range)
92
+ */
93
+ function parseColorString(colorStr) {
94
+ // Handle hex: #RRGGBB or #RGB
95
+ if (colorStr.startsWith("#")) {
96
+ let hex = colorStr.slice(1);
97
+ if (hex.length === 3) {
98
+ hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
99
+ }
100
+ if (hex.length !== 6)
101
+ return null;
102
+ const r = parseInt(hex.slice(0, 2), 16) / 255;
103
+ const g = parseInt(hex.slice(2, 4), 16) / 255;
104
+ const b = parseInt(hex.slice(4, 6), 16) / 255;
105
+ return { r, g, b };
106
+ }
107
+ // Handle rgba(r, g, b, a) or rgb(r, g, b)
108
+ const rgbaMatch = colorStr.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
109
+ if (rgbaMatch) {
110
+ return {
111
+ r: parseInt(rgbaMatch[1], 10) / 255,
112
+ g: parseInt(rgbaMatch[2], 10) / 255,
113
+ b: parseInt(rgbaMatch[3], 10) / 255,
114
+ };
115
+ }
116
+ return null;
117
+ }
118
+ /**
119
+ * Categorize a sticky note based on its fill color.
120
+ * Accepts fills in the format from SimplifiedNode (string reference to globalVars
121
+ * or direct color value).
122
+ */
123
+ export function categorizeStickyColor(fills, globalVars, overrides) {
124
+ if (!fills)
125
+ return "unknown";
126
+ // Resolve globalVars reference if needed
127
+ let resolvedFills = fills;
128
+ if (globalVars?.styles && fills.startsWith("$") && globalVars.styles[fills.slice(1)]) {
129
+ const resolved = globalVars.styles[fills.slice(1)];
130
+ if (Array.isArray(resolved) && resolved.length > 0) {
131
+ resolvedFills = String(resolved[0]);
132
+ }
133
+ else if (typeof resolved === "string") {
134
+ resolvedFills = resolved;
135
+ }
136
+ }
137
+ // Check for override first (exact match)
138
+ if (overrides && overrides[resolvedFills]) {
139
+ return overrides[resolvedFills];
140
+ }
141
+ // Parse color string
142
+ const rgb = parseColorString(resolvedFills);
143
+ if (!rgb)
144
+ return "unknown";
145
+ // Check overrides with parsed hex
146
+ const hex = "#" +
147
+ Math.round(rgb.r * 255)
148
+ .toString(16)
149
+ .padStart(2, "0") +
150
+ Math.round(rgb.g * 255)
151
+ .toString(16)
152
+ .padStart(2, "0") +
153
+ Math.round(rgb.b * 255)
154
+ .toString(16)
155
+ .padStart(2, "0");
156
+ if (overrides && overrides[hex.toUpperCase()]) {
157
+ return overrides[hex.toUpperCase()];
158
+ }
159
+ // Use HSL-based categorization
160
+ const hsl = rgbToHsl(rgb);
161
+ return categorizeByHsl(hsl);
162
+ }
163
+ // ============================================================================
164
+ // Story ID Extraction
165
+ // ============================================================================
166
+ /**
167
+ * Extract user story/task/bug IDs from text content.
168
+ * Uses strict pattern requiring prefix.
169
+ */
170
+ export function extractUserStories(nodes, pattern = DEFAULT_STORY_PATTERN) {
171
+ const storyMap = new Map();
172
+ function processNode(node) {
173
+ const textContent = getAllText(node);
174
+ if (!textContent)
175
+ return;
176
+ // Reset regex lastIndex for global patterns
177
+ pattern.lastIndex = 0;
178
+ let match;
179
+ while ((match = pattern.exec(textContent)) !== null) {
180
+ const rawType = match[1].toUpperCase();
181
+ const id = parseInt(match[2], 10);
182
+ // Sanity check - skip unreasonable IDs
183
+ if (id < 1 || id > 999999)
184
+ continue;
185
+ // Normalize type to our standard format
186
+ let type;
187
+ if (rawType === "US") {
188
+ type = "US";
189
+ }
190
+ else if (rawType === "STORY") {
191
+ type = "Story";
192
+ }
193
+ else if (rawType === "TASK") {
194
+ type = "Task";
195
+ }
196
+ else {
197
+ type = "Bug";
198
+ }
199
+ if (!storyMap.has(id)) {
200
+ storyMap.set(id, {
201
+ id,
202
+ type,
203
+ foundIn: [],
204
+ contexts: [],
205
+ });
206
+ }
207
+ const ref = storyMap.get(id);
208
+ if (!ref.foundIn.includes(node.id)) {
209
+ ref.foundIn.push(node.id);
210
+ ref.contexts.push(getContextSnippet(node, textContent, match.index));
211
+ }
212
+ }
213
+ // Process children
214
+ if (node.children) {
215
+ for (const child of node.children) {
216
+ processNode(child);
217
+ }
218
+ }
219
+ }
220
+ for (const node of nodes) {
221
+ processNode(node);
222
+ }
223
+ // Sort by ID for determinism
224
+ return Array.from(storyMap.values()).sort((a, b) => a.id - b.id);
225
+ }
226
+ /**
227
+ * Get all text content from a node and its descendants
228
+ */
229
+ function getAllText(node) {
230
+ const parts = [];
231
+ if (node.name)
232
+ parts.push(node.name);
233
+ if (node.text)
234
+ parts.push(node.text);
235
+ // Extract text from component properties
236
+ if (node.componentProperties) {
237
+ for (const prop of node.componentProperties) {
238
+ if (prop.value && typeof prop.value === "string") {
239
+ parts.push(prop.value);
240
+ }
241
+ }
242
+ }
243
+ if (node.children) {
244
+ for (const child of node.children) {
245
+ parts.push(getAllText(child));
246
+ }
247
+ }
248
+ return parts.filter(Boolean).join(" ");
249
+ }
250
+ /**
251
+ * Get context snippet around a match
252
+ */
253
+ function getContextSnippet(node, text, matchIndex) {
254
+ // Prefer node name as context
255
+ if (node.name && node.name.length > 0 && node.name.length < 100) {
256
+ return node.name;
257
+ }
258
+ // Fall back to text snippet
259
+ const start = Math.max(0, matchIndex - 30);
260
+ const end = Math.min(text.length, matchIndex + 30);
261
+ return text.slice(start, end).trim();
262
+ }
263
+ /**
264
+ * Walk the node tree and extract semantic data
265
+ */
266
+ function walkNode(node, ctx) {
267
+ ctx.totalNodes++;
268
+ const type = node.type;
269
+ let nodeProcessed = false;
270
+ // Track current section context
271
+ let sectionId = ctx.currentSectionId;
272
+ // Handle sections
273
+ if (SECTION_TYPES.has(type)) {
274
+ ctx.sections.push({
275
+ id: node.id,
276
+ name: node.name || "",
277
+ parentSectionId: ctx.currentSectionId,
278
+ });
279
+ sectionId = node.id;
280
+ ctx.nodeNameMap.set(node.id, node.name || "");
281
+ nodeProcessed = true;
282
+ }
283
+ // Handle sticky notes
284
+ if (STICKY_TYPES.has(type)) {
285
+ ctx.stickies.push({
286
+ id: node.id,
287
+ category: categorizeStickyColor(node.fills, ctx.globalVars, ctx.stickyColorOverrides),
288
+ text: node.text || "",
289
+ parentSectionId: sectionId,
290
+ });
291
+ ctx.nodeNameMap.set(node.id, node.text || node.name || "");
292
+ nodeProcessed = true;
293
+ }
294
+ // Handle components/instances
295
+ if (COMPONENT_TYPES.has(type)) {
296
+ const properties = {};
297
+ if (node.componentProperties) {
298
+ for (const prop of node.componentProperties) {
299
+ if (prop.value !== undefined) {
300
+ // Clean property name (remove #ID suffix)
301
+ const cleanName = prop.name.replace(/#\d+:\d+$/, "");
302
+ properties[cleanName] = String(prop.value);
303
+ }
304
+ }
305
+ }
306
+ ctx.components.push({
307
+ id: node.id,
308
+ type: type,
309
+ name: node.name || "",
310
+ text: node.text || getAllText(node),
311
+ parentSectionId: sectionId,
312
+ componentId: node.componentId,
313
+ properties: Object.keys(properties).length > 0 ? properties : undefined,
314
+ });
315
+ ctx.nodeNameMap.set(node.id, node.name || "");
316
+ nodeProcessed = true;
317
+ }
318
+ // Handle text nodes (standalone, not part of sticky or component)
319
+ if (type === "TEXT" && !nodeProcessed) {
320
+ if (node.text && node.text.trim().length > 0) {
321
+ ctx.textNodes.push({
322
+ id: node.id,
323
+ text: node.text,
324
+ parentSectionId: sectionId,
325
+ });
326
+ ctx.nodeNameMap.set(node.id, node.text.slice(0, 50));
327
+ }
328
+ nodeProcessed = true;
329
+ }
330
+ // Handle connectors
331
+ if (type === "CONNECTOR") {
332
+ if (node.startNodeId && node.endNodeId) {
333
+ ctx.connectors.push({
334
+ id: node.id,
335
+ fromNodeId: node.startNodeId,
336
+ toNodeId: node.endNodeId,
337
+ label: node.text || undefined,
338
+ });
339
+ }
340
+ nodeProcessed = true;
341
+ }
342
+ // Track dropped nodes (decorative, positional-only)
343
+ if (!nodeProcessed && !node.children?.length) {
344
+ ctx.nodesDropped++;
345
+ }
346
+ // Recurse into children with updated section context
347
+ if (node.children) {
348
+ const savedSection = ctx.currentSectionId;
349
+ ctx.currentSectionId = sectionId;
350
+ for (const child of node.children) {
351
+ walkNode(child, ctx);
352
+ }
353
+ ctx.currentSectionId = savedSection;
354
+ }
355
+ }
356
+ // ============================================================================
357
+ // Main Extraction Function
358
+ // ============================================================================
359
+ /**
360
+ * Extract semantic data from a simplified Figma design.
361
+ *
362
+ * @param design - The simplified design from getFigmaData
363
+ * @param fileKey - The Figma file key
364
+ * @param nodeId - Optional node ID that was fetched
365
+ * @param options - Extraction options
366
+ * @returns Semantic extract with deterministic, diff-friendly structure
367
+ */
368
+ export function extractSemanticData(design, fileKey, nodeId, options) {
369
+ const ctx = {
370
+ sections: [],
371
+ stickies: [],
372
+ components: [],
373
+ textNodes: [],
374
+ connectors: [],
375
+ nodeNameMap: new Map(),
376
+ totalNodes: 0,
377
+ nodesDropped: 0,
378
+ currentSectionId: null,
379
+ globalVars: design.globalVars,
380
+ stickyColorOverrides: options?.stickyColorOverrides,
381
+ };
382
+ // Walk all root nodes
383
+ for (const node of design.nodes) {
384
+ walkNode(node, ctx);
385
+ }
386
+ // Resolve connector node names
387
+ for (const connector of ctx.connectors) {
388
+ connector.fromNodeName = ctx.nodeNameMap.get(connector.fromNodeId);
389
+ connector.toNodeName = ctx.nodeNameMap.get(connector.toNodeId);
390
+ }
391
+ // Extract user stories
392
+ const storyPattern = options?.storyIdPattern || DEFAULT_STORY_PATTERN;
393
+ const userStories = extractUserStories(design.nodes, storyPattern);
394
+ // Sort all arrays by ID for determinism
395
+ const sortById = (arr) => [...arr].sort((a, b) => String(a.id).localeCompare(String(b.id)));
396
+ return {
397
+ fileKey,
398
+ nodeId: nodeId || null,
399
+ title: design.name || "",
400
+ fetchedAt: new Date().toISOString(),
401
+ sections: sortById(ctx.sections),
402
+ stickies: sortById(ctx.stickies),
403
+ components: sortById(ctx.components),
404
+ textNodes: sortById(ctx.textNodes),
405
+ connectors: sortById(ctx.connectors),
406
+ userStories,
407
+ stats: {
408
+ totalNodes: ctx.totalNodes,
409
+ nodesDropped: ctx.nodesDropped,
410
+ },
411
+ };
412
+ }
413
+ //# sourceMappingURL=semantic-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-extractor.js","sourceRoot":"","sources":["../../../src/figma/extractors/semantic-extractor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,YAAY,QAqG1E;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKjD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,YAAY,QAmK1E;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
package/build/index.js CHANGED
@@ -11,6 +11,7 @@ import { pathToFileURL } from "node:url";
11
11
  import { realpathSync } from "node:fs";
12
12
  import { createMcpServer, createEnvLoader, createErrorResponse, createSuccessResponse } from "@mcp-consultant-tools/core";
13
13
  import { FigmaService } from "./FigmaService.js";
14
+ import { extractSemanticData } from "./figma/extractors/semantic-extractor.js";
14
15
  /**
15
16
  * Register Figma tools and prompts to an MCP server
16
17
  * @param server - The MCP server instance
@@ -67,6 +68,46 @@ export function registerFigmaTools(server, figmaService) {
67
68
  return createErrorResponse(error, "get-figma-data");
68
69
  }
69
70
  });
71
+ // Tool: get-figma-semantic-extract
72
+ server.tool("get-figma-semantic-extract", "Extract semantically meaningful data from FigJam boards while discarding positional/visual information. Produces deterministic, diff-friendly output ideal for change detection. Categorizes sticky notes by color, extracts user story IDs, and preserves connector relationships.", {
73
+ fileKey: z.string().describe("Figma file key (alphanumeric string from URL). Example: From 'https://figma.com/board/ABC123/MyBoard', use 'ABC123'"),
74
+ nodeId: z.string().optional().describe("Optional specific node/section ID to fetch. Format: '1234:5678'. If omitted, fetches entire file."),
75
+ stickyColorOverrides: z.record(z.enum([
76
+ "blocker", "tbd", "si-investigation", "done", "info", "note", "unknown"
77
+ ])).optional().describe("Optional color to category overrides. Map hex colors to categories. Example: {'#FF0000': 'blocker', '#00FF00': 'done'}"),
78
+ storyIdPattern: z.string().optional().describe("Optional custom regex pattern for extracting story IDs. Default: strict pattern requiring prefix (US787, Story #787, Task787, Bug #787)"),
79
+ }, async ({ fileKey, nodeId, stickyColorOverrides, storyIdPattern, }) => {
80
+ try {
81
+ const figmaService = getFigmaService();
82
+ // Fetch with fills preserved for sticky categorization
83
+ const dataOptions = {
84
+ excludeStyles: false, // Need fills for sticky color detection
85
+ simplifyConnectors: true,
86
+ simplifyComponentInstances: true,
87
+ tablesToMarkdown: true,
88
+ };
89
+ const rawData = await figmaService.getFigmaData(fileKey, nodeId, undefined, dataOptions);
90
+ // Parse custom story pattern if provided
91
+ let customPattern;
92
+ if (storyIdPattern) {
93
+ try {
94
+ customPattern = new RegExp(storyIdPattern, "gi");
95
+ }
96
+ catch (e) {
97
+ return createErrorResponse(new Error(`Invalid storyIdPattern regex: ${storyIdPattern}`), "get-figma-semantic-extract");
98
+ }
99
+ }
100
+ // Extract semantic data
101
+ const semanticData = extractSemanticData(rawData, fileKey, nodeId, {
102
+ stickyColorOverrides,
103
+ storyIdPattern: customPattern,
104
+ });
105
+ return createSuccessResponse(semanticData);
106
+ }
107
+ catch (error) {
108
+ return createErrorResponse(error, "get-figma-semantic-extract");
109
+ }
110
+ });
70
111
  // Tool: download-figma-images (placeholder for v2)
71
112
  server.tool("download-figma-images", "Download and process images from Figma designs (Coming in v2)", {
72
113
  fileKey: z.string().describe("Figma file key"),
@@ -74,7 +115,7 @@ export function registerFigmaTools(server, figmaService) {
74
115
  }, async ({ fileKey, localPath }) => {
75
116
  return createErrorResponse(new Error("Image download functionality is coming in v2. Use get-figma-data for design metadata."), "download-figma-images");
76
117
  });
77
- console.error("Figma tools registered: 2 tools");
118
+ console.error("Figma tools registered: 3 tools");
78
119
  }
79
120
  /**
80
121
  * Export service class for direct usage
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-consultant-tools/figma",
3
- "version": "23.0.0",
3
+ "version": "26.0.0-beta.1",
4
4
  "description": "MCP server for Figma integration - design data extraction and transformation",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",