@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,660 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // Component Archaeologist
3
+ // Reverse-engineers an arbitrary Figma node into a named component pattern.
4
+ // Fingerprints the layer tree, snaps hardcoded values to design tokens, and
5
+ // optionally promotes the node to a library component with variable bindings.
6
+ // ─────────────────────────────────────────────────────────────────────────────
7
+
8
+ import { getBridge } from "../../../shared/figma-bridge.js";
9
+ import { decisionLog } from "../../../shared/decision-log.js";
10
+ import {
11
+ snapToColorToken,
12
+ snapToSpacingToken,
13
+ figmaRgbaToHex,
14
+ } from "../../../shared/token-utils.js";
15
+ import { resolveTokenId } from "../../../shared/token-binder.js";
16
+ import { getConceptForComponent, getAllTokenPaths } from "../../../shared/concept-taxonomy.js";
17
+ import { FigmaNode, Token, TokenRef } from "../../../shared/types.js";
18
+
19
+ // ─── Public types ─────────────────────────────────────────────────────────────
20
+
21
+ export interface ComponentArchaeologistArgs {
22
+ nodeId: string;
23
+ outputAs: "analysis" | "component" | "both";
24
+ bindToExisting?: boolean;
25
+ createLibraryComponent?: boolean;
26
+ generateDocStub?: boolean;
27
+ }
28
+
29
+ export interface PatternMatch {
30
+ pattern: string;
31
+ candidates: string[];
32
+ confidence: number;
33
+ rationale: string;
34
+ }
35
+
36
+ export interface TokenMapping {
37
+ property: string;
38
+ hardcodedValue: string;
39
+ suggestedToken: string;
40
+ tokenValue: string | number;
41
+ delta: number | undefined;
42
+ }
43
+
44
+ export interface ComponentArchaeologistResult {
45
+ nodeId: string;
46
+ nodeName: string;
47
+ patternMatches: PatternMatch[];
48
+ bestMatch: string;
49
+ /** Concept from the taxonomy (e.g. "action", "surface", "field") */
50
+ concept: string | null;
51
+ /** Expected token paths for this concept from the taxonomy */
52
+ expectedTokens: string[];
53
+ tokenMappings: TokenMapping[];
54
+ promotedComponentId: string | null;
55
+ docStub: string | null;
56
+ layerSummary: LayerSummary;
57
+ logEntryId: string;
58
+ }
59
+
60
+ interface LayerSummary {
61
+ totalLayers: number;
62
+ depth: number;
63
+ hasImage: boolean;
64
+ hasIcon: boolean;
65
+ hasText: boolean;
66
+ hasInput: boolean;
67
+ hasAvatar: boolean;
68
+ textCount: number;
69
+ rectangleCount: number;
70
+ frameCount: number;
71
+ vectorCount: number;
72
+ layoutMode: "HORIZONTAL" | "VERTICAL" | "NONE" | undefined;
73
+ childCount: number;
74
+ }
75
+
76
+ // ─── Layer fingerprinting ─────────────────────────────────────────────────────
77
+
78
+ type LayerSignal =
79
+ | "icon"
80
+ | "text"
81
+ | "image"
82
+ | "input"
83
+ | "avatar"
84
+ | "chevron"
85
+ | "cta"
86
+ | "title"
87
+ | "body"
88
+ | "label"
89
+ | "subtitle";
90
+
91
+ function inferSignal(node: FigmaNode): LayerSignal[] {
92
+ const signals: LayerSignal[] = [];
93
+ const nameLower = node.name.toLowerCase();
94
+
95
+ if (node.type === "TEXT") {
96
+ signals.push("text");
97
+ if (/heading|title|h[1-6]/.test(nameLower)) signals.push("title");
98
+ if (/body|paragraph|description|content/.test(nameLower)) signals.push("body");
99
+ if (/label|caption|eyebrow|overline/.test(nameLower)) signals.push("label");
100
+ if (/subtitle|secondary|sub/.test(nameLower)) signals.push("subtitle");
101
+ if (/button|cta|action|submit|primary/.test(nameLower)) signals.push("cta");
102
+ }
103
+
104
+ if (node.type === "VECTOR" || /icon|ico|glyph|symbol/.test(nameLower)) {
105
+ signals.push("icon");
106
+ if (/chevron|arrow|caret/.test(nameLower)) signals.push("chevron");
107
+ }
108
+
109
+ if (node.fills?.some((f) => f.type === "IMAGE")) {
110
+ signals.push("image");
111
+ if (/avatar|profile|photo|user|face/.test(nameLower)) signals.push("avatar");
112
+ }
113
+
114
+ if (/input|field|textfield|text-field|textarea/.test(nameLower)) {
115
+ signals.push("input");
116
+ }
117
+
118
+ return signals;
119
+ }
120
+
121
+ function collectSignals(node: FigmaNode, depth = 0): LayerSignal[] {
122
+ const signals = inferSignal(node);
123
+ if (depth < 6 && node.children) {
124
+ for (const child of node.children) {
125
+ signals.push(...collectSignals(child, depth + 1));
126
+ }
127
+ }
128
+ return signals;
129
+ }
130
+
131
+ function countLayerTypes(node: FigmaNode): LayerSummary {
132
+ let totalLayers = 0;
133
+ let maxDepth = 0;
134
+ let hasImage = false;
135
+ let hasIcon = false;
136
+ let hasText = false;
137
+ let hasInput = false;
138
+ let hasAvatar = false;
139
+ let textCount = 0;
140
+ let rectangleCount = 0;
141
+ let frameCount = 0;
142
+ let vectorCount = 0;
143
+
144
+ function walk(n: FigmaNode, depth: number) {
145
+ totalLayers++;
146
+ if (depth > maxDepth) maxDepth = depth;
147
+ const nameLower = n.name.toLowerCase();
148
+
149
+ if (n.type === "TEXT") {
150
+ hasText = true;
151
+ textCount++;
152
+ }
153
+ if (n.type === "RECTANGLE") rectangleCount++;
154
+ if (n.type === "FRAME" || n.type === "GROUP") frameCount++;
155
+ if (n.type === "VECTOR" || /icon/.test(nameLower)) {
156
+ hasIcon = true;
157
+ vectorCount++;
158
+ }
159
+ if (n.fills?.some((f) => f.type === "IMAGE")) {
160
+ hasImage = true;
161
+ if (/avatar|profile/.test(nameLower)) hasAvatar = true;
162
+ }
163
+ if (/input|field/.test(nameLower)) hasInput = true;
164
+
165
+ if (n.children) {
166
+ for (const child of n.children) walk(child, depth + 1);
167
+ }
168
+ }
169
+
170
+ walk(node, 0);
171
+
172
+ return {
173
+ totalLayers,
174
+ depth: maxDepth,
175
+ hasImage,
176
+ hasIcon,
177
+ hasText,
178
+ hasInput,
179
+ hasAvatar,
180
+ textCount,
181
+ rectangleCount,
182
+ frameCount,
183
+ vectorCount,
184
+ layoutMode: node.layoutMode,
185
+ childCount: node.children?.length ?? 0,
186
+ };
187
+ }
188
+
189
+ // ─── Pattern matching ─────────────────────────────────────────────────────────
190
+
191
+ interface PatternRule {
192
+ pattern: string;
193
+ candidates: string[];
194
+ test: (signals: LayerSignal[], summary: LayerSummary) => boolean;
195
+ confidence: (signals: LayerSignal[], summary: LayerSummary) => number;
196
+ rationale: (signals: LayerSignal[], summary: LayerSummary) => string;
197
+ }
198
+
199
+ const PATTERN_RULES: PatternRule[] = [
200
+ {
201
+ pattern: "Icon + Text (horizontal)",
202
+ candidates: ["Button", "MenuItem", "Breadcrumb", "Tab"],
203
+ test: (s, summary) =>
204
+ s.includes("icon") &&
205
+ s.includes("text") &&
206
+ summary.layoutMode === "HORIZONTAL" &&
207
+ !s.includes("chevron"),
208
+ confidence: (s) => (s.includes("cta") ? 0.92 : 0.78),
209
+ rationale: (s) =>
210
+ `Horizontal auto-layout with icon + text signal. ${s.includes("cta") ? "CTA text found — likely Button." : "No CTA signal — could be MenuItem or Tab."}`,
211
+ },
212
+ {
213
+ pattern: "Image + Title + Body + CTA",
214
+ candidates: ["Card", "FeatureTile"],
215
+ test: (s) =>
216
+ s.includes("image") &&
217
+ s.includes("title") &&
218
+ s.includes("body") &&
219
+ s.includes("cta"),
220
+ confidence: () => 0.89,
221
+ rationale: () =>
222
+ "Classic card anatomy: image hero, title heading, body copy, and a call-to-action.",
223
+ },
224
+ {
225
+ pattern: "Label above + Input below",
226
+ candidates: ["FormField", "TextInput"],
227
+ test: (s) => s.includes("label") && s.includes("input"),
228
+ confidence: () => 0.91,
229
+ rationale: () =>
230
+ "Label node above an input container — canonical form field pattern.",
231
+ },
232
+ {
233
+ pattern: "Avatar + Name + Subtitle",
234
+ candidates: ["UserProfile", "CommentHeader"],
235
+ test: (s) => s.includes("avatar") && s.includes("text") && s.includes("subtitle"),
236
+ confidence: (s) => (s.includes("subtitle") ? 0.88 : 0.72),
237
+ rationale: (s) =>
238
+ `Avatar image with ${s.includes("subtitle") ? "name and subtitle text layers" : "name text layer"} — user identity pattern.`,
239
+ },
240
+ {
241
+ pattern: "Icon + Title + Chevron",
242
+ candidates: ["ListItem", "NavigationRow"],
243
+ test: (s) => s.includes("icon") && s.includes("title") && s.includes("chevron"),
244
+ confidence: () => 0.9,
245
+ rationale: () =>
246
+ "Leading icon, title text, and trailing chevron — list item or navigation row.",
247
+ },
248
+ {
249
+ pattern: "N equal-width columns",
250
+ candidates: ["DataTable", "ComparisonCard"],
251
+ test: (_, summary) =>
252
+ summary.layoutMode === "HORIZONTAL" &&
253
+ summary.childCount >= 3 &&
254
+ summary.textCount >= 3,
255
+ confidence: (_, summary) => (summary.childCount >= 4 ? 0.82 : 0.68),
256
+ rationale: (_, summary) =>
257
+ `${summary.childCount} equal-width children in horizontal layout — data table or comparison grid.`,
258
+ },
259
+ {
260
+ pattern: "Image + Title",
261
+ candidates: ["Card", "MediaCard", "ThumbnailItem"],
262
+ test: (s) => s.includes("image") && s.includes("title") && !s.includes("body"),
263
+ confidence: () => 0.74,
264
+ rationale: () =>
265
+ "Image with title but no body copy — compact media card or thumbnail.",
266
+ },
267
+ {
268
+ pattern: "Text only",
269
+ candidates: ["Heading", "Paragraph", "Badge", "Label"],
270
+ test: (s, summary) =>
271
+ s.includes("text") &&
272
+ !s.includes("icon") &&
273
+ !s.includes("image") &&
274
+ summary.textCount <= 2,
275
+ confidence: () => 0.6,
276
+ rationale: () =>
277
+ "Text-only node — standalone heading, label, badge, or paragraph.",
278
+ },
279
+ ];
280
+
281
+ function fingerprintPatterns(
282
+ signals: LayerSignal[],
283
+ summary: LayerSummary
284
+ ): PatternMatch[] {
285
+ const matches: PatternMatch[] = [];
286
+
287
+ for (const rule of PATTERN_RULES) {
288
+ if (rule.test(signals, summary)) {
289
+ matches.push({
290
+ pattern: rule.pattern,
291
+ candidates: rule.candidates,
292
+ confidence: rule.confidence(signals, summary),
293
+ rationale: rule.rationale(signals, summary),
294
+ });
295
+ }
296
+ }
297
+
298
+ // Sort descending by confidence
299
+ matches.sort((a, b) => b.confidence - a.confidence);
300
+ return matches;
301
+ }
302
+
303
+ // ─── Token mapping ────────────────────────────────────────────────────────────
304
+
305
+ function extractTokenMappings(node: FigmaNode, tokens: Token[]): TokenMapping[] {
306
+ const mappings: TokenMapping[] = [];
307
+
308
+ function walkFills(n: FigmaNode, propertyPath: string) {
309
+ if (n.fills) {
310
+ for (let i = 0; i < n.fills.length; i++) {
311
+ const fill = n.fills[i];
312
+ if (fill.type === "SOLID" && fill.color && !fill.variableId) {
313
+ const hex = figmaRgbaToHex(fill.color.r, fill.color.g, fill.color.b);
314
+ const ref: TokenRef = snapToColorToken(hex, tokens);
315
+ mappings.push({
316
+ property: `${propertyPath}.fills[${i}]`,
317
+ hardcodedValue: hex,
318
+ suggestedToken: ref.tokenName,
319
+ tokenValue: ref.tokenValue,
320
+ delta: typeof ref.delta === "number" ? ref.delta : undefined,
321
+ });
322
+ }
323
+ }
324
+ }
325
+
326
+ if (n.strokes) {
327
+ for (let i = 0; i < n.strokes.length; i++) {
328
+ const stroke = n.strokes[i];
329
+ if (stroke.type === "SOLID" && stroke.color && !stroke.variableId) {
330
+ const hex = figmaRgbaToHex(stroke.color.r, stroke.color.g, stroke.color.b);
331
+ const ref: TokenRef = snapToColorToken(hex, tokens);
332
+ mappings.push({
333
+ property: `${propertyPath}.strokes[${i}]`,
334
+ hardcodedValue: hex,
335
+ suggestedToken: ref.tokenName,
336
+ tokenValue: ref.tokenValue,
337
+ delta: typeof ref.delta === "number" ? ref.delta : undefined,
338
+ });
339
+ }
340
+ }
341
+ }
342
+
343
+ // Spacing
344
+ const spacingProps: Array<keyof FigmaNode> = [
345
+ "paddingLeft",
346
+ "paddingRight",
347
+ "paddingTop",
348
+ "paddingBottom",
349
+ "itemSpacing",
350
+ ];
351
+ for (const prop of spacingProps) {
352
+ const val = n[prop];
353
+ if (typeof val === "number" && val > 0) {
354
+ const ref = snapToSpacingToken(val);
355
+ if (ref.delta !== 0) {
356
+ mappings.push({
357
+ property: `${propertyPath}.${prop}`,
358
+ hardcodedValue: `${val}px`,
359
+ suggestedToken: ref.tokenName,
360
+ tokenValue: ref.tokenValue,
361
+ delta: ref.delta,
362
+ });
363
+ }
364
+ }
365
+ }
366
+
367
+ if (n.children) {
368
+ for (const child of n.children) {
369
+ walkFills(child, `${propertyPath}/${child.name}`);
370
+ }
371
+ }
372
+ }
373
+
374
+ walkFills(node, node.name);
375
+ return mappings;
376
+ }
377
+
378
+ // ─── Figma script: promote to component + bind variables ─────────────────────
379
+
380
+ function buildPromoteScript(
381
+ nodeId: string,
382
+ componentName: string,
383
+ mappings: TokenMapping[],
384
+ tokens: Token[]
385
+ ): string {
386
+ // Resolve actual variable IDs for fill/stroke bindings
387
+ const resolvedBindings = mappings
388
+ .filter((m) => m.property.includes("fills") || m.property.includes("strokes"))
389
+ .slice(0, 20)
390
+ .map((m) => {
391
+ const variableId = resolveTokenId(m.suggestedToken, tokens);
392
+ return { ...m, variableId };
393
+ })
394
+ .filter((m) => m.variableId !== null);
395
+
396
+ // Generate actual setBoundVariable calls for resolved tokens
397
+ const bindingLines = resolvedBindings.length > 0
398
+ ? `
399
+ // Bind resolved design-system variables
400
+ const bindNode = async (n) => {
401
+ if (n.fills) {
402
+ for (let i = 0; i < n.fills.length; i++) {
403
+ if (n.fills[i].type === 'SOLID' && !n.fills[i].boundVariables?.color) {
404
+ const hex = (() => {
405
+ const c = n.fills[i].color;
406
+ const toHex = (v) => Math.round(v * 255).toString(16).padStart(2, '0');
407
+ return '#' + toHex(c.r) + toHex(c.g) + toHex(c.b);
408
+ })();
409
+ const mapping = ${JSON.stringify(resolvedBindings.map((m) => ({
410
+ hex: m.hardcodedValue.toLowerCase(),
411
+ variableId: m.variableId,
412
+ })))};
413
+ const match = mapping.find(m => m.hex === hex.toLowerCase());
414
+ if (match) {
415
+ const v = await figma.variables.getVariableByIdAsync(match.variableId);
416
+ if (v) {
417
+ const paints = [...n.fills];
418
+ paints[i] = figma.variables.setBoundVariableForPaint(paints[i], 'color', v);
419
+ n.fills = paints;
420
+ }
421
+ }
422
+ }
423
+ }
424
+ }
425
+ if (n.children) {
426
+ for (const child of n.children) await bindNode(child);
427
+ }
428
+ };
429
+ await bindNode(component);`
430
+ : mappings
431
+ .filter((m) => m.property.includes("fills"))
432
+ .slice(0, 20)
433
+ .map((m) => ` /* bind ${m.property} → ${m.suggestedToken} (${m.hardcodedValue}) — no matching variable found */`)
434
+ .join("\n");
435
+
436
+ return `
437
+ (async () => {
438
+ const node = await figma.getNodeByIdAsync(${JSON.stringify(nodeId)});
439
+ if (!node) throw new Error('Node not found: ${nodeId}');
440
+
441
+ // Clone to preserve original, then promote clone
442
+ const clone = node.clone();
443
+ clone.name = ${JSON.stringify(componentName)};
444
+ node.parent.appendChild(clone);
445
+
446
+ // Promote to main component if not already
447
+ let component;
448
+ if (clone.type === 'COMPONENT') {
449
+ component = clone;
450
+ } else if (typeof clone.createComponent === 'function') {
451
+ component = clone.createComponent();
452
+ } else {
453
+ // Wrap in a frame-component approach
454
+ component = figma.createComponent();
455
+ component.name = ${JSON.stringify(componentName)};
456
+ component.resize(clone.width || 100, clone.height || 40);
457
+ node.parent.appendChild(component);
458
+ const inst = clone;
459
+ inst.x = 0;
460
+ inst.y = 0;
461
+ component.appendChild(inst);
462
+ }
463
+
464
+ // Rename layers to semantic names based on type
465
+ const renameByType = (n) => {
466
+ if (n.type === 'TEXT') {
467
+ const lc = n.name.toLowerCase();
468
+ if (!lc.includes('title') && !lc.includes('label') && !lc.includes('body')) {
469
+ if (n.fontSize >= 20) n.name = 'title';
470
+ else if (n.fontSize >= 14) n.name = 'body';
471
+ else n.name = 'label';
472
+ }
473
+ }
474
+ if (n.type === 'VECTOR' && !n.name.toLowerCase().includes('icon')) {
475
+ n.name = 'icon';
476
+ }
477
+ if (n.children) n.children.forEach(renameByType);
478
+ };
479
+ renameByType(component);
480
+
481
+ ${bindingLines}
482
+
483
+ figma.viewport.scrollAndZoomIntoView([component]);
484
+ return { componentId: component.id, name: component.name };
485
+ })();
486
+ `.trim();
487
+ }
488
+
489
+ // ─── Doc stub generator ───────────────────────────────────────────────────────
490
+
491
+ function buildDocStub(
492
+ nodeName: string,
493
+ bestMatch: string,
494
+ candidates: string[],
495
+ mappings: TokenMapping[]
496
+ ): string {
497
+ const tokenLines = mappings
498
+ .slice(0, 10)
499
+ .map((m) => `| \`${m.suggestedToken}\` | \`${m.hardcodedValue}\` | ${m.property} |`)
500
+ .join("\n");
501
+
502
+ return `# ${nodeName}
503
+
504
+ **Detected pattern:** ${bestMatch}
505
+ **Probable component types:** ${candidates.join(", ")}
506
+
507
+ ## Overview
508
+ Auto-generated documentation stub from Component Archaeologist analysis.
509
+ Review and update the description below to accurately reflect this component's purpose.
510
+
511
+ > [TODO: Describe what this component does, when to use it, and any important usage notes.]
512
+
513
+ ## Token Bindings
514
+
515
+ | Token | Hardcoded Value | Property |
516
+ |-------|----------------|----------|
517
+ ${tokenLines || "| — | — | No hardcoded values found |"}
518
+
519
+ ## Props
520
+
521
+ | Prop | Type | Default | Description |
522
+ |------|------|---------|-------------|
523
+ | — | — | — | [TODO: Document props] |
524
+
525
+ ## Usage
526
+
527
+ \`\`\`tsx
528
+ // [TODO: Add usage example]
529
+ import { ${bestMatch.replace(/\s+/g, "")} } from "@ds/components";
530
+ \`\`\`
531
+
532
+ ## Variants
533
+
534
+ [TODO: Document available variants]
535
+
536
+ ## Accessibility
537
+
538
+ [TODO: Document keyboard navigation, ARIA roles, and screen reader behaviour]
539
+
540
+ ---
541
+ *Generated by Component Archaeologist on ${new Date().toISOString().split("T")[0]}*
542
+ `;
543
+ }
544
+
545
+ // ─── Main handler ─────────────────────────────────────────────────────────────
546
+
547
+ export async function componentArchaeologistHandler(
548
+ args: ComponentArchaeologistArgs
549
+ ): Promise<ComponentArchaeologistResult> {
550
+ const {
551
+ nodeId,
552
+ outputAs,
553
+ createLibraryComponent = false,
554
+ generateDocStub = false,
555
+ } = args;
556
+
557
+ if (!nodeId) throw new Error("componentArchaeologist: `nodeId` is required.");
558
+
559
+ const bridge = await getBridge();
560
+
561
+ // 1. Fetch node tree from Figma
562
+ const node = await bridge.getNode(nodeId);
563
+ if (!node) throw new Error(`componentArchaeologist: Node "${nodeId}" not found.`);
564
+
565
+ // 2. Fetch tokens for snapping — DS tokens are authoritative when selected
566
+ const dsId = bridge.getActiveDesignSystemId();
567
+ let tokens: Token[];
568
+ if (dsId) {
569
+ const { getDesignSystemTokens } = await import("../../../shared/design-system-tokens.js");
570
+ tokens = getDesignSystemTokens(dsId);
571
+ } else {
572
+ tokens = await bridge.getTokens();
573
+ }
574
+
575
+ // 3. Summarize layers
576
+ const layerSummary = countLayerTypes(node);
577
+
578
+ // 4. Collect signals and fingerprint
579
+ const signals = collectSignals(node);
580
+ const patternMatches = fingerprintPatterns(signals, layerSummary);
581
+
582
+ const topMatch = patternMatches[0] ?? {
583
+ pattern: "Unknown",
584
+ candidates: ["Component"],
585
+ confidence: 0,
586
+ rationale: "No pattern matched. Layer structure does not fit known templates.",
587
+ };
588
+
589
+ const bestMatch = topMatch.candidates[0] ?? "Component";
590
+
591
+ // 5. Map hardcoded values to tokens
592
+ const tokenMappings = extractTokenMappings(node, tokens);
593
+
594
+ // 6. Optionally promote to component
595
+ let promotedComponentId: string | null = null;
596
+ if (
597
+ (outputAs === "component" || outputAs === "both") &&
598
+ createLibraryComponent
599
+ ) {
600
+ const componentName = `[DS] ${bestMatch} / ${node.name}`;
601
+ const script = buildPromoteScript(nodeId, componentName, tokenMappings, tokens);
602
+ const execResult = await bridge.execute(script);
603
+ if (execResult.success && execResult.result) {
604
+ const res = execResult.result as { componentId: string };
605
+ promotedComponentId = res.componentId;
606
+ } else {
607
+ console.error(
608
+ "componentArchaeologist: Promotion failed —",
609
+ execResult.error
610
+ );
611
+ }
612
+ }
613
+
614
+ // 7. Generate doc stub
615
+ const docStub = generateDocStub
616
+ ? buildDocStub(
617
+ node.name,
618
+ topMatch.pattern,
619
+ topMatch.candidates,
620
+ tokenMappings
621
+ )
622
+ : null;
623
+
624
+ // 8. Log the decision
625
+ const logEntry = await decisionLog.log({
626
+ tool: "component-archaeologist",
627
+ nodeIds: [nodeId, ...(promotedComponentId ? [promotedComponentId] : [])],
628
+ rationale: `Analysed "${node.name}" (${layerSummary.totalLayers} layers, depth ${layerSummary.depth}). Top pattern: "${topMatch.pattern}" → ${topMatch.candidates.join(", ")} (confidence ${(topMatch.confidence * 100).toFixed(0)}%). Mapped ${tokenMappings.length} hardcoded values to tokens. Promoted: ${!!promotedComponentId}.`,
629
+ tokens: tokenMappings.map((m) => m.suggestedToken),
630
+ reversible: true,
631
+ metadata: {
632
+ outputAs,
633
+ createLibraryComponent,
634
+ generateDocStub,
635
+ patternCount: patternMatches.length,
636
+ bestMatch,
637
+ tokenMappingCount: tokenMappings.length,
638
+ promotedComponentId,
639
+ },
640
+ });
641
+
642
+ // Enrich with concept taxonomy metadata
643
+ const conceptDef = getConceptForComponent(bestMatch);
644
+ const concept = conceptDef?.id ?? null;
645
+ const expectedTokens = concept ? getAllTokenPaths(concept) : [];
646
+
647
+ return {
648
+ nodeId,
649
+ nodeName: node.name,
650
+ patternMatches,
651
+ bestMatch,
652
+ concept,
653
+ expectedTokens,
654
+ tokenMappings,
655
+ promotedComponentId,
656
+ docStub,
657
+ layerSummary,
658
+ logEntryId: logEntry.id,
659
+ };
660
+ }