@sarjallab09/figma-intelligence 1.0.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 (286) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +327 -0
  3. package/bin/cli.js +859 -0
  4. package/design-bridge/.env.example +5 -0
  5. package/design-bridge/bridge.js +196 -0
  6. package/design-bridge/lib/assets.js +367 -0
  7. package/design-bridge/lib/prompt.js +85 -0
  8. package/design-bridge/lib/server.js +66 -0
  9. package/design-bridge/lib/stitch.js +37 -0
  10. package/design-bridge/lib/tokens.js +82 -0
  11. package/design-bridge/package-lock.json +579 -0
  12. package/design-bridge/package.json +19 -0
  13. package/figma-bridge-plugin/README.md +97 -0
  14. package/figma-bridge-plugin/anthropic-chat-runner.js +192 -0
  15. package/figma-bridge-plugin/bridge-relay.js +2363 -0
  16. package/figma-bridge-plugin/chat-runner.js +459 -0
  17. package/figma-bridge-plugin/code.js +1528 -0
  18. package/figma-bridge-plugin/codex-runner.js +505 -0
  19. package/figma-bridge-plugin/component-schemas.js +110 -0
  20. package/figma-bridge-plugin/content-context.js +869 -0
  21. package/figma-bridge-plugin/create-button.js +216 -0
  22. package/figma-bridge-plugin/gemini-cli-runner.js +291 -0
  23. package/figma-bridge-plugin/gemini-runner.js +187 -0
  24. package/figma-bridge-plugin/html-to-figma.js +927 -0
  25. package/figma-bridge-plugin/knowledge-hub/.gitkeep +0 -0
  26. package/figma-bridge-plugin/knowledge-hub/uspec-references/anatomy-spec.md +159 -0
  27. package/figma-bridge-plugin/knowledge-hub/uspec-references/api-spec.md +162 -0
  28. package/figma-bridge-plugin/knowledge-hub/uspec-references/color-spec.md +148 -0
  29. package/figma-bridge-plugin/knowledge-hub/uspec-references/full-spec-template.md +314 -0
  30. package/figma-bridge-plugin/knowledge-hub/uspec-references/property-spec.md +175 -0
  31. package/figma-bridge-plugin/knowledge-hub/uspec-references/screen-reader-spec.md +180 -0
  32. package/figma-bridge-plugin/knowledge-hub/uspec-references/structure-spec.md +165 -0
  33. package/figma-bridge-plugin/manifest.json +21 -0
  34. package/figma-bridge-plugin/package-lock.json +1936 -0
  35. package/figma-bridge-plugin/package.json +20 -0
  36. package/figma-bridge-plugin/perplexity-runner.js +188 -0
  37. package/figma-bridge-plugin/references/SKILL.md +178 -0
  38. package/figma-bridge-plugin/references/anatomy-spec.md +159 -0
  39. package/figma-bridge-plugin/references/api-spec.md +162 -0
  40. package/figma-bridge-plugin/references/color-spec.md +148 -0
  41. package/figma-bridge-plugin/references/full-spec-template.md +314 -0
  42. package/figma-bridge-plugin/references/property-spec.md +175 -0
  43. package/figma-bridge-plugin/references/screen-reader-spec.md +180 -0
  44. package/figma-bridge-plugin/references/structure-spec.md +165 -0
  45. package/figma-bridge-plugin/shared-prompt-config.js +604 -0
  46. package/figma-bridge-plugin/spec-helpers/build-table.js +269 -0
  47. package/figma-bridge-plugin/spec-helpers/classify-elements.js +189 -0
  48. package/figma-bridge-plugin/spec-helpers/index.js +35 -0
  49. package/figma-bridge-plugin/spec-helpers/parse-figma-link.js +49 -0
  50. package/figma-bridge-plugin/spec-helpers/position-markers.js +158 -0
  51. package/figma-bridge-plugin/stitch-auth.js +322 -0
  52. package/figma-bridge-plugin/stitch-runner.js +1427 -0
  53. package/figma-bridge-plugin/token-resolver.js +107 -0
  54. package/figma-bridge-plugin/ui.html +4467 -0
  55. package/figma-intelligence-layer/.env.example +39 -0
  56. package/figma-intelligence-layer/docs/local-image-generation.md +60 -0
  57. package/figma-intelligence-layer/examples/comfyui-workflow-template.example.json +101 -0
  58. package/figma-intelligence-layer/jest.config.js +14 -0
  59. package/figma-intelligence-layer/mcp-config.json +19 -0
  60. package/figma-intelligence-layer/package-lock.json +5892 -0
  61. package/figma-intelligence-layer/package.json +48 -0
  62. package/figma-intelligence-layer/scripts/setup-comfyui-local.sh +67 -0
  63. package/figma-intelligence-layer/scripts/start-comfyui.sh +33 -0
  64. package/figma-intelligence-layer/src/index.ts +2233 -0
  65. package/figma-intelligence-layer/src/shared/auto-layout-validator.ts +404 -0
  66. package/figma-intelligence-layer/src/shared/cache.ts +187 -0
  67. package/figma-intelligence-layer/src/shared/color-operations.ts +533 -0
  68. package/figma-intelligence-layer/src/shared/color-utils.ts +138 -0
  69. package/figma-intelligence-layer/src/shared/component-script-builder.ts +413 -0
  70. package/figma-intelligence-layer/src/shared/component-templates.ts +2767 -0
  71. package/figma-intelligence-layer/src/shared/concept-taxonomy.ts +694 -0
  72. package/figma-intelligence-layer/src/shared/decision-log.ts +128 -0
  73. package/figma-intelligence-layer/src/shared/design-system-context.ts +568 -0
  74. package/figma-intelligence-layer/src/shared/design-system-intelligence.ts +131 -0
  75. package/figma-intelligence-layer/src/shared/design-system-matcher.ts +184 -0
  76. package/figma-intelligence-layer/src/shared/design-system-normalizers.ts +196 -0
  77. package/figma-intelligence-layer/src/shared/design-system-tokens.ts +295 -0
  78. package/figma-intelligence-layer/src/shared/dtcg-validator.ts +530 -0
  79. package/figma-intelligence-layer/src/shared/enrichment-pipeline.ts +671 -0
  80. package/figma-intelligence-layer/src/shared/figma-bridge.ts +1408 -0
  81. package/figma-intelligence-layer/src/shared/font-config.ts +126 -0
  82. package/figma-intelligence-layer/src/shared/icon-catalog.ts +360 -0
  83. package/figma-intelligence-layer/src/shared/icon-fetch.ts +80 -0
  84. package/figma-intelligence-layer/src/shared/prototype-script-builder.ts +162 -0
  85. package/figma-intelligence-layer/src/shared/response-compression.ts +440 -0
  86. package/figma-intelligence-layer/src/shared/semantic-token-catalog.ts +324 -0
  87. package/figma-intelligence-layer/src/shared/token-binder.ts +505 -0
  88. package/figma-intelligence-layer/src/shared/token-math.ts +427 -0
  89. package/figma-intelligence-layer/src/shared/token-naming.ts +468 -0
  90. package/figma-intelligence-layer/src/shared/token-utils.ts +420 -0
  91. package/figma-intelligence-layer/src/shared/types.ts +346 -0
  92. package/figma-intelligence-layer/src/shared/typography-presets.ts +94 -0
  93. package/figma-intelligence-layer/src/shared/unsplash.ts +165 -0
  94. package/figma-intelligence-layer/src/shared/vision-client.ts +607 -0
  95. package/figma-intelligence-layer/src/shared/vision-provider-anthropic.ts +334 -0
  96. package/figma-intelligence-layer/src/shared/vision-provider-openai.ts +446 -0
  97. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-handler.ts +782 -0
  98. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-renderer.ts +496 -0
  99. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotation-kit.ts +230 -0
  100. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/colorblind-sim.ts +66 -0
  101. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/index.ts +810 -0
  102. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-analyzer.ts +1191 -0
  103. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-figma-page.ts +1346 -0
  104. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-handler.ts +148 -0
  105. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-figma-page.ts +499 -0
  106. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-report.ts +910 -0
  107. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-checker.ts +989 -0
  108. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-criteria.ts +1160 -0
  109. package/figma-intelligence-layer/src/tools/phase1-vision/design-from-ref/index.ts +424 -0
  110. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/component-recognizer.ts +38 -0
  111. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/ds-matcher.ts +111 -0
  112. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/font-matcher.ts +114 -0
  113. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/icon-resolver.ts +103 -0
  114. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/index.ts +1060 -0
  115. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/layout-segmenter.ts +18 -0
  116. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/token-inferencer.ts +39 -0
  117. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/vision-pipeline.ts +58 -0
  118. package/figma-intelligence-layer/src/tools/phase1-vision/sketch-to-design/index.ts +298 -0
  119. package/figma-intelligence-layer/src/tools/phase1-vision/visual-audit/index.ts +197 -0
  120. package/figma-intelligence-layer/src/tools/phase2-accuracy/component-audit/index.ts +494 -0
  121. package/figma-intelligence-layer/src/tools/phase2-accuracy/intent-translator/index.ts +356 -0
  122. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/container-patterns.ts +123 -0
  123. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/index.ts +663 -0
  124. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/built-in-rules.yaml +56 -0
  125. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/index.ts +614 -0
  126. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/rule-engine.ts +113 -0
  127. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/color-theory.ts +178 -0
  128. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/index.ts +470 -0
  129. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/index.ts +429 -0
  130. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/token-override-maps.ts +226 -0
  131. package/figma-intelligence-layer/src/tools/phase3-generation/ai-image-insert/index.ts +535 -0
  132. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/index.ts +660 -0
  133. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/pattern-fingerprints.ts +209 -0
  134. package/figma-intelligence-layer/src/tools/phase3-generation/composition-builder/index.ts +540 -0
  135. package/figma-intelligence-layer/src/tools/phase3-generation/figma-animated-build.ts +391 -0
  136. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/index.ts +2019 -0
  137. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/screen-templates.ts +131 -0
  138. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-map/index.ts +381 -0
  139. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-wire/index.ts +565 -0
  140. package/figma-intelligence-layer/src/tools/phase3-generation/swarm-build/index.ts +764 -0
  141. package/figma-intelligence-layer/src/tools/phase3-generation/system-drift/index.ts +535 -0
  142. package/figma-intelligence-layer/src/tools/phase3-generation/unsplash-search/index.ts +84 -0
  143. package/figma-intelligence-layer/src/tools/phase3-generation/url-to-frame/index.ts +401 -0
  144. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/css-animations.ts +68 -0
  145. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/framer-motion.ts +78 -0
  146. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/swift-animations.ts +93 -0
  147. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/index.ts +596 -0
  148. package/figma-intelligence-layer/src/tools/phase4-sync/ci-check/index.ts +462 -0
  149. package/figma-intelligence-layer/src/tools/phase4-sync/export-tokens/index.ts +1470 -0
  150. package/figma-intelligence-layer/src/tools/phase4-sync/generate-component-code/index.ts +829 -0
  151. package/figma-intelligence-layer/src/tools/phase4-sync/handoff-spec/index.ts +702 -0
  152. package/figma-intelligence-layer/src/tools/phase4-sync/icon-library-sync/index.ts +483 -0
  153. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/index.ts +501 -0
  154. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/storybook-parser.ts +106 -0
  155. package/figma-intelligence-layer/src/tools/phase4-sync/watch-docs/index.ts +676 -0
  156. package/figma-intelligence-layer/src/tools/phase4-sync/webhook-listener/index.ts +560 -0
  157. package/figma-intelligence-layer/src/tools/phase5-governance/apg-doc/index.ts +1043 -0
  158. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/component-detection.ts +620 -0
  159. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/anatomy.ts +331 -0
  160. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/color-tokens.ts +77 -0
  161. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/properties.ts +54 -0
  162. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/snapshot.ts +287 -0
  163. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/spacing.ts +71 -0
  164. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/states.ts +43 -0
  165. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/typography.ts +71 -0
  166. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/index.ts +221 -0
  167. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/_default.ts +166 -0
  168. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/accordion.ts +232 -0
  169. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/alert.ts +234 -0
  170. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar-group.ts +270 -0
  171. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar.ts +249 -0
  172. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/badge.ts +231 -0
  173. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/banner.ts +293 -0
  174. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/breadcrumb.ts +240 -0
  175. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/button.ts +243 -0
  176. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/calendar.ts +307 -0
  177. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/card.ts +143 -0
  178. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/checkbox.ts +227 -0
  179. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/chip.ts +233 -0
  180. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/combobox.ts +282 -0
  181. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/datepicker.ts +276 -0
  182. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/divider.ts +223 -0
  183. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/drawer.ts +255 -0
  184. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/dropdown-menu.ts +289 -0
  185. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/empty-state.ts +261 -0
  186. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/file-uploader.ts +290 -0
  187. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/form.ts +265 -0
  188. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/grid.ts +238 -0
  189. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/icon.ts +255 -0
  190. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/index.ts +128 -0
  191. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-edit.ts +286 -0
  192. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-message.ts +255 -0
  193. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/input.ts +330 -0
  194. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/link.ts +247 -0
  195. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/list.ts +250 -0
  196. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/menu.ts +247 -0
  197. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/modal.ts +144 -0
  198. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navbar.ts +264 -0
  199. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navigation.ts +251 -0
  200. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/number-input.ts +261 -0
  201. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/pagination.ts +248 -0
  202. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/popover.ts +270 -0
  203. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts +251 -0
  204. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/radio.ts +142 -0
  205. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/range-slider.ts +282 -0
  206. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/rating.ts +250 -0
  207. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/search.ts +258 -0
  208. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/segmented-control.ts +265 -0
  209. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/select.ts +319 -0
  210. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts +256 -0
  211. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts +232 -0
  212. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/spinner.ts +239 -0
  213. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/status-dot.ts +252 -0
  214. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/stepper.ts +270 -0
  215. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/table.ts +244 -0
  216. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tabs.ts +143 -0
  217. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tag.ts +243 -0
  218. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/textarea.ts +259 -0
  219. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/time-picker.ts +293 -0
  220. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toast.ts +144 -0
  221. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toggle.ts +289 -0
  222. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toolbar.ts +267 -0
  223. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tooltip.ts +232 -0
  224. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/treeview.ts +257 -0
  225. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/typography.ts +319 -0
  226. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/legacy-compat.ts +121 -0
  227. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/anatomy-diagram.ts +430 -0
  228. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/figma-page.ts +312 -0
  229. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/json.ts +129 -0
  230. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/markdown.ts +78 -0
  231. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/visual-doc.ts +2333 -0
  232. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/accessibility.ts +100 -0
  233. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/anatomy.ts +32 -0
  234. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/color-tokens.ts +59 -0
  235. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/content-guidance.ts +18 -0
  236. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/design-tokens.ts +53 -0
  237. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/interaction-rules.ts +19 -0
  238. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/overview.ts +91 -0
  239. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/properties-api.ts +71 -0
  240. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/qa-criteria.ts +19 -0
  241. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/related-components.ts +110 -0
  242. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/responsive.ts +19 -0
  243. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/size-specs.ts +67 -0
  244. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/spacing-structure.ts +58 -0
  245. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/state-specs.ts +79 -0
  246. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/states.ts +50 -0
  247. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/type-hierarchy.ts +33 -0
  248. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/typography.ts +55 -0
  249. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/usage-guidelines.ts +73 -0
  250. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/variants.ts +81 -0
  251. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/types.ts +409 -0
  252. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/index.ts +198 -0
  253. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/renderer.ts +701 -0
  254. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/types.ts +88 -0
  255. package/figma-intelligence-layer/src/tools/phase5-governance/decision-log/index.ts +135 -0
  256. package/figma-intelligence-layer/src/tools/phase5-governance/design-decision-log/index.ts +491 -0
  257. package/figma-intelligence-layer/src/tools/phase5-governance/ds-primitives/index.ts +416 -0
  258. package/figma-intelligence-layer/src/tools/phase5-governance/ds-scaffolder/index.ts +722 -0
  259. package/figma-intelligence-layer/src/tools/phase5-governance/ds-variables/index.ts +449 -0
  260. package/figma-intelligence-layer/src/tools/phase5-governance/health-report/index.ts +393 -0
  261. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/index.ts +406 -0
  262. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/figma-page.ts +292 -0
  263. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/json.ts +24 -0
  264. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/markdown.ts +172 -0
  265. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/naming-guide.ts +409 -0
  266. package/figma-intelligence-layer/src/tools/phase5-governance/token-analytics/index.ts +594 -0
  267. package/figma-intelligence-layer/src/tools/phase5-governance/token-docs/index.ts +710 -0
  268. package/figma-intelligence-layer/src/tools/phase5-governance/token-migrate/index.ts +458 -0
  269. package/figma-intelligence-layer/src/tools/phase5-governance/token-naming/index.ts +134 -0
  270. package/figma-intelligence-layer/tests/apg-doc.test.ts +101 -0
  271. package/figma-intelligence-layer/tests/design-system-context.test.ts +152 -0
  272. package/figma-intelligence-layer/tests/design-system-matcher.test.ts +144 -0
  273. package/figma-intelligence-layer/tests/figma-bridge.test.ts +83 -0
  274. package/figma-intelligence-layer/tests/generate-image-and-insert.test.ts +56 -0
  275. package/figma-intelligence-layer/tests/screen-cloner-regression.test.ts +69 -0
  276. package/figma-intelligence-layer/tests/smoke.test.ts +174 -0
  277. package/figma-intelligence-layer/tests/spec-generator.test.ts +127 -0
  278. package/figma-intelligence-layer/tests/token-migrate.test.ts +21 -0
  279. package/figma-intelligence-layer/tests/token-naming.test.ts +30 -0
  280. package/figma-intelligence-layer/tsconfig.json +19 -0
  281. package/package.json +35 -0
  282. package/scripts/clean-existing-chunks.js +179 -0
  283. package/scripts/connect-ai-tool.js +490 -0
  284. package/scripts/convert-hub-pdfs.js +425 -0
  285. package/scripts/figma-mcp-status.js +349 -0
  286. package/scripts/register-codex-mcp.js +96 -0
@@ -0,0 +1,535 @@
1
+ import fs from "fs/promises";
2
+ import { spawn } from "child_process";
3
+ import { getBridge } from "../../../shared/figma-bridge.js";
4
+
5
+ const GEMINI_API_BASE = "https://generativelanguage.googleapis.com/v1beta/models";
6
+ const DEFAULT_MODEL = process.env.GEMINI_IMAGE_MODEL?.trim() || "gemini-2.5-flash-image";
7
+ const DEFAULT_AUTOMATIC1111_BASE_URL =
8
+ process.env.AUTOMATIC1111_BASE_URL?.trim() || "http://127.0.0.1:7860";
9
+ const DEFAULT_COMFYUI_BASE_URL =
10
+ process.env.COMFYUI_BASE_URL?.trim() || "http://127.0.0.1:8188";
11
+ const DEFAULT_COMFYUI_TIMEOUT_MS = Number(process.env.COMFYUI_TIMEOUT_MS || "180000");
12
+ const DEFAULT_COMFYUI_STARTUP_TIMEOUT_MS = Number(process.env.COMFYUI_STARTUP_TIMEOUT_MS || "90000");
13
+ const DEFAULT_COMFYUI_AUTO_START = (process.env.COMFYUI_AUTO_START || "true").toLowerCase() !== "false";
14
+
15
+ export interface GenerateImageAndInsertArgs {
16
+ prompt: string;
17
+ targetNodeId?: string;
18
+ width?: number;
19
+ height?: number;
20
+ style?: string;
21
+ provider?: "gemini" | "automatic1111" | "comfyui";
22
+ }
23
+
24
+ interface GeminiInlineDataPart {
25
+ inlineData?: {
26
+ mimeType?: string;
27
+ data?: string;
28
+ };
29
+ inline_data?: {
30
+ mime_type?: string;
31
+ data?: string;
32
+ };
33
+ text?: string;
34
+ }
35
+
36
+ function getGeminiApiKey(): string {
37
+ const apiKey = process.env.GEMINI_API_KEY?.trim();
38
+ if (!apiKey) {
39
+ throw new Error(
40
+ "GEMINI_API_KEY is not set. Add a Gemini API key to enable image generation."
41
+ );
42
+ }
43
+ return apiKey;
44
+ }
45
+
46
+ function getComfyUiWorkflowPath(): string {
47
+ const workflowPath = process.env.COMFYUI_WORKFLOW_PATH?.trim();
48
+ if (!workflowPath) {
49
+ throw new Error(
50
+ "COMFYUI_WORKFLOW_PATH is not set. Export a ComfyUI workflow in API format and point this env var to that JSON file."
51
+ );
52
+ }
53
+ return workflowPath;
54
+ }
55
+
56
+ function getComfyUiLaunchCommand(): string {
57
+ return process.env.COMFYUI_LAUNCH_CMD?.trim() || "";
58
+ }
59
+
60
+ function normalizePrompt(prompt: string, style?: string): string {
61
+ const cleanPrompt = prompt.trim();
62
+ const cleanStyle = style?.trim();
63
+ if (!cleanPrompt) {
64
+ throw new Error("generateImageAndInsert: prompt is required");
65
+ }
66
+ if (!cleanStyle) return cleanPrompt;
67
+ return `${cleanPrompt}\n\nVisual style: ${cleanStyle}`;
68
+ }
69
+
70
+ function extractImagePart(payload: unknown): { mimeType: string; data: string; textParts: string[] } {
71
+ const candidates = (payload as { candidates?: Array<{ content?: { parts?: GeminiInlineDataPart[] } }> })
72
+ ?.candidates;
73
+ const parts = candidates?.[0]?.content?.parts ?? [];
74
+ const textParts: string[] = [];
75
+
76
+ for (const part of parts) {
77
+ if (typeof part?.text === "string" && part.text.trim()) {
78
+ textParts.push(part.text.trim());
79
+ }
80
+
81
+ const inlineData = part?.inlineData ?? part?.inline_data;
82
+ if (inlineData?.data) {
83
+ const normalizedMimeType =
84
+ "mimeType" in inlineData
85
+ ? inlineData.mimeType
86
+ : "mime_type" in inlineData
87
+ ? inlineData.mime_type
88
+ : undefined;
89
+ return {
90
+ mimeType: normalizedMimeType || "image/png",
91
+ data: inlineData.data,
92
+ textParts,
93
+ };
94
+ }
95
+ }
96
+
97
+ throw new Error("Gemini image generation returned no image data.");
98
+ }
99
+
100
+ async function generateGeminiImage(
101
+ prompt: string,
102
+ style?: string
103
+ ): Promise<{ mimeType: string; dataUri: string; model: string; providerNotes?: string }> {
104
+ const apiKey = getGeminiApiKey();
105
+ const fullPrompt = normalizePrompt(prompt, style);
106
+ const url = `${GEMINI_API_BASE}/${encodeURIComponent(DEFAULT_MODEL)}:generateContent`;
107
+
108
+ const response = await fetch(url, {
109
+ method: "POST",
110
+ headers: {
111
+ "Content-Type": "application/json",
112
+ "x-goog-api-key": apiKey,
113
+ },
114
+ body: JSON.stringify({
115
+ contents: [
116
+ {
117
+ parts: [{ text: fullPrompt }],
118
+ },
119
+ ],
120
+ generationConfig: {
121
+ responseModalities: ["TEXT", "IMAGE"],
122
+ },
123
+ }),
124
+ });
125
+
126
+ if (!response.ok) {
127
+ const body = await response.text().catch(() => "");
128
+ throw new Error(`Gemini image generation failed (${response.status}): ${body || response.statusText}`);
129
+ }
130
+
131
+ const payload = await response.json();
132
+ const { mimeType, data, textParts } = extractImagePart(payload);
133
+ return {
134
+ mimeType,
135
+ dataUri: `data:${mimeType};base64,${data}`,
136
+ model: DEFAULT_MODEL,
137
+ providerNotes: textParts.join("\n").trim() || undefined,
138
+ };
139
+ }
140
+
141
+ async function generateAutomatic1111Image(
142
+ prompt: string,
143
+ style?: string,
144
+ width?: number,
145
+ height?: number
146
+ ): Promise<{ mimeType: string; dataUri: string; model: string; providerNotes?: string }> {
147
+ const fullPrompt = normalizePrompt(prompt, style);
148
+ const targetWidth = sanitizeDimension(width, 1024);
149
+ const targetHeight = sanitizeDimension(height, 1024);
150
+ const url = `${DEFAULT_AUTOMATIC1111_BASE_URL.replace(/\/$/, "")}/sdapi/v1/txt2img`;
151
+
152
+ const response = await fetch(url, {
153
+ method: "POST",
154
+ headers: {
155
+ "Content-Type": "application/json",
156
+ },
157
+ body: JSON.stringify({
158
+ prompt: fullPrompt,
159
+ width: targetWidth,
160
+ height: targetHeight,
161
+ steps: 20,
162
+ cfg_scale: 7,
163
+ sampler_name: "Euler a",
164
+ }),
165
+ });
166
+
167
+ if (!response.ok) {
168
+ const body = await response.text().catch(() => "");
169
+ throw new Error(
170
+ `AUTOMATIC1111 image generation failed (${response.status}): ${body || response.statusText}`
171
+ );
172
+ }
173
+
174
+ const payload = (await response.json()) as {
175
+ images?: string[];
176
+ info?: string;
177
+ };
178
+ const base64 = Array.isArray(payload.images) ? payload.images[0] : undefined;
179
+ if (!base64) {
180
+ throw new Error("AUTOMATIC1111 returned no image data.");
181
+ }
182
+
183
+ const normalizedBase64 = base64.replace(/^data:image\/[a-zA-Z0-9.+-]+;base64,/, "");
184
+ return {
185
+ mimeType: "image/png",
186
+ dataUri: `data:image/png;base64,${normalizedBase64}`,
187
+ model: "automatic1111-local",
188
+ providerNotes: typeof payload.info === "string" ? payload.info : undefined,
189
+ };
190
+ }
191
+
192
+ function replacePlaceholders(
193
+ value: unknown,
194
+ replacements: Record<string, string | number>
195
+ ): unknown {
196
+ if (Array.isArray(value)) {
197
+ return value.map((entry) => replacePlaceholders(entry, replacements));
198
+ }
199
+
200
+ if (value && typeof value === "object") {
201
+ return Object.fromEntries(
202
+ Object.entries(value).map(([key, entry]) => [key, replacePlaceholders(entry, replacements)])
203
+ );
204
+ }
205
+
206
+ if (typeof value !== "string") {
207
+ return value;
208
+ }
209
+
210
+ if (Object.prototype.hasOwnProperty.call(replacements, value)) {
211
+ return replacements[value];
212
+ }
213
+
214
+ let replaced = value;
215
+ for (const [token, tokenValue] of Object.entries(replacements)) {
216
+ replaced = replaced.split(token).join(String(tokenValue));
217
+ }
218
+ return replaced;
219
+ }
220
+
221
+ function sleep(ms: number): Promise<void> {
222
+ return new Promise((resolve) => setTimeout(resolve, ms));
223
+ }
224
+
225
+ async function isComfyUiReachable(baseUrl: string): Promise<boolean> {
226
+ try {
227
+ const response = await fetch(`${baseUrl}/history`);
228
+ return response.ok || response.status === 404;
229
+ } catch {
230
+ return false;
231
+ }
232
+ }
233
+
234
+ function startComfyUiDetached(launchCommand: string): void {
235
+ const child = spawn(launchCommand, {
236
+ shell: true,
237
+ detached: true,
238
+ stdio: "ignore",
239
+ env: process.env,
240
+ });
241
+ child.unref();
242
+ }
243
+
244
+ async function ensureComfyUiAvailable(baseUrl: string): Promise<void> {
245
+ if (await isComfyUiReachable(baseUrl)) {
246
+ return;
247
+ }
248
+
249
+ if (!DEFAULT_COMFYUI_AUTO_START) {
250
+ throw new Error(
251
+ `ComfyUI is not reachable at ${baseUrl}. Start it locally or enable COMFYUI_AUTO_START.`
252
+ );
253
+ }
254
+
255
+ const launchCommand = getComfyUiLaunchCommand();
256
+ if (!launchCommand) {
257
+ throw new Error(
258
+ `ComfyUI is not reachable at ${baseUrl}, and COMFYUI_LAUNCH_CMD is not configured for auto-start.`
259
+ );
260
+ }
261
+
262
+ startComfyUiDetached(launchCommand);
263
+
264
+ const deadline = Date.now() + DEFAULT_COMFYUI_STARTUP_TIMEOUT_MS;
265
+ while (Date.now() < deadline) {
266
+ if (await isComfyUiReachable(baseUrl)) {
267
+ return;
268
+ }
269
+ await sleep(1500);
270
+ }
271
+
272
+ throw new Error(
273
+ `ComfyUI did not become ready within ${DEFAULT_COMFYUI_STARTUP_TIMEOUT_MS}ms after auto-start.`
274
+ );
275
+ }
276
+
277
+ async function generateComfyUiImage(
278
+ prompt: string,
279
+ style?: string,
280
+ width?: number,
281
+ height?: number
282
+ ): Promise<{ mimeType: string; dataUri: string; model: string; providerNotes?: string }> {
283
+ const workflowPath = getComfyUiWorkflowPath();
284
+ const workflowRaw = await fs.readFile(workflowPath, "utf8");
285
+ const workflowJson = JSON.parse(workflowRaw) as Record<string, unknown>;
286
+ const graph = (workflowJson.prompt && typeof workflowJson.prompt === "object"
287
+ ? workflowJson.prompt
288
+ : workflowJson) as Record<string, unknown>;
289
+ const fullPrompt = normalizePrompt(prompt, style);
290
+ const seed = Math.floor(Math.random() * 1_000_000_000);
291
+ const targetWidth = sanitizeDimension(width, 1024);
292
+ const targetHeight = sanitizeDimension(height, 1024);
293
+ const baseUrl = DEFAULT_COMFYUI_BASE_URL.replace(/\/$/, "");
294
+ const clientId = `figma-intelligence-layer-${Date.now()}`;
295
+
296
+ await ensureComfyUiAvailable(baseUrl);
297
+
298
+ const hydratedGraph = replacePlaceholders(graph, {
299
+ "__PROMPT__": fullPrompt,
300
+ "__STYLE__": style?.trim() || "",
301
+ "__NEGATIVE_PROMPT__": "",
302
+ "__WIDTH__": targetWidth,
303
+ "__HEIGHT__": targetHeight,
304
+ "__SEED__": seed,
305
+ }) as Record<string, unknown>;
306
+
307
+ const queueResponse = await fetch(`${baseUrl}/prompt`, {
308
+ method: "POST",
309
+ headers: {
310
+ "Content-Type": "application/json",
311
+ },
312
+ body: JSON.stringify({
313
+ prompt: hydratedGraph,
314
+ client_id: clientId,
315
+ }),
316
+ });
317
+
318
+ if (!queueResponse.ok) {
319
+ const body = await queueResponse.text().catch(() => "");
320
+ throw new Error(`ComfyUI prompt submission failed (${queueResponse.status}): ${body || queueResponse.statusText}`);
321
+ }
322
+
323
+ const queuePayload = (await queueResponse.json()) as { prompt_id?: string };
324
+ const promptId = queuePayload.prompt_id;
325
+ if (!promptId) {
326
+ throw new Error("ComfyUI did not return a prompt_id.");
327
+ }
328
+
329
+ const deadline = Date.now() + DEFAULT_COMFYUI_TIMEOUT_MS;
330
+ while (Date.now() < deadline) {
331
+ const historyResponse = await fetch(`${baseUrl}/history/${encodeURIComponent(promptId)}`);
332
+ if (!historyResponse.ok) {
333
+ const body = await historyResponse.text().catch(() => "");
334
+ throw new Error(`ComfyUI history lookup failed (${historyResponse.status}): ${body || historyResponse.statusText}`);
335
+ }
336
+
337
+ const historyPayload = (await historyResponse.json()) as Record<string, {
338
+ outputs?: Record<string, { images?: Array<{ filename?: string; subfolder?: string; type?: string }> }>;
339
+ }>;
340
+ const promptHistory = historyPayload[promptId];
341
+ const outputs = promptHistory?.outputs ? Object.values(promptHistory.outputs) : [];
342
+
343
+ for (const output of outputs) {
344
+ const image = output.images?.[0];
345
+ if (!image?.filename) continue;
346
+
347
+ const imageUrl = new URL(`${baseUrl}/view`);
348
+ imageUrl.searchParams.set("filename", image.filename);
349
+ imageUrl.searchParams.set("subfolder", image.subfolder || "");
350
+ imageUrl.searchParams.set("type", image.type || "output");
351
+
352
+ const imageResponse = await fetch(imageUrl.toString());
353
+ if (!imageResponse.ok) {
354
+ const body = await imageResponse.text().catch(() => "");
355
+ throw new Error(`ComfyUI image fetch failed (${imageResponse.status}): ${body || imageResponse.statusText}`);
356
+ }
357
+
358
+ const mimeType = imageResponse.headers.get("content-type") || "image/png";
359
+ const buffer = Buffer.from(await imageResponse.arrayBuffer());
360
+ return {
361
+ mimeType,
362
+ dataUri: `data:${mimeType};base64,${buffer.toString("base64")}`,
363
+ model: "comfyui-local",
364
+ providerNotes: `prompt_id=${promptId}; workflow=${workflowPath}; seed=${seed}`,
365
+ };
366
+ }
367
+
368
+ await sleep(1000);
369
+ }
370
+
371
+ throw new Error(
372
+ `ComfyUI timed out after ${DEFAULT_COMFYUI_TIMEOUT_MS}ms waiting for generated images.`
373
+ );
374
+ }
375
+
376
+ function sanitizeDimension(value: number | undefined, fallback: number): number {
377
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
378
+ return fallback;
379
+ }
380
+ return Math.round(value);
381
+ }
382
+
383
+ async function placeImageInFigma(args: {
384
+ imageHash: string;
385
+ prompt: string;
386
+ mimeType: string;
387
+ model: string;
388
+ width?: number;
389
+ height?: number;
390
+ targetNodeId?: string;
391
+ }): Promise<Record<string, unknown>> {
392
+ const bridge = await getBridge();
393
+ const width = sanitizeDimension(args.width, 1024);
394
+ const height = sanitizeDimension(args.height, 1024);
395
+
396
+ const execution = await bridge.execute(`
397
+ const targetNodeId = ${JSON.stringify(args.targetNodeId ?? "")};
398
+ const imageHash = ${JSON.stringify(args.imageHash)};
399
+ const prompt = ${JSON.stringify(args.prompt)};
400
+ const mimeType = ${JSON.stringify(args.mimeType)};
401
+ const model = ${JSON.stringify(args.model)};
402
+ const width = ${width};
403
+ const height = ${height};
404
+
405
+ async function resolvePlacementTarget() {
406
+ if (targetNodeId) {
407
+ const target = await figma.getNodeByIdAsync(targetNodeId);
408
+ if (target) return { target, mode: "target-node" };
409
+ }
410
+ return { target: figma.currentPage, mode: "current-page" };
411
+ }
412
+
413
+ const targetInfo = await resolvePlacementTarget();
414
+ let node = targetInfo.target;
415
+ let placementMode = "created-rectangle";
416
+
417
+ if ("fills" in node) {
418
+ placementMode = targetInfo.mode === "target-node" ? "filled-target-node" : "filled-current-page";
419
+ } else if ("appendChild" in node) {
420
+ const rect = figma.createRectangle();
421
+ rect.resize(width, height);
422
+ rect.name = "AI Generated Image";
423
+ rect.x = 0;
424
+ rect.y = 0;
425
+ node.appendChild(rect);
426
+ node = rect;
427
+ } else {
428
+ const rect = figma.createRectangle();
429
+ rect.resize(width, height);
430
+ rect.name = "AI Generated Image";
431
+ figma.currentPage.appendChild(rect);
432
+ node = rect;
433
+ }
434
+
435
+ if ("resize" in node && targetInfo.mode !== "target-node") {
436
+ node.resize(width, height);
437
+ }
438
+
439
+ if (!("fills" in node)) {
440
+ throw new Error("Resolved placement node does not support image fills.");
441
+ }
442
+
443
+ node.fills = [{
444
+ type: "IMAGE",
445
+ imageHash,
446
+ scaleMode: "FILL",
447
+ }];
448
+
449
+ if ("name" in node && (!node.name || node.name === "Rectangle")) {
450
+ node.name = "AI Generated Image";
451
+ }
452
+
453
+ if ("setPluginData" in node) {
454
+ node.setPluginData("aiImagePrompt", prompt);
455
+ node.setPluginData("aiImageMimeType", mimeType);
456
+ node.setPluginData("aiImageModel", model);
457
+ node.setPluginData("aiImageCreatedAt", String(Date.now()));
458
+ }
459
+
460
+ figma.currentPage.selection = [node];
461
+ figma.viewport.scrollAndZoomIntoView([node]);
462
+
463
+ return {
464
+ nodeId: node.id,
465
+ nodeName: node.name,
466
+ nodeType: node.type,
467
+ placementMode,
468
+ width: "width" in node ? node.width : width,
469
+ height: "height" in node ? node.height : height,
470
+ pageId: figma.currentPage.id,
471
+ pageName: figma.currentPage.name,
472
+ };
473
+ `);
474
+
475
+ if (!execution.success) {
476
+ throw new Error(execution.error);
477
+ }
478
+
479
+ return execution.result as Record<string, unknown>;
480
+ }
481
+
482
+ export async function generateImageAndInsertHandler(
483
+ rawArgs: GenerateImageAndInsertArgs
484
+ ): Promise<Record<string, unknown>> {
485
+ const prompt = rawArgs.prompt?.trim();
486
+ if (!prompt) {
487
+ throw new Error("generateImageAndInsert: prompt is required");
488
+ }
489
+
490
+ const provider = rawArgs.provider ?? "gemini";
491
+ let generated: { mimeType: string; dataUri: string; model: string; providerNotes?: string };
492
+
493
+ if (provider === "gemini") {
494
+ generated = await generateGeminiImage(prompt, rawArgs.style);
495
+ } else if (provider === "automatic1111") {
496
+ generated = await generateAutomatic1111Image(
497
+ prompt,
498
+ rawArgs.style,
499
+ rawArgs.width,
500
+ rawArgs.height
501
+ );
502
+ } else if (provider === "comfyui") {
503
+ generated = await generateComfyUiImage(
504
+ prompt,
505
+ rawArgs.style,
506
+ rawArgs.width,
507
+ rawArgs.height
508
+ );
509
+ } else {
510
+ throw new Error(`Unsupported provider: ${provider}`);
511
+ }
512
+ const bridge = await getBridge();
513
+ const imported = await bridge.importImage(generated.dataUri);
514
+ const placement = await placeImageInFigma({
515
+ imageHash: imported.imageHash,
516
+ prompt,
517
+ mimeType: generated.mimeType,
518
+ model: generated.model,
519
+ width: rawArgs.width,
520
+ height: rawArgs.height,
521
+ targetNodeId: rawArgs.targetNodeId,
522
+ });
523
+
524
+ return {
525
+ provider,
526
+ model: generated.model,
527
+ prompt,
528
+ style: rawArgs.style?.trim() || undefined,
529
+ mimeType: generated.mimeType,
530
+ byteLength: imported.byteLength,
531
+ imageHash: imported.imageHash,
532
+ placement,
533
+ providerNotes: generated.providerNotes,
534
+ };
535
+ }