@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.
- package/.claude/settings.json +84 -0
- package/.claude/settings.local.json +3 -1
- package/.entire/settings.json +4 -0
- package/.env.docker.example +40 -23
- package/.env.example +39 -1
- package/.github/ISSUE_TEMPLATE/bug_report.yml +78 -0
- package/.github/ISSUE_TEMPLATE/community-template.yml +77 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +29 -0
- package/.github/workflows/ci.yml +3 -27
- package/.github/workflows/docker-and-deploy.yml +20 -5
- package/.github/workflows/merge-gate.yml +233 -0
- package/.opencode/plugins/entire.ts +133 -0
- package/.superset/config.json +6 -0
- package/.wts-setup.ts +103 -34
- package/CHANGELOG.md +447 -0
- package/CLAUDE.md +422 -5
- package/CONTRIBUTING.md +46 -1
- package/DEPLOYMENT.md +26 -9
- package/Dockerfile +15 -7
- package/Dockerfile.worker +99 -67
- package/MCP.md +452 -17
- package/README.md +271 -169
- package/api-entrypoint.sh +56 -0
- package/depot.json +1 -0
- package/docker-compose.example.yml +194 -3
- package/docker-compose.local.yml +119 -0
- package/docker-entrypoint.sh +393 -113
- package/docs-site/app/api/search/route.ts +4 -0
- package/docs-site/app/docs/[[...slug]]/page.tsx +87 -0
- package/docs-site/app/docs/layout.tsx +12 -0
- package/docs-site/app/globals.css +24 -0
- package/docs-site/app/layout.config.tsx +34 -0
- package/docs-site/app/layout.tsx +119 -0
- package/docs-site/app/llms-full.txt/route.ts +11 -0
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +24 -0
- package/docs-site/app/llms.txt/route.ts +8 -0
- package/docs-site/app/page.tsx +5 -0
- package/docs-site/app/robots.ts +13 -0
- package/docs-site/app/sitemap.ts +37 -0
- package/docs-site/components/api-page.client.tsx +4 -0
- package/docs-site/components/api-page.tsx +7 -0
- package/docs-site/components/mdx/mermaid.tsx +55 -0
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +117 -0
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +77 -0
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +96 -0
- package/docs-site/content/docs/(documentation)/architecture/meta.json +4 -0
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +172 -0
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +98 -0
- package/docs-site/content/docs/(documentation)/concepts/meta.json +4 -0
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +136 -0
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +104 -0
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +148 -0
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +209 -0
- package/docs-site/content/docs/(documentation)/contributing.mdx +158 -0
- package/docs-site/content/docs/(documentation)/getting-started.mdx +157 -0
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +79 -0
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +171 -0
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +81 -0
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +93 -0
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +98 -0
- package/docs-site/content/docs/(documentation)/guides/meta.json +13 -0
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +52 -0
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +179 -0
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +154 -0
- package/docs-site/content/docs/(documentation)/index.mdx +65 -0
- package/docs-site/content/docs/(documentation)/meta.json +19 -0
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +241 -0
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +205 -0
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +449 -0
- package/docs-site/content/docs/(documentation)/reference/meta.json +4 -0
- package/docs-site/content/docs/api-reference/active-sessions.mdx +9 -0
- package/docs-site/content/docs/api-reference/agents.mdx +9 -0
- package/docs-site/content/docs/api-reference/channels.mdx +9 -0
- package/docs-site/content/docs/api-reference/config.mdx +9 -0
- package/docs-site/content/docs/api-reference/debug.mdx +9 -0
- package/docs-site/content/docs/api-reference/ecosystem.mdx +9 -0
- package/docs-site/content/docs/api-reference/epics.mdx +9 -0
- package/docs-site/content/docs/api-reference/index.mdx +32 -0
- package/docs-site/content/docs/api-reference/memory.mdx +9 -0
- package/docs-site/content/docs/api-reference/meta.json +25 -0
- package/docs-site/content/docs/api-reference/poll.mdx +9 -0
- package/docs-site/content/docs/api-reference/repos.mdx +9 -0
- package/docs-site/content/docs/api-reference/schedules.mdx +9 -0
- package/docs-site/content/docs/api-reference/session-data.mdx +9 -0
- package/docs-site/content/docs/api-reference/stats.mdx +9 -0
- package/docs-site/content/docs/api-reference/tasks.mdx +9 -0
- package/docs-site/content/docs/api-reference/trackers.mdx +9 -0
- package/docs-site/content/docs/api-reference/webhooks.mdx +9 -0
- package/docs-site/content/docs/api-reference/workflows.mdx +9 -0
- package/docs-site/content/docs/meta.json +3 -0
- package/docs-site/lib/get-llm-text.ts +10 -0
- package/docs-site/lib/openapi.ts +23 -0
- package/docs-site/lib/source.ts +8 -0
- package/docs-site/mdx-components.tsx +13 -0
- package/docs-site/next.config.mjs +29 -0
- package/docs-site/package.json +35 -0
- package/docs-site/pnpm-lock.yaml +5407 -0
- package/docs-site/postcss.config.mjs +8 -0
- package/docs-site/scripts/generate-docs.ts +171 -0
- package/docs-site/source.config.ts +17 -0
- package/docs-site/tsconfig.json +46 -0
- package/ecosystem.config.cjs +4 -4
- package/landing/next.config.ts +14 -0
- package/landing/package.json +31 -0
- package/landing/pnpm-lock.yaml +1091 -0
- package/landing/postcss.config.mjs +8 -0
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +30 -0
- package/landing/public/omghost-openfort.svg +9 -0
- package/landing/src/app/actions/waitlist.ts +25 -0
- package/landing/src/app/blog/openfort-hackathon/page.tsx +863 -0
- package/landing/src/app/blog/page.tsx +162 -0
- package/landing/src/app/blog/swarm-metrics/page.tsx +685 -0
- package/landing/src/app/examples/page.tsx +174 -0
- package/landing/src/app/examples/x402/page.tsx +456 -0
- package/landing/src/app/globals.css +122 -0
- package/landing/src/app/layout.tsx +134 -0
- package/landing/src/app/page.tsx +27 -0
- package/landing/src/app/robots.ts +13 -0
- package/landing/src/app/sitemap.ts +44 -0
- package/landing/src/components/architecture.tsx +163 -0
- package/landing/src/components/cta.tsx +52 -0
- package/landing/src/components/features.tsx +160 -0
- package/landing/src/components/footer.tsx +100 -0
- package/landing/src/components/hero.tsx +217 -0
- package/landing/src/components/how-it-works.tsx +165 -0
- package/landing/src/components/navbar.tsx +147 -0
- package/landing/src/components/waitlist.tsx +110 -0
- package/landing/src/components/why-choose.tsx +149 -0
- package/landing/src/components/workshops.tsx +328 -0
- package/landing/src/lib/utils.ts +6 -0
- package/landing/tsconfig.json +41 -0
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +154 -0
- package/new-ui/CLAUDE.md +92 -0
- package/new-ui/README.md +73 -0
- package/new-ui/biome.json +42 -0
- package/new-ui/components.json +21 -0
- package/new-ui/index.html +25 -0
- package/new-ui/package.json +49 -0
- package/new-ui/pnpm-lock.yaml +4845 -0
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +814 -0
- package/new-ui/src/api/hooks/index.ts +64 -0
- package/new-ui/src/api/hooks/use-agents.ts +58 -0
- package/new-ui/src/api/hooks/use-channels.ts +115 -0
- package/new-ui/src/api/hooks/use-config-api.ts +46 -0
- package/new-ui/src/api/hooks/use-costs.ts +122 -0
- package/new-ui/src/api/hooks/use-db-query.ts +29 -0
- package/new-ui/src/api/hooks/use-epics.ts +75 -0
- package/new-ui/src/api/hooks/use-repos.ts +61 -0
- package/new-ui/src/api/hooks/use-schedules.ts +81 -0
- package/new-ui/src/api/hooks/use-services.ts +16 -0
- package/new-ui/src/api/hooks/use-stats.ts +27 -0
- package/new-ui/src/api/hooks/use-tasks.ts +89 -0
- package/new-ui/src/api/hooks/use-workflows.ts +109 -0
- package/{ui/src/types/api.ts → new-ui/src/api/types.ts} +236 -10
- package/new-ui/src/app/App.tsx +13 -0
- package/new-ui/src/app/providers.tsx +32 -0
- package/new-ui/src/app/router.tsx +52 -0
- package/new-ui/src/components/layout/app-header.tsx +47 -0
- package/new-ui/src/components/layout/app-sidebar.tsx +128 -0
- package/new-ui/src/components/layout/breadcrumbs.tsx +57 -0
- package/new-ui/src/components/layout/config-guard.tsx +22 -0
- package/new-ui/src/components/layout/root-layout.tsx +40 -0
- package/new-ui/src/components/layout/swarm-switcher.tsx +85 -0
- package/new-ui/src/components/shared/command-menu.tsx +131 -0
- package/new-ui/src/components/shared/data-grid.tsx +141 -0
- package/new-ui/src/components/shared/empty-state.tsx +24 -0
- package/new-ui/src/components/shared/error-boundary.tsx +72 -0
- package/new-ui/src/components/shared/json-viewer.tsx +47 -0
- package/new-ui/src/components/shared/name-connection-modal.tsx +99 -0
- package/new-ui/src/components/shared/page-skeleton.tsx +16 -0
- package/new-ui/src/components/shared/session-log-viewer.tsx +364 -0
- package/new-ui/src/components/shared/stats-bar.tsx +132 -0
- package/new-ui/src/components/shared/status-badge.tsx +131 -0
- package/new-ui/src/components/shared/usage-summary.tsx +179 -0
- package/new-ui/src/components/ui/alert-dialog.tsx +176 -0
- package/new-ui/src/components/ui/alert.tsx +60 -0
- package/new-ui/src/components/ui/avatar.tsx +96 -0
- package/new-ui/src/components/ui/badge.tsx +46 -0
- package/new-ui/src/components/ui/button.tsx +62 -0
- package/new-ui/src/components/ui/card.tsx +75 -0
- package/new-ui/src/components/ui/command.tsx +160 -0
- package/new-ui/src/components/ui/dialog.tsx +143 -0
- package/new-ui/src/components/ui/dropdown-menu.tsx +226 -0
- package/new-ui/src/components/ui/input.tsx +21 -0
- package/new-ui/src/components/ui/label.tsx +19 -0
- package/new-ui/src/components/ui/progress.tsx +26 -0
- package/new-ui/src/components/ui/scroll-area.tsx +54 -0
- package/new-ui/src/components/ui/select.tsx +175 -0
- package/new-ui/src/components/ui/separator.tsx +28 -0
- package/new-ui/src/components/ui/sheet.tsx +132 -0
- package/new-ui/src/components/ui/sidebar.tsx +691 -0
- package/new-ui/src/components/ui/skeleton.tsx +13 -0
- package/new-ui/src/components/ui/sonner.tsx +35 -0
- package/new-ui/src/components/ui/switch.tsx +33 -0
- package/new-ui/src/components/ui/table.tsx +92 -0
- package/new-ui/src/components/ui/tabs.tsx +79 -0
- package/new-ui/src/components/ui/textarea.tsx +18 -0
- package/new-ui/src/components/ui/tooltip.tsx +51 -0
- package/new-ui/src/components/workflows/action-node.tsx +53 -0
- package/new-ui/src/components/workflows/condition-node.tsx +50 -0
- package/new-ui/src/components/workflows/graph-utils.ts +124 -0
- package/new-ui/src/components/workflows/json-tree.tsx +189 -0
- package/new-ui/src/components/workflows/node-styles.ts +10 -0
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +87 -0
- package/new-ui/src/components/workflows/trigger-node.tsx +41 -0
- package/new-ui/src/components/workflows/workflow-graph.tsx +65 -0
- package/{ui/src/hooks/useAutoScroll.ts → new-ui/src/hooks/use-auto-scroll.ts} +0 -1
- package/new-ui/src/hooks/use-config.ts +203 -0
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +41 -0
- package/new-ui/src/hooks/use-mobile.ts +19 -0
- package/new-ui/src/hooks/use-theme.ts +60 -0
- package/new-ui/src/lib/config.ts +188 -0
- package/new-ui/src/lib/slugs.ts +71 -0
- package/{ui → new-ui}/src/lib/utils.ts +32 -0
- package/new-ui/src/main.tsx +11 -0
- package/new-ui/src/pages/agents/[id]/page.tsx +492 -0
- package/new-ui/src/pages/agents/page.tsx +134 -0
- package/new-ui/src/pages/chat/page.tsx +674 -0
- package/new-ui/src/pages/config/page.tsx +1109 -0
- package/new-ui/src/pages/dashboard/page.tsx +454 -0
- package/new-ui/src/pages/debug/page.tsx +275 -0
- package/new-ui/src/pages/epics/[id]/page.tsx +809 -0
- package/new-ui/src/pages/epics/page.tsx +321 -0
- package/new-ui/src/pages/not-found/page.tsx +18 -0
- package/new-ui/src/pages/repos/page.tsx +369 -0
- package/new-ui/src/pages/schedules/[id]/page.tsx +664 -0
- package/new-ui/src/pages/schedules/page.tsx +477 -0
- package/new-ui/src/pages/services/page.tsx +128 -0
- package/new-ui/src/pages/tasks/[id]/page.tsx +670 -0
- package/new-ui/src/pages/tasks/page.tsx +592 -0
- package/new-ui/src/pages/usage/page.tsx +195 -0
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +363 -0
- package/new-ui/src/pages/workflows/[id]/page.tsx +417 -0
- package/new-ui/src/pages/workflows/page.tsx +266 -0
- package/new-ui/src/styles/ag-grid.css +36 -0
- package/new-ui/src/styles/globals.css +213 -0
- package/new-ui/test-results/.last-run.json +4 -0
- package/{ui/tsconfig.json → new-ui/tsconfig.app.json} +7 -4
- package/new-ui/tsconfig.json +4 -0
- package/new-ui/tsconfig.node.json +26 -0
- package/new-ui/vercel.json +4 -0
- package/new-ui/vite.config.ts +28 -0
- package/openapi.json +4436 -0
- package/package.json +31 -7
- package/plugin/build-pi-skills.ts +233 -0
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/prek.toml +75 -0
- package/scripts/check-db-boundary.sh +60 -0
- package/scripts/e2e-docker-provider.ts +820 -0
- package/scripts/e2e-io-schemas-test.ts +807 -0
- package/scripts/e2e-provider-test.ts +220 -0
- package/scripts/e2e-workflow-redesign.sh +229 -0
- package/scripts/e2e-workflow-test.sh +285 -0
- package/scripts/e2e-workflow-test.ts +857 -0
- package/scripts/generate-openapi.ts +26 -0
- package/scripts/measure-tool-tokens.ts +118 -0
- package/scripts/x402-e2e-test.ts +195 -0
- package/scripts/x402-test-server.ts +236 -0
- package/scripts/x402-testnet-e2e.ts +668 -0
- package/slack-manifest.json +17 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +207 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +2729 -770
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- package/src/be/migrations/runner.ts +188 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1376 -559
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +93 -75
- package/src/github/index.ts +1 -0
- package/src/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +327 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +425 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +172 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +213 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +178 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +391 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +522 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +543 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +366 -24
- package/src/prompts/defaults.ts +196 -0
- package/src/providers/claude-adapter.ts +429 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +620 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +186 -29
- package/src/server.ts +82 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +115 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +212 -52
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +363 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +402 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/progress-dedup.test.ts +98 -0
- package/src/tests/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +540 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +311 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +386 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +290 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -0
- package/src/tools/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +187 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +30 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/tool-config.ts +117 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +93 -10
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +111 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +118 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +477 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +217 -0
- package/src/workflows/engine.ts +554 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +92 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +143 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +95 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +42 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/community/.gitkeep +0 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/templates-ui/README.md +46 -0
- package/templates-ui/components.json +17 -0
- package/templates-ui/eslint.config.mjs +18 -0
- package/templates-ui/next.config.ts +7 -0
- package/templates-ui/package.json +35 -0
- package/templates-ui/pnpm-lock.yaml +4571 -0
- package/templates-ui/postcss.config.mjs +7 -0
- package/templates-ui/public/file.svg +1 -0
- package/templates-ui/public/globe.svg +1 -0
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +1 -0
- package/templates-ui/public/vercel.svg +1 -0
- package/templates-ui/public/window.svg +1 -0
- package/templates-ui/src/app/[category]/[name]/page.tsx +89 -0
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +52 -0
- package/templates-ui/src/app/api/templates/route.ts +18 -0
- package/templates-ui/src/app/builder/page.tsx +37 -0
- package/templates-ui/src/app/globals.css +94 -0
- package/templates-ui/src/app/layout.tsx +79 -0
- package/templates-ui/src/app/page.tsx +38 -0
- package/templates-ui/src/app/robots.ts +11 -0
- package/templates-ui/src/app/sitemap.ts +31 -0
- package/templates-ui/src/components/compose-builder.tsx +442 -0
- package/templates-ui/src/components/compose-preview.tsx +117 -0
- package/templates-ui/src/components/file-preview.tsx +77 -0
- package/templates-ui/src/components/footer.tsx +40 -0
- package/templates-ui/src/components/header.tsx +41 -0
- package/templates-ui/src/components/template-card.tsx +87 -0
- package/templates-ui/src/components/template-detail.tsx +125 -0
- package/templates-ui/src/components/template-gallery.tsx +263 -0
- package/templates-ui/src/components/ui/badge.tsx +36 -0
- package/templates-ui/src/components/ui/button.tsx +57 -0
- package/templates-ui/src/components/ui/card.tsx +76 -0
- package/templates-ui/src/components/ui/separator.tsx +31 -0
- package/templates-ui/src/components/ui/tooltip.tsx +32 -0
- package/templates-ui/src/lib/compose-generator.ts +241 -0
- package/templates-ui/src/lib/templates.ts +137 -0
- package/templates-ui/src/lib/utils.ts +6 -0
- package/templates-ui/tsconfig.json +34 -0
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +679 -0
- package/thoughts/research/2026-02-28-x402-payments-research.md +686 -0
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +282 -0
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +492 -0
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +282 -0
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +328 -0
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +224 -0
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +159 -0
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +337 -0
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +778 -0
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +1269 -0
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +411 -0
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +724 -0
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +443 -0
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +307 -0
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +803 -0
- package/thoughts/taras/plans/2026-02-20-env-management.md +538 -0
- package/thoughts/taras/plans/2026-02-20-memory-system.md +882 -0
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +806 -0
- package/thoughts/taras/plans/2026-02-20-session-attach.md +647 -0
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +820 -0
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +768 -0
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +77 -0
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +543 -0
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +373 -0
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +512 -0
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +919 -0
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +723 -0
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +371 -0
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +621 -0
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +61 -0
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +488 -0
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +644 -0
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +636 -0
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +444 -0
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +591 -0
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +446 -0
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +987 -0
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +403 -0
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +860 -0
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +899 -0
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +874 -0
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +723 -0
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +390 -0
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +594 -0
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +825 -0
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +393 -0
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +168 -0
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +230 -0
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +445 -0
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +375 -0
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +869 -0
- package/thoughts/taras/research/2026-03-09-templates-registry.md +373 -0
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +223 -0
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +339 -0
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +181 -0
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +437 -0
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +258 -0
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +335 -0
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +670 -0
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +54 -0
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +558 -0
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +526 -0
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +797 -0
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +563 -0
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +486 -0
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +469 -0
- package/tsconfig.json +1 -1
- package/FAQ.md +0 -19
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/main.tsx +0 -28
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/vite.config.ts +0 -35
- /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.
|