@mp3wizard/figma-console-mcp 1.14.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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +816 -0
  3. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
  4. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
  5. package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
  6. package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
  7. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
  8. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
  9. package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
  10. package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
  11. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
  12. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
  13. package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
  14. package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
  15. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
  16. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
  17. package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
  18. package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
  19. package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
  20. package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
  21. package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
  22. package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
  23. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
  24. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
  25. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
  26. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
  27. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
  28. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
  29. package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
  30. package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
  31. package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
  32. package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
  33. package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
  34. package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
  35. package/dist/apps/design-system-dashboard/server.d.ts +24 -0
  36. package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
  37. package/dist/apps/design-system-dashboard/server.js +160 -0
  38. package/dist/apps/design-system-dashboard/server.js.map +1 -0
  39. package/dist/apps/token-browser/server.d.ts +26 -0
  40. package/dist/apps/token-browser/server.d.ts.map +1 -0
  41. package/dist/apps/token-browser/server.js +137 -0
  42. package/dist/apps/token-browser/server.js.map +1 -0
  43. package/dist/browser/base.d.ts +58 -0
  44. package/dist/browser/base.d.ts.map +1 -0
  45. package/dist/browser/base.js +6 -0
  46. package/dist/browser/base.js.map +1 -0
  47. package/dist/browser/local.d.ts +87 -0
  48. package/dist/browser/local.d.ts.map +1 -0
  49. package/dist/browser/local.js +318 -0
  50. package/dist/browser/local.js.map +1 -0
  51. package/dist/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
  52. package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
  53. package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
  54. package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
  55. package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
  56. package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
  57. package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
  58. package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
  59. package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
  60. package/dist/cloudflare/apps/token-browser/server.js +136 -0
  61. package/dist/cloudflare/browser/base.js +5 -0
  62. package/dist/cloudflare/browser/cloudflare.js +156 -0
  63. package/dist/cloudflare/browser-manager.js +157 -0
  64. package/dist/cloudflare/core/cloud-websocket-connector.js +267 -0
  65. package/dist/cloudflare/core/cloud-websocket-relay.js +199 -0
  66. package/dist/cloudflare/core/comment-tools.js +292 -0
  67. package/dist/cloudflare/core/config.js +161 -0
  68. package/dist/cloudflare/core/console-monitor.js +427 -0
  69. package/dist/cloudflare/core/design-code-tools.js +2504 -0
  70. package/dist/cloudflare/core/design-system-manifest.js +260 -0
  71. package/dist/cloudflare/core/design-system-tools.js +863 -0
  72. package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
  73. package/dist/cloudflare/core/enrichment/index.js +7 -0
  74. package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
  75. package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
  76. package/dist/cloudflare/core/figma-api.js +409 -0
  77. package/dist/cloudflare/core/figma-connector.js +7 -0
  78. package/dist/cloudflare/core/figma-desktop-connector.js +1184 -0
  79. package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
  80. package/dist/cloudflare/core/figma-style-extractor.js +311 -0
  81. package/dist/cloudflare/core/figma-tools.js +2947 -0
  82. package/dist/cloudflare/core/logger.js +53 -0
  83. package/dist/cloudflare/core/port-discovery.js +282 -0
  84. package/dist/cloudflare/core/snippet-injector.js +96 -0
  85. package/dist/cloudflare/core/types/design-code.js +4 -0
  86. package/dist/cloudflare/core/types/enriched.js +5 -0
  87. package/dist/cloudflare/core/types/index.js +4 -0
  88. package/dist/cloudflare/core/websocket-connector.js +256 -0
  89. package/dist/cloudflare/core/websocket-server.js +646 -0
  90. package/dist/cloudflare/core/write-tools.js +2091 -0
  91. package/dist/cloudflare/index.js +2899 -0
  92. package/dist/cloudflare/test-browser.js +88 -0
  93. package/dist/core/comment-tools.d.ts +11 -0
  94. package/dist/core/comment-tools.d.ts.map +1 -0
  95. package/dist/core/comment-tools.js +293 -0
  96. package/dist/core/comment-tools.js.map +1 -0
  97. package/dist/core/config.d.ts +17 -0
  98. package/dist/core/config.d.ts.map +1 -0
  99. package/dist/core/config.js +162 -0
  100. package/dist/core/config.js.map +1 -0
  101. package/dist/core/console-monitor.d.ts +82 -0
  102. package/dist/core/console-monitor.d.ts.map +1 -0
  103. package/dist/core/console-monitor.js +428 -0
  104. package/dist/core/console-monitor.js.map +1 -0
  105. package/dist/core/design-code-tools.d.ts +127 -0
  106. package/dist/core/design-code-tools.d.ts.map +1 -0
  107. package/dist/core/design-code-tools.js +2505 -0
  108. package/dist/core/design-code-tools.js.map +1 -0
  109. package/dist/core/design-system-manifest.d.ts +272 -0
  110. package/dist/core/design-system-manifest.d.ts.map +1 -0
  111. package/dist/core/design-system-manifest.js +261 -0
  112. package/dist/core/design-system-manifest.js.map +1 -0
  113. package/dist/core/design-system-tools.d.ts +17 -0
  114. package/dist/core/design-system-tools.d.ts.map +1 -0
  115. package/dist/core/design-system-tools.js +864 -0
  116. package/dist/core/design-system-tools.js.map +1 -0
  117. package/dist/core/enrichment/enrichment-service.d.ts +52 -0
  118. package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
  119. package/dist/core/enrichment/enrichment-service.js +273 -0
  120. package/dist/core/enrichment/enrichment-service.js.map +1 -0
  121. package/dist/core/enrichment/index.d.ts +8 -0
  122. package/dist/core/enrichment/index.d.ts.map +1 -0
  123. package/dist/core/enrichment/index.js +8 -0
  124. package/dist/core/enrichment/index.js.map +1 -0
  125. package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
  126. package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
  127. package/dist/core/enrichment/relationship-mapper.js +352 -0
  128. package/dist/core/enrichment/relationship-mapper.js.map +1 -0
  129. package/dist/core/enrichment/style-resolver.d.ts +80 -0
  130. package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
  131. package/dist/core/enrichment/style-resolver.js +327 -0
  132. package/dist/core/enrichment/style-resolver.js.map +1 -0
  133. package/dist/core/figma-api.d.ts +201 -0
  134. package/dist/core/figma-api.d.ts.map +1 -0
  135. package/dist/core/figma-api.js +410 -0
  136. package/dist/core/figma-api.js.map +1 -0
  137. package/dist/core/figma-connector.d.ts +48 -0
  138. package/dist/core/figma-connector.d.ts.map +1 -0
  139. package/dist/core/figma-connector.js +8 -0
  140. package/dist/core/figma-connector.js.map +1 -0
  141. package/dist/core/figma-desktop-connector.d.ts +265 -0
  142. package/dist/core/figma-desktop-connector.d.ts.map +1 -0
  143. package/dist/core/figma-desktop-connector.js +1184 -0
  144. package/dist/core/figma-desktop-connector.js.map +1 -0
  145. package/dist/core/figma-reconstruction-spec.d.ts +166 -0
  146. package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
  147. package/dist/core/figma-reconstruction-spec.js +403 -0
  148. package/dist/core/figma-reconstruction-spec.js.map +1 -0
  149. package/dist/core/figma-style-extractor.d.ts +76 -0
  150. package/dist/core/figma-style-extractor.d.ts.map +1 -0
  151. package/dist/core/figma-style-extractor.js +312 -0
  152. package/dist/core/figma-style-extractor.js.map +1 -0
  153. package/dist/core/figma-tools.d.ts +23 -0
  154. package/dist/core/figma-tools.d.ts.map +1 -0
  155. package/dist/core/figma-tools.js +2948 -0
  156. package/dist/core/figma-tools.js.map +1 -0
  157. package/dist/core/logger.d.ts +22 -0
  158. package/dist/core/logger.d.ts.map +1 -0
  159. package/dist/core/logger.js +54 -0
  160. package/dist/core/logger.js.map +1 -0
  161. package/dist/core/port-discovery.d.ts +110 -0
  162. package/dist/core/port-discovery.d.ts.map +1 -0
  163. package/dist/core/port-discovery.js +283 -0
  164. package/dist/core/port-discovery.js.map +1 -0
  165. package/dist/core/snippet-injector.d.ts +24 -0
  166. package/dist/core/snippet-injector.d.ts.map +1 -0
  167. package/dist/core/snippet-injector.js +97 -0
  168. package/dist/core/snippet-injector.js.map +1 -0
  169. package/dist/core/types/design-code.d.ts +262 -0
  170. package/dist/core/types/design-code.d.ts.map +1 -0
  171. package/dist/core/types/design-code.js +5 -0
  172. package/dist/core/types/design-code.js.map +1 -0
  173. package/dist/core/types/enriched.d.ts +213 -0
  174. package/dist/core/types/enriched.d.ts.map +1 -0
  175. package/dist/core/types/enriched.js +6 -0
  176. package/dist/core/types/enriched.js.map +1 -0
  177. package/dist/core/types/index.d.ts +112 -0
  178. package/dist/core/types/index.d.ts.map +1 -0
  179. package/dist/core/types/index.js +5 -0
  180. package/dist/core/types/index.js.map +1 -0
  181. package/dist/core/websocket-connector.d.ts +55 -0
  182. package/dist/core/websocket-connector.d.ts.map +1 -0
  183. package/dist/core/websocket-connector.js +257 -0
  184. package/dist/core/websocket-connector.js.map +1 -0
  185. package/dist/core/websocket-server.d.ts +191 -0
  186. package/dist/core/websocket-server.d.ts.map +1 -0
  187. package/dist/core/websocket-server.js +647 -0
  188. package/dist/core/websocket-server.js.map +1 -0
  189. package/dist/core/write-tools.d.ts +7 -0
  190. package/dist/core/write-tools.d.ts.map +1 -0
  191. package/dist/core/write-tools.js +2092 -0
  192. package/dist/core/write-tools.js.map +1 -0
  193. package/dist/local.d.ts +84 -0
  194. package/dist/local.d.ts.map +1 -0
  195. package/dist/local.js +5039 -0
  196. package/dist/local.js.map +1 -0
  197. package/figma-desktop-bridge/README.md +313 -0
  198. package/figma-desktop-bridge/code.js +2818 -0
  199. package/figma-desktop-bridge/manifest.json +67 -0
  200. package/figma-desktop-bridge/ui.html +1236 -0
  201. package/package.json +87 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Design System Manifest Types
3
+ *
4
+ * A structured representation of a Figma design system that enables
5
+ * high-fidelity AI-assisted design generation.
6
+ */
7
+ /**
8
+ * Cache for design system manifests with TTL-based invalidation.
9
+ * Singleton pattern to share cache across tool calls.
10
+ */
11
+ export class DesignSystemManifestCache {
12
+ constructor() {
13
+ this.cache = new Map();
14
+ this.TTL_MS = 5 * 60 * 1000; // 5 minutes
15
+ }
16
+ static getInstance() {
17
+ if (!DesignSystemManifestCache.instance) {
18
+ DesignSystemManifestCache.instance = new DesignSystemManifestCache();
19
+ }
20
+ return DesignSystemManifestCache.instance;
21
+ }
22
+ get(fileKey) {
23
+ const entry = this.cache.get(fileKey);
24
+ if (!entry)
25
+ return null;
26
+ if (!this.isValid(entry)) {
27
+ this.cache.delete(fileKey);
28
+ return null;
29
+ }
30
+ return entry;
31
+ }
32
+ set(fileKey, manifest, rawComponents) {
33
+ this.cache.set(fileKey, {
34
+ manifest,
35
+ timestamp: Date.now(),
36
+ fileKey,
37
+ rawComponents,
38
+ });
39
+ }
40
+ invalidate(fileKey) {
41
+ this.cache.delete(fileKey);
42
+ }
43
+ invalidateAll() {
44
+ this.cache.clear();
45
+ }
46
+ isValid(entry) {
47
+ return Date.now() - entry.timestamp < this.TTL_MS;
48
+ }
49
+ getStats() {
50
+ const stats = [];
51
+ for (const [fileKey, entry] of this.cache) {
52
+ stats.push({
53
+ fileKey,
54
+ age: Math.round((Date.now() - entry.timestamp) / 1000),
55
+ componentCount: entry.manifest.summary.totalComponents + entry.manifest.summary.totalComponentSets,
56
+ tokenCount: entry.manifest.summary.totalTokens,
57
+ });
58
+ }
59
+ return stats;
60
+ }
61
+ }
62
+ /**
63
+ * Search components by name, category, or description
64
+ */
65
+ export function searchComponents(manifest, query, options) {
66
+ const limit = options?.limit ?? 10;
67
+ const offset = options?.offset ?? 0;
68
+ const queryLower = query.toLowerCase();
69
+ const categoryLower = options?.category?.toLowerCase();
70
+ const allResults = [];
71
+ // Search component sets first (they're typically the main design system components)
72
+ for (const [name, compSet] of Object.entries(manifest.componentSets)) {
73
+ const nameLower = name.toLowerCase();
74
+ const descLower = compSet.description?.toLowerCase() || '';
75
+ const matchesQuery = !query || nameLower.includes(queryLower) || descLower.includes(queryLower);
76
+ const matchesCategory = !categoryLower || inferCategory(name).toLowerCase().includes(categoryLower);
77
+ if (matchesQuery && matchesCategory) {
78
+ allResults.push({
79
+ name: compSet.name,
80
+ key: compSet.key,
81
+ nodeId: compSet.nodeId,
82
+ type: 'componentSet',
83
+ description: compSet.description,
84
+ category: inferCategory(name),
85
+ variantCount: compSet.variants?.length || 0,
86
+ });
87
+ }
88
+ }
89
+ // Then search standalone components
90
+ for (const [name, comp] of Object.entries(manifest.components)) {
91
+ const nameLower = name.toLowerCase();
92
+ const descLower = comp.description?.toLowerCase() || '';
93
+ const matchesQuery = !query || nameLower.includes(queryLower) || descLower.includes(queryLower);
94
+ const matchesCategory = !categoryLower || inferCategory(name).toLowerCase().includes(categoryLower);
95
+ if (matchesQuery && matchesCategory) {
96
+ allResults.push({
97
+ name: comp.name,
98
+ key: comp.key,
99
+ nodeId: comp.nodeId,
100
+ type: 'component',
101
+ description: comp.description,
102
+ category: inferCategory(name),
103
+ defaultSize: comp.defaultSize,
104
+ });
105
+ }
106
+ }
107
+ const total = allResults.length;
108
+ const paginatedResults = allResults.slice(offset, offset + limit);
109
+ const hasMore = offset + limit < total;
110
+ return { results: paginatedResults, total, hasMore };
111
+ }
112
+ /**
113
+ * Infer category from component name (e.g., "Button/Primary" -> "Button")
114
+ */
115
+ function inferCategory(name) {
116
+ const parts = name.split('/');
117
+ return parts[0] || 'Uncategorized';
118
+ }
119
+ /**
120
+ * Get unique categories from manifest
121
+ */
122
+ export function getCategories(manifest) {
123
+ const categories = new Map();
124
+ for (const name of Object.keys(manifest.componentSets)) {
125
+ const cat = inferCategory(name);
126
+ const existing = categories.get(cat) || { componentCount: 0, componentSetCount: 0 };
127
+ existing.componentSetCount++;
128
+ categories.set(cat, existing);
129
+ }
130
+ for (const name of Object.keys(manifest.components)) {
131
+ const cat = inferCategory(name);
132
+ const existing = categories.get(cat) || { componentCount: 0, componentSetCount: 0 };
133
+ existing.componentCount++;
134
+ categories.set(cat, existing);
135
+ }
136
+ return Array.from(categories.entries())
137
+ .map(([name, counts]) => ({ name, ...counts }))
138
+ .sort((a, b) => (b.componentCount + b.componentSetCount) - (a.componentCount + a.componentSetCount));
139
+ }
140
+ /**
141
+ * Get token categories and counts for summary
142
+ */
143
+ export function getTokenSummary(manifest) {
144
+ // Group colors by prefix (e.g., "primary/500" -> "primary")
145
+ const colorGroups = new Set();
146
+ for (const name of Object.keys(manifest.tokens.colors)) {
147
+ const group = name.split('/')[0];
148
+ colorGroups.add(group);
149
+ }
150
+ // Group typography by prefix
151
+ const typographyGroups = new Set();
152
+ for (const name of Object.keys(manifest.tokens.typography)) {
153
+ const group = name.split('/')[0];
154
+ typographyGroups.add(group);
155
+ }
156
+ // Get spacing scale values
157
+ const spacingValues = Object.values(manifest.tokens.spacing)
158
+ .map(t => t.value)
159
+ .filter((v, i, arr) => arr.indexOf(v) === i)
160
+ .sort((a, b) => a - b);
161
+ return {
162
+ colors: {
163
+ count: Object.keys(manifest.tokens.colors).length,
164
+ groups: Array.from(colorGroups).slice(0, 10),
165
+ },
166
+ spacing: {
167
+ count: Object.keys(manifest.tokens.spacing).length,
168
+ scale: spacingValues.slice(0, 15),
169
+ },
170
+ typography: {
171
+ count: Object.keys(manifest.tokens.typography).length,
172
+ groups: Array.from(typographyGroups).slice(0, 10),
173
+ },
174
+ effects: {
175
+ count: Object.keys(manifest.tokens.effects).length,
176
+ },
177
+ collections: manifest.collections.map(c => c.name),
178
+ };
179
+ }
180
+ // ============================================================================
181
+ // HELPER FUNCTIONS
182
+ // ============================================================================
183
+ /**
184
+ * Convert RGB color object to hex string
185
+ */
186
+ export function rgbToHex(color) {
187
+ const toHex = (n) => Math.round(n * 255).toString(16).padStart(2, '0');
188
+ return `#${toHex(color.r)}${toHex(color.g)}${toHex(color.b)}`.toUpperCase();
189
+ }
190
+ /**
191
+ * Parse a Figma color value to hex
192
+ */
193
+ export function figmaColorToHex(value) {
194
+ if (typeof value === 'string')
195
+ return value;
196
+ if (value && typeof value === 'object' && 'r' in value) {
197
+ return rgbToHex(value);
198
+ }
199
+ return '#000000';
200
+ }
201
+ /**
202
+ * Generate a human-readable summary of the manifest
203
+ */
204
+ export function generateManifestSummary(manifest) {
205
+ const lines = [
206
+ `# Design System Manifest`,
207
+ ``,
208
+ `**File:** ${manifest.fileName || manifest.fileKey}`,
209
+ `**Generated:** ${new Date(manifest.generatedAt).toISOString()}`,
210
+ ``,
211
+ `## Summary`,
212
+ `- **${manifest.summary.totalTokens}** design tokens`,
213
+ `- **${manifest.summary.totalComponents}** components`,
214
+ `- **${manifest.summary.totalComponentSets}** component sets`,
215
+ ``,
216
+ `## Color Palette`,
217
+ manifest.summary.colorPalette.slice(0, 10).map(c => `- ${c}`).join('\n'),
218
+ ``,
219
+ `## Spacing Scale`,
220
+ `${manifest.summary.spacingScale.join('px, ')}px`,
221
+ ``,
222
+ `## Typography`,
223
+ manifest.summary.typographyScale.slice(0, 10).map(t => `- ${t}`).join('\n'),
224
+ ``,
225
+ `## Component Categories`,
226
+ manifest.summary.componentCategories.map(c => `- ${c}`).join('\n'),
227
+ ];
228
+ return lines.join('\n');
229
+ }
230
+ /**
231
+ * Create an empty manifest template
232
+ */
233
+ export function createEmptyManifest(fileKey) {
234
+ return {
235
+ version: '1.0.0',
236
+ generatedAt: Date.now(),
237
+ fileKey,
238
+ collections: [],
239
+ tokens: {
240
+ colors: {},
241
+ spacing: {},
242
+ typography: {},
243
+ effects: {},
244
+ other: {},
245
+ },
246
+ components: {},
247
+ componentSets: {},
248
+ patterns: {},
249
+ rules: [],
250
+ summary: {
251
+ totalTokens: 0,
252
+ totalComponents: 0,
253
+ totalComponentSets: 0,
254
+ colorPalette: [],
255
+ spacingScale: [],
256
+ typographyScale: [],
257
+ componentCategories: [],
258
+ },
259
+ };
260
+ }