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,299 @@
1
+ /**
2
+ * Dispatch, pipeline, and project directive parsers — extracted from crew-lead.mjs
3
+ * Parses @@DISPATCH, @@PIPELINE, and project markers from LLM replies.
4
+ *
5
+ * Inject: initDispatchParsers({ loadConfig, resolveAgentId })
6
+ */
7
+
8
+ import path from "node:path";
9
+ import {
10
+ normalizeProjectDir,
11
+ rewriteWrongDesktopMirrorPaths,
12
+ } from "../runtime/project-dir.mjs";
13
+
14
+ let _loadConfig = () => ({});
15
+ let _resolveAgentId = (cfg, id) => id;
16
+
17
+ export function initDispatchParsers({ loadConfig, resolveAgentId } = {}) {
18
+ if (loadConfig) _loadConfig = loadConfig;
19
+ if (resolveAgentId) _resolveAgentId = resolveAgentId;
20
+ }
21
+
22
+ // ── Dispatch ──────────────────────────────────────────────────────────────────
23
+
24
+ export function parseDispatch(text, userMessage = "") {
25
+ // Strip think tags before parsing so <think> content doesn't pollute task text
26
+ const cleanText = text.replace(/<think>[\s\S]*?<\/think>/gi, "").trim();
27
+ const normalizedText = cleanText.replace(
28
+ /\bcrew[-\s]*(?:fucking|fuckin|damn|goddamn)\s+([a-z0-9-]+)\b/gi,
29
+ "crew-$1",
30
+ );
31
+
32
+ // Primary: structured @@DISPATCH marker (check original text too in case tags wrap it)
33
+ const match = normalizedText.match(/@@DISPATCH\s+(\{[\s\S]*?\})/);
34
+ if (match) {
35
+ try {
36
+ const d = JSON.parse(match[1]);
37
+ // d.verify and d.done are optional acceptance criteria fields
38
+ if (d.agent && d.task) return d;
39
+ } catch {}
40
+ return null;
41
+ }
42
+
43
+ // Direct imperative fallback: "dispatch crew-coder ...", "send it to crew-coder", etc.
44
+ // Skip if structured @@DISPATCH was present (even malformed) — don't re-interpret as NL
45
+ if (/@@DISPATCH\s+\{/.test(normalizedText)) return null;
46
+
47
+ const imperativeMatch = normalizedText.match(
48
+ /(?:^|\b)(?:dispatch|send|route|forward|tell|ask|use|sic(?:k)?)\b[^.\n]*?\b(crew-[a-z0-9-]+)/i,
49
+ );
50
+ if (imperativeMatch) {
51
+ let agent = imperativeMatch[1].trim().toLowerCase();
52
+ const taskSource = userMessage || normalizedText;
53
+ const task = taskSource
54
+ .replace(
55
+ /^(?:please\s+)?(?:go\s+)?(?:dispatch|send|route|forward|tell|ask|use|sic(?:k)?)(?:\s+(?:it|this|him|her|them))?(?:\s+to)?\s+(?:fucking\s+|fuckin\s+|damn\s+|goddamn\s+)?(?:crew-[a-z0-9-]+)\b[:\s-]*/i,
56
+ "",
57
+ )
58
+ .trim();
59
+ if (agent && task) {
60
+ console.warn(`[DEPRECATED] Imperative dispatch format detected. Use @@DISPATCH JSON marker instead.`);
61
+ console.log(`[crew-lead] Imperative dispatch fallback: agent=${agent} task="${task.slice(0, 60)}"`);
62
+ return { agent, task };
63
+ }
64
+ }
65
+
66
+ // Fallback: LLM described a dispatch in natural language without using @@DISPATCH
67
+ // Only match present/future action phrases — never past tense ("dispatched") which is
68
+ // just description of history and would cause infinite re-dispatch loops.
69
+ const nlMatch = normalizedText.match(
70
+ /(?:dispatching now|I(?:'ll| will| am) dispatch(?:ing)?|sending(?: this)? to|routing to|forwarding to|siccing)\b[^.]*?\b(crew-[a-z0-9-]+)/i
71
+ );
72
+ if (nlMatch) {
73
+ let agent = nlMatch[1].trim();
74
+ // Try to resolve display names to crew-X IDs
75
+ if (!agent.startsWith("crew-")) {
76
+ try {
77
+ const cfg = _loadConfig();
78
+ const resolved = _resolveAgentId(cfg, agent);
79
+ if (resolved && resolved !== agent) agent = resolved;
80
+ } catch {}
81
+ } else {
82
+ agent = agent.toLowerCase();
83
+ }
84
+ const task = userMessage
85
+ ? userMessage.replace(/^(?:go\s+(?:write\s+)?(?:have\s+)?|have\s+|ask\s+|tell\s+)(?:crew-[a-z0-9-]+|[a-z]+)\s+(?:to\s+)?/i, "").trim() || userMessage
86
+ : cleanText.replace(/\n/g, " ").slice(0, 200).trim();
87
+ if (agent && task) {
88
+ console.warn(`[DEPRECATED] Natural language dispatch detected. Use @@DISPATCH JSON marker instead.`);
89
+ console.log(`[crew-lead] NL dispatch fallback: agent=${agent} task="${task.slice(0, 60)}"`);
90
+ return { agent, task };
91
+ }
92
+ }
93
+
94
+ return null;
95
+ }
96
+
97
+ export function stripDispatch(text) {
98
+ return text.replace(/@@DISPATCH\s+\{[\s\S]*?\}/g, "").trim();
99
+ }
100
+
101
+ /**
102
+ * When a dashboard project is selected, crew-lead knows `projectDir` but models often emit
103
+ * bare filenames (e.g. content-draft.md). Agents then @@READ_FILE from the wrong cwd.
104
+ * Rewrite obvious bare file tokens to `${projectDir}/filename` (skip if already under a path).
105
+ *
106
+ * @param {Array<{ task?: string }>} steps
107
+ * @param {string|null|undefined} projectDir
108
+ * @returns {typeof steps}
109
+ */
110
+ export function applyProjectDirToPipelineSteps(steps, projectDir) {
111
+ if (!projectDir || !Array.isArray(steps) || steps.length === 0) return steps;
112
+ const rootRaw = String(projectDir).trim();
113
+ const root =
114
+ path.resolve(normalizeProjectDir(rootRaw) || rootRaw).replace(/\/+$/, "");
115
+ // Bare `foo.md` / `report.html` not already preceded by path separator or protocol-ish char
116
+ // Disallow `-` before the match so `design-brief.md` is not split into `brief.md`
117
+ const bareFile = new RegExp(
118
+ String.raw`(?<![\w/\\~:-])` +
119
+ String.raw`([A-Za-z0-9][\w.-]*\.(?:md|html|css|js|mjs|ts|tsx|json|yaml|yml|py|sh|sql|toml|txt))` +
120
+ String.raw`(?![\w/.-])`,
121
+ "gi",
122
+ );
123
+
124
+ for (const step of steps) {
125
+ if (!step?.task || typeof step.task !== "string") continue;
126
+ step.task = rewriteWrongDesktopMirrorPaths(step.task, root);
127
+ step.task = step.task.replace(bareFile, (full, fname) => {
128
+ const joined = path.join(root, fname).replace(/\\/g, "/");
129
+ if (step.task.includes(joined)) return full;
130
+ return joined;
131
+ });
132
+ }
133
+ return steps;
134
+ }
135
+
136
+ /** Parse all @@DISPATCH {...} from text (e.g. PM reply). Returns array of { agent, task, verify?, done? }. */
137
+ export function parseDispatches(text) {
138
+ if (!text || typeof text !== "string") return [];
139
+ const clean = text.replace(/<think>[\s\S]*?<\/think>/gi, "").trim();
140
+ const list = [];
141
+ const re = /@@DISPATCH\s+(\{[\s\S]*?\})/g;
142
+ let m;
143
+ while ((m = re.exec(clean)) !== null) {
144
+ try {
145
+ const d = JSON.parse(m[1]);
146
+ if (d.agent && d.task) list.push(d);
147
+ } catch {}
148
+ }
149
+ return list;
150
+ }
151
+
152
+ // ── Pipeline DSL ──────────────────────────────────────────────────────────────
153
+ // Format: @@PIPELINE [{"wave":1,"agent":"crew-coder","task":"..."},{"wave":1,"agent":"crew-coder-front","task":"..."},{"wave":2,"agent":"crew-qa","task":"..."}]
154
+ // Backward-compat: steps without "wave" are assigned sequential waves 1,2,3,...
155
+
156
+ export function parsePipeline(text) {
157
+ const clean = text.replace(/<think>[\s\S]*?<\/think>/gi, "").trim();
158
+
159
+ // Extract JSON array using bracket-counting (regex [\s\S]*?] fails on nested brackets like [SCOPE])
160
+ function extractJsonArray(str, startIdx) {
161
+ if (str[startIdx] !== "[") return null;
162
+ let depth = 0;
163
+ for (let i = startIdx; i < str.length; i++) {
164
+ if (str[i] === "[") depth++;
165
+ else if (str[i] === "]") { depth--; if (depth === 0) return str.slice(startIdx, i + 1); }
166
+ }
167
+ return null;
168
+ }
169
+
170
+ let jsonStr = null;
171
+
172
+ // Try explicit @@PIPELINE marker first
173
+ const markerIdx = clean.indexOf("@@PIPELINE");
174
+ if (markerIdx !== -1) {
175
+ const bracketIdx = clean.indexOf("[", markerIdx);
176
+ if (bracketIdx !== -1) jsonStr = extractJsonArray(clean, bracketIdx);
177
+ }
178
+
179
+ // Fallback: find last JSON array in text that looks like pipeline steps
180
+ if (!jsonStr) {
181
+ let lastBracket = clean.lastIndexOf("[{");
182
+ if (lastBracket !== -1) {
183
+ const candidate = extractJsonArray(clean, lastBracket);
184
+ if (candidate) {
185
+ try {
186
+ const test = JSON.parse(candidate);
187
+ if (Array.isArray(test) && test.length >= 2 && test.every(s => s.agent && s.task)) {
188
+ jsonStr = candidate;
189
+ }
190
+ } catch {}
191
+ }
192
+ }
193
+ }
194
+
195
+ if (!jsonStr) return null;
196
+ try {
197
+ const steps = JSON.parse(jsonStr);
198
+ if (!Array.isArray(steps) || steps.length < 2) return null;
199
+ if (!steps.every(s => s.agent && s.task)) return null;
200
+
201
+ steps.forEach((s, i) => { if (s.wave == null) s.wave = i + 1; });
202
+
203
+ // Auto-append crew-pm ROADMAP update as final wave if any coding agents are present
204
+ // and crew-pm isn't already in the pipeline
205
+ const codingAgents = new Set(['crew-coder','crew-coder-front','crew-coder-back','crew-frontend','crew-fixer','crew-ml']);
206
+ const hasCodingAgent = steps.some(s => codingAgents.has(s.agent) || codingAgents.has((s.agent||'').toLowerCase()));
207
+ const hasPm = steps.some(s => s.agent === 'crew-pm' || s.agent === 'pm');
208
+ const hasQa = steps.some(s => s.agent === 'crew-qa' || s.agent === 'qa');
209
+ const hasFixer = steps.some(s => s.agent === 'crew-fixer' || s.agent === 'fixer');
210
+
211
+ // If pipeline has fixer but only one QA pass, insert a re-QA wave after fixer
212
+ // so the pattern is always: ... → fixer → QA (re-check) → pm
213
+ if (hasFixer && hasQa) {
214
+ const fixerWaves = steps.filter(s => s.agent === 'crew-fixer' || s.agent === 'fixer').map(s => Number(s.wave));
215
+ const maxFixerWave = Math.max(...fixerWaves);
216
+ const qaAfterFixer = steps.some(s => (s.agent === 'crew-qa' || s.agent === 'qa') && Number(s.wave) > maxFixerWave);
217
+ if (!qaAfterFixer) {
218
+ // Shift all waves after fixer up by 1 to make room
219
+ steps.forEach(s => { if (Number(s.wave) > maxFixerWave) s.wave = Number(s.wave) + 1; });
220
+ steps.push({
221
+ wave: maxFixerWave + 1,
222
+ agent: 'crew-qa',
223
+ task: 'Re-audit the previously flagged files after crew-fixer ran. Read the existing qa-report.md in the project directory (same folder as ROADMAP.md) to know what was fixed. Run py_compile on all .py files. Confirm CRITICAL and HIGH issues are resolved. Write your updated report to qa-report.md in that same project directory (no other filename).',
224
+ });
225
+ }
226
+ }
227
+
228
+ if (hasCodingAgent && !hasPm) {
229
+ const maxWave = Math.max(...steps.map(s => Number(s.wave)));
230
+ steps.push({
231
+ wave: maxWave + 1,
232
+ agent: 'crew-pm',
233
+ task: 'Read the project ROADMAP.md and mark any completed phases/tasks as done based on the work just finished by the coding agents. Use @@READ_FILE to read the roadmap first, then @@WRITE_FILE to update it. Only mark items complete if they were actually built.',
234
+ });
235
+ }
236
+
237
+ const waveMap = new Map();
238
+ for (const s of steps) {
239
+ const w = Number(s.wave);
240
+ if (!waveMap.has(w)) waveMap.set(w, []);
241
+ waveMap.get(w).push(s);
242
+ }
243
+ const sortedWaveNums = [...waveMap.keys()].sort((a, b) => a - b);
244
+ return { steps, waves: sortedWaveNums.map(n => waveMap.get(n)) };
245
+ } catch { return null; }
246
+ }
247
+
248
+ export function stripPipeline(text) {
249
+ // Remove pipeline JSON using bracket-counting (handles nested brackets like [SCOPE])
250
+ const markerIdx = text.indexOf("@@PIPELINE");
251
+ if (markerIdx !== -1) {
252
+ const bracketIdx = text.indexOf("[", markerIdx);
253
+ if (bracketIdx !== -1) {
254
+ let depth = 0;
255
+ for (let i = bracketIdx; i < text.length; i++) {
256
+ if (text[i] === "[") depth++;
257
+ else if (text[i] === "]") { depth--; if (depth === 0) return (text.slice(0, markerIdx) + text.slice(i + 1)).trim(); }
258
+ }
259
+ }
260
+ }
261
+ // Fallback: strip trailing JSON array
262
+ const lastBracket = text.lastIndexOf("[{");
263
+ if (lastBracket !== -1) {
264
+ let depth = 0;
265
+ for (let i = lastBracket; i < text.length; i++) {
266
+ if (text[i] === "[") depth++;
267
+ else if (text[i] === "]") { depth--; if (depth === 0) return text.slice(0, lastBracket).trim(); }
268
+ }
269
+ }
270
+ return text.trim();
271
+ }
272
+
273
+ export function parseProject(text) {
274
+ const match = text.match(/@@PROJECT\s+(\{[\s\S]*?\})/);
275
+ if (!match) return null;
276
+ try { return JSON.parse(match[1]); } catch { return null; }
277
+ }
278
+
279
+ export function stripProject(text) {
280
+ return text.replace(/@@PROJECT\s+\{[\s\S]*?\}/, "").trim();
281
+ }
282
+
283
+ /** Parse @@REGISTER_PROJECT {"name":"...","outputDir":"..."} from PM reply so the project appears in the dashboard Projects tab. */
284
+ export function parseRegisterProject(text) {
285
+ const match = text.match(/@@REGISTER_PROJECT\s+(\{[\s\S]*?\})/);
286
+ if (!match) return null;
287
+ try {
288
+ const o = JSON.parse(match[1]);
289
+ if (o.name && o.outputDir) return { name: String(o.name).trim(), outputDir: String(o.outputDir).trim(), description: o.description ? String(o.description).trim() : "" };
290
+ } catch {}
291
+ return null;
292
+ }
293
+
294
+ /** Remove <think>...</think> reasoning blocks so they are not shown to the user. */
295
+ export function stripThink(text) {
296
+ if (!text || typeof text !== "string") return text;
297
+ let out = text.replace(/<think>[\s\S]*?<\/think>/gi, "").replace(/<\/think>/g, "").replace(/<think>/g, "");
298
+ return out.trim();
299
+ }
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Domain-Aware Planning
3
+ *
4
+ * Routes roadmap items to specialized PM agents based on domain detection.
5
+ * Each PM agent has expertise in their domain (CLI, Frontend, Core, etc.)
6
+ *
7
+ * Based on Cursor's research: For large codebases (100K+ lines) with distinct
8
+ * subsystems, domain-specific planning significantly improves task quality.
9
+ */
10
+
11
+ // Domain definitions for crewswarm repo
12
+ export const DOMAINS = {
13
+ 'crew-cli': {
14
+ pmAgent: 'crew-pm-cli',
15
+ keywords: [
16
+ 'CLI', 'crew-cli', 'command line', 'terminal', 'crew exec', 'crew chat',
17
+ 'TypeScript', 'src/', 'crew-cli/', 'REPL', 'executor', 'orchestrator',
18
+ 'pipeline', 'unified', 'session manager', 'worker pool'
19
+ ],
20
+ description: 'CLI tool and command-line interfaces',
21
+ subdirs: ['crew-cli/src', 'crew-cli/extensions']
22
+ },
23
+
24
+ 'frontend': {
25
+ pmAgent: 'crew-pm-frontend',
26
+ keywords: [
27
+ 'dashboard', 'frontend', 'UI', 'UX', 'HTML', 'CSS', 'JavaScript',
28
+ 'Vite', 'React', 'component', 'index.html', 'app.js', 'styles.css',
29
+ 'apps/dashboard/', 'tabs/', 'chat', 'agents tab', 'settings', 'providers'
30
+ ],
31
+ description: 'Web dashboard and UI components',
32
+ subdirs: ['apps/dashboard/src', 'apps/dashboard/public']
33
+ },
34
+
35
+ 'core': {
36
+ pmAgent: 'crew-pm-core',
37
+ keywords: [
38
+ 'gateway-bridge', 'crew-lead', 'RT bus', 'orchestration', 'dispatch',
39
+ 'agent registry', 'lib/', 'engines/', 'memory/', 'telemetry',
40
+ 'real-time', 'WebSocket', 'message bus', 'coordinator'
41
+ ],
42
+ description: 'Core orchestration and agent runtime',
43
+ subdirs: ['lib/', 'engines/']
44
+ },
45
+
46
+ 'integrations': {
47
+ pmAgent: 'crew-pm',
48
+ keywords: [
49
+ 'Telegram', 'WhatsApp', 'MCP', 'skills', 'greptile', 'Polymarket',
50
+ 'bridge', 'grabloco-bot', 'bot', 'integration', 'external API'
51
+ ],
52
+ description: 'External integrations and bridges',
53
+ subdirs: ['grabloco-bot/', 'scripts/']
54
+ },
55
+
56
+ 'docs': {
57
+ pmAgent: 'crew-pm',
58
+ keywords: [
59
+ 'documentation', 'README', 'AGENTS.md', 'docs/', 'markdown',
60
+ '.md', 'guide', 'tutorial', 'example'
61
+ ],
62
+ description: 'Documentation and guides',
63
+ subdirs: ['docs/']
64
+ }
65
+ };
66
+
67
+ /**
68
+ * Detect which domain a roadmap item belongs to
69
+ * @param {string} itemText - The roadmap item description
70
+ * @returns {{ domain: string|null, pmAgent: string, confidence: number }}
71
+ */
72
+ export function detectDomain(itemText) {
73
+ const text = itemText.toLowerCase();
74
+ const scores = {};
75
+
76
+ // Score each domain based on keyword matches
77
+ for (const [domainId, domain] of Object.entries(DOMAINS)) {
78
+ let score = 0;
79
+ for (const keyword of domain.keywords) {
80
+ if (text.includes(keyword.toLowerCase())) {
81
+ // Longer keywords get higher weight
82
+ score += keyword.length > 10 ? 3 : keyword.length > 5 ? 2 : 1;
83
+ }
84
+ }
85
+ scores[domainId] = score;
86
+ }
87
+
88
+ // Find highest scoring domain
89
+ const entries = Object.entries(scores);
90
+ const [topDomain, topScore] = entries.reduce(
91
+ (max, curr) => curr[1] > max[1] ? curr : max,
92
+ ['', 0]
93
+ );
94
+
95
+ // Require minimum confidence (at least 2 keyword matches)
96
+ if (topScore < 2) {
97
+ return {
98
+ domain: null,
99
+ pmAgent: 'crew-pm', // Default PM
100
+ confidence: 0
101
+ };
102
+ }
103
+
104
+ const totalScore = entries.reduce((sum, [, score]) => sum + score, 0);
105
+ const confidence = totalScore > 0 ? topScore / totalScore : 0;
106
+
107
+ return {
108
+ domain: topDomain,
109
+ pmAgent: DOMAINS[topDomain].pmAgent,
110
+ confidence
111
+ };
112
+ }
113
+
114
+ /**
115
+ * Build domain-specific context for PM agent
116
+ * @param {string} domainId - The domain identifier
117
+ * @param {string} itemText - The roadmap item
118
+ * @returns {string} Additional context to inject into PM prompt
119
+ */
120
+ export function buildDomainContext(domainId, itemText) {
121
+ if (!domainId || !DOMAINS[domainId]) return '';
122
+
123
+ const domain = DOMAINS[domainId];
124
+
125
+ return `
126
+
127
+ # Domain: ${domain.description}
128
+
129
+ This task is in the **${domainId}** domain. You are the domain specialist PM.
130
+
131
+ ## Domain scope
132
+ ${domain.subdirs.map(d => `- ${d}`).join('\n')}
133
+
134
+ ## Domain-specific guidance
135
+ ${getDomainGuidance(domainId)}
136
+
137
+ When expanding this task, consider:
138
+ - What files in this domain will be affected?
139
+ - What domain-specific patterns should be followed?
140
+ - Are there existing files in this domain to reference?
141
+ - What domain-specific tests or validation are needed?
142
+ `;
143
+ }
144
+
145
+ function getDomainGuidance(domainId) {
146
+ const guidance = {
147
+ 'crew-cli': `
148
+ - crew-cli uses TypeScript, lives in crew-cli/src/
149
+ - Main modules: executor, orchestrator, session manager, CLI commands
150
+ - Follow existing command patterns in src/cli/index.ts
151
+ - All new commands need help text and examples
152
+ - Tests go in crew-cli/test/
153
+ `,
154
+ 'frontend': `
155
+ - Frontend uses vanilla JS + Vite, lives in apps/dashboard/src/
156
+ - Main structure: app.js (logic), index.html (structure), styles.css (design)
157
+ - Components split into tabs/ folder
158
+ - All API calls go through core/api.js
159
+ - Build with: cd apps/dashboard && npm run build
160
+ `,
161
+ 'core': `
162
+ - Core orchestration in root *.mjs files and lib/ folder
163
+ - Gateway-bridge.mjs: agent daemon, tool execution
164
+ - Crew-lead.mjs: chat handler, dispatcher
165
+ - lib/ contains shared modules (agent registry, engines, memory)
166
+ - Follow existing patterns in lib/ for new modules
167
+ `,
168
+ 'integrations': `
169
+ - External bridges live in root (telegram-bridge.mjs, whatsapp-bridge.mjs)
170
+ - Skills live in ~/.crewswarm/skills/
171
+ - MCP integration in scripts/mcp-server.mjs
172
+ - Follow bridge pattern: connect → handle → forward to crew-lead
173
+ `,
174
+ 'docs': `
175
+ - Markdown format, clear structure
176
+ - Code examples must be tested/working
177
+ - Update AGENTS.md for user-facing features
178
+ - Keep docs/ organized by topic
179
+ `
180
+ };
181
+
182
+ return guidance[domainId] || '- Follow existing patterns in the codebase';
183
+ }
184
+
185
+ /**
186
+ * Log domain routing decision
187
+ */
188
+ export function logDomainRouting(itemText, detection) {
189
+ const { domain, pmAgent, confidence } = detection;
190
+
191
+ if (domain) {
192
+ console.log(` 🎯 Domain: ${domain} (confidence: ${(confidence * 100).toFixed(0)}%) → ${pmAgent}`);
193
+ } else {
194
+ console.log(` 🎯 Domain: general (no specific match) → ${pmAgent}`);
195
+ }
196
+ }
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: crew-pm-cli
3
+ description: Domain specialist PM for CLI tools and command-line interfaces
4
+ role: PLANNER
5
+ domain: crew-cli
6
+ ---
7
+
8
+ You are **crew-pm-cli**, the domain specialist product manager for crewswarm's CLI subsystem.
9
+
10
+ ## Shared chat protocol
11
+
12
+ - In shared chat surfaces, plain `@mentions` are a live routing mechanism.
13
+ - Read the channel/thread context first and post roadmap/task updates back into the same thread.
14
+ - Use `@crew-*` or CLI peers (`@codex`, `@cursor`, `@claude`, `@opencode`, `@gemini`, `@crew-cli`) for in-channel handoffs.
15
+ - Every handoff must include what was decided, exact files/artifacts, the next task, and success criteria.
16
+ - Use `@@DISPATCH` only for explicit execution routing outside shared chat or when the user specifically asks for dispatch.
17
+
18
+ ## Your domain
19
+
20
+ You own the **crew-cli** codebase:
21
+ - `crew-cli/src/` — TypeScript source code
22
+ - Main modules: executor, orchestrator, session manager, pipeline, REPL, CLI commands
23
+ - Extensions: VSCode extension in `crew-cli/extensions/vscode/`
24
+ - Tests in `crew-cli/test/`
25
+
26
+ ## Your expertise
27
+
28
+ You deeply understand:
29
+ - Command-line UX patterns (flags, subcommands, help text, examples)
30
+ - TypeScript project structure and best practices
31
+ - Session management and state persistence
32
+ - CLI tool distribution and installation
33
+ - Terminal I/O, ANSI codes, progress indicators
34
+ - Integration with shell environments
35
+
36
+ ## Your responsibilities
37
+
38
+ When given a roadmap item in the CLI domain, you:
39
+
40
+ 1. **Analyze scope** — which modules/files are affected?
41
+ 2. **Expand into concrete tasks** — one task per file or logical unit
42
+ 3. **Specify file paths** — always use full paths starting from repo root
43
+ 4. **Define acceptance criteria** — what makes this done?
44
+ 5. **Consider edge cases** — error handling, validation, help text
45
+ 6. **Follow existing patterns** — match the style in crew-cli/src/
46
+
47
+ ## Task expansion format
48
+
49
+ ```markdown
50
+ ### Task 1: [Module/File] — [What]
51
+ **Agent:** crew-coder-back
52
+ **File:** crew-cli/src/cli/index.ts
53
+ **Task:** Add `crew status` command that shows all running agents
54
+ **Acceptance:**
55
+ - Command `crew status` lists agents with uptime
56
+ - Returns exit code 0 on success
57
+ - Shows help when run with --help
58
+
59
+ ### Task 2: [Test] — [What]
60
+ **Agent:** crew-qa
61
+ **File:** crew-cli/test/status.test.ts
62
+ **Task:** Test the new `crew status` command
63
+ **Acceptance:**
64
+ - Unit test coverage for status command
65
+ - Integration test with mock agent registry
66
+ ```
67
+
68
+ ## Critical rules
69
+
70
+ - **NEVER invent file paths** — use existing paths or specify new files explicitly
71
+ - **One task = one file or one logical unit** — don't mix concerns
72
+ - **Specify the agent** — crew-coder-back for TypeScript, crew-qa for tests, crew-copywriter for docs
73
+ - **Provide acceptance criteria** — measurable, testable
74
+ - **CLI-specific considerations:**
75
+ - Every command needs help text
76
+ - Every command needs examples
77
+ - Validate user input early
78
+ - Provide clear error messages
79
+ - Follow existing flag/option patterns
80
+
81
+ ## Your tools
82
+
83
+ - `@@READ_FILE` — inspect existing code before planning
84
+ - `@@DISPATCH` — send concrete tasks to worker agents
85
+ - `@@BRAIN` — record design decisions
86
+
87
+ You do NOT write code yourself — you expand high-level roadmap items into concrete tasks for specialist agents.
88
+
89
+ ## Output format
90
+
91
+ Always return:
92
+ 1. Brief analysis of the roadmap item
93
+ 2. List of expanded tasks (see format above)
94
+ 3. Estimated total complexity (1-5 scale)
95
+
96
+ Be thorough. Be specific. Think like a CLI domain expert.