@desplega.ai/agent-swarm 1.20.0 → 1.51.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
@@ -1,617 +0,0 @@
1
- ---
2
- date: 2026-01-28T15:30:00Z
3
- topic: "Per-Worker CLAUDE.md Implementation"
4
- planner: Claude (Opus 4.5)
5
- git_branch: main
6
- status: draft
7
- tags:
8
- - agents
9
- - configuration
10
- - CLAUDE.md
11
- - workers
12
- - database
13
- - UI
14
- ---
15
-
16
- # Per-Worker CLAUDE.md Implementation Plan
17
-
18
- ## Overview
19
-
20
- Implement per-worker CLAUDE.md files that are stored in the database per agent, controllable from the UI, contain default worker info, can be modified by agents themselves, loaded automatically when Claude Code starts, and synced back to the database on session end.
21
-
22
- ## Current State Analysis
23
-
24
- **Database**: The `agents` table in `src/be/db.ts:48-58` has profile fields (`description`, `role`, `capabilities`) but no `claudeMd` field.
25
-
26
- **Profile Updates**: The `updateAgentProfile()` function at `src/be/db.ts:2117-2147` handles `description`, `role`, and `capabilities` updates using SQL `COALESCE` pattern.
27
-
28
- **Hook System**: The `SessionStart` handler at `src/hooks/hook.ts:421-426` currently only outputs agent status. The `Stop` handler at `src/hooks/hook.ts:484-501` marks agent offline and saves PM2 state.
29
-
30
- **UI**: `EditAgentProfileModal.tsx` handles `role`, `description`, and `capabilities` editing.
31
-
32
- **API**: HTTP endpoint `PUT /api/agents/:id/profile` at `src/http.ts:968` accepts profile updates.
33
-
34
- ### Key Discoveries:
35
- - Agent info is fetched via `getAgentInfo()` at `src/hooks/hook.ts:169-188` which calls `GET /me?include=inbox`
36
- - The hook has access to `mcpConfig.headers` and `mcpConfig.url` for API calls
37
- - The `AgentRow` type at `src/be/db.ts:658-670` and `rowToAgent()` at `src/be/db.ts:672-686` handle data transformation
38
- - MCP server URL base is extracted via `getBaseUrl()` at `src/hooks/hook.ts:128-135`
39
-
40
- ## Desired End State
41
-
42
- 1. **Database**: `claudeMd TEXT` column exists on `agents` table with 64KB limit
43
- 2. **API**: Profile update endpoints accept `claudeMd` field
44
- 3. **Hook - SessionStart**: Writes agent's `claudeMd` content to `~/.claude/CLAUDE.md` (with backup/restore of existing file)
45
- 4. **Hook - Stop**: Reads `~/.claude/CLAUDE.md` and syncs content back to database
46
- 5. **MCP Tool**: `update-profile` tool accepts `claudeMd` field
47
- 6. **UI**: `EditAgentProfileModal` includes a CLAUDE.md textarea editor
48
- 7. **Default Template**: New agents get a default CLAUDE.md with their info and a notes section
49
-
50
- ## Quick Verification Reference
51
-
52
- Common commands to verify the implementation:
53
- - `bun run lint:fix` - Lint and format
54
- - `bun run tsc:check` - TypeScript type check
55
- - `bun test` - Run tests
56
-
57
- Key files to check:
58
- - `src/be/db.ts` - Database schema and migrations
59
- - `src/types.ts` - TypeScript type definitions
60
- - `src/hooks/hook.ts` - Hook handlers
61
- - `src/tools/update-profile.ts` - MCP tool
62
- - `src/http.ts` - HTTP API endpoints
63
- - `ui/src/components/EditAgentProfileModal.tsx` - UI modal
64
- - `ui/src/lib/api.ts` - UI API client
65
- - `ui/src/types/api.ts` - UI type definitions
66
-
67
- ## What We're NOT Doing
68
-
69
- - File watcher for real-time sync (using Stop hook only for initial implementation)
70
- - Merging agent CLAUDE.md with existing user CLAUDE.md (using backup/restore approach instead)
71
- - Per-task CLAUDE.md (only per-agent)
72
- - Version history or CLAUDE.md diffing
73
- - Size validation beyond 64KB (trusting Claude's token limits)
74
-
75
- ## Implementation Approach
76
-
77
- The implementation follows a layered approach, building from the database up to the UI:
78
-
79
- 1. **Phase 1**: Add `claudeMd` column to database and update types
80
- 2. **Phase 2**: Extend profile update functions (DB, API, MCP tool)
81
- 3. **Phase 3**: Implement SessionStart hook to load CLAUDE.md
82
- 4. **Phase 4**: Implement Stop hook to sync CLAUDE.md back
83
- 5. **Phase 5**: Add UI editor for CLAUDE.md
84
-
85
- Each phase is independently testable and can be committed separately.
86
-
87
- ---
88
-
89
- ## Phase 1: Database Schema & Types
90
-
91
- ### Overview
92
- Add the `claudeMd` column to the database schema and update all TypeScript type definitions.
93
-
94
- ### Changes Required:
95
-
96
- #### 1. Database Migration
97
- **File**: `src/be/db.ts`
98
- **Changes**:
99
- - Add migration to add `claudeMd TEXT` column to agents table (after line ~495)
100
-
101
- ```typescript
102
- // CLAUDE.md storage column
103
- try {
104
- db.run(`ALTER TABLE agents ADD COLUMN claudeMd TEXT`);
105
- } catch {
106
- /* exists */
107
- }
108
- ```
109
-
110
- #### 2. AgentRow Type
111
- **File**: `src/be/db.ts`
112
- **Changes**:
113
- - Add `claudeMd: string | null` to `AgentRow` type (line 658-670)
114
-
115
- #### 3. rowToAgent Function
116
- **File**: `src/be/db.ts`
117
- **Changes**:
118
- - Add `claudeMd: row.claudeMd ?? undefined` to `rowToAgent()` (line 672-686)
119
-
120
- #### 4. Backend TypeScript Types
121
- **File**: `src/types.ts`
122
- **Changes**:
123
- - Add `claudeMd: z.string().max(65536).optional()` to `AgentSchema` (line 113-132)
124
-
125
- #### 5. Frontend TypeScript Types
126
- **File**: `ui/src/types/api.ts`
127
- **Changes**:
128
- - Add `claudeMd?: string` to `Agent` interface (line 17-33)
129
-
130
- ### Success Criteria:
131
-
132
- #### Automated Verification:
133
- - [x] TypeScript compiles: `bun run tsc:check`
134
- - [x] Linting passes: `bun run lint:fix`
135
- - [x] Tests pass: `bun test`
136
- - [ ] Server starts: `bun run start:http` (verify migration runs)
137
-
138
- #### Manual Verification:
139
- - [ ] Check SQLite database has `claudeMd` column: `sqlite3 agent-swarm-db.sqlite ".schema agents"`
140
- - [ ] Verify existing agents still load correctly (no breaking change)
141
-
142
- **Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 2.
143
-
144
- ---
145
-
146
- ## Phase 2: Profile Update Functions
147
-
148
- ### Overview
149
- Extend the profile update mechanism to accept and persist the `claudeMd` field through all layers: database function, HTTP API, and MCP tool.
150
-
151
- ### Changes Required:
152
-
153
- #### 1. updateAgentProfile Database Function
154
- **File**: `src/be/db.ts`
155
- **Changes**:
156
- - Add `claudeMd?: string` to the updates parameter type (line 2119-2123)
157
- - Add `claudeMd` to the SQL UPDATE statement (line 2131-2136)
158
- - Add `updates.claudeMd ?? null` to the prepared statement parameters (line 2138-2144)
159
-
160
- The SQL becomes:
161
- ```sql
162
- UPDATE agents SET
163
- description = COALESCE(?, description),
164
- role = COALESCE(?, role),
165
- capabilities = COALESCE(?, capabilities),
166
- claudeMd = COALESCE(?, claudeMd),
167
- lastUpdatedAt = ?
168
- WHERE id = ? RETURNING *
169
- ```
170
-
171
- #### 2. HTTP API Endpoint
172
- **File**: `src/http.ts`
173
- **Changes**:
174
- - Add `claudeMd?: string` to the body type at line 985
175
- - Add `claudeMd` check to the "at least one field" validation at line 995-999
176
- - Add `claudeMd` size validation (max 64KB)
177
- - Pass `claudeMd` to `updateAgentProfile()` call
178
-
179
- #### 3. MCP update-profile Tool
180
- **File**: `src/tools/update-profile.ts`
181
- **Changes**:
182
- - Add `claudeMd: z.string().max(65536).optional().describe("Personal CLAUDE.md content...")` to inputSchema (line 14-26)
183
- - Add `claudeMd` to the "at least one field" validation (line 46-51)
184
- - Pass `claudeMd` to `updateAgentProfile()` call (line 87-91)
185
- - Add `claudeMd` to `updatedFields` tracking (line 104-108)
186
-
187
- #### 4. UI API Client
188
- **File**: `ui/src/lib/api.ts`
189
- **Changes**:
190
- - Add `claudeMd?: string` to the profile parameter type in `updateAgentProfile()` (line 71-73)
191
-
192
- ### Success Criteria:
193
-
194
- #### Automated Verification:
195
- - [x] TypeScript compiles: `bun run tsc:check`
196
- - [x] Linting passes: `bun run lint:fix`
197
- - [x] Tests pass: `bun test`
198
-
199
- #### Manual Verification:
200
- - [ ] Test HTTP API with curl:
201
- ```bash
202
- curl -X PUT http://localhost:3013/api/agents/<agent-id>/profile \
203
- -H "Content-Type: application/json" \
204
- -d '{"claudeMd": "# Test Agent\n\nTest content"}'
205
- ```
206
- - [ ] Verify `claudeMd` is persisted in database
207
- - [ ] Test MCP tool via Claude Code session
208
-
209
- **Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 3.
210
-
211
- ---
212
-
213
- ## Phase 3: SessionStart Hook - Load CLAUDE.md
214
-
215
- ### Overview
216
- Modify the SessionStart hook handler to write the agent's `claudeMd` content to `~/.claude/CLAUDE.md`, backing up any existing file first.
217
-
218
- ### Changes Required:
219
-
220
- #### 1. Add Helper Functions
221
- **File**: `src/hooks/hook.ts`
222
- **Changes**:
223
- - Add constants for file paths near the top of the file:
224
- ```typescript
225
- const CLAUDE_MD_PATH = `${process.env.HOME}/.claude/CLAUDE.md`;
226
- const CLAUDE_MD_BACKUP_PATH = `${process.env.HOME}/.claude/CLAUDE.md.bak`;
227
- ```
228
-
229
- - Add helper function to backup existing CLAUDE.md:
230
- ```typescript
231
- async function backupExistingClaudeMd(): Promise<void> {
232
- const file = Bun.file(CLAUDE_MD_PATH);
233
- if (await file.exists()) {
234
- const content = await file.text();
235
- await Bun.write(CLAUDE_MD_BACKUP_PATH, content);
236
- }
237
- }
238
- ```
239
-
240
- - Add helper function to write agent's CLAUDE.md:
241
- ```typescript
242
- async function writeAgentClaudeMd(content: string): Promise<void> {
243
- // Ensure ~/.claude directory exists
244
- const dir = `${process.env.HOME}/.claude`;
245
- try {
246
- await Bun.$`mkdir -p ${dir}`.quiet();
247
- } catch {
248
- // Directory may already exist
249
- }
250
- await Bun.write(CLAUDE_MD_PATH, content);
251
- }
252
- ```
253
-
254
- #### 2. Modify getAgentInfo to Include claudeMd
255
- **File**: `src/hooks/hook.ts`
256
- **Changes**:
257
- - The `AgentWithInbox` interface already extends `Agent`, so it will include `claudeMd` automatically once the types are updated
258
- - Verify `getAgentInfo()` (line 169-188) returns full agent data including `claudeMd`
259
-
260
- #### 3. Modify SessionStart Handler
261
- **File**: `src/hooks/hook.ts`
262
- **Changes**:
263
- - Update the `SessionStart` case (line 422-426) to:
264
- ```typescript
265
- case "SessionStart":
266
- if (!agentInfo) break;
267
-
268
- // Write agent's CLAUDE.md if available
269
- if (agentInfo.claudeMd) {
270
- try {
271
- await backupExistingClaudeMd();
272
- await writeAgentClaudeMd(agentInfo.claudeMd);
273
- console.log("Loaded your personal CLAUDE.md configuration.");
274
- } catch (error) {
275
- console.log(`Warning: Could not load CLAUDE.md: ${(error as Error).message}`);
276
- }
277
- }
278
- break;
279
- ```
280
-
281
- ### Success Criteria:
282
-
283
- #### Automated Verification:
284
- - [x] TypeScript compiles: `bun run tsc:check`
285
- - [x] Linting passes: `bun run lint:fix`
286
- - [x] Tests pass: `bun test`
287
-
288
- #### Manual Verification:
289
- - [ ] Set an agent's `claudeMd` via API
290
- - [ ] Start a Claude Code session with that agent
291
- - [ ] Verify `~/.claude/CLAUDE.md` contains the agent's content
292
- - [ ] Verify `~/.claude/CLAUDE.md.bak` contains the previous content (if any existed)
293
- - [ ] Check the hook output shows "Loaded your personal CLAUDE.md configuration."
294
-
295
- **Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 4.
296
-
297
- ---
298
-
299
- ## Phase 4: Stop Hook - Sync CLAUDE.md Back
300
-
301
- ### Overview
302
- Modify the Stop hook handler to read `~/.claude/CLAUDE.md`, sync it back to the database, and restore the backup file.
303
-
304
- ### Changes Required:
305
-
306
- #### 1. Add Sync Function
307
- **File**: `src/hooks/hook.ts`
308
- **Changes**:
309
- - Add helper function to sync CLAUDE.md back to server:
310
- ```typescript
311
- async function syncClaudeMdToServer(agentId: string): Promise<void> {
312
- if (!mcpConfig) return;
313
-
314
- const file = Bun.file(CLAUDE_MD_PATH);
315
- if (!(await file.exists())) return;
316
-
317
- const content = await file.text();
318
-
319
- // Don't sync if content is empty or too large (>64KB)
320
- if (!content.trim() || content.length > 65536) return;
321
-
322
- try {
323
- await fetch(`${getBaseUrl()}/api/agents/${agentId}/profile`, {
324
- method: "PUT",
325
- headers: {
326
- ...mcpConfig.headers,
327
- "Content-Type": "application/json",
328
- },
329
- body: JSON.stringify({ claudeMd: content }),
330
- });
331
- } catch {
332
- // Silently fail - don't block shutdown
333
- }
334
- }
335
- ```
336
-
337
- - Add helper function to restore backup:
338
- ```typescript
339
- async function restoreClaudeMdBackup(): Promise<void> {
340
- const backupFile = Bun.file(CLAUDE_MD_BACKUP_PATH);
341
- if (await backupFile.exists()) {
342
- const content = await backupFile.text();
343
- await Bun.write(CLAUDE_MD_PATH, content);
344
- // Remove backup file
345
- await Bun.$`rm -f ${CLAUDE_MD_BACKUP_PATH}`.quiet();
346
- } else {
347
- // No backup existed, remove the agent's CLAUDE.md
348
- await Bun.$`rm -f ${CLAUDE_MD_PATH}`.quiet();
349
- }
350
- }
351
- ```
352
-
353
- #### 2. Modify Stop Handler
354
- **File**: `src/hooks/hook.ts`
355
- **Changes**:
356
- - Update the `Stop` case (line 484-501) to sync and restore before marking offline:
357
- ```typescript
358
- case "Stop":
359
- // Save PM2 processes before shutdown (for container restart persistence)
360
- try {
361
- await Bun.$`pm2 save`.quiet();
362
- } catch {
363
- // PM2 not available or no processes - silently ignore
364
- }
365
-
366
- // Sync CLAUDE.md back to database and restore backup
367
- if (agentInfo?.id) {
368
- try {
369
- await syncClaudeMdToServer(agentInfo.id);
370
- await restoreClaudeMdBackup();
371
- } catch {
372
- // Silently fail - don't block shutdown
373
- }
374
- }
375
-
376
- // Mark the agent as offline
377
- await close();
378
- break;
379
- ```
380
-
381
- ### Success Criteria:
382
-
383
- #### Automated Verification:
384
- - [x] TypeScript compiles: `bun run tsc:check`
385
- - [x] Linting passes: `bun run lint:fix`
386
- - [x] Tests pass: `bun test`
387
-
388
- #### Manual Verification:
389
- - [ ] Start a Claude Code session with an agent that has `claudeMd` set
390
- - [ ] Modify `~/.claude/CLAUDE.md` during the session (add some notes)
391
- - [ ] Exit the Claude Code session (trigger Stop hook)
392
- - [ ] Verify the agent's `claudeMd` in the database was updated with the new content
393
- - [ ] Verify `~/.claude/CLAUDE.md` was restored to its original content (or removed if no backup)
394
- - [ ] Verify `~/.claude/CLAUDE.md.bak` was removed
395
-
396
- **Implementation Note**: After completing this phase, pause for manual confirmation before proceeding to Phase 5.
397
-
398
- ---
399
-
400
- ## Phase 5: UI Editor
401
-
402
- ### Overview
403
- Add a CLAUDE.md textarea editor to the `EditAgentProfileModal` component.
404
-
405
- ### Changes Required:
406
-
407
- #### 1. Add State and UI
408
- **File**: `ui/src/components/EditAgentProfileModal.tsx`
409
- **Changes**:
410
- - Add state for `claudeMd`:
411
- ```typescript
412
- const [claudeMd, setClaudeMd] = useState("");
413
- ```
414
-
415
- - Initialize state from agent (in `useEffect` after line 67):
416
- ```typescript
417
- setClaudeMd(agent.claudeMd || "");
418
- ```
419
-
420
- - Add `claudeMd` to `handleSave` (line 74-81):
421
- ```typescript
422
- await updateProfile.mutateAsync({
423
- id: agent.id,
424
- profile: {
425
- role: role || undefined,
426
- description: description || undefined,
427
- capabilities: capabilities.length > 0 ? capabilities : undefined,
428
- claudeMd: claudeMd || undefined,
429
- },
430
- });
431
- ```
432
-
433
- - Add `claudeMd` to `hasChanges` calculation (line 107-110):
434
- ```typescript
435
- const hasChanges =
436
- role !== (agent.role || "") ||
437
- description !== (agent.description || "") ||
438
- claudeMd !== (agent.claudeMd || "") ||
439
- JSON.stringify(capabilities) !== JSON.stringify(agent.capabilities || []);
440
- ```
441
-
442
- - Add CLAUDE.md textarea after the CAPABILITIES form control (around line 322):
443
- ```tsx
444
- <FormControl>
445
- <FormLabel
446
- sx={{
447
- fontFamily: "code",
448
- color: colors.textSecondary,
449
- fontSize: "0.75rem",
450
- letterSpacing: "0.05em",
451
- }}
452
- >
453
- CLAUDE.MD
454
- </FormLabel>
455
- <Textarea
456
- value={claudeMd}
457
- onChange={(e) => setClaudeMd(e.target.value)}
458
- placeholder="Personal CLAUDE.md instructions and notes..."
459
- minRows={6}
460
- maxRows={12}
461
- sx={{
462
- fontFamily: "code",
463
- fontSize: "0.8rem",
464
- bgcolor: colors.level1,
465
- borderColor: colors.border,
466
- color: colors.textPrimary,
467
- "&:focus-within": {
468
- borderColor: colors.amber,
469
- boxShadow: colors.focusGlow,
470
- },
471
- "&:hover": {
472
- borderColor: colors.borderHover,
473
- },
474
- }}
475
- />
476
- <FormHelperText
477
- sx={{ fontFamily: "code", fontSize: "0.65rem", color: colors.textTertiary }}
478
- >
479
- Personal instructions loaded on session start. Notes you add here persist across sessions.
480
- </FormHelperText>
481
- </FormControl>
482
- ```
483
-
484
- #### 2. Update Modal Size
485
- **File**: `ui/src/components/EditAgentProfileModal.tsx`
486
- **Changes**:
487
- - Increase modal width to accommodate the larger content (line 121):
488
- ```typescript
489
- minWidth: 550,
490
- maxWidth: 650,
491
- ```
492
-
493
- ### Success Criteria:
494
-
495
- #### Automated Verification:
496
- - [x] TypeScript compiles: `cd ui && bun run typecheck`
497
- - [x] Build succeeds: `cd ui && bun run build`
498
-
499
- #### Manual Verification:
500
- - [ ] Start the UI: `cd ui && bun run dev`
501
- - [ ] Navigate to an agent's detail view
502
- - [ ] Open the edit profile modal
503
- - [ ] Verify CLAUDE.MD textarea is visible
504
- - [ ] Enter some content in the CLAUDE.MD field
505
- - [ ] Save the profile
506
- - [ ] Verify the content persists (reopen modal)
507
- - [ ] Start a Claude Code session with the agent
508
- - [ ] Verify the CLAUDE.md content is loaded into `~/.claude/CLAUDE.md`
509
-
510
- **Implementation Note**: After completing this phase, pause for manual confirmation.
511
-
512
- ---
513
-
514
- ## Phase 6: Default Template (Optional Enhancement)
515
-
516
- ### Overview
517
- Initialize new agents with a default CLAUDE.md template containing their info.
518
-
519
- ### Changes Required:
520
-
521
- #### 1. Add Default Template Function
522
- **File**: `src/be/db.ts`
523
- **Changes**:
524
- - Add function to generate default CLAUDE.md:
525
- ```typescript
526
- export function generateDefaultClaudeMd(agent: { name: string; description?: string; role?: string; capabilities?: string[] }): string {
527
- const lines = [
528
- `# Agent: ${agent.name}`,
529
- "",
530
- ];
531
-
532
- if (agent.description) {
533
- lines.push(agent.description, "");
534
- }
535
-
536
- if (agent.role) {
537
- lines.push(`## Role`, agent.role, "");
538
- }
539
-
540
- if (agent.capabilities && agent.capabilities.length > 0) {
541
- lines.push(`## Capabilities`);
542
- agent.capabilities.forEach(cap => lines.push(`- ${cap}`));
543
- lines.push("");
544
- }
545
-
546
- lines.push(
547
- "---",
548
- "",
549
- "## Notes",
550
- "",
551
- "If you need to remember something, write it down here. This section persists across sessions.",
552
- "",
553
- "### Learnings",
554
- "",
555
- "### Preferences",
556
- "",
557
- "### Important Context",
558
- "",
559
- );
560
-
561
- return lines.join("\n");
562
- }
563
- ```
564
-
565
- #### 2. Use Default on Agent Creation
566
- **File**: `src/tools/join-swarm.ts`
567
- **Changes**:
568
- - When creating a new agent, set initial `claudeMd` if not provided
569
- - Call `updateAgentProfile()` with generated default after agent creation
570
-
571
- ### Success Criteria:
572
-
573
- #### Automated Verification:
574
- - [x] TypeScript compiles: `bun run tsc:check`
575
- - [x] Tests pass: `bun test`
576
-
577
- #### Manual Verification:
578
- - [ ] Create a new agent via `join-swarm` MCP tool
579
- - [ ] Check the agent's `claudeMd` field is populated with the default template
580
- - [ ] Verify the template includes the agent's name, role, etc.
581
-
582
- **Implementation Note**: This phase is optional and can be deferred. After completing, pause for manual confirmation.
583
-
584
- ---
585
-
586
- ## Testing Strategy
587
-
588
- ### Unit Tests
589
- - Add tests for `generateDefaultClaudeMd()` function
590
- - Add tests for `updateAgentProfile()` with `claudeMd` field
591
-
592
- ### Integration Tests
593
- - Test HTTP API endpoint with `claudeMd` in request body
594
- - Test MCP tool with `claudeMd` parameter
595
-
596
- ### Manual Testing
597
- 1. **Full flow test**:
598
- - Create agent or set `claudeMd` via UI
599
- - Start Claude Code session
600
- - Verify `~/.claude/CLAUDE.md` has agent's content
601
- - Add notes to the file during session
602
- - Exit session
603
- - Verify changes synced back to database
604
- - Verify original `~/.claude/CLAUDE.md` restored
605
-
606
- 2. **Edge cases**:
607
- - Agent with no `claudeMd` set (should not write file)
608
- - Existing `~/.claude/CLAUDE.md` file (backup/restore)
609
- - Large `claudeMd` content (~64KB)
610
- - Empty `claudeMd` content
611
-
612
- ## References
613
- - Research document: `thoughts/taras/research/2026-01-28-per-worker-claude-md.md`
614
- - Agent schema: `src/be/db.ts:48-58`
615
- - Profile update function: `src/be/db.ts:2117-2147`
616
- - Hook handler: `src/hooks/hook.ts:105-506`
617
- - UI modal: `ui/src/components/EditAgentProfileModal.tsx`