codymaster 4.8.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/CHANGELOG.md +331 -7
  2. package/README.md +226 -296
  3. package/dist/advisory-handoff.js +89 -0
  4. package/dist/advisory-report.js +105 -0
  5. package/dist/agent/antigravity.js +152 -0
  6. package/dist/agent/backend.js +2 -0
  7. package/dist/agent/claude.js +196 -0
  8. package/dist/agent/codex.js +204 -0
  9. package/dist/agent/copilot.js +284 -0
  10. package/dist/agent/cursor.js +211 -0
  11. package/dist/agent/factory.js +30 -0
  12. package/dist/agent/gemini.js +142 -0
  13. package/dist/agent/opencode.js +205 -0
  14. package/dist/agent/spawn-helper.js +237 -0
  15. package/dist/agent/version.js +25 -0
  16. package/dist/browse/adapter-factory.js +69 -0
  17. package/dist/browse/adapters/agent-browser-adapter.js +305 -0
  18. package/dist/browse/adapters/playwright-adapter.js +309 -0
  19. package/dist/browse/adapters/types.js +6 -0
  20. package/dist/browse/error-collector.js +132 -0
  21. package/dist/browse/event-log.js +109 -0
  22. package/dist/browse/index.js +17 -0
  23. package/dist/browse-server.js +204 -120
  24. package/dist/cli/command-registry.js +20 -0
  25. package/dist/cli/commands/bench.js +69 -0
  26. package/dist/cli/commands/brain.js +108 -0
  27. package/dist/cli/commands/dashboard.js +76 -2
  28. package/dist/cli/commands/engineering.js +326 -4
  29. package/dist/cli/commands/evolve.js +123 -0
  30. package/dist/cli/commands/install.js +160 -0
  31. package/dist/cli/commands/learn.js +181 -0
  32. package/dist/cli/commands/mcp-serve.js +104 -0
  33. package/dist/cli/commands/parallel.js +138 -0
  34. package/dist/cli/commands/quality.js +105 -0
  35. package/dist/cli/commands/stack.js +49 -0
  36. package/dist/cli/commands/update.js +159 -0
  37. package/dist/cli/update-check.js +94 -10
  38. package/dist/cm-config.js +0 -18
  39. package/dist/codybench/judges/automated.js +31 -0
  40. package/dist/codybench/runners/claude-code.js +32 -0
  41. package/dist/codybench/suites/memory-retention.js +85 -0
  42. package/dist/codybench/suites/tdd-regression.js +35 -0
  43. package/dist/codybench/suites/token-efficiency.js +55 -0
  44. package/dist/codybench/types.js +2 -0
  45. package/dist/context-db.js +157 -0
  46. package/dist/continuity.js +5 -7
  47. package/dist/dashboard.js +47 -6
  48. package/dist/data.js +35 -0
  49. package/dist/execution/tdd-gate.js +113 -0
  50. package/dist/execution-analyzer.js +138 -0
  51. package/dist/executor/cancel.js +34 -0
  52. package/dist/executor/gc.js +74 -0
  53. package/dist/executor/index.js +14 -0
  54. package/dist/executor/runner.js +70 -0
  55. package/dist/executor/workdir.js +31 -0
  56. package/dist/handoff/contracts.js +22 -0
  57. package/dist/handoff/index.js +18 -0
  58. package/dist/handoff/io.js +121 -0
  59. package/dist/index.js +7 -3
  60. package/dist/indexer/skills-lib.js +533 -0
  61. package/dist/indexer/skills-map.js +1374 -0
  62. package/dist/indexer/skills.js +16 -0
  63. package/dist/indexer/stack-detect.js +219 -0
  64. package/dist/install/copy.js +98 -0
  65. package/dist/install/engine.js +42 -0
  66. package/dist/install/paths.js +70 -0
  67. package/dist/install/platforms/_simple.js +85 -0
  68. package/dist/install/platforms/antigravity.js +91 -0
  69. package/dist/install/platforms/claude-code.js +107 -0
  70. package/dist/install/platforms/cursor.js +77 -0
  71. package/dist/install/platforms/index.js +27 -0
  72. package/dist/install/platforms/simple.js +163 -0
  73. package/dist/install/profiles.js +75 -0
  74. package/dist/install/types.js +2 -0
  75. package/dist/learning-promoter.js +246 -0
  76. package/dist/learnings.js +208 -0
  77. package/dist/mcp-context-server.js +230 -1
  78. package/dist/middleware/metrics.js +30 -0
  79. package/dist/middleware/security-headers.js +14 -0
  80. package/dist/realtime/event-bus.js +29 -0
  81. package/dist/realtime/ws-hub.js +91 -0
  82. package/dist/schemas/task-schema.js +48 -0
  83. package/dist/schemas/validate.js +18 -0
  84. package/dist/skill-chain.js +63 -1
  85. package/dist/skill-evolver.js +456 -0
  86. package/dist/skill-execution-cache.js +254 -0
  87. package/dist/skills-lock.js +96 -0
  88. package/dist/smart-brain-router.js +184 -0
  89. package/dist/sprint-pipeline.js +26 -0
  90. package/dist/storage/index.js +21 -0
  91. package/dist/storage/repos/activity-repo.js +46 -0
  92. package/dist/storage/repos/message-repo.js +39 -0
  93. package/dist/storage/repos/project-repo.js +56 -0
  94. package/dist/storage/repos/task-repo.js +142 -0
  95. package/dist/storage/services/project-service.js +49 -0
  96. package/dist/storage/services/task-service.js +97 -0
  97. package/dist/storage/sqlite.js +113 -0
  98. package/dist/storage-backend.js +10 -8
  99. package/dist/tier-classify.js +131 -0
  100. package/dist/token-budget.js +88 -0
  101. package/dist/ui/onboarding.js +51 -15
  102. package/dist/utils/cli-utils.js +7 -2
  103. package/dist/utils/design-taste.js +108 -0
  104. package/dist/utils/output-compress.js +143 -0
  105. package/dist/vibecoding-index.js +126 -0
  106. package/package.json +20 -6
  107. package/public/dashboard/app.js +52 -1
  108. package/scripts/build-skills-lock.mjs +88 -0
  109. package/scripts/build-skills.mjs +187 -28
  110. package/scripts/compress-skill.mjs +73 -0
  111. package/scripts/deprecate-skill.mjs +72 -0
  112. package/scripts/install.sh +170 -0
  113. package/scripts/mcp-bridge.js +2 -2
  114. package/scripts/postinstall.js +53 -335
  115. package/scripts/update-changelog.sh +88 -0
  116. package/scripts/validate-skills.mjs +101 -4
  117. package/skills/CLAUDE.md +0 -5
  118. package/skills/_shared/SKILL_TEMPLATE.md +62 -0
  119. package/skills/_shared/helpers.md +2 -8
  120. package/skills/cm-autopilot/scripts/autopilot.py +19 -2
  121. package/skills/cm-brainstorm-idea/SKILL.md +9 -0
  122. package/skills/cm-browse/SKILL.md +6 -0
  123. package/skills/cm-clean-code/SKILL.md +20 -0
  124. package/skills/cm-code-review/SKILL.md +21 -0
  125. package/skills/cm-codeintell/SKILL.md +9 -0
  126. package/skills/cm-conductor-worktrees/SKILL.archive.md +28 -0
  127. package/skills/cm-conductor-worktrees/SKILL.md +20 -18
  128. package/skills/cm-continuity/SKILL.md +41 -33
  129. package/skills/cm-dashboard/SKILL.archive.md +15 -0
  130. package/skills/cm-dashboard/SKILL.md +20 -9
  131. package/skills/cm-dashboard/ui/app.js +9 -1
  132. package/skills/cm-debugging/SKILL.md +9 -0
  133. package/skills/cm-design-studio/SKILL.archive.md +34 -0
  134. package/skills/cm-design-studio/SKILL.md +20 -24
  135. package/skills/cm-design-system/SKILL.md +1 -0
  136. package/skills/cm-ecosystem-roadmap/SKILL.md +4 -0
  137. package/skills/cm-engineering-meta/SKILL.archive.md +73 -0
  138. package/skills/cm-engineering-meta/SKILL.md +19 -62
  139. package/skills/cm-execution/SKILL.md +98 -0
  140. package/skills/cm-git-worktrees/SKILL.archive.md +157 -0
  141. package/skills/cm-git-worktrees/SKILL.md +15 -146
  142. package/skills/cm-guardian-runtime/SKILL.md +5 -1
  143. package/skills/cm-identity-guard/SKILL.md +8 -0
  144. package/skills/cm-mcp-engineering/SKILL.md +4 -0
  145. package/skills/cm-planning/SKILL.md +63 -92
  146. package/skills/cm-post-deploy-canary/SKILL.archive.md +22 -0
  147. package/skills/cm-post-deploy-canary/SKILL.md +20 -12
  148. package/skills/cm-project-bootstrap/SKILL.md +11 -0
  149. package/skills/cm-qa-visual-cli/SKILL.archive.md +22 -0
  150. package/skills/cm-qa-visual-cli/SKILL.md +19 -11
  151. package/skills/cm-quality-gate/SKILL.md +38 -0
  152. package/skills/cm-retro-cli/SKILL.md +4 -0
  153. package/skills/cm-safe-deploy/SKILL.md +9 -0
  154. package/skills/cm-second-opinion-cli/SKILL.archive.md +23 -0
  155. package/skills/cm-second-opinion-cli/SKILL.md +20 -13
  156. package/skills/cm-secret-shield/SKILL.archive.md +580 -0
  157. package/skills/cm-secret-shield/SKILL.md +15 -569
  158. package/skills/cm-security-gate/SKILL.archive.md +239 -0
  159. package/skills/cm-security-gate/SKILL.md +16 -228
  160. package/skills/cm-skill-chain/SKILL.md +25 -4
  161. package/skills/cm-skill-evolution/SKILL.md +83 -0
  162. package/skills/cm-skill-health/SKILL.archive.md +83 -0
  163. package/skills/cm-skill-health/SKILL.md +26 -0
  164. package/skills/cm-skill-index/SKILL.md +19 -3
  165. package/skills/cm-skill-mastery/SKILL.archive.md +156 -0
  166. package/skills/cm-skill-mastery/SKILL.md +16 -146
  167. package/skills/cm-skill-search/SKILL.archive.md +49 -0
  168. package/skills/cm-skill-search/SKILL.md +26 -0
  169. package/skills/cm-skill-share/SKILL.archive.md +58 -0
  170. package/skills/cm-skill-share/SKILL.md +26 -0
  171. package/skills/cm-sprint-bus/SKILL.md +13 -0
  172. package/skills/cm-start/SKILL.md +17 -10
  173. package/skills/cm-tdd/SKILL.md +21 -2
  174. package/skills/cm-terminal/SKILL.md +15 -0
  175. package/skills/cm-test-gate/SKILL.archive.md +245 -0
  176. package/skills/cm-test-gate/SKILL.md +15 -234
  177. package/skills/cm-ui-preview/SKILL.archive.md +153 -0
  178. package/skills/cm-ui-preview/SKILL.md +16 -143
  179. package/skills/cm-ux-master/cli/uxmaster/commands/mcp.py +1 -1
  180. package/skills/cm-ux-master/mcp/mcp-config.json +1 -1
  181. package/skills/cm-ux-master/mcp/server.py +2 -2
  182. package/skills/profiles/design.txt +1 -1
  183. package/skills/profiles/full.txt +4 -10
  184. package/skills/profiles/growth.txt +8 -8
  185. package/skills/profiles/knowledge.txt +1 -1
  186. package/skills/profiles/top35.json +41 -0
  187. package/adapters/antigravity.js +0 -15
  188. package/adapters/claude-code.js +0 -17
  189. package/adapters/cursor.js +0 -16
  190. package/install.sh +0 -1125
  191. package/scripts/viking-demo.ts +0 -105
  192. package/skills/cm-ads-tracker/SKILL.md +0 -401
  193. package/skills/cm-ads-tracker/evals/evals.json +0 -55
  194. package/skills/cm-ads-tracker/references/gtm-architecture.md +0 -321
  195. package/skills/cm-ads-tracker/references/industry-events.md +0 -294
  196. package/skills/cm-ads-tracker/references/platforms-api.md +0 -238
  197. package/skills/cm-ads-tracker/templates/capi-payload.md +0 -79
  198. package/skills/cm-ads-tracker/templates/datalayer-push.js +0 -104
  199. package/skills/cm-ads-tracker/templates/gtm-variables.js +0 -56
  200. package/skills/cm-auto-publisher/SKILL.md +0 -81
  201. package/skills/cm-booking-calendar/SKILL.md +0 -521
  202. package/skills/cm-booking-calendar/references/industry-patterns.md +0 -527
  203. package/skills/cm-booking-calendar/templates/booking-form.css +0 -626
  204. package/skills/cm-booking-calendar/templates/booking-form.html +0 -477
  205. package/skills/cm-booking-calendar/templates/calendar-engine.js +0 -419
  206. package/skills/cm-booking-calendar/templates/calendar-export.js +0 -395
  207. package/skills/cm-booking-calendar/templates/reminder-config.js +0 -629
  208. package/skills/cm-content-factory/.content-factory-state.json +0 -132
  209. package/skills/cm-content-factory/.git 2/logs/refs/heads/main +0 -1
  210. package/skills/cm-content-factory/.git 2/logs/refs/remotes/origin/main +0 -1
  211. package/skills/cm-content-factory/.git 2/objects/02/fb0956734b5f8ba3f918b7defd04a89cfe0076 +0 -0
  212. package/skills/cm-content-factory/.git 2/objects/08/1e129d75dc6feac6c02037272e6bd1a04e3324 +0 -0
  213. package/skills/cm-content-factory/.git 2/objects/0c/5393416f3c5e01c9a655a802bff0dd52f76f0a +0 -0
  214. package/skills/cm-content-factory/.git 2/objects/10/0b9be46978a946a77188f68be725098a122001 +0 -0
  215. package/skills/cm-content-factory/.git 2/objects/10/cf041167fc9843610eb3d90259ef3396315fdc +0 -0
  216. package/skills/cm-content-factory/.git 2/objects/12/5e19538dd6e1338ffe74f6c4c165b00435bf48 +0 -0
  217. package/skills/cm-content-factory/.git 2/objects/16/a9b9d0088d5c1347628b45a2620b479d8ad57c +0 -0
  218. package/skills/cm-content-factory/.git 2/objects/17/8c2a9ef93c33ae4eec9d58e82321f9229843a1 +0 -0
  219. package/skills/cm-content-factory/.git 2/objects/25/397ae41d09104d763bdcac2695209d85cdea89 +0 -0
  220. package/skills/cm-content-factory/.git 2/objects/2f/a836b7947f2d458e1f639788bf4bb0983a3305 +0 -0
  221. package/skills/cm-content-factory/.git 2/objects/3a/baaaf0a1c0909c0828335791557125fba911e0 +0 -0
  222. package/skills/cm-content-factory/.git 2/objects/42/2924221b81f5ce3c4e4daac9a64a24f9b01f9a +0 -0
  223. package/skills/cm-content-factory/.git 2/objects/42/ec0ce707447dc11446a34c9995fb8533801731 +0 -0
  224. package/skills/cm-content-factory/.git 2/objects/46/e43ce92866d56ce74b1d750db307cfe6154a15 +0 -0
  225. package/skills/cm-content-factory/.git 2/objects/48/5e41b633c63f55b8277bcc59f44f67681f671a +0 -0
  226. package/skills/cm-content-factory/.git 2/objects/49/49c596a3a89fa240642acd95dd3258e261eb09 +0 -0
  227. package/skills/cm-content-factory/.git 2/objects/50/9d42d8412ef8eaf7f7e138476bac2e4d10ce60 +0 -0
  228. package/skills/cm-content-factory/.git 2/objects/55/0c8c389d981b463ef849aeb792d8be3ccb6ec8 +0 -0
  229. package/skills/cm-content-factory/.git 2/objects/5d/82d3b18410cdda3ace3677436f0cb599dbe2d2 +0 -0
  230. package/skills/cm-content-factory/.git 2/objects/60/0617c58e871a38b33bf29e282d132bb3c381ad +0 -0
  231. package/skills/cm-content-factory/.git 2/objects/6a/8369a99c687b7245c92ffaf0e0f0dab9014504 +0 -0
  232. package/skills/cm-content-factory/.git 2/objects/79/bea435d40ab531c1aaf6be0432c6a5b7aaed21 +0 -0
  233. package/skills/cm-content-factory/.git 2/objects/7e/5ebd79251c2f14e4aceb86c74b6b6daae6b500 +0 -0
  234. package/skills/cm-content-factory/.git 2/objects/81/98a822a60178d6d5023ddb3e222cddf048742e +0 -0
  235. package/skills/cm-content-factory/.git 2/objects/86/0a0e1943dfe53411d2e499a1f16f46a96ef758 +0 -0
  236. package/skills/cm-content-factory/.git 2/objects/86/971fb55fdc081fdbae52376f0f13e57a4e9b04 +0 -0
  237. package/skills/cm-content-factory/.git 2/objects/88/b89dd609a0a03f8d4fe8bfde20d5b8fc1d326d +0 -0
  238. package/skills/cm-content-factory/.git 2/objects/90/8737edb6b7809e32cc01590b4e08ba42a9d40d +0 -0
  239. package/skills/cm-content-factory/.git 2/objects/93/d5a8a9a7d4fb7f11491cb596a6880528725118 +0 -0
  240. package/skills/cm-content-factory/.git 2/objects/98/46a2ab81d0c3b3eb00ef88fc56989aa7e9f316 +0 -0
  241. package/skills/cm-content-factory/.git 2/objects/9b/d8dd1e49cf274eaf9c555f3ab39dce7af5715e +0 -0
  242. package/skills/cm-content-factory/.git 2/objects/a1/13329fb0cec96ae78b222d33a24c3b5bc7fa1f +0 -0
  243. package/skills/cm-content-factory/.git 2/objects/a9/e6effe626e8a3aea3a8fc3364b492191c6e7d0 +0 -0
  244. package/skills/cm-content-factory/.git 2/objects/ad/6de7e48d9782cca9353d1ff0aa1aab7fe1df85 +0 -0
  245. package/skills/cm-content-factory/.git 2/objects/af/54ae316f771ff692e299ffcd8bf2f06b413b59 +0 -0
  246. package/skills/cm-content-factory/.git 2/objects/b0/4cb8b0b00dad633e731c1472161419e738d674 +0 -0
  247. package/skills/cm-content-factory/.git 2/objects/b3/094abb0b9ed46419b269e4a4e36a459690e3b0 +0 -0
  248. package/skills/cm-content-factory/.git 2/objects/b9/435c5d4baac2cfc5c83009ddd27b46b60db5f1 +0 -0
  249. package/skills/cm-content-factory/.git 2/objects/ba/5da17dbaec5ec2dcfdfd126aead518d1171d5c +0 -0
  250. package/skills/cm-content-factory/.git 2/objects/c0/bf58703aa258ba5dd63083bebaec8f223d844c +0 -0
  251. package/skills/cm-content-factory/.git 2/objects/c4/701a34edf1fc1bad58ccc57bd03f9426acb59a +0 -0
  252. package/skills/cm-content-factory/.git 2/objects/c7/5ccce9a4e5cc74d9b3174550cf6d993ca43638 +0 -0
  253. package/skills/cm-content-factory/.git 2/objects/c7/710d59b5a35b0f1f0a0399386643a0bd94c929 +0 -0
  254. package/skills/cm-content-factory/.git 2/objects/d1/fe58237112e953e5fec52da22cf38e08be3df9 +0 -5
  255. package/skills/cm-content-factory/.git 2/objects/d2/2bbe9fd2f74c95bc5583e803f5e435f1e2cd86 +0 -0
  256. package/skills/cm-content-factory/.git 2/objects/d7/e72852ea2bff74581dbf247d400120086229f4 +0 -0
  257. package/skills/cm-content-factory/.git 2/objects/d8/d4c3b5553e4fd72807e1d4b49ef07d9ef3ac35 +0 -0
  258. package/skills/cm-content-factory/.git 2/objects/dc/75050c2876f6a02ae2a53a3c886f395b622977 +0 -0
  259. package/skills/cm-content-factory/.git 2/objects/ee/e8546f95acec500187c08a28a8b9ee02db0dec +0 -0
  260. package/skills/cm-content-factory/.git 2/objects/ef/263c059208b416c2146434f10cb2b9fabcba16 +0 -0
  261. package/skills/cm-content-factory/.git 2/objects/f3/ae597e84d9a59b88acd21c99bde2eaf686d785 +0 -0
  262. package/skills/cm-content-factory/.git 2/objects/f3/f6f5673c821d3d8e76fa267a9e882e7a5387ea +0 -0
  263. package/skills/cm-content-factory/.git 2/objects/f9/6e6d0ad02624dd11d5848594d056caef7a5e8b +0 -0
  264. package/skills/cm-content-factory/.git 2/objects/ff/278988fc1edf0db3abcf18de795f4cc0b4f3e1 +0 -0
  265. package/skills/cm-content-factory/.git 2/refs/heads/main +0 -1
  266. package/skills/cm-content-factory/.git 2/refs/remotes/origin/main +0 -1
  267. package/skills/cm-content-factory/.pytest_cache 2/v/cache/nodeids +0 -76
  268. package/skills/cm-content-factory/.pytest_cache 2/v/cache/stepwise +0 -1
  269. package/skills/cm-content-factory/AGENTS.md +0 -61
  270. package/skills/cm-content-factory/CLAUDE.md +0 -63
  271. package/skills/cm-content-factory/CURSOR.md +0 -43
  272. package/skills/cm-content-factory/Content Factory.zip +0 -0
  273. package/skills/cm-content-factory/SKILL.md +0 -416
  274. package/skills/cm-content-factory/cf +0 -313
  275. package/skills/cm-content-factory/config.schema.json +0 -397
  276. package/skills/cm-content-factory/dashboard/app.js +0 -556
  277. package/skills/cm-content-factory/dashboard/index.html +0 -397
  278. package/skills/cm-content-factory/dashboard/style.css +0 -1211
  279. package/skills/cm-content-factory/examples/01-real-estate.config.json +0 -146
  280. package/skills/cm-content-factory/examples/02-personal-finance.config.json +0 -146
  281. package/skills/cm-content-factory/examples/03-health-wellness.config.json +0 -147
  282. package/skills/cm-content-factory/examples/04-saas-software.config.json +0 -147
  283. package/skills/cm-content-factory/examples/05-legal-services.config.json +0 -147
  284. package/skills/cm-content-factory/examples/06-insurance.config.json +0 -146
  285. package/skills/cm-content-factory/examples/07-ecommerce-dropship.config.json +0 -146
  286. package/skills/cm-content-factory/examples/08-online-education.config.json +0 -147
  287. package/skills/cm-content-factory/examples/09-crypto-defi.config.json +0 -147
  288. package/skills/cm-content-factory/examples/10-beauty-skincare.config.json +0 -147
  289. package/skills/cm-content-factory/examples/11-home-services.config.json +0 -146
  290. package/skills/cm-content-factory/examples/12-dental-clinic.config.json +0 -147
  291. package/skills/cm-content-factory/examples/13-pet-care.config.json +0 -147
  292. package/skills/cm-content-factory/examples/14-travel-hospitality.config.json +0 -147
  293. package/skills/cm-content-factory/examples/15-ai-automation.config.json +0 -147
  294. package/skills/cm-content-factory/examples/16-wedding-events.config.json +0 -147
  295. package/skills/cm-content-factory/examples/17-fitness-coaching.config.json +0 -148
  296. package/skills/cm-content-factory/examples/18-cybersecurity.config.json +0 -147
  297. package/skills/cm-content-factory/examples/19-food-restaurant.config.json +0 -148
  298. package/skills/cm-content-factory/examples/20-solar-energy.config.json +0 -147
  299. package/skills/cm-content-factory/examples/fitness-blog.config.json +0 -116
  300. package/skills/cm-content-factory/examples/tech-blog.config.json +0 -107
  301. package/skills/cm-content-factory/extensions/EXTENSION_GUIDE.md +0 -72
  302. package/skills/cm-content-factory/extensions/hooks.py +0 -126
  303. package/skills/cm-content-factory/extensions/openclaw_adapter.py +0 -132
  304. package/skills/cm-content-factory/landing/docs/content/changelog.md +0 -36
  305. package/skills/cm-content-factory/landing/docs/content/deployment.md +0 -46
  306. package/skills/cm-content-factory/landing/docs/content/execution-flow.md +0 -67
  307. package/skills/cm-content-factory/landing/docs/content/openspace.md +0 -27
  308. package/skills/cm-content-factory/landing/docs/content/openviking.md +0 -33
  309. package/skills/cm-content-factory/landing/docs/content/use-cases.md +0 -26
  310. package/skills/cm-content-factory/landing/docs/content/v5-intro.md +0 -28
  311. package/skills/cm-content-factory/landing/docs/index.html +0 -240
  312. package/skills/cm-content-factory/landing/index.html +0 -680
  313. package/skills/cm-content-factory/landing/script.js +0 -143
  314. package/skills/cm-content-factory/landing/style.css +0 -1216
  315. package/skills/cm-content-factory/landing/translations.js +0 -508
  316. package/skills/cm-content-factory/logs/events.jsonl +0 -11
  317. package/skills/cm-content-factory/profiles/_template.profile.json +0 -231
  318. package/skills/cm-content-factory/profiles/finance.profile.json +0 -278
  319. package/skills/cm-content-factory/profiles/legal.profile.json +0 -263
  320. package/skills/cm-content-factory/profiles/medical-research.profile.json +0 -321
  321. package/skills/cm-content-factory/profiles/technology.profile.json +0 -275
  322. package/skills/cm-content-factory/scripts/agent_dispatcher.py +0 -266
  323. package/skills/cm-content-factory/scripts/audit.py +0 -106
  324. package/skills/cm-content-factory/scripts/dashboard_server.py +0 -225
  325. package/skills/cm-content-factory/scripts/deploy.py +0 -146
  326. package/skills/cm-content-factory/scripts/extract.py +0 -132
  327. package/skills/cm-content-factory/scripts/landing_generator.py +0 -459
  328. package/skills/cm-content-factory/scripts/memory.py +0 -521
  329. package/skills/cm-content-factory/scripts/monetize.py +0 -239
  330. package/skills/cm-content-factory/scripts/pipeline.py +0 -357
  331. package/skills/cm-content-factory/scripts/plan.py +0 -163
  332. package/skills/cm-content-factory/scripts/publish.py +0 -145
  333. package/skills/cm-content-factory/scripts/research.py +0 -337
  334. package/skills/cm-content-factory/scripts/scaffold.py +0 -464
  335. package/skills/cm-content-factory/scripts/scoreboard.py +0 -336
  336. package/skills/cm-content-factory/scripts/seo.py +0 -90
  337. package/skills/cm-content-factory/scripts/state_manager.py +0 -320
  338. package/skills/cm-content-factory/scripts/token_manager.py +0 -268
  339. package/skills/cm-content-factory/scripts/validate.py +0 -221
  340. package/skills/cm-content-factory/scripts/wizard.py +0 -329
  341. package/skills/cm-content-factory/scripts/write.py +0 -93
  342. package/skills/cm-content-factory/sites/docs-site/src/assets/houston.webp +0 -0
  343. package/skills/cm-content-factory/sites/docs-site/src/content/docs/architecture.md +0 -90
  344. package/skills/cm-content-factory/sites/docs-site/src/content/docs/data-flow.md +0 -54
  345. package/skills/cm-content-factory/sites/docs-site/src/content/docs/deployment.md +0 -38
  346. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/index.md +0 -65
  347. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/lc-content-lifecycle.md +0 -48
  348. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/seq-write-mode.md +0 -39
  349. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/uj-first-batch.md +0 -42
  350. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-content-pipeline.md +0 -51
  351. package/skills/cm-content-factory/sites/docs-site/src/content/docs/flows/wf-learning-cycle.md +0 -52
  352. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/configuration.md +0 -86
  353. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/installation.md +0 -80
  354. package/skills/cm-content-factory/sites/docs-site/src/content/docs/getting-started/intro.md +0 -58
  355. package/skills/cm-content-factory/sites/docs-site/src/content/docs/index.md +0 -102
  356. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/index.md +0 -45
  357. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/optimize-seo.md +0 -29
  358. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/scale-content-production.md +0 -55
  359. package/skills/cm-content-factory/sites/docs-site/src/content/docs/jtbd/standardize-quality.md +0 -29
  360. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-cmo-huong.md +0 -41
  361. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/buyer-content-lead-khoa.md +0 -40
  362. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/index.md +0 -56
  363. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-content-manager-lan.md +0 -46
  364. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-seo-minh.md +0 -45
  365. package/skills/cm-content-factory/sites/docs-site/src/content/docs/personas/user-writer-tu.md +0 -45
  366. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/content-pipeline.md +0 -108
  367. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/index.md +0 -22
  368. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/memory-system.md +0 -52
  369. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/seo-optimization.md +0 -58
  370. package/skills/cm-content-factory/sites/docs-site/src/content/docs/sop/troubleshooting-guide.md +0 -92
  371. package/skills/cm-content-factory/sites/docs-site/src/styles/custom.css +0 -575
  372. package/skills/cm-content-factory/tests/conftest.py +0 -66
  373. package/skills/cm-content-factory/tests/test_agent_dispatcher.py +0 -125
  374. package/skills/cm-content-factory/tests/test_memory.py +0 -128
  375. package/skills/cm-content-factory/tests/test_pipeline.py +0 -107
  376. package/skills/cm-content-factory/tests/test_research.py +0 -56
  377. package/skills/cm-content-factory/tests/test_state_manager.py +0 -131
  378. package/skills/cm-content-factory/tests/test_token_manager.py +0 -110
  379. package/skills/cm-content-factory/tests/test_wizard.py +0 -121
  380. package/skills/cm-cro-methodology/SKILL.md +0 -290
  381. package/skills/cm-cro-methodology/references/COPYWRITING.md +0 -178
  382. package/skills/cm-cro-methodology/references/OBJECTIONS.md +0 -135
  383. package/skills/cm-cro-methodology/references/PERSUASION.md +0 -158
  384. package/skills/cm-cro-methodology/references/RESEARCH.md +0 -220
  385. package/skills/cm-cro-methodology/references/funnel-analysis.md +0 -365
  386. package/skills/cm-cro-methodology/references/testing-methodology.md +0 -330
  387. package/skills/cm-google-form/SKILL.md +0 -266
  388. package/skills/cm-google-form/templates/apps-script.js +0 -55
  389. package/skills/cm-google-form/templates/form-markup.html +0 -110
  390. package/skills/cm-google-form/templates/form-submit.js +0 -201
  391. package/skills/cm-google-form/templates/toast.css +0 -152
  392. package/skills/cm-growth-hacking/SKILL.md +0 -282
  393. package/skills/cm-growth-hacking/bottom-sheet-engine.md +0 -261
  394. package/skills/cm-growth-hacking/calendar-integration.md +0 -264
  395. package/skills/cm-growth-hacking/references/engagement-patterns.md +0 -346
  396. package/skills/cm-growth-hacking/templates/bottom-sheet.css +0 -528
  397. package/skills/cm-growth-hacking/templates/bottom-sheet.js +0 -269
  398. package/skills/cm-growth-hacking/templates/calendar-cta.js +0 -213
  399. package/skills/cm-growth-hacking/templates/tracking-events.js +0 -211
  400. package/skills/cm-growth-hacking/templates/trigger-manager.js +0 -254
  401. package/skills/cm-growth-hacking/tracking-events.md +0 -246
  402. package/skills/cm-growth-hacking/trigger-system.md +0 -342
  403. package/skills/cm-jtbd/SKILL.md +0 -98
  404. package/skills/cm-notebooklm/SKILL.md +0 -156
  405. package/skills/cm-notebooklm/references/command_reference.md +0 -94
  406. package/skills/cm-notebooklm/references/workflows.md +0 -60
  407. package/skills/cm-notebooklm/resources/knowledge_sources.md +0 -106
  408. package/skills/cm-notebooklm/scripts/brain-sync.sh +0 -453
  409. package/skills/cm-notebooklm/scripts/graduate_wisdom.py +0 -101
  410. package/skills/cm-readit/SKILL.md +0 -289
  411. package/skills/cm-readit/audio-player.md +0 -206
  412. package/skills/cm-readit/examples/blog-reader.js +0 -352
  413. package/skills/cm-readit/examples/voice-cro.js +0 -390
  414. package/skills/cm-readit/tts-engine.md +0 -262
  415. package/skills/cm-readit/ui-patterns.md +0 -362
  416. package/skills/cm-readit/voice-cro.md +0 -223
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SkillExecutionCache = void 0;
7
+ exports.formatCacheStats = formatCacheStats;
8
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
9
+ const path_1 = __importDefault(require("path"));
10
+ // ─── Schema ─────────────────────────────────────────────────────────────────
11
+ const CACHE_SCHEMA = `
12
+ CREATE TABLE IF NOT EXISTS skill_cache (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
14
+ task_pattern TEXT NOT NULL,
15
+ skill_chain_json TEXT NOT NULL,
16
+ effectiveness REAL NOT NULL DEFAULT 0,
17
+ token_used INTEGER NOT NULL DEFAULT 0,
18
+ hit_count INTEGER NOT NULL DEFAULT 0,
19
+ last_hit TEXT NOT NULL,
20
+ created_at TEXT NOT NULL
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_skill_cache_pattern ON skill_cache(task_pattern);
24
+
25
+ CREATE VIRTUAL TABLE IF NOT EXISTS skill_cache_fts USING fts5(
26
+ task_pattern,
27
+ content=skill_cache, content_rowid=rowid
28
+ );
29
+
30
+ CREATE TRIGGER IF NOT EXISTS skill_cache_ai AFTER INSERT ON skill_cache BEGIN
31
+ INSERT INTO skill_cache_fts(rowid, task_pattern)
32
+ VALUES (new.rowid, new.task_pattern);
33
+ END;
34
+
35
+ CREATE TRIGGER IF NOT EXISTS skill_cache_ad AFTER DELETE ON skill_cache BEGIN
36
+ INSERT INTO skill_cache_fts(skill_cache_fts, rowid, task_pattern)
37
+ VALUES('delete', old.rowid, old.task_pattern);
38
+ END;
39
+ `;
40
+ // ─── DB Cache (share connection with context-db) ─────────────────────────────
41
+ const dbCache = new Map();
42
+ function getDb(dbPath) {
43
+ if (dbCache.has(dbPath))
44
+ return dbCache.get(dbPath);
45
+ const db = new better_sqlite3_1.default(dbPath);
46
+ db.pragma('journal_mode = WAL');
47
+ dbCache.set(dbPath, db);
48
+ return db;
49
+ }
50
+ // ─── Skill Execution Cache ───────────────────────────────────────────────────
51
+ // TRIZ #35 Parameter Changes — reuse successful execution patterns
52
+ /**
53
+ * SkillExecutionCache — OpenSpace-inspired warm cache for skill chains.
54
+ *
55
+ * When a task succeeds with a specific skill chain, we cache the pattern.
56
+ * For similar future tasks, skip BM25 ranking entirely and reuse the chain.
57
+ *
58
+ * Token savings: ~2000 tokens/task (skip ranking + LLM selection).
59
+ */
60
+ class SkillExecutionCache {
61
+ constructor(projectPath) {
62
+ this.dbPath = path_1.default.join(projectPath, '.cm', 'context.db');
63
+ }
64
+ /**
65
+ * Initialize cache tables. Call once before use.
66
+ */
67
+ initialize() {
68
+ const db = getDb(this.dbPath);
69
+ db.exec(CACHE_SCHEMA);
70
+ }
71
+ /**
72
+ * Cache a successful task execution pattern.
73
+ * Only caches executions with effectiveness >= 0.7.
74
+ */
75
+ cacheExecution(taskPattern, skillChain, effectiveness, tokenUsed) {
76
+ if (effectiveness < 0.7)
77
+ return; // Only cache good executions
78
+ if (!taskPattern.trim() || skillChain.length === 0)
79
+ return;
80
+ const db = getDb(this.dbPath);
81
+ const now = new Date().toISOString();
82
+ // Check if similar pattern already exists
83
+ const existing = this.findExactMatch(taskPattern);
84
+ if (existing) {
85
+ // Update existing entry if new execution is better
86
+ if (effectiveness >= existing.effectiveness) {
87
+ db.prepare(`
88
+ UPDATE skill_cache SET
89
+ skill_chain_json = ?,
90
+ effectiveness = ?,
91
+ token_used = ?,
92
+ hit_count = hit_count + 1,
93
+ last_hit = ?
94
+ WHERE task_pattern = ?
95
+ `).run(JSON.stringify(skillChain), effectiveness, tokenUsed, now, taskPattern);
96
+ }
97
+ else {
98
+ // Just increment hit count
99
+ db.prepare(`
100
+ UPDATE skill_cache SET hit_count = hit_count + 1, last_hit = ? WHERE task_pattern = ?
101
+ `).run(now, taskPattern);
102
+ }
103
+ return;
104
+ }
105
+ db.prepare(`
106
+ INSERT INTO skill_cache
107
+ (task_pattern, skill_chain_json, effectiveness, token_used, hit_count, last_hit, created_at)
108
+ VALUES (?, ?, ?, ?, 1, ?, ?)
109
+ `).run(taskPattern, JSON.stringify(skillChain), effectiveness, tokenUsed, now, now);
110
+ }
111
+ /**
112
+ * Find a cached chain for a task description using BM25 similarity.
113
+ * Returns null if no suitable match (effectiveness >= 0.7).
114
+ */
115
+ findCachedChain(taskDescription) {
116
+ const db = getDb(this.dbPath);
117
+ const query = this.normalizeForSearch(taskDescription);
118
+ if (!query)
119
+ return null;
120
+ try {
121
+ const row = db.prepare(`
122
+ SELECT skill_cache.* FROM skill_cache
123
+ JOIN skill_cache_fts ON skill_cache.rowid = skill_cache_fts.rowid
124
+ WHERE skill_cache_fts MATCH ?
125
+ AND skill_cache.effectiveness >= 0.7
126
+ ORDER BY bm25(skill_cache_fts) * skill_cache.effectiveness * (1.0 + skill_cache.hit_count * 0.1)
127
+ LIMIT 1
128
+ `).get(query);
129
+ if (!row)
130
+ return null;
131
+ return this.rowToCachedChain(row);
132
+ }
133
+ catch (_a) {
134
+ // FTS5 query might fail with special characters
135
+ return null;
136
+ }
137
+ }
138
+ /**
139
+ * Record a cache hit (increment counter, update timestamp).
140
+ */
141
+ recordHit(taskPattern) {
142
+ const db = getDb(this.dbPath);
143
+ db.prepare(`
144
+ UPDATE skill_cache SET hit_count = hit_count + 1, last_hit = ? WHERE task_pattern = ?
145
+ `).run(new Date().toISOString(), taskPattern);
146
+ }
147
+ /**
148
+ * Get cache statistics.
149
+ */
150
+ getStats() {
151
+ const db = getDb(this.dbPath);
152
+ try {
153
+ const stats = db.prepare(`
154
+ SELECT
155
+ COUNT(*) as total_entries,
156
+ COALESCE(SUM(hit_count), 0) as total_hits,
157
+ COALESCE(AVG(effectiveness), 0) as avg_effectiveness,
158
+ COALESCE(SUM(hit_count * token_used), 0) as estimated_tokens_saved
159
+ FROM skill_cache
160
+ `).get();
161
+ return {
162
+ totalEntries: stats.total_entries,
163
+ totalHits: stats.total_hits,
164
+ avgEffectiveness: Math.round(stats.avg_effectiveness * 100) / 100,
165
+ estimatedTokensSaved: stats.estimated_tokens_saved,
166
+ };
167
+ }
168
+ catch (_a) {
169
+ return { totalEntries: 0, totalHits: 0, avgEffectiveness: 0, estimatedTokensSaved: 0 };
170
+ }
171
+ }
172
+ /**
173
+ * List all cached chains.
174
+ */
175
+ listCachedChains(limit = 20) {
176
+ const db = getDb(this.dbPath);
177
+ try {
178
+ const rows = db.prepare('SELECT * FROM skill_cache ORDER BY hit_count DESC, effectiveness DESC LIMIT ?').all(limit);
179
+ return rows.map(r => this.rowToCachedChain(r));
180
+ }
181
+ catch (_a) {
182
+ return [];
183
+ }
184
+ }
185
+ /**
186
+ * Clear all cached chains.
187
+ */
188
+ clearCache() {
189
+ const db = getDb(this.dbPath);
190
+ const info = db.prepare('DELETE FROM skill_cache').run();
191
+ return info.changes;
192
+ }
193
+ /**
194
+ * Close the database connection.
195
+ */
196
+ close() {
197
+ const db = dbCache.get(this.dbPath);
198
+ if (db) {
199
+ try {
200
+ db.close();
201
+ }
202
+ catch ( /* already closed */_a) { /* already closed */ }
203
+ dbCache.delete(this.dbPath);
204
+ }
205
+ }
206
+ // ─── Private Helpers ────────────────────────────────────────────────────────
207
+ findExactMatch(taskPattern) {
208
+ const db = getDb(this.dbPath);
209
+ const row = db.prepare('SELECT * FROM skill_cache WHERE task_pattern = ? LIMIT 1').get(taskPattern);
210
+ return row ? this.rowToCachedChain(row) : null;
211
+ }
212
+ /**
213
+ * Normalize a task description for FTS5 search.
214
+ * Removes special characters that break FTS5 MATCH syntax.
215
+ */
216
+ normalizeForSearch(text) {
217
+ return text
218
+ .replace(/[^\w\s]/g, ' ') // Remove special chars
219
+ .replace(/\s+/g, ' ') // Collapse whitespace
220
+ .trim()
221
+ .split(' ')
222
+ .filter(w => w.length > 2) // Drop short words
223
+ .slice(0, 10) // Limit query length
224
+ .join(' ');
225
+ }
226
+ rowToCachedChain(row) {
227
+ let chain = [];
228
+ try {
229
+ chain = JSON.parse(String(row.skill_chain_json || '[]'));
230
+ }
231
+ catch ( /* empty */_a) { /* empty */ }
232
+ return {
233
+ taskPattern: String(row.task_pattern || ''),
234
+ skillChain: chain,
235
+ effectiveness: Number(row.effectiveness || 0),
236
+ tokenUsed: Number(row.token_used || 0),
237
+ hitCount: Number(row.hit_count || 0),
238
+ lastHit: String(row.last_hit || ''),
239
+ };
240
+ }
241
+ }
242
+ exports.SkillExecutionCache = SkillExecutionCache;
243
+ // ─── Display Helpers ─────────────────────────────────────────────────────────
244
+ function formatCacheStats(stats) {
245
+ const lines = [
246
+ `📦 Skill Execution Cache`,
247
+ `─`.repeat(50),
248
+ `Cached patterns: ${stats.totalEntries}`,
249
+ `Total cache hits: ${stats.totalHits}`,
250
+ `Avg effectiveness: ${(stats.avgEffectiveness * 100).toFixed(1)}%`,
251
+ `Est. tokens saved: ~${stats.estimatedTokensSaved.toLocaleString()}`,
252
+ ];
253
+ return lines.join('\n');
254
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * Skills-Lock — record canonical hashes for every active skill.
4
+ *
5
+ * Stored as `skills-lock.json` at the package root. Each entry records the
6
+ * version (frontmatter), a sha256 of the SKILL.md content, and a generated
7
+ * timestamp. The postinstall verifier compares the current SKILL.md hashes
8
+ * against the lock and warns on drift.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.buildSkillsLock = buildSkillsLock;
15
+ exports.writeSkillsLock = writeSkillsLock;
16
+ exports.verifySkillsLock = verifySkillsLock;
17
+ const fs_1 = __importDefault(require("fs"));
18
+ const path_1 = __importDefault(require("path"));
19
+ const crypto_1 = __importDefault(require("crypto"));
20
+ function sha256OfFile(file) {
21
+ const buf = fs_1.default.readFileSync(file);
22
+ return crypto_1.default.createHash('sha256').update(buf).digest('hex');
23
+ }
24
+ function parseFrontmatter(text) {
25
+ const m = text.match(/^---\n([\s\S]*?)\n---/);
26
+ if (!m)
27
+ return {};
28
+ const out = {};
29
+ const v = m[1].match(/^version:\s*['"]?([\w.\-+]+)['"]?\s*$/m);
30
+ if (v)
31
+ out.version = v[1];
32
+ const d = m[1].match(/^deprecated:\s*(true|false)\s*$/m);
33
+ if (d)
34
+ out.deprecated = d[1] === 'true';
35
+ return out;
36
+ }
37
+ function buildSkillsLock(packageRoot) {
38
+ const skillsDir = path_1.default.join(packageRoot, 'skills');
39
+ const skills = {};
40
+ if (fs_1.default.existsSync(skillsDir)) {
41
+ for (const entry of fs_1.default.readdirSync(skillsDir, { withFileTypes: true })) {
42
+ if (!entry.isDirectory() || !entry.name.startsWith('cm-'))
43
+ continue;
44
+ const skillFile = path_1.default.join(skillsDir, entry.name, 'SKILL.md');
45
+ if (!fs_1.default.existsSync(skillFile))
46
+ continue;
47
+ const text = fs_1.default.readFileSync(skillFile, 'utf8');
48
+ const fm = parseFrontmatter(text);
49
+ skills[entry.name] = Object.assign(Object.assign({ sha256: sha256OfFile(skillFile) }, (fm.version ? { version: fm.version } : {})), (fm.deprecated ? { deprecated: true } : {}));
50
+ }
51
+ }
52
+ return {
53
+ version: 2,
54
+ generated_at: new Date().toISOString(),
55
+ skills,
56
+ };
57
+ }
58
+ function writeSkillsLock(packageRoot) {
59
+ const lock = buildSkillsLock(packageRoot);
60
+ const file = path_1.default.join(packageRoot, 'skills-lock.json');
61
+ fs_1.default.writeFileSync(file, JSON.stringify(lock, null, 2) + '\n', 'utf8');
62
+ return file;
63
+ }
64
+ function verifySkillsLock(packageRoot) {
65
+ var _a, _b;
66
+ const lockPath = path_1.default.join(packageRoot, 'skills-lock.json');
67
+ const result = { ok: true, missing: [], drifted: [], unlocked: [] };
68
+ if (!fs_1.default.existsSync(lockPath)) {
69
+ result.ok = false;
70
+ return result;
71
+ }
72
+ let lock;
73
+ try {
74
+ lock = JSON.parse(fs_1.default.readFileSync(lockPath, 'utf8'));
75
+ }
76
+ catch (_c) {
77
+ result.ok = false;
78
+ return result;
79
+ }
80
+ const current = buildSkillsLock(packageRoot);
81
+ for (const [name, entry] of Object.entries((_a = lock.skills) !== null && _a !== void 0 ? _a : {})) {
82
+ const cur = current.skills[name];
83
+ if (!cur) {
84
+ result.missing.push(name);
85
+ continue;
86
+ }
87
+ if (cur.sha256 !== entry.sha256)
88
+ result.drifted.push(name);
89
+ }
90
+ for (const name of Object.keys(current.skills)) {
91
+ if (!((_b = lock.skills) !== null && _b !== void 0 ? _b : {})[name])
92
+ result.unlocked.push(name);
93
+ }
94
+ result.ok = result.missing.length === 0 && result.drifted.length === 0;
95
+ return result;
96
+ }
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ // ─── Smart Brain Router ─────────────────────────────────────────────────────
3
+ // Task-type classifier + brain tier selector for CodyMaster's 5-Tier Brain.
4
+ // TRIZ #1 Segmentation — load only the brain tiers needed for each task type.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.classifyTask = classifyTask;
7
+ exports.routeTask = routeTask;
8
+ exports.estimateSavings = estimateSavings;
9
+ exports.formatBrainPlan = formatBrainPlan;
10
+ // ─── Tier Costs (average token estimates) ────────────────────────────────────
11
+ const TIER_COSTS = {
12
+ 1: { label: 'Sensory', avgTokens: 0, latencyMs: 0 },
13
+ 2: { label: 'Working', avgTokens: 400, latencyMs: 0 },
14
+ 3: { label: 'Long-term', avgTokens: 650, latencyMs: 50 },
15
+ 4: { label: 'Semantic', avgTokens: 1500, latencyMs: 2000 },
16
+ 5: { label: 'Structural', avgTokens: 3000, latencyMs: 5000 },
17
+ };
18
+ // ─── Task Classifier ────────────────────────────────────────────────────────
19
+ // TRIZ #1 Segmentation — classify to load only what's needed
20
+ /**
21
+ * Lightweight task classifier — keyword based, no LLM call.
22
+ * Cost: ~0 tokens, <1ms.
23
+ */
24
+ function classifyTask(description) {
25
+ const lower = description.toLowerCase();
26
+ // Order matters: more specific patterns first
27
+ if (lower.match(/\b(resume|continue|what was|pick up|carry on|tiếp tục|đang làm gì)\b/)) {
28
+ return 'resume_session';
29
+ }
30
+ if (lower.match(/\b(deploy|ship|release|publish|push to prod|triển khai|xuất bản)\b/)) {
31
+ return 'deployment';
32
+ }
33
+ if (lower.match(/\b(blog|article|content|write about|documentation|bài viết|nội dung|tài liệu)\b/)) {
34
+ return 'content_creation';
35
+ }
36
+ if (lower.match(/\b(fix|bug|error|crash|broken|debug|sửa|lỗi|hỏng)\b/)) {
37
+ return 'code_change';
38
+ }
39
+ if (lower.match(/\b(build|create|implement|add|feature|system|xây|tạo|thêm|tính năng)\b/)) {
40
+ return 'complex_feature';
41
+ }
42
+ // Short descriptive queries are likely simple questions
43
+ if (lower.match(/\b(what|how|why|explain|status|where|show|list)\b/) && lower.length < 120) {
44
+ return 'simple_question';
45
+ }
46
+ return 'code_change'; // Safe default
47
+ }
48
+ // ─── Brain Router ────────────────────────────────────────────────────────────
49
+ /**
50
+ * Smart Brain Router — selects minimal brain layers needed for a task.
51
+ *
52
+ * Problem solved:
53
+ * Without routing, every task loads all 5 tiers = ~5550 tokens + 7s latency.
54
+ * With routing, simple tasks use ~0-400 tokens, complex tasks scale progressively.
55
+ *
56
+ * Estimated savings: ~60-80% token reduction on brain context loading.
57
+ */
58
+ function routeTask(taskDescription) {
59
+ const taskType = classifyTask(taskDescription);
60
+ switch (taskType) {
61
+ case 'simple_question':
62
+ return {
63
+ taskType,
64
+ tiers: [1],
65
+ totalBudget: 200,
66
+ progressiveLoad: false,
67
+ rationale: 'Simple question — Tier 1 (Sensory) only. No memory or code context needed.',
68
+ };
69
+ case 'resume_session':
70
+ return {
71
+ taskType,
72
+ tiers: [1, 2],
73
+ totalBudget: 500,
74
+ progressiveLoad: false,
75
+ rationale: 'Session resume — Tier 1 + Tier 2 (CONTINUITY.md) to recall working state.',
76
+ };
77
+ case 'code_change':
78
+ return {
79
+ taskType,
80
+ tiers: [1, 2, 3, 5],
81
+ tier3Scope: extractScope(taskDescription),
82
+ tier5Filter: extractFilePaths(taskDescription),
83
+ totalBudget: 3000,
84
+ progressiveLoad: false,
85
+ rationale: 'Code change — Tiers 1+2+3+5. Learnings scoped, CodeGraph for affected files.',
86
+ };
87
+ case 'deployment':
88
+ return {
89
+ taskType,
90
+ tiers: [1, 2, 3],
91
+ tier3Scope: 'deploy',
92
+ totalBudget: 1500,
93
+ progressiveLoad: false,
94
+ rationale: 'Deployment — Tiers 1+2+3. Scoped learnings for deploy patterns.',
95
+ };
96
+ case 'content_creation':
97
+ return {
98
+ taskType,
99
+ tiers: [1, 3, 4],
100
+ totalBudget: 2000,
101
+ progressiveLoad: false,
102
+ rationale: 'Content creation — Tiers 1+3+4. Semantic search for related content.',
103
+ };
104
+ case 'complex_feature':
105
+ return {
106
+ taskType,
107
+ tiers: [1, 2, 3, 4, 5],
108
+ totalBudget: 5000,
109
+ progressiveLoad: true,
110
+ rationale: 'Complex feature — All tiers, progressive loading. Start L0, upgrade on demand.',
111
+ };
112
+ }
113
+ }
114
+ // ─── Scope Extraction ────────────────────────────────────────────────────────
115
+ /**
116
+ * Extract a module scope from the task description for Tier 3 scoping.
117
+ * Returns undefined if no clear scope detected.
118
+ */
119
+ function extractScope(description) {
120
+ const lower = description.toLowerCase();
121
+ // Priority 1: Look for common scope keywords (most reliable)
122
+ const scopes = ['auth', 'api', 'deploy', 'test', 'build', 'db', 'ui', 'cli', 'i18n', 'security'];
123
+ const found = scopes.find(s => lower.includes(s));
124
+ if (found)
125
+ return found;
126
+ // Priority 2: Look for explicit "module: xxx" or "component: xxx" patterns
127
+ const moduleMatch = lower.match(/(?:module|component|service|package)[:\s]+(\w[\w-]*)/);
128
+ if (moduleMatch)
129
+ return moduleMatch[1];
130
+ return undefined;
131
+ }
132
+ /**
133
+ * Extract file paths mentioned in the task for Tier 5 filtering.
134
+ */
135
+ function extractFilePaths(description) {
136
+ const matches = description.match(/[\w./-]+\.(ts|js|tsx|jsx|py|go|rs|md|json|yaml|yml)/g);
137
+ return matches && matches.length > 0 ? matches : undefined;
138
+ }
139
+ // ─── Token Savings Estimator ─────────────────────────────────────────────────
140
+ /**
141
+ * Estimate token savings from smart routing vs loading all tiers.
142
+ */
143
+ function estimateSavings(plan) {
144
+ const allTiersTokens = Object.values(TIER_COSTS).reduce((sum, t) => sum + t.avgTokens, 0);
145
+ const planTokens = plan.tiers.reduce((sum, tier) => sum + TIER_COSTS[tier].avgTokens, 0);
146
+ return {
147
+ withoutRouting: allTiersTokens,
148
+ withRouting: planTokens,
149
+ saved: allTiersTokens - planTokens,
150
+ percentage: Math.round(((allTiersTokens - planTokens) / allTiersTokens) * 100),
151
+ };
152
+ }
153
+ // ─── Display Helpers ─────────────────────────────────────────────────────────
154
+ /**
155
+ * Format a BrainLoadPlan for CLI display.
156
+ */
157
+ function formatBrainPlan(plan) {
158
+ const savings = estimateSavings(plan);
159
+ const tierLabels = plan.tiers.map(t => ` ${t}. ${TIER_COSTS[t].label} (~${TIER_COSTS[t].avgTokens} tokens)`);
160
+ const lines = [
161
+ `🧠 Brain Load Plan`,
162
+ `─`.repeat(50),
163
+ `Task type: ${plan.taskType}`,
164
+ `Progressive: ${plan.progressiveLoad ? 'Yes' : 'No'}`,
165
+ `Budget: ${plan.totalBudget.toLocaleString()} tokens`,
166
+ ``,
167
+ `Active tiers:`,
168
+ ...tierLabels,
169
+ ``,
170
+ `Token savings:`,
171
+ ` All tiers: ~${savings.withoutRouting.toLocaleString()} tokens`,
172
+ ` This plan: ~${savings.withRouting.toLocaleString()} tokens`,
173
+ ` Saved: ~${savings.saved.toLocaleString()} tokens (${savings.percentage}%)`,
174
+ ``,
175
+ `Rationale: ${plan.rationale}`,
176
+ ];
177
+ if (plan.tier3Scope) {
178
+ lines.push(`Tier 3 scope: ${plan.tier3Scope}`);
179
+ }
180
+ if (plan.tier5Filter) {
181
+ lines.push(`Tier 5 filter: ${plan.tier5Filter.join(', ')}`);
182
+ }
183
+ return lines.join('\n');
184
+ }
@@ -2,6 +2,10 @@
2
2
  /**
3
3
  * Opinionated sprint pipeline + Context Bus files under `.cm/sprint/`.
4
4
  * Complements root `context-bus.json` with step artifacts (ADR 002).
5
+ *
6
+ * v2.0: optional structured handoff JSON via `src/handoff/`. Sprint skills
7
+ * may call `completeSprintStepWithHandoff()` to emit a typed handoff file
8
+ * alongside the Markdown artifact.
5
9
  */
6
10
  var __importDefault = (this && this.__importDefault) || function (mod) {
7
11
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -12,6 +16,7 @@ exports.readSprintState = readSprintState;
12
16
  exports.writeSprintState = writeSprintState;
13
17
  exports.initSprint = initSprint;
14
18
  exports.completeSprintStep = completeSprintStep;
19
+ exports.completeSprintStepWithHandoff = completeSprintStepWithHandoff;
15
20
  exports.skipSprintStep = skipSprintStep;
16
21
  exports.resetSprint = resetSprint;
17
22
  exports.sprintDryRun = sprintDryRun;
@@ -19,6 +24,7 @@ exports.sprintArtifactPreviewFromDisk = sprintArtifactPreviewFromDisk;
19
24
  exports.skillMappingForStep = skillMappingForStep;
20
25
  const fs_1 = __importDefault(require("fs"));
21
26
  const path_1 = __importDefault(require("path"));
27
+ const handoff_1 = require("./handoff");
22
28
  exports.SPRINT_STEPS = [
23
29
  'brainstorm',
24
30
  'plan',
@@ -109,6 +115,26 @@ function completeSprintStep(projectPath, step, artifactBody) {
109
115
  appendEvent(projectPath, { type: 'complete', step, at: state.updated_at });
110
116
  return state;
111
117
  }
118
+ /**
119
+ * Complete a sprint step AND emit a typed handoff JSON under `.cm/handoff/`.
120
+ *
121
+ * Use this from sprint skills (cm-planning, cm-execution, cm-code-review,
122
+ * cm-quality-gate, cm-brainstorm-idea, cm-retro-cli) to make their output
123
+ * machine-readable for the next phase.
124
+ *
125
+ * The Markdown artifact is still written; handoff is additive.
126
+ */
127
+ function completeSprintStepWithHandoff(projectPath, step, artifactBody, handoff) {
128
+ const state = completeSprintStep(projectPath, step, artifactBody);
129
+ const handoffFile = (0, handoff_1.writeHandoff)(projectPath, handoff);
130
+ appendEvent(projectPath, {
131
+ type: 'handoff',
132
+ step,
133
+ schema: handoff.schema,
134
+ at: state.updated_at,
135
+ });
136
+ return { state, handoffFile };
137
+ }
112
138
  const SKIP_STUB = (step, at) => `# ${step}\n\n_Skipped via \`cm sprint skip\` at ${at}._\n`;
113
139
  function skipSprintStep(projectPath, step) {
114
140
  let state = readSprintState(projectPath);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTaskService = exports.createProjectService = exports.createMessageRepo = exports.createActivityRepo = exports.isValidTransition = exports.createTaskRepo = exports.createProjectRepo = exports.DASHBOARD_DB_PATH = exports.runMigrations = exports.closeDashboardDb = exports.getDashboardDb = void 0;
4
+ var sqlite_1 = require("./sqlite");
5
+ Object.defineProperty(exports, "getDashboardDb", { enumerable: true, get: function () { return sqlite_1.getDashboardDb; } });
6
+ Object.defineProperty(exports, "closeDashboardDb", { enumerable: true, get: function () { return sqlite_1.closeDashboardDb; } });
7
+ Object.defineProperty(exports, "runMigrations", { enumerable: true, get: function () { return sqlite_1.runMigrations; } });
8
+ Object.defineProperty(exports, "DASHBOARD_DB_PATH", { enumerable: true, get: function () { return sqlite_1.DASHBOARD_DB_PATH; } });
9
+ var project_repo_1 = require("./repos/project-repo");
10
+ Object.defineProperty(exports, "createProjectRepo", { enumerable: true, get: function () { return project_repo_1.createProjectRepo; } });
11
+ var task_repo_1 = require("./repos/task-repo");
12
+ Object.defineProperty(exports, "createTaskRepo", { enumerable: true, get: function () { return task_repo_1.createTaskRepo; } });
13
+ Object.defineProperty(exports, "isValidTransition", { enumerable: true, get: function () { return task_repo_1.isValidTransition; } });
14
+ var activity_repo_1 = require("./repos/activity-repo");
15
+ Object.defineProperty(exports, "createActivityRepo", { enumerable: true, get: function () { return activity_repo_1.createActivityRepo; } });
16
+ var message_repo_1 = require("./repos/message-repo");
17
+ Object.defineProperty(exports, "createMessageRepo", { enumerable: true, get: function () { return message_repo_1.createMessageRepo; } });
18
+ var project_service_1 = require("./services/project-service");
19
+ Object.defineProperty(exports, "createProjectService", { enumerable: true, get: function () { return project_service_1.createProjectService; } });
20
+ var task_service_1 = require("./services/task-service");
21
+ Object.defineProperty(exports, "createTaskService", { enumerable: true, get: function () { return task_service_1.createTaskService; } });
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createActivityRepo = createActivityRepo;
4
+ // ─── Repo ───────────────────────────────────────────────────────────────────
5
+ function createActivityRepo(db) {
6
+ const insert = db.prepare(`
7
+ INSERT INTO activities (id, type, message, project_id, task_id, actor_type, actor_id, meta, created_at)
8
+ VALUES (@id, @type, @message, @project_id, @task_id, @actor_type, @actor_id, @meta, @created_at)
9
+ `);
10
+ const getById = db.prepare('SELECT * FROM activities WHERE id = ?');
11
+ const getByProject = db.prepare('SELECT * FROM activities WHERE project_id = ? ORDER BY created_at DESC LIMIT ?');
12
+ const getByTask = db.prepare('SELECT * FROM activities WHERE task_id = ? ORDER BY created_at DESC LIMIT ?');
13
+ const getRecent = db.prepare('SELECT * FROM activities ORDER BY created_at DESC LIMIT ?');
14
+ return {
15
+ create(input) {
16
+ var _a, _b, _c, _d;
17
+ const now = new Date().toISOString();
18
+ const row = {
19
+ id: input.id,
20
+ type: input.type,
21
+ message: input.message,
22
+ project_id: (_a = input.project_id) !== null && _a !== void 0 ? _a : null,
23
+ task_id: (_b = input.task_id) !== null && _b !== void 0 ? _b : null,
24
+ actor_type: (_c = input.actor_type) !== null && _c !== void 0 ? _c : null,
25
+ actor_id: (_d = input.actor_id) !== null && _d !== void 0 ? _d : null,
26
+ meta: input.meta ? JSON.stringify(input.meta) : null,
27
+ created_at: now,
28
+ };
29
+ insert.run(row);
30
+ return row;
31
+ },
32
+ getById(id) {
33
+ var _a;
34
+ return (_a = getById.get(id)) !== null && _a !== void 0 ? _a : null;
35
+ },
36
+ getByProject(projectId, limit = 50) {
37
+ return getByProject.all(projectId, limit);
38
+ },
39
+ getByTask(taskId, limit = 50) {
40
+ return getByTask.all(taskId, limit);
41
+ },
42
+ getRecent(limit = 50) {
43
+ return getRecent.all(limit);
44
+ },
45
+ };
46
+ }