codymaster 4.1.4 → 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 (657) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/README.md +54 -84
  3. package/dist/index.js +118 -4
  4. package/install.sh +2 -2
  5. package/package.json +3 -8
  6. package/skills/AGENTS.md +61 -0
  7. package/skills/CLAUDE.md +158 -0
  8. package/skills/boxme-git-config/SKILL.md +56 -0
  9. package/skills/boxme-local-dev/SKILL.md +66 -0
  10. package/skills/build.sh +30 -0
  11. package/skills/cf +314 -0
  12. package/skills/cf 2 +313 -0
  13. package/skills/cm-ads-tracker/SKILL.md +364 -69
  14. package/skills/cm-auto-publisher/SKILL.md +81 -0
  15. package/skills/cm-booking-calendar/SKILL.md +521 -0
  16. package/skills/cm-booking-calendar/references/industry-patterns.md +527 -0
  17. package/skills/cm-booking-calendar/templates/booking-form.css +626 -0
  18. package/skills/cm-booking-calendar/templates/booking-form.html +477 -0
  19. package/skills/cm-booking-calendar/templates/calendar-engine.js +419 -0
  20. package/skills/cm-booking-calendar/templates/calendar-export.js +395 -0
  21. package/skills/cm-booking-calendar/templates/reminder-config.js +629 -0
  22. package/skills/cm-brainstorm-idea/SKILL.md +15 -24
  23. package/skills/cm-clean-code/SKILL.md +300 -0
  24. package/skills/cm-code-review/SKILL.md +0 -27
  25. package/skills/cm-codeintell/SKILL.md +598 -0
  26. package/skills/cm-content-factory/.content-factory-state.json +132 -0
  27. package/skills/cm-content-factory/.git 2/logs/refs/heads/main +1 -0
  28. package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +1 -0
  29. package/skills/cm-content-factory/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
  30. package/skills/cm-content-factory/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
  31. package/skills/cm-content-factory/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
  32. package/skills/cm-content-factory/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
  33. package/skills/cm-content-factory/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
  34. package/skills/cm-content-factory/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
  35. package/skills/cm-content-factory/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
  36. package/skills/cm-content-factory/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
  37. package/skills/cm-content-factory/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
  38. package/skills/cm-content-factory/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
  39. package/skills/cm-content-factory/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
  40. package/skills/cm-content-factory/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
  41. package/skills/cm-content-factory/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
  42. package/skills/cm-content-factory/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
  43. package/skills/cm-content-factory/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
  44. package/skills/cm-content-factory/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
  45. package/skills/cm-content-factory/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
  46. package/skills/cm-content-factory/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
  47. package/skills/cm-content-factory/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
  48. package/skills/cm-content-factory/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
  49. package/skills/cm-content-factory/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
  50. package/skills/cm-content-factory/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
  51. package/skills/cm-content-factory/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
  52. package/skills/cm-content-factory/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
  53. package/skills/cm-content-factory/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
  54. package/skills/cm-content-factory/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
  55. package/skills/cm-content-factory/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
  56. package/skills/cm-content-factory/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
  57. package/skills/cm-content-factory/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
  58. package/skills/cm-content-factory/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
  59. package/skills/cm-content-factory/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
  60. package/skills/cm-content-factory/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
  61. package/skills/cm-content-factory/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
  62. package/skills/cm-content-factory/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
  63. package/skills/cm-content-factory/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
  64. package/skills/cm-content-factory/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
  65. package/skills/cm-content-factory/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
  66. package/skills/cm-content-factory/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
  67. package/skills/cm-content-factory/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
  68. package/skills/cm-content-factory/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
  69. package/skills/cm-content-factory/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
  70. package/skills/cm-content-factory/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
  71. package/skills/cm-content-factory/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
  72. package/skills/cm-content-factory/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +5 -0
  73. package/skills/cm-content-factory/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
  74. package/skills/cm-content-factory/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
  75. package/skills/cm-content-factory/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
  76. package/skills/cm-content-factory/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
  77. package/skills/cm-content-factory/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
  78. package/skills/cm-content-factory/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
  79. package/skills/cm-content-factory/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
  80. package/skills/cm-content-factory/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
  81. package/skills/cm-content-factory/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
  82. package/skills/cm-content-factory/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
  83. package/skills/cm-content-factory/.git 2/refs/heads/main +1 -0
  84. package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +1 -0
  85. package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +76 -0
  86. package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +1 -0
  87. package/skills/cm-content-factory/AGENTS.md +61 -0
  88. package/skills/cm-content-factory/CLAUDE.md +63 -0
  89. package/skills/cm-content-factory/CURSOR.md +43 -0
  90. package/skills/cm-content-factory/Content Factory.zip +0 -0
  91. package/skills/cm-content-factory/cf +313 -0
  92. package/skills/cm-content-factory/config.schema.json +397 -0
  93. package/skills/cm-content-factory/dashboard/app.js +556 -0
  94. package/skills/cm-content-factory/dashboard/index.html +397 -0
  95. package/skills/cm-content-factory/dashboard/style.css +1211 -0
  96. package/skills/cm-content-factory/examples/01-real-estate.config.json +146 -0
  97. package/skills/cm-content-factory/examples/02-personal-finance.config.json +146 -0
  98. package/skills/cm-content-factory/examples/03-health-wellness.config.json +147 -0
  99. package/skills/cm-content-factory/examples/04-saas-software.config.json +147 -0
  100. package/skills/cm-content-factory/examples/05-legal-services.config.json +147 -0
  101. package/skills/cm-content-factory/examples/06-insurance.config.json +146 -0
  102. package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +146 -0
  103. package/skills/cm-content-factory/examples/08-online-education.config.json +147 -0
  104. package/skills/cm-content-factory/examples/09-crypto-defi.config.json +147 -0
  105. package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +147 -0
  106. package/skills/cm-content-factory/examples/11-home-services.config.json +146 -0
  107. package/skills/cm-content-factory/examples/12-dental-clinic.config.json +147 -0
  108. package/skills/cm-content-factory/examples/13-pet-care.config.json +147 -0
  109. package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +147 -0
  110. package/skills/cm-content-factory/examples/15-ai-automation.config.json +147 -0
  111. package/skills/cm-content-factory/examples/16-wedding-events.config.json +147 -0
  112. package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +148 -0
  113. package/skills/cm-content-factory/examples/18-cybersecurity.config.json +147 -0
  114. package/skills/cm-content-factory/examples/19-food-restaurant.config.json +148 -0
  115. package/skills/cm-content-factory/examples/20-solar-energy.config.json +147 -0
  116. package/skills/cm-content-factory/examples/fitness-blog.config.json +116 -0
  117. package/skills/cm-content-factory/examples/tech-blog.config.json +107 -0
  118. package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +72 -0
  119. package/skills/cm-content-factory/extensions/hooks.py +126 -0
  120. package/skills/cm-content-factory/extensions/openclaw_adapter.py +132 -0
  121. package/skills/cm-content-factory/landing/index.html +680 -0
  122. package/skills/cm-content-factory/landing/script.js +101 -0
  123. package/skills/cm-content-factory/landing/style.css +1216 -0
  124. package/skills/cm-content-factory/landing/translations.js +508 -0
  125. package/skills/cm-content-factory/logs/events.jsonl +11 -0
  126. package/skills/cm-content-factory/profiles/_template.profile.json +231 -0
  127. package/skills/cm-content-factory/profiles/finance.profile.json +278 -0
  128. package/skills/cm-content-factory/profiles/legal.profile.json +263 -0
  129. package/skills/cm-content-factory/profiles/medical-research.profile.json +321 -0
  130. package/skills/cm-content-factory/profiles/technology.profile.json +275 -0
  131. package/skills/cm-content-factory/scripts/agent_dispatcher.py +266 -0
  132. package/skills/cm-content-factory/scripts/audit.py +106 -0
  133. package/skills/cm-content-factory/scripts/dashboard_server.py +225 -0
  134. package/skills/cm-content-factory/scripts/deploy.py +146 -0
  135. package/skills/cm-content-factory/scripts/extract.py +132 -0
  136. package/skills/cm-content-factory/scripts/landing_generator.py +459 -0
  137. package/skills/cm-content-factory/scripts/memory.py +521 -0
  138. package/skills/cm-content-factory/scripts/monetize.py +239 -0
  139. package/skills/cm-content-factory/scripts/pipeline.py +357 -0
  140. package/skills/cm-content-factory/scripts/plan.py +163 -0
  141. package/skills/cm-content-factory/scripts/publish.py +145 -0
  142. package/skills/cm-content-factory/scripts/research.py +337 -0
  143. package/skills/cm-content-factory/scripts/scaffold.py +464 -0
  144. package/skills/cm-content-factory/scripts/scoreboard.py +336 -0
  145. package/skills/cm-content-factory/scripts/seo.py +90 -0
  146. package/skills/cm-content-factory/scripts/state_manager.py +320 -0
  147. package/skills/cm-content-factory/scripts/token_manager.py +268 -0
  148. package/skills/cm-content-factory/scripts/validate.py +221 -0
  149. package/skills/cm-content-factory/scripts/wizard.py +329 -0
  150. package/skills/cm-content-factory/scripts/write.py +93 -0
  151. package/skills/cm-content-factory/sites/docs-site/src/assets/houston.webp +0 -0
  152. package/skills/cm-content-factory/sites/docs-site/src/content/docs/architecture.md +90 -0
  153. package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +54 -0
  154. package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +38 -0
  155. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +65 -0
  156. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +48 -0
  157. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +39 -0
  158. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +42 -0
  159. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +51 -0
  160. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +52 -0
  161. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +86 -0
  162. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +80 -0
  163. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +58 -0
  164. package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +102 -0
  165. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +45 -0
  166. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +29 -0
  167. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +55 -0
  168. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +29 -0
  169. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +41 -0
  170. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +40 -0
  171. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +56 -0
  172. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +46 -0
  173. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +45 -0
  174. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +45 -0
  175. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +108 -0
  176. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +22 -0
  177. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +52 -0
  178. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +58 -0
  179. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +92 -0
  180. package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +575 -0
  181. package/skills/cm-content-factory/tests/conftest.py +66 -0
  182. package/skills/cm-content-factory/tests/test_agent_dispatcher.py +125 -0
  183. package/skills/cm-content-factory/tests/test_memory.py +128 -0
  184. package/skills/cm-content-factory/tests/test_pipeline.py +107 -0
  185. package/skills/cm-content-factory/tests/test_research.py +56 -0
  186. package/skills/cm-content-factory/tests/test_state_manager.py +131 -0
  187. package/skills/cm-content-factory/tests/test_token_manager.py +110 -0
  188. package/skills/cm-content-factory/tests/test_wizard.py +121 -0
  189. package/skills/cm-continuity/SKILL.md +7 -0
  190. package/skills/cm-cro-methodology/SKILL.md +290 -0
  191. package/skills/cm-dashboard/SKILL.md +7 -525
  192. package/skills/cm-debugging/SKILL.md +7 -116
  193. package/skills/cm-deep-search/SKILL.md +5 -1
  194. package/skills/cm-dockit/README.md +6 -15
  195. package/skills/cm-dockit/SKILL.md +20 -37
  196. package/skills/cm-execution/SKILL.md +6 -1
  197. package/skills/cm-frappe-agent/SKILL.md +134 -0
  198. package/skills/cm-frappe-agent/agents/doctype-architect.md +596 -0
  199. package/skills/cm-frappe-agent/agents/erpnext-customizer.md +643 -0
  200. package/skills/cm-frappe-agent/agents/frappe-backend.md +814 -0
  201. package/skills/cm-frappe-agent/agents/frappe-custom-frontend.md +557 -0
  202. package/skills/cm-frappe-agent/agents/frappe-debugger.md +625 -0
  203. package/skills/cm-frappe-agent/agents/frappe-fixer.md +275 -0
  204. package/skills/cm-frappe-agent/agents/frappe-frontend.md +660 -0
  205. package/skills/cm-frappe-agent/agents/frappe-installer.md +158 -0
  206. package/skills/cm-frappe-agent/agents/frappe-performance.md +307 -0
  207. package/skills/cm-frappe-agent/agents/frappe-planner.md +419 -0
  208. package/skills/cm-frappe-agent/agents/frappe-remote-ops.md +153 -0
  209. package/skills/cm-frappe-agent/agents/github-workflow.md +286 -0
  210. package/skills/cm-frappe-agent/commands/frappe-app.md +351 -0
  211. package/skills/cm-frappe-agent/commands/frappe-backend.md +162 -0
  212. package/skills/cm-frappe-agent/commands/frappe-bench.md +254 -0
  213. package/skills/cm-frappe-agent/commands/frappe-debug.md +263 -0
  214. package/skills/cm-frappe-agent/commands/frappe-doctype-create.md +272 -0
  215. package/skills/cm-frappe-agent/commands/frappe-doctype-field.md +310 -0
  216. package/skills/cm-frappe-agent/commands/frappe-erpnext.md +210 -0
  217. package/skills/cm-frappe-agent/commands/frappe-fix.md +59 -0
  218. package/skills/cm-frappe-agent/commands/frappe-frontend.md +210 -0
  219. package/skills/cm-frappe-agent/commands/frappe-fullstack.md +243 -0
  220. package/skills/cm-frappe-agent/commands/frappe-github.md +57 -0
  221. package/skills/cm-frappe-agent/commands/frappe-install.md +52 -0
  222. package/skills/cm-frappe-agent/commands/frappe-plan.md +442 -0
  223. package/skills/cm-frappe-agent/commands/frappe-remote.md +58 -0
  224. package/skills/cm-frappe-agent/commands/frappe-test.md +356 -0
  225. package/skills/cm-frappe-agent/docs/README.md +51 -0
  226. package/skills/cm-frappe-agent/docs/agents-catalog.md +113 -0
  227. package/skills/cm-frappe-agent/docs/architecture.md +149 -0
  228. package/skills/cm-frappe-agent/docs/commands-catalog.md +82 -0
  229. package/skills/cm-frappe-agent/docs/resources-catalog.md +66 -0
  230. package/skills/cm-frappe-agent/docs/sitemap-urls.txt +52 -0
  231. package/skills/cm-frappe-agent/docs/sitemap.md +81 -0
  232. package/skills/cm-frappe-agent/docs/sop/user-guide.md +178 -0
  233. package/skills/cm-frappe-agent/docs/sop/vibe-coding-guide.md +122 -0
  234. package/skills/cm-frappe-agent/resources/7-layer-architecture.md +985 -0
  235. package/skills/cm-frappe-agent/resources/bench_commands.md +73 -0
  236. package/skills/cm-frappe-agent/resources/code-patterns-guide.md +948 -0
  237. package/skills/cm-frappe-agent/resources/common_pitfalls.md +266 -0
  238. package/skills/cm-frappe-agent/resources/doctype-registry.md +158 -0
  239. package/skills/cm-frappe-agent/resources/installation-guide.md +289 -0
  240. package/skills/cm-frappe-agent/resources/rest-api-patterns.md +182 -0
  241. package/skills/cm-frappe-agent/resources/scaffold_checklist.md +82 -0
  242. package/skills/cm-frappe-agent/resources/upgrade_patterns.md +113 -0
  243. package/skills/cm-frappe-agent/resources/web-form-patterns.md +252 -0
  244. package/skills/cm-frappe-agent/skills/bench-commands/SKILL.md +621 -0
  245. package/skills/cm-frappe-agent/skills/client-scripts/SKILL.md +642 -0
  246. package/skills/cm-frappe-agent/skills/doctype-patterns/SKILL.md +576 -0
  247. package/skills/cm-frappe-agent/skills/frappe-api/SKILL.md +740 -0
  248. package/skills/cm-frappe-agent/skills/remote-operations/SKILL.md +47 -0
  249. package/skills/cm-frappe-agent/skills/server-scripts/SKILL.md +608 -0
  250. package/skills/cm-frappe-agent/skills/web-forms/SKILL.md +46 -0
  251. package/skills/cm-git-worktrees/SKILL.md +0 -7
  252. package/skills/cm-google-form/SKILL.md +266 -0
  253. package/skills/cm-google-form/templates/apps-script.js +55 -0
  254. package/skills/cm-google-form/templates/form-markup.html +110 -0
  255. package/skills/cm-google-form/templates/form-submit.js +201 -0
  256. package/skills/cm-google-form/templates/toast.css +152 -0
  257. package/skills/cm-growth-hacking/SKILL.md +293 -0
  258. package/skills/cm-growth-hacking/bottom-sheet-engine.md +261 -0
  259. package/skills/cm-growth-hacking/calendar-integration.md +264 -0
  260. package/skills/cm-growth-hacking/references/engagement-patterns.md +346 -0
  261. package/skills/cm-growth-hacking/templates/bottom-sheet.css +528 -0
  262. package/skills/cm-growth-hacking/templates/bottom-sheet.js +269 -0
  263. package/skills/cm-growth-hacking/templates/calendar-cta.js +213 -0
  264. package/skills/cm-growth-hacking/templates/tracking-events.js +211 -0
  265. package/skills/cm-growth-hacking/templates/trigger-manager.js +254 -0
  266. package/skills/cm-growth-hacking/tracking-events.md +246 -0
  267. package/skills/cm-growth-hacking/trigger-system.md +342 -0
  268. package/skills/cm-how-it-work/SKILL.md +20 -4
  269. package/skills/cm-identity-guard/SKILL.md +0 -11
  270. package/skills/cm-jtbd/SKILL.md +1 -1
  271. package/skills/cm-notebooklm/SKILL.md +172 -0
  272. package/skills/cm-notebooklm/references/command_reference.md +94 -0
  273. package/skills/cm-notebooklm/references/workflows.md +60 -0
  274. package/skills/cm-notebooklm/resources/knowledge_sources.md +106 -0
  275. package/skills/cm-notebooklm/scripts/brain-sync.sh +453 -0
  276. package/skills/cm-notebooklm/scripts/graduate_wisdom.py +101 -0
  277. package/skills/cm-planning/SKILL.md +39 -52
  278. package/skills/cm-project-bootstrap/SKILL.md +1307 -99
  279. package/skills/cm-quality-gate/SKILL.md +13 -106
  280. package/skills/cm-reactor/SKILL.md +274 -0
  281. package/skills/cm-safe-deploy/SKILL.md +415 -52
  282. package/skills/cm-safe-i18n/SKILL.md +1 -22
  283. package/skills/cm-secret-shield/SKILL.md +2 -2
  284. package/skills/cm-security-gate/SKILL.md +114 -0
  285. package/skills/cm-skill-chain/SKILL.md +2 -2
  286. package/skills/cm-skill-index/SKILL.md +9 -6
  287. package/skills/cm-skill-mastery/SKILL.md +2 -15
  288. package/skills/cm-start/SKILL.md +9 -0
  289. package/skills/cm-tdd/SKILL.md +16 -49
  290. package/skills/cm-ui-preview/SKILL.md +35 -173
  291. package/skills/cm-ux-master/FEATURES-v4.md +305 -0
  292. package/skills/cm-ux-master/README-ru.md +135 -0
  293. package/skills/cm-ux-master/README-vi.md +135 -0
  294. package/skills/cm-ux-master/README-zh.md +135 -0
  295. package/skills/cm-ux-master/README.md +489 -0
  296. package/skills/cm-ux-master/SKILL.md +773 -62
  297. package/skills/cm-ux-master/cli/README.md +180 -0
  298. package/skills/cm-ux-master/cli/pyproject.toml +106 -0
  299. package/skills/cm-ux-master/cli/requirements.txt +21 -0
  300. package/skills/cm-ux-master/cli/templates/base/skill-core.md +262 -0
  301. package/skills/cm-ux-master/cli/templates/platforms/claude.yaml +21 -0
  302. package/skills/cm-ux-master/cli/templates/platforms/cursor.yaml +21 -0
  303. package/skills/cm-ux-master/cli/templates/platforms/figma.yaml +24 -0
  304. package/skills/cm-ux-master/cli/templates/platforms/vscode-mcp.yaml +28 -0
  305. package/skills/cm-ux-master/cli/templates/platforms/windsurf.yaml +21 -0
  306. package/skills/cm-ux-master/cli/uxmaster/__init__.py +10 -0
  307. package/skills/cm-ux-master/cli/uxmaster/__main__.py +19 -0
  308. package/skills/cm-ux-master/cli/uxmaster/cli.py +349 -0
  309. package/skills/cm-ux-master/cli/uxmaster/commands/__init__.py +8 -0
  310. package/skills/cm-ux-master/cli/uxmaster/commands/extract.py +18 -0
  311. package/skills/cm-ux-master/cli/uxmaster/commands/init.py +58 -0
  312. package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +194 -0
  313. package/skills/cm-ux-master/cli/uxmaster/commands/search.py +23 -0
  314. package/skills/cm-ux-master/cli/uxmaster/commands/validate.py +270 -0
  315. package/skills/cm-ux-master/cli/uxmaster/search_engine.py +532 -0
  316. package/skills/cm-ux-master/cli/uxmaster/template_engine.py +458 -0
  317. package/skills/cm-ux-master/cli/uxmaster/utils/__init__.py +9 -0
  318. package/skills/cm-ux-master/cli/uxmaster/utils/console.py +42 -0
  319. package/skills/cm-ux-master/cli/uxmaster/utils/detect.py +83 -0
  320. package/skills/cm-ux-master/data/accessibility-advanced.csv +26 -0
  321. package/skills/cm-ux-master/data/animation.csv +31 -0
  322. package/skills/cm-ux-master/data/charts.csv +26 -0
  323. package/skills/cm-ux-master/data/colors.csv +97 -0
  324. package/skills/cm-ux-master/data/design-tests.csv +37 -0
  325. package/skills/cm-ux-master/data/devices.csv +21 -0
  326. package/skills/cm-ux-master/data/icons.csv +101 -0
  327. package/skills/cm-ux-master/data/landing.csv +31 -0
  328. package/skills/cm-ux-master/data/products.csv +97 -0
  329. package/skills/cm-ux-master/data/react-performance.csv +45 -0
  330. package/skills/cm-ux-master/data/responsive.csv +26 -0
  331. package/skills/cm-ux-master/data/semi-tokens.csv +52 -0
  332. package/skills/cm-ux-master/data/stacks/angular.csv +34 -0
  333. package/skills/cm-ux-master/data/stacks/astro.csv +54 -0
  334. package/skills/cm-ux-master/data/stacks/electron.csv +32 -0
  335. package/skills/cm-ux-master/data/stacks/flutter.csv +53 -0
  336. package/skills/cm-ux-master/data/stacks/html-tailwind.csv +56 -0
  337. package/skills/cm-ux-master/data/stacks/htmx.csv +28 -0
  338. package/skills/cm-ux-master/data/stacks/jetpack-compose.csv +53 -0
  339. package/skills/cm-ux-master/data/stacks/nextjs.csv +53 -0
  340. package/skills/cm-ux-master/data/stacks/nuxt-ui.csv +51 -0
  341. package/skills/cm-ux-master/data/stacks/nuxtjs.csv +59 -0
  342. package/skills/cm-ux-master/data/stacks/react-native.csv +52 -0
  343. package/skills/cm-ux-master/data/stacks/react.csv +54 -0
  344. package/skills/cm-ux-master/data/stacks/shadcn.csv +61 -0
  345. package/skills/cm-ux-master/data/stacks/svelte.csv +54 -0
  346. package/skills/cm-ux-master/data/stacks/swiftui.csv +51 -0
  347. package/skills/cm-ux-master/data/stacks/tauri.csv +29 -0
  348. package/skills/cm-ux-master/data/stacks/vue.csv +50 -0
  349. package/skills/cm-ux-master/data/styles.csv +68 -0
  350. package/skills/cm-ux-master/data/typography.csv +58 -0
  351. package/skills/cm-ux-master/data/ui-reasoning.csv +101 -0
  352. package/skills/cm-ux-master/data/ux-guidelines.csv +100 -0
  353. package/skills/cm-ux-master/data/ux-laws.csv +49 -0
  354. package/skills/cm-ux-master/data/web-interface.csv +31 -0
  355. package/skills/cm-ux-master/docs/LANDING-PAGE.html +377 -0
  356. package/skills/cm-ux-master/docs/README.md +108 -0
  357. package/skills/cm-ux-master/docs/css/styles.css +573 -0
  358. package/skills/cm-ux-master/docs/examples/demo-script.md +319 -0
  359. package/skills/cm-ux-master/docs/guides/for-designers.md +692 -0
  360. package/skills/cm-ux-master/docs/guides/for-developers.md +778 -0
  361. package/skills/cm-ux-master/docs/guides/for-product-managers.md +693 -0
  362. package/skills/cm-ux-master/docs/guides/react-guide-vi.md +50 -0
  363. package/skills/cm-ux-master/docs/index.html +1062 -0
  364. package/skills/cm-ux-master/docs/js/i18n.js +84 -0
  365. package/skills/cm-ux-master/docs/js/lang/de.js +145 -0
  366. package/skills/cm-ux-master/docs/js/lang/en.js +145 -0
  367. package/skills/cm-ux-master/docs/js/lang/fr.js +145 -0
  368. package/skills/cm-ux-master/docs/js/lang/hi.js +145 -0
  369. package/skills/cm-ux-master/docs/js/lang/id.js +145 -0
  370. package/skills/cm-ux-master/docs/js/lang/ja.js +145 -0
  371. package/skills/cm-ux-master/docs/js/lang/ko.js +145 -0
  372. package/skills/cm-ux-master/docs/js/lang/ru.js +145 -0
  373. package/skills/cm-ux-master/docs/js/lang/vi.js +145 -0
  374. package/skills/cm-ux-master/docs/js/lang/zh.js +145 -0
  375. package/skills/cm-ux-master/docs/js/main.js +117 -0
  376. package/skills/cm-ux-master/docs/plan/PHASE1-COMPLETION.md +217 -0
  377. package/skills/cm-ux-master/docs/plan/PHASE2-COMPLETION.md +199 -0
  378. package/skills/cm-ux-master/docs/plan/PHASE2-ENHANCED-COMPLETION.md +352 -0
  379. package/skills/cm-ux-master/docs/plan/PHASE3-VALIDATION-COMPLETION.md +499 -0
  380. package/skills/cm-ux-master/docs/plan/PHASE4-TESTING-POLISH-COMPLETION.md +483 -0
  381. package/skills/cm-ux-master/docs/plan/UXM-2.0-ROADMAP.md +681 -0
  382. package/skills/cm-ux-master/docs/plan/WOW-PITCH.md +410 -0
  383. package/skills/cm-ux-master/docs/technical/api-reference.md +824 -0
  384. package/skills/cm-ux-master/docs/technical/harvester-v4.md +328 -0
  385. package/skills/cm-ux-master/docs/technical/how-it-works.md +1128 -0
  386. package/skills/cm-ux-master/docs/tutorials/quickstart.md +339 -0
  387. package/skills/cm-ux-master/docs/tutorials/tutorials.md +939 -0
  388. package/skills/cm-ux-master/docs/tutorials/user-guide.md +716 -0
  389. package/skills/cm-ux-master/examples/README.md +63 -0
  390. package/skills/cm-ux-master/mcp/__init__.py +3 -0
  391. package/skills/cm-ux-master/mcp/integrations/__init__.py +11 -0
  392. package/skills/cm-ux-master/mcp/integrations/figma/__init__.py +6 -0
  393. package/skills/cm-ux-master/mcp/integrations/figma/client.py +293 -0
  394. package/skills/cm-ux-master/mcp/integrations/figma/plugin/code.js +561 -0
  395. package/skills/cm-ux-master/mcp/integrations/figma/plugin/ui.html +334 -0
  396. package/skills/cm-ux-master/mcp/integrations/stitch/__init__.py +5 -0
  397. package/skills/cm-ux-master/mcp/integrations/stitch/client.py +410 -0
  398. package/skills/cm-ux-master/mcp/integrations/vscode/package.json +167 -0
  399. package/skills/cm-ux-master/mcp/integrations/vscode/src/extension.ts +81 -0
  400. package/skills/cm-ux-master/mcp/mcp-config.json +274 -0
  401. package/skills/cm-ux-master/mcp/server.py +771 -0
  402. package/skills/cm-ux-master/mcp/tools/__init__.py +13 -0
  403. package/skills/cm-ux-master/mcp-server/server.py +595 -0
  404. package/skills/cm-ux-master/output/fila/FilaDashboard.tsx +47 -0
  405. package/skills/cm-ux-master/output/fila/components/badge/component.tsx +35 -0
  406. package/skills/cm-ux-master/output/fila/components/badge/index.ts +1 -0
  407. package/skills/cm-ux-master/output/fila/components/button/component.tsx +53 -0
  408. package/skills/cm-ux-master/output/fila/components/button/index.ts +1 -0
  409. package/skills/cm-ux-master/output/fila/components/card/component.tsx +35 -0
  410. package/skills/cm-ux-master/output/fila/components/card/index.ts +1 -0
  411. package/skills/cm-ux-master/output/fila/components/input/component.tsx +41 -0
  412. package/skills/cm-ux-master/output/fila/components/input/index.ts +1 -0
  413. package/skills/cm-ux-master/output/fila/design-system.css +151 -0
  414. package/skills/cm-ux-master/output/fila/design-system.html +1596 -0
  415. package/skills/cm-ux-master/output/fila/design-system.json +168 -0
  416. package/skills/cm-ux-master/output/fila/figma-tokens.json +523 -0
  417. package/skills/cm-ux-master/output/fila/harvest-v4-raw.json +406 -0
  418. package/skills/cm-ux-master/output/fila/semi-theme-override.css +95 -0
  419. package/skills/cm-ux-master/output/haravan/HaravanDashboard.tsx +103 -0
  420. package/skills/cm-ux-master/output/haravan/design-system-v3-live.html +2716 -0
  421. package/skills/cm-ux-master/output/haravan/design-system-v3.html +1770 -0
  422. package/skills/cm-ux-master/output/haravan/design-system.html +914 -0
  423. package/skills/cm-ux-master/output/haravan/figma-tokens.json +84 -0
  424. package/skills/cm-ux-master/output/haravan/haravan-harvest.json +33 -0
  425. package/skills/cm-ux-master/output/haravan/harvest-v3-raw.json +167 -0
  426. package/skills/cm-ux-master/output/haravan/semi-theme-override.css +39 -0
  427. package/skills/cm-ux-master/references/audit-template.md +257 -0
  428. package/skills/cm-ux-master/references/cultural-ux.md +346 -0
  429. package/skills/cm-ux-master/references/dark-patterns.md +362 -0
  430. package/skills/cm-ux-master/references/heuristic-conflicts.md +296 -0
  431. package/skills/cm-ux-master/references/krug-principles.md +289 -0
  432. package/skills/cm-ux-master/references/nielsen-heuristics.md +360 -0
  433. package/skills/cm-ux-master/references/wcag-checklist.md +306 -0
  434. package/skills/cm-ux-master/scripts/component_generator.py +631 -0
  435. package/skills/cm-ux-master/scripts/core.py +305 -0
  436. package/skills/cm-ux-master/scripts/demo_validation.py +452 -0
  437. package/skills/cm-ux-master/scripts/design_doc_generator.py +1325 -0
  438. package/skills/cm-ux-master/scripts/design_system.py +1141 -0
  439. package/skills/cm-ux-master/scripts/design_system_indexer.py +889 -0
  440. package/skills/cm-ux-master/scripts/extract_i18n.py +251 -0
  441. package/skills/cm-ux-master/scripts/extractor.py +1437 -0
  442. package/skills/cm-ux-master/scripts/figma_bridge.py +406 -0
  443. package/skills/cm-ux-master/scripts/generate.py +147 -0
  444. package/skills/cm-ux-master/scripts/harvest_session.py +207 -0
  445. package/skills/cm-ux-master/scripts/harvester.js +240 -0
  446. package/skills/cm-ux-master/scripts/harvester_browser.py +717 -0
  447. package/skills/cm-ux-master/scripts/harvester_cli.py +431 -0
  448. package/skills/cm-ux-master/scripts/harvester_v1.js +275 -0
  449. package/skills/cm-ux-master/scripts/harvester_v3.js +620 -0
  450. package/skills/cm-ux-master/scripts/harvester_v4.js +1003 -0
  451. package/skills/cm-ux-master/scripts/install.py +528 -0
  452. package/skills/cm-ux-master/scripts/license.py +81 -0
  453. package/skills/cm-ux-master/scripts/media/qrpayment.png +0 -0
  454. package/skills/cm-ux-master/scripts/pro_stubs.py +120 -0
  455. package/skills/cm-ux-master/scripts/project_registry.py +217 -0
  456. package/skills/cm-ux-master/scripts/search.py +114 -0
  457. package/skills/cm-ux-master/scripts/semi_mcp_bridge.py +425 -0
  458. package/skills/cm-ux-master/scripts/stitch_integration.py +583 -0
  459. package/skills/cm-ux-master/scripts/test_harvester_v4.py +335 -0
  460. package/skills/cm-ux-master/scripts/token_mapper.py +626 -0
  461. package/skills/cm-ux-master/scripts/validation_engine.py +1571 -0
  462. package/skills/cm-ux-master/scripts/wizard.py +653 -0
  463. package/skills/cm-ux-master/setup.py +93 -0
  464. package/skills/cm-ux-master/templates/base/flutter-widget.dart +69 -0
  465. package/skills/cm-ux-master/templates/base/html-page.html +152 -0
  466. package/skills/cm-ux-master/templates/base/react-component.tsx +47 -0
  467. package/skills/cm-ux-master/templates/base/swiftui-view.swift +62 -0
  468. package/skills/cm-ux-master/templates/quick-start.sh +176 -0
  469. package/skills/cm-ux-master/tests/automation/batch-validate.sh +250 -0
  470. package/skills/cm-ux-master/tests/automation/generate-test-projects.sh +561 -0
  471. package/skills/cm-ux-master/tests/automation/run-all-tests.sh +315 -0
  472. package/skills/cm-ux-master/tests/test_design_doc.py +145 -0
  473. package/skills/cm-ux-master/tests/test_devices.py +74 -0
  474. package/skills/cm-ux-master/tests/test_generator.py +116 -0
  475. package/skills/cm-ux-master/tests/test_harvest_session.py +131 -0
  476. package/skills/cm-ux-master/tests/test_harvester.py +127 -0
  477. package/skills/cm-ux-master/tests/test_harvester_v3.py +324 -0
  478. package/skills/cm-ux-master/tests/test_mcp_server.py +496 -0
  479. package/skills/cm-ux-master/tests/test_new_domains.py +108 -0
  480. package/skills/cm-ux-master/tests/test_new_stacks.py +103 -0
  481. package/skills/cm-ux-master/tests/test_project_registry.py +146 -0
  482. package/skills/cm-ux-master/tests/test_semi_mcp_bridge.py +207 -0
  483. package/skills/cm-ux-master/tests/test_token_mapper.py +247 -0
  484. package/skills/cm-ux-master/tests/test_validation_engine.py +617 -0
  485. package/skills/config.schema.json +397 -0
  486. package/skills/frappe-app-builder.zip +0 -0
  487. package/skills/jobs-to-be-done/SKILL.md +266 -0
  488. package/skills/jobs-to-be-done/references/case-studies.md +154 -0
  489. package/skills/jobs-to-be-done/references/competitive-strategy.md +280 -0
  490. package/skills/jobs-to-be-done/references/diagnostics.md +158 -0
  491. package/skills/jobs-to-be-done/references/innovation-process.md +392 -0
  492. package/skills/jobs-to-be-done/references/organizational-change.md +328 -0
  493. package/skills/marketplace-report-crawler/SKILL.md +176 -0
  494. package/skills/marketplace-report-crawler/config/accounts.json +41 -0
  495. package/skills/marketplace-report-crawler/config/report-types.json +422 -0
  496. package/skills/marketplace-report-crawler/config/sessions.json +3 -0
  497. package/skills/marketplace-report-crawler/scripts/ab-wrapper.sh +102 -0
  498. package/skills/marketplace-report-crawler/scripts/browser-actions/lazada/lazada-actions.js +114 -0
  499. package/skills/marketplace-report-crawler/scripts/browser-actions/shopee/shopee-actions.js +94 -0
  500. package/skills/marketplace-report-crawler/scripts/browser-actions/tiktok/tiktok-actions.js +272 -0
  501. package/skills/marketplace-report-crawler/scripts/crawl-runner.js +281 -0
  502. package/skills/marketplace-report-crawler/scripts/session-check.sh +72 -0
  503. package/skills/marketplace-report-crawler/scripts/session-manager.sh +349 -0
  504. package/skills/marketplace-report-crawler/scripts/setup-folders.sh +83 -0
  505. package/skills/medical-research/SKILL.md +194 -0
  506. package/skills/medical-research/scripts/evidence_checker.py +288 -0
  507. package/skills/mom-test/SKILL.md +267 -0
  508. package/skills/mom-test/references/avoiding-bad-data.md +221 -0
  509. package/skills/mom-test/references/case-studies.md +306 -0
  510. package/skills/mom-test/references/commitment-advancement.md +219 -0
  511. package/skills/mom-test/references/finding-conversations.md +251 -0
  512. package/skills/mom-test/references/processing-learning.md +256 -0
  513. package/skills/mom-test/references/question-patterns.md +198 -0
  514. package/skills/pandasai-analytics/SKILL.md +251 -0
  515. package/skills/release-it/SKILL.md +235 -0
  516. package/skills/release-it/references/anti-patterns.md +279 -0
  517. package/skills/release-it/references/capacity-planning.md +285 -0
  518. package/skills/release-it/references/chaos-engineering.md +325 -0
  519. package/skills/release-it/references/deployment-strategies.md +331 -0
  520. package/skills/release-it/references/observability.md +301 -0
  521. package/skills/release-it/references/stability-patterns.md +355 -0
  522. package/skills/scripts/sync-ide-skills.sh +61 -0
  523. package/skills/skill-creator-ultra/.agents/workflows/skill-audit.md +37 -0
  524. package/skills/skill-creator-ultra/.agents/workflows/skill-compare.md +34 -0
  525. package/skills/skill-creator-ultra/.agents/workflows/skill-export.md +51 -0
  526. package/skills/skill-creator-ultra/.agents/workflows/skill-generate.md +39 -0
  527. package/skills/skill-creator-ultra/.agents/workflows/skill-scaffold.md +52 -0
  528. package/skills/skill-creator-ultra/.agents/workflows/skill-simulate.md +25 -0
  529. package/skills/skill-creator-ultra/.agents/workflows/skill-stats.md +31 -0
  530. package/skills/skill-creator-ultra/.agents/workflows/skill-validate.md +25 -0
  531. package/skills/skill-creator-ultra/README.md +1242 -0
  532. package/skills/skill-creator-ultra/SKILL.md +388 -0
  533. package/skills/skill-creator-ultra/agents/analyzer.md +274 -0
  534. package/skills/skill-creator-ultra/agents/comparator.md +202 -0
  535. package/skills/skill-creator-ultra/agents/grader.md +223 -0
  536. package/skills/skill-creator-ultra/assets/eval_review.html +146 -0
  537. package/skills/skill-creator-ultra/eval-viewer/generate_review.py +471 -0
  538. package/skills/skill-creator-ultra/eval-viewer/viewer.html +1325 -0
  539. package/skills/skill-creator-ultra/examples/example_anthropic_frontend.md +109 -0
  540. package/skills/skill-creator-ultra/examples/example_anthropic_pdf.md +116 -0
  541. package/skills/skill-creator-ultra/examples/example_api_docs.md +189 -0
  542. package/skills/skill-creator-ultra/examples/example_db_migration.md +253 -0
  543. package/skills/skill-creator-ultra/examples/example_git_commit.md +111 -0
  544. package/skills/skill-creator-ultra/install.ps1 +289 -0
  545. package/skills/skill-creator-ultra/install.sh +313 -0
  546. package/skills/skill-creator-ultra/phases/phase1_interview.md +202 -0
  547. package/skills/skill-creator-ultra/phases/phase2_extract.md +55 -0
  548. package/skills/skill-creator-ultra/phases/phase3_detect.md +57 -0
  549. package/skills/skill-creator-ultra/phases/phase4_generate.md +543 -0
  550. package/skills/skill-creator-ultra/phases/phase5_test.md +319 -0
  551. package/skills/skill-creator-ultra/phases/phase6_eval.md +301 -0
  552. package/skills/skill-creator-ultra/phases/phase7_iterate.md +103 -0
  553. package/skills/skill-creator-ultra/phases/phase8_optimize.md +113 -0
  554. package/skills/skill-creator-ultra/resources/advanced_patterns.md +499 -0
  555. package/skills/skill-creator-ultra/resources/anti_patterns.md +376 -0
  556. package/skills/skill-creator-ultra/resources/blueprints.md +498 -0
  557. package/skills/skill-creator-ultra/resources/checklist.md +243 -0
  558. package/skills/skill-creator-ultra/resources/composition_cookbook.md +291 -0
  559. package/skills/skill-creator-ultra/resources/description_optimization.md +90 -0
  560. package/skills/skill-creator-ultra/resources/eval_guide.md +133 -0
  561. package/skills/skill-creator-ultra/resources/industry_questions.md +189 -0
  562. package/skills/skill-creator-ultra/resources/interview_questions.md +200 -0
  563. package/skills/skill-creator-ultra/resources/pattern_detection.md +200 -0
  564. package/skills/skill-creator-ultra/resources/prompt_engineering.md +531 -0
  565. package/skills/skill-creator-ultra/resources/schemas.md +430 -0
  566. package/skills/skill-creator-ultra/resources/script_integration.md +593 -0
  567. package/skills/skill-creator-ultra/resources/scripts_guide.md +339 -0
  568. package/skills/skill-creator-ultra/resources/skill_template.md +124 -0
  569. package/skills/skill-creator-ultra/resources/skill_writing_guide.md +634 -0
  570. package/skills/skill-creator-ultra/resources/versioning_guide.md +193 -0
  571. package/skills/skill-creator-ultra/scripts/ci_eval.py +200 -0
  572. package/skills/skill-creator-ultra/scripts/package_skill.py +165 -0
  573. package/skills/skill-creator-ultra/scripts/simulate_skill.py +398 -0
  574. package/skills/skill-creator-ultra/scripts/skill_audit.py +611 -0
  575. package/skills/skill-creator-ultra/scripts/skill_compare.py +265 -0
  576. package/skills/skill-creator-ultra/scripts/skill_export.py +334 -0
  577. package/skills/skill-creator-ultra/scripts/skill_scaffold.py +403 -0
  578. package/skills/skill-creator-ultra/scripts/skill_stats.py +339 -0
  579. package/skills/skill-creator-ultra/scripts/validate_skill.py +411 -0
  580. package/skills/tailwind-mastery/SKILL.md +229 -0
  581. package/skills/vercel-react-best-practices/AGENTS.md +3373 -0
  582. package/skills/vercel-react-best-practices/README.md +123 -0
  583. package/skills/vercel-react-best-practices/SKILL.md +143 -0
  584. package/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  585. package/skills/vercel-react-best-practices/rules/_template.md +28 -0
  586. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  587. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  588. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  589. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  590. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  591. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  592. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  593. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  594. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  595. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  596. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  597. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  598. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  599. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  600. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  601. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  602. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  603. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  604. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  605. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  606. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  607. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  608. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  609. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  610. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  611. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  612. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  613. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  614. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  615. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  616. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  617. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  618. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  619. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  620. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  621. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  622. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  623. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  624. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  625. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  626. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  627. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  628. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  629. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  630. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  631. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  632. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  633. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  634. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  635. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  636. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  637. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  638. package/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  639. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  640. package/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  641. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  642. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  643. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  644. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  645. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  646. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  647. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +142 -0
  648. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  649. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  650. package/skills/web-design-guidelines/SKILL.md +39 -0
  651. package/skills/cro-methodology/SKILL.md +0 -98
  652. /package/skills/{cro-methodology → cm-cro-methodology}/references/COPYWRITING.md +0 -0
  653. /package/skills/{cro-methodology → cm-cro-methodology}/references/OBJECTIONS.md +0 -0
  654. /package/skills/{cro-methodology → cm-cro-methodology}/references/PERSUASION.md +0 -0
  655. /package/skills/{cro-methodology → cm-cro-methodology}/references/RESEARCH.md +0 -0
  656. /package/skills/{cro-methodology → cm-cro-methodology}/references/funnel-analysis.md +0 -0
  657. /package/skills/{cro-methodology → cm-cro-methodology}/references/testing-methodology.md +0 -0
@@ -0,0 +1,717 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Harvester v4 — Browser Automation Module
4
+
5
+ Tự động hóa việc mở browser, thu thập design system từ bất kỳ website nào
6
+ và tạo design tokens theo chuẩn Semi Design.
7
+
8
+ Features:
9
+ - Multi-page crawling với recursive extraction
10
+ - Screenshot capture cho visual reference
11
+ - Smart element detection
12
+ - Auto-retry và error handling
13
+ - Parallel processing cho multiple URLs
14
+
15
+ Usage:
16
+ python harvester_browser.py --url https://example.com --output ./output
17
+ python harvester_browser.py --urls urls.txt --crawl --max-pages 10
18
+ python harvester_browser.py --interactive # Interactive mode
19
+
20
+ Author: UX Master AI
21
+ Version: 4.0.0
22
+ """
23
+
24
+ import asyncio
25
+ import json
26
+ import os
27
+ import sys
28
+ import time
29
+ import argparse
30
+ from pathlib import Path
31
+ from typing import List, Dict, Optional, Any
32
+ from dataclasses import dataclass, field, asdict
33
+ from datetime import datetime
34
+ from urllib.parse import urljoin, urlparse
35
+ import hashlib
36
+
37
+ # Optional imports for browser automation
38
+ try:
39
+ from playwright.async_api import async_playwright, Page, Browser, BrowserContext
40
+ PLAYWRIGHT_AVAILABLE = True
41
+ except ImportError:
42
+ PLAYWRIGHT_AVAILABLE = False
43
+ print("[WARN] Playwright not installed. Browser automation disabled.")
44
+ print("[INFO] Install with: pip install playwright && playwright install chromium")
45
+
46
+
47
+ @dataclass
48
+ class HarvestConfig:
49
+ """Configuration for harvest session."""
50
+ url: str
51
+ output_dir: Path = field(default_factory=lambda: Path("./output"))
52
+ wait_time: float = 3.0
53
+ scroll_page: bool = True
54
+ take_screenshots: bool = True
55
+ full_page_screenshot: bool = True
56
+ viewport: Dict[str, int] = field(default_factory=lambda: {"width": 1440, "height": 900})
57
+ mobile_viewport: Optional[Dict[str, int]] = None
58
+ dark_mode: bool = False
59
+ auth_credentials: Optional[Dict[str, str]] = None
60
+ cookies: Optional[List[Dict]] = None
61
+ headers: Optional[Dict[str, str]] = None
62
+ max_retries: int = 3
63
+ timeout: int = 30
64
+ crawl_links: bool = False
65
+ max_pages: int = 1
66
+ same_domain_only: bool = True
67
+
68
+
69
+ @dataclass
70
+ class HarvestResult:
71
+ """Result from a single page harvest."""
72
+ url: str
73
+ timestamp: str
74
+ success: bool
75
+ data: Optional[Dict] = None
76
+ screenshot_path: Optional[str] = None
77
+ mobile_screenshot_path: Optional[str] = None
78
+ error: Optional[str] = None
79
+ page_type: str = "unknown"
80
+ duration_ms: int = 0
81
+
82
+
83
+ class BrowserHarvester:
84
+ """Browser automation for design system extraction."""
85
+
86
+ HARVESTER_JS_PATH = Path(__file__).parent / "harvester_v4.js"
87
+
88
+ def __init__(self, config: HarvestConfig):
89
+ self.config = config
90
+ self.results: List[HarvestResult] = []
91
+ self.visited_urls: set = set()
92
+ self.playwright = None
93
+ self.browser: Optional[Browser] = None
94
+ self.context: Optional[BrowserContext] = None
95
+
96
+ async def __aenter__(self):
97
+ if not PLAYWRIGHT_AVAILABLE:
98
+ raise RuntimeError("Playwright is required for browser automation")
99
+
100
+ self.playwright = await async_playwright().start()
101
+
102
+ # Launch browser with appropriate settings
103
+ self.browser = await self.playwright.chromium.launch(
104
+ headless=True,
105
+ args=[
106
+ '--disable-web-security',
107
+ '--disable-features=IsolateOrigins,site-per-process',
108
+ '--disable-dev-shm-usage',
109
+ '--no-sandbox'
110
+ ]
111
+ )
112
+
113
+ # Create context with viewport and other settings
114
+ context_options = {
115
+ "viewport": self.config.viewport,
116
+ "device_scale_factor": 1,
117
+ }
118
+
119
+ if self.config.headers:
120
+ context_options["extra_http_headers"] = self.config.headers
121
+
122
+ self.context = await self.browser.new_context(**context_options)
123
+
124
+ # Add cookies if provided
125
+ if self.config.cookies:
126
+ await self.context.add_cookies(self.config.cookies)
127
+
128
+ return self
129
+
130
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
131
+ if self.context:
132
+ await self.context.close()
133
+ if self.browser:
134
+ await self.browser.close()
135
+ if self.playwright:
136
+ await self.playwright.stop()
137
+
138
+ async def harvest_single(self, url: str, is_mobile: bool = False) -> HarvestResult:
139
+ """Harvest design system from a single URL."""
140
+ start_time = time.time()
141
+
142
+ if url in self.visited_urls:
143
+ return HarvestResult(
144
+ url=url,
145
+ timestamp=datetime.now().isoformat(),
146
+ success=False,
147
+ error="URL already visited"
148
+ )
149
+
150
+ self.visited_urls.add(url)
151
+
152
+ # Create new page
153
+ page = await self.context.new_page()
154
+
155
+ try:
156
+ # Set viewport for mobile if needed
157
+ if is_mobile and self.config.mobile_viewport:
158
+ await page.set_viewport_size(self.config.mobile_viewport)
159
+
160
+ # Navigate to URL
161
+ await page.goto(url, wait_until="networkidle", timeout=self.config.timeout * 1000)
162
+
163
+ # Wait for page to stabilize
164
+ await asyncio.sleep(self.config.wait_time)
165
+
166
+ # Handle any cookie consent dialogs (common patterns)
167
+ await self._handle_cookie_consent(page)
168
+
169
+ # Scroll page if configured
170
+ if self.config.scroll_page and not is_mobile:
171
+ await self._scroll_page(page)
172
+
173
+ # Take screenshot if enabled
174
+ screenshot_path = None
175
+ if self.config.take_screenshots:
176
+ screenshot_path = await self._take_screenshot(page, url, is_mobile)
177
+
178
+ # Inject and execute harvester
179
+ harvest_data = await self._execute_harvester(page)
180
+
181
+ # Get page metadata
182
+ page_type = await page.evaluate("""() => {
183
+ const url = window.location.href.toLowerCase();
184
+ const title = document.title.toLowerCase();
185
+ const combined = url + " " + title;
186
+
187
+ if (/dashboard|overview/.test(combined)) return 'dashboard';
188
+ if (/setting|config/.test(combined)) return 'settings';
189
+ if (/report|analytics/.test(combined)) return 'report';
190
+ if (/order|transaction/.test(combined)) return 'orders';
191
+ if (/product|catalog/.test(combined)) return 'products';
192
+ if (/user|profile|account/.test(combined)) return 'users';
193
+ return 'generic';
194
+ }""")
195
+
196
+ duration_ms = int((time.time() - start_time) * 1000)
197
+
198
+ await page.close()
199
+
200
+ return HarvestResult(
201
+ url=url,
202
+ timestamp=datetime.now().isoformat(),
203
+ success=True,
204
+ data=harvest_data,
205
+ screenshot_path=screenshot_path,
206
+ page_type=page_type,
207
+ duration_ms=duration_ms
208
+ )
209
+
210
+ except Exception as e:
211
+ duration_ms = int((time.time() - start_time) * 1000)
212
+ await page.close()
213
+
214
+ return HarvestResult(
215
+ url=url,
216
+ timestamp=datetime.now().isoformat(),
217
+ success=False,
218
+ error=str(e),
219
+ duration_ms=duration_ms
220
+ )
221
+
222
+ async def _handle_cookie_consent(self, page: Page):
223
+ """Handle common cookie consent dialogs."""
224
+ consent_selectors = [
225
+ 'button[aria-label*="Accept"]',
226
+ 'button[aria-label*="accept"]',
227
+ '[class*="cookie"] button',
228
+ '[id*="cookie"] button',
229
+ 'button:has-text("Accept")',
230
+ 'button:has-text("I agree")',
231
+ '[class*="consent"] button:first-child',
232
+ '[data-testid*="cookie-accept"]'
233
+ ]
234
+
235
+ for selector in consent_selectors:
236
+ try:
237
+ button = await page.query_selector(selector)
238
+ if button:
239
+ await button.click()
240
+ await asyncio.sleep(0.5)
241
+ break
242
+ except:
243
+ continue
244
+
245
+ async def _scroll_page(self, page: Page):
246
+ """Scroll page to load lazy content."""
247
+ # Get page height
248
+ height = await page.evaluate("() => document.body.scrollHeight")
249
+
250
+ # Scroll in increments
251
+ viewport_height = self.config.viewport["height"]
252
+ steps = min(5, height // viewport_height)
253
+
254
+ for i in range(steps):
255
+ await page.evaluate(f"window.scrollTo(0, {(i + 1) * viewport_height})")
256
+ await asyncio.sleep(0.5)
257
+
258
+ # Scroll back to top
259
+ await page.evaluate("window.scrollTo(0, 0)")
260
+ await asyncio.sleep(0.3)
261
+
262
+ async def _take_screenshot(self, page: Page, url: str, is_mobile: bool) -> str:
263
+ """Take screenshot of the page."""
264
+ # Create filename from URL
265
+ parsed = urlparse(url)
266
+ domain = parsed.netloc.replace(".", "_")
267
+ path = parsed.path.replace("/", "_").replace(".", "_")[:50]
268
+ suffix = "mobile" if is_mobile else "desktop"
269
+
270
+ filename = f"{domain}{path}_{suffix}.png"
271
+ filepath = self.config.output_dir / filename
272
+
273
+ # Ensure directory exists
274
+ filepath.parent.mkdir(parents=True, exist_ok=True)
275
+
276
+ # Take screenshot
277
+ if self.config.full_page_screenshot and not is_mobile:
278
+ await page.screenshot(path=str(filepath), full_page=True)
279
+ else:
280
+ await page.screenshot(path=str(filepath))
281
+
282
+ return str(filepath)
283
+
284
+ async def _execute_harvester(self, page: Page) -> Dict:
285
+ """Inject and execute harvester v4 script."""
286
+ # Read harvester script
287
+ if not self.HARVESTER_JS_PATH.exists():
288
+ raise FileNotFoundError(f"Harvester script not found: {self.HARVESTER_JS_PATH}")
289
+
290
+ with open(self.HARVESTER_JS_PATH, 'r') as f:
291
+ harvester_js = f.read()
292
+
293
+ # Execute script and get results
294
+ result = await page.evaluate(f"""
295
+ () => {{
296
+ {harvester_js}
297
+ return JSON.parse(result);
298
+ }}
299
+ """)
300
+
301
+ return result
302
+
303
+ async def crawl(self, start_url: str, max_pages: Optional[int] = None) -> List[HarvestResult]:
304
+ """Crawl multiple pages starting from URL."""
305
+ max_pages = max_pages or self.config.max_pages
306
+ to_visit = [start_url]
307
+ results = []
308
+
309
+ while to_visit and len(results) < max_pages:
310
+ url = to_visit.pop(0)
311
+
312
+ if url in self.visited_urls:
313
+ continue
314
+
315
+ result = await self.harvest_single(url)
316
+ results.append(result)
317
+
318
+ if result.success and self.config.crawl_links:
319
+ # Find links on the page
320
+ new_links = await self._extract_links(url, result.data)
321
+
322
+ for link in new_links:
323
+ if link not in self.visited_urls and link not in to_visit:
324
+ to_visit.append(link)
325
+
326
+ return results
327
+
328
+ async def _extract_links(self, base_url: str, data: Dict) -> List[str]:
329
+ """Extract links to crawl from page data."""
330
+ links = []
331
+
332
+ # This would typically come from the page, but we can infer from navigation
333
+ # For now, return empty to prevent infinite crawling
334
+ # In a real implementation, you'd extract from the page content
335
+
336
+ return links
337
+
338
+ async def harvest(self) -> List[HarvestResult]:
339
+ """Main harvest method."""
340
+ if self.config.crawl_links and self.config.max_pages > 1:
341
+ return await self.crawl(self.config.url)
342
+ else:
343
+ # Harvest desktop version
344
+ result = await self.harvest_single(self.config.url, is_mobile=False)
345
+ self.results.append(result)
346
+
347
+ # Harvest mobile version if configured
348
+ if self.config.mobile_viewport:
349
+ mobile_result = await self.harvest_single(self.config.url, is_mobile=True)
350
+ if mobile_result.screenshot_path:
351
+ result.mobile_screenshot_path = mobile_result.screenshot_path
352
+
353
+ return self.results
354
+
355
+
356
+ class DesignSystemBuilder:
357
+ """Build design system from harvest results."""
358
+
359
+ def __init__(self, results: List[HarvestResult], output_dir: Path):
360
+ self.results = results
361
+ self.output_dir = output_dir
362
+
363
+ def build(self) -> Dict[str, Any]:
364
+ """Build comprehensive design system."""
365
+ # Merge data from all successful harvests
366
+ merged_data = self._merge_harvest_data()
367
+
368
+ # Generate design tokens
369
+ tokens = self._generate_tokens(merged_data)
370
+
371
+ # Generate component blueprints
372
+ blueprints = self._generate_blueprints(merged_data)
373
+
374
+ # Generate CSS variables
375
+ css = self._generate_css(tokens)
376
+
377
+ # Save all outputs
378
+ self._save_outputs(tokens, blueprints, css, merged_data)
379
+
380
+ return {
381
+ "tokens": tokens,
382
+ "blueprints": blueprints,
383
+ "css_path": str(self.output_dir / "design-tokens.css"),
384
+ "stats": self._generate_stats()
385
+ }
386
+
387
+ def _merge_harvest_data(self) -> Dict:
388
+ """Merge data from multiple harvest results."""
389
+ merged = {
390
+ "colors": {},
391
+ "typography": {},
392
+ "spacing": {},
393
+ "components": {},
394
+ "pages": []
395
+ }
396
+
397
+ for result in self.results:
398
+ if not result.success or not result.data:
399
+ continue
400
+
401
+ data = result.data
402
+ merged["pages"].append({
403
+ "url": result.url,
404
+ "type": result.page_type,
405
+ "timestamp": result.timestamp
406
+ })
407
+
408
+ # Merge colors (take most common values)
409
+ if "visualAnalysis" in data:
410
+ va = data["visualAnalysis"]
411
+ if "colors" in va:
412
+ merged["colors"] = self._merge_colors(merged["colors"], va["colors"])
413
+ if "typography" in va:
414
+ merged["typography"] = self._merge_typography(merged["typography"], va["typography"])
415
+ if "spacing" in va:
416
+ merged["spacing"] = self._merge_spacing(merged["spacing"], va["spacing"])
417
+
418
+ # Merge component blueprints
419
+ if "components" in data and "blueprints" in data["components"]:
420
+ merged["components"] = self._merge_components(
421
+ merged["components"],
422
+ data["components"]["blueprints"]
423
+ )
424
+
425
+ return merged
426
+
427
+ def _merge_colors(self, existing: Dict, new: Dict) -> Dict:
428
+ """Merge color data."""
429
+ # Simple merge - prefer new values if they exist
430
+ if not existing:
431
+ return new
432
+
433
+ for key, value in new.items():
434
+ if key not in existing and value:
435
+ existing[key] = value
436
+
437
+ return existing
438
+
439
+ def _merge_typography(self, existing: Dict, new: Dict) -> Dict:
440
+ """Merge typography data."""
441
+ if not existing:
442
+ return new
443
+
444
+ # Prefer hierarchy from homepage or dashboard
445
+ if "hierarchy" in new and len(new["hierarchy"]) > len(existing.get("hierarchy", {})):
446
+ existing["hierarchy"] = new["hierarchy"]
447
+
448
+ return existing
449
+
450
+ def _merge_spacing(self, existing: Dict, new: Dict) -> Dict:
451
+ """Merge spacing data."""
452
+ if not existing:
453
+ return new
454
+ return existing
455
+
456
+ def _merge_components(self, existing: Dict, new: Dict) -> Dict:
457
+ """Merge component blueprints."""
458
+ for comp_type, blueprint in new.items():
459
+ if comp_type not in existing:
460
+ existing[comp_type] = blueprint
461
+ else:
462
+ # Merge variants
463
+ if "variants" in blueprint:
464
+ for variant, instances in blueprint["variants"].items():
465
+ if variant not in existing[comp_type].get("variants", {}):
466
+ if "variants" not in existing[comp_type]:
467
+ existing[comp_type]["variants"] = {}
468
+ existing[comp_type]["variants"][variant] = instances
469
+
470
+ return existing
471
+
472
+ def _generate_tokens(self, data: Dict) -> Dict:
473
+ """Generate design tokens from merged data."""
474
+ tokens = {
475
+ "color": {},
476
+ "typography": {},
477
+ "spacing": {},
478
+ "border": {},
479
+ "shadow": {},
480
+ "sizing": {}
481
+ }
482
+
483
+ # Extract color tokens
484
+ colors = data.get("colors", {})
485
+ if "semantic" in colors:
486
+ semantic = colors["semantic"]
487
+ for name, value in semantic.items():
488
+ if isinstance(value, dict) and "base" in value:
489
+ tokens["color"][name] = value["base"]
490
+ elif isinstance(value, str):
491
+ tokens["color"][name] = value
492
+
493
+ # Extract neutrals
494
+ if "neutrals" in colors:
495
+ for step, hex_val in colors["neutrals"].items():
496
+ tokens["color"][f"neutral-{step}"] = hex_val
497
+
498
+ # Extract typography tokens
499
+ typography = data.get("typography", {})
500
+ if "dominant" in typography:
501
+ dom = typography["dominant"]
502
+ tokens["typography"]["font-family-base"] = dom.get("family", "system-ui")
503
+ tokens["typography"]["font-size-base"] = dom.get("size", "14px")
504
+
505
+ if "hierarchy" in typography:
506
+ for level, props in typography["hierarchy"].items():
507
+ if props:
508
+ tokens["typography"][f"{level}-size"] = props.get("size", "")
509
+ tokens["typography"][f"{level}-weight"] = props.get("weight", "")
510
+
511
+ return tokens
512
+
513
+ def _generate_blueprints(self, data: Dict) -> Dict:
514
+ """Generate component blueprints."""
515
+ return data.get("components", {})
516
+
517
+ def _generate_css(self, tokens: Dict) -> str:
518
+ """Generate CSS variables from tokens."""
519
+ lines = [
520
+ "/**",
521
+ " * Design System Tokens",
522
+ f" * Generated: {datetime.now().isoformat()}",
523
+ " * Source: Harvester v4",
524
+ " */",
525
+ "",
526
+ ":root {"
527
+ ]
528
+
529
+ # Color tokens
530
+ lines.append(" /* Colors */")
531
+ for name, value in tokens.get("color", {}).items():
532
+ if value:
533
+ var_name = f"--color-{name.replace('_', '-')}"
534
+ lines.append(f" {var_name}: {value};")
535
+
536
+ # Typography tokens
537
+ lines.append("\n /* Typography */")
538
+ for name, value in tokens.get("typography", {}).items():
539
+ if value:
540
+ var_name = f"--{name.replace('_', '-')}"
541
+ lines.append(f" {var_name}: {value};")
542
+
543
+ lines.append("}")
544
+
545
+ return "\n".join(lines)
546
+
547
+ def _save_outputs(self, tokens: Dict, blueprints: Dict, css: str, data: Dict):
548
+ """Save all output files."""
549
+ self.output_dir.mkdir(parents=True, exist_ok=True)
550
+
551
+ # Save tokens JSON
552
+ with open(self.output_dir / "design-tokens.json", "w") as f:
553
+ json.dump(tokens, f, indent=2)
554
+
555
+ # Save CSS
556
+ with open(self.output_dir / "design-tokens.css", "w") as f:
557
+ f.write(css)
558
+
559
+ # Save blueprints
560
+ with open(self.output_dir / "component-blueprints.json", "w") as f:
561
+ json.dump(blueprints, f, indent=2)
562
+
563
+ # Save full data
564
+ with open(self.output_dir / "harvest-merged.json", "w") as f:
565
+ json.dump(data, f, indent=2)
566
+
567
+ def _generate_stats(self) -> Dict:
568
+ """Generate harvest statistics."""
569
+ successful = [r for r in self.results if r.success]
570
+ return {
571
+ "total_pages": len(self.results),
572
+ "successful": len(successful),
573
+ "failed": len(self.results) - len(successful),
574
+ "total_duration_ms": sum(r.duration_ms for r in self.results)
575
+ }
576
+
577
+
578
+ async def main():
579
+ """CLI entry point."""
580
+ parser = argparse.ArgumentParser(
581
+ description="Harvester v4 — AI-Powered Visual Extraction",
582
+ formatter_class=argparse.RawDescriptionHelpFormatter,
583
+ epilog="""
584
+ Examples:
585
+ # Basic harvest
586
+ python harvester_browser.py --url https://example.com
587
+
588
+ # With output directory
589
+ python harvester_browser.py --url https://example.com --output ./my-design-system
590
+
591
+ # Multi-page from file
592
+ python harvester_browser.py --urls urls.txt --output ./output
593
+
594
+ # Crawl mode
595
+ python harvester_browser.py --url https://example.com --crawl --max-pages 5
596
+
597
+ # Mobile + Desktop
598
+ python harvester_browser.py --url https://example.com --mobile
599
+ """
600
+ )
601
+
602
+ parser.add_argument("--url", "-u", help="Single URL to harvest")
603
+ parser.add_argument("--urls", "-f", help="File containing URLs to harvest (one per line)")
604
+ parser.add_argument("--output", "-o", default="./output", help="Output directory")
605
+ parser.add_argument("--crawl", "-c", action="store_true", help="Crawl linked pages")
606
+ parser.add_argument("--max-pages", "-m", type=int, default=1, help="Maximum pages to harvest")
607
+ parser.add_argument("--wait", "-w", type=float, default=3.0, help="Wait time after page load (seconds)")
608
+ parser.add_argument("--viewport-width", type=int, default=1440, help="Viewport width")
609
+ parser.add_argument("--viewport-height", type=int, default=900, help="Viewport height")
610
+ parser.add_argument("--mobile", action="store_true", help="Also capture mobile viewport (375x812)")
611
+ parser.add_argument("--no-screenshot", action="store_true", help="Disable screenshots")
612
+ parser.add_argument("--dark-mode", action="store_true", help="Enable dark mode preference")
613
+ parser.add_argument("--timeout", type=int, default=30, help="Page load timeout (seconds)")
614
+ parser.add_argument("--retries", type=int, default=3, help="Max retries on failure")
615
+ parser.add_argument("--interactive", "-i", action="store_true", help="Interactive mode")
616
+
617
+ args = parser.parse_args()
618
+
619
+ if not PLAYWRIGHT_AVAILABLE:
620
+ print("[ERROR] Playwright is required. Install with:")
621
+ print(" pip install playwright")
622
+ print(" playwright install chromium")
623
+ sys.exit(1)
624
+
625
+ # Interactive mode
626
+ if args.interactive:
627
+ url = input("Enter URL to harvest: ").strip()
628
+ output = input(f"Output directory [./output]: ").strip() or "./output"
629
+
630
+ config = HarvestConfig(
631
+ url=url,
632
+ output_dir=Path(output),
633
+ wait_time=3.0,
634
+ viewport={"width": 1440, "height": 900}
635
+ )
636
+
637
+ if input("Enable mobile viewport? [y/N]: ").lower() == 'y':
638
+ config.mobile_viewport = {"width": 375, "height": 812}
639
+
640
+ elif args.url:
641
+ config = HarvestConfig(
642
+ url=args.url,
643
+ output_dir=Path(args.output),
644
+ wait_time=args.wait,
645
+ crawl_links=args.crawl,
646
+ max_pages=args.max_pages,
647
+ viewport={"width": args.viewport_width, "height": args.viewport_height},
648
+ mobile_viewport={"width": 375, "height": 812} if args.mobile else None,
649
+ take_screenshots=not args.no_screenshot,
650
+ dark_mode=args.dark_mode,
651
+ timeout=args.timeout,
652
+ max_retries=args.retries
653
+ )
654
+
655
+ elif args.urls:
656
+ # Process multiple URLs from file
657
+ with open(args.urls, 'r') as f:
658
+ urls = [line.strip() for line in f if line.strip() and not line.startswith('#')]
659
+
660
+ print(f"[INFO] Processing {len(urls)} URLs from {args.urls}")
661
+
662
+ for url in urls:
663
+ config = HarvestConfig(
664
+ url=url,
665
+ output_dir=Path(args.output) / urlparse(url).netloc.replace(".", "_"),
666
+ wait_time=args.wait,
667
+ take_screenshots=not args.no_screenshot
668
+ )
669
+
670
+ print(f"\n[HARVEST] {url}")
671
+ async with BrowserHarvester(config) as harvester:
672
+ results = await harvester.harvest()
673
+
674
+ builder = DesignSystemBuilder(results, config.output_dir)
675
+ design_system = builder.build()
676
+
677
+ print(f"[OK] Harvested: {design_system['stats']}")
678
+ print(f"[OK] Output: {config.output_dir}")
679
+
680
+ return
681
+
682
+ else:
683
+ parser.print_help()
684
+ sys.exit(1)
685
+
686
+ # Execute harvest
687
+ print(f"[INIT] Harvesting: {config.url}")
688
+ print(f"[CONFIG] Output: {config.output_dir}")
689
+ print(f"[CONFIG] Viewport: {config.viewport}")
690
+
691
+ async with BrowserHarvester(config) as harvester:
692
+ results = await harvester.harvest()
693
+
694
+ print(f"\n[RESULTS] {len(results)} pages harvested")
695
+
696
+ for result in results:
697
+ status = "✓" if result.success else "✗"
698
+ print(f" {status} {result.url} ({result.page_type})")
699
+ if not result.success:
700
+ print(f" Error: {result.error}")
701
+
702
+ # Build design system
703
+ print("\n[BUILD] Generating design system...")
704
+ builder = DesignSystemBuilder(results, config.output_dir)
705
+ design_system = builder.build()
706
+
707
+ print(f"[OK] Design system generated!")
708
+ print(f"[STATS] {design_system['stats']}")
709
+ print(f"[OUTPUT] Files saved to: {config.output_dir}")
710
+ print(f" - design-tokens.json")
711
+ print(f" - design-tokens.css")
712
+ print(f" - component-blueprints.json")
713
+ print(f" - harvest-merged.json")
714
+
715
+
716
+ if __name__ == "__main__":
717
+ asyncio.run(main())