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
@@ -1,41 +1,9 @@
1
1
  "use strict";
2
2
  /**
3
- * Local HTTP browse daemon (Playwright + Express). Bearer auth.
4
- * Refs: POST /refs/refresh tags interactive elements with data-cm-ref.
3
+ * Local HTTP browse daemon (Hybrid Bridge). Bearer auth.
4
+ * Supports both Playwright and agent-browser via adapter pattern.
5
+ * All existing endpoints are backward compatible.
5
6
  */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
- Object.defineProperty(o, "default", { enumerable: true, value: v });
19
- }) : function(o, v) {
20
- o["default"] = v;
21
- });
22
- var __importStar = (this && this.__importStar) || (function () {
23
- var ownKeys = function(o) {
24
- ownKeys = Object.getOwnPropertyNames || function (o) {
25
- var ar = [];
26
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
- return ar;
28
- };
29
- return ownKeys(o);
30
- };
31
- return function (mod) {
32
- if (mod && mod.__esModule) return mod;
33
- var result = {};
34
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
- __setModuleDefault(result, mod);
36
- return result;
37
- };
38
- })();
39
7
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
40
8
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
41
9
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -51,28 +19,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
51
19
  Object.defineProperty(exports, "__esModule", { value: true });
52
20
  exports.BrowseDaemon = void 0;
53
21
  const express_1 = __importDefault(require("express"));
54
- function createRing(max) {
55
- const buf = [];
56
- return {
57
- push(item) {
58
- buf.push(item);
59
- while (buf.length > max)
60
- buf.shift();
61
- },
62
- snapshot: () => [...buf],
63
- };
64
- }
22
+ const adapter_factory_1 = require("./browse/adapter-factory");
23
+ const event_log_1 = require("./browse/event-log");
65
24
  class BrowseDaemon {
66
25
  constructor(opts) {
67
26
  this.opts = opts;
68
27
  this.app = (0, express_1.default)();
69
28
  this.httpServer = null;
70
- this.browser = null;
71
- this.context = null;
72
- this.page = null;
73
- this.consoleBuf = createRing(200);
74
- this.networkBuf = createRing(200);
75
- this.refMap = {};
29
+ this.adapter = null;
30
+ this.eventLog = new event_log_1.EventLog({ maxSize: 1000 });
31
+ this.engineName = 'unknown';
32
+ this.sessionActive = false;
33
+ this.app.disable('x-powered-by');
34
+ this.app.use((_req, res, next) => {
35
+ res.setHeader('X-Content-Type-Options', 'nosniff');
36
+ res.setHeader('X-Frame-Options', 'DENY');
37
+ res.setHeader('X-XSS-Protection', '1; mode=block');
38
+ res.setHeader('Content-Security-Policy', "default-src 'none'; frame-ancestors 'none';");
39
+ next();
40
+ });
76
41
  this.app.use(express_1.default.json({ limit: '2mb' }));
77
42
  this.app.use(this.authMiddleware.bind(this));
78
43
  this.routes();
@@ -89,122 +54,124 @@ class BrowseDaemon {
89
54
  next();
90
55
  }
91
56
  routes() {
57
+ // ── Health (no auth) ───────────────────────────────────────────────────
92
58
  this.app.get('/health', (_req, res) => {
93
- res.json({ ok: true, hasPage: !!this.page });
59
+ res.json({ ok: true, session: this.sessionActive, engine: this.engineName });
94
60
  });
61
+ // ── Session start ─────────────────────────────────────────────────────
95
62
  this.app.post('/session/start', (req, res) => __awaiter(this, void 0, void 0, function* () {
96
- var _a, _b, _c;
63
+ var _a, _b, _c, _d, _e, _f;
97
64
  try {
98
65
  const headless = (_c = (_b = (_a = req.body) === null || _a === void 0 ? void 0 : _a.headless) !== null && _b !== void 0 ? _b : this.opts.headless) !== null && _c !== void 0 ? _c : true;
99
- const pw = yield Promise.resolve().then(() => __importStar(require('playwright')));
100
- this.browser = yield pw.chromium.launch({ headless });
101
- this.context = yield this.browser.newContext();
102
- this.page = yield this.context.newPage();
103
- this.page.on('console', (msg) => {
104
- this.consoleBuf.push({
105
- type: msg.type(),
106
- text: msg.text(),
107
- ts: new Date().toISOString(),
108
- });
66
+ const engine = (_f = (_e = (_d = req.body) === null || _d === void 0 ? void 0 : _d.engine) !== null && _e !== void 0 ? _e : this.opts.engine) !== null && _f !== void 0 ? _f : 'auto';
67
+ const result = yield (0, adapter_factory_1.createAdapter)(engine);
68
+ this.adapter = result.adapter;
69
+ this.engineName = result.engine;
70
+ yield this.adapter.startSession({ headless });
71
+ this.sessionActive = true;
72
+ this.eventLog.push({
73
+ category: 'session',
74
+ type: 'start',
75
+ message: `Session started with ${result.engine}${result.fallback ? ' (fallback)' : ''}`,
109
76
  });
110
- this.context.on('response', (response) => {
111
- try {
112
- this.networkBuf.push({
113
- url: response.url(),
114
- method: response.request().method(),
115
- status: response.status(),
116
- ts: new Date().toISOString(),
117
- });
118
- }
119
- catch (_a) {
120
- /* ignore */
121
- }
122
- });
123
- res.json({ ok: true });
77
+ res.json({ ok: true, engine: result.engine, fallback: result.fallback });
124
78
  }
125
79
  catch (e) {
126
80
  res.status(500).json({ error: e.message });
127
81
  }
128
82
  }));
83
+ // ── Navigate ──────────────────────────────────────────────────────────
129
84
  this.app.post('/navigate', (req, res) => __awaiter(this, void 0, void 0, function* () {
130
85
  var _a;
131
86
  try {
132
87
  const url = (_a = req.body) === null || _a === void 0 ? void 0 : _a.url;
133
- if (!url || !this.page) {
88
+ if (!url || !this.adapter) {
134
89
  res.status(400).json({ error: 'url required and session must be started' });
135
90
  return;
136
91
  }
137
- yield this.page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
138
- res.json({ ok: true, url: this.page.url() });
92
+ yield this.adapter.navigate(url);
93
+ this.eventLog.push({
94
+ category: 'session',
95
+ type: 'navigate',
96
+ message: url,
97
+ source: url,
98
+ });
99
+ res.json({ ok: true, url });
139
100
  }
140
101
  catch (e) {
141
102
  res.status(500).json({ error: e.message });
142
103
  }
143
104
  }));
105
+ // ── Refs refresh (backward compat — still tags data-cm-ref) ───────────
144
106
  this.app.post('/refs/refresh', (_req, res) => __awaiter(this, void 0, void 0, function* () {
145
107
  try {
146
- if (!this.page) {
108
+ if (!this.adapter) {
147
109
  res.status(400).json({ error: 'no session' });
148
110
  return;
149
111
  }
150
- const mapping = yield this.page.evaluate(() => {
151
- const sel = 'a[href],button,input,textarea,select,[role="button"],[onclick]';
152
- const nodes = Array.from(document.querySelectorAll(sel));
153
- const out = {};
154
- nodes.forEach((el, i) => {
155
- const id = `e${i + 1}`;
156
- el.setAttribute('data-cm-ref', id);
157
- const tag = el.tagName.toLowerCase();
158
- const txt = (el.textContent || '').trim().slice(0, 80);
159
- out[id] = `${tag}${txt ? `: ${txt}` : ''}`;
160
- });
161
- return out;
112
+ const snapshot = yield this.adapter.getSnapshot();
113
+ this.eventLog.push({
114
+ category: 'interaction',
115
+ type: 'refs/refresh',
116
+ message: `Refreshed refs: ${Object.keys(snapshot.refs).length} elements`,
162
117
  });
163
- this.refMap = mapping;
164
- res.json({ ok: true, refs: mapping });
118
+ res.json({ ok: true, refs: snapshot.refs });
165
119
  }
166
120
  catch (e) {
167
121
  res.status(500).json({ error: e.message });
168
122
  }
169
123
  }));
124
+ // ── Click ─────────────────────────────────────────────────────────────
170
125
  this.app.post('/click', (req, res) => __awaiter(this, void 0, void 0, function* () {
171
- var _a, _b;
126
+ var _a;
172
127
  try {
173
- const ref = (_b = (_a = req.body) === null || _a === void 0 ? void 0 : _a.ref) === null || _b === void 0 ? void 0 : _b.replace(/^@/, '');
174
- if (!ref || !this.page) {
128
+ const ref = (_a = req.body) === null || _a === void 0 ? void 0 : _a.ref;
129
+ if (!ref || !this.adapter) {
175
130
  res.status(400).json({ error: 'ref required' });
176
131
  return;
177
132
  }
178
- yield this.page.click(`[data-cm-ref="${ref}"]`, { timeout: 15000 });
133
+ yield this.adapter.click(ref);
134
+ this.eventLog.push({
135
+ category: 'interaction',
136
+ type: 'click',
137
+ message: ref,
138
+ });
179
139
  res.json({ ok: true });
180
140
  }
181
141
  catch (e) {
182
142
  res.status(500).json({ error: e.message });
183
143
  }
184
144
  }));
145
+ // ── Fill ──────────────────────────────────────────────────────────────
185
146
  this.app.post('/fill', (req, res) => __awaiter(this, void 0, void 0, function* () {
186
- var _a, _b, _c;
147
+ var _a, _b;
187
148
  try {
188
- const ref = (_b = (_a = req.body) === null || _a === void 0 ? void 0 : _a.ref) === null || _b === void 0 ? void 0 : _b.replace(/^@/, '');
189
- const value = (_c = req.body) === null || _c === void 0 ? void 0 : _c.value;
190
- if (!ref || value === undefined || !this.page) {
149
+ const ref = (_a = req.body) === null || _a === void 0 ? void 0 : _a.ref;
150
+ const value = (_b = req.body) === null || _b === void 0 ? void 0 : _b.value;
151
+ if (!ref || value === undefined || !this.adapter) {
191
152
  res.status(400).json({ error: 'ref and value required' });
192
153
  return;
193
154
  }
194
- yield this.page.fill(`[data-cm-ref="${ref}"]`, value, { timeout: 15000 });
155
+ yield this.adapter.fill(ref, value);
156
+ this.eventLog.push({
157
+ category: 'interaction',
158
+ type: 'fill',
159
+ message: `${ref} = "${value.slice(0, 50)}"`,
160
+ });
195
161
  res.json({ ok: true });
196
162
  }
197
163
  catch (e) {
198
164
  res.status(500).json({ error: e.message });
199
165
  }
200
166
  }));
167
+ // ── Screenshot ────────────────────────────────────────────────────────
201
168
  this.app.get('/screenshot', (_req, res) => __awaiter(this, void 0, void 0, function* () {
202
169
  try {
203
- if (!this.page) {
170
+ if (!this.adapter) {
204
171
  res.status(400).json({ error: 'no session' });
205
172
  return;
206
173
  }
207
- const buf = yield this.page.screenshot({ type: 'png' });
174
+ const buf = yield this.adapter.screenshot();
208
175
  res.setHeader('Content-Type', 'image/png');
209
176
  res.send(buf);
210
177
  }
@@ -212,11 +179,131 @@ class BrowseDaemon {
212
179
  res.status(500).json({ error: e.message });
213
180
  }
214
181
  }));
215
- this.app.get('/console', (_req, res) => {
216
- res.json({ entries: this.consoleBuf.snapshot() });
182
+ // ── Console (backward compat) ─────────────────────────────────────────
183
+ this.app.get('/console', (_req, res) => __awaiter(this, void 0, void 0, function* () {
184
+ try {
185
+ if (!this.adapter) {
186
+ res.json({ entries: [] });
187
+ return;
188
+ }
189
+ const entries = yield this.adapter.getConsole();
190
+ res.json({ entries });
191
+ }
192
+ catch (e) {
193
+ res.status(500).json({ error: e.message });
194
+ }
195
+ }));
196
+ // ── Network (backward compat) ─────────────────────────────────────────
197
+ this.app.get('/network', (_req, res) => __awaiter(this, void 0, void 0, function* () {
198
+ try {
199
+ if (!this.adapter) {
200
+ res.json({ entries: [] });
201
+ return;
202
+ }
203
+ const entries = yield this.adapter.getNetwork();
204
+ res.json({ entries });
205
+ }
206
+ catch (e) {
207
+ res.status(500).json({ error: e.message });
208
+ }
209
+ }));
210
+ // ── NEW: Errors ───────────────────────────────────────────────────────
211
+ this.app.get('/errors', (req, res) => __awaiter(this, void 0, void 0, function* () {
212
+ try {
213
+ if (!this.adapter) {
214
+ res.json({ errors: [] });
215
+ return;
216
+ }
217
+ const filter = {};
218
+ if (req.query.type)
219
+ filter.type = req.query.type;
220
+ if (req.query.severity)
221
+ filter.severity = req.query.severity;
222
+ const errors = yield this.adapter.getErrors();
223
+ let filtered = errors;
224
+ if (filter.type)
225
+ filtered = filtered.filter(e => e.type === filter.type);
226
+ if (filter.severity)
227
+ filtered = filtered.filter(e => e.severity === filter.severity);
228
+ res.json({ errors: filtered, total: errors.length });
229
+ }
230
+ catch (e) {
231
+ res.status(500).json({ error: e.message });
232
+ }
233
+ }));
234
+ // ── NEW: A11y Snapshot ────────────────────────────────────────────────
235
+ this.app.get('/a11y-snapshot', (_req, res) => __awaiter(this, void 0, void 0, function* () {
236
+ try {
237
+ if (!this.adapter) {
238
+ res.status(400).json({ error: 'no session' });
239
+ return;
240
+ }
241
+ const snapshot = yield this.adapter.getSnapshot();
242
+ res.json(snapshot);
243
+ }
244
+ catch (e) {
245
+ res.status(500).json({ error: e.message });
246
+ }
247
+ }));
248
+ // ── NEW: Record start ─────────────────────────────────────────────────
249
+ this.app.post('/record/start', (_req, res) => __awaiter(this, void 0, void 0, function* () {
250
+ try {
251
+ if (!this.adapter) {
252
+ res.status(400).json({ error: 'no session' });
253
+ return;
254
+ }
255
+ yield this.adapter.startRecording();
256
+ this.eventLog.push({
257
+ category: 'session',
258
+ type: 'record/start',
259
+ message: 'Video recording started',
260
+ });
261
+ res.json({ ok: true });
262
+ }
263
+ catch (e) {
264
+ res.status(500).json({ error: e.message });
265
+ }
266
+ }));
267
+ // ── NEW: Record stop ──────────────────────────────────────────────────
268
+ this.app.post('/record/stop', (_req, res) => __awaiter(this, void 0, void 0, function* () {
269
+ try {
270
+ if (!this.adapter) {
271
+ res.status(400).json({ error: 'no session' });
272
+ return;
273
+ }
274
+ const path = yield this.adapter.stopRecording();
275
+ this.eventLog.push({
276
+ category: 'session',
277
+ type: 'record/stop',
278
+ message: `Video saved: ${path}`,
279
+ });
280
+ res.json({ ok: true, path });
281
+ }
282
+ catch (e) {
283
+ res.status(500).json({ error: e.message });
284
+ }
285
+ }));
286
+ // ── NEW: Engine info ──────────────────────────────────────────────────
287
+ this.app.get('/engine', (_req, res) => {
288
+ if (!this.adapter) {
289
+ res.json({ name: this.engineName, active: false });
290
+ return;
291
+ }
292
+ const info = this.adapter.getEngineInfo();
293
+ res.json(Object.assign(Object.assign({}, info), { active: this.sessionActive }));
217
294
  });
218
- this.app.get('/network', (_req, res) => {
219
- res.json({ entries: this.networkBuf.snapshot() });
295
+ // ── NEW: Event log ────────────────────────────────────────────────────
296
+ this.app.get('/events', (req, res) => {
297
+ const filter = {};
298
+ if (req.query.category)
299
+ filter.category = req.query.category;
300
+ if (req.query.limit)
301
+ filter.limit = req.query.limit;
302
+ const entries = this.eventLog.query({
303
+ category: filter.category,
304
+ limit: filter.limit ? parseInt(filter.limit, 10) : undefined,
305
+ });
306
+ res.json({ entries, total: this.eventLog.size });
220
307
  });
221
308
  }
222
309
  listen() {
@@ -232,15 +319,12 @@ class BrowseDaemon {
232
319
  }
233
320
  close() {
234
321
  return __awaiter(this, void 0, void 0, function* () {
235
- if (this.page)
236
- yield this.page.close().catch(() => { });
237
- if (this.context)
238
- yield this.context.close().catch(() => { });
239
- if (this.browser)
240
- yield this.browser.close().catch(() => { });
241
- this.page = null;
242
- this.context = null;
243
- this.browser = null;
322
+ if (this.adapter) {
323
+ yield this.adapter.closeSession().catch(() => { });
324
+ this.adapter = null;
325
+ }
326
+ this.sessionActive = false;
327
+ this.eventLog.clear();
244
328
  if (this.httpServer) {
245
329
  yield new Promise((r) => this.httpServer.close(() => r()));
246
330
  this.httpServer = null;
@@ -10,6 +10,16 @@ const task_1 = require("./commands/task");
10
10
  const engineering_1 = require("./commands/engineering");
11
11
  const design_studio_1 = require("./commands/design-studio");
12
12
  const distro_1 = require("./commands/distro");
13
+ const mcp_serve_1 = require("./commands/mcp-serve");
14
+ const bench_1 = require("./commands/bench");
15
+ const install_1 = require("./commands/install");
16
+ const brain_1 = require("./commands/brain");
17
+ const evolve_1 = require("./commands/evolve");
18
+ const learn_1 = require("./commands/learn");
19
+ const quality_1 = require("./commands/quality");
20
+ const stack_1 = require("./commands/stack");
21
+ const parallel_1 = require("./commands/parallel");
22
+ const update_1 = require("./commands/update");
13
23
  /**
14
24
  * Registers all CLI commands with the provided program instance.
15
25
  */
@@ -23,4 +33,14 @@ function registerAllCommands(program) {
23
33
  (0, engineering_1.registerEngineeringCommands)(program);
24
34
  (0, design_studio_1.registerDesignStudioCommands)(program);
25
35
  (0, distro_1.registerDistroCommands)(program);
36
+ (0, mcp_serve_1.registerMcpServeCommands)(program);
37
+ (0, bench_1.registerBenchCommands)(program);
38
+ (0, install_1.registerInstallCommands)(program);
39
+ (0, brain_1.registerBrainCommands)(program);
40
+ (0, evolve_1.registerEvolveCommands)(program);
41
+ (0, learn_1.registerLearnCommands)(program);
42
+ (0, quality_1.registerQualityCommands)(program);
43
+ (0, stack_1.registerStackCommands)(program);
44
+ (0, parallel_1.registerParallelCommands)(program);
45
+ (0, update_1.registerUpdateCommands)(program);
26
46
  }
@@ -0,0 +1,69 @@
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.registerBenchCommands = registerBenchCommands;
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const chalk_1 = __importDefault(require("chalk"));
19
+ const tdd_regression_1 = require("../../codybench/suites/tdd-regression");
20
+ const token_efficiency_1 = require("../../codybench/suites/token-efficiency");
21
+ const memory_retention_1 = require("../../codybench/suites/memory-retention");
22
+ const claude_code_1 = require("../../codybench/runners/claude-code");
23
+ const automated_1 = require("../../codybench/judges/automated");
24
+ const SUITES = [tdd_regression_1.tddRegressionSuite, token_efficiency_1.tokenEfficiencySuite, memory_retention_1.memoryRetentionSuite];
25
+ function registerBenchCommands(program) {
26
+ program
27
+ .command('bench')
28
+ .description('Run CodyBench evaluation suites (v0.1)')
29
+ .option('--suite <id>', 'Run specific suite (default: all enabled)')
30
+ .option('--runs <n>', 'Override repeat count per suite', parseInt)
31
+ .option('--output <path>', 'Output JSON file path')
32
+ .action((opts) => __awaiter(this, void 0, void 0, function* () {
33
+ var _a;
34
+ const projectPath = process.cwd();
35
+ const configPath = path_1.default.join(projectPath, 'codybench', 'config.json');
36
+ let config;
37
+ try {
38
+ config = JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
39
+ }
40
+ catch (_b) {
41
+ console.error(chalk_1.default.red('Error: codybench/config.json not found. Run from project root.'));
42
+ process.exit(1);
43
+ }
44
+ // Override repeat if --runs provided
45
+ if (opts.runs)
46
+ config.evals = config.evals.map(e => (Object.assign(Object.assign({}, e), { repeat: opts.runs })));
47
+ const suitesToRun = opts.suite
48
+ ? SUITES.filter(s => s.id === opts.suite)
49
+ : SUITES.filter(s => config.evals.find(e => e.id === s.id && e.enabled));
50
+ if (suitesToRun.length === 0) {
51
+ console.error(chalk_1.default.red(`No suites found${opts.suite ? ` matching "${opts.suite}"` : ''}.`));
52
+ process.exit(1);
53
+ }
54
+ console.log(chalk_1.default.bold(`\nCodyBench v${config.version} — running ${suitesToRun.length} suite(s)\n`));
55
+ const allResults = [];
56
+ for (const suite of suitesToRun) {
57
+ process.stdout.write(chalk_1.default.dim(` Running ${suite.name}...`));
58
+ const results = yield (0, claude_code_1.runSuite)(suite, config, projectPath);
59
+ allResults.push(...results);
60
+ console.log(chalk_1.default.green(' done'));
61
+ }
62
+ const aggregates = (0, automated_1.aggregateResults)(allResults);
63
+ console.log('\n' + (0, automated_1.formatLeaderboard)(aggregates) + '\n');
64
+ const outputPath = (_a = opts.output) !== null && _a !== void 0 ? _a : path_1.default.join(projectPath, config.output_dir, `results-${Date.now()}.json`);
65
+ fs_1.default.mkdirSync(path_1.default.dirname(outputPath), { recursive: true });
66
+ fs_1.default.writeFileSync(outputPath, JSON.stringify({ config, results: allResults, aggregates }, null, 2));
67
+ console.log(chalk_1.default.dim(`Results saved to: ${outputPath}`));
68
+ }));
69
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerBrainCommands = registerBrainCommands;
4
+ const smart_brain_router_1 = require("../../smart-brain-router");
5
+ const skill_execution_cache_1 = require("../../skill-execution-cache");
6
+ const token_budget_1 = require("../../token-budget");
7
+ // ─── Brain & Token CLI Commands ──────────────────────────────────────────────
8
+ function registerBrainCommands(program) {
9
+ const smart = program
10
+ .command('smart')
11
+ .description('Smart Brain Router — inspect brain layer selection for tasks');
12
+ smart
13
+ .command('plan <task>')
14
+ .description('Preview which brain layers would load for a task description')
15
+ .action((task) => {
16
+ const plan = (0, smart_brain_router_1.routeTask)(task);
17
+ const output = (0, smart_brain_router_1.formatBrainPlan)(plan);
18
+ console.log(output);
19
+ });
20
+ smart
21
+ .command('tiers')
22
+ .description('Show per-tier token budget allocations')
23
+ .action(() => {
24
+ const tierBudgets = (0, token_budget_1.getDefaultTierBudgets)();
25
+ console.log((0, token_budget_1.generateTierReport)(tierBudgets));
26
+ });
27
+ const token = program
28
+ .command('token')
29
+ .description('Token usage analysis and savings tracking');
30
+ token
31
+ .command('report')
32
+ .description('Show current token budget allocation')
33
+ .option('-p, --project <path>', 'Project path', process.cwd())
34
+ .action((opts) => {
35
+ const budget = (0, token_budget_1.loadBudget)(opts.project);
36
+ console.log((0, token_budget_1.generateBudgetReport)(budget));
37
+ console.log('');
38
+ const tierBudgets = (0, token_budget_1.getDefaultTierBudgets)();
39
+ console.log((0, token_budget_1.generateTierReport)(tierBudgets));
40
+ });
41
+ token
42
+ .command('savings')
43
+ .description('Show estimated token savings from smart routing and caching')
44
+ .option('-p, --project <path>', 'Project path', process.cwd())
45
+ .action((opts) => {
46
+ const cache = new skill_execution_cache_1.SkillExecutionCache(opts.project);
47
+ try {
48
+ cache.initialize();
49
+ const stats = cache.getStats();
50
+ console.log((0, skill_execution_cache_1.formatCacheStats)(stats));
51
+ console.log('');
52
+ // Compute savings summary
53
+ const savings = {
54
+ brainRoutingSaved: 0, // Tracked per-session (not persistent yet)
55
+ cacheHitsSaved: stats.estimatedTokensSaved,
56
+ progressiveLoadSaved: 0,
57
+ totalSaved: stats.estimatedTokensSaved,
58
+ sessionTasks: stats.totalHits,
59
+ };
60
+ console.log((0, token_budget_1.formatSavingsReport)(savings));
61
+ }
62
+ finally {
63
+ cache.close();
64
+ }
65
+ });
66
+ token
67
+ .command('cache')
68
+ .description('Show skill execution cache entries')
69
+ .option('-p, --project <path>', 'Project path', process.cwd())
70
+ .option('-n, --limit <n>', 'Max entries to show', '20')
71
+ .action((opts) => {
72
+ const cache = new skill_execution_cache_1.SkillExecutionCache(opts.project);
73
+ try {
74
+ cache.initialize();
75
+ const entries = cache.listCachedChains(parseInt(opts.limit));
76
+ if (entries.length === 0) {
77
+ console.log('📦 No cached skill chains yet. Complete some tasks to build the cache.');
78
+ return;
79
+ }
80
+ console.log(`📦 Skill Execution Cache (${entries.length} entries)`);
81
+ console.log('─'.repeat(70));
82
+ for (const entry of entries) {
83
+ const skills = entry.skillChain.join(' → ');
84
+ const eff = (entry.effectiveness * 100).toFixed(0);
85
+ console.log(` ${entry.taskPattern.slice(0, 45).padEnd(45)} │ ${skills}`);
86
+ console.log(` ${''.padEnd(45)} │ ${eff}% eff · ${entry.hitCount} hits · ${entry.tokenUsed} tok`);
87
+ }
88
+ }
89
+ finally {
90
+ cache.close();
91
+ }
92
+ });
93
+ token
94
+ .command('cache-clear')
95
+ .description('Clear the skill execution cache')
96
+ .option('-p, --project <path>', 'Project path', process.cwd())
97
+ .action((opts) => {
98
+ const cache = new skill_execution_cache_1.SkillExecutionCache(opts.project);
99
+ try {
100
+ cache.initialize();
101
+ const cleared = cache.clearCache();
102
+ console.log(`🗑️ Cleared ${cleared} cached entries.`);
103
+ }
104
+ finally {
105
+ cache.close();
106
+ }
107
+ });
108
+ }