crewswarm 0.8.1-beta

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 (362) hide show
  1. package/.env.example +155 -0
  2. package/LICENSE +21 -0
  3. package/README.md +316 -0
  4. package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js +1 -0
  5. package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js.br +0 -0
  6. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js +1 -0
  7. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
  8. package/apps/dashboard/dist/assets/components-CSUb80ze.js +1 -0
  9. package/apps/dashboard/dist/assets/components-CSUb80ze.js.br +0 -0
  10. package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js +1 -0
  11. package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js.br +0 -0
  12. package/apps/dashboard/dist/assets/index-CF0aJRtC.css +1 -0
  13. package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
  14. package/apps/dashboard/dist/assets/index-Px49zu76.js +2 -0
  15. package/apps/dashboard/dist/assets/index-Px49zu76.js.br +0 -0
  16. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js +1 -0
  17. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
  18. package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js +1 -0
  19. package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js.br +0 -0
  20. package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js +1 -0
  21. package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js.br +0 -0
  22. package/apps/dashboard/dist/assets/tab-benchmarks-tab-DfCuAClu.js +1 -0
  23. package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js +1 -0
  24. package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js.br +0 -0
  25. package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js +1 -0
  26. package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js.br +0 -0
  27. package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js +1 -0
  28. package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js.br +0 -0
  29. package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js +1 -0
  30. package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js.br +0 -0
  31. package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js +1 -0
  32. package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js.br +0 -0
  33. package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js +1 -0
  34. package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js.br +0 -0
  35. package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js +1 -0
  36. package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js.br +0 -0
  37. package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js +1 -0
  38. package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js.br +0 -0
  39. package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js +1 -0
  40. package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js.br +0 -0
  41. package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js +1 -0
  42. package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js.br +0 -0
  43. package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js +1 -0
  44. package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js.br +0 -0
  45. package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js +1 -0
  46. package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js.br +0 -0
  47. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js +1 -0
  48. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js.br +0 -0
  49. package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js +1 -0
  50. package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js.br +0 -0
  51. package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js +1 -0
  52. package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js.br +0 -0
  53. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js +1 -0
  54. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
  55. package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js +1 -0
  56. package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js.br +0 -0
  57. package/apps/dashboard/dist/favicon.png +0 -0
  58. package/apps/dashboard/dist/index.html +6466 -0
  59. package/apps/dashboard/dist/index.html.br +0 -0
  60. package/apps/dashboard/dist/index.html.gz +0 -0
  61. package/apps/dashboard/dist/signup.html +446 -0
  62. package/apps/dashboard/index.html +6442 -0
  63. package/apps/dashboard/package.json +15 -0
  64. package/apps/dashboard/src/app.js +2823 -0
  65. package/apps/dashboard/src/app.js.br +0 -0
  66. package/apps/dashboard/src/app.js.gz +0 -0
  67. package/apps/dashboard/src/chat/chat-actions.js +1847 -0
  68. package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
  69. package/apps/dashboard/src/chat/unified-messages.js +327 -0
  70. package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
  71. package/apps/dashboard/src/cli-process.js +208 -0
  72. package/apps/dashboard/src/cli-process.js.br +0 -0
  73. package/apps/dashboard/src/cli-process.js.gz +0 -0
  74. package/apps/dashboard/src/components/active-tasks-panel.js +175 -0
  75. package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
  76. package/apps/dashboard/src/core/api.js +18 -0
  77. package/apps/dashboard/src/core/api.js.br +0 -0
  78. package/apps/dashboard/src/core/dom.js +220 -0
  79. package/apps/dashboard/src/core/dom.js.br +0 -0
  80. package/apps/dashboard/src/core/state.js +91 -0
  81. package/apps/dashboard/src/core/state.js.br +0 -0
  82. package/apps/dashboard/src/core/task-manager.js +134 -0
  83. package/apps/dashboard/src/core/task-manager.js.br +0 -0
  84. package/apps/dashboard/src/orchestration-status.js +127 -0
  85. package/apps/dashboard/src/orchestration-status.js.br +0 -0
  86. package/apps/dashboard/src/setup-wizard.js +555 -0
  87. package/apps/dashboard/src/setup-wizard.js.br +0 -0
  88. package/apps/dashboard/src/styles.css +2085 -0
  89. package/apps/dashboard/src/styles.css.br +0 -0
  90. package/apps/dashboard/src/styles.css.gz +0 -0
  91. package/apps/dashboard/src/tabs/agents-tab.js +2237 -0
  92. package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
  93. package/apps/dashboard/src/tabs/benchmarks-tab.js +229 -0
  94. package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
  95. package/apps/dashboard/src/tabs/comms-tab.js +955 -0
  96. package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
  97. package/apps/dashboard/src/tabs/contacts-tab.js +654 -0
  98. package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
  99. package/apps/dashboard/src/tabs/engines-tab.js +175 -0
  100. package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
  101. package/apps/dashboard/src/tabs/memory-tab.js +182 -0
  102. package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
  103. package/apps/dashboard/src/tabs/models-tab.js +441 -0
  104. package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
  105. package/apps/dashboard/src/tabs/pm-loop-tab.js +185 -0
  106. package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
  107. package/apps/dashboard/src/tabs/projects-tab.js +663 -0
  108. package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
  109. package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
  110. package/apps/dashboard/src/tabs/prompts-tab.js +160 -0
  111. package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
  112. package/apps/dashboard/src/tabs/services-tab.js +202 -0
  113. package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
  114. package/apps/dashboard/src/tabs/settings-tab.js +803 -0
  115. package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
  116. package/apps/dashboard/src/tabs/skills-tab.js +284 -0
  117. package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
  118. package/apps/dashboard/src/tabs/spending-tab.js +173 -0
  119. package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
  120. package/apps/dashboard/src/tabs/swarm-chat-tab.js +660 -0
  121. package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
  122. package/apps/dashboard/src/tabs/swarm-tab.js +538 -0
  123. package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
  124. package/apps/dashboard/src/tabs/usage-tab.js +390 -0
  125. package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
  126. package/apps/dashboard/src/tabs/waves-tab.js +238 -0
  127. package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
  128. package/apps/dashboard/src/tabs/workflows-tab.js +747 -0
  129. package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
  130. package/apps/vibe/.crew/agent-memory/pipeline.json +249 -0
  131. package/apps/vibe/.crew/cost.json +17 -0
  132. package/apps/vibe/.crew/json-parse-metrics.jsonl +22 -0
  133. package/apps/vibe/.crew/pipeline-metrics.jsonl +22 -0
  134. package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +5 -0
  135. package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +5 -0
  136. package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +1 -0
  137. package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +5 -0
  138. package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +5 -0
  139. package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +5 -0
  140. package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +5 -0
  141. package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +5 -0
  142. package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +5 -0
  143. package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +5 -0
  144. package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +5 -0
  145. package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +5 -0
  146. package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +5 -0
  147. package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +5 -0
  148. package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +5 -0
  149. package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +5 -0
  150. package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +5 -0
  151. package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +5 -0
  152. package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +2 -0
  153. package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +5 -0
  154. package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +5 -0
  155. package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +5 -0
  156. package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +5 -0
  157. package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +5 -0
  158. package/apps/vibe/.crew/sandbox.json +7 -0
  159. package/apps/vibe/.crew/session.json +285 -0
  160. package/apps/vibe/.crew/training-data.jsonl +0 -0
  161. package/apps/vibe/.github/workflows/studio-quality.yml +37 -0
  162. package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +12 -0
  163. package/apps/vibe/.studio-data/project-messages/general.jsonl +54 -0
  164. package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +10 -0
  165. package/apps/vibe/ARCHITECTURE.md +3393 -0
  166. package/apps/vibe/QUICK-REFERENCE.md +211 -0
  167. package/apps/vibe/README.md +76 -0
  168. package/apps/vibe/ROADMAP.md +41 -0
  169. package/apps/vibe/STUDIO-SETUP-COMPLETE.md +35 -0
  170. package/apps/vibe/VISUAL-GUIDE.md +378 -0
  171. package/apps/vibe/capture-demo.mjs +160 -0
  172. package/apps/vibe/capture-vibe-assets.mjs +71 -0
  173. package/apps/vibe/capture-vibe-video.mjs +260 -0
  174. package/apps/vibe/check-buttons.js +41 -0
  175. package/apps/vibe/diagnose.html +106 -0
  176. package/apps/vibe/fix-buttons.js +103 -0
  177. package/apps/vibe/index.html +3401 -0
  178. package/apps/vibe/package-lock.json +920 -0
  179. package/apps/vibe/package.json +31 -0
  180. package/apps/vibe/public/favicon.png +0 -0
  181. package/apps/vibe/scripts/studio-pty-host.py +117 -0
  182. package/apps/vibe/server.mjs +1835 -0
  183. package/apps/vibe/src/main.js +2846 -0
  184. package/apps/vibe/src/register-all-languages.js +98 -0
  185. package/apps/vibe/start-studio.sh +11 -0
  186. package/apps/vibe/test/accessibility-tests.js +77 -0
  187. package/apps/vibe/test/browser-performance-audit.mjs +205 -0
  188. package/apps/vibe/test/performance-tests.js +120 -0
  189. package/apps/vibe/test/security-tests.js +213 -0
  190. package/apps/vibe/tests/e2e.local.mjs +54 -0
  191. package/apps/vibe/tests/server.smoke.mjs +106 -0
  192. package/apps/vibe/update_website.mjs +74 -0
  193. package/apps/vibe/vite.config.js +19 -0
  194. package/apps/vibe/watch-server.mjs +108 -0
  195. package/contrib/openclaw-plugin/README.md +199 -0
  196. package/contrib/openclaw-plugin/index.ts +306 -0
  197. package/contrib/openclaw-plugin/openclaw.plugin.json +41 -0
  198. package/contrib/openclaw-plugin/package.json +27 -0
  199. package/contrib/openclaw-plugin/skills/crewswarm/SKILL.md +88 -0
  200. package/crew-lead.mjs +649 -0
  201. package/engines/claude-code.json +36 -0
  202. package/engines/codex.json +37 -0
  203. package/engines/crew-cli.json +42 -0
  204. package/engines/cursor.json +40 -0
  205. package/engines/docker-sandbox.json +38 -0
  206. package/engines/gemini-cli.json +75 -0
  207. package/engines/opencode.json +31 -0
  208. package/gateway-bridge.mjs +1575 -0
  209. package/install.sh +738 -0
  210. package/lib/agent-registry.mjs +232 -0
  211. package/lib/agents/daemon.mjs +121 -0
  212. package/lib/agents/dispatch.mjs +225 -0
  213. package/lib/agents/permissions.mjs +90 -0
  214. package/lib/agents/platform-formatting.mjs +102 -0
  215. package/lib/agents/registry.mjs +81 -0
  216. package/lib/agents/tool-instructions.mjs +257 -0
  217. package/lib/agents/validation.mjs +75 -0
  218. package/lib/approval/policy-manager.mjs +221 -0
  219. package/lib/autoharness/index.mjs +391 -0
  220. package/lib/bridges/cli-executor.mjs +332 -0
  221. package/lib/bridges/gateway-ws.mjs +345 -0
  222. package/lib/bridges/integration.mjs +229 -0
  223. package/lib/bridges/rag-helper.mjs +90 -0
  224. package/lib/browser/opencode-passthrough-filter.js +44 -0
  225. package/lib/browser/passthrough-stderr.js +109 -0
  226. package/lib/chat/autonomous-mentions.mjs +373 -0
  227. package/lib/chat/history.mjs +82 -0
  228. package/lib/chat/mention-routing-intent.mjs +136 -0
  229. package/lib/chat/participants.mjs +95 -0
  230. package/lib/chat/project-messages-rag.mjs +265 -0
  231. package/lib/chat/project-messages.mjs +479 -0
  232. package/lib/chat/shared-chat-prompt-overlay.mjs +52 -0
  233. package/lib/chat/thread-binding.mjs +34 -0
  234. package/lib/chat/unified-history.mjs +223 -0
  235. package/lib/chat/unified-wrapper.mjs +41 -0
  236. package/lib/cli-process-tracker.mjs +228 -0
  237. package/lib/collections/index.mjs +433 -0
  238. package/lib/contacts/identity-linker.mjs +248 -0
  239. package/lib/contacts/index.mjs +341 -0
  240. package/lib/crew-judge/PROMPT.md +93 -0
  241. package/lib/crew-judge/judge.mjs +260 -0
  242. package/lib/crew-lead/agent-manager.mjs +125 -0
  243. package/lib/crew-lead/background.mjs +270 -0
  244. package/lib/crew-lead/brain.mjs +110 -0
  245. package/lib/crew-lead/chat-handler.mjs +2603 -0
  246. package/lib/crew-lead/chat-handler.mjs.bak +1274 -0
  247. package/lib/crew-lead/classifier.mjs +83 -0
  248. package/lib/crew-lead/http-server.mjs +4824 -0
  249. package/lib/crew-lead/intent.mjs +102 -0
  250. package/lib/crew-lead/interval-manager.mjs +41 -0
  251. package/lib/crew-lead/llm-caller.mjs +544 -0
  252. package/lib/crew-lead/prompts.mjs +392 -0
  253. package/lib/crew-lead/retry-manager.mjs +118 -0
  254. package/lib/crew-lead/tools.mjs +318 -0
  255. package/lib/crew-lead/wave-dispatcher.mjs +798 -0
  256. package/lib/crew-lead/waves-config.json +73 -0
  257. package/lib/crew-lead/waves-loader.mjs +110 -0
  258. package/lib/crew-lead/ws-router.mjs +428 -0
  259. package/lib/dispatch/parsers.mjs +299 -0
  260. package/lib/domain-planning/detector.mjs +196 -0
  261. package/lib/domain-planning/prompts/crew-pm-cli.md +96 -0
  262. package/lib/domain-planning/prompts/crew-pm-core.md +122 -0
  263. package/lib/domain-planning/prompts/crew-pm-frontend.md +111 -0
  264. package/lib/engines/crew-cli-sandbox.mjs +422 -0
  265. package/lib/engines/crew-cli.mjs +155 -0
  266. package/lib/engines/cursor-launcher.mjs +110 -0
  267. package/lib/engines/engine-registry.mjs +253 -0
  268. package/lib/engines/llm-direct.mjs +184 -0
  269. package/lib/engines/opencode.mjs +256 -0
  270. package/lib/engines/ouroboros.mjs +114 -0
  271. package/lib/engines/rt-envelope.mjs +1643 -0
  272. package/lib/engines/rt-envelope.mjs.backup-current +870 -0
  273. package/lib/engines/runners.mjs +1367 -0
  274. package/lib/gemini-cli-passthrough-noise.mjs +37 -0
  275. package/lib/integrations/code-search.mjs +259 -0
  276. package/lib/integrations/greptile.mjs +148 -0
  277. package/lib/integrations/multimodal.mjs +313 -0
  278. package/lib/integrations/telegram-streaming.mjs +153 -0
  279. package/lib/integrations/tts.mjs +312 -0
  280. package/lib/integrations/twitter-links.mjs +294 -0
  281. package/lib/memory/shared-adapter.mjs +296 -0
  282. package/lib/pipeline/manager.mjs +539 -0
  283. package/lib/preferences/extractor.mjs +347 -0
  284. package/lib/project-dir.mjs +20 -0
  285. package/lib/runtime/config.mjs +388 -0
  286. package/lib/runtime/dlq.mjs +170 -0
  287. package/lib/runtime/log-rotation.mjs +82 -0
  288. package/lib/runtime/logger.mjs +58 -0
  289. package/lib/runtime/memory.mjs +421 -0
  290. package/lib/runtime/paths.mjs +76 -0
  291. package/lib/runtime/project-dir.mjs +127 -0
  292. package/lib/runtime/spending.mjs +204 -0
  293. package/lib/runtime/startup-guard.mjs +291 -0
  294. package/lib/runtime/task-lease.mjs +234 -0
  295. package/lib/runtime/telemetry-schema.mjs +208 -0
  296. package/lib/runtime/telemetry.mjs +101 -0
  297. package/lib/runtime/utils.mjs +64 -0
  298. package/lib/skills/index.mjs +265 -0
  299. package/lib/tools/browser.mjs +135 -0
  300. package/lib/tools/executor.mjs +913 -0
  301. package/lib/types.d.ts +57 -0
  302. package/package.json +106 -0
  303. package/pm-loop.mjs +1626 -0
  304. package/prompts/coder-back.md +27 -0
  305. package/prompts/coder-front.md +27 -0
  306. package/prompts/coder.md +28 -0
  307. package/prompts/copywriter.md +17 -0
  308. package/prompts/fixer.md +39 -0
  309. package/prompts/frontend.md +23 -0
  310. package/prompts/github.md +24 -0
  311. package/prompts/main.md +39 -0
  312. package/prompts/pm-cli.md +95 -0
  313. package/prompts/pm-core.md +121 -0
  314. package/prompts/pm-frontend.md +110 -0
  315. package/prompts/pm.md +234 -0
  316. package/prompts/qa.md +44 -0
  317. package/prompts/security.md +19 -0
  318. package/scripts/build-crew-chat.sh +28 -0
  319. package/scripts/build-llms-full.mjs +52 -0
  320. package/scripts/chatmock-login.sh +16 -0
  321. package/scripts/chatmock-serve.sh +16 -0
  322. package/scripts/check-dashboard.mjs +88 -0
  323. package/scripts/crew-scribe.mjs +326 -0
  324. package/scripts/dashboard-helpers.mjs +391 -0
  325. package/scripts/dashboard-validation.mjs +198 -0
  326. package/scripts/dashboard.mjs +9717 -0
  327. package/scripts/dlq-replay.mjs +61 -0
  328. package/scripts/doctor.mjs +196 -0
  329. package/scripts/file-lock.mjs +186 -0
  330. package/scripts/fresh-machine-smoke.sh +323 -0
  331. package/scripts/generate-changelog.mjs +227 -0
  332. package/scripts/generate-openapi.mjs +334 -0
  333. package/scripts/health-check.mjs +229 -0
  334. package/scripts/install-docker.sh +213 -0
  335. package/scripts/mcp-server.mjs +1625 -0
  336. package/scripts/opencrew-rt-daemon.mjs +568 -0
  337. package/scripts/openswitchctl +646 -0
  338. package/scripts/refactor-configs.mjs +39 -0
  339. package/scripts/release-check.sh +46 -0
  340. package/scripts/resolve-node-bin.sh +25 -0
  341. package/scripts/restart-all-from-repo.sh +329 -0
  342. package/scripts/restart-crew-lead.sh +98 -0
  343. package/scripts/restart-dashboard.sh +104 -0
  344. package/scripts/restart-service.sh +274 -0
  345. package/scripts/run-accessibility-audit.mjs +356 -0
  346. package/scripts/run-integration-bounded.mjs +188 -0
  347. package/scripts/run-scheduled-pipeline.mjs +230 -0
  348. package/scripts/run.mjs +41 -0
  349. package/scripts/scan-skills.mjs +79 -0
  350. package/scripts/setup-firewall.sh +128 -0
  351. package/scripts/smoke-dispatch.mjs +149 -0
  352. package/scripts/smoke.sh +163 -0
  353. package/scripts/start-crew.mjs +328 -0
  354. package/scripts/start.mjs +146 -0
  355. package/scripts/swiftbar-restart-service.sh +19 -0
  356. package/scripts/sync-agents.mjs +152 -0
  357. package/scripts/sync-prompts.mjs +79 -0
  358. package/scripts/validate-config.mjs +337 -0
  359. package/scripts/wow.mjs +89 -0
  360. package/telegram-bridge.mjs +2421 -0
  361. package/unified-orchestrator.mjs +519 -0
  362. package/whatsapp-bridge.mjs +1481 -0
@@ -0,0 +1,378 @@
1
+ # CrewSwarm Vibe — Visual Guide
2
+
3
+ ## Vibe Layout
4
+
5
+ ```
6
+ ┌──────────────────────────────────────────────────────────────────────────────┐
7
+ │ 🐝 CrewSwarm Vibe my-todo-app │
8
+ ├─────────────┬────────────────────────────────┬────────────────────────────────┤
9
+ │ │ │ │
10
+ │ EXPLORER │ MONACO EDITOR │ CHAT WITH AGENTS │
11
+ │ │ │ │
12
+ │ 📁 src/ │ function TodoApp() { │ 🟢 crew-lead │
13
+ │ ├─ 📄 app.js│ const [todos, setTodos] │ ⚡ crew-coder │
14
+ │ ├─ 📄 api.js│ = useState([]); │ 🔵 crew-qa │
15
+ │ └─ 📁 comp/│ │ │
16
+ │ 📝 README │ return ( │ ──────────────────────── │
17
+ │ 📦 package │ <div className="app"> │ │
18
+ │ │ <h1>Todo App</h1> │ You: │
19
+ │ │ {todos.map(todo => │ Add input validation for │
20
+ │ │ <TodoItem │ the todo form │
21
+ │ │ key={todo.id} │ │
22
+ │ │ todo={todo} │ crew-lead: │
23
+ │ │ /> │ I'll have crew-coder add │
24
+ │ │ )} │ validation for you. │
25
+ │ │ </div> │ │
26
+ │ │ ); │ [14:32] ⚡ Dispatching to │
27
+ │ │ } │ crew-coder... │
28
+ │ │ │ │
29
+ │ │ export default TodoApp; │ crew-coder: │
30
+ │ │ │ ✅ Added validation to │
31
+ │ │ │ src/TodoForm.jsx: │
32
+ │ │ │ • Required field check │
33
+ │ │ │ • Max length 100 chars │
34
+ │ │ │ • No empty strings │
35
+ │ │ │ │
36
+ │ │ │ ┌─────────────────────────┐ │
37
+ │ │ │ │ Ask the crew anything...│ │
38
+ │ │ │ │ (⌘+Enter to send) │ │
39
+ │ │ │ └─────────────────────────┘ │
40
+ ├─────────────┴────────────────────────────────┴────────────────────────────────┤
41
+ │ TERMINAL / AGENT OUTPUT │
42
+ │ │
43
+ │ [14:32:05] 🔗 Connected to RT message bus │
44
+ │ [14:32:15] ⚡ crew-coder started working on task │
45
+ │ [14:32:16] 🔧 crew-coder → write_file src/TodoForm.jsx │
46
+ │ [14:32:17] 🔧 crew-coder → write_file src/validation.js │
47
+ │ [14:32:18] ✅ crew-coder completed task │
48
+ │ [14:32:19] 💾 Saved src/TodoForm.jsx │
49
+ │ │
50
+ └────────────────────────────────────────────────────────────────────────────────┘
51
+ ```
52
+
53
+ ---
54
+
55
+ ## Color Scheme (vs-dark theme)
56
+
57
+ ```css
58
+ Background: #1e1e1e (main editor)
59
+ Sidebar: #252526 (file tree, chat)
60
+ Titlebar: #323233
61
+ Borders: #181818
62
+ Text: #d4d4d4
63
+ Active tab: #1e1e1e
64
+ Inactive tab: #2d2d30
65
+ User message: #0e639c (blue bubble)
66
+ Agent message: #2d2d30 (gray bubble)
67
+ Success: #81c784 (green)
68
+ Error: #e57373 (red)
69
+ Info: #4fc3f7 (cyan)
70
+ Warning: #ffb74d (orange)
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Key UI Elements
76
+
77
+ ### 1. Titlebar
78
+ ```
79
+ ┌──────────────────────────────────────────────────────┐
80
+ │ 🐝 CrewSwarm Vibe my-todo-app │
81
+ └──────────────────────────────────────────────────────┘
82
+ ↑ Logo ↑ Project name (right aligned)
83
+ ```
84
+
85
+ ### 2. File Tree
86
+ ```
87
+ EXPLORER
88
+
89
+ 📁 src/
90
+ ├─ 📄 app.js ← Click to open
91
+ ├─ 📄 api.js
92
+ └─ 📁 components/
93
+ ├─ 📄 TodoItem.jsx
94
+ └─ 📄 TodoForm.jsx
95
+ 📝 README.md
96
+ 📦 package.json
97
+ ```
98
+
99
+ **States:**
100
+ - Regular: `📄 app.js`
101
+ - Active: `📄 app.js` (highlighted bg: #37373d)
102
+ - Hover: `📄 app.js` (subtle highlight)
103
+
104
+ ### 3. Editor Tabs
105
+ ```
106
+ ┌───────────┬───────────┬───────────┐
107
+ │ app.js × │ api.js × │ README × │
108
+ └───────────┴───────────┴───────────┘
109
+ ↑ active ↑ inactive ↑ inactive
110
+ ```
111
+
112
+ **Active tab:**
113
+ - Background: #1e1e1e
114
+ - Text: #fff
115
+
116
+ **Inactive tab:**
117
+ - Background: transparent
118
+ - Text: #969696
119
+
120
+ ### 4. Chat Panel
121
+ ```
122
+ ┌─────────────────────────────────┐
123
+ │ Chat with Agents │ ← Header
124
+ ├─────────────────────────────────┤
125
+ │ 🟢 crew-lead │ ← Status indicators
126
+ │ ⚡ crew-coder │
127
+ │ 🔵 crew-qa │
128
+ ├─────────────────────────────────┤
129
+ │ │
130
+ │ [Chat messages scroll here] │
131
+ │ │
132
+ ├─────────────────────────────────┤
133
+ │ ┌─────────────────────────────┐ │
134
+ │ │ Ask the crew anything... │ │ ← Input (⌘+Enter)
135
+ │ │ │ │
136
+ │ └─────────────────────────────┘ │
137
+ └─────────────────────────────────┘
138
+ ```
139
+
140
+ **Status indicators:**
141
+ - 🟢 Green = online/available
142
+ - ⚡ Yellow = working on task
143
+ - 🔵 Blue = ready
144
+ - 🔴 Red = error/offline
145
+
146
+ ### 5. Terminal
147
+ ```
148
+ ┌────────────────────────────────────────────────┐
149
+ │ Agent Output [Clear] │ ← Header
150
+ ├────────────────────────────────────────────────┤
151
+ │ [14:32:15] ⚡ crew-coder started working │ ← Info (cyan)
152
+ │ [14:32:18] ✅ crew-coder completed task │ ← Success (green)
153
+ │ [14:32:19] 💾 Saved src/TodoForm.jsx │ ← Success (green)
154
+ │ [14:32:20] ❌ Failed to save config.json │ ← Error (red)
155
+ └────────────────────────────────────────────────┘
156
+ ```
157
+
158
+ **Log colors:**
159
+ - Info: #4fc3f7
160
+ - Success: #81c784
161
+ - Error: #e57373
162
+ - Warning: #ffb74d
163
+
164
+ ---
165
+
166
+ ## Responsive Behavior
167
+
168
+ ### Desktop (1920×1080)
169
+ ```
170
+ File Tree: 250px
171
+ Editor: flex (grows)
172
+ Chat: 350px
173
+ Terminal: 200px
174
+ ```
175
+
176
+ ### Laptop (1440×900)
177
+ ```
178
+ File Tree: 200px
179
+ Editor: flex (grows)
180
+ Chat: 300px
181
+ Terminal: 180px
182
+ ```
183
+
184
+ ### Tablet (1024×768)
185
+ ```
186
+ File Tree: Collapsible (hidden by default)
187
+ Editor: Full width
188
+ Chat: Overlay (slides in from right)
189
+ Terminal: 150px
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Interactions
195
+
196
+ ### File Tree
197
+ - **Click file** → Opens in editor
198
+ - **Hover file** → Slight highlight
199
+ - **Active file** → Bold + highlight
200
+
201
+ ### Editor
202
+ - **Type** → Auto-saves after 1s
203
+ - **⌘+S** → Immediate save
204
+ - **Tab close (×)** → Removes tab, switches to previous
205
+
206
+ ### Chat
207
+ - **Type** → Input grows (max 3 lines)
208
+ - **⌘+Enter** → Sends message
209
+ - **Messages** → Auto-scroll to bottom
210
+ - **Agent bubbles** → Different colors per role
211
+
212
+ ### Terminal
213
+ - **New event** → Auto-scrolls to bottom
214
+ - **Scroll up** → Pauses auto-scroll
215
+ - **Scroll to bottom** → Re-enables auto-scroll
216
+
217
+ ---
218
+
219
+ ## Monaco Editor Features
220
+
221
+ **Built-in:**
222
+ - ✅ Syntax highlighting (50+ languages)
223
+ - ✅ Auto-completion (basic)
224
+ - ✅ Find/replace
225
+ - ✅ Minimap
226
+ - ✅ Line numbers
227
+ - ✅ Code folding
228
+ - ✅ Multi-cursor (⌥+Click)
229
+ - ✅ Bracket matching
230
+
231
+ **Coming soon:**
232
+ - 🔄 IntelliSense (full)
233
+ - 🔄 Git diff indicators (green/red bars)
234
+ - 🔄 Error squiggles (from linter)
235
+ - 🔄 Inline agent suggestions
236
+
237
+ ---
238
+
239
+ ## Agent Status Icons
240
+
241
+ ```
242
+ 🟢 Online Agent ready to receive tasks
243
+ ⚡ Working Agent actively processing
244
+ ✅ Complete Agent finished task
245
+ 🔵 Idle Agent available but not active
246
+ 🔴 Error Agent encountered error
247
+ ⏸️ Paused Agent temporarily disabled
248
+ 🔄 Restarting Agent reloading
249
+ ```
250
+
251
+ ---
252
+
253
+ ## Example Workflows
254
+
255
+ ### Workflow 1: Open File + Edit
256
+ ```
257
+ 1. Click "src/app.js" in file tree
258
+ → File opens in editor
259
+ → Tab appears at top
260
+
261
+ 2. Type changes in editor
262
+ → Auto-saves after 1s
263
+ → Terminal shows: "💾 Saved src/app.js"
264
+
265
+ 3. Click "×" on tab to close
266
+ → File closes
267
+ → Switches to previous tab
268
+ ```
269
+
270
+ ### Workflow 2: Ask Agent to Edit
271
+ ```
272
+ 1. Type in chat: "Add error handling to api.js"
273
+ → Press ⌘+Enter
274
+
275
+ 2. crew-lead responds:
276
+ "I'll have crew-coder add that for you."
277
+
278
+ 3. Terminal shows:
279
+ [14:45:00] ⚡ crew-coder started working
280
+ [14:45:05] 🔧 crew-coder → write_file src/api.js
281
+ [14:45:06] ✅ crew-coder completed task
282
+
283
+ 4. File tree: "api.js" changes appear
284
+ → Click to open and review
285
+ ```
286
+
287
+ ### Workflow 3: Multi-Agent Pipeline
288
+ ```
289
+ 1. Type: "Build a login page with tests"
290
+
291
+ 2. crew-lead coordinates:
292
+ ⚡ Dispatching to crew-coder-front...
293
+ ⚡ Dispatching to crew-qa...
294
+
295
+ 3. Terminal shows both agents working:
296
+ [15:00:00] ⚡ crew-coder-front started
297
+ [15:00:15] ✅ crew-coder-front completed
298
+ [15:00:16] ⚡ crew-qa started
299
+ [15:00:30] ✅ crew-qa completed
300
+
301
+ 4. Result:
302
+ ✅ Created src/LoginPage.jsx
303
+ ✅ Created tests/login.test.js
304
+ ```
305
+
306
+ ---
307
+
308
+ ## Keyboard Shortcuts (Future)
309
+
310
+ | Shortcut | Action |
311
+ |---|---|
312
+ | ⌘+S | Save current file |
313
+ | ⌘+P | Quick file picker |
314
+ | ⌘+K | Focus chat input |
315
+ | ⌘+J | Toggle terminal |
316
+ | ⌘+B | Toggle file tree |
317
+ | ⌘+Enter | Send chat message |
318
+ | ⌘+W | Close current tab |
319
+ | ⌘+Shift+P | Command palette |
320
+ | ⌘+/ | Toggle comment |
321
+ | ⌘+F | Find in file |
322
+
323
+ ---
324
+
325
+ ## Comparison to Cursor
326
+
327
+ | Feature | Cursor | Vibe |
328
+ |---|---|---|
329
+ | File editing | ✅ Full IDE | ✅ Monaco |
330
+ | Agent chat | ✅ Inline + panel | ✅ Side panel |
331
+ | File tree | ✅ Full features | ✅ Basic (Phase 1) |
332
+ | Terminal | ✅ Full shell | ✅ Agent logs only |
333
+ | Git | ✅ Built-in | 🔄 Future |
334
+ | Extensions | ✅ VSCode ecosystem | ❌ Not yet |
335
+ | Themes | ✅ Full customization | ✅ vs-dark (default) |
336
+ | Multi-agent | ❌ Single agent | ✅ 20 agents |
337
+ | Real-time updates | ⚠️ Polling | ✅ WebSocket |
338
+
339
+ **Vibe's differentiator:** Real-time multi-agent coordination with visible progress. Cursor is better as a full IDE, Vibe is better for swarm workflows.
340
+
341
+ ---
342
+
343
+ ## Screenshots (Conceptual)
344
+
345
+ **Main view:**
346
+ ```
347
+ ┌────────────────────────────────────────────────┐
348
+ │ FILE TREE │ EDITOR │ CHAT │
349
+ │ │ │ │
350
+ │ Click files │ Code here │ Talk to agents│
351
+ └────────────────────────────────────────────────┘
352
+ │ TERMINAL (agent activity) │
353
+ └────────────────────────────┘
354
+ ```
355
+
356
+ **Chat conversation:**
357
+ ```
358
+ You: Add validation
359
+
360
+ crew-lead: Sure! Dispatching to crew-coder...
361
+
362
+ crew-coder: ✅ Added validation.js
363
+ • Required field check
364
+ • Email format validation
365
+ • Password strength check
366
+ ```
367
+
368
+ **Terminal activity:**
369
+ ```
370
+ [14:32:15] 🔗 Connected to RT bus
371
+ [14:32:20] ⚡ crew-coder started task
372
+ [14:32:25] 🔧 crew-coder → write_file
373
+ [14:32:26] ✅ crew-coder completed task
374
+ ```
375
+
376
+ ---
377
+
378
+ **Next:** See [`STUDIO-SETUP-COMPLETE.md`](./STUDIO-SETUP-COMPLETE.md) in this folder for local setup, verification, and usage.
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CrewSwarm Demo Video — Real UI Recording
4
+ *
5
+ * Records a ~45s demo: Vibe IDE chat + Dashboard tour
6
+ * Outputs mp4 + webm via ffmpeg.
7
+ *
8
+ * Requires: dashboard on :4319, vibe on :3333, playwright, ffmpeg
9
+ */
10
+ import { chromium } from "playwright";
11
+ import { mkdirSync, rmSync, existsSync, statSync, renameSync, readdirSync } from "node:fs";
12
+ import { join, dirname } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { execSync } from "node:child_process";
15
+
16
+ const __dirname = dirname(fileURLToPath(import.meta.url));
17
+ const OUT = join(__dirname, "..", "..", "website", "vibe-assets");
18
+ const FINAL_MP4 = join(OUT, "vibe-demo.mp4");
19
+ const FINAL_WEBM = join(OUT, "vibe-demo.webm");
20
+
21
+ const DASHBOARD_URL = "http://127.0.0.1:4319";
22
+ const VIBE_URL = "http://127.0.0.1:3333";
23
+ const VIEWPORT = { width: 1440, height: 900 };
24
+
25
+ mkdirSync(OUT, { recursive: true });
26
+
27
+ async function record() {
28
+ console.log("⏳ Checking services...");
29
+
30
+ const browser = await chromium.launch({ headless: true });
31
+ const context = await browser.newContext({
32
+ recordVideo: { dir: OUT, size: VIEWPORT },
33
+ viewport: VIEWPORT,
34
+ colorScheme: "dark",
35
+ });
36
+ const page = await context.newPage();
37
+
38
+ try {
39
+ // ─── SCENE 1: Vibe IDE ──────────────────────────
40
+ console.log("🎬 Scene 1: Vibe IDE");
41
+ await page.goto(VIBE_URL, { waitUntil: "load", timeout: 30_000 });
42
+ await page.waitForTimeout(3_000);
43
+
44
+ // Select Studio Workspace project
45
+ console.log(" → Selecting project...");
46
+ try {
47
+ const selects = page.locator("select");
48
+ const count = await selects.count();
49
+ if (count > 0) {
50
+ await selects.first().selectOption({ label: "Studio Workspace" });
51
+ await page.waitForTimeout(2_000);
52
+ }
53
+ } catch (e) { console.log(" (skip project select:", e.message, ")"); }
54
+
55
+ // Click a file in the explorer
56
+ console.log(" → Opening file...");
57
+ try {
58
+ // Click on server.mjs in the file tree
59
+ await page.locator("text=server.mjs").first().click({ timeout: 3000 });
60
+ await page.waitForTimeout(3_000);
61
+ } catch { console.log(" (no file to click)"); }
62
+
63
+ // Type a message in chat
64
+ console.log(" → Typing in chat...");
65
+ try {
66
+ const textarea = page.locator("textarea").first();
67
+ await textarea.click();
68
+ const msg = "Add a GET /health endpoint that returns { status: \"ok\" }";
69
+ for (const ch of msg) {
70
+ await page.keyboard.type(ch, { delay: 30 });
71
+ }
72
+ await page.waitForTimeout(500);
73
+ console.log(" → Sending message...");
74
+ await page.keyboard.press("Enter");
75
+ // Wait for agent response to stream
76
+ console.log(" → Waiting for response (20s)...");
77
+ await page.waitForTimeout(20_000);
78
+ } catch (e) { console.log(" (chat error:", e.message, ")"); }
79
+
80
+ // Show terminal
81
+ console.log(" → Toggling terminal...");
82
+ try {
83
+ await page.locator("button", { hasText: "Terminal" }).click({ timeout: 2000 });
84
+ await page.waitForTimeout(2_000);
85
+ } catch { console.log(" (no terminal button)"); }
86
+
87
+ // Hold for a beat
88
+ await page.waitForTimeout(2_000);
89
+
90
+ // ─── SCENE 2: Dashboard ─────────────────────────
91
+ console.log("🎬 Scene 2: Dashboard");
92
+ await page.goto(DASHBOARD_URL, { waitUntil: "load", timeout: 60_000 });
93
+ await page.waitForTimeout(4_000);
94
+
95
+ // Click through sidebar tabs
96
+ const tabs = ["Sessions", "Agents", "Models", "Engines", "Swarm"];
97
+ for (const name of tabs) {
98
+ try {
99
+ console.log(` → ${name}...`);
100
+ await page.locator(`text="${name}"`).first().click({ timeout: 2000 });
101
+ await page.waitForTimeout(3_500);
102
+ } catch { console.log(` (skip ${name})`); }
103
+ }
104
+
105
+ // End on Chat
106
+ try {
107
+ await page.locator('text="Chat"').first().click({ timeout: 2000 });
108
+ await page.waitForTimeout(3_000);
109
+ } catch {}
110
+
111
+ } finally {
112
+ console.log("💾 Saving...");
113
+ await page.close();
114
+ await context.close();
115
+ await browser.close();
116
+ }
117
+
118
+ // Find the recorded webm (Playwright names it randomly)
119
+ const webms = readdirSync(OUT).filter(f => f.endsWith(".webm") && f !== "vibe-demo.webm");
120
+ if (webms.length === 0) {
121
+ console.error("❌ No recording found");
122
+ process.exit(1);
123
+ }
124
+ // Use the newest one
125
+ webms.sort((a, b) => statSync(join(OUT, b)).mtimeMs - statSync(join(OUT, a)).mtimeMs);
126
+ const rawPath = join(OUT, webms[0]);
127
+ console.log(`📼 Raw recording: ${rawPath}`);
128
+
129
+ // Convert to mp4
130
+ console.log("🎞️ Converting to mp4...");
131
+ rmSync(FINAL_MP4, { force: true });
132
+ execSync(
133
+ `ffmpeg -y -i "${rawPath}" -vcodec libx264 -crf 23 -preset slow -vf "scale=1440:900:flags=lanczos" -movflags +faststart -an "${FINAL_MP4}"`,
134
+ { stdio: "inherit" }
135
+ );
136
+
137
+ // Convert to webm (for web embed)
138
+ console.log("🎞️ Converting to webm...");
139
+ rmSync(FINAL_WEBM, { force: true });
140
+ execSync(
141
+ `ffmpeg -y -i "${rawPath}" -c:v libvpx-vp9 -crf 30 -b:v 0 -vf "scale=1440:900:flags=lanczos" -an "${FINAL_WEBM}"`,
142
+ { stdio: "inherit" }
143
+ );
144
+
145
+ // Clean up raw
146
+ rmSync(rawPath, { force: true });
147
+
148
+ const mp4KB = Math.round(statSync(FINAL_MP4).size / 1024);
149
+ const webmKB = Math.round(statSync(FINAL_WEBM).size / 1024);
150
+ console.log(`\n✨ Done:`);
151
+ console.log(` mp4: ${FINAL_MP4} (${mp4KB} KB)`);
152
+ console.log(` webm: ${FINAL_WEBM} (${webmKB} KB)`);
153
+ }
154
+
155
+ record()
156
+ .then(() => console.log("\n🎬 Demo capture complete!"))
157
+ .catch((err) => {
158
+ console.error("❌ Failed:", err.message);
159
+ process.exit(1);
160
+ });
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env node
2
+ import { chromium } from 'playwright';
3
+ import { mkdirSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { spawn } from 'child_process';
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const OUT = join(__dirname, '..', 'website', 'vibe-assets');
10
+ mkdirSync(OUT, { recursive: true });
11
+
12
+ const VIBE_PORT = 3333;
13
+ const SITE_PORT = 8000;
14
+
15
+ async function startVibe() {
16
+ console.log('🐝 Starting Vibe server...');
17
+ const vibe = spawn('npm', ['start'], { cwd: __dirname });
18
+ return new Promise((resolve) => {
19
+ vibe.stdout.on('data', (data) => {
20
+ if (data.toString().includes('running at')) resolve(vibe);
21
+ });
22
+ });
23
+ }
24
+
25
+ async function startSite() {
26
+ console.log('🌐 Starting Marketing Site server...');
27
+ const site = spawn('python3', ['-m', 'http.server', SITE_PORT.toString()], { cwd: join(__dirname, '..', 'website') });
28
+ return new Promise((resolve) => {
29
+ setTimeout(() => resolve(site), 2000); // Give it a moment to start
30
+ });
31
+ }
32
+
33
+ async function capture() {
34
+ const browser = await chromium.launch({ headless: true });
35
+ const page = await browser.newPage({ viewport: { width: 1400, height: 900 } });
36
+
37
+ try {
38
+ // 1. Capture Vibe IDE
39
+ console.log('📸 Capturing Vibe IDE...');
40
+ await page.goto(`http://127.0.0.1:${VIBE_PORT}`, { waitUntil: 'networkidle' });
41
+ await page.waitForTimeout(3000); // Wait for Monaco and File Tree
42
+
43
+ // Take a full shot
44
+ await page.screenshot({ path: join(OUT, 'vibe-full.png') });
45
+
46
+ // 2. Capture the new Vibe Marketing page
47
+ console.log('📸 Capturing Vibe Marketing page...');
48
+ await page.goto(`http://127.0.0.1:${SITE_PORT}/vibe.html`, { waitUntil: 'networkidle' });
49
+ await page.waitForTimeout(1000);
50
+ await page.screenshot({ path: join(OUT, 'vibe-marketing-hero.png'), fullPage: false });
51
+
52
+ console.log('✨ Screenshots saved to website/vibe-assets/');
53
+ } catch (err) {
54
+ console.error('❌ Error during capture:', err);
55
+ } finally {
56
+ await browser.close();
57
+ }
58
+ }
59
+
60
+ async function main() {
61
+ const vibe = await startVibe();
62
+ const site = await startSite();
63
+
64
+ await capture();
65
+
66
+ console.log('🛑 Shutting down servers...');
67
+ vibe.kill();
68
+ site.kill();
69
+ }
70
+
71
+ main().catch(console.error);