@sxl-studio/bridge 1.7.2 → 1.7.3

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 (197) hide show
  1. package/README.md +342 -16
  2. package/dist/agent-recipes.d.ts +781 -11
  3. package/dist/agent-recipes.js +886 -13
  4. package/dist/agent-recipes.js.map +1 -1
  5. package/dist/agent-runbook.d.ts +50 -0
  6. package/dist/agent-runbook.js +243 -0
  7. package/dist/agent-runbook.js.map +1 -0
  8. package/dist/asset-upload.d.ts +63 -0
  9. package/dist/asset-upload.js +225 -0
  10. package/dist/asset-upload.js.map +1 -0
  11. package/dist/audit-store.d.ts +15 -0
  12. package/dist/audit-store.js +100 -0
  13. package/dist/audit-store.js.map +1 -0
  14. package/dist/audit.d.ts +4 -3
  15. package/dist/audit.js +37 -4
  16. package/dist/audit.js.map +1 -1
  17. package/dist/auth.d.ts +8 -1
  18. package/dist/auth.js +41 -1
  19. package/dist/auth.js.map +1 -1
  20. package/dist/bridge-agent-workflow-validation-cli.d.ts +2 -0
  21. package/dist/bridge-agent-workflow-validation-cli.js +68 -0
  22. package/dist/bridge-agent-workflow-validation-cli.js.map +1 -0
  23. package/dist/bridge-agent-workflow-validation.d.ts +42 -0
  24. package/dist/bridge-agent-workflow-validation.js +170 -0
  25. package/dist/bridge-agent-workflow-validation.js.map +1 -0
  26. package/dist/bridge-contract-audit.d.ts +45 -0
  27. package/dist/bridge-contract-audit.js +345 -0
  28. package/dist/bridge-contract-audit.js.map +1 -0
  29. package/dist/bridge-health-cli.d.ts +2 -0
  30. package/dist/bridge-health-cli.js +115 -0
  31. package/dist/bridge-health-cli.js.map +1 -0
  32. package/dist/bridge-health.d.ts +33 -0
  33. package/dist/bridge-health.js +594 -0
  34. package/dist/bridge-health.js.map +1 -0
  35. package/dist/bridge-live-validation-cli.d.ts +2 -0
  36. package/dist/bridge-live-validation-cli.js +114 -0
  37. package/dist/bridge-live-validation-cli.js.map +1 -0
  38. package/dist/bridge-live-validation.d.ts +39 -0
  39. package/dist/bridge-live-validation.js +1141 -0
  40. package/dist/bridge-live-validation.js.map +1 -0
  41. package/dist/bridge-performance-profile.d.ts +81 -0
  42. package/dist/bridge-performance-profile.js +227 -0
  43. package/dist/bridge-performance-profile.js.map +1 -0
  44. package/dist/bridge-readiness-cli.d.ts +30 -0
  45. package/dist/bridge-readiness-cli.js +242 -0
  46. package/dist/bridge-readiness-cli.js.map +1 -0
  47. package/dist/bridge-runtime-summary.d.ts +50 -0
  48. package/dist/bridge-runtime-summary.js +112 -0
  49. package/dist/bridge-runtime-summary.js.map +1 -0
  50. package/dist/bridge-workflow-smoke-cli.d.ts +2 -0
  51. package/dist/bridge-workflow-smoke-cli.js +126 -0
  52. package/dist/bridge-workflow-smoke-cli.js.map +1 -0
  53. package/dist/bridge-workflow-smoke.d.ts +39 -0
  54. package/dist/bridge-workflow-smoke.js +431 -0
  55. package/dist/bridge-workflow-smoke.js.map +1 -0
  56. package/dist/codeconnect-suggestions.d.ts +74 -0
  57. package/dist/codeconnect-suggestions.js +398 -0
  58. package/dist/codeconnect-suggestions.js.map +1 -0
  59. package/dist/codeconnect-template.d.ts +98 -0
  60. package/dist/codeconnect-template.js +280 -0
  61. package/dist/codeconnect-template.js.map +1 -0
  62. package/dist/command-queue.d.ts +11 -1
  63. package/dist/command-queue.js +200 -1
  64. package/dist/command-queue.js.map +1 -1
  65. package/dist/command-safety.d.ts +13 -0
  66. package/dist/command-safety.js +59 -0
  67. package/dist/command-safety.js.map +1 -0
  68. package/dist/enabled-library-search.d.ts +49 -0
  69. package/dist/enabled-library-search.js +151 -0
  70. package/dist/enabled-library-search.js.map +1 -0
  71. package/dist/figma-mcp-parity.d.ts +49 -0
  72. package/dist/figma-mcp-parity.js +368 -0
  73. package/dist/figma-mcp-parity.js.map +1 -0
  74. package/dist/figma-mcp-skills-parity.d.ts +61 -0
  75. package/dist/figma-mcp-skills-parity.js +434 -0
  76. package/dist/figma-mcp-skills-parity.js.map +1 -0
  77. package/dist/figma-rest-diagnostics.d.ts +50 -0
  78. package/dist/figma-rest-diagnostics.js +314 -0
  79. package/dist/figma-rest-diagnostics.js.map +1 -0
  80. package/dist/figma-rest.d.ts +27 -0
  81. package/dist/figma-rest.js +116 -0
  82. package/dist/figma-rest.js.map +1 -0
  83. package/dist/http-api.d.ts +14 -2
  84. package/dist/http-api.js +323 -17
  85. package/dist/http-api.js.map +1 -1
  86. package/dist/index.js +25 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/mcp-factory.d.ts +6 -1
  89. package/dist/mcp-factory.js +23 -4
  90. package/dist/mcp-factory.js.map +1 -1
  91. package/dist/mcp-runtime-probe.d.ts +22 -0
  92. package/dist/mcp-runtime-probe.js +777 -0
  93. package/dist/mcp-runtime-probe.js.map +1 -0
  94. package/dist/mcp-server.d.ts +2 -1
  95. package/dist/mcp-server.js +2 -2
  96. package/dist/mcp-server.js.map +1 -1
  97. package/dist/sxl-mcp-instructions.js +97 -25
  98. package/dist/sxl-mcp-instructions.js.map +1 -1
  99. package/dist/tools/audit.d.ts +22 -6
  100. package/dist/tools/audit.js +49 -7
  101. package/dist/tools/audit.js.map +1 -1
  102. package/dist/tools/capability-matrix.d.ts +22 -0
  103. package/dist/tools/capability-matrix.js +38 -0
  104. package/dist/tools/capability-matrix.js.map +1 -0
  105. package/dist/tools/catalogue-bootstrap.d.ts +1 -0
  106. package/dist/tools/catalogue-bootstrap.js +665 -30
  107. package/dist/tools/catalogue-bootstrap.js.map +1 -1
  108. package/dist/tools/code-connect-context.d.ts +3 -0
  109. package/dist/tools/code-connect-context.js +319 -0
  110. package/dist/tools/code-connect-context.js.map +1 -0
  111. package/dist/tools/code-connect-template.d.ts +3 -0
  112. package/dist/tools/code-connect-template.js +111 -0
  113. package/dist/tools/code-connect-template.js.map +1 -0
  114. package/dist/tools/composition.js +13 -28
  115. package/dist/tools/composition.js.map +1 -1
  116. package/dist/tools/compositions-orchestration.d.ts +14 -14
  117. package/dist/tools/compositions-orchestration.js +2 -2
  118. package/dist/tools/compositions-orchestration.js.map +1 -1
  119. package/dist/tools/data.js +839 -27
  120. package/dist/tools/data.js.map +1 -1
  121. package/dist/tools/design-context.d.ts +3 -0
  122. package/dist/tools/design-context.js +197 -0
  123. package/dist/tools/design-context.js.map +1 -0
  124. package/dist/tools/destructive-confirmation.d.ts +10 -0
  125. package/dist/tools/destructive-confirmation.js +22 -0
  126. package/dist/tools/destructive-confirmation.js.map +1 -0
  127. package/dist/tools/diagnostics.js +76 -51
  128. package/dist/tools/diagnostics.js.map +1 -1
  129. package/dist/tools/figma-mcp-design.d.ts +3 -0
  130. package/dist/tools/figma-mcp-design.js +377 -0
  131. package/dist/tools/figma-mcp-design.js.map +1 -0
  132. package/dist/tools/figma-nodes.js +57 -43
  133. package/dist/tools/figma-nodes.js.map +1 -1
  134. package/dist/tools/figma-rc-extended.js +23 -6
  135. package/dist/tools/figma-rc-extended.js.map +1 -1
  136. package/dist/tools/figma-rest.d.ts +39 -0
  137. package/dist/tools/figma-rest.js +279 -0
  138. package/dist/tools/figma-rest.js.map +1 -0
  139. package/dist/tools/git.js +11 -7
  140. package/dist/tools/git.js.map +1 -1
  141. package/dist/tools/large-data.d.ts +14 -0
  142. package/dist/tools/large-data.js +189 -0
  143. package/dist/tools/large-data.js.map +1 -0
  144. package/dist/tools/meta.d.ts +6 -1
  145. package/dist/tools/meta.js +89 -11
  146. package/dist/tools/meta.js.map +1 -1
  147. package/dist/tools/metadata.d.ts +3 -0
  148. package/dist/tools/metadata.js +140 -0
  149. package/dist/tools/metadata.js.map +1 -0
  150. package/dist/tools/mockup.d.ts +15 -156
  151. package/dist/tools/mockup.js +54 -121
  152. package/dist/tools/mockup.js.map +1 -1
  153. package/dist/tools/orchestration.js +73 -45
  154. package/dist/tools/orchestration.js.map +1 -1
  155. package/dist/tools/prompts.d.ts +3 -0
  156. package/dist/tools/prompts.js +219 -0
  157. package/dist/tools/prompts.js.map +1 -0
  158. package/dist/tools/registry.d.ts +19 -1
  159. package/dist/tools/registry.js +4 -4
  160. package/dist/tools/registry.js.map +1 -1
  161. package/dist/tools/resources.d.ts +19 -2
  162. package/dist/tools/resources.js +149 -5
  163. package/dist/tools/resources.js.map +1 -1
  164. package/dist/tools/schema-contracts.d.ts +4763 -0
  165. package/dist/tools/schema-contracts.js +814 -0
  166. package/dist/tools/schema-contracts.js.map +1 -0
  167. package/dist/tools/screenshot.d.ts +3 -0
  168. package/dist/tools/screenshot.js +144 -0
  169. package/dist/tools/screenshot.js.map +1 -0
  170. package/dist/tools/shared.d.ts +11 -1
  171. package/dist/tools/shared.js +55 -2
  172. package/dist/tools/shared.js.map +1 -1
  173. package/dist/tools/styles-orchestration.d.ts +2 -2
  174. package/dist/tools/styles-orchestration.js +13 -5
  175. package/dist/tools/styles-orchestration.js.map +1 -1
  176. package/dist/tools/styles.js +22 -8
  177. package/dist/tools/styles.js.map +1 -1
  178. package/dist/tools/tokens.d.ts +31 -692
  179. package/dist/tools/tokens.js +175 -135
  180. package/dist/tools/tokens.js.map +1 -1
  181. package/dist/tools/variable-defs.d.ts +3 -0
  182. package/dist/tools/variable-defs.js +338 -0
  183. package/dist/tools/variable-defs.js.map +1 -0
  184. package/dist/tools/variables-orchestration.js +13 -5
  185. package/dist/tools/variables-orchestration.js.map +1 -1
  186. package/dist/tools/variables.js +18 -15
  187. package/dist/tools/variables.js.map +1 -1
  188. package/dist/types.d.ts +53 -0
  189. package/dist/ultimate-readiness-audit.d.ts +37 -0
  190. package/dist/ultimate-readiness-audit.js +431 -0
  191. package/dist/ultimate-readiness-audit.js.map +1 -0
  192. package/dist/workflow-planner.d.ts +57 -0
  193. package/dist/workflow-planner.js +464 -0
  194. package/dist/workflow-planner.js.map +1 -0
  195. package/dist/ws-server.js +16 -3
  196. package/dist/ws-server.js.map +1 -1
  197. package/package.json +18 -2
@@ -0,0 +1,314 @@
1
+ import { figmaRestGet, fileKeyFromArgs, FigmaRestError, } from "./figma-rest.js";
2
+ export const FIGMA_REST_DIAGNOSTIC_CHECK_IDS = [
3
+ "whoami",
4
+ "fileMetadata",
5
+ "fileNodes",
6
+ "fileImages",
7
+ "fileImageFills",
8
+ "fileComponents",
9
+ "fileComponentSets",
10
+ "fileStyles",
11
+ "teamComponents",
12
+ "teamComponentSets",
13
+ "teamStyles",
14
+ "variablesLocal",
15
+ "variablesPublished",
16
+ ];
17
+ const DEFAULT_API_BASE_URL = "https://api.figma.com";
18
+ const DEFAULT_TOKEN_ENVS = ["FIGMA_TOKEN", "FIGMA_ACCESS_TOKEN", "FIGMA_REST_TOKEN"];
19
+ const FIGMA_REST_DIAGNOSTIC_SOURCES = [
20
+ "https://developers.figma.com/docs/rest-api/scopes/",
21
+ "https://developers.figma.com/docs/rest-api/file-endpoints/",
22
+ "https://developers.figma.com/docs/rest-api/component-endpoints/",
23
+ "https://developers.figma.com/docs/rest-api/variables-endpoints/",
24
+ "https://developers.figma.com/docs/figma-mcp-server/tools-and-prompts/",
25
+ ];
26
+ const CHECKS = [
27
+ {
28
+ id: "whoami",
29
+ endpoint: () => "/v1/me",
30
+ requiredScopes: ["current_user:read"],
31
+ requirements: ["Valid Figma REST token."],
32
+ skipMessage: "No extra input required.",
33
+ },
34
+ {
35
+ id: "fileMetadata",
36
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/meta` : null,
37
+ requiredScopes: ["file_metadata:read"],
38
+ requirements: ["View access to the file."],
39
+ skipMessage: "Provide fileKey or url to check file metadata access.",
40
+ },
41
+ {
42
+ id: "fileNodes",
43
+ endpoint: ({ fileKey, nodeIds }) => fileKey && nodeIds.length > 0 ? `/v1/files/${fileKey}/nodes` : null,
44
+ query: ({ nodeIds }) => ({ ids: nodeIds.join(","), depth: 1 }),
45
+ requiredScopes: ["file_content:read"],
46
+ requirements: ["View access to the file.", "At least one node id."],
47
+ skipMessage: "Provide fileKey/url and nodeIds to check node access.",
48
+ },
49
+ {
50
+ id: "fileImages",
51
+ endpoint: ({ fileKey, nodeIds }) => fileKey && nodeIds.length > 0 ? `/v1/images/${fileKey}` : null,
52
+ query: ({ nodeIds }) => ({ ids: nodeIds.join(","), format: "png" }),
53
+ requiredScopes: ["file_content:read"],
54
+ requirements: ["View access to the file.", "At least one renderable node id."],
55
+ skipMessage: "Provide fileKey/url and nodeIds to check image rendering.",
56
+ },
57
+ {
58
+ id: "fileImageFills",
59
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/images` : null,
60
+ requiredScopes: ["file_content:read"],
61
+ requirements: ["View access to the file."],
62
+ skipMessage: "Provide fileKey or url to check image fill access.",
63
+ },
64
+ {
65
+ id: "fileComponents",
66
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/components` : null,
67
+ requiredScopes: ["library_content:read"],
68
+ requirements: ["View access to a published library file."],
69
+ skipMessage: "Provide fileKey or url to check file library components.",
70
+ },
71
+ {
72
+ id: "fileComponentSets",
73
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/component_sets` : null,
74
+ requiredScopes: ["library_content:read"],
75
+ requirements: ["View access to a published library file."],
76
+ skipMessage: "Provide fileKey or url to check file library component sets.",
77
+ },
78
+ {
79
+ id: "fileStyles",
80
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/styles` : null,
81
+ requiredScopes: ["library_content:read"],
82
+ requirements: ["View access to a published library file."],
83
+ skipMessage: "Provide fileKey or url to check file library styles.",
84
+ },
85
+ {
86
+ id: "teamComponents",
87
+ endpoint: ({ teamId }) => teamId ? `/v1/teams/${teamId}/components` : null,
88
+ query: () => ({ page_size: 1 }),
89
+ requiredScopes: ["team_library_content:read"],
90
+ requirements: ["Access to the team library."],
91
+ skipMessage: "Provide teamId to check team library components.",
92
+ },
93
+ {
94
+ id: "teamComponentSets",
95
+ endpoint: ({ teamId }) => teamId ? `/v1/teams/${teamId}/component_sets` : null,
96
+ query: () => ({ page_size: 1 }),
97
+ requiredScopes: ["team_library_content:read"],
98
+ requirements: ["Access to the team library."],
99
+ skipMessage: "Provide teamId to check team library component sets.",
100
+ },
101
+ {
102
+ id: "teamStyles",
103
+ endpoint: ({ teamId }) => teamId ? `/v1/teams/${teamId}/styles` : null,
104
+ query: () => ({ page_size: 1 }),
105
+ requiredScopes: ["team_library_content:read"],
106
+ requirements: ["Access to the team library."],
107
+ skipMessage: "Provide teamId to check team library styles.",
108
+ },
109
+ {
110
+ id: "variablesLocal",
111
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/variables/local` : null,
112
+ requiredScopes: ["file_variables:read"],
113
+ requirements: ["Enterprise organization access.", "View access to the design file."],
114
+ skipMessage: "Provide fileKey or url to check local variables REST access.",
115
+ },
116
+ {
117
+ id: "variablesPublished",
118
+ endpoint: ({ fileKey }) => fileKey ? `/v1/files/${fileKey}/variables/published` : null,
119
+ requiredScopes: ["file_variables:read"],
120
+ requirements: ["Enterprise organization access.", "View access to the design file."],
121
+ skipMessage: "Provide fileKey or url to check published variables REST access.",
122
+ },
123
+ ];
124
+ function normalizeAuthMode(value) {
125
+ if (value === "bearer" || value === "x-figma-token")
126
+ return value;
127
+ return "x-figma-token";
128
+ }
129
+ function normalizeApiBaseUrl(value) {
130
+ return (value ?? process.env["FIGMA_API_BASE_URL"] ?? DEFAULT_API_BASE_URL).replace(/\/+$/, "");
131
+ }
132
+ function resolveTokenEnvName(tokenEnv) {
133
+ if (tokenEnv)
134
+ return tokenEnv;
135
+ return DEFAULT_TOKEN_ENVS.find((envName) => Boolean(process.env[envName])) ?? null;
136
+ }
137
+ function hasConfiguredToken(options) {
138
+ if (options.token)
139
+ return true;
140
+ const envName = resolveTokenEnvName(options.tokenEnv);
141
+ return Boolean(envName && process.env[envName]);
142
+ }
143
+ function defaultChecks(options) {
144
+ const checks = ["whoami"];
145
+ const hasFile = Boolean(options.fileKey || options.url);
146
+ const hasNodes = (options.nodeIds ?? []).length > 0;
147
+ if (hasFile) {
148
+ checks.push("fileMetadata", "fileComponents", "fileComponentSets", "fileStyles", "fileImageFills", "variablesLocal", "variablesPublished");
149
+ if (hasNodes)
150
+ checks.push("fileNodes", "fileImages");
151
+ }
152
+ if (options.teamId) {
153
+ checks.push("teamComponents", "teamComponentSets", "teamStyles");
154
+ }
155
+ return checks;
156
+ }
157
+ function checkDefinition(id) {
158
+ const definition = CHECKS.find((item) => item.id === id);
159
+ if (!definition)
160
+ throw new Error(`Unknown Figma REST diagnostic check: ${id}`);
161
+ return definition;
162
+ }
163
+ function errorMessage(error) {
164
+ if (error instanceof Error && error.message.trim())
165
+ return error.message;
166
+ return String(error);
167
+ }
168
+ function checkStatusFromError(error) {
169
+ if (error instanceof FigmaRestError && (error.status === 401 || error.status === 403 || error.status === 404)) {
170
+ return "warn";
171
+ }
172
+ return "fail";
173
+ }
174
+ function isRetryable(error) {
175
+ return error instanceof FigmaRestError
176
+ ? error.status === 429 || error.status >= 500
177
+ : false;
178
+ }
179
+ function buildRecommendations(checks, tokenConfigured) {
180
+ const recommendations = new Set();
181
+ if (!tokenConfigured) {
182
+ recommendations.add("Set FIGMA_TOKEN, FIGMA_ACCESS_TOKEN, or FIGMA_REST_TOKEN in the Bridge process environment.");
183
+ }
184
+ for (const check of checks) {
185
+ if (check.status !== "warn" && check.status !== "fail")
186
+ continue;
187
+ if (check.httpStatus === 401) {
188
+ recommendations.add("Regenerate or reconnect the Figma REST token; the current token is missing, invalid, or expired.");
189
+ }
190
+ if (check.httpStatus === 403) {
191
+ recommendations.add(`Check token scopes for ${check.id}: ${check.requiredScopes.join(", ")}.`);
192
+ if (check.id === "variablesLocal" || check.id === "variablesPublished") {
193
+ recommendations.add("Variables REST API requires Enterprise org access and file_variables:read.");
194
+ }
195
+ }
196
+ if (check.httpStatus === 404) {
197
+ recommendations.add("Verify the fileKey/teamId/nodeIds and that the authenticated user has access.");
198
+ }
199
+ if (check.retryable) {
200
+ recommendations.add("Retry after rate-limit/backoff; this endpoint returned a retryable REST error.");
201
+ }
202
+ }
203
+ return Array.from(recommendations);
204
+ }
205
+ export async function diagnoseFigmaRest(options = {}) {
206
+ const tokenConfigured = hasConfiguredToken(options);
207
+ const tokenEnv = resolveTokenEnvName(options.tokenEnv);
208
+ const authMode = normalizeAuthMode(options.authMode ?? process.env["FIGMA_AUTH_MODE"]);
209
+ const apiBaseUrl = normalizeApiBaseUrl(options.apiBaseUrl);
210
+ const nodeIds = options.nodeIds ?? [];
211
+ const fileKey = options.fileKey || options.url ? fileKeyFromArgs(options) : null;
212
+ const teamId = options.teamId ?? null;
213
+ const requested = options.checks?.length ? options.checks : defaultChecks(options);
214
+ if (!tokenConfigured) {
215
+ const checks = requested.map((id) => {
216
+ const definition = checkDefinition(id);
217
+ return {
218
+ id,
219
+ endpoint: null,
220
+ status: "fail",
221
+ durationMs: 0,
222
+ message: "Figma REST token is not configured.",
223
+ requiredScopes: definition.requiredScopes,
224
+ requirements: definition.requirements,
225
+ retryable: false,
226
+ };
227
+ });
228
+ return {
229
+ ok: false,
230
+ status: "fail",
231
+ version: 1,
232
+ generatedAt: new Date().toISOString(),
233
+ auth: { tokenConfigured: false, tokenEnv, authMode, apiBaseUrl },
234
+ inputs: { fileKey, teamId, nodeIds },
235
+ summary: summarizeChecks(checks),
236
+ checks,
237
+ recommendations: buildRecommendations(checks, false),
238
+ sources: FIGMA_REST_DIAGNOSTIC_SOURCES,
239
+ };
240
+ }
241
+ const context = { fileKey, teamId, nodeIds };
242
+ const checks = await Promise.all(requested.map(async (id) => {
243
+ const definition = checkDefinition(id);
244
+ const endpoint = definition.endpoint(context);
245
+ if (!endpoint) {
246
+ return {
247
+ id,
248
+ endpoint,
249
+ status: "skip",
250
+ durationMs: 0,
251
+ message: definition.skipMessage,
252
+ requiredScopes: definition.requiredScopes,
253
+ requirements: definition.requirements,
254
+ retryable: false,
255
+ };
256
+ }
257
+ const startedAt = Date.now();
258
+ try {
259
+ await figmaRestGet(endpoint, {
260
+ ...options,
261
+ authMode,
262
+ apiBaseUrl,
263
+ query: definition.query?.({ nodeIds }),
264
+ });
265
+ return {
266
+ id,
267
+ endpoint,
268
+ status: "pass",
269
+ durationMs: Date.now() - startedAt,
270
+ message: "Endpoint reachable with the configured Figma REST token.",
271
+ requiredScopes: definition.requiredScopes,
272
+ requirements: definition.requirements,
273
+ retryable: false,
274
+ };
275
+ }
276
+ catch (error) {
277
+ return {
278
+ id,
279
+ endpoint,
280
+ status: checkStatusFromError(error),
281
+ durationMs: Date.now() - startedAt,
282
+ httpStatus: error instanceof FigmaRestError ? error.status : undefined,
283
+ message: errorMessage(error),
284
+ requiredScopes: definition.requiredScopes,
285
+ requirements: definition.requirements,
286
+ retryable: isRetryable(error),
287
+ };
288
+ }
289
+ }));
290
+ const summary = summarizeChecks(checks);
291
+ const status = summary.fail > 0 ? "fail" : summary.warn > 0 || summary.skip > 0 ? "warn" : "pass";
292
+ return {
293
+ ok: status !== "fail",
294
+ status,
295
+ version: 1,
296
+ generatedAt: new Date().toISOString(),
297
+ auth: { tokenConfigured: true, tokenEnv, authMode, apiBaseUrl },
298
+ inputs: { fileKey, teamId, nodeIds },
299
+ summary,
300
+ checks,
301
+ recommendations: buildRecommendations(checks, true),
302
+ sources: FIGMA_REST_DIAGNOSTIC_SOURCES,
303
+ };
304
+ }
305
+ function summarizeChecks(checks) {
306
+ return {
307
+ requested: checks.length,
308
+ pass: checks.filter((check) => check.status === "pass").length,
309
+ warn: checks.filter((check) => check.status === "warn").length,
310
+ fail: checks.filter((check) => check.status === "fail").length,
311
+ skip: checks.filter((check) => check.status === "skip").length,
312
+ };
313
+ }
314
+ //# sourceMappingURL=figma-rest-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-rest-diagnostics.js","sourceRoot":"","sources":["../src/figma-rest-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type FigmaRestAuthMode = "bearer" | "x-figma-token";
2
+ export type FigmaRestClientOptions = {
3
+ apiBaseUrl?: string;
4
+ authMode?: FigmaRestAuthMode;
5
+ token?: string;
6
+ tokenEnv?: string;
7
+ fetchImpl?: typeof fetch;
8
+ };
9
+ export type FigmaRestRequestOptions = FigmaRestClientOptions & {
10
+ query?: Record<string, string | number | boolean | undefined | null>;
11
+ };
12
+ export declare class FigmaRestError extends Error {
13
+ status: number;
14
+ endpoint: string;
15
+ body: unknown;
16
+ constructor(args: {
17
+ status: number;
18
+ endpoint: string;
19
+ message: string;
20
+ body: unknown;
21
+ });
22
+ }
23
+ export declare function figmaRestGet<T = unknown>(endpoint: string, options?: FigmaRestRequestOptions): Promise<T>;
24
+ export declare function fileKeyFromArgs(args: {
25
+ fileKey?: string;
26
+ url?: string;
27
+ }): string;
@@ -0,0 +1,116 @@
1
+ import { parseFigmaUrl } from "./tools/figma-url.js";
2
+ export class FigmaRestError extends Error {
3
+ status;
4
+ endpoint;
5
+ body;
6
+ constructor(args) {
7
+ super(args.message);
8
+ this.name = "FigmaRestError";
9
+ this.status = args.status;
10
+ this.endpoint = args.endpoint;
11
+ this.body = args.body;
12
+ }
13
+ }
14
+ const DEFAULT_API_BASE_URL = "https://api.figma.com";
15
+ const DEFAULT_TOKEN_ENV_NAMES = ["FIGMA_TOKEN", "FIGMA_ACCESS_TOKEN", "FIGMA_REST_TOKEN"];
16
+ function readEnvToken(tokenEnv) {
17
+ if (tokenEnv) {
18
+ return process.env[tokenEnv];
19
+ }
20
+ for (const envName of DEFAULT_TOKEN_ENV_NAMES) {
21
+ const value = process.env[envName];
22
+ if (value)
23
+ return value;
24
+ }
25
+ return undefined;
26
+ }
27
+ function normalizeAuthMode(value) {
28
+ if (value === "bearer" || value === "x-figma-token")
29
+ return value;
30
+ return "x-figma-token";
31
+ }
32
+ function normalizeBaseUrl(value) {
33
+ const raw = value ?? process.env["FIGMA_API_BASE_URL"] ?? DEFAULT_API_BASE_URL;
34
+ let url;
35
+ try {
36
+ url = new URL(raw);
37
+ }
38
+ catch {
39
+ throw new Error(`Invalid Figma REST API base URL: ${raw}`);
40
+ }
41
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
42
+ throw new Error(`Invalid Figma REST API base URL protocol: ${url.protocol}`);
43
+ }
44
+ return url.toString().replace(/\/+$/, "");
45
+ }
46
+ function authHeaders(token, authMode) {
47
+ if (authMode === "bearer") {
48
+ return { Authorization: `Bearer ${token}` };
49
+ }
50
+ return { "X-Figma-Token": token };
51
+ }
52
+ function appendQuery(url, query) {
53
+ for (const [key, value] of Object.entries(query ?? {})) {
54
+ if (value === undefined || value === null || value === "")
55
+ continue;
56
+ url.searchParams.set(key, String(value));
57
+ }
58
+ }
59
+ function messageFromBody(body, fallback) {
60
+ if (typeof body === "string" && body.trim())
61
+ return body;
62
+ if (body && typeof body === "object") {
63
+ const record = body;
64
+ for (const key of ["message", "err", "error"]) {
65
+ if (typeof record[key] === "string" && record[key])
66
+ return record[key];
67
+ }
68
+ }
69
+ return fallback;
70
+ }
71
+ async function parseResponseBody(response) {
72
+ const text = await response.text();
73
+ if (!text.trim())
74
+ return null;
75
+ try {
76
+ return JSON.parse(text);
77
+ }
78
+ catch {
79
+ return text;
80
+ }
81
+ }
82
+ export async function figmaRestGet(endpoint, options = {}) {
83
+ const token = options.token ?? readEnvToken(options.tokenEnv);
84
+ if (!token) {
85
+ throw new Error(`Figma REST token is not configured. Set ${DEFAULT_TOKEN_ENV_NAMES.join(" or ")}.`);
86
+ }
87
+ const baseUrl = normalizeBaseUrl(options.apiBaseUrl);
88
+ const url = new URL(endpoint.startsWith("/") ? endpoint : `/${endpoint}`, baseUrl);
89
+ appendQuery(url, options.query);
90
+ const authMode = normalizeAuthMode(options.authMode ?? process.env["FIGMA_AUTH_MODE"]);
91
+ const response = await (options.fetchImpl ?? fetch)(url, {
92
+ method: "GET",
93
+ headers: {
94
+ Accept: "application/json",
95
+ ...authHeaders(token, authMode),
96
+ },
97
+ });
98
+ const body = await parseResponseBody(response);
99
+ if (!response.ok) {
100
+ throw new FigmaRestError({
101
+ status: response.status,
102
+ endpoint,
103
+ message: messageFromBody(body, `Figma REST ${endpoint} returned HTTP ${response.status}`),
104
+ body,
105
+ });
106
+ }
107
+ return body;
108
+ }
109
+ export function fileKeyFromArgs(args) {
110
+ if (args.fileKey)
111
+ return args.fileKey;
112
+ if (!args.url)
113
+ throw new Error("fileKey or url is required");
114
+ return parseFigmaUrl(args.url).fileKey;
115
+ }
116
+ //# sourceMappingURL=figma-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-rest.js","sourceRoot":"","sources":["../src/figma-rest.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,19 @@
7
7
  * Endpoints:
8
8
  * GET /api/status — server + plugin session snapshot
9
9
  * GET /api/session — detailed session info
10
+ * GET /api/queue — current / queued / immediate command snapshot
11
+ * GET /api/events?limit=N&commandId=... — command lifecycle/progress events
10
12
  * GET /api/tools — authoritative catalogue of MCP tools
11
- * GET /api/log?limit=Naudit trail of recent commands (ring buffer)
13
+ * GET /api/capabilitiesmachine-readable capability matrix
14
+ * GET /api/contract-audit — release contract audit for Bridge surface
15
+ * GET /api/figma-mcp-parity — official Figma MCP ↔ Bridge/SXL parity map
16
+ * GET /api/figma-mcp-skills-parity — official Figma MCP skills ↔ Bridge/SXL recipes/resources map
17
+ * GET /api/figma-rest-diagnostics — Figma REST token/scope/preflight diagnostics
18
+ * GET /api/performance-profile?auditLimit=N — tool budgets, large-data/dry-run policy, recent timings
19
+ * GET /api/runtime-summary — compact runtime readiness summary for agents
20
+ * GET /api/operator-runbook — start-here workflow chooser for agents/operators
21
+ * GET /api/ultimate-readiness — requirement-by-requirement Ultimate Bridge readiness audit
22
+ * GET /api/log?limit=N&source=memory|disk — audit trail of recent commands
12
23
  * POST /api/command — execute a plugin command (with optional Idempotency-Key)
13
24
  * POST /api/disconnect — close the current plugin socket
14
25
  * GET|POST|DELETE /api/workspace-blob — disk workspace cache (Git Local Storage; no plugin WS required)
@@ -18,5 +29,6 @@
18
29
  * When BRIDGE_AUTH_TOKEN is set, all /api/* and /mcp requests require
19
30
  * `Authorization: Bearer <token>`.
20
31
  */
32
+ import { type Server } from "node:http";
21
33
  import type { BridgeWSServer } from "./ws-server.js";
22
- export declare function startHttpApi(bridgePort: number, wsServer: BridgeWSServer): Promise<void>;
34
+ export declare function startHttpApi(bridgePort: number, wsServer: BridgeWSServer): Promise<Server>;