@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,350 @@
1
+ /**
2
+ * Token Architecture Scorer (weight: 0.20)
3
+ *
4
+ * Evaluates the depth and organization of the token system.
5
+ * Checks collection organization, mode coverage, alias usage,
6
+ * token tier depth, type distribution, and description coverage.
7
+ */
8
+ import { buildCollectionNameMap, clamp, getSeverity } from "./types.js";
9
+ /** Maximum examples to include in a finding. */
10
+ const MAX_EXAMPLES = 5;
11
+ /**
12
+ * Check if a value entry is a variable alias reference.
13
+ */
14
+ function isAlias(value) {
15
+ return (typeof value === "object" &&
16
+ value !== null &&
17
+ value.type === "VARIABLE_ALIAS");
18
+ }
19
+ /** Check if variable data was unavailable (vs. genuinely empty). */
20
+ function variableDataUnavailable(data) {
21
+ return (data.dataAvailability !== undefined && !data.dataAvailability.variables);
22
+ }
23
+ /** Message explaining why variable data is missing. */
24
+ function variableUnavailableMessage(data) {
25
+ const reason = data.dataAvailability?.variableError ||
26
+ "Figma Enterprise plan or Desktop Bridge plugin required";
27
+ return `Variable data unavailable: ${reason}. Score reflects missing data, not actual design system quality.`;
28
+ }
29
+ /**
30
+ * Score collection organization.
31
+ * Variables should be organized into collections.
32
+ */
33
+ function scoreCollectionOrganization(data) {
34
+ const count = data.collections.length;
35
+ if (count === 0 && variableDataUnavailable(data)) {
36
+ return {
37
+ id: "token-collection-org",
38
+ label: "Collection organization",
39
+ score: 0,
40
+ severity: "info",
41
+ tooltip: "Variables should be grouped into collections by concern (colors, spacing, typography). More collections = better organization.",
42
+ details: variableUnavailableMessage(data),
43
+ };
44
+ }
45
+ let score;
46
+ if (count >= 3) {
47
+ score = 100;
48
+ }
49
+ else if (count === 2) {
50
+ score = 80;
51
+ }
52
+ else if (count === 1) {
53
+ score = 50;
54
+ }
55
+ else {
56
+ score = 0;
57
+ }
58
+ return {
59
+ id: "token-collection-org",
60
+ label: "Collection organization",
61
+ score: clamp(score),
62
+ severity: getSeverity(score),
63
+ tooltip: "Variables should be grouped into collections by concern (colors, spacing, typography). More collections = better organization.",
64
+ details: count === 0
65
+ ? "No variable collections found. Organize variables into collections."
66
+ : `${count} collection${count === 1 ? "" : "s"} found.`,
67
+ };
68
+ }
69
+ /**
70
+ * Score mode coverage.
71
+ * Collections should have multiple modes (e.g., light/dark).
72
+ */
73
+ function scoreModeCoverage(data) {
74
+ if (data.collections.length === 0) {
75
+ return {
76
+ id: "token-mode-coverage",
77
+ label: "Mode coverage",
78
+ score: 0,
79
+ severity: variableDataUnavailable(data) ? "info" : "fail",
80
+ tooltip: "Collections should support multiple modes (e.g. Light/Dark). This enables theming without duplicating tokens.",
81
+ details: variableDataUnavailable(data)
82
+ ? variableUnavailableMessage(data)
83
+ : "No collections found to evaluate mode coverage.",
84
+ };
85
+ }
86
+ const maxModes = Math.max(...data.collections.map((c) => c.modes?.length ?? 0));
87
+ let score;
88
+ if (maxModes >= 2) {
89
+ score = 100;
90
+ }
91
+ else if (maxModes === 1) {
92
+ score = 50;
93
+ }
94
+ else {
95
+ score = 0;
96
+ }
97
+ return {
98
+ id: "token-mode-coverage",
99
+ label: "Mode coverage",
100
+ score: clamp(score),
101
+ severity: getSeverity(score),
102
+ tooltip: "Collections should support multiple modes (e.g. Light/Dark). This enables theming without duplicating tokens.",
103
+ details: maxModes >= 2
104
+ ? `Collections support up to ${maxModes} modes (e.g., light/dark).`
105
+ : maxModes === 1
106
+ ? "Collections have only 1 mode. Consider adding light/dark modes."
107
+ : "No modes detected in collections.",
108
+ };
109
+ }
110
+ /**
111
+ * Score alias usage.
112
+ * Higher alias percentage indicates better token layering.
113
+ */
114
+ function scoreAliasUsage(data) {
115
+ if (data.variables.length === 0) {
116
+ return {
117
+ id: "token-alias-usage",
118
+ label: "Alias usage",
119
+ score: 0,
120
+ severity: variableDataUnavailable(data) ? "info" : "fail",
121
+ tooltip: "Semantic tokens should reference primitive tokens via aliases rather than hard-coding values. Aliases enable single-source-of-truth updates.",
122
+ details: variableDataUnavailable(data)
123
+ ? variableUnavailableMessage(data)
124
+ : "No variables to evaluate alias usage.",
125
+ };
126
+ }
127
+ const collectionNames = buildCollectionNameMap(data.collections);
128
+ let aliasCount = 0;
129
+ let totalValues = 0;
130
+ const rawValueVars = [];
131
+ for (const variable of data.variables) {
132
+ if (!variable.valuesByMode)
133
+ continue;
134
+ let hasAnyAlias = false;
135
+ for (const modeValues of Object.values(variable.valuesByMode)) {
136
+ totalValues++;
137
+ if (isAlias(modeValues)) {
138
+ aliasCount++;
139
+ hasAnyAlias = true;
140
+ }
141
+ }
142
+ if (!hasAnyAlias) {
143
+ rawValueVars.push(variable);
144
+ }
145
+ }
146
+ if (totalValues === 0) {
147
+ return {
148
+ id: "token-alias-usage",
149
+ label: "Alias usage",
150
+ score: 0,
151
+ severity: "fail",
152
+ tooltip: "Semantic tokens should reference primitive tokens via aliases rather than hard-coding values. Aliases enable single-source-of-truth updates.",
153
+ details: "No variable values found to evaluate.",
154
+ };
155
+ }
156
+ const ratio = aliasCount / totalValues;
157
+ const score = clamp(ratio * 100);
158
+ return {
159
+ id: "token-alias-usage",
160
+ label: "Alias usage",
161
+ score,
162
+ severity: getSeverity(score),
163
+ tooltip: "Semantic tokens should reference primitive tokens via aliases rather than hard-coding values. Aliases enable single-source-of-truth updates.",
164
+ details: `${aliasCount} of ${totalValues} values are aliases (${Math.round(ratio * 100)}%). Higher alias usage indicates better token layering.`,
165
+ examples: rawValueVars.length > 0 ? rawValueVars.slice(0, MAX_EXAMPLES).map((v) => v.name) : undefined,
166
+ locations: rawValueVars.length > 0
167
+ ? rawValueVars.slice(0, MAX_EXAMPLES).map((v) => ({
168
+ name: v.name,
169
+ collection: collectionNames.get(v.variableCollectionId),
170
+ type: "variable",
171
+ }))
172
+ : undefined,
173
+ };
174
+ }
175
+ /**
176
+ * Build a map of variable ID to variable for alias chain tracing.
177
+ */
178
+ function buildVariableMap(variables) {
179
+ const map = new Map();
180
+ for (const v of variables) {
181
+ if (v.id) {
182
+ map.set(v.id, v);
183
+ }
184
+ }
185
+ return map;
186
+ }
187
+ /**
188
+ * Trace the depth of an alias chain starting from a given variable.
189
+ * Returns the number of tiers (1 = raw value, 2 = one alias hop, etc.).
190
+ */
191
+ function traceAliasDepth(variable, variableMap, visited) {
192
+ if (!variable.valuesByMode)
193
+ return 1;
194
+ const values = Object.values(variable.valuesByMode);
195
+ let maxDepth = 1;
196
+ for (const value of values) {
197
+ if (isAlias(value)) {
198
+ const targetId = value.id;
199
+ if (visited.has(targetId))
200
+ continue; // Prevent circular references
201
+ const target = variableMap.get(targetId);
202
+ if (target) {
203
+ visited.add(targetId);
204
+ const depth = 1 + traceAliasDepth(target, variableMap, visited);
205
+ maxDepth = Math.max(maxDepth, depth);
206
+ }
207
+ }
208
+ }
209
+ return maxDepth;
210
+ }
211
+ /**
212
+ * Score token tier depth.
213
+ * Deeper alias chains indicate more sophisticated token architecture.
214
+ */
215
+ function scoreTokenTierDepth(data) {
216
+ if (data.variables.length === 0) {
217
+ return {
218
+ id: "token-tier-depth",
219
+ label: "Token tier depth",
220
+ score: 0,
221
+ severity: variableDataUnavailable(data) ? "info" : "fail",
222
+ tooltip: "A layered token system (primitive -> semantic -> component) enables scalable theming. 3+ tiers indicates mature architecture.",
223
+ details: variableDataUnavailable(data)
224
+ ? variableUnavailableMessage(data)
225
+ : "No variables to evaluate tier depth.",
226
+ };
227
+ }
228
+ const variableMap = buildVariableMap(data.variables);
229
+ let maxDepth = 1;
230
+ for (const variable of data.variables) {
231
+ const visited = new Set();
232
+ if (variable.id)
233
+ visited.add(variable.id);
234
+ const depth = traceAliasDepth(variable, variableMap, visited);
235
+ maxDepth = Math.max(maxDepth, depth);
236
+ }
237
+ let score;
238
+ if (maxDepth >= 3) {
239
+ score = 100;
240
+ }
241
+ else if (maxDepth === 2) {
242
+ score = 67;
243
+ }
244
+ else {
245
+ score = 33;
246
+ }
247
+ return {
248
+ id: "token-tier-depth",
249
+ label: "Token tier depth",
250
+ score: clamp(score),
251
+ severity: getSeverity(score),
252
+ tooltip: "A layered token system (primitive -> semantic -> component) enables scalable theming. 3+ tiers indicates mature architecture.",
253
+ details: `Maximum alias chain depth: ${maxDepth} tier${maxDepth === 1 ? "" : "s"}. 3+ tiers indicates a well-layered token architecture.`,
254
+ };
255
+ }
256
+ /**
257
+ * Score type distribution across variables.
258
+ * A healthy system includes COLOR, FLOAT, and STRING variables.
259
+ */
260
+ function scoreTypeDistribution(data) {
261
+ if (data.variables.length === 0) {
262
+ return {
263
+ id: "token-type-distribution",
264
+ label: "Type distribution",
265
+ score: 0,
266
+ severity: variableDataUnavailable(data) ? "info" : "fail",
267
+ tooltip: "A complete token system includes COLOR, FLOAT, and STRING variables. Missing types indicate gaps in the design language.",
268
+ details: variableDataUnavailable(data)
269
+ ? variableUnavailableMessage(data)
270
+ : "No variables to evaluate type distribution.",
271
+ };
272
+ }
273
+ const expectedTypes = ["COLOR", "FLOAT", "STRING"];
274
+ const presentTypes = new Set(data.variables.map((v) => v.resolvedType));
275
+ const matchCount = expectedTypes.filter((t) => presentTypes.has(t)).length;
276
+ const score = clamp((matchCount / expectedTypes.length) * 100);
277
+ return {
278
+ id: "token-type-distribution",
279
+ label: "Type distribution",
280
+ score,
281
+ severity: getSeverity(score),
282
+ tooltip: "A complete token system includes COLOR, FLOAT, and STRING variables. Missing types indicate gaps in the design language.",
283
+ details: `${matchCount} of ${expectedTypes.length} expected types (COLOR, FLOAT, STRING) present. Found: ${[...presentTypes].join(", ") || "none"}.`,
284
+ };
285
+ }
286
+ /**
287
+ * Score description coverage for variables.
288
+ * Well-documented variables should have non-empty descriptions.
289
+ */
290
+ function scoreDescriptionCoverage(data) {
291
+ if (data.variables.length === 0) {
292
+ return {
293
+ id: "token-description-coverage",
294
+ label: "Description coverage",
295
+ score: 0,
296
+ severity: variableDataUnavailable(data) ? "info" : "fail",
297
+ tooltip: "Variables should have descriptions explaining their purpose and usage context. Descriptions help consumers choose the right token.",
298
+ details: variableDataUnavailable(data)
299
+ ? variableUnavailableMessage(data)
300
+ : "No variables to evaluate description coverage.",
301
+ };
302
+ }
303
+ const collectionNames = buildCollectionNameMap(data.collections);
304
+ const withDesc = data.variables.filter((v) => v.description && v.description.trim().length > 0);
305
+ const withoutDesc = data.variables.filter((v) => !v.description || v.description.trim().length === 0);
306
+ const ratio = withDesc.length / data.variables.length;
307
+ const score = clamp(ratio * 100);
308
+ return {
309
+ id: "token-description-coverage",
310
+ label: "Description coverage",
311
+ score,
312
+ severity: getSeverity(score),
313
+ tooltip: "Variables should have descriptions explaining their purpose and usage context. Descriptions help consumers choose the right token.",
314
+ details: `${withDesc.length} of ${data.variables.length} variables have descriptions (${Math.round(ratio * 100)}%).`,
315
+ examples: withoutDesc.length > 0
316
+ ? withoutDesc.slice(0, MAX_EXAMPLES).map((v) => v.name)
317
+ : undefined,
318
+ locations: withoutDesc.length > 0
319
+ ? withoutDesc.slice(0, MAX_EXAMPLES).map((v) => ({
320
+ name: v.name,
321
+ collection: collectionNames.get(v.variableCollectionId),
322
+ type: "variable",
323
+ }))
324
+ : undefined,
325
+ };
326
+ }
327
+ /**
328
+ * Token Architecture category scorer.
329
+ * Returns the average score across all token architecture checks.
330
+ */
331
+ export function scoreTokenArchitecture(data) {
332
+ const findings = [
333
+ scoreCollectionOrganization(data),
334
+ scoreModeCoverage(data),
335
+ scoreAliasUsage(data),
336
+ scoreTokenTierDepth(data),
337
+ scoreTypeDistribution(data),
338
+ scoreDescriptionCoverage(data),
339
+ ];
340
+ const score = clamp(findings.reduce((sum, f) => sum + f.score, 0) / findings.length);
341
+ return {
342
+ id: "token-architecture",
343
+ label: "Token Architecture",
344
+ shortLabel: "Tokens",
345
+ score,
346
+ weight: 0.2,
347
+ findings,
348
+ };
349
+ }
350
+ //# sourceMappingURL=token-architecture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-architecture.js","sourceRoot":"","sources":["../../../../src/apps/design-system-dashboard/scoring/token-architecture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Design System Dashboard — Shared Types
3
+ *
4
+ * Defines the JSON contract between the scoring engine (server-side),
5
+ * the server registration (tools), and the UI (client-side rendering).
6
+ */
7
+ export type FindingSeverity = "pass" | "warning" | "fail" | "info";
8
+ /** A single audit check result. */
9
+ export interface Finding {
10
+ id: string;
11
+ label: string;
12
+ score: number;
13
+ severity: FindingSeverity;
14
+ tooltip?: string;
15
+ details?: string;
16
+ examples?: string[];
17
+ locations?: Array<{
18
+ name: string;
19
+ collection?: string;
20
+ nodeId?: string;
21
+ type?: string;
22
+ }>;
23
+ }
24
+ /** Build a map of collection ID → collection name for location context. */
25
+ export declare function buildCollectionNameMap(collections: any[]): Map<string, string>;
26
+ /** A scored category (one of the 6 gauge rings). */
27
+ export interface CategoryScore {
28
+ id: string;
29
+ label: string;
30
+ shortLabel: string;
31
+ score: number;
32
+ weight: number;
33
+ findings: Finding[];
34
+ }
35
+ /** Complete dashboard payload sent to the UI. */
36
+ export interface DashboardData {
37
+ overall: number;
38
+ status: "good" | "needs-work" | "poor";
39
+ categories: CategoryScore[];
40
+ summary: string[];
41
+ meta: {
42
+ componentCount: number;
43
+ variableCount: number;
44
+ collectionCount: number;
45
+ styleCount: number;
46
+ componentSetCount: number;
47
+ standaloneCount: number;
48
+ variantCount: number;
49
+ timestamp: number;
50
+ };
51
+ fileInfo?: FileInfo;
52
+ dataAvailability?: DataAvailability;
53
+ }
54
+ /** File metadata from Figma REST API. */
55
+ export interface FileInfo {
56
+ name: string;
57
+ lastModified: string;
58
+ version?: string;
59
+ thumbnailUrl?: string;
60
+ }
61
+ /** Tracks which data sources were successfully fetched. */
62
+ export interface DataAvailability {
63
+ variables: boolean;
64
+ collections: boolean;
65
+ components: boolean;
66
+ styles: boolean;
67
+ variableError?: string;
68
+ }
69
+ /** Raw data fetched from Figma tools, passed into the scoring engine. */
70
+ export interface DesignSystemRawData {
71
+ variables: any[];
72
+ collections: any[];
73
+ components: any[];
74
+ styles: any[];
75
+ componentSets: any[];
76
+ fileInfo?: FileInfo;
77
+ dataAvailability?: DataAvailability;
78
+ }
79
+ /** Each category module exports a function matching this signature. */
80
+ export type CategoryScorer = (data: DesignSystemRawData) => CategoryScore;
81
+ export declare const THRESHOLDS: {
82
+ readonly GOOD: 90;
83
+ readonly NEEDS_WORK: 50;
84
+ };
85
+ export declare function getStatus(score: number): DashboardData["status"];
86
+ export declare function getSeverity(score: number): FindingSeverity;
87
+ /** Clamp a number to 0-100. */
88
+ export declare function clamp(value: number): number;
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/apps/design-system-dashboard/scoring/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Design System Dashboard — Shared Types
3
+ *
4
+ * Defines the JSON contract between the scoring engine (server-side),
5
+ * the server registration (tools), and the UI (client-side rendering).
6
+ */
7
+ /** Build a map of collection ID → collection name for location context. */
8
+ export function buildCollectionNameMap(collections) {
9
+ const map = new Map();
10
+ for (const col of collections) {
11
+ if (col.id && col.name)
12
+ map.set(col.id, col.name);
13
+ }
14
+ return map;
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // Thresholds and helpers
18
+ // ---------------------------------------------------------------------------
19
+ export const THRESHOLDS = {
20
+ GOOD: 90,
21
+ NEEDS_WORK: 50,
22
+ };
23
+ export function getStatus(score) {
24
+ if (score >= THRESHOLDS.GOOD)
25
+ return "good";
26
+ if (score >= THRESHOLDS.NEEDS_WORK)
27
+ return "needs-work";
28
+ return "poor";
29
+ }
30
+ export function getSeverity(score) {
31
+ if (score >= THRESHOLDS.GOOD)
32
+ return "pass";
33
+ if (score >= THRESHOLDS.NEEDS_WORK)
34
+ return "warning";
35
+ return "fail";
36
+ }
37
+ /** Clamp a number to 0-100. */
38
+ export function clamp(value) {
39
+ return Math.max(0, Math.min(100, Math.round(value)));
40
+ }
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/apps/design-system-dashboard/scoring/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,WAAkB;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAuED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,EAAE;CACL,CAAC;AAEX,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAC5C,IAAI,KAAK,IAAI,UAAU,CAAC,UAAU;QAAE,OAAO,YAAY,CAAC;IACxD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAC5C,IAAI,KAAK,IAAI,UAAU,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IACrD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,KAAK,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Design System Dashboard MCP App - Server Registration
3
+ *
4
+ * Registers tools and resource for the Design System Dashboard MCP App.
5
+ * Uses the official @modelcontextprotocol/ext-apps helpers for proper
6
+ * MCP Apps protocol compatibility with Claude Desktop.
7
+ *
8
+ * Data flow:
9
+ * 1. LLM calls figma_audit_design_system → server fetches + scores data,
10
+ * returns SHORT summary to LLM (avoids context exhaustion)
11
+ * 2. UI opens, connects, calls ds_dashboard_refresh (app-only visibility)
12
+ * 3. ds_dashboard_refresh returns full JSON → UI renders
13
+ */
14
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ import type { DesignSystemRawData } from "./scoring/types.js";
16
+ /**
17
+ * Register the Design System Dashboard MCP App with the server.
18
+ *
19
+ * @param server - The MCP server instance
20
+ * @param getDesignSystemData - Function to fetch raw design system data from Figma
21
+ * @param getCurrentUrl - Optional function to get the current browser URL (for lastFileUrl tracking)
22
+ */
23
+ export declare function registerDesignSystemDashboardApp(server: McpServer, getDesignSystemData: (fileUrl?: string) => Promise<DesignSystemRawData>, getCurrentUrl?: () => string | null): void;
24
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/apps/design-system-dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAU7E;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC/C,MAAM,EAAE,SAAS,EACjB,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,EACvE,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GACjC,IAAI,CA0JN"}