@desplega.ai/agent-swarm 1.20.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (810) hide show
  1. package/.claude/settings.json +84 -0
  2. package/.claude/settings.local.json +3 -1
  3. package/.entire/settings.json +4 -0
  4. package/.env.docker.example +40 -23
  5. package/.env.example +39 -1
  6. package/.github/ISSUE_TEMPLATE/bug_report.yml +78 -0
  7. package/.github/ISSUE_TEMPLATE/community-template.yml +77 -0
  8. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  9. package/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
  10. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +29 -0
  11. package/.github/workflows/ci.yml +3 -27
  12. package/.github/workflows/docker-and-deploy.yml +20 -5
  13. package/.github/workflows/merge-gate.yml +233 -0
  14. package/.opencode/plugins/entire.ts +133 -0
  15. package/.superset/config.json +6 -0
  16. package/.wts-setup.ts +103 -34
  17. package/CHANGELOG.md +447 -0
  18. package/CLAUDE.md +422 -5
  19. package/CONTRIBUTING.md +46 -1
  20. package/DEPLOYMENT.md +26 -9
  21. package/Dockerfile +15 -7
  22. package/Dockerfile.worker +99 -67
  23. package/MCP.md +452 -17
  24. package/README.md +271 -169
  25. package/api-entrypoint.sh +56 -0
  26. package/depot.json +1 -0
  27. package/docker-compose.example.yml +194 -3
  28. package/docker-compose.local.yml +119 -0
  29. package/docker-entrypoint.sh +393 -113
  30. package/docs-site/app/api/search/route.ts +4 -0
  31. package/docs-site/app/docs/[[...slug]]/page.tsx +87 -0
  32. package/docs-site/app/docs/layout.tsx +12 -0
  33. package/docs-site/app/globals.css +24 -0
  34. package/docs-site/app/layout.config.tsx +34 -0
  35. package/docs-site/app/layout.tsx +119 -0
  36. package/docs-site/app/llms-full.txt/route.ts +11 -0
  37. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +24 -0
  38. package/docs-site/app/llms.txt/route.ts +8 -0
  39. package/docs-site/app/page.tsx +5 -0
  40. package/docs-site/app/robots.ts +13 -0
  41. package/docs-site/app/sitemap.ts +37 -0
  42. package/docs-site/components/api-page.client.tsx +4 -0
  43. package/docs-site/components/api-page.tsx +7 -0
  44. package/docs-site/components/mdx/mermaid.tsx +55 -0
  45. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +117 -0
  46. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +77 -0
  47. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +96 -0
  48. package/docs-site/content/docs/(documentation)/architecture/meta.json +4 -0
  49. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +172 -0
  50. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +98 -0
  51. package/docs-site/content/docs/(documentation)/concepts/meta.json +4 -0
  52. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +136 -0
  53. package/docs-site/content/docs/(documentation)/concepts/services.mdx +104 -0
  54. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +148 -0
  55. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +209 -0
  56. package/docs-site/content/docs/(documentation)/contributing.mdx +158 -0
  57. package/docs-site/content/docs/(documentation)/getting-started.mdx +157 -0
  58. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +79 -0
  59. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +171 -0
  60. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +81 -0
  61. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +93 -0
  62. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +98 -0
  63. package/docs-site/content/docs/(documentation)/guides/meta.json +13 -0
  64. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +52 -0
  65. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +179 -0
  66. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +154 -0
  67. package/docs-site/content/docs/(documentation)/index.mdx +65 -0
  68. package/docs-site/content/docs/(documentation)/meta.json +19 -0
  69. package/docs-site/content/docs/(documentation)/reference/cli.mdx +241 -0
  70. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +205 -0
  71. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +449 -0
  72. package/docs-site/content/docs/(documentation)/reference/meta.json +4 -0
  73. package/docs-site/content/docs/api-reference/active-sessions.mdx +9 -0
  74. package/docs-site/content/docs/api-reference/agents.mdx +9 -0
  75. package/docs-site/content/docs/api-reference/channels.mdx +9 -0
  76. package/docs-site/content/docs/api-reference/config.mdx +9 -0
  77. package/docs-site/content/docs/api-reference/debug.mdx +9 -0
  78. package/docs-site/content/docs/api-reference/ecosystem.mdx +9 -0
  79. package/docs-site/content/docs/api-reference/epics.mdx +9 -0
  80. package/docs-site/content/docs/api-reference/index.mdx +32 -0
  81. package/docs-site/content/docs/api-reference/memory.mdx +9 -0
  82. package/docs-site/content/docs/api-reference/meta.json +25 -0
  83. package/docs-site/content/docs/api-reference/poll.mdx +9 -0
  84. package/docs-site/content/docs/api-reference/repos.mdx +9 -0
  85. package/docs-site/content/docs/api-reference/schedules.mdx +9 -0
  86. package/docs-site/content/docs/api-reference/session-data.mdx +9 -0
  87. package/docs-site/content/docs/api-reference/stats.mdx +9 -0
  88. package/docs-site/content/docs/api-reference/tasks.mdx +9 -0
  89. package/docs-site/content/docs/api-reference/trackers.mdx +9 -0
  90. package/docs-site/content/docs/api-reference/webhooks.mdx +9 -0
  91. package/docs-site/content/docs/api-reference/workflows.mdx +9 -0
  92. package/docs-site/content/docs/meta.json +3 -0
  93. package/docs-site/lib/get-llm-text.ts +10 -0
  94. package/docs-site/lib/openapi.ts +23 -0
  95. package/docs-site/lib/source.ts +8 -0
  96. package/docs-site/mdx-components.tsx +13 -0
  97. package/docs-site/next.config.mjs +29 -0
  98. package/docs-site/package.json +35 -0
  99. package/docs-site/pnpm-lock.yaml +5407 -0
  100. package/docs-site/postcss.config.mjs +8 -0
  101. package/docs-site/scripts/generate-docs.ts +171 -0
  102. package/docs-site/source.config.ts +17 -0
  103. package/docs-site/tsconfig.json +46 -0
  104. package/ecosystem.config.cjs +4 -4
  105. package/landing/next.config.ts +14 -0
  106. package/landing/package.json +31 -0
  107. package/landing/pnpm-lock.yaml +1091 -0
  108. package/landing/postcss.config.mjs +8 -0
  109. package/landing/public/apple-touch-icon.png +0 -0
  110. package/landing/public/favicon.ico +0 -0
  111. package/landing/public/logo.png +0 -0
  112. package/landing/public/og-image.png +0 -0
  113. package/landing/public/omghost-desplega.svg +30 -0
  114. package/landing/public/omghost-openfort.svg +9 -0
  115. package/landing/src/app/actions/waitlist.ts +25 -0
  116. package/landing/src/app/blog/openfort-hackathon/page.tsx +863 -0
  117. package/landing/src/app/blog/page.tsx +162 -0
  118. package/landing/src/app/blog/swarm-metrics/page.tsx +685 -0
  119. package/landing/src/app/examples/page.tsx +174 -0
  120. package/landing/src/app/examples/x402/page.tsx +456 -0
  121. package/landing/src/app/globals.css +122 -0
  122. package/landing/src/app/layout.tsx +134 -0
  123. package/landing/src/app/page.tsx +27 -0
  124. package/landing/src/app/robots.ts +13 -0
  125. package/landing/src/app/sitemap.ts +44 -0
  126. package/landing/src/components/architecture.tsx +163 -0
  127. package/landing/src/components/cta.tsx +52 -0
  128. package/landing/src/components/features.tsx +160 -0
  129. package/landing/src/components/footer.tsx +100 -0
  130. package/landing/src/components/hero.tsx +217 -0
  131. package/landing/src/components/how-it-works.tsx +165 -0
  132. package/landing/src/components/navbar.tsx +147 -0
  133. package/landing/src/components/waitlist.tsx +110 -0
  134. package/landing/src/components/why-choose.tsx +149 -0
  135. package/landing/src/components/workshops.tsx +328 -0
  136. package/landing/src/lib/utils.ts +6 -0
  137. package/landing/tsconfig.json +41 -0
  138. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +154 -0
  139. package/new-ui/CLAUDE.md +92 -0
  140. package/new-ui/README.md +73 -0
  141. package/new-ui/biome.json +42 -0
  142. package/new-ui/components.json +21 -0
  143. package/new-ui/index.html +25 -0
  144. package/new-ui/package.json +49 -0
  145. package/new-ui/pnpm-lock.yaml +4845 -0
  146. package/new-ui/public/logo.png +0 -0
  147. package/new-ui/src/api/client.ts +814 -0
  148. package/new-ui/src/api/hooks/index.ts +64 -0
  149. package/new-ui/src/api/hooks/use-agents.ts +58 -0
  150. package/new-ui/src/api/hooks/use-channels.ts +115 -0
  151. package/new-ui/src/api/hooks/use-config-api.ts +46 -0
  152. package/new-ui/src/api/hooks/use-costs.ts +122 -0
  153. package/new-ui/src/api/hooks/use-db-query.ts +29 -0
  154. package/new-ui/src/api/hooks/use-epics.ts +75 -0
  155. package/new-ui/src/api/hooks/use-repos.ts +61 -0
  156. package/new-ui/src/api/hooks/use-schedules.ts +81 -0
  157. package/new-ui/src/api/hooks/use-services.ts +16 -0
  158. package/new-ui/src/api/hooks/use-stats.ts +27 -0
  159. package/new-ui/src/api/hooks/use-tasks.ts +89 -0
  160. package/new-ui/src/api/hooks/use-workflows.ts +109 -0
  161. package/{ui/src/types/api.ts → new-ui/src/api/types.ts} +236 -10
  162. package/new-ui/src/app/App.tsx +13 -0
  163. package/new-ui/src/app/providers.tsx +32 -0
  164. package/new-ui/src/app/router.tsx +52 -0
  165. package/new-ui/src/components/layout/app-header.tsx +47 -0
  166. package/new-ui/src/components/layout/app-sidebar.tsx +128 -0
  167. package/new-ui/src/components/layout/breadcrumbs.tsx +57 -0
  168. package/new-ui/src/components/layout/config-guard.tsx +22 -0
  169. package/new-ui/src/components/layout/root-layout.tsx +40 -0
  170. package/new-ui/src/components/layout/swarm-switcher.tsx +85 -0
  171. package/new-ui/src/components/shared/command-menu.tsx +131 -0
  172. package/new-ui/src/components/shared/data-grid.tsx +141 -0
  173. package/new-ui/src/components/shared/empty-state.tsx +24 -0
  174. package/new-ui/src/components/shared/error-boundary.tsx +72 -0
  175. package/new-ui/src/components/shared/json-viewer.tsx +47 -0
  176. package/new-ui/src/components/shared/name-connection-modal.tsx +99 -0
  177. package/new-ui/src/components/shared/page-skeleton.tsx +16 -0
  178. package/new-ui/src/components/shared/session-log-viewer.tsx +364 -0
  179. package/new-ui/src/components/shared/stats-bar.tsx +132 -0
  180. package/new-ui/src/components/shared/status-badge.tsx +131 -0
  181. package/new-ui/src/components/shared/usage-summary.tsx +179 -0
  182. package/new-ui/src/components/ui/alert-dialog.tsx +176 -0
  183. package/new-ui/src/components/ui/alert.tsx +60 -0
  184. package/new-ui/src/components/ui/avatar.tsx +96 -0
  185. package/new-ui/src/components/ui/badge.tsx +46 -0
  186. package/new-ui/src/components/ui/button.tsx +62 -0
  187. package/new-ui/src/components/ui/card.tsx +75 -0
  188. package/new-ui/src/components/ui/command.tsx +160 -0
  189. package/new-ui/src/components/ui/dialog.tsx +143 -0
  190. package/new-ui/src/components/ui/dropdown-menu.tsx +226 -0
  191. package/new-ui/src/components/ui/input.tsx +21 -0
  192. package/new-ui/src/components/ui/label.tsx +19 -0
  193. package/new-ui/src/components/ui/progress.tsx +26 -0
  194. package/new-ui/src/components/ui/scroll-area.tsx +54 -0
  195. package/new-ui/src/components/ui/select.tsx +175 -0
  196. package/new-ui/src/components/ui/separator.tsx +28 -0
  197. package/new-ui/src/components/ui/sheet.tsx +132 -0
  198. package/new-ui/src/components/ui/sidebar.tsx +691 -0
  199. package/new-ui/src/components/ui/skeleton.tsx +13 -0
  200. package/new-ui/src/components/ui/sonner.tsx +35 -0
  201. package/new-ui/src/components/ui/switch.tsx +33 -0
  202. package/new-ui/src/components/ui/table.tsx +92 -0
  203. package/new-ui/src/components/ui/tabs.tsx +79 -0
  204. package/new-ui/src/components/ui/textarea.tsx +18 -0
  205. package/new-ui/src/components/ui/tooltip.tsx +51 -0
  206. package/new-ui/src/components/workflows/action-node.tsx +53 -0
  207. package/new-ui/src/components/workflows/condition-node.tsx +50 -0
  208. package/new-ui/src/components/workflows/graph-utils.ts +124 -0
  209. package/new-ui/src/components/workflows/json-tree.tsx +189 -0
  210. package/new-ui/src/components/workflows/node-styles.ts +10 -0
  211. package/new-ui/src/components/workflows/step-detail-sheet.tsx +87 -0
  212. package/new-ui/src/components/workflows/trigger-node.tsx +41 -0
  213. package/new-ui/src/components/workflows/workflow-graph.tsx +65 -0
  214. package/{ui/src/hooks/useAutoScroll.ts → new-ui/src/hooks/use-auto-scroll.ts} +0 -1
  215. package/new-ui/src/hooks/use-config.ts +203 -0
  216. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +41 -0
  217. package/new-ui/src/hooks/use-mobile.ts +19 -0
  218. package/new-ui/src/hooks/use-theme.ts +60 -0
  219. package/new-ui/src/lib/config.ts +188 -0
  220. package/new-ui/src/lib/slugs.ts +71 -0
  221. package/{ui → new-ui}/src/lib/utils.ts +32 -0
  222. package/new-ui/src/main.tsx +11 -0
  223. package/new-ui/src/pages/agents/[id]/page.tsx +492 -0
  224. package/new-ui/src/pages/agents/page.tsx +134 -0
  225. package/new-ui/src/pages/chat/page.tsx +674 -0
  226. package/new-ui/src/pages/config/page.tsx +1109 -0
  227. package/new-ui/src/pages/dashboard/page.tsx +454 -0
  228. package/new-ui/src/pages/debug/page.tsx +275 -0
  229. package/new-ui/src/pages/epics/[id]/page.tsx +809 -0
  230. package/new-ui/src/pages/epics/page.tsx +321 -0
  231. package/new-ui/src/pages/not-found/page.tsx +18 -0
  232. package/new-ui/src/pages/repos/page.tsx +369 -0
  233. package/new-ui/src/pages/schedules/[id]/page.tsx +664 -0
  234. package/new-ui/src/pages/schedules/page.tsx +477 -0
  235. package/new-ui/src/pages/services/page.tsx +128 -0
  236. package/new-ui/src/pages/tasks/[id]/page.tsx +670 -0
  237. package/new-ui/src/pages/tasks/page.tsx +592 -0
  238. package/new-ui/src/pages/usage/page.tsx +195 -0
  239. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +363 -0
  240. package/new-ui/src/pages/workflows/[id]/page.tsx +417 -0
  241. package/new-ui/src/pages/workflows/page.tsx +266 -0
  242. package/new-ui/src/styles/ag-grid.css +36 -0
  243. package/new-ui/src/styles/globals.css +213 -0
  244. package/new-ui/test-results/.last-run.json +4 -0
  245. package/{ui/tsconfig.json → new-ui/tsconfig.app.json} +7 -4
  246. package/new-ui/tsconfig.json +4 -0
  247. package/new-ui/tsconfig.node.json +26 -0
  248. package/new-ui/vercel.json +4 -0
  249. package/new-ui/vite.config.ts +28 -0
  250. package/openapi.json +4436 -0
  251. package/package.json +31 -7
  252. package/plugin/build-pi-skills.ts +233 -0
  253. package/plugin/commands/close-issue.md +7 -3
  254. package/plugin/commands/create-pr.md +18 -12
  255. package/plugin/commands/implement-issue.md +7 -3
  256. package/plugin/commands/respond-github.md +8 -4
  257. package/plugin/commands/review-pr.md +44 -10
  258. package/plugin/commands/start-leader.md +1 -3
  259. package/plugin/commands/start-worker.md +1 -3
  260. package/plugin/commands/work-on-task.md +22 -3
  261. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  262. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  263. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  264. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  265. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  266. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  267. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  268. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  269. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  270. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  271. package/plugin/pi-skills/todos/SKILL.md +66 -0
  272. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  273. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  274. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  275. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  276. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  277. package/plugin/skills/artifacts/skill.md +71 -0
  278. package/prek.toml +75 -0
  279. package/scripts/check-db-boundary.sh +60 -0
  280. package/scripts/e2e-docker-provider.ts +820 -0
  281. package/scripts/e2e-io-schemas-test.ts +807 -0
  282. package/scripts/e2e-provider-test.ts +220 -0
  283. package/scripts/e2e-workflow-redesign.sh +229 -0
  284. package/scripts/e2e-workflow-test.sh +285 -0
  285. package/scripts/e2e-workflow-test.ts +857 -0
  286. package/scripts/generate-openapi.ts +26 -0
  287. package/scripts/measure-tool-tokens.ts +118 -0
  288. package/scripts/x402-e2e-test.ts +195 -0
  289. package/scripts/x402-test-server.ts +236 -0
  290. package/scripts/x402-testnet-e2e.ts +668 -0
  291. package/slack-manifest.json +17 -0
  292. package/src/agentmail/app.ts +65 -0
  293. package/src/agentmail/handlers.ts +207 -0
  294. package/src/agentmail/index.ts +9 -0
  295. package/src/agentmail/types.ts +51 -0
  296. package/src/artifact-sdk/browser-sdk.ts +30 -0
  297. package/src/artifact-sdk/index.ts +2 -0
  298. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  299. package/src/artifact-sdk/port.ts +12 -0
  300. package/src/artifact-sdk/server.ts +156 -0
  301. package/src/artifact-sdk/tunnel.ts +19 -0
  302. package/src/be/chunking.ts +193 -0
  303. package/src/be/db-queries/oauth.ts +90 -0
  304. package/src/be/db-queries/tracker.ts +182 -0
  305. package/src/be/db.ts +2729 -770
  306. package/src/be/embedding.ts +80 -0
  307. package/src/be/migrations/001_initial.sql +409 -0
  308. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  309. package/src/be/migrations/003_workflows.sql +51 -0
  310. package/src/be/migrations/004_workflow_source.sql +81 -0
  311. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  312. package/src/be/migrations/006_vcs_provider.sql +94 -0
  313. package/src/be/migrations/007_task_dir.sql +2 -0
  314. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  315. package/src/be/migrations/009_tracker_integration.sql +144 -0
  316. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  317. package/src/be/migrations/011_step_next_port.sql +1 -0
  318. package/src/be/migrations/012_trigger_schema.sql +1 -0
  319. package/src/be/migrations/013_task_output_schema.sql +2 -0
  320. package/src/be/migrations/runner.ts +188 -0
  321. package/src/cli.tsx +231 -299
  322. package/src/commands/artifact.ts +241 -0
  323. package/src/commands/onboard/compose-generator.ts +169 -0
  324. package/src/commands/onboard/env-generator.ts +79 -0
  325. package/src/commands/onboard/manifest.ts +37 -0
  326. package/src/commands/onboard/presets.ts +85 -0
  327. package/src/commands/onboard/service-names.ts +47 -0
  328. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  329. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  330. package/src/commands/onboard/steps/generate.tsx +154 -0
  331. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  332. package/src/commands/onboard/steps/harness.tsx +21 -0
  333. package/src/commands/onboard/steps/health-check.tsx +171 -0
  334. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  335. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  336. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  337. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  338. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  339. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  340. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  341. package/src/commands/onboard/steps/post-task.tsx +103 -0
  342. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  343. package/src/commands/onboard/steps/review.tsx +82 -0
  344. package/src/commands/onboard/steps/start.tsx +97 -0
  345. package/src/commands/onboard/templates.ts +34 -0
  346. package/src/commands/onboard/types.ts +259 -0
  347. package/src/commands/onboard.tsx +425 -0
  348. package/src/commands/runner.ts +1376 -559
  349. package/src/commands/setup.tsx +23 -38
  350. package/src/commands/shared/client-config.ts +41 -0
  351. package/src/github/app.ts +8 -0
  352. package/src/github/handlers.ts +93 -75
  353. package/src/github/index.ts +1 -0
  354. package/src/github/types.ts +1 -0
  355. package/src/gitlab/auth.ts +63 -0
  356. package/src/gitlab/handlers.ts +327 -0
  357. package/src/gitlab/index.ts +19 -0
  358. package/src/gitlab/reactions.ts +104 -0
  359. package/src/gitlab/types.ts +130 -0
  360. package/src/heartbeat/heartbeat.ts +425 -0
  361. package/src/heartbeat/index.ts +1 -0
  362. package/src/hooks/hook.ts +555 -4
  363. package/src/hooks/tool-loop-detection.test.ts +158 -0
  364. package/src/hooks/tool-loop-detection.ts +167 -0
  365. package/src/http/active-sessions.ts +172 -0
  366. package/src/http/agents.ts +328 -0
  367. package/src/http/config.ts +191 -0
  368. package/src/http/core.ts +309 -0
  369. package/src/http/db-query.ts +91 -0
  370. package/src/http/ecosystem.ts +63 -0
  371. package/src/http/epics.ts +460 -0
  372. package/src/http/index.ts +213 -0
  373. package/src/http/mcp.ts +77 -0
  374. package/src/http/memory.ts +168 -0
  375. package/src/http/openapi.ts +109 -0
  376. package/src/http/poll.ts +178 -0
  377. package/src/http/repos.ts +195 -0
  378. package/src/http/route-def.ts +123 -0
  379. package/src/http/schedules.ts +391 -0
  380. package/src/http/session-data.ts +241 -0
  381. package/src/http/stats.ts +174 -0
  382. package/src/http/tasks.ts +468 -0
  383. package/src/http/trackers/index.ts +10 -0
  384. package/src/http/trackers/linear.ts +187 -0
  385. package/src/http/types.ts +12 -0
  386. package/src/http/utils.ts +87 -0
  387. package/src/http/webhooks.ts +432 -0
  388. package/src/http/workflows.ts +522 -0
  389. package/src/http.ts +1 -1890
  390. package/src/linear/README.md +65 -0
  391. package/src/linear/app.ts +48 -0
  392. package/src/linear/client.ts +18 -0
  393. package/src/linear/index.ts +1 -0
  394. package/src/linear/oauth.ts +35 -0
  395. package/src/linear/outbound.ts +212 -0
  396. package/src/linear/sync.ts +543 -0
  397. package/src/linear/types.ts +7 -0
  398. package/src/linear/webhook.ts +104 -0
  399. package/src/oauth/README.md +66 -0
  400. package/src/oauth/index.ts +6 -0
  401. package/src/oauth/wrapper.ts +204 -0
  402. package/src/prompts/base-prompt.ts +366 -24
  403. package/src/prompts/defaults.ts +196 -0
  404. package/src/providers/claude-adapter.ts +429 -0
  405. package/src/providers/index.ts +24 -0
  406. package/src/providers/pi-mono-adapter.ts +442 -0
  407. package/src/providers/pi-mono-extension.ts +620 -0
  408. package/src/providers/pi-mono-mcp-client.ts +124 -0
  409. package/src/providers/types.ts +75 -0
  410. package/src/scheduler/scheduler.test.ts +2 -0
  411. package/src/scheduler/scheduler.ts +186 -29
  412. package/src/server.ts +82 -6
  413. package/src/slack/HEURISTICS.md +105 -0
  414. package/src/slack/actions.ts +133 -0
  415. package/src/slack/app.ts +7 -0
  416. package/src/slack/assistant.ts +115 -0
  417. package/src/slack/blocks.ts +233 -0
  418. package/src/slack/commands.ts +31 -17
  419. package/src/slack/files.ts +1 -1
  420. package/src/slack/handlers.test.ts +114 -1
  421. package/src/slack/handlers.ts +212 -52
  422. package/src/slack/responses.ts +120 -67
  423. package/src/slack/router.ts +17 -99
  424. package/src/slack/thread-buffer.ts +213 -0
  425. package/src/slack/watcher.ts +119 -4
  426. package/src/tests/agent-activity.test.ts +247 -0
  427. package/src/tests/agentmail-filters.test.ts +97 -0
  428. package/src/tests/artifact-sdk.test.ts +800 -0
  429. package/src/tests/base-prompt.test.ts +264 -0
  430. package/src/tests/build-pi-skills.test.ts +127 -0
  431. package/src/tests/claude-adapter.test.ts +126 -0
  432. package/src/tests/context-versioning.test.ts +425 -0
  433. package/src/tests/db-queries-oauth.test.ts +197 -0
  434. package/src/tests/db-queries-tracker.test.ts +230 -0
  435. package/src/tests/epics.test.ts +3 -3
  436. package/src/tests/error-tracker.test.ts +368 -0
  437. package/src/tests/fetch-resolved-env.test.ts +167 -0
  438. package/src/tests/generate-default-claude-md.test.ts +9 -1
  439. package/src/tests/generate-identity-templates.test.ts +124 -0
  440. package/src/tests/gitlab-auth.test.ts +109 -0
  441. package/src/tests/gitlab-handlers.test.ts +691 -0
  442. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  443. package/src/tests/heartbeat.test.ts +363 -0
  444. package/src/tests/http-api-integration.test.ts +1698 -0
  445. package/src/tests/linear-outbound-sync.test.ts +200 -0
  446. package/src/tests/linear-webhook.test.ts +402 -0
  447. package/src/tests/match-route.test.ts +187 -0
  448. package/src/tests/memory.test.ts +737 -0
  449. package/src/tests/migration-runner-regressions.test.ts +86 -0
  450. package/src/tests/model-control.test.ts +338 -0
  451. package/src/tests/oauth-wrapper.test.ts +147 -0
  452. package/src/tests/onboard-compose.test.ts +138 -0
  453. package/src/tests/onboard-env.test.ts +174 -0
  454. package/src/tests/onboard-manifest.test.ts +137 -0
  455. package/src/tests/pi-mono-adapter.test.ts +234 -0
  456. package/src/tests/progress-dedup.test.ts +98 -0
  457. package/src/tests/provider-adapter.test.ts +122 -0
  458. package/src/tests/provider-command-format.test.ts +98 -0
  459. package/src/tests/reload-config.test.ts +170 -0
  460. package/src/tests/runner-polling-api.test.ts +25 -20
  461. package/src/tests/scheduled-tasks.test.ts +104 -0
  462. package/src/tests/scheduler-backoff.test.ts +166 -0
  463. package/src/tests/self-improvement.test.ts +540 -0
  464. package/src/tests/session-attach.test.ts +536 -0
  465. package/src/tests/session-costs.test.ts +267 -1
  466. package/src/tests/slack-actions.test.ts +133 -0
  467. package/src/tests/slack-assistant.test.ts +136 -0
  468. package/src/tests/slack-blocks.test.ts +246 -0
  469. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  470. package/src/tests/slack-queue-offline.test.ts +174 -0
  471. package/src/tests/slack-router.test.ts +181 -0
  472. package/src/tests/slack-thread-buffer.test.ts +305 -0
  473. package/src/tests/slack-thread-followups.test.ts +298 -0
  474. package/src/tests/slack-watcher.test.ts +101 -0
  475. package/src/tests/structured-output.test.ts +311 -0
  476. package/src/tests/swarm-repos.test.ts +198 -0
  477. package/src/tests/task-cancellation.test.ts +6 -4
  478. package/src/tests/task-working-dir.test.ts +176 -0
  479. package/src/tests/template-fetch.test.ts +490 -0
  480. package/src/tests/tool-annotations.test.ts +371 -0
  481. package/src/tests/tracker-tools.test.ts +184 -0
  482. package/src/tests/update-profile-api.test.ts +143 -3
  483. package/src/tests/validation-adapters.test.ts +86 -0
  484. package/src/tests/vcs-provider.test.ts +27 -0
  485. package/src/tests/workflow-agent-task.test.ts +196 -0
  486. package/src/tests/workflow-async-v2.test.ts +386 -0
  487. package/src/tests/workflow-convergence.test.ts +541 -0
  488. package/src/tests/workflow-definition-validation.test.ts +290 -0
  489. package/src/tests/workflow-engine-v2.test.ts +691 -0
  490. package/src/tests/workflow-executors.test.ts +736 -0
  491. package/src/tests/workflow-http-v2.test.ts +599 -0
  492. package/src/tests/workflow-integration-io.test.ts +902 -0
  493. package/src/tests/workflow-io-schemas.test.ts +624 -0
  494. package/src/tests/workflow-registry.test.ts +592 -0
  495. package/src/tests/workflow-retry-v2.test.ts +401 -0
  496. package/src/tests/workflow-retry-validation.test.ts +282 -0
  497. package/src/tests/workflow-template.test.ts +288 -0
  498. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  499. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  500. package/src/tests/workflow-versions.test.ts +208 -0
  501. package/src/tests/x402-client.test.ts +117 -0
  502. package/src/tests/x402-config.test.ts +182 -0
  503. package/src/tests/x402-spending-tracker.test.ts +185 -0
  504. package/src/tools/cancel-task.ts +2 -0
  505. package/src/tools/context-diff.ts +171 -0
  506. package/src/tools/context-history.ts +138 -0
  507. package/src/tools/create-channel.ts +1 -0
  508. package/src/tools/db-query.ts +78 -0
  509. package/src/tools/delete-channel.ts +132 -0
  510. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  511. package/src/tools/epics/create-epic.ts +3 -2
  512. package/src/tools/epics/delete-epic.ts +2 -0
  513. package/src/tools/epics/get-epic-details.ts +2 -0
  514. package/src/tools/epics/list-epics.ts +2 -0
  515. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  516. package/src/tools/epics/update-epic.ts +7 -4
  517. package/src/tools/get-swarm.ts +2 -0
  518. package/src/tools/get-task-details.ts +2 -0
  519. package/src/tools/get-tasks.ts +27 -1
  520. package/src/tools/inject-learning.ts +106 -0
  521. package/src/tools/join-swarm.ts +17 -7
  522. package/src/tools/list-channels.ts +2 -0
  523. package/src/tools/list-services.ts +2 -0
  524. package/src/tools/memory-get.ts +56 -0
  525. package/src/tools/memory-search.ts +131 -0
  526. package/src/tools/my-agent-info.ts +2 -0
  527. package/src/tools/poll-task.ts +2 -20
  528. package/src/tools/post-message.ts +1 -0
  529. package/src/tools/read-messages.ts +2 -0
  530. package/src/tools/register-agentmail-inbox.ts +166 -0
  531. package/src/tools/register-service.ts +2 -0
  532. package/src/tools/schedules/create-schedule.ts +134 -24
  533. package/src/tools/schedules/delete-schedule.ts +2 -0
  534. package/src/tools/schedules/list-schedules.ts +20 -4
  535. package/src/tools/schedules/run-schedule-now.ts +1 -0
  536. package/src/tools/schedules/update-schedule.ts +49 -17
  537. package/src/tools/send-task.ts +132 -10
  538. package/src/tools/slack-download-file.ts +4 -2
  539. package/src/tools/slack-list-channels.ts +2 -0
  540. package/src/tools/slack-post.ts +2 -0
  541. package/src/tools/slack-read.ts +2 -0
  542. package/src/tools/slack-reply.ts +2 -0
  543. package/src/tools/slack-upload-file.ts +2 -0
  544. package/src/tools/store-progress.ts +187 -4
  545. package/src/tools/swarm-config/delete-config.ts +87 -0
  546. package/src/tools/swarm-config/get-config.ts +108 -0
  547. package/src/tools/swarm-config/index.ts +4 -0
  548. package/src/tools/swarm-config/list-config.ts +99 -0
  549. package/src/tools/swarm-config/set-config.ts +118 -0
  550. package/src/tools/task-action.ts +30 -5
  551. package/src/tools/task-dedup.ts +97 -0
  552. package/src/tools/tool-config.ts +117 -0
  553. package/src/tools/tracker/index.ts +6 -0
  554. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  555. package/src/tools/tracker/tracker-link-task.ts +64 -0
  556. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  557. package/src/tools/tracker/tracker-status.ts +56 -0
  558. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  559. package/src/tools/tracker/tracker-unlink.ts +41 -0
  560. package/src/tools/unregister-service.ts +2 -0
  561. package/src/tools/update-profile.ts +93 -10
  562. package/src/tools/update-service-status.ts +2 -0
  563. package/src/tools/utils.ts +10 -1
  564. package/src/tools/workflows/create-workflow.ts +111 -0
  565. package/src/tools/workflows/delete-workflow.ts +42 -0
  566. package/src/tools/workflows/get-workflow-run.ts +59 -0
  567. package/src/tools/workflows/get-workflow.ts +53 -0
  568. package/src/tools/workflows/index.ts +9 -0
  569. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  570. package/src/tools/workflows/list-workflows.ts +42 -0
  571. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  572. package/src/tools/workflows/trigger-workflow.ts +96 -0
  573. package/src/tools/workflows/update-workflow.ts +118 -0
  574. package/src/tracker/types.ts +51 -0
  575. package/src/types.ts +477 -14
  576. package/src/utils/credentials.test.ts +156 -0
  577. package/src/utils/credentials.ts +50 -0
  578. package/src/utils/error-tracker.ts +190 -0
  579. package/src/vcs/index.ts +15 -0
  580. package/src/vcs/types.ts +5 -0
  581. package/src/workflows/checkpoint.ts +121 -0
  582. package/src/workflows/cooldown.ts +28 -0
  583. package/src/workflows/definition.ts +217 -0
  584. package/src/workflows/engine.ts +554 -0
  585. package/src/workflows/event-bus.ts +29 -0
  586. package/src/workflows/executors/agent-task.ts +92 -0
  587. package/src/workflows/executors/base.ts +86 -0
  588. package/src/workflows/executors/code-match.ts +88 -0
  589. package/src/workflows/executors/index.ts +16 -0
  590. package/src/workflows/executors/notify.ts +93 -0
  591. package/src/workflows/executors/property-match.ts +104 -0
  592. package/src/workflows/executors/raw-llm.ts +83 -0
  593. package/src/workflows/executors/registry.ts +76 -0
  594. package/src/workflows/executors/script.ts +103 -0
  595. package/src/workflows/executors/validate.ts +215 -0
  596. package/src/workflows/executors/vcs.ts +58 -0
  597. package/src/workflows/index.ts +61 -0
  598. package/src/workflows/input.ts +46 -0
  599. package/src/workflows/json-schema-validator.ts +118 -0
  600. package/src/workflows/recovery.ts +139 -0
  601. package/src/workflows/resume.ts +143 -0
  602. package/src/workflows/retry-poller.ts +216 -0
  603. package/src/workflows/template.ts +74 -0
  604. package/src/workflows/templates.ts +86 -0
  605. package/src/workflows/triggers.ts +95 -0
  606. package/src/workflows/validation.ts +104 -0
  607. package/src/workflows/version.ts +42 -0
  608. package/src/x402/cli.ts +140 -0
  609. package/src/x402/client.ts +192 -0
  610. package/src/x402/config.ts +131 -0
  611. package/src/x402/index.ts +37 -0
  612. package/src/x402/openfort-signer.ts +83 -0
  613. package/src/x402/spending-tracker.ts +109 -0
  614. package/templates/community/.gitkeep +0 -0
  615. package/templates/official/coder/CLAUDE.md +49 -0
  616. package/templates/official/coder/IDENTITY.md +28 -0
  617. package/templates/official/coder/SOUL.md +43 -0
  618. package/templates/official/coder/TOOLS.md +40 -0
  619. package/templates/official/coder/config.json +23 -0
  620. package/templates/official/coder/start-up.sh +23 -0
  621. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  622. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  623. package/templates/official/content-reviewer/SOUL.md +44 -0
  624. package/templates/official/content-reviewer/TOOLS.md +37 -0
  625. package/templates/official/content-reviewer/config.json +23 -0
  626. package/templates/official/content-reviewer/start-up.sh +23 -0
  627. package/templates/official/content-strategist/CLAUDE.md +63 -0
  628. package/templates/official/content-strategist/IDENTITY.md +33 -0
  629. package/templates/official/content-strategist/SOUL.md +48 -0
  630. package/templates/official/content-strategist/TOOLS.md +47 -0
  631. package/templates/official/content-strategist/config.json +23 -0
  632. package/templates/official/content-strategist/start-up.sh +23 -0
  633. package/templates/official/content-writer/CLAUDE.md +72 -0
  634. package/templates/official/content-writer/IDENTITY.md +30 -0
  635. package/templates/official/content-writer/SOUL.md +46 -0
  636. package/templates/official/content-writer/TOOLS.md +44 -0
  637. package/templates/official/content-writer/config.json +23 -0
  638. package/templates/official/content-writer/start-up.sh +23 -0
  639. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  640. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  641. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  642. package/templates/official/forward-deployed-engineer/config.json +21 -0
  643. package/templates/official/lead/CLAUDE.md +33 -0
  644. package/templates/official/lead/IDENTITY.md +36 -0
  645. package/templates/official/lead/SOUL.md +51 -0
  646. package/templates/official/lead/config.json +22 -0
  647. package/templates/official/researcher/CLAUDE.md +46 -0
  648. package/templates/official/researcher/IDENTITY.md +28 -0
  649. package/templates/official/researcher/SOUL.md +43 -0
  650. package/templates/official/researcher/config.json +21 -0
  651. package/templates/official/reviewer/CLAUDE.md +63 -0
  652. package/templates/official/reviewer/IDENTITY.md +28 -0
  653. package/templates/official/reviewer/SOUL.md +45 -0
  654. package/templates/official/reviewer/config.json +21 -0
  655. package/templates/official/tester/CLAUDE.md +53 -0
  656. package/templates/official/tester/IDENTITY.md +28 -0
  657. package/templates/official/tester/SOUL.md +55 -0
  658. package/templates/official/tester/config.json +21 -0
  659. package/templates/schema.ts +35 -0
  660. package/templates-ui/README.md +46 -0
  661. package/templates-ui/components.json +17 -0
  662. package/templates-ui/eslint.config.mjs +18 -0
  663. package/templates-ui/next.config.ts +7 -0
  664. package/templates-ui/package.json +35 -0
  665. package/templates-ui/pnpm-lock.yaml +4571 -0
  666. package/templates-ui/postcss.config.mjs +7 -0
  667. package/templates-ui/public/file.svg +1 -0
  668. package/templates-ui/public/globe.svg +1 -0
  669. package/templates-ui/public/logo.png +0 -0
  670. package/templates-ui/public/next.svg +1 -0
  671. package/templates-ui/public/vercel.svg +1 -0
  672. package/templates-ui/public/window.svg +1 -0
  673. package/templates-ui/src/app/[category]/[name]/page.tsx +89 -0
  674. package/templates-ui/src/app/api/templates/[...slug]/route.ts +52 -0
  675. package/templates-ui/src/app/api/templates/route.ts +18 -0
  676. package/templates-ui/src/app/builder/page.tsx +37 -0
  677. package/templates-ui/src/app/globals.css +94 -0
  678. package/templates-ui/src/app/layout.tsx +79 -0
  679. package/templates-ui/src/app/page.tsx +38 -0
  680. package/templates-ui/src/app/robots.ts +11 -0
  681. package/templates-ui/src/app/sitemap.ts +31 -0
  682. package/templates-ui/src/components/compose-builder.tsx +442 -0
  683. package/templates-ui/src/components/compose-preview.tsx +117 -0
  684. package/templates-ui/src/components/file-preview.tsx +77 -0
  685. package/templates-ui/src/components/footer.tsx +40 -0
  686. package/templates-ui/src/components/header.tsx +41 -0
  687. package/templates-ui/src/components/template-card.tsx +87 -0
  688. package/templates-ui/src/components/template-detail.tsx +125 -0
  689. package/templates-ui/src/components/template-gallery.tsx +263 -0
  690. package/templates-ui/src/components/ui/badge.tsx +36 -0
  691. package/templates-ui/src/components/ui/button.tsx +57 -0
  692. package/templates-ui/src/components/ui/card.tsx +76 -0
  693. package/templates-ui/src/components/ui/separator.tsx +31 -0
  694. package/templates-ui/src/components/ui/tooltip.tsx +32 -0
  695. package/templates-ui/src/lib/compose-generator.ts +241 -0
  696. package/templates-ui/src/lib/templates.ts +137 -0
  697. package/templates-ui/src/lib/utils.ts +6 -0
  698. package/templates-ui/tsconfig.json +34 -0
  699. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +679 -0
  700. package/thoughts/research/2026-02-28-x402-payments-research.md +686 -0
  701. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +282 -0
  702. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +492 -0
  703. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +282 -0
  704. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +328 -0
  705. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +224 -0
  706. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +159 -0
  707. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +337 -0
  708. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +778 -0
  709. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +1269 -0
  710. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +411 -0
  711. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +724 -0
  712. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +443 -0
  713. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +307 -0
  714. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +803 -0
  715. package/thoughts/taras/plans/2026-02-20-env-management.md +538 -0
  716. package/thoughts/taras/plans/2026-02-20-memory-system.md +882 -0
  717. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +806 -0
  718. package/thoughts/taras/plans/2026-02-20-session-attach.md +647 -0
  719. package/thoughts/taras/plans/2026-02-20-worker-identity.md +820 -0
  720. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +768 -0
  721. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +77 -0
  722. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +543 -0
  723. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +373 -0
  724. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +512 -0
  725. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +919 -0
  726. package/thoughts/taras/plans/2026-03-09-templates-registry.md +723 -0
  727. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +371 -0
  728. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +621 -0
  729. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +61 -0
  730. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +488 -0
  731. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +644 -0
  732. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +636 -0
  733. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +444 -0
  734. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +591 -0
  735. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +446 -0
  736. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +987 -0
  737. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +403 -0
  738. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +860 -0
  739. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +899 -0
  740. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +874 -0
  741. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +723 -0
  742. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +390 -0
  743. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +594 -0
  744. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +825 -0
  745. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +393 -0
  746. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +168 -0
  747. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +230 -0
  748. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +445 -0
  749. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +375 -0
  750. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +869 -0
  751. package/thoughts/taras/research/2026-03-09-templates-registry.md +373 -0
  752. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +223 -0
  753. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +339 -0
  754. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +181 -0
  755. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +437 -0
  756. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +258 -0
  757. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +335 -0
  758. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +670 -0
  759. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +54 -0
  760. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +558 -0
  761. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +526 -0
  762. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +797 -0
  763. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +563 -0
  764. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +486 -0
  765. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +469 -0
  766. package/tsconfig.json +1 -1
  767. package/FAQ.md +0 -19
  768. package/src/tests/get-inbox-message.test.ts +0 -145
  769. package/src/tools/get-inbox-message.ts +0 -89
  770. package/src/tools/inbox-delegate.ts +0 -113
  771. package/ui/CLAUDE.md +0 -49
  772. package/ui/bun.lock +0 -771
  773. package/ui/index.html +0 -22
  774. package/ui/package-lock.json +0 -5290
  775. package/ui/package.json +0 -33
  776. package/ui/pnpm-lock.yaml +0 -3341
  777. package/ui/postcss.config.js +0 -6
  778. package/ui/src/App.tsx +0 -63
  779. package/ui/src/components/ActivityFeed.tsx +0 -440
  780. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  781. package/ui/src/components/AgentsPanel.tsx +0 -815
  782. package/ui/src/components/ChatPanel.tsx +0 -1920
  783. package/ui/src/components/ConfigModal.tsx +0 -253
  784. package/ui/src/components/Dashboard.tsx +0 -832
  785. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  786. package/ui/src/components/EpicDetailPage.tsx +0 -741
  787. package/ui/src/components/EpicsPanel.tsx +0 -566
  788. package/ui/src/components/Header.tsx +0 -160
  789. package/ui/src/components/JsonViewer.tsx +0 -171
  790. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  791. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  792. package/ui/src/components/ServicesPanel.tsx +0 -622
  793. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  794. package/ui/src/components/StatsBar.tsx +0 -321
  795. package/ui/src/components/StatusBadge.tsx +0 -168
  796. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  797. package/ui/src/components/TasksPanel.tsx +0 -614
  798. package/ui/src/components/UsageCharts.tsx +0 -216
  799. package/ui/src/components/UsageTab.tsx +0 -394
  800. package/ui/src/hooks/queries.ts +0 -353
  801. package/ui/src/index.css +0 -257
  802. package/ui/src/lib/api.ts +0 -268
  803. package/ui/src/lib/config.ts +0 -35
  804. package/ui/src/lib/contentPreview.ts +0 -208
  805. package/ui/src/lib/theme.ts +0 -214
  806. package/ui/src/main.tsx +0 -28
  807. package/ui/src/vite-env.d.ts +0 -1
  808. package/ui/tailwind.config.js +0 -37
  809. package/ui/vite.config.ts +0 -35
  810. /package/{ui → docs-site}/public/logo.png +0 -0
@@ -0,0 +1,874 @@
1
+ ---
2
+ date: 2026-03-20T12:00:00Z
3
+ topic: "Setup CLI Onboarding (agent-swarm onboard)"
4
+ type: plan
5
+ status: implemented
6
+ source: thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md
7
+ ---
8
+
9
+ # Setup CLI Onboarding (`agent-swarm onboard`) Implementation Plan
10
+
11
+ ## Overview
12
+
13
+ Add an `agent-swarm onboard` command — an interactive TUI wizard that takes a first-time user from zero to a running local swarm. The wizard collects credentials, generates `docker-compose.yml` + `.env`, starts the stack, verifies health, and optionally configures the local client. This is distinct from the existing `setup` command (client-config only); `onboard` handles server-side infrastructure provisioning.
14
+
15
+ **Brainstorm**: `thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md`
16
+
17
+ ## Current State Analysis
18
+
19
+ ### What exists:
20
+ - **`src/commands/setup.tsx`** (~600 lines): Client-only wizard. State machine: `check_dirs → input_token → input_agent_id → updating → done`. Uses `TextInput`, `Spinner` from `@inkjs/ui`. Supports `--dry-run`, `--restore`, `--yes`.
21
+ - **`templates-ui/src/lib/compose-generator.ts`**: Web-based compose generator. Takes a `ComposeConfig` object (services, images, ports, integrations) and produces `docker-compose.yml` + `.env` strings. Reference implementation — we'll rewrite for CLI with real credentials instead of placeholders.
22
+ - **`docker-compose.example.yml`**: Production compose with 7 services (API + lead + 5 workers). Hardcoded agent IDs, template IDs, volumes.
23
+ - **`docker-compose.local.yml`**: Dev compose with 3 services (API + lead + pi-worker). Builds from source.
24
+ - **Template system**: 9 official templates served by registry at `templates.agent-swarm.dev`. Schema in `templates/schema.ts`. Templates define role, capabilities, isLead, files (CLAUDE.md, SOUL.md, IDENTITY.md, TOOLS.md, start-up.sh).
25
+ - **`docker-entrypoint.sh`** (632 lines): Worker boot sequence. Validates auth, mounts volumes, fetches config, configures git, clones repos, runs startup scripts, launches agent binary.
26
+ - **No preset/composition concept exists** in the template system.
27
+
28
+ ### Key Discoveries:
29
+ - `@inkjs/ui` v2.0.0 is installed but only `TextInput` and `Spinner` are used. `Select` and `ConfirmInput` are available but unused — we'll introduce them for the wizard (`src/commands/setup.tsx:3`).
30
+ - The existing setup state machine uses a `useRef<Set>` pattern to prevent duplicate execution of async effects — same pattern needed for onboard (`src/commands/setup.tsx:92`).
31
+ - CLI arg parsing is manual (`src/cli.tsx:39-106`), command routing via switch statement (`src/cli.tsx:545-599`).
32
+ - Compose generator uses line-by-line string building, not templates — straightforward to rewrite (`templates-ui/src/lib/compose-generator.ts:75-183`).
33
+ - The compose builder web UI defaults to lead + 2 coders (`templates-ui/src/components/compose-builder.tsx:54-66`).
34
+
35
+ ## Desired End State
36
+
37
+ Running `agent-swarm onboard` in any directory walks the user through:
38
+ 1. Choosing a swarm preset (Dev team, Content team, Research team, Solo, Custom)
39
+ 2. Selecting a harness (Claude or Pi) with guided credential collection
40
+ 3. Optionally configuring integrations (GitHub, Slack, GitLab, Sentry)
41
+ 4. Generating `docker-compose.yml`, `.env`, and `.agent-swarm/config.json`
42
+ 5. Starting the Docker stack and verifying health + agent registration
43
+ 6. Optionally connecting the local client and/or opening the hosted dashboard
44
+
45
+ ### Verification:
46
+ ```bash
47
+ # Fresh directory, full interactive flow
48
+ agent-swarm onboard
49
+ # → Generates files, starts stack, agents register
50
+
51
+ # Non-interactive (CI/scripted)
52
+ API_KEY=xxx CLAUDE_CODE_OAUTH_TOKEN=xxx agent-swarm onboard --yes --preset=dev
53
+ # → Same result, no prompts
54
+
55
+ # Dry run
56
+ agent-swarm onboard --dry-run
57
+ # → Shows what would be generated, no files written
58
+ ```
59
+
60
+ ## Quick Verification Reference
61
+
62
+ Common commands:
63
+ - `bun run lint:fix` — Biome lint + format
64
+ - `bun run tsc:check` — TypeScript type check
65
+ - `bun test` — Unit tests
66
+ - `bun run src/cli.tsx onboard --dry-run` — Test the wizard in dry-run mode
67
+ - `bun run src/cli.tsx onboard --help` — Verify help text
68
+
69
+ Key files to check:
70
+ - `src/commands/onboard.tsx` — Main wizard component (new)
71
+ - `src/commands/onboard/` — Wizard sub-components and utilities (new)
72
+ - `src/cli.tsx` — Command registration
73
+ - `src/commands/setup.tsx` — Existing client-config (reused as sub-step)
74
+
75
+ ## What We're NOT Doing
76
+
77
+ - **Remote/SSH deploy** (v2) — shown as "coming soon" in deploy type selector
78
+ - **Idempotent re-runs** (v2) — `.agent-swarm/config.json` is created for future use but not parsed on re-run yet
79
+ - **Registry-fetched presets** (v2) — presets are hardcoded in CLI for now
80
+ - **Template registry presets endpoint** — no backend changes
81
+ - **Modifying the existing `setup` command** — it stays as-is; `onboard` calls it as a sub-step
82
+ - **Multi-arch Docker images** — ARM/Apple Silicon compatibility is out of scope
83
+ - **Caddy/HTTPS** — no reverse proxy in v1
84
+ - **Pi-mono harness** — Pi requires `OPENROUTER_API_KEY` per worker and a different `HARNESS_PROVIDER` env var, which complicates the compose generator. Pi is shown as "coming soon" in the harness selector (same pattern as remote deploy). Users who need Pi can manually edit the generated `.env` and `docker-compose.yml` after generation.
85
+
86
+ ## Implementation Approach
87
+
88
+ The wizard is a single Ink component (`Onboard`) with a DAG-based state machine (see Phase 1 for the full DAG definition). Each step renders a different UI (`Select`, `TextInput`, `Spinner`, or info screen). Steps that don't apply (e.g., skipped integrations) are resolved by the `nextStep()` function which walks the DAG edges filtered by current state. The state accumulates in a single `OnboardState` object.
89
+
90
+ File generation is a pure function: `OnboardState → { compose: string, env: string, manifest: object }`. This makes it testable without Ink.
91
+
92
+ The command structure:
93
+ ```
94
+ src/commands/onboard.tsx — Main component, state machine, step orchestrator
95
+ src/commands/onboard/
96
+ types.ts — State types, step union, DAG definition, nextStep()
97
+ presets.ts — Hardcoded preset configurations
98
+ compose-generator.ts — docker-compose.yml generator
99
+ env-generator.ts — .env file generator
100
+ manifest.ts — .agent-swarm/config.json generator
101
+ templates.ts — Template registry fetch utility
102
+ steps/ — One component per step (keeps onboard.tsx manageable)
103
+ welcome.tsx — Welcome screen + detect existing setup
104
+ deploy-type.tsx — Local vs Remote selector
105
+ preset.tsx — Preset picker
106
+ custom-templates.tsx — Custom template builder
107
+ harness.tsx — Claude vs Pi selector
108
+ harness-credentials.tsx — OAuth / API key collection
109
+ core-credentials.tsx — Auto-gen API_KEY + Agent UUIDs
110
+ integration-menu.tsx — Integration toggle menu
111
+ integration-github.tsx — GitHub credential flow
112
+ integration-slack.tsx — Slack manifest + token flow
113
+ integration-gitlab.tsx — GitLab credential flow
114
+ integration-sentry.tsx — Sentry credential flow
115
+ review.tsx — Summary + confirm
116
+ generate.tsx — File generation
117
+ prereq-check.tsx — Docker prerequisites
118
+ start.tsx — docker compose up
119
+ health-check.tsx — Health polling + registration
120
+ post-connect.tsx — Connect local client
121
+ post-dashboard.tsx — Open dashboard
122
+ post-task.tsx — Send first task
123
+ src/commands/shared/
124
+ client-config.ts — Extracted from setup.tsx: createDefaultSettingsLocal,
125
+ createDefaultMcpJson, createHooksConfig (shared by
126
+ both setup and onboard)
127
+ ```
128
+
129
+ Each step component receives `state` and an `onNext(partialState)` callback. The main `onboard.tsx` renders the active step and calls `nextStep()` from the DAG to determine transitions. This keeps each file under ~100 lines.
130
+
131
+ ---
132
+
133
+ ## Phase 1: Foundation — Command Shell + State Machine + Welcome
134
+
135
+ ### Overview
136
+ Create the `onboard` command with the state machine skeleton, register it in the CLI, and implement the welcome + deploy type screens. This establishes the framework all subsequent phases build on.
137
+
138
+ ### Changes Required:
139
+
140
+ #### 1. State types and step DAG
141
+ **File**: `src/commands/onboard/types.ts` (new)
142
+ **Changes**:
143
+ - Define `OnboardStep` union type with all steps:
144
+ ```
145
+ "welcome" | "deploy_type" | "preset" | "custom_templates" |
146
+ "harness" | "harness_credentials" | "core_credentials" |
147
+ "integration_menu" | "integration_github" | "integration_slack" |
148
+ "integration_gitlab" | "integration_sentry" |
149
+ "review" | "generate" | "prereq_check" | "start" | "health_check" |
150
+ "post_connect" | "post_dashboard" | "post_task" | "done" | "error"
151
+ ```
152
+ - Define the step transition DAG (each step knows its possible next steps):
153
+ ```
154
+ STEP_DAG: Record<OnboardStep, OnboardStep[]> = {
155
+ welcome: ["deploy_type"],
156
+ deploy_type: ["preset"], // "remote" → error/coming-soon
157
+ preset: ["harness", "custom_templates"], // non-custom → harness, custom → custom_templates
158
+ custom_templates: ["harness"],
159
+ harness: ["harness_credentials"],
160
+ harness_credentials: ["core_credentials"],
161
+ core_credentials: ["integration_menu"],
162
+ integration_menu: ["integration_github", "integration_slack", "integration_gitlab", "integration_sentry", "review"],
163
+ // → first enabled integration, or review if none
164
+ integration_github: ["integration_slack", "integration_gitlab", "integration_sentry", "review"],
165
+ integration_slack: ["integration_gitlab", "integration_sentry", "review"],
166
+ integration_gitlab: ["integration_sentry", "review"],
167
+ integration_sentry: ["review"],
168
+ review: ["generate", "integration_menu"], // "go back" loops to integration_menu
169
+ generate: ["prereq_check"],
170
+ prereq_check: ["start", "done"], // skip start if Docker missing + user chose "files only"
171
+ start: ["health_check"],
172
+ health_check: ["post_connect"],
173
+ post_connect: ["post_dashboard"],
174
+ post_dashboard: ["post_task"],
175
+ post_task: ["done"],
176
+ done: [],
177
+ error: [],
178
+ }
179
+ ```
180
+ - Implement `nextStep(current: OnboardStep, state: OnboardState): OnboardStep` helper that resolves the DAG based on current state (e.g., skips disabled integrations, skips post-deploy steps the user declined). Each transition consults the DAG edges and filters by state to pick the correct next step.
181
+ - The DAG is the source of truth for all transitions — no hardcoded step names in the main component. The `nextStep()` function encapsulates all branching logic.
182
+ - Define `OnboardState` interface with all accumulated fields:
183
+ - `step: OnboardStep`
184
+ - `deployType: "local" | "remote"`
185
+ - `presetId: string | null` (e.g., "dev", "content", "research", "solo", "custom")
186
+ - `services: ServiceEntry[]` (resolved from preset or custom selection)
187
+ - `harness: "claude" | "pi"`
188
+ - `claudeOAuthToken: string`
189
+ - `apiKey: string` (auto-generated or user-provided)
190
+ - `agentIds: Record<string, string>` (service name → UUID)
191
+ - `integrations: { github: boolean, slack: boolean, gitlab: boolean, sentry: boolean }`
192
+ - `githubToken: string`, `githubEmail: string`, `githubName: string`
193
+ - `slackBotToken: string`, `slackAppToken: string`
194
+ - `gitlabToken: string`, `gitlabEmail: string`
195
+ - `sentryToken: string`, `sentryOrg: string`
196
+ - `outputDir: string` (defaults to cwd)
197
+ - `error: string | null`
198
+ - `logs: string[]`
199
+ - Define `OnboardProps` interface: `{ dryRun?: boolean, yes?: boolean, preset?: string }`
200
+
201
+ #### 2. Preset definitions
202
+ **File**: `src/commands/onboard/presets.ts` (new)
203
+ **Changes**:
204
+ - Define `Preset` interface: `{ id: string, name: string, description: string, services: ServiceEntry[] }`
205
+ - Define `ServiceEntry` (reuse concept from compose-generator): `{ template: string, displayName: string, count: number, role: string, isLead?: boolean }`
206
+ - Hardcode 5 presets:
207
+ - **dev**: "Development Team" — 1 lead + 2 coders. "Build software with a lead coordinator and two coding agents."
208
+ - **content**: "Content Team" — 1 lead + content-writer + content-reviewer + content-strategist. "Content creation pipeline with writing, review, and strategy."
209
+ - **research**: "Research Team" — 1 lead + researcher + reviewer. "Research and analysis with peer review."
210
+ - **solo**: "Solo Agent" — 1 coder (no lead). "Single agent, simplest setup."
211
+ - **custom**: "Custom" — empty services, user picks templates. "Choose your own templates."
212
+
213
+ #### 3. Main onboard component (skeleton)
214
+ **File**: `src/commands/onboard.tsx` (new)
215
+ **Changes**:
216
+ - Export `Onboard` component accepting `OnboardProps`
217
+ - Implement state machine with `useState<OnboardState>` and `useRef<Set<OnboardStep>>` for dedup (same pattern as `setup.tsx`)
218
+ - Implement `welcome` step: ASCII banner + detect `.agent-swarm/config.json` existence. If exists, show "Existing setup detected" message (for now, just inform — no re-run logic yet). Transition to `deploy_type`.
219
+ - Implement `deploy_type` step: `Select` with two options:
220
+ - "Local (Docker Compose)" — transitions to `preset`
221
+ - "Remote (SSH) — Coming soon" — disabled/grayed, shows "Remote deploy will be available in a future release"
222
+ - Implement `error` and `done` step rendering (reuse pattern from setup.tsx)
223
+ - Implement `addLog` helper with dry-run prefix support
224
+ - Implement exit timer on done/error (500ms, same as setup.tsx)
225
+ - All other steps render a placeholder: `<Text dimColor>Step "{step}" not implemented yet</Text>`
226
+
227
+ #### 4. Register command in CLI
228
+ **File**: `src/cli.tsx`
229
+ **Changes**:
230
+ - Add import: `import { Onboard } from "./commands/onboard.tsx"`
231
+ - Add to `parseArgs`: handle `--preset` flag (string value)
232
+ - Add to switch statement: `case "onboard": return <Onboard dryRun={dryRun} yes={yes} preset={preset} />`
233
+ - Add to help text: `onboard` command with description "Set up a new swarm from scratch (local Docker Compose)"
234
+
235
+ ### Success Criteria:
236
+
237
+ #### Automated Verification:
238
+ - [ ] TypeScript compiles: `bun run tsc:check`
239
+ - [ ] Lint passes: `bun run lint:fix`
240
+ - [ ] Command is reachable: `bun run src/cli.tsx onboard --help` shows help
241
+ - [ ] Dry run starts: `bun run src/cli.tsx onboard --dry-run` shows welcome screen
242
+
243
+ #### Manual Verification:
244
+ - [ ] Running `bun run src/cli.tsx onboard` shows the ASCII banner and deploy type selector
245
+ - [ ] Selecting "Local" transitions to the preset step (shows placeholder)
246
+ - [ ] Selecting "Remote" shows "coming soon" message
247
+ - [ ] `Ctrl+C` cleanly exits the wizard
248
+
249
+ **Implementation Note**: Pause after this phase for manual verification of the wizard shell.
250
+
251
+ ---
252
+
253
+ ## Phase 2: Preset Selection + Template Integration
254
+
255
+ ### Overview
256
+ Implement the preset selection screen and the custom template picker. Users choose a team composition, which resolves to a list of services with template IDs.
257
+
258
+ ### Changes Required:
259
+
260
+ #### 1. Preset selection step
261
+ **File**: `src/commands/onboard.tsx`
262
+ **Changes**:
263
+ - Implement `preset` step: Render `Select` with the 5 preset options from `presets.ts`
264
+ - Each option shows: name + description + agent count summary (e.g., "1 lead + 2 coders")
265
+ - On selection:
266
+ - If preset is not "custom": resolve services from preset, store in state, transition to `harness`
267
+ - If preset is "custom": transition to `custom_templates`
268
+
269
+ #### 2. Custom template picker
270
+ **File**: `src/commands/onboard.tsx`
271
+ **Changes**:
272
+ - Implement `custom_templates` step as a multi-phase sub-flow:
273
+ 1. Fetch template list from registry: `GET https://templates.agent-swarm.dev/api/templates` (hardcoded default, overridable via `TEMPLATE_REGISTRY_URL` env var)
274
+ 2. Show available templates grouped by role (lead vs worker)
275
+ 3. Let user add services one by one:
276
+ - Select for template choice
277
+ - TextInput for count (default 1)
278
+ - "Add another" / "Done" selector
279
+ 4. Require at least 1 service. Warn if no lead is selected.
280
+ 5. On "Done": store services in state, transition to `harness`
281
+ - For `--yes` mode: skip custom_templates entirely, require `--preset` flag
282
+
283
+ #### 3. Template registry fetch utility
284
+ **File**: `src/commands/onboard/templates.ts` (new)
285
+ **Changes**:
286
+ - `fetchTemplateList(registryUrl: string): Promise<TemplateConfig[]>` — fetches available templates from the registry API
287
+ - Import `TemplateConfig` from `templates/schema.ts`
288
+ - Handle network errors gracefully (show error, allow retry or fallback to preset)
289
+
290
+ ### Success Criteria:
291
+
292
+ #### Automated Verification:
293
+ - [ ] TypeScript compiles: `bun run tsc:check`
294
+ - [ ] Lint passes: `bun run lint:fix`
295
+
296
+ #### Manual Verification:
297
+ - [ ] Running wizard shows 5 preset options with descriptions
298
+ - [ ] Selecting "Development Team" resolves to correct services (1 lead + 2 coders) and advances
299
+ - [ ] Selecting "Solo Agent" resolves to 1 coder (no lead) and advances
300
+ - [ ] Selecting "Custom" enters the template picker flow
301
+ - [ ] Custom picker fetches templates from registry and displays them
302
+ - [ ] Adding multiple services works, count adjustment works
303
+ - [ ] "Done" with no services shows a validation error
304
+
305
+ **Implementation Note**: Pause for manual verification. Template registry must be reachable for custom mode testing.
306
+
307
+ ---
308
+
309
+ ## Phase 3: Harness Selection + Credential Collection
310
+
311
+ ### Overview
312
+ Implement the harness (Claude vs Pi) selector and credential collection steps. Auto-generate API_KEY and Agent UUIDs. Guide users through OAuth token acquisition.
313
+
314
+ ### Changes Required:
315
+
316
+ #### 1. Harness selection step
317
+ **File**: `src/commands/onboard/steps/harness.tsx` (new)
318
+ **Changes**:
319
+ - Implement `harness` step: `Select` with two options:
320
+ - "Claude Code (Recommended)" — description: "Uses Claude CLI with OAuth token."
321
+ - "Pi-mono — Coming soon" — disabled/grayed. Pi compose support is deferred to v2 (same pattern as remote deploy).
322
+ - On selection: store `harness: "claude"` in state, transition to `harness_credentials`
323
+ - Note: Pi is shown but not selectable in v1 since the compose generator only supports Claude env vars. When Pi is enabled in v2, this step will also branch the credential flow.
324
+
325
+ #### 2. Harness-specific credential step (Claude only for v1)
326
+ **File**: `src/commands/onboard/steps/harness-credentials.tsx` (new)
327
+ **Changes**:
328
+ - Implement `harness_credentials` step for Claude:
329
+ - Show two sub-options via Select:
330
+ 1. "Run `claude setup-token` (recommended)" — spawn `claude setup-token` as a child process, capture the token from stdout, store in state. If Claude CLI is not found, show error with install instructions and fall back to manual paste.
331
+ 2. "Paste token manually" — show TextInput for `CLAUDE_CODE_OAUTH_TOKEN`
332
+ - After credential collected: transition to `core_credentials`
333
+
334
+ #### 3. Core credential generation step
335
+ **File**: `src/commands/onboard.tsx`
336
+ **Changes**:
337
+ - Implement `core_credentials` step (auto, no user input):
338
+ - Auto-generate `API_KEY` using `crypto.randomBytes(32).toString('hex')` (or shorter, user-friendly string)
339
+ - Auto-generate `AGENT_ID` UUIDs for each service using `crypto.randomUUID()`
340
+ - Store both in state
341
+ - Show summary: "Generated API key: `abc...xyz`" and "Generated {N} agent IDs"
342
+ - Brief pause (1s with Spinner), then transition to `integration_menu`
343
+ - For `--yes` mode: read `API_KEY` and `CLAUDE_CODE_OAUTH_TOKEN` from env vars, auto-generate agent IDs, skip to `integration_menu`
344
+
345
+ ### Success Criteria:
346
+
347
+ #### Automated Verification:
348
+ - [ ] TypeScript compiles: `bun run tsc:check`
349
+ - [ ] Lint passes: `bun run lint:fix`
350
+
351
+ #### Manual Verification:
352
+ - [ ] Harness selector shows Claude and Pi options
353
+ - [ ] Selecting Claude shows OAuth sub-options
354
+ - [ ] "Run `claude setup-token`" spawns the command (or errors gracefully if Claude CLI not installed)
355
+ - [ ] "Paste manually" shows TextInput, accepts a token
356
+ - [ ] Core credentials step auto-generates API key and agent IDs, shows summary
357
+ - [ ] Selecting Pi shows OpenRouter / Anthropic sub-options with TextInput
358
+
359
+ **Implementation Note**: Pause for manual verification. Testing `claude setup-token` requires Claude CLI installed.
360
+
361
+ ---
362
+
363
+ ## Phase 4: Integration Setup
364
+
365
+ ### Overview
366
+ Implement optional integration configuration for GitHub, Slack, GitLab, and Sentry. Each integration has a guided flow with explanations and can be skipped.
367
+
368
+ ### Changes Required:
369
+
370
+ #### 1. Integration menu step
371
+ **File**: `src/commands/onboard.tsx`
372
+ **Changes**:
373
+ - Implement `integration_menu` step: Multi-select or sequential yes/no for each integration:
374
+ - "GitHub — Push code, create PRs, manage repos"
375
+ - "Slack — Team notifications, task updates, chat"
376
+ - "GitLab — Alternative to GitHub for code hosting"
377
+ - "Sentry — Error tracking and monitoring"
378
+ - Use Select to toggle each on/off, with a "Continue" option to proceed
379
+ - Store selections in `state.integrations`
380
+ - Transition to the first enabled integration step (or `review` if none selected)
381
+
382
+ #### 2. GitHub integration step
383
+ **File**: `src/commands/onboard.tsx`
384
+ **Changes**:
385
+ - Implement `integration_github` step:
386
+ - Show explanatory text: "GitHub integration lets agents push code and create PRs."
387
+ - Show instructions: "Create a Personal Access Token at github.com/settings/tokens with `repo` scope"
388
+ - TextInput for `GITHUB_TOKEN` (required)
389
+ - TextInput for `GITHUB_EMAIL` (required)
390
+ - TextInput for `GITHUB_NAME` (required)
391
+ - Transition to next enabled integration or `review`
392
+
393
+ #### 3. Slack integration step
394
+ **File**: `src/commands/onboard.tsx`
395
+ **Changes**:
396
+ - Implement `integration_slack` step:
397
+ - Show explanatory text: "Slack integration enables notifications and two-way chat with agents."
398
+ - Step 1: "Copy the Slack app manifest to your clipboard" — offer two options:
399
+ - "Copy manifest to clipboard" — read `slack-manifest.json` (embedded inline in the CLI), detect OS and use the appropriate clipboard command (`pbcopy` on macOS, `xclip -selection clipboard` on Linux, `clip.exe` on WSL/Windows). If clipboard fails, fall back to printing the manifest path.
400
+ - "Show manifest URL" — display the raw GitHub URL for the manifest on `main` branch
401
+ - Step 2: "Create a Slack app at api.slack.com/apps → 'From a manifest' → paste"
402
+ - Step 3: "Install the app to your workspace"
403
+ - Step 4: TextInput for `SLACK_BOT_TOKEN` (starts with `xoxb-`)
404
+ - Step 5: TextInput for `SLACK_APP_TOKEN` (starts with `xapp-`)
405
+ - Show "Press Enter when ready" gate between external steps
406
+ - Transition to next enabled integration or `review`
407
+
408
+ #### 4. GitLab and Sentry steps
409
+ **File**: `src/commands/onboard.tsx`
410
+ **Changes**:
411
+ - Implement `integration_gitlab` step:
412
+ - TextInput for `GITLAB_TOKEN` with instructions for Personal Access Token creation
413
+ - TextInput for `GITLAB_EMAIL`
414
+ - Implement `integration_sentry` step:
415
+ - TextInput for `SENTRY_AUTH_TOKEN` with instructions
416
+ - TextInput for `SENTRY_ORG`
417
+ - Each transitions to next enabled integration or `review`
418
+
419
+ ### Success Criteria:
420
+
421
+ #### Automated Verification:
422
+ - [ ] TypeScript compiles: `bun run tsc:check`
423
+ - [ ] Lint passes: `bun run lint:fix`
424
+
425
+ #### Manual Verification:
426
+ - [ ] Integration menu shows all 4 options, allows toggling
427
+ - [ ] Selecting none and continuing skips to review
428
+ - [ ] GitHub flow asks for token, email, name with clear instructions
429
+ - [ ] Slack flow shows manifest instructions, clipboard copy works, collects tokens
430
+ - [ ] Each integration can be individually tested by selecting only that one
431
+ - [ ] Skipping all integrations works correctly
432
+
433
+ **Implementation Note**: Pause for manual verification. Slack manifest clipboard requires `pbcopy` (macOS) or equivalent.
434
+
435
+ ---
436
+
437
+ ## Phase 5: File Generation
438
+
439
+ ### Overview
440
+ Implement the compose generator, env generator, and manifest generator. Write files to disk (or show preview in dry-run mode).
441
+
442
+ ### Changes Required:
443
+
444
+ #### 1. Review step
445
+ **File**: `src/commands/onboard.tsx`
446
+ **Changes**:
447
+ - Implement `review` step: Show a summary of all collected configuration:
448
+ - Deploy type, preset name, number of services
449
+ - Harness type
450
+ - Enabled integrations
451
+ - Output directory
452
+ - API key (truncated)
453
+ - Select: "Generate files and start" / "Go back" / "Cancel"
454
+ - On "Generate": transition to `generate`
455
+ - On "Go back": transition to `integration_menu` (or earlier step)
456
+ - On "Cancel": transition to `done` with no file generation
457
+
458
+ #### 2. Compose generator
459
+ **File**: `src/commands/onboard/compose-generator.ts` (new)
460
+ **Changes**:
461
+ - `generateCompose(state: OnboardState): string` — produces a `docker-compose.yml`
462
+ - Generate API service with:
463
+ - Image: `ghcr.io/desplega-ai/agent-swarm:latest`
464
+ - Ports: `3013:3013`
465
+ - Env: `API_KEY`, `MCP_BASE_URL=http://localhost:3013`, `APP_URL`
466
+ - Slack env vars if integration enabled
467
+ - Healthcheck: `curl -f http://localhost:3013/health || exit 1`
468
+ - Volume: `swarm_api:/app`
469
+ - Generate agent services (lead + workers) from `state.services`:
470
+ - Image: `ghcr.io/desplega-ai/agent-swarm-worker:latest`
471
+ - `depends_on: api` with `condition: service_healthy`
472
+ - Env: `CLAUDE_CODE_OAUTH_TOKEN`, `API_KEY`, `AGENT_ID` (real UUID from state), `AGENT_NAME`, `AGENT_ROLE`, `TEMPLATE_ID`, `MCP_BASE_URL=http://api:3013`, `YOLO=true`, `SWARM_URL`
473
+ - Integration-specific env vars per integration config
474
+ - Ports: sequential starting from 3020
475
+ - Volumes: shared logs, shared workspace, personal volume per agent
476
+ - Generate volumes section
477
+
478
+ #### 3. Env generator
479
+ **File**: `src/commands/onboard/env-generator.ts` (new)
480
+ **Changes**:
481
+ - `generateEnv(state: OnboardState): string` — produces a `.env` file with actual values (not placeholders)
482
+ - Sections: Core (API_KEY, MCP_BASE_URL, APP_URL), Authentication (CLAUDE_CODE_OAUTH_TOKEN or Pi keys), Integrations (per enabled integration), Agent IDs (comments listing each agent's UUID for reference)
483
+ - Include explanatory comments for each section
484
+
485
+ #### 4. Manifest generator
486
+ **File**: `src/commands/onboard/manifest.ts` (new)
487
+ **Changes**:
488
+ - `generateManifest(state: OnboardState): object` — produces `.agent-swarm/config.json`
489
+ - Schema:
490
+ ```json
491
+ {
492
+ "version": 1,
493
+ "createdAt": "ISO date",
494
+ "deployType": "local",
495
+ "preset": "dev",
496
+ "harness": "claude",
497
+ "services": [{ "name": "lead", "templateId": "official/lead", "agentId": "uuid" }, ...],
498
+ "integrations": { "github": true, "slack": false, ... },
499
+ "composePath": "./docker-compose.yml",
500
+ "envPath": "./.env",
501
+ "apiUrl": "http://localhost:3013",
502
+ "dashboardUrl": "https://app.agent-swarm.dev"
503
+ }
504
+ ```
505
+
506
+ #### 5. Generate step
507
+ **File**: `src/commands/onboard.tsx`
508
+ **Changes**:
509
+ - Implement `generate` step:
510
+ - Call `generateCompose(state)`, `generateEnv(state)`, `generateManifest(state)`
511
+ - If `--dry-run`: show the generated files in the terminal (truncated preview), do not write
512
+ - If not dry-run: write files to `state.outputDir`:
513
+ - `docker-compose.yml`
514
+ - `.env`
515
+ - `.agent-swarm/config.json` (create `.agent-swarm/` dir)
516
+ - Add both `.env` and `.agent-swarm/` to `.gitignore` in the output directory if in a git repo (the onboard command runs in arbitrary directories — can't assume `.env` is already gitignored)
517
+ - Log each file written
518
+ - Transition to `prereq_check`
519
+
520
+ ### Success Criteria:
521
+
522
+ #### Automated Verification:
523
+ - [ ] TypeScript compiles: `bun run tsc:check`
524
+ - [ ] Lint passes: `bun run lint:fix`
525
+ - [ ] Unit test for compose generator: `bun test src/tests/onboard-compose.test.ts` — verifies correct YAML structure for each preset
526
+ - [ ] Unit test for env generator: `bun test src/tests/onboard-env.test.ts` — verifies all credentials appear correctly
527
+
528
+ #### Manual Verification:
529
+ - [ ] Review screen shows correct summary of all collected config
530
+ - [ ] Dry-run shows generated file previews without writing
531
+ - [ ] Normal run writes `docker-compose.yml`, `.env`, `.agent-swarm/config.json`
532
+ - [ ] Generated compose file is valid YAML: `docker compose -f docker-compose.yml config`
533
+ - [ ] Generated `.env` has real values (not placeholders) for provided credentials
534
+ - [ ] `.agent-swarm/` directory is created and added to `.gitignore`
535
+
536
+ **Implementation Note**: Pause for manual verification. Test generated compose with `docker compose config` to validate YAML syntax.
537
+
538
+ ---
539
+
540
+ ## Phase 6: Stack Start + Health Check
541
+
542
+ ### Overview
543
+ Check Docker prerequisites, start the stack with `docker compose up`, poll for health, and verify agent registration.
544
+
545
+ ### Changes Required:
546
+
547
+ #### 1. Prerequisite check step
548
+ **File**: `src/commands/onboard.tsx`
549
+ **Changes**:
550
+ - Implement `prereq_check` step:
551
+ - Check `docker --version` (require Docker installed)
552
+ - Check `docker compose version` (require Compose v2)
553
+ - Check available ports (3013, 3020-302N) using `lsof -i :PORT`
554
+ - If Docker missing: show install instructions for macOS (`brew install --cask docker`) and Linux
555
+ - If Compose missing: show install instructions
556
+ - If ports occupied: show which ports are in use and by what process
557
+ - If all good: transition to `start`
558
+ - If issues: show errors with fix instructions and a "Retry" / "Skip and generate files only" option
559
+
560
+ #### 2. Stack start step
561
+ **File**: `src/commands/onboard.tsx`
562
+ **Changes**:
563
+ - Implement `start` step:
564
+ - Show Spinner: "Starting Docker stack..."
565
+ - Run `docker compose --env-file .env up -d` in the output directory via `Bun.$`
566
+ - Stream docker compose output to logs
567
+ - On success: transition to `health_check`
568
+ - On failure: show error, offer "Retry" / "View logs" / "Skip"
569
+
570
+ #### 3. Health check step
571
+ **File**: `src/commands/onboard.tsx`
572
+ **Changes**:
573
+ - Implement `health_check` step:
574
+ - Poll `http://localhost:3013/health` every 3 seconds, up to 60 seconds
575
+ - Show Spinner with countdown: "Waiting for API server... (15s / 60s)"
576
+ - Once healthy: check agent registration via `GET http://localhost:3013/api/agents` with `Authorization: Bearer {apiKey}`
577
+ - Verify expected number of agents registered (retry up to 90 seconds — agents take time to boot)
578
+ - Show registration summary: "Lead: registered, Worker 1: registered, Worker 2: registered"
579
+ - On success: transition to `post_connect`
580
+ - On timeout: show diagnostic info (docker compose logs excerpt), offer "Retry" / "Continue anyway" / "View full logs"
581
+
582
+ ### Success Criteria:
583
+
584
+ #### Automated Verification:
585
+ - [ ] TypeScript compiles: `bun run tsc:check`
586
+ - [ ] Lint passes: `bun run lint:fix`
587
+
588
+ #### Manual Verification:
589
+ - [ ] Without Docker installed: shows clear install instructions
590
+ - [ ] With Docker: prereq check passes, shows green checkmarks
591
+ - [ ] Port conflict: shows which port is occupied and by what
592
+ - [ ] `docker compose up` starts the stack
593
+ - [ ] Health check polls and shows progress
594
+ - [ ] Agent registration shows each agent's status
595
+ - [ ] Timeout scenario: shows helpful diagnostics
596
+
597
+ **Implementation Note**: Pause for manual verification. This phase requires Docker Desktop running. Test with a clean state (`docker compose down -v` first).
598
+
599
+ ---
600
+
601
+ ## Phase 7: Post-Deploy Options
602
+
603
+ ### Overview
604
+ After the stack is healthy, offer three optional post-deploy steps: connect local client, open dashboard, send first task.
605
+
606
+ ### Changes Required:
607
+
608
+ #### 1. Connect client step
609
+ **File**: `src/commands/onboard.tsx`
610
+ **Changes**:
611
+ - Implement `post_connect` step:
612
+ - Ask: "Connect this project to the swarm now?" (Select: Yes / No / Skip all post-deploy)
613
+ - If yes: extract `createDefaultSettingsLocal()`, `createDefaultMcpJson()`, and `createHooksConfig()` from `setup.tsx` into a shared module `src/commands/shared/client-config.ts` (export them, update `setup.tsx` to import from the shared module). Then call these from the onboard wizard:
614
+ - Create/update `.mcp.json` with the local swarm URL (`http://localhost:3013`) and generated API key
615
+ - Create/update `.claude/settings.local.json` with permissions, enabled MCP servers, and hooks
616
+ - Show "Connected! Your local Claude Code is now linked to the swarm."
617
+ - Transition to `post_dashboard`
618
+
619
+ #### 2. Open dashboard step
620
+ **File**: `src/commands/onboard.tsx`
621
+ **Changes**:
622
+ - Implement `post_dashboard` step:
623
+ - Ask: "Open the swarm dashboard?" (Select: Yes / No)
624
+ - If yes: open `https://app.agent-swarm.dev?api_url=http://localhost:3013&api_key={apiKey}` in default browser via `Bun.$\`open URL\``
625
+ - Transition to `post_task`
626
+
627
+ #### 3. First task step
628
+ **File**: `src/commands/onboard.tsx`
629
+ **Changes**:
630
+ - Implement `post_task` step:
631
+ - **Skip this step entirely for "solo" preset** (no lead to assign to). The DAG's `nextStep()` should route `post_dashboard → done` when preset is solo.
632
+ - Ask: "Send your first task to the swarm?" (Select: Yes / Skip)
633
+ - If yes: show TextInput with placeholder "Say hello to the swarm"
634
+ - On submit: POST to `http://localhost:3013/api/tasks` with `{ task: userInput, agentId: leadAgentId }` using the generated API key and `Authorization: Bearer {apiKey}` header. The `agentId` field assigns the task to the lead agent's UUID from `state.agentIds`. API schema: `src/http/tasks.ts:52-63`.
635
+ - Show: "Task sent to the lead! Check the dashboard to see it get picked up."
636
+ - Transition to `done`
637
+
638
+ #### 4. Done step
639
+ **File**: `src/commands/onboard.tsx`
640
+ **Changes**:
641
+ - Enhance `done` step with a completion summary:
642
+ - "Your swarm is running!"
643
+ - "API: http://localhost:3013"
644
+ - "Dashboard: https://app.agent-swarm.dev?..."
645
+ - "Agents: {N} registered"
646
+ - "Files: docker-compose.yml, .env, .agent-swarm/config.json"
647
+ - Helpful commands: `docker compose logs -f`, `docker compose down`, `agent-swarm setup` (if client not connected)
648
+
649
+ ### Success Criteria:
650
+
651
+ #### Automated Verification:
652
+ - [ ] TypeScript compiles: `bun run tsc:check`
653
+ - [ ] Lint passes: `bun run lint:fix`
654
+
655
+ #### Manual Verification:
656
+ - [ ] "Connect client" creates `.mcp.json` and `.claude/settings.local.json` correctly
657
+ - [ ] "Open dashboard" opens the browser with correct URL params
658
+ - [ ] "First task" sends a task and shows confirmation
659
+ - [ ] Skipping all post-deploy steps shows the completion summary
660
+ - [ ] Done screen shows all relevant info and helpful commands
661
+
662
+ **Implementation Note**: Pause for manual verification. Dashboard URL needs the hosted app running (or at least verify the URL is constructed correctly).
663
+
664
+ ---
665
+
666
+ ## Phase 8: --yes Mode + Polish
667
+
668
+ ### Overview
669
+ Wire up the non-interactive `--yes` mode for CI/scripted usage, add `--preset` flag support, handle edge cases, and write tests.
670
+
671
+ ### Changes Required:
672
+
673
+ #### 1. Non-interactive mode
674
+ **File**: `src/commands/onboard.tsx`
675
+ **Changes**:
676
+ - When `--yes` is passed:
677
+ - Skip welcome, deploy_type (assume local)
678
+ - Require `--preset` flag (error if missing)
679
+ - Read credentials from env vars: `CLAUDE_CODE_OAUTH_TOKEN` (required), `API_KEY` (optional, auto-gen if missing)
680
+ - Read integration credentials from env vars: `GITHUB_TOKEN`, `SLACK_BOT_TOKEN`, etc. — auto-enable integration if the token is present
681
+ - Skip review step
682
+ - Generate files, start stack, wait for health
683
+ - Skip post-deploy options
684
+ - Error messages should list which required env vars are missing
685
+
686
+ #### 2. CLI argument handling
687
+ **File**: `src/cli.tsx`
688
+ **Changes**:
689
+ - Parse `--preset=<name>` flag in `parseArgs`
690
+ - Parse `--output-dir=<path>` flag (default: cwd)
691
+ - Add `onboard` to help text with all flags:
692
+ ```
693
+ onboard Set up a new swarm from scratch (local Docker Compose)
694
+ --dry-run Preview what would be generated without writing files
695
+ -y, --yes Non-interactive mode (reads from env vars)
696
+ --preset=<name> Preset to use: dev, content, research, solo
697
+ --output-dir=<dir> Directory for generated files (default: current)
698
+ ```
699
+
700
+ #### 3. Edge case handling
701
+ **File**: `src/commands/onboard.tsx`
702
+ **Changes**:
703
+ - Handle `Ctrl+C` gracefully at every step (Ink's `useApp().exit()`)
704
+ - Handle Docker not running (socket error) vs not installed
705
+ - Handle network errors when fetching templates (for custom mode)
706
+ - Handle `claude setup-token` not found (Claude CLI not installed)
707
+ - Handle existing `docker-compose.yml` in output dir (warn before overwrite)
708
+ - Validate tokens have expected format where possible (e.g., `xoxb-` prefix for Slack)
709
+
710
+ #### 4. Unit tests
711
+ **File**: `src/tests/onboard-compose.test.ts` (new)
712
+ **Changes**:
713
+ - Test compose generation for each preset (dev, content, research, solo)
714
+ - Test compose generation with integrations enabled/disabled
715
+ - Test that generated compose has correct service count, ports, volumes
716
+ - Test that agent IDs from state are used (not placeholder UUIDs)
717
+
718
+ **File**: `src/tests/onboard-env.test.ts` (new)
719
+ **Changes**:
720
+ - Test env generation with Claude harness
721
+ - Test env generation with Pi harness
722
+ - Test env generation with various integration combinations
723
+ - Test that real credential values appear (not placeholders)
724
+
725
+ **File**: `src/tests/onboard-manifest.test.ts` (new)
726
+ **Changes**:
727
+ - Test manifest generation with various configs
728
+ - Test manifest schema matches expected shape
729
+
730
+ ### Success Criteria:
731
+
732
+ #### Automated Verification:
733
+ - [ ] TypeScript compiles: `bun run tsc:check`
734
+ - [ ] Lint passes: `bun run lint:fix`
735
+ - [ ] Unit tests pass: `bun test src/tests/onboard-compose.test.ts`
736
+ - [ ] Unit tests pass: `bun test src/tests/onboard-env.test.ts`
737
+ - [ ] Unit tests pass: `bun test src/tests/onboard-manifest.test.ts`
738
+ - [ ] Non-interactive mode: `API_KEY=test CLAUDE_CODE_OAUTH_TOKEN=test bun run src/cli.tsx onboard --yes --preset=dev --dry-run`
739
+
740
+ #### Manual Verification:
741
+ - [ ] `--yes --preset=dev` with env vars generates correct files
742
+ - [ ] `--yes` without `--preset` shows clear error message
743
+ - [ ] `--yes` without `CLAUDE_CODE_OAUTH_TOKEN` shows clear error listing missing vars
744
+ - [ ] `--dry-run --yes --preset=dev` shows preview without writing files
745
+ - [ ] Existing `docker-compose.yml` warns before overwrite
746
+ - [ ] All edge cases handled gracefully (no unhandled promise rejections)
747
+
748
+ **Implementation Note**: Pause for manual verification and full E2E testing.
749
+
750
+ ---
751
+
752
+ ## Implementation Status
753
+
754
+ _Implemented: 2026-03-20 by Claude_
755
+
756
+ All 8 phases completed. 27 new files, 2 modified files (setup.tsx, cli.tsx).
757
+
758
+ ### Automated Tests Executed
759
+ - `bun run tsc:check` — passes (0 errors)
760
+ - `bun run lint:fix` — passes (0 warnings in onboard files)
761
+ - `bun test src/tests/` — 1583 tests pass (all existing + 25 new)
762
+ - `bun test src/tests/onboard-compose.test.ts` — 8 tests (service counts, ports, integrations, healthcheck)
763
+ - `bun test src/tests/onboard-env.test.ts` — 8 tests (credentials, integrations, disable flags)
764
+ - `bun test src/tests/onboard-manifest.test.ts` — 9 tests (schema shape, presets, integration flags)
765
+ - `--yes --preset=dev --dry-run` — completes end-to-end, shows file previews
766
+ - `--yes` without `--preset` — shows clear error
767
+ - `--yes` without `CLAUDE_CODE_OAUTH_TOKEN` — shows clear error
768
+ - Generated `docker-compose.yml` validates with `docker compose config --quiet`
769
+ - Generated `.env` has real credential values
770
+ - Generated `.agent-swarm/config.json` has correct schema
771
+
772
+ ### Key Deviations from Plan
773
+ - `generate.tsx` routes directly to `done` in dry-run mode (skips prereq/start/health)
774
+ - Added `nonInteractive` field to `OnboardState` for `--yes` mode to skip post-deploy steps
775
+ - `generate.tsx` has its own inline `generateManifest()` (agent wrote a simpler version than the shared `manifest.ts` — both exist, generate.tsx uses its own)
776
+
777
+ ---
778
+
779
+ ## Testing Strategy
780
+
781
+ ### Unit Tests (25 tests, all passing)
782
+ - `src/tests/onboard-compose.test.ts` — 8 tests: preset service counts, port allocation, integrations, healthcheck, depends_on
783
+ - `src/tests/onboard-env.test.ts` — 8 tests: credential values, integration sections, disable flags, agent ID comments
784
+ - `src/tests/onboard-manifest.test.ts` — 9 tests: schema shape, preset propagation, integration flags, static paths
785
+
786
+ ### Manual E2E Verification
787
+
788
+ **Setup**: Link the CLI binary locally so you can run `agent-swarm onboard` from any directory:
789
+
790
+ ```bash
791
+ # From the worktree root
792
+ cd ~/worktrees/agent-swarm/2026-03-20-feat/cli-onboarding
793
+ bun link
794
+
795
+ # Now test from a clean temp directory (won't touch your project)
796
+ cd /tmp && rm -rf swarm-e2e && mkdir swarm-e2e && cd swarm-e2e
797
+ ```
798
+
799
+ **Tests to run**:
800
+
801
+ ```bash
802
+ # 1. Interactive dry-run (walk through every screen)
803
+ agent-swarm onboard --dry-run
804
+ # → Local → Dev Team → Claude → paste fake token → skip integrations → review → done
805
+
806
+ # 2. Non-interactive dry-run (instant, no prompts)
807
+ API_KEY=test123 CLAUDE_CODE_OAUTH_TOKEN=fake-token \
808
+ agent-swarm onboard --yes --preset=dev --dry-run
809
+ # → Completes immediately with file previews
810
+
811
+ # 3. Error cases
812
+ agent-swarm onboard --yes --dry-run
813
+ # → "Onboard failed: --preset is required..."
814
+
815
+ agent-swarm onboard --yes --preset=dev --dry-run
816
+ # → "Onboard failed: CLAUDE_CODE_OAUTH_TOKEN..."
817
+
818
+ # 4. Actual file generation + validation
819
+ API_KEY=mykey123 CLAUDE_CODE_OAUTH_TOKEN=fake-token \
820
+ agent-swarm onboard --yes --preset=dev
821
+ # → Writes files, then hits prereq check (Ctrl+C or let it run)
822
+ docker compose -f docker-compose.yml config --quiet # Valid YAML
823
+ cat .env | head -10 # Real credentials
824
+ cat .agent-swarm/config.json | jq . # Valid manifest
825
+
826
+ # 5. Solo preset (no lead, skips post_task)
827
+ API_KEY=test CLAUDE_CODE_OAUTH_TOKEN=test \
828
+ agent-swarm onboard --yes --preset=solo --dry-run
829
+ # → Shows 1 agent configured
830
+
831
+ # 6. With integrations
832
+ API_KEY=test CLAUDE_CODE_OAUTH_TOKEN=test GITHUB_TOKEN=ghp_xxx \
833
+ GITHUB_EMAIL=you@example.com GITHUB_NAME="Your Name" \
834
+ agent-swarm onboard --yes --preset=dev --dry-run
835
+ # → Shows "Integrations: github" in output
836
+
837
+ # 7. Full stack test (requires real OAuth token + Docker + free port 3013)
838
+ agent-swarm onboard
839
+ # → Complete wizard → verify agents register → send test task
840
+ curl -s -H "Authorization: Bearer <api-key>" http://localhost:3013/api/agents | jq '.agents[] | {name, status}'
841
+
842
+ # 8. Cleanup
843
+ docker compose down -v
844
+ cd /tmp && rm -rf swarm-e2e
845
+ bun unlink # from worktree root if desired
846
+ ```
847
+
848
+ ## References
849
+ - Brainstorm: `thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md`
850
+ - Existing setup: `src/commands/setup.tsx`
851
+ - Compose generator (web): `templates-ui/src/lib/compose-generator.ts`
852
+ - Template schema: `templates/schema.ts`
853
+ - Docker entrypoint: `docker-entrypoint.sh`
854
+ - Env examples: `.env.example`, `.env.docker.example`
855
+
856
+ ---
857
+
858
+ ## Review Errata
859
+
860
+ _Reviewed: 2026-03-20 by Claude_
861
+
862
+ ### All Resolved
863
+
864
+ - [x] **`SelectInput` → `Select`** — replaced all references throughout. `@inkjs/ui` v2.0.0 exports `Select`, not `SelectInput`. Also noted: `MultiSelect`, `ProgressBar`, `StatusMessage`, `ConfirmInput` are available.
865
+ - [x] **Task API schema** — fixed to `{ task: userInput, agentId: leadAgentId }` per `src/http/tasks.ts:52-63`.
866
+ - [x] **Solo preset + first task** — `post_task` now skips for solo preset (DAG routes `post_dashboard → done`).
867
+ - [x] **`setup.tsx` functions private** — Phase 7 extracts to `src/commands/shared/client-config.ts`. Command structure updated.
868
+ - [x] **`Map` → `Record`** — changed `agentIds` type to `Record<string, string>`.
869
+ - [x] **Pi harness UX contradiction** — Pi is now "coming soon" in harness selector. "What We're NOT Doing" updated.
870
+ - [x] **`.env` gitignore** — Phase 5 now adds both `.env` and `.agent-swarm/` to output dir's `.gitignore`.
871
+ - [x] **Cross-platform clipboard** — Phase 4 detects OS (`pbcopy`/`xclip`/`clip.exe`) with fallback.
872
+ - [x] **`onboard.tsx` size** — committed to step-per-file split in `src/commands/onboard/steps/`. Command structure updated.
873
+ - [x] **"Linear" → "DAG-based"** — Implementation Approach updated.
874
+ - [x] Frontmatter missing `planner` field — minor, not blocking.