@desplega.ai/agent-swarm 1.20.0 → 1.51.2

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 (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
package/src/cli.tsx CHANGED
@@ -6,7 +6,8 @@ import pkg from "../package.json";
6
6
  import { runClaude } from "./claude.ts";
7
7
  import { runHook } from "./commands/hook.ts";
8
8
  import { runLead } from "./commands/lead.ts";
9
- import { Setup } from "./commands/setup.tsx";
9
+ import { Onboard } from "./commands/onboard.tsx";
10
+ import { Setup as Connect } from "./commands/setup.tsx";
10
11
  import { runWorker } from "./commands/worker.ts";
11
12
 
12
13
  // Get CLI name from bin field (assumes single key)
@@ -34,6 +35,10 @@ interface ParsedArgs {
34
35
  systemPromptFile: string;
35
36
  additionalArgs: string[];
36
37
  aiLoop: boolean;
38
+ preset: string;
39
+ open: boolean;
40
+ showHelp: boolean;
41
+ dbPath: string;
37
42
  }
38
43
 
39
44
  function parseArgs(args: string[]): ParsedArgs {
@@ -50,6 +55,10 @@ function parseArgs(args: string[]): ParsedArgs {
50
55
  let systemPromptFile = "";
51
56
  let additionalArgs: string[] = [];
52
57
  let aiLoop = false;
58
+ let preset = "";
59
+ let open = false;
60
+ let showHelp = false;
61
+ let dbPath = "";
53
62
 
54
63
  // Find if there's a "--" separator for additional args
55
64
  const separatorIndex = args.indexOf("--");
@@ -85,6 +94,18 @@ function parseArgs(args: string[]): ParsedArgs {
85
94
  i++;
86
95
  } else if (arg === "--ai-loop") {
87
96
  aiLoop = true;
97
+ } else if (arg === "--preset") {
98
+ preset = mainArgs[i + 1] || preset;
99
+ i++;
100
+ } else if (arg?.startsWith("--preset=")) {
101
+ preset = arg.slice("--preset=".length);
102
+ } else if (arg === "--open") {
103
+ open = true;
104
+ } else if (arg === "--help" || arg === "-h") {
105
+ showHelp = true;
106
+ } else if (arg === "--db") {
107
+ dbPath = mainArgs[i + 1] || dbPath;
108
+ i++;
88
109
  }
89
110
  }
90
111
 
@@ -102,285 +123,185 @@ function parseArgs(args: string[]): ParsedArgs {
102
123
  systemPromptFile,
103
124
  additionalArgs,
104
125
  aiLoop,
126
+ preset,
127
+ open,
128
+ showHelp,
129
+ dbPath,
105
130
  };
106
131
  }
107
132
 
108
- function Help() {
109
- const { exit } = useApp();
110
- useEffect(() => {
111
- exit();
112
- }, [exit]);
113
-
114
- return (
115
- <Box flexDirection="column" padding={1}>
116
- <Box>
117
- <Text bold color="cyan">
118
- {binName}
119
- </Text>
120
- <Text dimColor> v{pkg.version}</Text>
121
- </Box>
122
- <Text dimColor>{pkg.description}</Text>
123
-
124
- <Box marginTop={1} flexDirection="column">
125
- <Text bold>Usage:</Text>
126
- <Text>
127
- {" "}
128
- {binName} {"<command>"} [options]
129
- </Text>
130
- <Text dimColor>
131
- {" "}
132
- or: bunx {binName} {"<command>"} [options]
133
- </Text>
134
- </Box>
135
-
136
- <Box marginTop={1} flexDirection="column">
137
- <Text bold>Commands:</Text>
138
- <Box>
139
- <Box width={12}>
140
- <Text color="green">setup</Text>
141
- </Box>
142
- <Text>Set up agent-swarm in your project</Text>
143
- </Box>
144
- <Box>
145
- <Box width={12}>
146
- <Text color="green">hook</Text>
147
- </Box>
148
- <Text>Handle Claude Code hook events (stdin)</Text>
149
- </Box>
150
- <Box>
151
- <Box width={12}>
152
- <Text color="green">mcp</Text>
153
- </Box>
154
- <Text>Start the MCP HTTP server</Text>
155
- </Box>
156
- <Box>
157
- <Box width={12}>
158
- <Text color="green">claude</Text>
159
- </Box>
160
- <Text>Run Claude CLI</Text>
161
- </Box>
162
- <Box>
163
- <Box width={12}>
164
- <Text color="green">worker</Text>
165
- </Box>
166
- <Text>Run Claude in headless loop mode</Text>
167
- </Box>
168
- <Box>
169
- <Box width={12}>
170
- <Text color="green">lead</Text>
171
- </Box>
172
- <Text>Run Claude as lead agent in headless loop</Text>
173
- </Box>
174
- <Box>
175
- <Box width={12}>
176
- <Text color="green">version</Text>
177
- </Box>
178
- <Text>Show version number</Text>
179
- </Box>
180
- <Box>
181
- <Box width={12}>
182
- <Text color="green">help</Text>
183
- </Box>
184
- <Text>Show this help message</Text>
185
- </Box>
186
- </Box>
187
-
188
- <Box marginTop={1} flexDirection="column">
189
- <Text bold>Options for 'setup':</Text>
190
- <Box>
191
- <Box width={24}>
192
- <Text color="yellow">--dry-run</Text>
193
- </Box>
194
- <Text>Show what would be changed without writing</Text>
195
- </Box>
196
- <Box>
197
- <Box width={24}>
198
- <Text color="yellow">--restore</Text>
199
- </Box>
200
- <Text>Restore files from .bak backups</Text>
201
- </Box>
202
- <Box>
203
- <Box width={24}>
204
- <Text color="yellow">-y, --yes</Text>
205
- </Box>
206
- <Text>Non-interactive mode (use env vars)</Text>
207
- </Box>
208
- </Box>
209
-
210
- <Box marginTop={1} flexDirection="column">
211
- <Text bold>Options for 'mcp':</Text>
212
- <Box>
213
- <Box width={24}>
214
- <Text color="yellow">-p, --port {"<port>"}</Text>
215
- </Box>
216
- <Text>Port to listen on (default: 3013)</Text>
217
- </Box>
218
- <Box>
219
- <Box width={24}>
220
- <Text color="yellow">-k, --key {"<key>"}</Text>
221
- </Box>
222
- <Text>API key for authentication</Text>
223
- </Box>
224
- </Box>
225
-
226
- <Box marginTop={1} flexDirection="column">
227
- <Text bold>Options for 'claude':</Text>
228
- <Box>
229
- <Box width={24}>
230
- <Text color="yellow">-m, --msg {"<message>"}</Text>
231
- </Box>
232
- <Text>Message to send to Claude</Text>
233
- </Box>
234
- <Box>
235
- <Box width={24}>
236
- <Text color="yellow">--headless</Text>
237
- </Box>
238
- <Text>Run in headless mode (stream JSON output)</Text>
239
- </Box>
240
- <Box>
241
- <Box width={24}>
242
- <Text color="yellow">-- {"<args...>"}</Text>
243
- </Box>
244
- <Text>Additional arguments to pass to Claude CLI</Text>
245
- </Box>
246
- </Box>
247
-
248
- <Box marginTop={1} flexDirection="column">
249
- <Text bold>Options for 'worker' and 'lead':</Text>
250
- <Box>
251
- <Box width={30}>
252
- <Text color="yellow">-m, --msg {"<prompt>"}</Text>
253
- </Box>
254
- <Text>Custom prompt (default: /agent-swarm:start-worker)</Text>
255
- </Box>
256
- <Box>
257
- <Box width={30}>
258
- <Text color="yellow">--yolo</Text>
259
- </Box>
260
- <Text>Continue on errors instead of stopping</Text>
261
- </Box>
262
- <Box>
263
- <Box width={30}>
264
- <Text color="yellow">--system-prompt {"<text>"}</Text>
265
- </Box>
266
- <Text>Custom system prompt (appended to Claude)</Text>
267
- </Box>
268
- <Box>
269
- <Box width={30}>
270
- <Text color="yellow">--system-prompt-file {"<path>"}</Text>
271
- </Box>
272
- <Text>Read system prompt from file</Text>
273
- </Box>
274
- <Box>
275
- <Box width={30}>
276
- <Text color="yellow">--ai-loop</Text>
277
- </Box>
278
- <Text>Use AI-based polling (legacy mode)</Text>
279
- </Box>
280
- <Box>
281
- <Box width={30}>
282
- <Text color="yellow">-- {"<args...>"}</Text>
283
- </Box>
284
- <Text>Additional arguments to pass to Claude CLI</Text>
285
- </Box>
286
- </Box>
287
-
288
- <Box marginTop={1} flexDirection="column">
289
- <Text bold>Examples:</Text>
290
- <Text dimColor> {binName} setup</Text>
291
- <Text dimColor> {binName} setup --dry-run</Text>
292
- <Text dimColor> {binName} setup -y</Text>
293
- <Text dimColor> {binName} mcp</Text>
294
- <Text dimColor> {binName} mcp --port 8080</Text>
295
- <Text dimColor> {binName} mcp -p 8080 -k my-secret-key</Text>
296
- <Text dimColor> {binName} claude</Text>
297
- <Text dimColor> {binName} claude --headless -m "Hello"</Text>
298
- <Text dimColor> {binName} claude -- --resume</Text>
299
- <Text dimColor> {binName} worker</Text>
300
- <Text dimColor> {binName} worker --yolo</Text>
301
- <Text dimColor> {binName} worker -m "Custom prompt"</Text>
302
- <Text dimColor> {binName} worker --system-prompt "You are a Python specialist"</Text>
303
- <Text dimColor> {binName} worker --system-prompt-file ./prompts/specialist.txt</Text>
304
- <Text dimColor> {binName} lead</Text>
305
- <Text dimColor> {binName} lead --yolo</Text>
306
- <Text dimColor> {binName} lead -m "Custom prompt"</Text>
307
- <Text dimColor> {binName} lead --system-prompt "You are a project coordinator"</Text>
308
- </Box>
133
+ // --- Plain text help (no Ink, no terminal reset) ---
134
+
135
+ const COMMAND_HELP: Record<
136
+ string,
137
+ { usage: string; description: string; options: string; examples: string }
138
+ > = {
139
+ onboard: {
140
+ usage: `${binName} onboard [options]`,
141
+ description:
142
+ "Set up a new swarm from scratch using Docker Compose.\nInteractive wizard that collects credentials, generates docker-compose.yml + .env,\nstarts the stack, and verifies health.",
143
+ options: [
144
+ " --dry-run Preview what would be generated without writing",
145
+ " -y, --yes Non-interactive mode (reads from env vars)",
146
+ " --preset <name> Preset: dev, content, research, solo",
147
+ " -h, --help Show this help",
148
+ ].join("\n"),
149
+ examples: [
150
+ ` ${binName} onboard`,
151
+ ` ${binName} onboard --dry-run`,
152
+ ` ${binName} onboard --yes --preset=dev`,
153
+ ` ANTHROPIC_API_KEY=sk-... ${binName} onboard --yes --preset=solo`,
154
+ ].join("\n"),
155
+ },
156
+ connect: {
157
+ usage: `${binName} connect [options]`,
158
+ description:
159
+ "Connect this project to an existing swarm.\nCreates .mcp.json and .claude/settings.local.json with server URL and API key.\nAuto-reads API_KEY from .env if present.",
160
+ options: [
161
+ " --dry-run Show what would be changed without writing",
162
+ " --restore Restore files from .bak backups",
163
+ " -y, --yes Non-interactive mode (use env vars)",
164
+ " -h, --help Show this help",
165
+ ].join("\n"),
166
+ examples: [
167
+ ` ${binName} connect`,
168
+ ` ${binName} connect --dry-run`,
169
+ ` ${binName} connect -y`,
170
+ ].join("\n"),
171
+ },
172
+ api: {
173
+ usage: `${binName} api [options]`,
174
+ description: "Start the API + MCP HTTP server.",
175
+ options: [
176
+ " -p, --port <port> Port to listen on (default: 3013)",
177
+ " -k, --key <key> API key for authentication",
178
+ " --db <path> Database file path (default: ./agent-swarm-db.sqlite)",
179
+ " -h, --help Show this help",
180
+ ].join("\n"),
181
+ examples: [
182
+ ` ${binName} api`,
183
+ ` ${binName} api --port 8080 --key my-secret`,
184
+ ` ${binName} api --db /data/swarm.sqlite`,
185
+ ].join("\n"),
186
+ },
187
+ claude: {
188
+ usage: `${binName} claude [options] [-- <args...>]`,
189
+ description: "Run Claude CLI with optional message and headless mode.",
190
+ options: [
191
+ " -m, --msg <message> Message to send to Claude",
192
+ " --headless Run in headless mode (stream JSON output)",
193
+ " -- <args...> Additional arguments to pass to Claude CLI",
194
+ " -h, --help Show this help",
195
+ ].join("\n"),
196
+ examples: [
197
+ ` ${binName} claude`,
198
+ ` ${binName} claude --headless -m "Hello"`,
199
+ ` ${binName} claude -- --resume`,
200
+ ].join("\n"),
201
+ },
202
+ worker: {
203
+ usage: `${binName} worker [options] [-- <args...>]`,
204
+ description: "Run Claude in headless loop mode as a worker agent.",
205
+ options: [
206
+ " -m, --msg <prompt> Custom prompt (default: /agent-swarm:start-worker)",
207
+ " --yolo Continue on errors instead of stopping",
208
+ " --system-prompt <text> Custom system prompt (appended to Claude)",
209
+ " --system-prompt-file <path> Read system prompt from file",
210
+ " --ai-loop Use AI-based polling (legacy mode)",
211
+ " -- <args...> Additional arguments to pass to Claude CLI",
212
+ " -h, --help Show this help",
213
+ ].join("\n"),
214
+ examples: [
215
+ ` ${binName} worker`,
216
+ ` ${binName} worker --yolo`,
217
+ ` ${binName} worker -m "Custom prompt"`,
218
+ ` ${binName} worker --system-prompt "You are a Python specialist"`,
219
+ ].join("\n"),
220
+ },
221
+ lead: {
222
+ usage: `${binName} lead [options] [-- <args...>]`,
223
+ description: "Run Claude as lead agent in headless loop mode.\nSame options as worker.",
224
+ options: [
225
+ " -m, --msg <prompt> Custom prompt",
226
+ " --yolo Continue on errors instead of stopping",
227
+ " --system-prompt <text> Custom system prompt",
228
+ " --system-prompt-file <path> Read system prompt from file",
229
+ " --ai-loop Use AI-based polling (legacy mode)",
230
+ " -- <args...> Additional arguments to pass to Claude CLI",
231
+ " -h, --help Show this help",
232
+ ].join("\n"),
233
+ examples: [` ${binName} lead`, ` ${binName} lead --yolo`].join("\n"),
234
+ },
235
+ docs: {
236
+ usage: `${binName} docs [--open]`,
237
+ description:
238
+ "Show documentation URL.\nAll pages are also available in markdown format by appending .md to the URL.",
239
+ options: [
240
+ " --open Open docs in default browser",
241
+ " -h, --help Show this help",
242
+ ].join("\n"),
243
+ examples: [` ${binName} docs`, ` ${binName} docs --open`].join("\n"),
244
+ },
245
+ hook: {
246
+ usage: `${binName} hook`,
247
+ description:
248
+ "Handle Claude Code hook events from stdin.\nUsed internally by the agent-swarm hooks system.",
249
+ options: " -h, --help Show this help",
250
+ examples: ` ${binName} hook`,
251
+ },
252
+ artifact: {
253
+ usage: `${binName} artifact <subcommand> [options]`,
254
+ description: "Manage agent artifacts (serve, list, etc.).",
255
+ options: " -h, --help Show this help",
256
+ examples: [` ${binName} artifact serve`, ` ${binName} artifact help`].join("\n"),
257
+ },
258
+ };
259
+
260
+ function printHelp(command?: string) {
261
+ if (command && command !== "help" && COMMAND_HELP[command]) {
262
+ const cmd = COMMAND_HELP[command];
263
+ console.log(`\n${binName} ${command} v${pkg.version}\n`);
264
+ console.log(cmd.description);
265
+ console.log(`\nUsage:\n ${cmd.usage}\n`);
266
+ console.log(`Options:\n${cmd.options}\n`);
267
+ console.log(`Examples:\n${cmd.examples}\n`);
268
+ return;
269
+ }
309
270
 
310
- <Box marginTop={1} flexDirection="column">
311
- <Text bold>Environment variables:</Text>
312
- <Box>
313
- <Box width={24}>
314
- <Text color="magenta">PORT</Text>
315
- </Box>
316
- <Text>Default port for the MCP server</Text>
317
- </Box>
318
- <Box>
319
- <Box width={24}>
320
- <Text color="magenta">API_KEY</Text>
321
- </Box>
322
- <Text>API key for authentication (Bearer token)</Text>
323
- </Box>
324
- <Box>
325
- <Box width={24}>
326
- <Text color="magenta">MCP_BASE_URL</Text>
327
- </Box>
328
- <Text>Base URL for the MCP server (used by setup)</Text>
329
- </Box>
330
- <Box>
331
- <Box width={24}>
332
- <Text color="magenta">AGENT_ID</Text>
333
- </Box>
334
- <Text>UUID for agent identification</Text>
335
- </Box>
336
- <Box>
337
- <Box width={24}>
338
- <Text color="magenta">SESSION_ID</Text>
339
- </Box>
340
- <Text>Folder name for worker logs (auto-generated)</Text>
341
- </Box>
342
- <Box>
343
- <Box width={24}>
344
- <Text color="magenta">YOLO</Text>
345
- </Box>
346
- <Text>If "true", worker continues on errors</Text>
347
- </Box>
348
- <Box>
349
- <Box width={32}>
350
- <Text color="magenta">LOG_DIR</Text>
351
- </Box>
352
- <Text>Directory for agent logs, defaults to ./logs</Text>
353
- </Box>
354
- <Box>
355
- <Box width={32}>
356
- <Text color="magenta">SYSTEM_PROMPT</Text>
357
- </Box>
358
- <Text>Custom system prompt for worker</Text>
359
- </Box>
360
- <Box>
361
- <Box width={32}>
362
- <Text color="magenta">SYSTEM_PROMPT_FILE</Text>
363
- </Box>
364
- <Text>Path to system prompt file</Text>
365
- </Box>
366
- <Box>
367
- <Box width={32}>
368
- <Text color="magenta">AI_LOOP</Text>
369
- </Box>
370
- <Text>If "true", use AI-based polling</Text>
371
- </Box>
372
- </Box>
373
- </Box>
374
- );
271
+ // General help
272
+ console.log(`\n${binName} v${pkg.version}`);
273
+ console.log(`${pkg.description}\n`);
274
+ console.log(`Usage: ${binName} <command> [options]\n`);
275
+ console.log("Commands:");
276
+ const commands = [
277
+ ["onboard", "Set up a new swarm from scratch (Docker Compose)"],
278
+ ["connect", "Connect this project to an existing swarm"],
279
+ ["worker", "Run Claude in headless loop mode"],
280
+ ["lead", "Run Claude as lead agent in headless loop"],
281
+ ["api", "Start the API + MCP HTTP server"],
282
+ ["claude", "Run Claude CLI"],
283
+ ["hook", "Handle Claude Code hook events (stdin)"],
284
+ ["artifact", "Manage agent artifacts"],
285
+ ["docs", "Open documentation (--open to launch in browser)"],
286
+ ["version", "Show version number"],
287
+ ["help", "Show this help message"],
288
+ ];
289
+ for (const entry of commands) {
290
+ console.log(` ${(entry[0] ?? "").padEnd(12)} ${entry[1] ?? ""}`);
291
+ }
292
+ console.log(`\nRun '${binName} <command> --help' for details on a specific command.\n`);
375
293
  }
376
294
 
377
- function McpServer({ port, apiKey }: { port: string; apiKey: string }) {
295
+ function McpServer({ port, apiKey, dbPath }: { port: string; apiKey: string; dbPath: string }) {
378
296
  const [status, setStatus] = useState<"starting" | "running" | "error">("starting");
379
297
  const [error, setError] = useState<string | null>(null);
380
298
 
381
299
  useEffect(() => {
382
300
  process.env.PORT = port;
383
301
  process.env.API_KEY = apiKey;
302
+ if (dbPath) {
303
+ process.env.DATABASE_PATH = dbPath;
304
+ }
384
305
 
385
306
  import("./http.ts")
386
307
  .then(() => {
@@ -390,12 +311,12 @@ function McpServer({ port, apiKey }: { port: string; apiKey: string }) {
390
311
  setStatus("error");
391
312
  setError(err.message);
392
313
  });
393
- }, [port, apiKey]);
314
+ }, [port, apiKey, dbPath]);
394
315
 
395
316
  if (status === "error") {
396
317
  return (
397
318
  <Box flexDirection="column" padding={1}>
398
- <Text color="red">✗ Failed to start MCP server</Text>
319
+ <Text color="red">✗ Failed to start API server</Text>
399
320
  {error && <Text dimColor>{error}</Text>}
400
321
  </Box>
401
322
  );
@@ -404,7 +325,7 @@ function McpServer({ port, apiKey }: { port: string; apiKey: string }) {
404
325
  if (status === "starting") {
405
326
  return (
406
327
  <Box padding={1}>
407
- <Spinner label="Starting MCP server..." />
328
+ <Spinner label="Starting API server..." />
408
329
  </Box>
409
330
  );
410
331
  }
@@ -413,7 +334,7 @@ function McpServer({ port, apiKey }: { port: string; apiKey: string }) {
413
334
  <Box flexDirection="column" padding={1}>
414
335
  <Box>
415
336
  <Text color="green">✓ </Text>
416
- <Text>MCP HTTP server running on </Text>
337
+ <Text>API server running on </Text>
417
338
  <Text color="cyan" bold>
418
339
  http://localhost:{port}/mcp
419
340
  </Text>
@@ -527,21 +448,6 @@ function UnknownCommand({ command }: { command: string }) {
527
448
  );
528
449
  }
529
450
 
530
- function Version() {
531
- const { exit } = useApp();
532
- useEffect(() => {
533
- exit();
534
- }, [exit]);
535
-
536
- return (
537
- <Box padding={1}>
538
- <Text>
539
- {binName} v{pkg.version}
540
- </Text>
541
- </Box>
542
- );
543
- }
544
-
545
451
  function App({ args }: { args: ParsedArgs }) {
546
452
  const {
547
453
  command,
@@ -557,13 +463,16 @@ function App({ args }: { args: ParsedArgs }) {
557
463
  systemPromptFile,
558
464
  additionalArgs,
559
465
  aiLoop,
466
+ preset,
560
467
  } = args;
561
468
 
562
469
  switch (command) {
563
- case "setup":
564
- return <Setup dryRun={dryRun} restore={restore} yes={yes} />;
565
- case "mcp":
566
- return <McpServer port={port} apiKey={key} />;
470
+ case "onboard":
471
+ return <Onboard dryRun={dryRun} yes={yes} preset={preset || undefined} />;
472
+ case "connect":
473
+ return <Connect dryRun={dryRun} restore={restore} yes={yes} />;
474
+ case "api":
475
+ return <McpServer port={port} apiKey={key} dbPath={args.dbPath} />;
567
476
  case "claude":
568
477
  return <ClaudeRunner msg={msg} headless={headless} additionalArgs={additionalArgs} />;
569
478
  case "worker":
@@ -588,21 +497,44 @@ function App({ args }: { args: ParsedArgs }) {
588
497
  aiLoop={aiLoop}
589
498
  />
590
499
  );
591
- case "version":
592
- return <Version />;
593
- case "help":
594
- case undefined:
595
- return <Help />;
500
+ // version, help, docs handled before render()
596
501
  default:
597
- return <UnknownCommand command={command} />;
502
+ return <UnknownCommand command={command ?? ""} />;
598
503
  }
599
504
  }
600
505
 
601
506
  const args = parseArgs(process.argv.slice(2));
602
507
 
603
- // Handle hook command separately (no UI needed)
604
- if (args.command === "hook") {
508
+ // Handle non-UI commands separately (plain stdout, no Ink)
509
+ if (args.showHelp || args.command === "help" || args.command === undefined) {
510
+ printHelp(args.showHelp ? args.command : undefined);
511
+ process.exit(0);
512
+ } else if (args.command === "version") {
513
+ console.log(`${binName} v${pkg.version}`);
514
+ process.exit(0);
515
+ } else if (args.command === "docs") {
516
+ const docsUrl = "https://docs.agent-swarm.dev";
517
+ console.log(`\n${binName} docs — v${pkg.version}\n`);
518
+ console.log(`Documentation: ${docsUrl}\n`);
519
+ console.log("All pages are also available in markdown format by appending .md to the URL.");
520
+ console.log(`Example: ${docsUrl}/getting-started.md\n`);
521
+ if (args.open) {
522
+ await Bun.$`open ${docsUrl}`.quiet().catch(() => {
523
+ console.log(`Could not open browser. Visit: ${docsUrl}`);
524
+ });
525
+ }
526
+ process.exit(0);
527
+ } else if (args.command === "hook") {
605
528
  runHook();
529
+ } else if (args.command === "artifact") {
530
+ // Pass all args after "artifact" directly
531
+ const artifactArgs = process.argv.slice(process.argv.indexOf("artifact") + 1);
532
+ const { runArtifact } = await import("./commands/artifact");
533
+ await runArtifact(artifactArgs[0] || "help", {
534
+ additionalArgs: artifactArgs.slice(1),
535
+ port: args.port,
536
+ key: args.key,
537
+ });
606
538
  } else {
607
539
  render(<App args={args} />);
608
540
  }