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,125 @@
1
+ """Tests for agent_dispatcher.py — Task queue, claiming, and stale detection."""
2
+ import json
3
+ import sys
4
+ import time
5
+ import pytest
6
+ from pathlib import Path
7
+ from datetime import datetime, timedelta
8
+
9
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
10
+ sys.path.insert(0, str(SCRIPTS_DIR))
11
+
12
+
13
+ class TestAgentDispatcher:
14
+ """Test AgentDispatcher class."""
15
+
16
+ def test_enqueue(self, tmp_path):
17
+ from agent_dispatcher import AgentDispatcher
18
+ d = AgentDispatcher(str(tmp_path))
19
+ task = d.enqueue("task-1", "write", {"topic": "SEO"})
20
+ assert task["id"] == "task-1"
21
+ assert task["status"] == "queued"
22
+ assert task["type"] == "write"
23
+
24
+ def test_no_duplicate_enqueue(self, tmp_path):
25
+ from agent_dispatcher import AgentDispatcher
26
+ d = AgentDispatcher(str(tmp_path))
27
+ d.enqueue("task-1", "write")
28
+ d.enqueue("task-1", "write")
29
+ q = d.get_queue()
30
+ assert q["total"] == 1
31
+
32
+ def test_claim_next(self, tmp_path):
33
+ from agent_dispatcher import AgentDispatcher
34
+ d = AgentDispatcher(str(tmp_path))
35
+ d.enqueue("task-1", "write")
36
+ task = d.claim_next("agent-1")
37
+ assert task is not None
38
+ assert task["status"] == "claimed"
39
+ assert task["claimed_by"] == "agent-1"
40
+
41
+ def test_claim_empty_queue_returns_none(self, tmp_path):
42
+ from agent_dispatcher import AgentDispatcher
43
+ d = AgentDispatcher(str(tmp_path))
44
+ assert d.claim_next("agent-1") is None
45
+
46
+ def test_claim_by_type(self, tmp_path):
47
+ from agent_dispatcher import AgentDispatcher
48
+ d = AgentDispatcher(str(tmp_path))
49
+ d.enqueue("task-1", "write")
50
+ d.enqueue("task-2", "audit")
51
+ task = d.claim_next("agent-1", task_type="audit")
52
+ assert task["id"] == "task-2"
53
+
54
+ def test_complete(self, tmp_path):
55
+ from agent_dispatcher import AgentDispatcher
56
+ d = AgentDispatcher(str(tmp_path))
57
+ d.enqueue("task-1", "write")
58
+ d.claim_next("agent-1")
59
+ d.complete("task-1", "agent-1", {"result": "ok"})
60
+ q = d.get_queue()
61
+ assert q["done"] == 1
62
+
63
+ def test_fail_with_retry(self, tmp_path):
64
+ from agent_dispatcher import AgentDispatcher
65
+ d = AgentDispatcher(str(tmp_path))
66
+ d.enqueue("task-1", "write")
67
+ d.claim_next("agent-1")
68
+ d.fail("task-1", "agent-1", "timeout")
69
+ q = d.get_queue()
70
+ task = next(t for t in q["tasks"] if t["id"] == "task-1")
71
+ assert task["status"] == "queued" # requeued for retry
72
+ assert task["retries"] == 1
73
+
74
+ def test_fail_exceeds_max_retries(self, tmp_path):
75
+ from agent_dispatcher import AgentDispatcher
76
+ d = AgentDispatcher(str(tmp_path))
77
+ d.enqueue("task-1", "write")
78
+ for _ in range(3):
79
+ d.claim_next("agent-1")
80
+ d.fail("task-1", "agent-1", "error")
81
+ q = d.get_queue()
82
+ task = next(t for t in q["tasks"] if t["id"] == "task-1")
83
+ assert task["status"] == "failed"
84
+ assert task["retries"] == 3
85
+
86
+ def test_priority_ordering(self, tmp_path):
87
+ from agent_dispatcher import AgentDispatcher
88
+ d = AgentDispatcher(str(tmp_path))
89
+ d.enqueue("low", "write", priority=10)
90
+ d.enqueue("high", "write", priority=1)
91
+ d.enqueue("mid", "write", priority=5)
92
+ task = d.claim_next("agent-1")
93
+ assert task["id"] == "high"
94
+
95
+ def test_enqueue_batch(self, tmp_path):
96
+ from agent_dispatcher import AgentDispatcher
97
+ d = AgentDispatcher(str(tmp_path))
98
+ tasks = [
99
+ {"id": "b-1", "type": "write"},
100
+ {"id": "b-2", "type": "write"},
101
+ {"id": "b-3", "type": "audit"},
102
+ ]
103
+ added = d.enqueue_batch(tasks)
104
+ assert len(added) == 3
105
+ q = d.get_queue()
106
+ assert q["total"] == 3
107
+
108
+ def test_queue_summary(self, tmp_path):
109
+ from agent_dispatcher import AgentDispatcher
110
+ d = AgentDispatcher(str(tmp_path))
111
+ d.enqueue("t1", "write")
112
+ d.enqueue("t2", "write")
113
+ d.claim_next("agent-1")
114
+ q = d.get_queue()
115
+ assert q["queued"] == 1
116
+ assert q["claimed"] == 1
117
+
118
+ def test_reset(self, tmp_path):
119
+ from agent_dispatcher import AgentDispatcher
120
+ d = AgentDispatcher(str(tmp_path))
121
+ d.enqueue("t1", "write")
122
+ d.enqueue("t2", "write")
123
+ d.reset()
124
+ q = d.get_queue()
125
+ assert q["total"] == 0
@@ -0,0 +1,128 @@
1
+ """Tests for memory.py — MemoryEngine 3-layer memory system."""
2
+ import json
3
+ import sys
4
+ import pytest
5
+ from pathlib import Path
6
+ from datetime import datetime
7
+
8
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
9
+ sys.path.insert(0, str(SCRIPTS_DIR))
10
+
11
+
12
+ class TestMemoryEngineInit:
13
+ """Test MemoryEngine initialization."""
14
+
15
+ def test_creates_directory_structure(self, tmp_project):
16
+ """Should create semantic/, episodic/, working/ directories."""
17
+ from memory import MemoryEngine
18
+ _, config_path, _ = tmp_project
19
+ engine = MemoryEngine(str(config_path))
20
+
21
+ memory_dir = tmp_project[0] / "memory"
22
+ assert (memory_dir / "semantic").is_dir()
23
+ assert (memory_dir / "episodic").is_dir()
24
+ assert (memory_dir / "working").is_dir()
25
+
26
+ def test_creates_semantic_files(self, tmp_project):
27
+ """Should initialize default semantic memory files."""
28
+ from memory import MemoryEngine
29
+ _, config_path, _ = tmp_project
30
+ engine = MemoryEngine(str(config_path))
31
+
32
+ semantic_dir = tmp_project[0] / "memory" / "semantic"
33
+ assert (semantic_dir / "writing_patterns.json").exists()
34
+ assert (semantic_dir / "seo_patterns.json").exists()
35
+ assert (semantic_dir / "niche_knowledge.json").exists()
36
+ assert (semantic_dir / "mistakes.json").exists()
37
+
38
+ def test_creates_working_session(self, tmp_project):
39
+ """Should initialize current_session.json."""
40
+ from memory import MemoryEngine
41
+ _, config_path, _ = tmp_project
42
+ engine = MemoryEngine(str(config_path))
43
+
44
+ session_file = tmp_project[0] / "memory" / "working" / "current_session.json"
45
+ assert session_file.exists()
46
+
47
+
48
+ class TestWritingPatterns:
49
+ """Test writing pattern add/update."""
50
+
51
+ def test_add_new_pattern(self, tmp_project):
52
+ """Should add a new pattern with default confidence 0.5."""
53
+ from memory import MemoryEngine
54
+ _, config_path, _ = tmp_project
55
+ engine = MemoryEngine(str(config_path))
56
+
57
+ engine.add_writing_pattern("test_pattern", {"description": "Use short sentences"})
58
+
59
+ data = engine.load_semantic("writing_patterns")
60
+ assert "test_pattern" in data["patterns"]
61
+ assert data["patterns"]["test_pattern"]["confidence"] == 0.5
62
+ assert data["patterns"]["test_pattern"]["applications"] == 1
63
+
64
+ def test_update_existing_pattern_increases_confidence(self, tmp_project):
65
+ """Applying same pattern again should increase confidence and applications."""
66
+ from memory import MemoryEngine
67
+ _, config_path, _ = tmp_project
68
+ engine = MemoryEngine(str(config_path))
69
+
70
+ engine.add_writing_pattern("p1", {"description": "Be concise"})
71
+ engine.add_writing_pattern("p1", {"description": "Be concise"})
72
+
73
+ data = engine.load_semantic("writing_patterns")
74
+ assert data["patterns"]["p1"]["applications"] == 2
75
+ assert data["patterns"]["p1"]["confidence"] == 0.55 # 0.5 + 0.05
76
+
77
+
78
+ class TestWritingContext:
79
+ """Test get_writing_context() aggregation."""
80
+
81
+ def test_empty_context_returns_structure(self, tmp_project):
82
+ """Even with no data, should return proper dict structure."""
83
+ from memory import MemoryEngine
84
+ _, config_path, _ = tmp_project
85
+ engine = MemoryEngine(str(config_path))
86
+
87
+ ctx = engine.get_writing_context()
88
+ assert "style" in ctx
89
+ assert "top_patterns" in ctx
90
+ assert "avoid" in ctx
91
+ assert "seo_rules" in ctx
92
+ assert "domain_knowledge" in ctx
93
+
94
+ def test_context_includes_added_patterns(self, tmp_project):
95
+ """Added patterns should appear in top_patterns."""
96
+ from memory import MemoryEngine
97
+ _, config_path, _ = tmp_project
98
+ engine = MemoryEngine(str(config_path))
99
+
100
+ engine.add_writing_pattern("p1", {"description": "Short sentences"})
101
+ ctx = engine.get_writing_context()
102
+ assert len(ctx["top_patterns"]) >= 1
103
+
104
+
105
+ class TestSessionLifecycle:
106
+ """Test session start/end cycle."""
107
+
108
+ def test_start_session_returns_id(self, tmp_project):
109
+ """start_session should return a session ID string."""
110
+ from memory import MemoryEngine
111
+ _, config_path, _ = tmp_project
112
+ engine = MemoryEngine(str(config_path))
113
+
114
+ sid = engine.start_session(phase="write")
115
+ assert sid.startswith("ses-")
116
+ assert len(sid) > 4
117
+
118
+ def test_start_session_creates_working_file(self, tmp_project):
119
+ """Should update current_session.json with new session data."""
120
+ from memory import MemoryEngine
121
+ _, config_path, _ = tmp_project
122
+ engine = MemoryEngine(str(config_path))
123
+
124
+ engine.start_session(phase="audit")
125
+ session_file = tmp_project[0] / "memory" / "working" / "current_session.json"
126
+ data = json.loads(session_file.read_text())
127
+ assert data["phase"] == "audit"
128
+ assert data["session_id"].startswith("ses-")
@@ -0,0 +1,107 @@
1
+ """Tests for pipeline.py — Config loading, validation, hooks, and phase execution."""
2
+ import json
3
+ import sys
4
+ import pytest
5
+ from pathlib import Path
6
+ from unittest.mock import patch, MagicMock
7
+
8
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
9
+ sys.path.insert(0, str(SCRIPTS_DIR))
10
+
11
+
12
+ class TestValidateConfig:
13
+ """Test validate_config() function."""
14
+
15
+ def test_valid_config_passes(self, minimal_config):
16
+ """Happy path: valid config returns True."""
17
+ from pipeline import validate_config
18
+ assert validate_config(minimal_config) is True
19
+
20
+ def test_missing_niche_fails(self, minimal_config):
21
+ """Missing top-level 'niche' key should fail."""
22
+ from pipeline import validate_config
23
+ del minimal_config["niche"]
24
+ assert validate_config(minimal_config) is False
25
+
26
+ def test_missing_brand_name_fails(self, bad_config_missing_brand):
27
+ """Missing brand.name should fail."""
28
+ from pipeline import validate_config
29
+ assert validate_config(bad_config_missing_brand) is False
30
+
31
+ def test_missing_sources_type_fails(self, minimal_config):
32
+ """Missing sources.type should fail."""
33
+ from pipeline import validate_config
34
+ del minimal_config["sources"]["type"]
35
+ assert validate_config(minimal_config) is False
36
+
37
+ def test_missing_output_content_dir_fails(self, minimal_config):
38
+ """Missing output.content_dir should fail."""
39
+ from pipeline import validate_config
40
+ del minimal_config["output"]["content_dir"]
41
+ assert validate_config(minimal_config) is False
42
+
43
+ def test_empty_config_fails(self):
44
+ """Empty dict should fail."""
45
+ from pipeline import validate_config
46
+ assert validate_config({}) is False
47
+
48
+ def test_missing_content_article_types_fails(self, minimal_config):
49
+ """Missing content.article_types should fail."""
50
+ from pipeline import validate_config
51
+ del minimal_config["content"]["article_types"]
52
+ assert validate_config(minimal_config) is False
53
+
54
+
55
+ class TestFireHooks:
56
+ """Test fire_hooks() function."""
57
+
58
+ def test_no_hooks_returns_silently(self, minimal_config):
59
+ """Config without hooks should not raise."""
60
+ from pipeline import fire_hooks
61
+ # Should not raise
62
+ fire_hooks(minimal_config, "pre_write")
63
+
64
+ def test_empty_hooks_returns_silently(self):
65
+ """Config with empty hooks dict should not raise."""
66
+ from pipeline import fire_hooks
67
+ config = {"extensions": {"hooks": {}}}
68
+ fire_hooks(config, "pre_write")
69
+
70
+ def test_nonexistent_hook_name_returns_silently(self):
71
+ """Requesting a hook name that doesn't exist should not raise."""
72
+ from pipeline import fire_hooks
73
+ config = {"extensions": {"hooks": {"post_write": ["some_script.py"]}}}
74
+ fire_hooks(config, "pre_audit") # Different hook name
75
+
76
+
77
+ class TestLoadConfig:
78
+ """Test load_config() function."""
79
+
80
+ def test_load_valid_config(self, tmp_project):
81
+ """Should load and return config dict from file."""
82
+ tmp_path, config_path, expected_config = tmp_project
83
+ from pipeline import load_config, CONFIG_FILE
84
+
85
+ # Monkey-patch CONFIG_FILE to our temp file
86
+ import pipeline
87
+ original = pipeline.CONFIG_FILE
88
+ pipeline.CONFIG_FILE = config_path
89
+ try:
90
+ result = load_config()
91
+ assert result["niche"] == "test-niche"
92
+ assert result["brand"]["name"] == "Test Brand"
93
+ finally:
94
+ pipeline.CONFIG_FILE = original
95
+
96
+ def test_load_missing_config_exits(self, tmp_path):
97
+ """Should sys.exit(1) when config file doesn't exist."""
98
+ import pipeline
99
+ original = pipeline.CONFIG_FILE
100
+ pipeline.CONFIG_FILE = tmp_path / "nonexistent.json"
101
+ try:
102
+ with pytest.raises(SystemExit) as exc_info:
103
+ from pipeline import load_config
104
+ load_config()
105
+ assert exc_info.value.code == 1
106
+ finally:
107
+ pipeline.CONFIG_FILE = original
@@ -0,0 +1,56 @@
1
+ """Tests for research.py — ResearchEngine initialization and query generation."""
2
+ import json
3
+ import sys
4
+ import pytest
5
+ from pathlib import Path
6
+
7
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
8
+ sys.path.insert(0, str(SCRIPTS_DIR))
9
+
10
+
11
+ class TestResearchEngineInit:
12
+ """Test ResearchEngine initialization."""
13
+
14
+ def test_loads_config(self, tmp_project):
15
+ """Should load config from file path."""
16
+ from research import ResearchEngine
17
+ _, config_path, config = tmp_project
18
+ engine = ResearchEngine(str(config_path))
19
+ assert engine.config["niche"] == "test-niche"
20
+
21
+ def test_sets_project_root(self, tmp_project):
22
+ """Should derive project_root from config path."""
23
+ from research import ResearchEngine
24
+ _, config_path, _ = tmp_project
25
+ engine = ResearchEngine(str(config_path))
26
+ assert engine.project_root == tmp_project[0]
27
+
28
+
29
+ class TestGenerateQueries:
30
+ """Test _generate_queries() method."""
31
+
32
+ def test_returns_list(self, tmp_project):
33
+ """Should return a list of query strings."""
34
+ from research import ResearchEngine
35
+ _, config_path, _ = tmp_project
36
+ engine = ResearchEngine(str(config_path))
37
+ queries = engine._generate_queries("massage therapy benefits")
38
+ assert isinstance(queries, list)
39
+ assert len(queries) > 0
40
+
41
+ def test_queries_contain_topic(self, tmp_project):
42
+ """At least one query should contain the topic words."""
43
+ from research import ResearchEngine
44
+ _, config_path, _ = tmp_project
45
+ engine = ResearchEngine(str(config_path))
46
+ queries = engine._generate_queries("acupuncture")
47
+ assert any("acupuncture" in q.lower() for q in queries)
48
+
49
+ def test_queries_contain_niche(self, tmp_project):
50
+ """Queries should incorporate niche context."""
51
+ from research import ResearchEngine
52
+ _, config_path, _ = tmp_project
53
+ engine = ResearchEngine(str(config_path))
54
+ queries = engine._generate_queries("benefits")
55
+ # Should generate meaningful queries, not just empty strings
56
+ assert all(len(q) > 0 for q in queries)
@@ -0,0 +1,131 @@
1
+ """Tests for state_manager.py — State persistence, events, and thread safety."""
2
+ import json
3
+ import sys
4
+ import pytest
5
+ from pathlib import Path
6
+
7
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
8
+ sys.path.insert(0, str(SCRIPTS_DIR))
9
+
10
+
11
+ class TestStateManager:
12
+ """Test StateManager class."""
13
+
14
+ def test_default_state(self, tmp_path):
15
+ from state_manager import StateManager
16
+ sm = StateManager(str(tmp_path))
17
+ state = sm.load()
18
+ assert state["status"] == "idle"
19
+ assert state["version"] == "2.0"
20
+ assert len(state["pipeline"]["phases"]) == 6
21
+
22
+ def test_save_and_load(self, tmp_path):
23
+ from state_manager import StateManager
24
+ sm = StateManager(str(tmp_path))
25
+ sm.update_phase("extract", "running", progress=0.5)
26
+ state = sm.load()
27
+ assert state["pipeline"]["phases"]["extract"]["status"] == "running"
28
+ assert state["pipeline"]["phases"]["extract"]["progress"] == 0.5
29
+
30
+ def test_phase_lifecycle(self, tmp_path):
31
+ from state_manager import StateManager
32
+ sm = StateManager(str(tmp_path))
33
+ sm.update_phase("write", "running", progress=0.0)
34
+ sm.update_phase("write", "running", progress=0.5)
35
+ sm.update_phase("write", "done", progress=1.0)
36
+ state = sm.load()
37
+ p = state["pipeline"]["phases"]["write"]
38
+ assert p["status"] == "done"
39
+ assert p["progress"] == 1.0
40
+ assert p["started_at"] is not None
41
+ assert p["finished_at"] is not None
42
+
43
+ def test_add_task(self, tmp_path):
44
+ from state_manager import StateManager
45
+ sm = StateManager(str(tmp_path))
46
+ sm.add_task("task-1", "running", {"topic": "SEO"})
47
+ state = sm.load()
48
+ assert len(state["tasks"]) == 1
49
+ assert state["tasks"][0]["id"] == "task-1"
50
+ assert state["tasks"][0]["meta"]["topic"] == "SEO"
51
+
52
+ def test_update_existing_task(self, tmp_path):
53
+ from state_manager import StateManager
54
+ sm = StateManager(str(tmp_path))
55
+ sm.add_task("task-1", "running")
56
+ sm.add_task("task-1", "done", {"result": "ok"})
57
+ state = sm.load()
58
+ assert len(state["tasks"]) == 1
59
+ assert state["tasks"][0]["status"] == "done"
60
+
61
+ def test_update_tokens(self, tmp_path):
62
+ from state_manager import StateManager
63
+ sm = StateManager(str(tmp_path))
64
+ sm.update_tokens("gemini", input_tokens=100, output_tokens=50, cost_usd=0.001)
65
+ sm.update_tokens("gemini", input_tokens=200, output_tokens=100, cost_usd=0.002)
66
+ state = sm.load()
67
+ assert state["tokens"]["total_input"] == 300
68
+ assert state["tokens"]["total_output"] == 150
69
+ assert state["tokens"]["total_cost_usd"] == 0.003
70
+ assert state["tokens"]["providers"]["gemini"]["requests"] == 2
71
+
72
+ def test_budget_check(self, tmp_path):
73
+ from state_manager import StateManager
74
+ sm = StateManager(str(tmp_path))
75
+ sm.set_budget(0.01)
76
+ assert sm.check_budget() is True
77
+ sm.update_tokens("gemini", cost_usd=0.011)
78
+ assert sm.check_budget() is False
79
+
80
+ def test_add_error(self, tmp_path):
81
+ from state_manager import StateManager
82
+ sm = StateManager(str(tmp_path))
83
+ sm.add_error("write", "API timeout")
84
+ state = sm.load()
85
+ assert len(state["errors"]) == 1
86
+ assert state["errors"][0]["message"] == "API timeout"
87
+
88
+ def test_event_logging(self, tmp_path):
89
+ from state_manager import StateManager
90
+ sm = StateManager(str(tmp_path))
91
+ sm.log_event("info", "test event", {"key": "val"})
92
+ sm.log_event("error", "test error")
93
+ events = sm.get_recent_events(10)
94
+ assert len(events) == 2
95
+ assert events[0]["level"] == "info"
96
+ assert events[1]["level"] == "error"
97
+
98
+ def test_reset(self, tmp_path):
99
+ from state_manager import StateManager
100
+ sm = StateManager(str(tmp_path))
101
+ sm.update_phase("write", "done", progress=1.0)
102
+ sm.add_task("t1", "done")
103
+ sm.reset()
104
+ state = sm.load()
105
+ assert state["status"] == "idle"
106
+ assert len(state["tasks"]) == 0
107
+
108
+ def test_get_snapshot(self, tmp_path):
109
+ from state_manager import StateManager
110
+ sm = StateManager(str(tmp_path))
111
+ sm.log_event("info", "snapshot test")
112
+ snap = sm.get_snapshot()
113
+ assert "recent_events" in snap
114
+ assert len(snap["recent_events"]) >= 1
115
+
116
+ def test_overall_status_completed(self, tmp_path):
117
+ from state_manager import StateManager
118
+ sm = StateManager(str(tmp_path))
119
+ for phase in ["extract", "plan", "write", "audit", "seo", "publish"]:
120
+ sm.update_phase(phase, "done", progress=1.0)
121
+ state = sm.load()
122
+ assert state["status"] == "completed"
123
+
124
+ def test_overall_status_error(self, tmp_path):
125
+ from state_manager import StateManager
126
+ sm = StateManager(str(tmp_path))
127
+ sm.update_phase("extract", "done")
128
+ sm.update_phase("plan", "failed", error="Network error")
129
+ state = sm.load()
130
+ assert state["status"] == "error"
131
+ assert len(state["errors"]) == 1
@@ -0,0 +1,110 @@
1
+ """Tests for token_manager.py — Token tracking, budget, circuit breaker, and rate limiting."""
2
+ import json
3
+ import sys
4
+ import pytest
5
+ from pathlib import Path
6
+
7
+ SCRIPTS_DIR = Path(__file__).resolve().parent.parent / "scripts"
8
+ sys.path.insert(0, str(SCRIPTS_DIR))
9
+
10
+
11
+ class TestTokenManager:
12
+ """Test TokenManager class."""
13
+
14
+ def test_estimate_cost_gemini(self):
15
+ from token_manager import TokenManager
16
+ tm = TokenManager()
17
+ cost = tm.estimate_cost("gemini", 1_000_000, 1_000_000)
18
+ assert cost == 0.75 # 0.15 + 0.60
19
+
20
+ def test_estimate_cost_unknown_provider(self):
21
+ from token_manager import TokenManager
22
+ tm = TokenManager()
23
+ cost = tm.estimate_cost("unknown", 1_000_000, 1_000_000)
24
+ assert cost == 4.0 # fallback 1.0 + 3.0
25
+
26
+ def test_record_usage(self, tmp_path):
27
+ from token_manager import TokenManager
28
+ tm = TokenManager(str(tmp_path))
29
+ cost = tm.record_usage("gemini", input_tokens=1000, output_tokens=500, task_id="test-1")
30
+ assert cost > 0
31
+ s = tm.get_summary()
32
+ assert s["total_input_tokens"] == 1000
33
+ assert s["total_output_tokens"] == 500
34
+ assert s["total_requests"] == 1
35
+ assert s["providers"]["gemini"]["requests"] == 1
36
+
37
+ def test_multiple_providers(self, tmp_path):
38
+ from token_manager import TokenManager
39
+ tm = TokenManager(str(tmp_path))
40
+ tm.record_usage("gemini", input_tokens=1000, output_tokens=500)
41
+ tm.record_usage("claude-sonnet", input_tokens=2000, output_tokens=1000)
42
+ s = tm.get_summary()
43
+ assert len(s["providers"]) == 2
44
+ assert s["total_input_tokens"] == 3000
45
+
46
+ def test_budget_within(self, tmp_path):
47
+ from token_manager import TokenManager
48
+ tm = TokenManager(str(tmp_path), budget_usd=10.0)
49
+ tm.record_usage("gemini", input_tokens=1000, output_tokens=500)
50
+ assert tm.check_budget() is True
51
+
52
+ def test_budget_exceeded(self, tmp_path):
53
+ from token_manager import TokenManager
54
+ tm = TokenManager(str(tmp_path), budget_usd=0.0001)
55
+ tm.record_usage("gemini", input_tokens=100000, output_tokens=50000)
56
+ assert tm.check_budget() is False
57
+
58
+ def test_budget_status(self, tmp_path):
59
+ from token_manager import TokenManager
60
+ tm = TokenManager(str(tmp_path), budget_usd=1.0)
61
+ tm.record_usage("gemini", input_tokens=1000, output_tokens=500)
62
+ status = tm.get_budget_status()
63
+ assert status["limit_usd"] == 1.0
64
+ assert status["within_budget"] is True
65
+ assert status["percentage_used"] >= 0
66
+
67
+ def test_circuit_breaker_closed(self, tmp_path):
68
+ from token_manager import TokenManager
69
+ tm = TokenManager(str(tmp_path))
70
+ assert tm.is_circuit_open("gemini") is False
71
+
72
+ def test_circuit_breaker_opens(self, tmp_path):
73
+ from token_manager import TokenManager
74
+ tm = TokenManager(str(tmp_path))
75
+ for _ in range(5):
76
+ tm.record_usage("gemini", input_tokens=100, output_tokens=50, success=False)
77
+ assert tm.is_circuit_open("gemini") is True
78
+
79
+ def test_circuit_breaker_resets_on_success(self, tmp_path):
80
+ from token_manager import TokenManager
81
+ tm = TokenManager(str(tmp_path))
82
+ for _ in range(3):
83
+ tm.record_usage("gemini", input_tokens=100, output_tokens=50, success=False)
84
+ tm.record_usage("gemini", input_tokens=100, output_tokens=50, success=True)
85
+ assert tm.is_circuit_open("gemini") is False
86
+
87
+ def test_backoff_seconds(self, tmp_path):
88
+ from token_manager import TokenManager
89
+ tm = TokenManager(str(tmp_path))
90
+ assert tm.get_backoff_seconds("gemini") == 0.0
91
+ tm.record_usage("gemini", success=False)
92
+ assert tm.get_backoff_seconds("gemini") == 2.0
93
+ tm.record_usage("gemini", success=False)
94
+ assert tm.get_backoff_seconds("gemini") == 4.0
95
+
96
+ def test_reset(self, tmp_path):
97
+ from token_manager import TokenManager
98
+ tm = TokenManager(str(tmp_path))
99
+ tm.record_usage("gemini", input_tokens=1000, output_tokens=500)
100
+ tm.reset()
101
+ s = tm.get_summary()
102
+ assert s["total_input_tokens"] == 0
103
+ assert len(s["providers"]) == 0
104
+
105
+ def test_failure_tracking(self, tmp_path):
106
+ from token_manager import TokenManager
107
+ tm = TokenManager(str(tmp_path))
108
+ tm.record_usage("gemini", input_tokens=100, success=False)
109
+ s = tm.get_summary()
110
+ assert s["providers"]["gemini"]["failures"] == 1