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,113 @@
1
+ "use strict";
2
+ /**
3
+ * TDD Enforcement Gate — blocks execution without tests.
4
+ *
5
+ * TRIZ Principle #10 (Prior Action):
6
+ * Pre-flight check scans for test files BEFORE execution starts.
7
+ *
8
+ * TRIZ Principle #3 (Local Quality):
9
+ * Each task must have its own test file before implementation.
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.findTestFile = findTestFile;
16
+ exports.suggestTestFile = suggestTestFile;
17
+ exports.runTests = runTests;
18
+ exports.enforceTDD = enforceTDD;
19
+ exports.hasTestFile = hasTestFile;
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const child_process_1 = require("child_process");
22
+ /**
23
+ * Find test file for a given source file.
24
+ * Mapping: src/foo.ts → test/foo.test.ts
25
+ * src/bar/baz.ts → test/bar/baz.test.ts
26
+ */
27
+ function findTestFile(sourceFile) {
28
+ const testFile = sourceFile
29
+ .replace(/^src\//, 'test/')
30
+ .replace(/\.ts$/, '.test.ts')
31
+ .replace(/\.js$/, '.test.js');
32
+ return fs_1.default.existsSync(testFile) ? testFile : null;
33
+ }
34
+ /**
35
+ * Suggest test file path for a given source file.
36
+ */
37
+ function suggestTestFile(sourceFile) {
38
+ return sourceFile
39
+ .replace(/^src\//, 'test/')
40
+ .replace(/\.ts$/, '.test.ts')
41
+ .replace(/\.js$/, '.test.js');
42
+ }
43
+ /**
44
+ * Run tests for a specific test file and return failure count.
45
+ */
46
+ function runTests(testFile) {
47
+ try {
48
+ const output = (0, child_process_1.execSync)(`npx vitest run ${testFile} --reporter=verbose`, {
49
+ encoding: 'utf-8',
50
+ timeout: 30000,
51
+ stdio: ['pipe', 'pipe', 'pipe'],
52
+ });
53
+ return { failures: 0, output };
54
+ }
55
+ catch (error) {
56
+ // vitest exits with non-zero code when tests fail
57
+ const output = error.stdout || error.stderr || '';
58
+ const failMatch = output.match(/(\d+) failed/);
59
+ const failures = failMatch ? parseInt(failMatch[1], 10) : 1;
60
+ return { failures, output };
61
+ }
62
+ }
63
+ /**
64
+ * Enforce TDD: verify test file exists and has failing tests (RED phase).
65
+ *
66
+ * Rules:
67
+ * 1. Test file MUST exist for target source file
68
+ * 2. Tests MUST fail (RED phase) before implementation
69
+ * 3. If all tests pass, user must write a failing test first
70
+ */
71
+ function enforceTDD(targetFiles) {
72
+ for (const file of targetFiles) {
73
+ // Skip test files themselves
74
+ if (file.includes('.test.') || file.includes('.spec.')) {
75
+ continue;
76
+ }
77
+ // Skip non-source files
78
+ if (!file.startsWith('src/') && !file.startsWith('lib/')) {
79
+ continue;
80
+ }
81
+ const testFile = findTestFile(file);
82
+ if (!testFile) {
83
+ return {
84
+ passed: false,
85
+ testFile: null,
86
+ message: `TDD GATE: No test file found for ${file}. Write test first: ${suggestTestFile(file)}`,
87
+ };
88
+ }
89
+ const result = runTests(testFile);
90
+ if (result.failures === 0) {
91
+ return {
92
+ passed: false,
93
+ testFile,
94
+ message: `TDD GATE: All tests pass in ${testFile}. Write a failing test for new behavior first (RED phase).`,
95
+ };
96
+ }
97
+ }
98
+ return { passed: true, testFile: null, message: 'TDD GATE: OK — failing tests found (RED phase)' };
99
+ }
100
+ /**
101
+ * Quick check: does test file exist? (no execution, fast)
102
+ */
103
+ function hasTestFile(targetFiles) {
104
+ for (const file of targetFiles) {
105
+ if (file.includes('.test.') || file.includes('.spec.'))
106
+ continue;
107
+ if (!file.startsWith('src/') && !file.startsWith('lib/'))
108
+ continue;
109
+ if (!findTestFile(file))
110
+ return false;
111
+ }
112
+ return true;
113
+ }
@@ -0,0 +1,138 @@
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.ExecutionAnalyzer = void 0;
7
+ exports.qualityWeight = qualityWeight;
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const context_bus_1 = require("./context-bus");
11
+ const storage_backend_1 = require("./storage-backend");
12
+ const retro_summary_1 = require("./retro-summary");
13
+ function bucketLatency(latencyMs) {
14
+ if (latencyMs === undefined || latencyMs < 0)
15
+ return undefined;
16
+ if (latencyMs < 1000)
17
+ return 'subsecond';
18
+ if (latencyMs < 5000)
19
+ return 'fast';
20
+ if (latencyMs < 15000)
21
+ return 'medium';
22
+ return 'slow';
23
+ }
24
+ function buildRetroSummary(projectPath, limit = 3) {
25
+ const retroPath = path_1.default.join(projectPath, '.cm', 'operational-learnings.jsonl');
26
+ const entries = (0, retro_summary_1.loadRetroEntries)(retroPath).slice(-limit);
27
+ if (entries.length === 0)
28
+ return undefined;
29
+ return entries.map((entry) => `- [${entry.tool}] ${entry.note}`).join('\n');
30
+ }
31
+ function normalizeJudgments(input) {
32
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
33
+ const map = new Map();
34
+ for (const skill of (_a = input.selectedSkills) !== null && _a !== void 0 ? _a : []) {
35
+ map.set(skill, {
36
+ skill,
37
+ selected: true,
38
+ applied: true,
39
+ task_completed: input.taskStatus === 'completed',
40
+ fallback_used: false,
41
+ });
42
+ }
43
+ for (const observation of (_b = input.skillObservations) !== null && _b !== void 0 ? _b : []) {
44
+ const current = (_c = map.get(observation.skill)) !== null && _c !== void 0 ? _c : { skill: observation.skill };
45
+ map.set(observation.skill, {
46
+ skill: observation.skill,
47
+ selected: (_e = (_d = observation.selected) !== null && _d !== void 0 ? _d : current.selected) !== null && _e !== void 0 ? _e : false,
48
+ applied: (_g = (_f = observation.applied) !== null && _f !== void 0 ? _f : current.applied) !== null && _g !== void 0 ? _g : ((_j = (_h = observation.selected) !== null && _h !== void 0 ? _h : current.selected) !== null && _j !== void 0 ? _j : false),
49
+ task_completed: input.taskStatus === 'completed',
50
+ fallback_used: (_l = (_k = observation.fallbackUsed) !== null && _k !== void 0 ? _k : current.fallback_used) !== null && _l !== void 0 ? _l : false,
51
+ token_estimate: (_m = observation.tokenEstimate) !== null && _m !== void 0 ? _m : current.token_estimate,
52
+ note: (_o = observation.note) !== null && _o !== void 0 ? _o : current.note,
53
+ relevance_score: (_p = observation.relevanceScore) !== null && _p !== void 0 ? _p : current.relevance_score,
54
+ });
55
+ }
56
+ return Array.from(map.values());
57
+ }
58
+ function qualityWeight(metric) {
59
+ if (!metric)
60
+ return 0.5;
61
+ const base = Math.max(metric.selections, 1);
62
+ const applicationRate = metric.applications / base;
63
+ const completionRate = metric.task_completions / base;
64
+ const fallbackPenalty = metric.fallbacks / base;
65
+ const weighted = (applicationRate * 0.35) + (completionRate * 0.5) + ((1 - fallbackPenalty) * 0.15);
66
+ return Math.max(0, Math.min(1, weighted));
67
+ }
68
+ function buildAdvisory(taskStatus, judgments, backend) {
69
+ const activeSkills = judgments.filter((judgment) => judgment.selected || judgment.applied).map((judgment) => judgment.skill);
70
+ const fallbackSkills = judgments.filter((judgment) => judgment.fallback_used).map((judgment) => judgment.skill);
71
+ if (taskStatus !== 'completed' && activeSkills.length > 0) {
72
+ const weakest = activeSkills
73
+ .map((skill) => ({ skill, weight: qualityWeight(backend.getSkillMetric(skill)) }))
74
+ .sort((a, b) => a.weight - b.weight)[0];
75
+ const targetSkills = weakest ? [weakest.skill] : activeSkills.slice(0, 1);
76
+ return {
77
+ action: 'FIX',
78
+ confidence: weakest ? Math.max(0.68, 0.82 - weakest.weight * 0.2) : 0.72,
79
+ reason: 'Task did not complete successfully while selected skills were active.',
80
+ targetSkills,
81
+ };
82
+ }
83
+ if (taskStatus === 'completed' && activeSkills.length === 0) {
84
+ return {
85
+ action: 'CAPTURED',
86
+ confidence: 0.76,
87
+ reason: 'Task completed without any tracked skill usage, suggesting a reusable pattern worth capturing.',
88
+ targetSkills: [],
89
+ };
90
+ }
91
+ if (taskStatus === 'completed' && fallbackSkills.length > 0) {
92
+ return {
93
+ action: 'DERIVED',
94
+ confidence: 0.74,
95
+ reason: 'Task completed, but fallback handling suggests the current skill may need a specialized derived variant.',
96
+ targetSkills: fallbackSkills,
97
+ };
98
+ }
99
+ return {
100
+ reason: 'No evolution action recommended from the current execution signal.',
101
+ targetSkills: [],
102
+ };
103
+ }
104
+ class ExecutionAnalyzer {
105
+ constructor(projectPath, backend) {
106
+ this.projectPath = projectPath;
107
+ this.backend = backend !== null && backend !== void 0 ? backend : (0, storage_backend_1.getBackend)(projectPath);
108
+ this.backend.initialize();
109
+ }
110
+ analyzeExecution(input) {
111
+ var _a, _b, _c;
112
+ const judgments = normalizeJudgments(input);
113
+ const bus = (0, context_bus_1.readBus)(this.projectPath);
114
+ const retroSummary = buildRetroSummary(this.projectPath);
115
+ const advisory = buildAdvisory(input.taskStatus, judgments, this.backend);
116
+ const analysis = {
117
+ id: crypto_1.default.randomUUID(),
118
+ task_title: input.taskTitle,
119
+ status: input.taskStatus,
120
+ summary: (_a = input.summary) !== null && _a !== void 0 ? _a : `${input.taskStatus.toUpperCase()}: ${input.taskTitle}`,
121
+ source_task_type: input.sourceTaskType,
122
+ session_id: (_b = input.sessionId) !== null && _b !== void 0 ? _b : bus === null || bus === void 0 ? void 0 : bus.session_id,
123
+ chain_id: input.chainId,
124
+ selected_skills: (_c = input.selectedSkills) !== null && _c !== void 0 ? _c : judgments.filter((judgment) => judgment.selected).map((judgment) => judgment.skill),
125
+ token_estimate: input.tokenEstimate,
126
+ latency_bucket: bucketLatency(input.latencyMs),
127
+ bus_snapshot: bus ? JSON.stringify(bus.shared_context) : undefined,
128
+ retro_summary: retroSummary,
129
+ recommended_action: advisory.action,
130
+ confidence: advisory.confidence,
131
+ skill_judgments: judgments,
132
+ created_at: new Date().toISOString(),
133
+ };
134
+ this.backend.recordExecutionAnalysis(analysis);
135
+ return analysis;
136
+ }
137
+ }
138
+ exports.ExecutionAnalyzer = ExecutionAnalyzer;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.cancelTask = cancelTask;
16
+ const child_process_1 = require("child_process");
17
+ const os_1 = __importDefault(require("os"));
18
+ function cancelTask(taskId, pgid) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ if (os_1.default.platform() === 'win32') {
21
+ (0, child_process_1.execFileSync)('taskkill', ['/PID', String(pgid), '/T', '/F'], { timeout: 10000 });
22
+ }
23
+ else {
24
+ process.kill(-pgid, 'SIGTERM');
25
+ yield new Promise(resolve => setTimeout(resolve, 5000));
26
+ try {
27
+ process.kill(-pgid, 'SIGKILL');
28
+ }
29
+ catch (_a) {
30
+ // already dead
31
+ }
32
+ }
33
+ });
34
+ }
@@ -0,0 +1,74 @@
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.startGcLoop = startGcLoop;
7
+ exports.gcPass = gcPass;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const WORKSPACES_ROOT = path_1.default.join(os_1.default.homedir(), '.cm', 'workspaces');
12
+ const DEFAULT_GC_TTL_MS = 24 * 60 * 60 * 1000; // 24h
13
+ const DEFAULT_GC_ORPHAN_TTL_MS = 72 * 60 * 60 * 1000; // 72h
14
+ const GC_INTERVAL_MS = 60 * 60 * 1000; // 1h
15
+ function startGcLoop() {
16
+ return setInterval(() => {
17
+ gcPass();
18
+ }, GC_INTERVAL_MS);
19
+ }
20
+ function gcPass() {
21
+ let removed = 0;
22
+ let errors = 0;
23
+ if (!fs_1.default.existsSync(WORKSPACES_ROOT)) {
24
+ return { removed, errors };
25
+ }
26
+ const now = Date.now();
27
+ try {
28
+ const projects = fs_1.default.readdirSync(WORKSPACES_ROOT);
29
+ for (const project of projects) {
30
+ const projectDir = path_1.default.join(WORKSPACES_ROOT, project);
31
+ if (!fs_1.default.statSync(projectDir).isDirectory())
32
+ continue;
33
+ try {
34
+ const tasks = fs_1.default.readdirSync(projectDir);
35
+ for (const task of tasks) {
36
+ const taskDir = path_1.default.join(projectDir, task);
37
+ if (!fs_1.default.statSync(taskDir).isDirectory())
38
+ continue;
39
+ const gcMetaPath = path_1.default.join(taskDir, '.gc_meta.json');
40
+ try {
41
+ if (fs_1.default.existsSync(gcMetaPath)) {
42
+ const meta = JSON.parse(fs_1.default.readFileSync(gcMetaPath, 'utf-8'));
43
+ if (meta.completedAt) {
44
+ const completedTime = new Date(meta.completedAt).getTime();
45
+ if (now - completedTime > DEFAULT_GC_TTL_MS) {
46
+ fs_1.default.rmSync(taskDir, { recursive: true, force: true });
47
+ removed++;
48
+ }
49
+ }
50
+ }
51
+ else {
52
+ const stat = fs_1.default.statSync(taskDir);
53
+ const age = now - stat.mtimeMs;
54
+ if (age > DEFAULT_GC_ORPHAN_TTL_MS) {
55
+ fs_1.default.rmSync(taskDir, { recursive: true, force: true });
56
+ removed++;
57
+ }
58
+ }
59
+ }
60
+ catch (_a) {
61
+ errors++;
62
+ }
63
+ }
64
+ }
65
+ catch (_b) {
66
+ errors++;
67
+ }
68
+ }
69
+ }
70
+ catch (_c) {
71
+ errors++;
72
+ }
73
+ return { removed, errors };
74
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cancelTask = exports.runTask = exports.gcPass = exports.startGcLoop = exports.reuseWorkdir = exports.writeGcMeta = exports.prepareWorkdir = void 0;
4
+ var workdir_1 = require("./workdir");
5
+ Object.defineProperty(exports, "prepareWorkdir", { enumerable: true, get: function () { return workdir_1.prepareWorkdir; } });
6
+ Object.defineProperty(exports, "writeGcMeta", { enumerable: true, get: function () { return workdir_1.writeGcMeta; } });
7
+ Object.defineProperty(exports, "reuseWorkdir", { enumerable: true, get: function () { return workdir_1.reuseWorkdir; } });
8
+ var gc_1 = require("./gc");
9
+ Object.defineProperty(exports, "startGcLoop", { enumerable: true, get: function () { return gc_1.startGcLoop; } });
10
+ Object.defineProperty(exports, "gcPass", { enumerable: true, get: function () { return gc_1.gcPass; } });
11
+ var runner_1 = require("./runner");
12
+ Object.defineProperty(exports, "runTask", { enumerable: true, get: function () { return runner_1.runTask; } });
13
+ var cancel_1 = require("./cancel");
14
+ Object.defineProperty(exports, "cancelTask", { enumerable: true, get: function () { return cancel_1.cancelTask; } });
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.runTask = runTask;
20
+ const workdir_1 = require("./workdir");
21
+ function runTask(opts) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const { backend, taskId, projectId, prompt, execOpts, eventBus, priorWorkdir, pinnedSessionId, } = opts;
24
+ const projectShort = projectId.slice(0, 8);
25
+ const taskShort = taskId.slice(0, 8);
26
+ const workdir = priorWorkdir !== null && priorWorkdir !== void 0 ? priorWorkdir : (0, workdir_1.prepareWorkdir)(projectShort, taskShort);
27
+ const resolvedOpts = Object.assign(Object.assign({}, execOpts), { cwd: workdir, resumeSessionId: pinnedSessionId !== null && pinnedSessionId !== void 0 ? pinnedSessionId : execOpts.resumeSessionId });
28
+ const session = yield backend.execute(prompt, resolvedOpts);
29
+ let lastSessionId = pinnedSessionId;
30
+ const messageLoop = (() => __awaiter(this, void 0, void 0, function* () {
31
+ var _a, e_1, _b, _c;
32
+ try {
33
+ for (var _d = true, _e = __asyncValues(session.messages), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
34
+ _c = _f.value;
35
+ _d = false;
36
+ const msg = _c;
37
+ emitAgentMessage(eventBus, taskId, projectId, msg);
38
+ if (msg.type === 'text' && msg.sessionId) {
39
+ lastSessionId = msg.sessionId;
40
+ }
41
+ }
42
+ }
43
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
44
+ finally {
45
+ try {
46
+ if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
47
+ }
48
+ finally { if (e_1) throw e_1.error; }
49
+ }
50
+ }))();
51
+ const [result] = yield Promise.all([session.result, messageLoop]);
52
+ if (lastSessionId && !result.sessionId) {
53
+ result.sessionId = lastSessionId;
54
+ }
55
+ (0, workdir_1.writeGcMeta)(projectShort, taskShort, {
56
+ taskId,
57
+ projectId,
58
+ completedAt: new Date().toISOString(),
59
+ });
60
+ return result;
61
+ });
62
+ }
63
+ function emitAgentMessage(eventBus, taskId, projectId, msg) {
64
+ eventBus.emitTask({
65
+ type: 'task.message',
66
+ taskId,
67
+ projectId,
68
+ data: { message: msg },
69
+ });
70
+ }
@@ -0,0 +1,31 @@
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.prepareWorkdir = prepareWorkdir;
7
+ exports.writeGcMeta = writeGcMeta;
8
+ exports.reuseWorkdir = reuseWorkdir;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const WORKSPACES_ROOT = path_1.default.join(os_1.default.homedir(), '.cm', 'workspaces');
13
+ function prepareWorkdir(projectShort, taskShort) {
14
+ const workdir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'workdir');
15
+ fs_1.default.mkdirSync(workdir, { recursive: true });
16
+ const outputDir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'output');
17
+ const logsDir = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, 'logs');
18
+ fs_1.default.mkdirSync(outputDir, { recursive: true });
19
+ fs_1.default.mkdirSync(logsDir, { recursive: true });
20
+ return workdir;
21
+ }
22
+ function writeGcMeta(projectShort, taskShort, meta) {
23
+ const metaPath = path_1.default.join(WORKSPACES_ROOT, projectShort, taskShort, '.gc_meta.json');
24
+ fs_1.default.writeFileSync(metaPath, JSON.stringify(meta, null, 2));
25
+ }
26
+ function reuseWorkdir(existingPath) {
27
+ if (!fs_1.default.existsSync(existingPath)) {
28
+ throw new Error(`Workdir not found: ${existingPath}`);
29
+ }
30
+ return existingPath;
31
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * Handoff JSON contracts for the sprint flow (v2.0).
4
+ *
5
+ * Each sprint phase emits a typed handoff JSON under `.cm/handoff/`.
6
+ * Downstream skills read the predecessor's handoff to pick up cold,
7
+ * eliminating re-derivation cost.
8
+ *
9
+ * Schema versioning: every contract has a `schema: "<name>@<n>"` field.
10
+ * Bump @n on breaking change; readers should reject unknown majors.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.HANDOFF_FILENAMES = void 0;
14
+ exports.HANDOFF_FILENAMES = {
15
+ 'intent@1': 'intent.json',
16
+ 'plan@1': 'plan.json',
17
+ 'exec@1': 'exec.json',
18
+ 'review@1': 'review.json',
19
+ 'quality@1': 'quality.json',
20
+ 'retro@1': 'retro.json',
21
+ 'party@1': 'party.json',
22
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./contracts.js"), exports);
18
+ __exportStar(require("./io.js"), exports);
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Handoff JSON read/write helpers.
4
+ *
5
+ * Files live under `<projectPath>/.cm/handoff/<name>.json`.
6
+ * Validation is intentionally lightweight (no zod dep) — schema field +
7
+ * required key presence is enough to catch drift early.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.HandoffError = void 0;
14
+ exports.handoffPath = handoffPath;
15
+ exports.ensureHandoffDir = ensureHandoffDir;
16
+ exports.validateHandoff = validateHandoff;
17
+ exports.writeHandoff = writeHandoff;
18
+ exports.readHandoff = readHandoff;
19
+ exports.listHandoffs = listHandoffs;
20
+ exports.clearHandoffs = clearHandoffs;
21
+ exports.nowIso = nowIso;
22
+ const fs_1 = __importDefault(require("fs"));
23
+ const path_1 = __importDefault(require("path"));
24
+ const contracts_js_1 = require("./contracts.js");
25
+ class HandoffError extends Error {
26
+ }
27
+ exports.HandoffError = HandoffError;
28
+ function handoffDir(projectPath) {
29
+ return path_1.default.join(projectPath, '.cm', 'handoff');
30
+ }
31
+ function handoffPath(projectPath, schema) {
32
+ return path_1.default.join(handoffDir(projectPath), contracts_js_1.HANDOFF_FILENAMES[schema]);
33
+ }
34
+ function ensureHandoffDir(projectPath) {
35
+ const d = handoffDir(projectPath);
36
+ if (!fs_1.default.existsSync(d))
37
+ fs_1.default.mkdirSync(d, { recursive: true });
38
+ }
39
+ /** Required top-level keys for every envelope. */
40
+ const ENVELOPE_KEYS = ['schema', 'emitted_at', 'emitted_by', 'data'];
41
+ /** Per-schema required keys inside `data`. */
42
+ const DATA_KEYS = {
43
+ 'intent@1': ['problem', 'success_criteria', 'constraints', 'options_considered'],
44
+ 'plan@1': ['goal', 'decisions', 'first_tasks'],
45
+ 'exec@1': ['completed_tasks', 'pending_tasks', 'files_changed', 'test_status'],
46
+ 'review@1': ['verdict', 'findings', 'must_fix_count'],
47
+ 'quality@1': ['gates_passed', 'gates_failed', 'safe_to_ship', 'evidence'],
48
+ 'retro@1': ['sprint_id', 'learnings'],
49
+ 'party@1': ['topic', 'personas'],
50
+ };
51
+ function validateHandoff(obj) {
52
+ if (!obj || typeof obj !== 'object') {
53
+ throw new HandoffError('handoff must be an object');
54
+ }
55
+ const o = obj;
56
+ for (const k of ENVELOPE_KEYS) {
57
+ if (!(k in o))
58
+ throw new HandoffError(`handoff missing key: ${k}`);
59
+ }
60
+ const schema = o.schema;
61
+ if (typeof schema !== 'string' || !(schema in contracts_js_1.HANDOFF_FILENAMES)) {
62
+ throw new HandoffError(`unknown schema: ${String(schema)}`);
63
+ }
64
+ const data = o.data;
65
+ if (!data || typeof data !== 'object') {
66
+ throw new HandoffError('handoff.data must be an object');
67
+ }
68
+ const required = DATA_KEYS[schema];
69
+ for (const k of required) {
70
+ if (!(k in data)) {
71
+ throw new HandoffError(`handoff[${schema}].data missing key: ${k}`);
72
+ }
73
+ }
74
+ }
75
+ function writeHandoff(projectPath, handoff) {
76
+ validateHandoff(handoff);
77
+ ensureHandoffDir(projectPath);
78
+ const file = handoffPath(projectPath, handoff.schema);
79
+ fs_1.default.writeFileSync(file, JSON.stringify(handoff, null, 2), 'utf8');
80
+ return file;
81
+ }
82
+ function readHandoff(projectPath, schema) {
83
+ const file = handoffPath(projectPath, schema);
84
+ if (!fs_1.default.existsSync(file))
85
+ return null;
86
+ const raw = fs_1.default.readFileSync(file, 'utf8');
87
+ let parsed;
88
+ try {
89
+ parsed = JSON.parse(raw);
90
+ }
91
+ catch (e) {
92
+ throw new HandoffError(`handoff file is not valid JSON: ${file}`);
93
+ }
94
+ validateHandoff(parsed);
95
+ if (parsed.schema !== schema) {
96
+ throw new HandoffError(`handoff schema mismatch: expected ${schema}, got ${parsed.schema}`);
97
+ }
98
+ return parsed;
99
+ }
100
+ function listHandoffs(projectPath) {
101
+ const d = handoffDir(projectPath);
102
+ if (!fs_1.default.existsSync(d))
103
+ return [];
104
+ return fs_1.default.readdirSync(d).filter((f) => f.endsWith('.json'));
105
+ }
106
+ function clearHandoffs(projectPath) {
107
+ const d = handoffDir(projectPath);
108
+ if (!fs_1.default.existsSync(d))
109
+ return 0;
110
+ let n = 0;
111
+ for (const f of fs_1.default.readdirSync(d)) {
112
+ if (f.endsWith('.json')) {
113
+ fs_1.default.unlinkSync(path_1.default.join(d, f));
114
+ n++;
115
+ }
116
+ }
117
+ return n;
118
+ }
119
+ function nowIso() {
120
+ return new Date().toISOString();
121
+ }
package/dist/index.js CHANGED
@@ -31,9 +31,6 @@ function main() {
31
31
  // ─── Registration ──────────────────────────────────────────────────────────
32
32
  // Register all modular commands
33
33
  (0, command_registry_1.registerAllCommands)(program);
34
- // ─── Update Check ──────────────────────────────────────────────────────────
35
- // Run update check in background (non-blocking)
36
- (0, update_check_1.checkForUpdates)().catch(() => { });
37
34
  // ─── Execution ─────────────────────────────────────────────────────────────
38
35
  // Parse arguments and execute
39
36
  program.parse(process.argv);
@@ -41,6 +38,13 @@ function main() {
41
38
  if (process.argv.length <= 2) {
42
39
  program.help();
43
40
  }
41
+ // ─── Update Check (after command runs, non-blocking) ───────────────────────
42
+ // Show update notification in background after command completes
43
+ (0, update_check_1.checkForUpdates)().then((info) => {
44
+ if (info) {
45
+ (0, update_check_1.promptForUpgrade)(info).catch(() => { });
46
+ }
47
+ }).catch(() => { });
44
48
  });
45
49
  }
46
50
  // Error handling for uncaught exceptions