@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.
- package/build/figma/extractors/index.d.ts +1 -0
- package/build/figma/extractors/index.d.ts.map +1 -1
- package/build/figma/extractors/index.js +2 -0
- package/build/figma/extractors/index.js.map +1 -1
- package/build/figma/extractors/semantic-extractor.d.ts +93 -0
- package/build/figma/extractors/semantic-extractor.d.ts.map +1 -0
- package/build/figma/extractors/semantic-extractor.js +413 -0
- package/build/figma/extractors/semantic-extractor.js.map +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +42 -1
- package/build/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
package/build/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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:
|
|
118
|
+
console.error("Figma tools registered: 3 tools");
|
|
78
119
|
}
|
|
79
120
|
/**
|
|
80
121
|
* Export service class for direct usage
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC1H,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED