codymaster 4.1.3 → 4.3.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 (658) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/README.md +54 -84
  3. package/dist/index.js +589 -510
  4. package/dist/ui/box.js +49 -0
  5. package/install.sh +2 -2
  6. package/package.json +3 -9
  7. package/skills/AGENTS.md +61 -0
  8. package/skills/CLAUDE.md +158 -0
  9. package/skills/boxme-git-config/SKILL.md +56 -0
  10. package/skills/boxme-local-dev/SKILL.md +66 -0
  11. package/skills/build.sh +30 -0
  12. package/skills/cf +314 -0
  13. package/skills/cf 2 +313 -0
  14. package/skills/cm-ads-tracker/SKILL.md +364 -69
  15. package/skills/cm-auto-publisher/SKILL.md +81 -0
  16. package/skills/cm-booking-calendar/SKILL.md +521 -0
  17. package/skills/cm-booking-calendar/references/industry-patterns.md +527 -0
  18. package/skills/cm-booking-calendar/templates/booking-form.css +626 -0
  19. package/skills/cm-booking-calendar/templates/booking-form.html +477 -0
  20. package/skills/cm-booking-calendar/templates/calendar-engine.js +419 -0
  21. package/skills/cm-booking-calendar/templates/calendar-export.js +395 -0
  22. package/skills/cm-booking-calendar/templates/reminder-config.js +629 -0
  23. package/skills/cm-brainstorm-idea/SKILL.md +15 -24
  24. package/skills/cm-clean-code/SKILL.md +300 -0
  25. package/skills/cm-code-review/SKILL.md +0 -27
  26. package/skills/cm-codeintell/SKILL.md +598 -0
  27. package/skills/cm-content-factory/.content-factory-state.json +132 -0
  28. package/skills/cm-content-factory/.git 2/logs/refs/heads/main +1 -0
  29. package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +1 -0
  30. package/skills/cm-content-factory/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
  31. package/skills/cm-content-factory/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
  32. package/skills/cm-content-factory/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
  33. package/skills/cm-content-factory/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
  34. package/skills/cm-content-factory/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
  35. package/skills/cm-content-factory/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
  36. package/skills/cm-content-factory/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
  37. package/skills/cm-content-factory/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
  38. package/skills/cm-content-factory/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
  39. package/skills/cm-content-factory/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
  40. package/skills/cm-content-factory/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
  41. package/skills/cm-content-factory/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
  42. package/skills/cm-content-factory/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
  43. package/skills/cm-content-factory/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
  44. package/skills/cm-content-factory/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
  45. package/skills/cm-content-factory/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
  46. package/skills/cm-content-factory/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
  47. package/skills/cm-content-factory/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
  48. package/skills/cm-content-factory/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
  49. package/skills/cm-content-factory/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
  50. package/skills/cm-content-factory/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
  51. package/skills/cm-content-factory/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
  52. package/skills/cm-content-factory/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
  53. package/skills/cm-content-factory/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
  54. package/skills/cm-content-factory/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
  55. package/skills/cm-content-factory/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
  56. package/skills/cm-content-factory/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
  57. package/skills/cm-content-factory/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
  58. package/skills/cm-content-factory/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
  59. package/skills/cm-content-factory/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
  60. package/skills/cm-content-factory/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
  61. package/skills/cm-content-factory/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
  62. package/skills/cm-content-factory/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
  63. package/skills/cm-content-factory/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
  64. package/skills/cm-content-factory/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
  65. package/skills/cm-content-factory/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
  66. package/skills/cm-content-factory/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
  67. package/skills/cm-content-factory/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
  68. package/skills/cm-content-factory/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
  69. package/skills/cm-content-factory/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
  70. package/skills/cm-content-factory/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
  71. package/skills/cm-content-factory/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
  72. package/skills/cm-content-factory/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
  73. package/skills/cm-content-factory/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +5 -0
  74. package/skills/cm-content-factory/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
  75. package/skills/cm-content-factory/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
  76. package/skills/cm-content-factory/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
  77. package/skills/cm-content-factory/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
  78. package/skills/cm-content-factory/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
  79. package/skills/cm-content-factory/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
  80. package/skills/cm-content-factory/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
  81. package/skills/cm-content-factory/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
  82. package/skills/cm-content-factory/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
  83. package/skills/cm-content-factory/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
  84. package/skills/cm-content-factory/.git 2/refs/heads/main +1 -0
  85. package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +1 -0
  86. package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +76 -0
  87. package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +1 -0
  88. package/skills/cm-content-factory/AGENTS.md +61 -0
  89. package/skills/cm-content-factory/CLAUDE.md +63 -0
  90. package/skills/cm-content-factory/CURSOR.md +43 -0
  91. package/skills/cm-content-factory/Content Factory.zip +0 -0
  92. package/skills/cm-content-factory/cf +313 -0
  93. package/skills/cm-content-factory/config.schema.json +397 -0
  94. package/skills/cm-content-factory/dashboard/app.js +556 -0
  95. package/skills/cm-content-factory/dashboard/index.html +397 -0
  96. package/skills/cm-content-factory/dashboard/style.css +1211 -0
  97. package/skills/cm-content-factory/examples/01-real-estate.config.json +146 -0
  98. package/skills/cm-content-factory/examples/02-personal-finance.config.json +146 -0
  99. package/skills/cm-content-factory/examples/03-health-wellness.config.json +147 -0
  100. package/skills/cm-content-factory/examples/04-saas-software.config.json +147 -0
  101. package/skills/cm-content-factory/examples/05-legal-services.config.json +147 -0
  102. package/skills/cm-content-factory/examples/06-insurance.config.json +146 -0
  103. package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +146 -0
  104. package/skills/cm-content-factory/examples/08-online-education.config.json +147 -0
  105. package/skills/cm-content-factory/examples/09-crypto-defi.config.json +147 -0
  106. package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +147 -0
  107. package/skills/cm-content-factory/examples/11-home-services.config.json +146 -0
  108. package/skills/cm-content-factory/examples/12-dental-clinic.config.json +147 -0
  109. package/skills/cm-content-factory/examples/13-pet-care.config.json +147 -0
  110. package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +147 -0
  111. package/skills/cm-content-factory/examples/15-ai-automation.config.json +147 -0
  112. package/skills/cm-content-factory/examples/16-wedding-events.config.json +147 -0
  113. package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +148 -0
  114. package/skills/cm-content-factory/examples/18-cybersecurity.config.json +147 -0
  115. package/skills/cm-content-factory/examples/19-food-restaurant.config.json +148 -0
  116. package/skills/cm-content-factory/examples/20-solar-energy.config.json +147 -0
  117. package/skills/cm-content-factory/examples/fitness-blog.config.json +116 -0
  118. package/skills/cm-content-factory/examples/tech-blog.config.json +107 -0
  119. package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +72 -0
  120. package/skills/cm-content-factory/extensions/hooks.py +126 -0
  121. package/skills/cm-content-factory/extensions/openclaw_adapter.py +132 -0
  122. package/skills/cm-content-factory/landing/index.html +680 -0
  123. package/skills/cm-content-factory/landing/script.js +101 -0
  124. package/skills/cm-content-factory/landing/style.css +1216 -0
  125. package/skills/cm-content-factory/landing/translations.js +508 -0
  126. package/skills/cm-content-factory/logs/events.jsonl +11 -0
  127. package/skills/cm-content-factory/profiles/_template.profile.json +231 -0
  128. package/skills/cm-content-factory/profiles/finance.profile.json +278 -0
  129. package/skills/cm-content-factory/profiles/legal.profile.json +263 -0
  130. package/skills/cm-content-factory/profiles/medical-research.profile.json +321 -0
  131. package/skills/cm-content-factory/profiles/technology.profile.json +275 -0
  132. package/skills/cm-content-factory/scripts/agent_dispatcher.py +266 -0
  133. package/skills/cm-content-factory/scripts/audit.py +106 -0
  134. package/skills/cm-content-factory/scripts/dashboard_server.py +225 -0
  135. package/skills/cm-content-factory/scripts/deploy.py +146 -0
  136. package/skills/cm-content-factory/scripts/extract.py +132 -0
  137. package/skills/cm-content-factory/scripts/landing_generator.py +459 -0
  138. package/skills/cm-content-factory/scripts/memory.py +521 -0
  139. package/skills/cm-content-factory/scripts/monetize.py +239 -0
  140. package/skills/cm-content-factory/scripts/pipeline.py +357 -0
  141. package/skills/cm-content-factory/scripts/plan.py +163 -0
  142. package/skills/cm-content-factory/scripts/publish.py +145 -0
  143. package/skills/cm-content-factory/scripts/research.py +337 -0
  144. package/skills/cm-content-factory/scripts/scaffold.py +464 -0
  145. package/skills/cm-content-factory/scripts/scoreboard.py +336 -0
  146. package/skills/cm-content-factory/scripts/seo.py +90 -0
  147. package/skills/cm-content-factory/scripts/state_manager.py +320 -0
  148. package/skills/cm-content-factory/scripts/token_manager.py +268 -0
  149. package/skills/cm-content-factory/scripts/validate.py +221 -0
  150. package/skills/cm-content-factory/scripts/wizard.py +329 -0
  151. package/skills/cm-content-factory/scripts/write.py +93 -0
  152. package/skills/cm-content-factory/sites/docs-site/src/assets/houston.webp +0 -0
  153. package/skills/cm-content-factory/sites/docs-site/src/content/docs/architecture.md +90 -0
  154. package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +54 -0
  155. package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +38 -0
  156. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +65 -0
  157. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +48 -0
  158. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +39 -0
  159. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +42 -0
  160. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +51 -0
  161. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +52 -0
  162. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +86 -0
  163. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +80 -0
  164. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +58 -0
  165. package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +102 -0
  166. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +45 -0
  167. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +29 -0
  168. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +55 -0
  169. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +29 -0
  170. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +41 -0
  171. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +40 -0
  172. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +56 -0
  173. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +46 -0
  174. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +45 -0
  175. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +45 -0
  176. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +108 -0
  177. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +22 -0
  178. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +52 -0
  179. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +58 -0
  180. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +92 -0
  181. package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +575 -0
  182. package/skills/cm-content-factory/tests/conftest.py +66 -0
  183. package/skills/cm-content-factory/tests/test_agent_dispatcher.py +125 -0
  184. package/skills/cm-content-factory/tests/test_memory.py +128 -0
  185. package/skills/cm-content-factory/tests/test_pipeline.py +107 -0
  186. package/skills/cm-content-factory/tests/test_research.py +56 -0
  187. package/skills/cm-content-factory/tests/test_state_manager.py +131 -0
  188. package/skills/cm-content-factory/tests/test_token_manager.py +110 -0
  189. package/skills/cm-content-factory/tests/test_wizard.py +121 -0
  190. package/skills/cm-continuity/SKILL.md +7 -0
  191. package/skills/cm-cro-methodology/SKILL.md +290 -0
  192. package/skills/cm-dashboard/SKILL.md +7 -525
  193. package/skills/cm-debugging/SKILL.md +7 -116
  194. package/skills/cm-deep-search/SKILL.md +5 -1
  195. package/skills/cm-dockit/README.md +6 -15
  196. package/skills/cm-dockit/SKILL.md +20 -37
  197. package/skills/cm-execution/SKILL.md +6 -1
  198. package/skills/cm-frappe-agent/SKILL.md +134 -0
  199. package/skills/cm-frappe-agent/agents/doctype-architect.md +596 -0
  200. package/skills/cm-frappe-agent/agents/erpnext-customizer.md +643 -0
  201. package/skills/cm-frappe-agent/agents/frappe-backend.md +814 -0
  202. package/skills/cm-frappe-agent/agents/frappe-custom-frontend.md +557 -0
  203. package/skills/cm-frappe-agent/agents/frappe-debugger.md +625 -0
  204. package/skills/cm-frappe-agent/agents/frappe-fixer.md +275 -0
  205. package/skills/cm-frappe-agent/agents/frappe-frontend.md +660 -0
  206. package/skills/cm-frappe-agent/agents/frappe-installer.md +158 -0
  207. package/skills/cm-frappe-agent/agents/frappe-performance.md +307 -0
  208. package/skills/cm-frappe-agent/agents/frappe-planner.md +419 -0
  209. package/skills/cm-frappe-agent/agents/frappe-remote-ops.md +153 -0
  210. package/skills/cm-frappe-agent/agents/github-workflow.md +286 -0
  211. package/skills/cm-frappe-agent/commands/frappe-app.md +351 -0
  212. package/skills/cm-frappe-agent/commands/frappe-backend.md +162 -0
  213. package/skills/cm-frappe-agent/commands/frappe-bench.md +254 -0
  214. package/skills/cm-frappe-agent/commands/frappe-debug.md +263 -0
  215. package/skills/cm-frappe-agent/commands/frappe-doctype-create.md +272 -0
  216. package/skills/cm-frappe-agent/commands/frappe-doctype-field.md +310 -0
  217. package/skills/cm-frappe-agent/commands/frappe-erpnext.md +210 -0
  218. package/skills/cm-frappe-agent/commands/frappe-fix.md +59 -0
  219. package/skills/cm-frappe-agent/commands/frappe-frontend.md +210 -0
  220. package/skills/cm-frappe-agent/commands/frappe-fullstack.md +243 -0
  221. package/skills/cm-frappe-agent/commands/frappe-github.md +57 -0
  222. package/skills/cm-frappe-agent/commands/frappe-install.md +52 -0
  223. package/skills/cm-frappe-agent/commands/frappe-plan.md +442 -0
  224. package/skills/cm-frappe-agent/commands/frappe-remote.md +58 -0
  225. package/skills/cm-frappe-agent/commands/frappe-test.md +356 -0
  226. package/skills/cm-frappe-agent/docs/README.md +51 -0
  227. package/skills/cm-frappe-agent/docs/agents-catalog.md +113 -0
  228. package/skills/cm-frappe-agent/docs/architecture.md +149 -0
  229. package/skills/cm-frappe-agent/docs/commands-catalog.md +82 -0
  230. package/skills/cm-frappe-agent/docs/resources-catalog.md +66 -0
  231. package/skills/cm-frappe-agent/docs/sitemap-urls.txt +52 -0
  232. package/skills/cm-frappe-agent/docs/sitemap.md +81 -0
  233. package/skills/cm-frappe-agent/docs/sop/user-guide.md +178 -0
  234. package/skills/cm-frappe-agent/docs/sop/vibe-coding-guide.md +122 -0
  235. package/skills/cm-frappe-agent/resources/7-layer-architecture.md +985 -0
  236. package/skills/cm-frappe-agent/resources/bench_commands.md +73 -0
  237. package/skills/cm-frappe-agent/resources/code-patterns-guide.md +948 -0
  238. package/skills/cm-frappe-agent/resources/common_pitfalls.md +266 -0
  239. package/skills/cm-frappe-agent/resources/doctype-registry.md +158 -0
  240. package/skills/cm-frappe-agent/resources/installation-guide.md +289 -0
  241. package/skills/cm-frappe-agent/resources/rest-api-patterns.md +182 -0
  242. package/skills/cm-frappe-agent/resources/scaffold_checklist.md +82 -0
  243. package/skills/cm-frappe-agent/resources/upgrade_patterns.md +113 -0
  244. package/skills/cm-frappe-agent/resources/web-form-patterns.md +252 -0
  245. package/skills/cm-frappe-agent/skills/bench-commands/SKILL.md +621 -0
  246. package/skills/cm-frappe-agent/skills/client-scripts/SKILL.md +642 -0
  247. package/skills/cm-frappe-agent/skills/doctype-patterns/SKILL.md +576 -0
  248. package/skills/cm-frappe-agent/skills/frappe-api/SKILL.md +740 -0
  249. package/skills/cm-frappe-agent/skills/remote-operations/SKILL.md +47 -0
  250. package/skills/cm-frappe-agent/skills/server-scripts/SKILL.md +608 -0
  251. package/skills/cm-frappe-agent/skills/web-forms/SKILL.md +46 -0
  252. package/skills/cm-git-worktrees/SKILL.md +0 -7
  253. package/skills/cm-google-form/SKILL.md +266 -0
  254. package/skills/cm-google-form/templates/apps-script.js +55 -0
  255. package/skills/cm-google-form/templates/form-markup.html +110 -0
  256. package/skills/cm-google-form/templates/form-submit.js +201 -0
  257. package/skills/cm-google-form/templates/toast.css +152 -0
  258. package/skills/cm-growth-hacking/SKILL.md +293 -0
  259. package/skills/cm-growth-hacking/bottom-sheet-engine.md +261 -0
  260. package/skills/cm-growth-hacking/calendar-integration.md +264 -0
  261. package/skills/cm-growth-hacking/references/engagement-patterns.md +346 -0
  262. package/skills/cm-growth-hacking/templates/bottom-sheet.css +528 -0
  263. package/skills/cm-growth-hacking/templates/bottom-sheet.js +269 -0
  264. package/skills/cm-growth-hacking/templates/calendar-cta.js +213 -0
  265. package/skills/cm-growth-hacking/templates/tracking-events.js +211 -0
  266. package/skills/cm-growth-hacking/templates/trigger-manager.js +254 -0
  267. package/skills/cm-growth-hacking/tracking-events.md +246 -0
  268. package/skills/cm-growth-hacking/trigger-system.md +342 -0
  269. package/skills/cm-how-it-work/SKILL.md +20 -4
  270. package/skills/cm-identity-guard/SKILL.md +0 -11
  271. package/skills/cm-jtbd/SKILL.md +1 -1
  272. package/skills/cm-notebooklm/SKILL.md +172 -0
  273. package/skills/cm-notebooklm/references/command_reference.md +94 -0
  274. package/skills/cm-notebooklm/references/workflows.md +60 -0
  275. package/skills/cm-notebooklm/resources/knowledge_sources.md +106 -0
  276. package/skills/cm-notebooklm/scripts/brain-sync.sh +453 -0
  277. package/skills/cm-notebooklm/scripts/graduate_wisdom.py +101 -0
  278. package/skills/cm-planning/SKILL.md +39 -52
  279. package/skills/cm-project-bootstrap/SKILL.md +1307 -99
  280. package/skills/cm-quality-gate/SKILL.md +13 -106
  281. package/skills/cm-reactor/SKILL.md +274 -0
  282. package/skills/cm-safe-deploy/SKILL.md +415 -52
  283. package/skills/cm-safe-i18n/SKILL.md +1 -22
  284. package/skills/cm-secret-shield/SKILL.md +2 -2
  285. package/skills/cm-security-gate/SKILL.md +114 -0
  286. package/skills/cm-skill-chain/SKILL.md +2 -2
  287. package/skills/cm-skill-index/SKILL.md +9 -6
  288. package/skills/cm-skill-mastery/SKILL.md +2 -15
  289. package/skills/cm-start/SKILL.md +9 -0
  290. package/skills/cm-tdd/SKILL.md +8 -41
  291. package/skills/cm-ui-preview/SKILL.md +35 -173
  292. package/skills/cm-ux-master/FEATURES-v4.md +305 -0
  293. package/skills/cm-ux-master/README-ru.md +135 -0
  294. package/skills/cm-ux-master/README-vi.md +135 -0
  295. package/skills/cm-ux-master/README-zh.md +135 -0
  296. package/skills/cm-ux-master/README.md +489 -0
  297. package/skills/cm-ux-master/SKILL.md +773 -62
  298. package/skills/cm-ux-master/cli/README.md +180 -0
  299. package/skills/cm-ux-master/cli/pyproject.toml +106 -0
  300. package/skills/cm-ux-master/cli/requirements.txt +21 -0
  301. package/skills/cm-ux-master/cli/templates/base/skill-core.md +262 -0
  302. package/skills/cm-ux-master/cli/templates/platforms/claude.yaml +21 -0
  303. package/skills/cm-ux-master/cli/templates/platforms/cursor.yaml +21 -0
  304. package/skills/cm-ux-master/cli/templates/platforms/figma.yaml +24 -0
  305. package/skills/cm-ux-master/cli/templates/platforms/vscode-mcp.yaml +28 -0
  306. package/skills/cm-ux-master/cli/templates/platforms/windsurf.yaml +21 -0
  307. package/skills/cm-ux-master/cli/uxmaster/__init__.py +10 -0
  308. package/skills/cm-ux-master/cli/uxmaster/__main__.py +19 -0
  309. package/skills/cm-ux-master/cli/uxmaster/cli.py +349 -0
  310. package/skills/cm-ux-master/cli/uxmaster/commands/__init__.py +8 -0
  311. package/skills/cm-ux-master/cli/uxmaster/commands/extract.py +18 -0
  312. package/skills/cm-ux-master/cli/uxmaster/commands/init.py +58 -0
  313. package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +194 -0
  314. package/skills/cm-ux-master/cli/uxmaster/commands/search.py +23 -0
  315. package/skills/cm-ux-master/cli/uxmaster/commands/validate.py +270 -0
  316. package/skills/cm-ux-master/cli/uxmaster/search_engine.py +532 -0
  317. package/skills/cm-ux-master/cli/uxmaster/template_engine.py +458 -0
  318. package/skills/cm-ux-master/cli/uxmaster/utils/__init__.py +9 -0
  319. package/skills/cm-ux-master/cli/uxmaster/utils/console.py +42 -0
  320. package/skills/cm-ux-master/cli/uxmaster/utils/detect.py +83 -0
  321. package/skills/cm-ux-master/data/accessibility-advanced.csv +26 -0
  322. package/skills/cm-ux-master/data/animation.csv +31 -0
  323. package/skills/cm-ux-master/data/charts.csv +26 -0
  324. package/skills/cm-ux-master/data/colors.csv +97 -0
  325. package/skills/cm-ux-master/data/design-tests.csv +37 -0
  326. package/skills/cm-ux-master/data/devices.csv +21 -0
  327. package/skills/cm-ux-master/data/icons.csv +101 -0
  328. package/skills/cm-ux-master/data/landing.csv +31 -0
  329. package/skills/cm-ux-master/data/products.csv +97 -0
  330. package/skills/cm-ux-master/data/react-performance.csv +45 -0
  331. package/skills/cm-ux-master/data/responsive.csv +26 -0
  332. package/skills/cm-ux-master/data/semi-tokens.csv +52 -0
  333. package/skills/cm-ux-master/data/stacks/angular.csv +34 -0
  334. package/skills/cm-ux-master/data/stacks/astro.csv +54 -0
  335. package/skills/cm-ux-master/data/stacks/electron.csv +32 -0
  336. package/skills/cm-ux-master/data/stacks/flutter.csv +53 -0
  337. package/skills/cm-ux-master/data/stacks/html-tailwind.csv +56 -0
  338. package/skills/cm-ux-master/data/stacks/htmx.csv +28 -0
  339. package/skills/cm-ux-master/data/stacks/jetpack-compose.csv +53 -0
  340. package/skills/cm-ux-master/data/stacks/nextjs.csv +53 -0
  341. package/skills/cm-ux-master/data/stacks/nuxt-ui.csv +51 -0
  342. package/skills/cm-ux-master/data/stacks/nuxtjs.csv +59 -0
  343. package/skills/cm-ux-master/data/stacks/react-native.csv +52 -0
  344. package/skills/cm-ux-master/data/stacks/react.csv +54 -0
  345. package/skills/cm-ux-master/data/stacks/shadcn.csv +61 -0
  346. package/skills/cm-ux-master/data/stacks/svelte.csv +54 -0
  347. package/skills/cm-ux-master/data/stacks/swiftui.csv +51 -0
  348. package/skills/cm-ux-master/data/stacks/tauri.csv +29 -0
  349. package/skills/cm-ux-master/data/stacks/vue.csv +50 -0
  350. package/skills/cm-ux-master/data/styles.csv +68 -0
  351. package/skills/cm-ux-master/data/typography.csv +58 -0
  352. package/skills/cm-ux-master/data/ui-reasoning.csv +101 -0
  353. package/skills/cm-ux-master/data/ux-guidelines.csv +100 -0
  354. package/skills/cm-ux-master/data/ux-laws.csv +49 -0
  355. package/skills/cm-ux-master/data/web-interface.csv +31 -0
  356. package/skills/cm-ux-master/docs/LANDING-PAGE.html +377 -0
  357. package/skills/cm-ux-master/docs/README.md +108 -0
  358. package/skills/cm-ux-master/docs/css/styles.css +573 -0
  359. package/skills/cm-ux-master/docs/examples/demo-script.md +319 -0
  360. package/skills/cm-ux-master/docs/guides/for-designers.md +692 -0
  361. package/skills/cm-ux-master/docs/guides/for-developers.md +778 -0
  362. package/skills/cm-ux-master/docs/guides/for-product-managers.md +693 -0
  363. package/skills/cm-ux-master/docs/guides/react-guide-vi.md +50 -0
  364. package/skills/cm-ux-master/docs/index.html +1062 -0
  365. package/skills/cm-ux-master/docs/js/i18n.js +84 -0
  366. package/skills/cm-ux-master/docs/js/lang/de.js +145 -0
  367. package/skills/cm-ux-master/docs/js/lang/en.js +145 -0
  368. package/skills/cm-ux-master/docs/js/lang/fr.js +145 -0
  369. package/skills/cm-ux-master/docs/js/lang/hi.js +145 -0
  370. package/skills/cm-ux-master/docs/js/lang/id.js +145 -0
  371. package/skills/cm-ux-master/docs/js/lang/ja.js +145 -0
  372. package/skills/cm-ux-master/docs/js/lang/ko.js +145 -0
  373. package/skills/cm-ux-master/docs/js/lang/ru.js +145 -0
  374. package/skills/cm-ux-master/docs/js/lang/vi.js +145 -0
  375. package/skills/cm-ux-master/docs/js/lang/zh.js +145 -0
  376. package/skills/cm-ux-master/docs/js/main.js +117 -0
  377. package/skills/cm-ux-master/docs/plan/PHASE1-COMPLETION.md +217 -0
  378. package/skills/cm-ux-master/docs/plan/PHASE2-COMPLETION.md +199 -0
  379. package/skills/cm-ux-master/docs/plan/PHASE2-ENHANCED-COMPLETION.md +352 -0
  380. package/skills/cm-ux-master/docs/plan/PHASE3-VALIDATION-COMPLETION.md +499 -0
  381. package/skills/cm-ux-master/docs/plan/PHASE4-TESTING-POLISH-COMPLETION.md +483 -0
  382. package/skills/cm-ux-master/docs/plan/UXM-2.0-ROADMAP.md +681 -0
  383. package/skills/cm-ux-master/docs/plan/WOW-PITCH.md +410 -0
  384. package/skills/cm-ux-master/docs/technical/api-reference.md +824 -0
  385. package/skills/cm-ux-master/docs/technical/harvester-v4.md +328 -0
  386. package/skills/cm-ux-master/docs/technical/how-it-works.md +1128 -0
  387. package/skills/cm-ux-master/docs/tutorials/quickstart.md +339 -0
  388. package/skills/cm-ux-master/docs/tutorials/tutorials.md +939 -0
  389. package/skills/cm-ux-master/docs/tutorials/user-guide.md +716 -0
  390. package/skills/cm-ux-master/examples/README.md +63 -0
  391. package/skills/cm-ux-master/mcp/__init__.py +3 -0
  392. package/skills/cm-ux-master/mcp/integrations/__init__.py +11 -0
  393. package/skills/cm-ux-master/mcp/integrations/figma/__init__.py +6 -0
  394. package/skills/cm-ux-master/mcp/integrations/figma/client.py +293 -0
  395. package/skills/cm-ux-master/mcp/integrations/figma/plugin/code.js +561 -0
  396. package/skills/cm-ux-master/mcp/integrations/figma/plugin/ui.html +334 -0
  397. package/skills/cm-ux-master/mcp/integrations/stitch/__init__.py +5 -0
  398. package/skills/cm-ux-master/mcp/integrations/stitch/client.py +410 -0
  399. package/skills/cm-ux-master/mcp/integrations/vscode/package.json +167 -0
  400. package/skills/cm-ux-master/mcp/integrations/vscode/src/extension.ts +81 -0
  401. package/skills/cm-ux-master/mcp/mcp-config.json +274 -0
  402. package/skills/cm-ux-master/mcp/server.py +771 -0
  403. package/skills/cm-ux-master/mcp/tools/__init__.py +13 -0
  404. package/skills/cm-ux-master/mcp-server/server.py +595 -0
  405. package/skills/cm-ux-master/output/fila/FilaDashboard.tsx +47 -0
  406. package/skills/cm-ux-master/output/fila/components/badge/component.tsx +35 -0
  407. package/skills/cm-ux-master/output/fila/components/badge/index.ts +1 -0
  408. package/skills/cm-ux-master/output/fila/components/button/component.tsx +53 -0
  409. package/skills/cm-ux-master/output/fila/components/button/index.ts +1 -0
  410. package/skills/cm-ux-master/output/fila/components/card/component.tsx +35 -0
  411. package/skills/cm-ux-master/output/fila/components/card/index.ts +1 -0
  412. package/skills/cm-ux-master/output/fila/components/input/component.tsx +41 -0
  413. package/skills/cm-ux-master/output/fila/components/input/index.ts +1 -0
  414. package/skills/cm-ux-master/output/fila/design-system.css +151 -0
  415. package/skills/cm-ux-master/output/fila/design-system.html +1596 -0
  416. package/skills/cm-ux-master/output/fila/design-system.json +168 -0
  417. package/skills/cm-ux-master/output/fila/figma-tokens.json +523 -0
  418. package/skills/cm-ux-master/output/fila/harvest-v4-raw.json +406 -0
  419. package/skills/cm-ux-master/output/fila/semi-theme-override.css +95 -0
  420. package/skills/cm-ux-master/output/haravan/HaravanDashboard.tsx +103 -0
  421. package/skills/cm-ux-master/output/haravan/design-system-v3-live.html +2716 -0
  422. package/skills/cm-ux-master/output/haravan/design-system-v3.html +1770 -0
  423. package/skills/cm-ux-master/output/haravan/design-system.html +914 -0
  424. package/skills/cm-ux-master/output/haravan/figma-tokens.json +84 -0
  425. package/skills/cm-ux-master/output/haravan/haravan-harvest.json +33 -0
  426. package/skills/cm-ux-master/output/haravan/harvest-v3-raw.json +167 -0
  427. package/skills/cm-ux-master/output/haravan/semi-theme-override.css +39 -0
  428. package/skills/cm-ux-master/references/audit-template.md +257 -0
  429. package/skills/cm-ux-master/references/cultural-ux.md +346 -0
  430. package/skills/cm-ux-master/references/dark-patterns.md +362 -0
  431. package/skills/cm-ux-master/references/heuristic-conflicts.md +296 -0
  432. package/skills/cm-ux-master/references/krug-principles.md +289 -0
  433. package/skills/cm-ux-master/references/nielsen-heuristics.md +360 -0
  434. package/skills/cm-ux-master/references/wcag-checklist.md +306 -0
  435. package/skills/cm-ux-master/scripts/component_generator.py +631 -0
  436. package/skills/cm-ux-master/scripts/core.py +305 -0
  437. package/skills/cm-ux-master/scripts/demo_validation.py +452 -0
  438. package/skills/cm-ux-master/scripts/design_doc_generator.py +1325 -0
  439. package/skills/cm-ux-master/scripts/design_system.py +1141 -0
  440. package/skills/cm-ux-master/scripts/design_system_indexer.py +889 -0
  441. package/skills/cm-ux-master/scripts/extract_i18n.py +251 -0
  442. package/skills/cm-ux-master/scripts/extractor.py +1437 -0
  443. package/skills/cm-ux-master/scripts/figma_bridge.py +406 -0
  444. package/skills/cm-ux-master/scripts/generate.py +147 -0
  445. package/skills/cm-ux-master/scripts/harvest_session.py +207 -0
  446. package/skills/cm-ux-master/scripts/harvester.js +240 -0
  447. package/skills/cm-ux-master/scripts/harvester_browser.py +717 -0
  448. package/skills/cm-ux-master/scripts/harvester_cli.py +431 -0
  449. package/skills/cm-ux-master/scripts/harvester_v1.js +275 -0
  450. package/skills/cm-ux-master/scripts/harvester_v3.js +620 -0
  451. package/skills/cm-ux-master/scripts/harvester_v4.js +1003 -0
  452. package/skills/cm-ux-master/scripts/install.py +528 -0
  453. package/skills/cm-ux-master/scripts/license.py +81 -0
  454. package/skills/cm-ux-master/scripts/media/qrpayment.png +0 -0
  455. package/skills/cm-ux-master/scripts/pro_stubs.py +120 -0
  456. package/skills/cm-ux-master/scripts/project_registry.py +217 -0
  457. package/skills/cm-ux-master/scripts/search.py +114 -0
  458. package/skills/cm-ux-master/scripts/semi_mcp_bridge.py +425 -0
  459. package/skills/cm-ux-master/scripts/stitch_integration.py +583 -0
  460. package/skills/cm-ux-master/scripts/test_harvester_v4.py +335 -0
  461. package/skills/cm-ux-master/scripts/token_mapper.py +626 -0
  462. package/skills/cm-ux-master/scripts/validation_engine.py +1571 -0
  463. package/skills/cm-ux-master/scripts/wizard.py +653 -0
  464. package/skills/cm-ux-master/setup.py +93 -0
  465. package/skills/cm-ux-master/templates/base/flutter-widget.dart +69 -0
  466. package/skills/cm-ux-master/templates/base/html-page.html +152 -0
  467. package/skills/cm-ux-master/templates/base/react-component.tsx +47 -0
  468. package/skills/cm-ux-master/templates/base/swiftui-view.swift +62 -0
  469. package/skills/cm-ux-master/templates/quick-start.sh +176 -0
  470. package/skills/cm-ux-master/tests/automation/batch-validate.sh +250 -0
  471. package/skills/cm-ux-master/tests/automation/generate-test-projects.sh +561 -0
  472. package/skills/cm-ux-master/tests/automation/run-all-tests.sh +315 -0
  473. package/skills/cm-ux-master/tests/test_design_doc.py +145 -0
  474. package/skills/cm-ux-master/tests/test_devices.py +74 -0
  475. package/skills/cm-ux-master/tests/test_generator.py +116 -0
  476. package/skills/cm-ux-master/tests/test_harvest_session.py +131 -0
  477. package/skills/cm-ux-master/tests/test_harvester.py +127 -0
  478. package/skills/cm-ux-master/tests/test_harvester_v3.py +324 -0
  479. package/skills/cm-ux-master/tests/test_mcp_server.py +496 -0
  480. package/skills/cm-ux-master/tests/test_new_domains.py +108 -0
  481. package/skills/cm-ux-master/tests/test_new_stacks.py +103 -0
  482. package/skills/cm-ux-master/tests/test_project_registry.py +146 -0
  483. package/skills/cm-ux-master/tests/test_semi_mcp_bridge.py +207 -0
  484. package/skills/cm-ux-master/tests/test_token_mapper.py +247 -0
  485. package/skills/cm-ux-master/tests/test_validation_engine.py +617 -0
  486. package/skills/config.schema.json +397 -0
  487. package/skills/frappe-app-builder.zip +0 -0
  488. package/skills/jobs-to-be-done/SKILL.md +266 -0
  489. package/skills/jobs-to-be-done/references/case-studies.md +154 -0
  490. package/skills/jobs-to-be-done/references/competitive-strategy.md +280 -0
  491. package/skills/jobs-to-be-done/references/diagnostics.md +158 -0
  492. package/skills/jobs-to-be-done/references/innovation-process.md +392 -0
  493. package/skills/jobs-to-be-done/references/organizational-change.md +328 -0
  494. package/skills/marketplace-report-crawler/SKILL.md +176 -0
  495. package/skills/marketplace-report-crawler/config/accounts.json +41 -0
  496. package/skills/marketplace-report-crawler/config/report-types.json +422 -0
  497. package/skills/marketplace-report-crawler/config/sessions.json +3 -0
  498. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +102 -0
  499. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +114 -0
  500. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +94 -0
  501. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +272 -0
  502. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +281 -0
  503. package/skills/marketplace-report-crawler/scripts/session-check.sh +72 -0
  504. package/skills/marketplace-report-crawler/scripts/session-manager.sh +349 -0
  505. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +83 -0
  506. package/skills/medical-research/SKILL.md +194 -0
  507. package/skills/medical-research/scripts/evidence_checker.py +288 -0
  508. package/skills/mom-test/SKILL.md +267 -0
  509. package/skills/mom-test/references/avoiding-bad-data.md +221 -0
  510. package/skills/mom-test/references/case-studies.md +306 -0
  511. package/skills/mom-test/references/commitment-advancement.md +219 -0
  512. package/skills/mom-test/references/finding-conversations.md +251 -0
  513. package/skills/mom-test/references/processing-learning.md +256 -0
  514. package/skills/mom-test/references/question-patterns.md +198 -0
  515. package/skills/pandasai-analytics/SKILL.md +251 -0
  516. package/skills/release-it/SKILL.md +235 -0
  517. package/skills/release-it/references/anti-patterns.md +279 -0
  518. package/skills/release-it/references/capacity-planning.md +285 -0
  519. package/skills/release-it/references/chaos-engineering.md +325 -0
  520. package/skills/release-it/references/deployment-strategies.md +331 -0
  521. package/skills/release-it/references/observability.md +301 -0
  522. package/skills/release-it/references/stability-patterns.md +355 -0
  523. package/skills/scripts/sync-ide-skills.sh +61 -0
  524. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +37 -0
  525. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +34 -0
  526. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +51 -0
  527. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +39 -0
  528. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +52 -0
  529. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +25 -0
  530. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +31 -0
  531. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +25 -0
  532. package/skills/skill-creator-ultra/README.md +1242 -0
  533. package/skills/skill-creator-ultra/SKILL.md +388 -0
  534. package/skills/skill-creator-ultra/agents/analyzer.md +274 -0
  535. package/skills/skill-creator-ultra/agents/comparator.md +202 -0
  536. package/skills/skill-creator-ultra/agents/grader.md +223 -0
  537. package/skills/skill-creator-ultra/assets/eval_review.html +146 -0
  538. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +471 -0
  539. package/skills/skill-creator-ultra/eval-viewer/viewer.html +1325 -0
  540. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +109 -0
  541. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +116 -0
  542. package/skills/skill-creator-ultra/examples/example_api_docs.md +189 -0
  543. package/skills/skill-creator-ultra/examples/example_db_migration.md +253 -0
  544. package/skills/skill-creator-ultra/examples/example_git_commit.md +111 -0
  545. package/skills/skill-creator-ultra/install.ps1 +289 -0
  546. package/skills/skill-creator-ultra/install.sh +313 -0
  547. package/skills/skill-creator-ultra/phases/phase1_interview.md +202 -0
  548. package/skills/skill-creator-ultra/phases/phase2_extract.md +55 -0
  549. package/skills/skill-creator-ultra/phases/phase3_detect.md +57 -0
  550. package/skills/skill-creator-ultra/phases/phase4_generate.md +543 -0
  551. package/skills/skill-creator-ultra/phases/phase5_test.md +319 -0
  552. package/skills/skill-creator-ultra/phases/phase6_eval.md +301 -0
  553. package/skills/skill-creator-ultra/phases/phase7_iterate.md +103 -0
  554. package/skills/skill-creator-ultra/phases/phase8_optimize.md +113 -0
  555. package/skills/skill-creator-ultra/resources/advanced_patterns.md +499 -0
  556. package/skills/skill-creator-ultra/resources/anti_patterns.md +376 -0
  557. package/skills/skill-creator-ultra/resources/blueprints.md +498 -0
  558. package/skills/skill-creator-ultra/resources/checklist.md +243 -0
  559. package/skills/skill-creator-ultra/resources/composition_cookbook.md +291 -0
  560. package/skills/skill-creator-ultra/resources/description_optimization.md +90 -0
  561. package/skills/skill-creator-ultra/resources/eval_guide.md +133 -0
  562. package/skills/skill-creator-ultra/resources/industry_questions.md +189 -0
  563. package/skills/skill-creator-ultra/resources/interview_questions.md +200 -0
  564. package/skills/skill-creator-ultra/resources/pattern_detection.md +200 -0
  565. package/skills/skill-creator-ultra/resources/prompt_engineering.md +531 -0
  566. package/skills/skill-creator-ultra/resources/schemas.md +430 -0
  567. package/skills/skill-creator-ultra/resources/script_integration.md +593 -0
  568. package/skills/skill-creator-ultra/resources/scripts_guide.md +339 -0
  569. package/skills/skill-creator-ultra/resources/skill_template.md +124 -0
  570. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +634 -0
  571. package/skills/skill-creator-ultra/resources/versioning_guide.md +193 -0
  572. package/skills/skill-creator-ultra/scripts/ci_eval.py +200 -0
  573. package/skills/skill-creator-ultra/scripts/package_skill.py +165 -0
  574. package/skills/skill-creator-ultra/scripts/simulate_skill.py +398 -0
  575. package/skills/skill-creator-ultra/scripts/skill_audit.py +611 -0
  576. package/skills/skill-creator-ultra/scripts/skill_compare.py +265 -0
  577. package/skills/skill-creator-ultra/scripts/skill_export.py +334 -0
  578. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +403 -0
  579. package/skills/skill-creator-ultra/scripts/skill_stats.py +339 -0
  580. package/skills/skill-creator-ultra/scripts/validate_skill.py +411 -0
  581. package/skills/tailwind-mastery/SKILL.md +229 -0
  582. package/skills/vercel-react-best-practices/AGENTS.md +3373 -0
  583. package/skills/vercel-react-best-practices/README.md +123 -0
  584. package/skills/vercel-react-best-practices/SKILL.md +143 -0
  585. package/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  586. package/skills/vercel-react-best-practices/rules/_template.md +28 -0
  587. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  588. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  589. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  590. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  591. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  592. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  593. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  594. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  595. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  596. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  597. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  598. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  599. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  600. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  601. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  602. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  603. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  604. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  605. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  606. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  607. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  608. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  609. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  610. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  611. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  612. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  613. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  614. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  615. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  616. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  617. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  618. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  619. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  620. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  621. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  622. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  623. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  624. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  625. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  626. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  627. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  628. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  629. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  630. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  631. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  632. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  633. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  634. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  635. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  636. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  637. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  638. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  639. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  640. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  641. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  642. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  643. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  644. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  645. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  646. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  647. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  648. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +142 -0
  649. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  650. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  651. package/skills/web-design-guidelines/SKILL.md +39 -0
  652. package/skills/cro-methodology/SKILL.md +0 -98
  653. /package/skills/{cro-methodology → cm-cro-methodology}/references/COPYWRITING.md +0 -0
  654. /package/skills/{cro-methodology → cm-cro-methodology}/references/OBJECTIONS.md +0 -0
  655. /package/skills/{cro-methodology → cm-cro-methodology}/references/PERSUASION.md +0 -0
  656. /package/skills/{cro-methodology → cm-cro-methodology}/references/RESEARCH.md +0 -0
  657. /package/skills/{cro-methodology → cm-cro-methodology}/references/funnel-analysis.md +0 -0
  658. /package/skills/{cro-methodology → cm-cro-methodology}/references/testing-methodology.md +0 -0
@@ -0,0 +1,1325 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Design System Documentation Generator — Single-file HTML output.
4
+
5
+ Generates a beautiful, self-contained HTML page documenting a harvested
6
+ design system with interactive color swatches, typography specimens,
7
+ geometry previews, component samples, and token reference table.
8
+
9
+ Usage:
10
+ from design_doc_generator import generate_doc_html
11
+ html = generate_doc_html(tokens, harvest, meta)
12
+
13
+ # Or via CLI:
14
+ python3 design_doc_generator.py --project haravan
15
+ """
16
+ import json
17
+ import os
18
+ import sys
19
+ from pathlib import Path
20
+ from datetime import datetime, timezone
21
+
22
+
23
+ def generate_doc_html(tokens: dict, harvest: dict = None, meta: dict = None, confidence: dict = None) -> str:
24
+ """Generate a single-file HTML design system documentation page.
25
+
26
+ Args:
27
+ tokens: Semi Design CSS variable tokens dict
28
+ harvest: Raw harvest data (for additional context)
29
+ meta: Project metadata (name, url, etc.)
30
+ confidence: Optional confidence scores from multi-page scan
31
+ """
32
+ meta = meta or {}
33
+ harvest = harvest or {}
34
+ project_name = meta.get("name", meta.get("title", "Design System"))
35
+ source_url = meta.get("url", "")
36
+ timestamp = meta.get("updated_at", meta.get("timestamp", datetime.now(timezone.utc).isoformat()))
37
+ page_count = meta.get("page_count", meta.get("harvest_count", 1))
38
+
39
+ # Categorize tokens
40
+ brand_colors = {}
41
+ semantic_colors = {}
42
+ surface_colors = {}
43
+ text_colors = {}
44
+ typography_tokens = {}
45
+ geometry_tokens = {}
46
+ shadow_tokens = {}
47
+
48
+ for var, val in sorted(tokens.items()):
49
+ if "primary" in var:
50
+ brand_colors[var] = val
51
+ elif any(s in var for s in ("success", "warning", "danger")):
52
+ semantic_colors[var] = val
53
+ elif "bg-" in var or "border" in var:
54
+ surface_colors[var] = val
55
+ elif "text-" in var:
56
+ text_colors[var] = val
57
+ elif "font-" in var:
58
+ typography_tokens[var] = val
59
+ elif "shadow" in var:
60
+ shadow_tokens[var] = val
61
+ elif "radius" in var:
62
+ geometry_tokens[var] = val
63
+ else:
64
+ geometry_tokens[var] = val
65
+
66
+ # Build HTML sections
67
+ color_swatches_html = _build_color_section("Brand Colors", brand_colors)
68
+ color_swatches_html += _build_color_section("Semantic Colors", semantic_colors)
69
+ color_swatches_html += _build_color_section("Surface Colors", surface_colors)
70
+ color_swatches_html += _build_color_section("Text Colors", text_colors)
71
+
72
+ typography_html = _build_typography_section(typography_tokens, harvest)
73
+ geometry_html = _build_geometry_section(geometry_tokens, shadow_tokens)
74
+ components_html = _build_components_section(tokens, harvest)
75
+ token_table_html = _build_token_table(tokens, confidence)
76
+ usage_html = _build_usage_section(project_name)
77
+
78
+ # v3 sections
79
+ neutrals_html = _build_neutrals_section(harvest.get("neutrals", {}))
80
+ spacing_html = _build_spacing_section(harvest.get("spacing", {}))
81
+ layout_html = _build_layout_section(harvest.get("layout", {}))
82
+
83
+ html = f"""<!DOCTYPE html>
84
+ <html lang="en" data-theme="light">
85
+ <head>
86
+ <meta charset="UTF-8">
87
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
88
+ <title>{_esc(project_name)} — Design System</title>
89
+ <style>
90
+ {_get_css(tokens)}
91
+ </style>
92
+ </head>
93
+ <body>
94
+ <header class="header">
95
+ <div class="header-inner">
96
+ <div class="header-left">
97
+ <h1 class="header-title">{_esc(project_name)}</h1>
98
+ <span class="header-badge">Design System</span>
99
+ </div>
100
+ <button class="theme-toggle" onclick="toggleTheme()" aria-label="Toggle dark mode">
101
+ <span class="toggle-icon" id="themeIcon">☀️</span>
102
+ </button>
103
+ </div>
104
+ </header>
105
+
106
+ <main class="main">
107
+ <!-- Section 1: Introduction -->
108
+ <section class="section" id="introduction">
109
+ <h2 class="section-title">Introduction</h2>
110
+ <div class="intro-grid">
111
+ <div class="intro-card">
112
+ <div class="intro-label">Project</div>
113
+ <div class="intro-value">{_esc(project_name)}</div>
114
+ </div>
115
+ <div class="intro-card">
116
+ <div class="intro-label">Source</div>
117
+ <div class="intro-value"><a href="{_esc(source_url)}" target="_blank" rel="noopener">{_esc(source_url or 'N/A')}</a></div>
118
+ </div>
119
+ <div class="intro-card">
120
+ <div class="intro-label">Pages Scanned</div>
121
+ <div class="intro-value">{page_count}</div>
122
+ </div>
123
+ <div class="intro-card">
124
+ <div class="intro-label">Tokens Extracted</div>
125
+ <div class="intro-value">{len(tokens)}</div>
126
+ </div>
127
+ <div class="intro-card">
128
+ <div class="intro-label">Last Updated</div>
129
+ <div class="intro-value">{_esc(timestamp[:10] if timestamp else 'N/A')}</div>
130
+ </div>
131
+ </div>
132
+ </section>
133
+
134
+ <!-- Section 2: Color Palette -->
135
+ <section class="section" id="colors">
136
+ <h2 class="section-title">🎨 Color Palette</h2>
137
+ {color_swatches_html}
138
+ {neutrals_html}
139
+ </section>
140
+
141
+ <!-- Section 3: Typography -->
142
+ <section class="section" id="typography">
143
+ <h2 class="section-title">🔤 Typography</h2>
144
+ {typography_html}
145
+ </section>
146
+
147
+ <!-- Section 4: Spacing -->
148
+ <section class="section" id="spacing">
149
+ <h2 class="section-title">📏 Spacing Scale</h2>
150
+ {spacing_html}
151
+ </section>
152
+
153
+ <!-- Section 5: Geometry -->
154
+ <section class="section" id="geometry">
155
+ <h2 class="section-title">📐 Geometry</h2>
156
+ {geometry_html}
157
+ </section>
158
+
159
+ <!-- Section 6: Layout -->
160
+ <section class="section" id="layout">
161
+ <h2 class="section-title">📱 Layout Blueprint</h2>
162
+ {layout_html}
163
+ </section>
164
+
165
+ <!-- Section 7: Components Preview -->
166
+ <section class="section" id="components">
167
+ <h2 class="section-title">🧱 Components Preview</h2>
168
+ {components_html}
169
+ </section>
170
+
171
+ <!-- Section 8: Token Reference -->
172
+ <section class="section" id="tokens">
173
+ <h2 class="section-title">📋 Token Reference</h2>
174
+ {token_table_html}
175
+ </section>
176
+
177
+ <!-- Section 9: Usage -->
178
+ <section class="section" id="usage">
179
+ <h2 class="section-title">⚙️ Usage</h2>
180
+ {usage_html}
181
+ </section>
182
+ </main>
183
+
184
+ <footer class="footer">
185
+ <p>Generated by <strong>MasterDesign Agent — Semi-Sync Harvester</strong></p>
186
+ </footer>
187
+
188
+ <div class="toast" id="toast">Copied!</div>
189
+
190
+ <script>
191
+ {_get_js()}
192
+ </script>
193
+ </body>
194
+ </html>"""
195
+
196
+ return html
197
+
198
+
199
+ def _esc(s: str) -> str:
200
+ """HTML-escape a string."""
201
+ return (s or "").replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace('"', "&quot;")
202
+
203
+
204
+ def _build_color_section(title: str, colors: dict) -> str:
205
+ """Build HTML for a color group."""
206
+ if not colors:
207
+ return ""
208
+
209
+ swatches = []
210
+ for var, val in colors.items():
211
+ label = var.replace("--semi-color-", "").replace("-", " ").title()
212
+ swatches.append(f"""
213
+ <div class="swatch" onclick="copyColor('{_esc(val)}')">
214
+ <div class="swatch-color" style="background: {_esc(val)}"></div>
215
+ <div class="swatch-info">
216
+ <div class="swatch-name">{_esc(label)}</div>
217
+ <code class="swatch-value">{_esc(val)}</code>
218
+ </div>
219
+ </div>""")
220
+
221
+ return f"""
222
+ <h3 class="subsection-title">{_esc(title)}</h3>
223
+ <div class="swatch-grid">{"".join(swatches)}
224
+ </div>"""
225
+
226
+
227
+ def _build_typography_section(typo_tokens: dict, harvest: dict) -> str:
228
+ """Build typography specimen section."""
229
+ font_family = ""
230
+ font_size = ""
231
+ for var, val in typo_tokens.items():
232
+ if "family" in var:
233
+ font_family = val
234
+ elif "size" in var:
235
+ font_size = val
236
+
237
+ # Also check harvest for additional typography info
238
+ typo_harvest = harvest.get("typography", {})
239
+ if not font_family:
240
+ font_family = typo_harvest.get("font_family", "system-ui, sans-serif")
241
+ if not font_size:
242
+ font_size = typo_harvest.get("body_size", "14px")
243
+
244
+ return f"""
245
+ <div class="type-specimens">
246
+ <div class="type-specimen">
247
+ <div class="type-label">Font Family</div>
248
+ <div class="type-sample" style="font-family: {_esc(font_family)}">{_esc(font_family.split(',')[0].strip())}</div>
249
+ <code>{_esc(font_family)}</code>
250
+ </div>
251
+ <div class="type-specimen">
252
+ <div class="type-label">Heading</div>
253
+ <div class="type-heading-sample" style="font-family: {_esc(font_family)}">The quick brown fox jumps over the lazy dog</div>
254
+ </div>
255
+ <div class="type-specimen">
256
+ <div class="type-label">Body ({_esc(font_size)})</div>
257
+ <div class="type-body-sample" style="font-family: {_esc(font_family)}; font-size: {_esc(font_size)}">
258
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.
259
+ </div>
260
+ </div>
261
+ <div class="type-specimen">
262
+ <div class="type-label">Muted</div>
263
+ <div class="type-muted-sample" style="font-family: {_esc(font_family)}; font-size: {_esc(font_size)}">
264
+ Secondary text, captions, and supplementary information.
265
+ </div>
266
+ </div>
267
+ </div>"""
268
+
269
+
270
+ def _build_geometry_section(geometry_tokens: dict, shadow_tokens: dict) -> str:
271
+ """Build geometry preview section."""
272
+ items = []
273
+
274
+ for var, val in geometry_tokens.items():
275
+ label = var.replace("--semi-", "").replace("-", " ").title()
276
+ items.append(f"""
277
+ <div class="geo-item">
278
+ <div class="geo-preview" style="border-radius: {_esc(val)}"></div>
279
+ <div class="geo-info">
280
+ <div class="geo-label">{_esc(label)}</div>
281
+ <code>{_esc(val)}</code>
282
+ </div>
283
+ </div>""")
284
+
285
+ for var, val in shadow_tokens.items():
286
+ label = var.replace("--semi-", "").replace("-", " ").title()
287
+ items.append(f"""
288
+ <div class="geo-item">
289
+ <div class="geo-preview geo-shadow" style="box-shadow: {_esc(val)}"></div>
290
+ <div class="geo-info">
291
+ <div class="geo-label">{_esc(label)}</div>
292
+ <code>{_esc(val)}</code>
293
+ </div>
294
+ </div>""")
295
+
296
+ return f"""
297
+ <div class="geo-grid">{"".join(items)}
298
+ </div>"""
299
+
300
+
301
+ def _build_components_section(tokens: dict, harvest: dict = None) -> str:
302
+ """Build component preview section using CSS variables and v3 component data."""
303
+ harvest = harvest or {}
304
+ v3_components = harvest.get("components", {})
305
+
306
+ primary = tokens.get("--semi-color-primary", "#2463EB")
307
+ primary_hover = tokens.get("--semi-color-primary-hover", primary)
308
+ bg = tokens.get("--semi-color-bg-1", "#FFFFFF")
309
+ border = tokens.get("--semi-color-border", "#E5E7EB")
310
+ text0 = tokens.get("--semi-color-text-0", "#111827")
311
+ text1 = tokens.get("--semi-color-text-1", "#4B5563")
312
+ radius = tokens.get("--semi-border-radius-medium", "8px")
313
+ card_radius = tokens.get("--semi-border-radius-large", "16px")
314
+ shadow = tokens.get("--semi-shadow-elevated", "0 1px 3px rgba(0,0,0,0.1)")
315
+ success = tokens.get("--semi-color-success", "#10B981")
316
+ danger = tokens.get("--semi-color-danger", "#EF4444")
317
+ warning = tokens.get("--semi-color-warning", "#F59E0B")
318
+ info = tokens.get("--semi-color-info", "#3B82F6")
319
+ hover_bg = tokens.get("--semi-color-fill-0", "#F3F4F6")
320
+ header_bg = tokens.get("--semi-color-bg-3", bg)
321
+
322
+ # Use v3 component data if available
323
+ btn_p = v3_components.get("button", {}).get("primary", {})
324
+ btn_s = v3_components.get("button", {}).get("secondary", {})
325
+ btn_o = v3_components.get("button", {}).get("outline", {})
326
+ btn_d = v3_components.get("button", {}).get("danger", {})
327
+ inp = v3_components.get("input", {}).get("default", {})
328
+ card_v3 = v3_components.get("card", {}).get("default", {})
329
+ table_h = v3_components.get("table", {}).get("header", {})
330
+ table_c = v3_components.get("table", {}).get("cell", {})
331
+ nav_d = v3_components.get("nav_item", {}).get("default", {})
332
+ nav_a = v3_components.get("nav_item", {}).get("active", {})
333
+
334
+ # Dynamic styles from v3 or fallback
335
+ btn_primary_bg = btn_p.get("bg", primary)
336
+ btn_primary_color = btn_p.get("color", "#fff")
337
+ btn_primary_radius = btn_p.get("border_radius", radius)
338
+ btn_primary_pad = btn_p.get("padding", "8px 16px")
339
+ btn_sec_bg = btn_s.get("bg", "transparent")
340
+ btn_sec_color = btn_s.get("color", text0)
341
+ input_pad = inp.get("padding", "10px 12px")
342
+ input_radius = inp.get("border_radius", radius)
343
+ card_pad = card_v3.get("padding", "20px")
344
+ card_r = card_v3.get("border_radius", card_radius)
345
+ card_sh = card_v3.get("box_shadow", shadow)
346
+ tbl_h_bg = table_h.get("bg", "#F9FAFB")
347
+ tbl_h_fw = table_h.get("font_weight", "600")
348
+ tbl_c_pad = table_c.get("padding", "12px 16px")
349
+
350
+ return f"""
351
+ <div class="component-grid">
352
+ <!-- Buttons -->
353
+ <div class="component-card">
354
+ <h4>Buttons</h4>
355
+ <div class="component-row">
356
+ <button class="comp-btn comp-btn-primary" style="background:{btn_primary_bg}; border-radius:{btn_primary_radius}; color:{btn_primary_color}; padding:{btn_primary_pad}">Primary</button>
357
+ <button class="comp-btn comp-btn-outline" style="border: 1px solid {border}; border-radius:{btn_primary_radius}; color:{btn_sec_color}; background:{btn_sec_bg}">Secondary</button>
358
+ <button class="comp-btn comp-btn-danger" style="background:{danger}; border-radius:{btn_primary_radius}; color:#fff">Danger</button>
359
+ </div>
360
+ <div class="component-row" style="margin-top:8px">
361
+ <button class="comp-btn" style="background:{success}; border-radius:{btn_primary_radius}; color:#fff; padding:6px 12px; font-size:12px">Small</button>
362
+ <button class="comp-btn" style="background:{primary}; border-radius:{btn_primary_radius}; color:#fff; padding:{btn_primary_pad}">Medium</button>
363
+ <button class="comp-btn" style="background:{primary}; border-radius:{btn_primary_radius}; color:#fff; padding:12px 24px; font-size:16px">Large</button>
364
+ </div>
365
+ </div>
366
+
367
+ <!-- Card -->
368
+ <div class="component-card">
369
+ <h4>Card</h4>
370
+ <div class="comp-card-preview" style="background:{bg}; border-radius:{card_r}; box-shadow:{card_sh}; border:1px solid {border}; padding:{card_pad}">
371
+ <div class="comp-card-title" style="color:{text0}">Card Title</div>
372
+ <div class="comp-card-body" style="color:{text1}">Card content with extracted design tokens applied.</div>
373
+ </div>
374
+ </div>
375
+
376
+ <!-- Input + Forms -->
377
+ <div class="component-card">
378
+ <h4>Form Elements</h4>
379
+ <input type="text" class="comp-input" placeholder="Text input..." style="border: 1px solid {border}; border-radius:{input_radius}; color:{text0}; padding:{input_pad}; margin-bottom:8px">
380
+ <div class="component-row">
381
+ <select style="border:1px solid {border}; border-radius:{input_radius}; padding:{input_pad}; background:{bg}; color:{text0}; font-size:14px; flex:1">
382
+ <option>Select option</option>
383
+ </select>
384
+ </div>
385
+ </div>
386
+
387
+ <!-- Table -->
388
+ <div class="component-card" style="grid-column: span 2">
389
+ <h4>Table</h4>
390
+ <div style="overflow-x:auto; border:1px solid {border}; border-radius:{radius}">
391
+ <table style="width:100%; border-collapse:collapse; font-size:14px">
392
+ <thead>
393
+ <tr style="background:{tbl_h_bg}">
394
+ <th style="padding:{tbl_c_pad}; text-align:left; font-weight:{tbl_h_fw}; font-size:12px; color:{text1}; border-bottom:1px solid {border}">Name</th>
395
+ <th style="padding:{tbl_c_pad}; text-align:left; font-weight:{tbl_h_fw}; font-size:12px; color:{text1}; border-bottom:1px solid {border}">Status</th>
396
+ <th style="padding:{tbl_c_pad}; text-align:left; font-weight:{tbl_h_fw}; font-size:12px; color:{text1}; border-bottom:1px solid {border}">Amount</th>
397
+ </tr>
398
+ </thead>
399
+ <tbody>
400
+ <tr style="border-bottom:1px solid {border}">
401
+ <td style="padding:{tbl_c_pad}; color:{text0}">Order #1024</td>
402
+ <td style="padding:{tbl_c_pad}"><span class="comp-tag" style="background:{success}20; color:{success}; border-radius:6px">Completed</span></td>
403
+ <td style="padding:{tbl_c_pad}; color:{text0}">$1,250.00</td>
404
+ </tr>
405
+ <tr style="border-bottom:1px solid {border}">
406
+ <td style="padding:{tbl_c_pad}; color:{text0}">Order #1025</td>
407
+ <td style="padding:{tbl_c_pad}"><span class="comp-tag" style="background:{warning}20; color:{warning}; border-radius:6px">Pending</span></td>
408
+ <td style="padding:{tbl_c_pad}; color:{text0}">$430.50</td>
409
+ </tr>
410
+ <tr>
411
+ <td style="padding:{tbl_c_pad}; color:{text0}">Order #1026</td>
412
+ <td style="padding:{tbl_c_pad}"><span class="comp-tag" style="background:{danger}20; color:{danger}; border-radius:6px">Cancelled</span></td>
413
+ <td style="padding:{tbl_c_pad}; color:{text0}">$89.00</td>
414
+ </tr>
415
+ </tbody>
416
+ </table>
417
+ </div>
418
+ </div>
419
+
420
+ <!-- Tags -->
421
+ <div class="component-card">
422
+ <h4>Tags / Badges</h4>
423
+ <div class="component-row">
424
+ <span class="comp-tag" style="background:{primary}20; color:{primary}; border-radius:{radius}">Primary</span>
425
+ <span class="comp-tag" style="background:{success}20; color:{success}; border-radius:{radius}">Success</span>
426
+ <span class="comp-tag" style="background:{warning}20; color:{warning}; border-radius:{radius}">Warning</span>
427
+ <span class="comp-tag" style="background:{danger}20; color:{danger}; border-radius:{radius}">Danger</span>
428
+ <span class="comp-tag" style="background:{info}20; color:{info}; border-radius:{radius}">Info</span>
429
+ </div>
430
+ </div>
431
+
432
+ <!-- Nav Items -->
433
+ <div class="component-card">
434
+ <h4>Navigation</h4>
435
+ <div style="background:#1F2937; border-radius:{card_r}; padding:12px">
436
+ <div style="padding:8px 12px; color:rgba(255,255,255,0.5); font-size:14px; border-radius:{radius}; cursor:pointer; margin-bottom:4px">📊 Dashboard</div>
437
+ <div style="padding:8px 12px; color:#fff; background:rgba(255,255,255,0.1); font-size:14px; border-radius:{radius}; cursor:pointer; margin-bottom:4px">📦 Orders</div>
438
+ <div style="padding:8px 12px; color:rgba(255,255,255,0.5); font-size:14px; border-radius:{radius}; cursor:pointer; margin-bottom:4px">⚙️ Settings</div>
439
+ <div style="padding:8px 12px; color:rgba(255,255,255,0.5); font-size:14px; border-radius:{radius}; cursor:pointer">📈 Reports</div>
440
+ </div>
441
+ </div>
442
+ </div>"""
443
+
444
+
445
+ def _build_neutrals_section(neutrals: dict) -> str:
446
+ """Build neutral color scale visualization."""
447
+ if not neutrals:
448
+ return ""
449
+
450
+ swatches = []
451
+ for step in ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900"]:
452
+ val = neutrals.get(step, neutrals.get(int(step), ""))
453
+ if val:
454
+ swatches.append(f"""
455
+ <div class="neutral-swatch" onclick="copyColor('{_esc(val)}')">
456
+ <div class="neutral-color" style="background: {_esc(val)}"></div>
457
+ <div class="neutral-label">{step}</div>
458
+ <code class="neutral-hex">{_esc(val)}</code>
459
+ </div>""")
460
+
461
+ if not swatches:
462
+ return ""
463
+
464
+ return f"""
465
+ <h3 class="subsection-title">Neutral Scale</h3>
466
+ <div class="neutral-grid">{"".join(swatches)}
467
+ </div>"""
468
+
469
+
470
+ def _build_spacing_section(spacing: dict) -> str:
471
+ """Build spacing scale visualization with bars."""
472
+ scale = spacing.get("scale", [])
473
+ if not scale:
474
+ return '<p style="color: var(--doc-text-secondary)">No spacing data extracted. Run harvester v3 for spacing inference.</p>'
475
+
476
+ bars = []
477
+ for val in scale:
478
+ px = val.replace("px", "")
479
+ bars.append(f"""
480
+ <div class="spacing-item">
481
+ <code class="spacing-value">{_esc(val)}</code>
482
+ <div class="spacing-bar" style="width: {_esc(val)}; min-width: 4px"></div>
483
+ <span class="spacing-px">{_esc(px)}</span>
484
+ </div>""")
485
+
486
+ return f"""
487
+ <div class="spacing-scale">{"".join(bars)}
488
+ </div>"""
489
+
490
+
491
+ def _build_layout_section(layout: dict) -> str:
492
+ """Build layout blueprint diagram."""
493
+ if not layout:
494
+ return '<p style="color: var(--doc-text-secondary)">No layout data extracted. Run harvester v3 on a dashboard page.</p>'
495
+
496
+ sidebar_w = layout.get("sidebar_width", "256px")
497
+ header_h = layout.get("header_height", "64px")
498
+ content_mw = layout.get("content_max_width", "1200px")
499
+ content_p = layout.get("content_padding", "24px")
500
+ grid_gap = layout.get("grid_gap", "16px")
501
+
502
+ return f"""
503
+ <div class="layout-blueprint">
504
+ <div class="layout-diagram">
505
+ <div class="layout-sidebar" style="width: 120px">
506
+ <div class="layout-metric-label">Sidebar</div>
507
+ <code>{_esc(sidebar_w)}</code>
508
+ </div>
509
+ <div class="layout-main-area">
510
+ <div class="layout-header" style="height: 40px">
511
+ <div class="layout-metric-label">Header</div>
512
+ <code>{_esc(header_h)}</code>
513
+ </div>
514
+ <div class="layout-content">
515
+ <div class="layout-metric-label">Content</div>
516
+ <code>max-width: {_esc(content_mw)}</code>
517
+ <code>padding: {_esc(content_p)}</code>
518
+ <code>gap: {_esc(grid_gap)}</code>
519
+ </div>
520
+ </div>
521
+ </div>
522
+ </div>
523
+ <div class="layout-tokens">
524
+ <div class="geo-grid">
525
+ <div class="geo-item"><div class="geo-info"><div class="geo-label">Sidebar Width</div><code>{_esc(sidebar_w)}</code></div></div>
526
+ <div class="geo-item"><div class="geo-info"><div class="geo-label">Header Height</div><code>{_esc(header_h)}</code></div></div>
527
+ <div class="geo-item"><div class="geo-info"><div class="geo-label">Content Max Width</div><code>{_esc(content_mw)}</code></div></div>
528
+ <div class="geo-item"><div class="geo-info"><div class="geo-label">Content Padding</div><code>{_esc(content_p)}</code></div></div>
529
+ <div class="geo-item"><div class="geo-info"><div class="geo-label">Grid Gap</div><code>{_esc(grid_gap)}</code></div></div>
530
+ </div>
531
+ </div>"""
532
+
533
+
534
+ def _build_token_table(tokens: dict, confidence: dict = None) -> str:
535
+ """Build full token reference table."""
536
+ rows = []
537
+ for var, val in sorted(tokens.items()):
538
+ # Determine category
539
+ if "data-" in var:
540
+ cat = "Chart"
541
+ preview = f'<span class="token-color-preview" style="background:{_esc(val)}"></span>'
542
+ elif "neutral-" in var or "grey-" in var:
543
+ cat = "Neutral"
544
+ preview = f'<span class="token-color-preview" style="background:{_esc(val)}"></span>' if val.startswith("#") else ""
545
+ elif "radius" in var or "thickness" in var:
546
+ cat = "Border"
547
+ preview = ""
548
+ elif "border" in var and "color" not in var:
549
+ cat = "Border"
550
+ preview = ""
551
+ elif "shadow" in var:
552
+ cat = "Shadow"
553
+ preview = ""
554
+ elif "font" in var or "line-height" in var:
555
+ cat = "Typography"
556
+ preview = ""
557
+ elif "spacing" in var:
558
+ cat = "Spacing"
559
+ preview = ""
560
+ elif "height" in var or "width-icon" in var:
561
+ cat = "Sizing"
562
+ preview = ""
563
+ elif "layout" in var:
564
+ cat = "Layout"
565
+ preview = ""
566
+ elif "color" in var or "bg-" in var or "text-" in var or "fill-" in var:
567
+ cat = "Color"
568
+ preview = f'<span class="token-color-preview" style="background:{_esc(val)}"></span>' if val.startswith("#") or val.startswith("rgb") else ""
569
+ else:
570
+ cat = "Other"
571
+ preview = ""
572
+
573
+ rows.append(f"""
574
+ <tr>
575
+ <td><code>{_esc(var)}</code></td>
576
+ <td>{preview} {_esc(val)}</td>
577
+ <td>{cat}</td>
578
+ </tr>""")
579
+
580
+ return f"""
581
+ <div class="table-wrapper">
582
+ <table class="token-table">
583
+ <thead>
584
+ <tr>
585
+ <th>Variable</th>
586
+ <th>Value</th>
587
+ <th>Category</th>
588
+ </tr>
589
+ </thead>
590
+ <tbody>{"".join(rows)}
591
+ </tbody>
592
+ </table>
593
+ </div>"""
594
+
595
+
596
+ def _build_usage_section(project_name: str) -> str:
597
+ """Build usage/install instructions section."""
598
+ slug = project_name.lower().replace(" ", "-")
599
+ return f"""
600
+ <div class="usage-blocks">
601
+ <div class="usage-block">
602
+ <h4>1. CSS Import</h4>
603
+ <pre><code>/* Import the theme override in your main CSS/entry */
604
+ @import './semi-theme-override.css';
605
+
606
+ /* Or in HTML */
607
+ &lt;link rel="stylesheet" href="semi-theme-override.css"&gt;</code></pre>
608
+ </div>
609
+ <div class="usage-block">
610
+ <h4>2. React Setup (Semi Design)</h4>
611
+ <pre><code>// Install Semi UI
612
+ npm install @douyinfe/semi-ui
613
+
614
+ // Import theme override AFTER Semi default styles
615
+ import '@douyinfe/semi-ui/dist/css/semi.min.css';
616
+ import './semi-theme-override.css';</code></pre>
617
+ </div>
618
+ <div class="usage-block">
619
+ <h4>3. Figma Tokens</h4>
620
+ <pre><code>// Import figma-tokens.json into Tokens Studio plugin
621
+ // File → Import → Select figma-tokens.json
622
+ // Apply {_esc(project_name)} theme set</code></pre>
623
+ </div>
624
+ </div>"""
625
+
626
+
627
+ def _get_css(tokens: dict) -> str:
628
+ """Generate the embedded CSS for the doc page."""
629
+ primary = tokens.get("--semi-color-primary", "#2463EB")
630
+
631
+ return f"""
632
+ :root {{
633
+ --doc-primary: {primary};
634
+ --doc-bg: #FAFBFC;
635
+ --doc-surface: #FFFFFF;
636
+ --doc-text: #111827;
637
+ --doc-text-secondary: #6B7280;
638
+ --doc-border: #E5E7EB;
639
+ --doc-code-bg: #F3F4F6;
640
+ --doc-radius: 12px;
641
+ --doc-shadow: 0 1px 3px rgba(0,0,0,0.08);
642
+ }}
643
+
644
+ [data-theme="dark"] {{
645
+ --doc-bg: #0F172A;
646
+ --doc-surface: #1E293B;
647
+ --doc-text: #F1F5F9;
648
+ --doc-text-secondary: #94A3B8;
649
+ --doc-border: #334155;
650
+ --doc-code-bg: #1E293B;
651
+ --doc-shadow: 0 1px 3px rgba(0,0,0,0.3);
652
+ }}
653
+
654
+ * {{ margin: 0; padding: 0; box-sizing: border-box; }}
655
+
656
+ body {{
657
+ font-family: -apple-system, system-ui, 'Segoe UI', Roboto, 'Inter', sans-serif;
658
+ background: var(--doc-bg);
659
+ color: var(--doc-text);
660
+ line-height: 1.6;
661
+ transition: background 0.3s, color 0.3s;
662
+ }}
663
+
664
+ .header {{
665
+ position: sticky;
666
+ top: 0;
667
+ z-index: 100;
668
+ background: var(--doc-surface);
669
+ border-bottom: 1px solid var(--doc-border);
670
+ backdrop-filter: blur(12px);
671
+ -webkit-backdrop-filter: blur(12px);
672
+ }}
673
+
674
+ .header-inner {{
675
+ max-width: 1200px;
676
+ margin: 0 auto;
677
+ padding: 16px 24px;
678
+ display: flex;
679
+ align-items: center;
680
+ justify-content: space-between;
681
+ }}
682
+
683
+ .header-left {{
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 12px;
687
+ }}
688
+
689
+ .header-title {{
690
+ font-size: 20px;
691
+ font-weight: 700;
692
+ }}
693
+
694
+ .header-badge {{
695
+ background: var(--doc-primary);
696
+ color: #fff;
697
+ font-size: 11px;
698
+ font-weight: 600;
699
+ padding: 2px 8px;
700
+ border-radius: 100px;
701
+ text-transform: uppercase;
702
+ letter-spacing: 0.5px;
703
+ }}
704
+
705
+ .theme-toggle {{
706
+ background: var(--doc-code-bg);
707
+ border: 1px solid var(--doc-border);
708
+ border-radius: 8px;
709
+ padding: 8px 12px;
710
+ cursor: pointer;
711
+ font-size: 16px;
712
+ transition: all 0.2s;
713
+ }}
714
+
715
+ .theme-toggle:hover {{
716
+ border-color: var(--doc-primary);
717
+ }}
718
+
719
+ .main {{
720
+ max-width: 1200px;
721
+ margin: 0 auto;
722
+ padding: 32px 24px;
723
+ }}
724
+
725
+ .section {{
726
+ margin-bottom: 48px;
727
+ }}
728
+
729
+ .section-title {{
730
+ font-size: 24px;
731
+ font-weight: 700;
732
+ margin-bottom: 20px;
733
+ padding-bottom: 8px;
734
+ border-bottom: 2px solid var(--doc-border);
735
+ }}
736
+
737
+ .subsection-title {{
738
+ font-size: 16px;
739
+ font-weight: 600;
740
+ margin: 16px 0 12px;
741
+ color: var(--doc-text-secondary);
742
+ }}
743
+
744
+ /* Intro Grid */
745
+ .intro-grid {{
746
+ display: grid;
747
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
748
+ gap: 12px;
749
+ }}
750
+
751
+ .intro-card {{
752
+ background: var(--doc-surface);
753
+ border: 1px solid var(--doc-border);
754
+ border-radius: var(--doc-radius);
755
+ padding: 16px;
756
+ box-shadow: var(--doc-shadow);
757
+ }}
758
+
759
+ .intro-label {{
760
+ font-size: 12px;
761
+ font-weight: 600;
762
+ text-transform: uppercase;
763
+ letter-spacing: 0.5px;
764
+ color: var(--doc-text-secondary);
765
+ margin-bottom: 4px;
766
+ }}
767
+
768
+ .intro-value {{
769
+ font-size: 15px;
770
+ font-weight: 500;
771
+ word-break: break-all;
772
+ }}
773
+
774
+ .intro-value a {{
775
+ color: var(--doc-primary);
776
+ text-decoration: none;
777
+ }}
778
+
779
+ /* Color Swatches */
780
+ .swatch-grid {{
781
+ display: grid;
782
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
783
+ gap: 12px;
784
+ }}
785
+
786
+ .swatch {{
787
+ background: var(--doc-surface);
788
+ border: 1px solid var(--doc-border);
789
+ border-radius: var(--doc-radius);
790
+ overflow: hidden;
791
+ cursor: pointer;
792
+ transition: transform 0.15s, box-shadow 0.15s;
793
+ }}
794
+
795
+ .swatch:hover {{
796
+ transform: translateY(-2px);
797
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
798
+ }}
799
+
800
+ .swatch-color {{
801
+ height: 72px;
802
+ width: 100%;
803
+ }}
804
+
805
+ .swatch-info {{
806
+ padding: 10px 12px;
807
+ }}
808
+
809
+ .swatch-name {{
810
+ font-size: 13px;
811
+ font-weight: 600;
812
+ margin-bottom: 2px;
813
+ }}
814
+
815
+ .swatch-value {{
816
+ font-size: 11px;
817
+ color: var(--doc-text-secondary);
818
+ }}
819
+
820
+ /* Typography */
821
+ .type-specimens {{
822
+ display: flex;
823
+ flex-direction: column;
824
+ gap: 16px;
825
+ }}
826
+
827
+ .type-specimen {{
828
+ background: var(--doc-surface);
829
+ border: 1px solid var(--doc-border);
830
+ border-radius: var(--doc-radius);
831
+ padding: 20px;
832
+ }}
833
+
834
+ .type-label {{
835
+ font-size: 12px;
836
+ font-weight: 600;
837
+ text-transform: uppercase;
838
+ letter-spacing: 0.5px;
839
+ color: var(--doc-text-secondary);
840
+ margin-bottom: 8px;
841
+ }}
842
+
843
+ .type-sample {{
844
+ font-size: 32px;
845
+ font-weight: 600;
846
+ margin-bottom: 8px;
847
+ }}
848
+
849
+ .type-heading-sample {{
850
+ font-size: 28px;
851
+ font-weight: 700;
852
+ }}
853
+
854
+ .type-body-sample {{
855
+ line-height: 1.6;
856
+ }}
857
+
858
+ .type-muted-sample {{
859
+ color: var(--doc-text-secondary);
860
+ line-height: 1.6;
861
+ }}
862
+
863
+ /* Geometry */
864
+ .geo-grid {{
865
+ display: grid;
866
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
867
+ gap: 12px;
868
+ }}
869
+
870
+ .geo-item {{
871
+ background: var(--doc-surface);
872
+ border: 1px solid var(--doc-border);
873
+ border-radius: var(--doc-radius);
874
+ padding: 16px;
875
+ display: flex;
876
+ align-items: center;
877
+ gap: 16px;
878
+ }}
879
+
880
+ .geo-preview {{
881
+ width: 48px;
882
+ height: 48px;
883
+ background: var(--doc-primary);
884
+ flex-shrink: 0;
885
+ }}
886
+
887
+ .geo-shadow {{
888
+ background: var(--doc-surface);
889
+ border-radius: 8px;
890
+ }}
891
+
892
+ .geo-label {{
893
+ font-size: 13px;
894
+ font-weight: 600;
895
+ margin-bottom: 2px;
896
+ }}
897
+
898
+ .geo-info code {{
899
+ font-size: 11px;
900
+ color: var(--doc-text-secondary);
901
+ }}
902
+
903
+ /* Components */
904
+ .component-grid {{
905
+ display: grid;
906
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
907
+ gap: 16px;
908
+ }}
909
+
910
+ .component-card {{
911
+ background: var(--doc-surface);
912
+ border: 1px solid var(--doc-border);
913
+ border-radius: var(--doc-radius);
914
+ padding: 20px;
915
+ }}
916
+
917
+ .component-card h4 {{
918
+ font-size: 14px;
919
+ font-weight: 600;
920
+ margin-bottom: 12px;
921
+ color: var(--doc-text-secondary);
922
+ }}
923
+
924
+ .component-row {{
925
+ display: flex;
926
+ gap: 8px;
927
+ flex-wrap: wrap;
928
+ }}
929
+
930
+ .comp-btn {{
931
+ padding: 8px 16px;
932
+ border: none;
933
+ font-size: 14px;
934
+ font-weight: 500;
935
+ cursor: pointer;
936
+ transition: opacity 0.2s;
937
+ }}
938
+
939
+ .comp-btn:hover {{ opacity: 0.9; }}
940
+
941
+ .comp-card-preview {{
942
+ padding: 16px;
943
+ }}
944
+
945
+ .comp-card-title {{
946
+ font-size: 16px;
947
+ font-weight: 600;
948
+ margin-bottom: 8px;
949
+ }}
950
+
951
+ .comp-card-body {{
952
+ font-size: 14px;
953
+ line-height: 1.5;
954
+ }}
955
+
956
+ .comp-input {{
957
+ width: 100%;
958
+ padding: 10px 12px;
959
+ font-size: 14px;
960
+ background: var(--doc-bg);
961
+ outline: none;
962
+ transition: border-color 0.2s;
963
+ }}
964
+
965
+ .comp-input:focus {{
966
+ border-color: var(--doc-primary) !important;
967
+ }}
968
+
969
+ .comp-tag {{
970
+ display: inline-block;
971
+ padding: 4px 10px;
972
+ font-size: 12px;
973
+ font-weight: 500;
974
+ }}
975
+
976
+ /* Neutral Scale */
977
+ .neutral-grid {{
978
+ display: grid;
979
+ grid-template-columns: repeat(10, 1fr);
980
+ gap: 4px;
981
+ border-radius: var(--doc-radius);
982
+ overflow: hidden;
983
+ }}
984
+
985
+ .neutral-swatch {{
986
+ cursor: pointer;
987
+ text-align: center;
988
+ transition: transform 0.15s;
989
+ }}
990
+
991
+ .neutral-swatch:hover {{ transform: translateY(-2px); }}
992
+
993
+ .neutral-color {{
994
+ height: 48px;
995
+ width: 100%;
996
+ }}
997
+
998
+ .neutral-label {{
999
+ font-size: 11px;
1000
+ font-weight: 600;
1001
+ margin-top: 4px;
1002
+ color: var(--doc-text-secondary);
1003
+ }}
1004
+
1005
+ .neutral-hex {{
1006
+ font-size: 9px;
1007
+ color: var(--doc-text-secondary);
1008
+ }}
1009
+
1010
+ /* Spacing Scale */
1011
+ .spacing-scale {{
1012
+ display: flex;
1013
+ flex-direction: column;
1014
+ gap: 8px;
1015
+ background: var(--doc-surface);
1016
+ border: 1px solid var(--doc-border);
1017
+ border-radius: var(--doc-radius);
1018
+ padding: 20px;
1019
+ }}
1020
+
1021
+ .spacing-item {{
1022
+ display: flex;
1023
+ align-items: center;
1024
+ gap: 12px;
1025
+ }}
1026
+
1027
+ .spacing-value {{
1028
+ width: 48px;
1029
+ text-align: right;
1030
+ font-size: 12px;
1031
+ color: var(--doc-text-secondary);
1032
+ flex-shrink: 0;
1033
+ }}
1034
+
1035
+ .spacing-bar {{
1036
+ height: 12px;
1037
+ background: var(--doc-primary);
1038
+ border-radius: 4px;
1039
+ opacity: 0.7;
1040
+ transition: opacity 0.2s;
1041
+ }}
1042
+
1043
+ .spacing-bar:hover {{ opacity: 1; }}
1044
+
1045
+ .spacing-px {{
1046
+ font-size: 11px;
1047
+ color: var(--doc-text-secondary);
1048
+ }}
1049
+
1050
+ /* Layout Blueprint */
1051
+ .layout-blueprint {{
1052
+ margin-bottom: 20px;
1053
+ }}
1054
+
1055
+ .layout-diagram {{
1056
+ display: flex;
1057
+ border: 2px dashed var(--doc-border);
1058
+ border-radius: var(--doc-radius);
1059
+ min-height: 200px;
1060
+ overflow: hidden;
1061
+ }}
1062
+
1063
+ .layout-sidebar {{
1064
+ background: rgba(31, 41, 55, 0.9);
1065
+ color: #D1D5DB;
1066
+ display: flex;
1067
+ flex-direction: column;
1068
+ align-items: center;
1069
+ justify-content: center;
1070
+ gap: 4px;
1071
+ border-right: 2px dashed var(--doc-border);
1072
+ flex-shrink: 0;
1073
+ }}
1074
+
1075
+ .layout-main-area {{
1076
+ flex: 1;
1077
+ display: flex;
1078
+ flex-direction: column;
1079
+ }}
1080
+
1081
+ .layout-header {{
1082
+ background: var(--doc-surface);
1083
+ border-bottom: 2px dashed var(--doc-border);
1084
+ display: flex;
1085
+ align-items: center;
1086
+ justify-content: center;
1087
+ gap: 8px;
1088
+ }}
1089
+
1090
+ .layout-content {{
1091
+ flex: 1;
1092
+ padding: 20px;
1093
+ display: flex;
1094
+ flex-direction: column;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ gap: 4px;
1098
+ background: var(--doc-bg);
1099
+ }}
1100
+
1101
+ .layout-metric-label {{
1102
+ font-size: 12px;
1103
+ font-weight: 600;
1104
+ }}
1105
+
1106
+ .layout-tokens {{
1107
+ margin-top: 16px;
1108
+ }}
1109
+
1110
+ /* Token Table */
1111
+ .table-wrapper {{
1112
+ overflow-x: auto;
1113
+ border: 1px solid var(--doc-border);
1114
+ border-radius: var(--doc-radius);
1115
+ }}
1116
+
1117
+ .token-table {{
1118
+ width: 100%;
1119
+ border-collapse: collapse;
1120
+ font-size: 13px;
1121
+ }}
1122
+
1123
+ .token-table th {{
1124
+ background: var(--doc-code-bg);
1125
+ padding: 10px 16px;
1126
+ text-align: left;
1127
+ font-weight: 600;
1128
+ font-size: 12px;
1129
+ text-transform: uppercase;
1130
+ letter-spacing: 0.5px;
1131
+ border-bottom: 1px solid var(--doc-border);
1132
+ }}
1133
+
1134
+ .token-table td {{
1135
+ padding: 8px 16px;
1136
+ border-bottom: 1px solid var(--doc-border);
1137
+ vertical-align: middle;
1138
+ }}
1139
+
1140
+ .token-table tr:last-child td {{
1141
+ border-bottom: none;
1142
+ }}
1143
+
1144
+ .token-table tr:hover {{
1145
+ background: var(--doc-code-bg);
1146
+ }}
1147
+
1148
+ .token-color-preview {{
1149
+ display: inline-block;
1150
+ width: 16px;
1151
+ height: 16px;
1152
+ border-radius: 4px;
1153
+ vertical-align: middle;
1154
+ margin-right: 8px;
1155
+ border: 1px solid var(--doc-border);
1156
+ }}
1157
+
1158
+ /* Usage */
1159
+ .usage-blocks {{
1160
+ display: flex;
1161
+ flex-direction: column;
1162
+ gap: 16px;
1163
+ }}
1164
+
1165
+ .usage-block {{
1166
+ background: var(--doc-surface);
1167
+ border: 1px solid var(--doc-border);
1168
+ border-radius: var(--doc-radius);
1169
+ padding: 20px;
1170
+ }}
1171
+
1172
+ .usage-block h4 {{
1173
+ font-size: 14px;
1174
+ font-weight: 600;
1175
+ margin-bottom: 12px;
1176
+ }}
1177
+
1178
+ .usage-block pre {{
1179
+ background: var(--doc-code-bg);
1180
+ border-radius: 8px;
1181
+ padding: 16px;
1182
+ overflow-x: auto;
1183
+ font-size: 13px;
1184
+ line-height: 1.5;
1185
+ }}
1186
+
1187
+ code {{
1188
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
1189
+ }}
1190
+
1191
+ /* Footer */
1192
+ .footer {{
1193
+ text-align: center;
1194
+ padding: 24px;
1195
+ font-size: 13px;
1196
+ color: var(--doc-text-secondary);
1197
+ border-top: 1px solid var(--doc-border);
1198
+ }}
1199
+
1200
+ /* Toast */
1201
+ .toast {{
1202
+ position: fixed;
1203
+ bottom: -60px;
1204
+ left: 50%;
1205
+ transform: translateX(-50%);
1206
+ background: var(--doc-text);
1207
+ color: var(--doc-bg);
1208
+ padding: 10px 20px;
1209
+ border-radius: 8px;
1210
+ font-size: 14px;
1211
+ font-weight: 500;
1212
+ transition: bottom 0.3s;
1213
+ z-index: 999;
1214
+ }}
1215
+
1216
+ .toast.show {{
1217
+ bottom: 24px;
1218
+ }}
1219
+
1220
+ /* Responsive */
1221
+ @media (max-width: 640px) {{
1222
+ .intro-grid {{ grid-template-columns: 1fr 1fr; }}
1223
+ .swatch-grid {{ grid-template-columns: repeat(2, 1fr); }}
1224
+ .component-grid {{ grid-template-columns: 1fr; }}
1225
+ .geo-grid {{ grid-template-columns: 1fr; }}
1226
+ }}
1227
+ """
1228
+
1229
+
1230
+ def _get_js() -> str:
1231
+ """Generate embedded JavaScript."""
1232
+ return """
1233
+ function toggleTheme() {
1234
+ const html = document.documentElement;
1235
+ const current = html.getAttribute('data-theme');
1236
+ const next = current === 'dark' ? 'light' : 'dark';
1237
+ html.setAttribute('data-theme', next);
1238
+ document.getElementById('themeIcon').textContent = next === 'dark' ? '🌙' : '☀️';
1239
+ localStorage.setItem('theme', next);
1240
+ }
1241
+
1242
+ function copyColor(value) {
1243
+ navigator.clipboard.writeText(value).then(() => {
1244
+ const toast = document.getElementById('toast');
1245
+ toast.textContent = 'Copied: ' + value;
1246
+ toast.classList.add('show');
1247
+ setTimeout(() => toast.classList.remove('show'), 2000);
1248
+ });
1249
+ }
1250
+
1251
+ // Restore saved theme
1252
+ (function() {
1253
+ const saved = localStorage.getItem('theme');
1254
+ if (saved) {
1255
+ document.documentElement.setAttribute('data-theme', saved);
1256
+ document.getElementById('themeIcon').textContent = saved === 'dark' ? '🌙' : '☀️';
1257
+ }
1258
+ })();
1259
+ """
1260
+
1261
+
1262
+ # ============ CLI ============
1263
+
1264
+ if __name__ == "__main__":
1265
+ import argparse
1266
+
1267
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__)))
1268
+
1269
+ parser = argparse.ArgumentParser(description="Generate Design System Documentation HTML")
1270
+ parser.add_argument("--project", "-p", help="Project slug (reads from output/<slug>/)")
1271
+ parser.add_argument("--input", "-i", help="Direct input: harvest JSON file")
1272
+ parser.add_argument("--tokens", "-t", help="Direct input: Semi tokens JSON file")
1273
+ parser.add_argument("--output", "-o", help="Output HTML file path")
1274
+ parser.add_argument("--open", action="store_true", help="Open in browser after generating")
1275
+
1276
+ args = parser.parse_args()
1277
+
1278
+ if args.project:
1279
+ from project_registry import ProjectRegistry
1280
+ from token_mapper import map_to_semi_tokens
1281
+
1282
+ registry = ProjectRegistry()
1283
+ manifest = registry.get(args.project)
1284
+ if not manifest:
1285
+ print(f"Error: Project '{args.project}' not found")
1286
+ sys.exit(1)
1287
+
1288
+ harvest = registry.get_merged_harvest(args.project)
1289
+ if not harvest:
1290
+ # Fallback: try harvest-raw.json
1291
+ harvest_path = registry.get_project_dir(args.project) / "harvest-raw.json"
1292
+ if harvest_path.exists():
1293
+ with open(harvest_path) as f:
1294
+ harvest = json.load(f)
1295
+ else:
1296
+ print(f"Error: No harvest data for project '{args.project}'")
1297
+ sys.exit(1)
1298
+
1299
+ tokens = map_to_semi_tokens(harvest)
1300
+ meta = {**manifest, **harvest.get("meta", {})}
1301
+ output_path = args.output or str(registry.get_project_dir(args.project) / "design-system.html")
1302
+
1303
+ elif args.input:
1304
+ from token_mapper import map_to_semi_tokens
1305
+
1306
+ with open(args.input) as f:
1307
+ harvest = json.load(f)
1308
+ tokens = map_to_semi_tokens(harvest)
1309
+ meta = harvest.get("meta", {})
1310
+ output_path = args.output or "design-system.html"
1311
+
1312
+ else:
1313
+ print("Error: Specify --project or --input")
1314
+ parser.print_help()
1315
+ sys.exit(1)
1316
+
1317
+ html = generate_doc_html(tokens, harvest, meta)
1318
+
1319
+ with open(output_path, "w") as f:
1320
+ f.write(html)
1321
+ print(f"[OK] Design system doc written to {output_path}")
1322
+
1323
+ if args.open:
1324
+ import webbrowser
1325
+ webbrowser.open(f"file://{os.path.abspath(output_path)}")