@sxl-studio/bridge 1.7.2 → 1.8.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 (203) 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 +16 -2
  84. package/dist/http-api.js +329 -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 +99 -26
  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 +15 -30
  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 +25 -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 +75 -47
  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/workspace-blob-store.d.ts +6 -0
  196. package/dist/workspace-blob-store.js +9 -0
  197. package/dist/workspace-blob-store.js.map +1 -1
  198. package/dist/workspace-path-http.d.ts +24 -0
  199. package/dist/workspace-path-http.js +146 -0
  200. package/dist/workspace-path-http.js.map +1 -0
  201. package/dist/ws-server.js +16 -3
  202. package/dist/ws-server.js.map +1 -1
  203. package/package.json +21 -2
@@ -0,0 +1,464 @@
1
+ import { ALL_AGENT_RECIPES, routeAgentIntent, } from "./agent-recipes.js";
2
+ import { buildCapabilityMatrix } from "./tools/capability-matrix.js";
3
+ const RECIPE_BY_ID = new Map(ALL_AGENT_RECIPES.map((recipe) => [recipe.id, recipe]));
4
+ const DISCOVERY_TOOLS = new Set([
5
+ "get_plugin_status",
6
+ "get_bridge_runtime_summary",
7
+ "get_capability_matrix",
8
+ "list_tools",
9
+ "route_intent",
10
+ "get_design_context",
11
+ "get_metadata",
12
+ "get_screenshot",
13
+ "get_variable_defs",
14
+ "get_libraries",
15
+ "search_design_system",
16
+ "figma_rest_diagnose",
17
+ "figma_rest_search_design_system",
18
+ "search_enabled_library_assets",
19
+ "inspect_enabled_libraries",
20
+ "list_enabled_library_variables",
21
+ "inspect_design_system",
22
+ "find_components",
23
+ "get_variables",
24
+ "get_local_styles",
25
+ "list_token_files",
26
+ "get_tokens_config",
27
+ "list_compositions",
28
+ "audit_variable_coverage",
29
+ "find_variable_coverage_misses",
30
+ "audit_style_coverage",
31
+ "find_style_coverage_misses",
32
+ "audit_composition_drift",
33
+ ]);
34
+ const SCREEN_VALIDATED_WRITE_TOOLS = new Set([
35
+ "build_screen",
36
+ "update_screen",
37
+ "build_mockup",
38
+ ]);
39
+ const SCREEN_OR_MOCKUP_TOOLS = new Set([
40
+ "build_screen",
41
+ "update_screen",
42
+ "build_mockup",
43
+ "apply_mockup_dataset",
44
+ ]);
45
+ const DESIGN_SYSTEM_DISCOVERY_TOOLS = new Set([
46
+ "inspect_design_system",
47
+ "find_components",
48
+ "get_libraries",
49
+ "search_design_system",
50
+ ]);
51
+ function getRecipeSchemaResources(recipe) {
52
+ return "schemaResources" in recipe ? recipe.schemaResources : [];
53
+ }
54
+ function recipeToRoute(recipe, request) {
55
+ const recipeText = JSON.stringify(recipe);
56
+ return {
57
+ recipeId: recipe.id,
58
+ title: recipe.title,
59
+ score: 1,
60
+ matchedPhrases: [],
61
+ preferredTools: recipe.preferredTools,
62
+ schemaResources: getRecipeSchemaResources(recipe),
63
+ dryRunFirst: /dryRun/i.test(recipeText),
64
+ doneCriteria: String(recipe.doneCriteria),
65
+ };
66
+ }
67
+ function resolveRoute(request, recipeId) {
68
+ if (recipeId) {
69
+ const recipe = RECIPE_BY_ID.get(recipeId);
70
+ if (!recipe) {
71
+ throw new Error(`Unknown SXL recipe id "${recipeId}"`);
72
+ }
73
+ return recipeToRoute(recipe, request);
74
+ }
75
+ const routed = routeAgentIntent(request, { limit: 1 });
76
+ const first = routed.routes[0];
77
+ if (first)
78
+ return first;
79
+ const fallback = RECIPE_BY_ID.get("sxl-use");
80
+ if (!fallback) {
81
+ throw new Error("No SXL fallback recipe registered");
82
+ }
83
+ return recipeToRoute(fallback, request);
84
+ }
85
+ function matrixByTool() {
86
+ const matrix = buildCapabilityMatrix();
87
+ return new Map(matrix.tools.map((tool) => [tool.name, tool]));
88
+ }
89
+ function addStep(steps, step) {
90
+ steps.push({ id: `step-${String(steps.length + 1).padStart(2, "0")}`, ...step });
91
+ }
92
+ function toolPhase(tool) {
93
+ if (tool.requiresDesignMode)
94
+ return "commit";
95
+ if (tool.dryRunSupported)
96
+ return "preview";
97
+ if (DISCOVERY_TOOLS.has(tool.name))
98
+ return "discover";
99
+ if (tool.name.startsWith("find_") || tool.name.startsWith("audit_") || tool.name.startsWith("analyze_")) {
100
+ return "discover";
101
+ }
102
+ return "discover";
103
+ }
104
+ function expandPreferredToolsWithPreflights(toolNames, tools) {
105
+ const expanded = [];
106
+ const added = new Set();
107
+ const visiting = new Set();
108
+ const visit = (toolName) => {
109
+ if (added.has(toolName))
110
+ return;
111
+ if (visiting.has(toolName))
112
+ return;
113
+ visiting.add(toolName);
114
+ const tool = tools.get(toolName);
115
+ for (const preflightName of tool?.preferredAfter ?? []) {
116
+ visit(preflightName);
117
+ }
118
+ visiting.delete(toolName);
119
+ if (!added.has(toolName)) {
120
+ added.add(toolName);
121
+ expanded.push(toolName);
122
+ }
123
+ };
124
+ for (const toolName of toolNames) {
125
+ visit(toolName);
126
+ }
127
+ return expanded;
128
+ }
129
+ export function planWorkflow(args) {
130
+ const request = args.request.trim();
131
+ if (!request) {
132
+ throw new Error("plan_workflow requires a non-empty request");
133
+ }
134
+ const route = resolveRoute(request, args.recipeId);
135
+ const tools = matrixByTool();
136
+ const findings = [];
137
+ const steps = [];
138
+ const schemaResources = route.schemaResources;
139
+ const recipeUri = `sxl://agent/recipes/${route.recipeId}`;
140
+ addStep(steps, {
141
+ kind: "tool",
142
+ phase: "route",
143
+ title: "Route natural-language request",
144
+ toolName: "route_intent",
145
+ required: args.recipeId ? false : true,
146
+ reason: args.recipeId
147
+ ? "Recipe id was provided explicitly; route_intent is optional for traceability."
148
+ : "Pick the SXL recipe before composing payloads or writing to Figma.",
149
+ });
150
+ addStep(steps, {
151
+ kind: "resource",
152
+ phase: "context",
153
+ title: "Read selected recipe",
154
+ resourceUri: recipeUri,
155
+ required: true,
156
+ reason: "Use the recipe as the task-specific operating procedure.",
157
+ });
158
+ for (const resourceUri of schemaResources) {
159
+ addStep(steps, {
160
+ kind: "resource",
161
+ phase: "context",
162
+ title: "Read payload schema",
163
+ resourceUri,
164
+ required: true,
165
+ reason: "Build payloads against the versioned Bridge contract before calling tools.",
166
+ });
167
+ }
168
+ if (route.recipeId === "figma-mcp-companion") {
169
+ addStep(steps, {
170
+ kind: "gate",
171
+ phase: "verify",
172
+ title: "Use official Figma MCP companion",
173
+ required: true,
174
+ reason: "The selected scope is remote-only/non-Design for Bridge. Use official Figma MCP tools for the requested operation and keep Bridge for SXL/active-file context.",
175
+ });
176
+ }
177
+ const preferredTools = expandPreferredToolsWithPreflights(route.preferredTools, tools);
178
+ const writeTools = preferredTools
179
+ .map((name) => tools.get(name))
180
+ .filter((tool) => Boolean(tool?.requiresDesignMode));
181
+ const firstPreferredWriteIndex = preferredTools.findIndex((name) => tools.get(name)?.requiresDesignMode === true);
182
+ const preferredStatusIndex = preferredTools.indexOf("get_plugin_status");
183
+ const shouldAddStatusContext = writeTools.length > 0 &&
184
+ (preferredStatusIndex < 0 || (firstPreferredWriteIndex >= 0 && preferredStatusIndex > firstPreferredWriteIndex));
185
+ if (shouldAddStatusContext) {
186
+ const statusTool = tools.get("get_plugin_status");
187
+ addStep(steps, {
188
+ kind: "tool",
189
+ phase: "context",
190
+ title: "Check plugin mode",
191
+ toolName: "get_plugin_status",
192
+ required: true,
193
+ requiresDesignMode: false,
194
+ execution: statusTool?.execution,
195
+ pluginCommandTypes: statusTool?.pluginCommandTypes,
196
+ reason: "Confirm writesAllowed/editorType before any canvas-mutating step.",
197
+ });
198
+ }
199
+ for (const toolName of preferredTools) {
200
+ if (shouldAddStatusContext && toolName === "get_plugin_status")
201
+ continue;
202
+ const tool = tools.get(toolName);
203
+ if (!tool) {
204
+ findings.push({
205
+ severity: "warning",
206
+ code: "TOOL_NOT_IN_CATALOGUE",
207
+ message: `Preferred tool "${toolName}" is not in the Bridge catalogue.`,
208
+ toolName,
209
+ });
210
+ continue;
211
+ }
212
+ if (tool.requiresDesignMode && tool.dryRunSupported) {
213
+ addStep(steps, {
214
+ kind: "tool",
215
+ phase: "preview",
216
+ title: `Preview ${tool.name}`,
217
+ toolName: tool.name,
218
+ dryRun: true,
219
+ required: true,
220
+ requiresDesignMode: tool.requiresDesignMode,
221
+ execution: tool.execution,
222
+ pluginCommandTypes: tool.pluginCommandTypes,
223
+ schemaResources,
224
+ reason: "Dry-run preview before mutating the Figma canvas.",
225
+ });
226
+ addStep(steps, {
227
+ kind: "gate",
228
+ phase: "approval",
229
+ title: `Approve ${tool.name}`,
230
+ required: true,
231
+ requiresApproval: true,
232
+ reason: "Proceed only after the dry-run/result is clean or explicitly approved.",
233
+ });
234
+ addStep(steps, {
235
+ kind: "tool",
236
+ phase: "commit",
237
+ title: `Commit ${tool.name}`,
238
+ toolName: tool.name,
239
+ dryRun: false,
240
+ required: true,
241
+ requiresApproval: true,
242
+ requiresDesignMode: true,
243
+ execution: tool.execution,
244
+ pluginCommandTypes: tool.pluginCommandTypes,
245
+ schemaResources,
246
+ reason: "Perform the requested write after preview/approval.",
247
+ });
248
+ continue;
249
+ }
250
+ if (tool.requiresDesignMode) {
251
+ addStep(steps, {
252
+ kind: "gate",
253
+ phase: "approval",
254
+ title: `Approve ${tool.name}`,
255
+ required: true,
256
+ requiresApproval: true,
257
+ reason: "This write tool has no dry-run surface; require explicit approval before execution.",
258
+ });
259
+ }
260
+ addStep(steps, {
261
+ kind: "tool",
262
+ phase: toolPhase(tool),
263
+ title: tool.requiresDesignMode ? `Run ${tool.name}` : `Read ${tool.name}`,
264
+ toolName: tool.name,
265
+ required: true,
266
+ requiresApproval: tool.requiresDesignMode,
267
+ requiresDesignMode: tool.requiresDesignMode,
268
+ execution: tool.execution,
269
+ pluginCommandTypes: tool.pluginCommandTypes,
270
+ schemaResources,
271
+ reason: tool.summary,
272
+ });
273
+ }
274
+ if (route.dryRunFirst && !steps.some((step) => step.kind === "tool" && step.dryRun === true)) {
275
+ findings.push({
276
+ severity: "warning",
277
+ code: "DRY_RUN_ROUTE_WITHOUT_DRY_RUN_TOOL",
278
+ message: "Selected recipe mentions dryRun, but no preferred dry-run-capable write tool was found.",
279
+ });
280
+ }
281
+ return {
282
+ ok: true,
283
+ request,
284
+ route,
285
+ recipeUri,
286
+ schemaResources,
287
+ dryRunFirst: route.dryRunFirst,
288
+ steps,
289
+ findings,
290
+ doneCriteria: route.doneCriteria,
291
+ };
292
+ }
293
+ function normalizeProposedTools(args) {
294
+ if (args.proposedSteps?.length)
295
+ return args.proposedSteps;
296
+ return (args.proposedTools ?? []).map((toolName) => ({ toolName }));
297
+ }
298
+ export function previewWorkflow(args) {
299
+ const plan = planWorkflow({ request: args.request, recipeId: args.recipeId });
300
+ const tools = matrixByTool();
301
+ const proposed = normalizeProposedTools(args);
302
+ const proposedNames = proposed.map((step) => step.toolName);
303
+ const findings = [...plan.findings];
304
+ for (const step of proposed) {
305
+ if (!tools.has(step.toolName)) {
306
+ findings.push({
307
+ severity: "error",
308
+ code: "UNKNOWN_TOOL",
309
+ message: `Proposed tool "${step.toolName}" is not registered in Bridge catalogue.`,
310
+ toolName: step.toolName,
311
+ });
312
+ }
313
+ }
314
+ const proposedWriteTools = proposed
315
+ .map((step) => tools.get(step.toolName))
316
+ .filter((tool) => Boolean(tool?.requiresDesignMode));
317
+ if (proposedWriteTools.length > 0 && !proposedNames.includes("get_plugin_status")) {
318
+ findings.push({
319
+ severity: "warning",
320
+ code: "MISSING_STATUS_CHECK",
321
+ message: "A workflow with write tools should call get_plugin_status before mutating Figma.",
322
+ });
323
+ }
324
+ const firstMutatingWriteIndex = proposed.findIndex((step) => {
325
+ const tool = tools.get(step.toolName);
326
+ return Boolean(tool?.requiresDesignMode) && step.dryRun !== true;
327
+ });
328
+ const statusIndexes = proposed
329
+ .map((step, stepIndex) => step.toolName === "get_plugin_status" ? stepIndex : -1)
330
+ .filter((stepIndex) => stepIndex >= 0);
331
+ if (firstMutatingWriteIndex >= 0 &&
332
+ statusIndexes.length > 0 &&
333
+ !statusIndexes.some((stepIndex) => stepIndex < firstMutatingWriteIndex)) {
334
+ findings.push({
335
+ severity: "warning",
336
+ code: "STATUS_CHECK_ORDER",
337
+ message: "get_plugin_status should run before the first mutating Figma write.",
338
+ });
339
+ }
340
+ const firstScreenOrMockupIndex = proposed.findIndex((step) => SCREEN_OR_MOCKUP_TOOLS.has(step.toolName));
341
+ const discoveryIndexes = proposed
342
+ .map((step, stepIndex) => DESIGN_SYSTEM_DISCOVERY_TOOLS.has(step.toolName) ? stepIndex : -1)
343
+ .filter((stepIndex) => stepIndex >= 0);
344
+ if (firstScreenOrMockupIndex >= 0 && discoveryIndexes.length === 0) {
345
+ findings.push({
346
+ severity: "warning",
347
+ code: "MISSING_DESIGN_SYSTEM_DISCOVERY",
348
+ message: "Screen/mockup workflows should inspect the design system or find components before writing.",
349
+ });
350
+ }
351
+ if (firstScreenOrMockupIndex >= 0 &&
352
+ discoveryIndexes.length > 0 &&
353
+ !discoveryIndexes.some((stepIndex) => stepIndex < firstScreenOrMockupIndex)) {
354
+ findings.push({
355
+ severity: "warning",
356
+ code: "DESIGN_SYSTEM_DISCOVERY_ORDER",
357
+ message: "Screen/mockup workflows should inspect the design system or find components before the first screen/mockup step.",
358
+ });
359
+ }
360
+ const dryRunWarningKeys = new Set();
361
+ for (const [stepIndex, step] of proposed.entries()) {
362
+ const tool = tools.get(step.toolName);
363
+ if (!tool?.requiresDesignMode || !tool.dryRunSupported || step.dryRun === true)
364
+ continue;
365
+ const hasPriorPreview = proposed.some((candidate, candidateIndex) => candidateIndex < stepIndex &&
366
+ candidate.toolName === tool.name &&
367
+ candidate.dryRun === true);
368
+ const acceptsScreenValidator = SCREEN_VALIDATED_WRITE_TOOLS.has(tool.name);
369
+ const hasPriorValidator = acceptsScreenValidator &&
370
+ proposed.some((candidate, candidateIndex) => candidateIndex < stepIndex &&
371
+ candidate.toolName === "validate_screen_spec");
372
+ if (hasPriorPreview || hasPriorValidator)
373
+ continue;
374
+ const hasLaterPreview = proposed.some((candidate, candidateIndex) => candidateIndex > stepIndex &&
375
+ candidate.toolName === tool.name &&
376
+ candidate.dryRun === true);
377
+ const hasLaterValidator = acceptsScreenValidator &&
378
+ proposed.some((candidate, candidateIndex) => candidateIndex > stepIndex &&
379
+ candidate.toolName === "validate_screen_spec");
380
+ const code = hasLaterPreview || hasLaterValidator ? "DRY_RUN_AFTER_COMMIT" : "MISSING_DRY_RUN";
381
+ const warningKey = `${code}:${tool.name}`;
382
+ if (dryRunWarningKeys.has(warningKey))
383
+ continue;
384
+ dryRunWarningKeys.add(warningKey);
385
+ if (code === "DRY_RUN_AFTER_COMMIT") {
386
+ findings.push({
387
+ severity: "warning",
388
+ code,
389
+ message: `Write tool "${tool.name}" has a dry-run/validation step, but it appears after the commit. Move preview before the write.`,
390
+ toolName: tool.name,
391
+ });
392
+ }
393
+ else {
394
+ findings.push({
395
+ severity: "warning",
396
+ code,
397
+ message: `Write tool "${tool.name}" supports dryRun; preview it before commit.`,
398
+ toolName: tool.name,
399
+ });
400
+ }
401
+ }
402
+ for (const [stepIndex, step] of proposed.entries()) {
403
+ const tool = tools.get(step.toolName);
404
+ const preflightTools = tool?.preferredAfter ?? [];
405
+ if (preflightTools.length === 0)
406
+ continue;
407
+ const missingPreflight = [];
408
+ const misplacedPreflight = [];
409
+ for (const preflightName of preflightTools) {
410
+ const matchingIndexes = proposed
411
+ .map((candidate, candidateIndex) => candidate.toolName === preflightName ? candidateIndex : -1)
412
+ .filter((candidateIndex) => candidateIndex >= 0);
413
+ if (matchingIndexes.length === 0) {
414
+ missingPreflight.push(preflightName);
415
+ continue;
416
+ }
417
+ if (!matchingIndexes.some((candidateIndex) => candidateIndex < stepIndex)) {
418
+ misplacedPreflight.push(preflightName);
419
+ }
420
+ }
421
+ if (missingPreflight.length > 0) {
422
+ findings.push({
423
+ severity: "warning",
424
+ code: "MISSING_PREFLIGHT_TOOL",
425
+ message: `Tool "${step.toolName}" should be preceded by: ${missingPreflight.join(", ")}.`,
426
+ toolName: step.toolName,
427
+ });
428
+ }
429
+ if (misplacedPreflight.length > 0) {
430
+ findings.push({
431
+ severity: "warning",
432
+ code: "PREFLIGHT_TOOL_ORDER",
433
+ message: `Tool "${step.toolName}" should be preceded by: ${misplacedPreflight.join(", ")}. The preflight exists in the proposed sequence, but not before the target tool.`,
434
+ toolName: step.toolName,
435
+ });
436
+ }
437
+ }
438
+ if (plan.route.recipeId === "figma-mcp-companion" &&
439
+ proposedWriteTools.length > 0) {
440
+ findings.push({
441
+ severity: "warning",
442
+ code: "COMPANION_SCOPE_HAS_BRIDGE_WRITES",
443
+ message: "This route is official Figma MCP companion scope; avoid Bridge write tools unless the user explicitly narrowed the task back to SXL/active-file Design work.",
444
+ });
445
+ }
446
+ const preferred = new Set(plan.route.preferredTools);
447
+ const missingPreferred = Array.from(preferred).filter((name) => !proposedNames.includes(name));
448
+ if (proposed.length > 0 && missingPreferred.length > 0) {
449
+ findings.push({
450
+ severity: "info",
451
+ code: "PREFERRED_TOOLS_NOT_PROPOSED",
452
+ message: `Recipe preferred tools not present in proposed sequence: ${missingPreferred.join(", ")}`,
453
+ });
454
+ }
455
+ const acceptable = !findings.some((finding) => finding.severity === "error");
456
+ return {
457
+ ok: true,
458
+ plan,
459
+ proposedTools: proposedNames,
460
+ acceptable,
461
+ findings,
462
+ };
463
+ }
464
+ //# sourceMappingURL=workflow-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-planner.js","sourceRoot":"","sources":["../src/workflow-planner.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,12 @@ export declare function isValidBlobKey(key: string): boolean;
7
7
  export declare function getWorkspaceBlobRootDir(): string;
8
8
  export declare function assertValidWorkspaceId(workspaceId: string): string;
9
9
  export declare function assertValidBlobKey(key: string): string;
10
+ /**
11
+ * Absolute path to a workspace's blob directory (`<root>/<workspaceId>`). Validates the id so a
12
+ * caller can never traverse outside the cache root. Used by `/api/workspace-path` and `/api/reveal`
13
+ * to show / open where Local Storage physically lives.
14
+ */
15
+ export declare function getWorkspaceDirPath(rootDir: string, workspaceId: string): string;
10
16
  export declare function putWorkspaceBlob(rootDir: string, workspaceId: string, blobKey: string, bodyUtf8: string): Promise<void>;
11
17
  export declare function getWorkspaceBlob(rootDir: string, workspaceId: string, blobKey: string): Promise<string | null>;
12
18
  export declare function deleteWorkspaceBlob(rootDir: string, workspaceId: string, blobKey: string): Promise<boolean>;
@@ -43,6 +43,15 @@ export function assertValidBlobKey(key) {
43
43
  }
44
44
  return key;
45
45
  }
46
+ /**
47
+ * Absolute path to a workspace's blob directory (`<root>/<workspaceId>`). Validates the id so a
48
+ * caller can never traverse outside the cache root. Used by `/api/workspace-path` and `/api/reveal`
49
+ * to show / open where Local Storage physically lives.
50
+ */
51
+ export function getWorkspaceDirPath(rootDir, workspaceId) {
52
+ const wid = assertValidWorkspaceId(workspaceId);
53
+ return path.join(rootDir, wid);
54
+ }
46
55
  function blobFilePath(rootDir, workspaceId, blobKey) {
47
56
  const wid = assertValidWorkspaceId(workspaceId);
48
57
  const k = assertValidBlobKey(blobKey);
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-blob-store.js","sourceRoot":"","sources":["../src/workspace-blob-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC,mFAAmF;AACnF,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAEvC,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,4DAA4D;AAErG,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,WAAmB,EAAE,OAAe;IACzE,MAAM,GAAG,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,WAAmB,EACnB,OAAe,EACf,QAAgB;IAEhB,IAAI,QAAQ,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,WAAmB,EACnB,OAAe;IAEf,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAA0B,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,WAAmB,EACnB,OAAe;IAEf,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAA0B,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"workspace-blob-store.js","sourceRoot":"","sources":["../src/workspace-blob-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * HTTP handlers for the Git Local Storage location surface:
3
+ * GET /api/workspace-path — where the disk blob cache lives (root + optional per-workspace dir)
4
+ * POST /api/reveal — open that folder in the OS file manager (Finder / Explorer / xdg)
5
+ *
6
+ * These never touch blob contents and never require an active plugin WebSocket session. For safety
7
+ * the reveal target is always derived **server-side** from the validated workspaceId — the client
8
+ * cannot pass an arbitrary filesystem path, so there is no traversal / open-anything risk.
9
+ */
10
+ import type { IncomingMessage, ServerResponse } from "node:http";
11
+ /**
12
+ * The OS-specific "open this folder" command. Pure + exported for unit tests. Args are passed as an
13
+ * argv array (never through a shell) so the directory string can't be interpreted as a command.
14
+ */
15
+ export declare function revealCommandFor(platform: NodeJS.Platform, dir: string): {
16
+ cmd: string;
17
+ args: string[];
18
+ };
19
+ /** Server-derived reveal target: the per-workspace dir when a valid id is given, else the cache root. */
20
+ export declare function resolveRevealDir(rootDir: string, workspaceId: string | null | undefined): string;
21
+ /**
22
+ * @returns true if this handler consumed the request.
23
+ */
24
+ export declare function tryHandleWorkspacePathApi(req: IncomingMessage, res: ServerResponse, reqUrl: string): Promise<boolean>;