macro-agent 0.0.11 → 0.0.12

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 (408) hide show
  1. package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +6 -0
  16. package/.sudocode/specs.jsonl +7 -0
  17. package/CLAUDE.md +110 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +25 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +93 -7
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent-detection/command-builder.d.ts +30 -0
  38. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  39. package/dist/agent-detection/command-builder.js +71 -0
  40. package/dist/agent-detection/command-builder.js.map +1 -0
  41. package/dist/agent-detection/detector.d.ts +84 -0
  42. package/dist/agent-detection/detector.d.ts.map +1 -0
  43. package/dist/agent-detection/detector.js +240 -0
  44. package/dist/agent-detection/detector.js.map +1 -0
  45. package/dist/agent-detection/index.d.ts +12 -0
  46. package/dist/agent-detection/index.d.ts.map +1 -0
  47. package/dist/agent-detection/index.js +14 -0
  48. package/dist/agent-detection/index.js.map +1 -0
  49. package/dist/agent-detection/registry.d.ts +53 -0
  50. package/dist/agent-detection/registry.d.ts.map +1 -0
  51. package/dist/agent-detection/registry.js +177 -0
  52. package/dist/agent-detection/registry.js.map +1 -0
  53. package/dist/agent-detection/types.d.ts +121 -0
  54. package/dist/agent-detection/types.d.ts.map +1 -0
  55. package/dist/agent-detection/types.js +20 -0
  56. package/dist/agent-detection/types.js.map +1 -0
  57. package/dist/api/server.d.ts.map +1 -1
  58. package/dist/api/server.js +95 -0
  59. package/dist/api/server.js.map +1 -1
  60. package/dist/cli/index.js +29 -0
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/mcp.js +38 -0
  63. package/dist/cli/mcp.js.map +1 -1
  64. package/dist/config/index.d.ts +2 -0
  65. package/dist/config/index.d.ts.map +1 -0
  66. package/dist/config/index.js +2 -0
  67. package/dist/config/index.js.map +1 -0
  68. package/dist/config/project-config.d.ts +46 -0
  69. package/dist/config/project-config.d.ts.map +1 -0
  70. package/dist/config/project-config.js +68 -0
  71. package/dist/config/project-config.js.map +1 -0
  72. package/dist/lifecycle/cascade.d.ts +1 -1
  73. package/dist/lifecycle/cascade.d.ts.map +1 -1
  74. package/dist/lifecycle/handlers/index.d.ts +4 -0
  75. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  76. package/dist/lifecycle/handlers/index.js +2 -0
  77. package/dist/lifecycle/handlers/index.js.map +1 -1
  78. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  79. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  80. package/dist/lifecycle/handlers/worker.js +35 -3
  81. package/dist/lifecycle/handlers/worker.js.map +1 -1
  82. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  83. package/dist/map/adapter/acp-over-map.js +32 -2
  84. package/dist/map/adapter/acp-over-map.js.map +1 -1
  85. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  86. package/dist/map/adapter/event-translator.js +1 -0
  87. package/dist/map/adapter/event-translator.js.map +1 -1
  88. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  89. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  91. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  92. package/dist/map/adapter/extensions/index.d.ts +10 -1
  93. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  94. package/dist/map/adapter/extensions/index.js +39 -0
  95. package/dist/map/adapter/extensions/index.js.map +1 -1
  96. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  97. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/resume.js +59 -0
  99. package/dist/map/adapter/extensions/resume.js.map +1 -0
  100. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  101. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  102. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  103. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  104. package/dist/mcp/mcp-server.d.ts +6 -0
  105. package/dist/mcp/mcp-server.d.ts.map +1 -1
  106. package/dist/mcp/mcp-server.js +45 -0
  107. package/dist/mcp/mcp-server.js.map +1 -1
  108. package/dist/mcp/tools/claim_task.d.ts +35 -0
  109. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  110. package/dist/mcp/tools/claim_task.js +58 -0
  111. package/dist/mcp/tools/claim_task.js.map +1 -0
  112. package/dist/mcp/tools/done.d.ts +11 -2
  113. package/dist/mcp/tools/done.d.ts.map +1 -1
  114. package/dist/mcp/tools/done.js +15 -10
  115. package/dist/mcp/tools/done.js.map +1 -1
  116. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  117. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  118. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  119. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  120. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  121. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  122. package/dist/mcp/tools/unclaim_task.js +47 -0
  123. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  124. package/dist/metrics/index.d.ts +2 -0
  125. package/dist/metrics/index.d.ts.map +1 -0
  126. package/dist/metrics/index.js +2 -0
  127. package/dist/metrics/index.js.map +1 -0
  128. package/dist/metrics/metrics.d.ts +79 -0
  129. package/dist/metrics/metrics.d.ts.map +1 -0
  130. package/dist/metrics/metrics.js +166 -0
  131. package/dist/metrics/metrics.js.map +1 -0
  132. package/dist/roles/capabilities.d.ts +1 -0
  133. package/dist/roles/capabilities.d.ts.map +1 -1
  134. package/dist/roles/capabilities.js +3 -0
  135. package/dist/roles/capabilities.js.map +1 -1
  136. package/dist/roles/types.d.ts +1 -1
  137. package/dist/roles/types.d.ts.map +1 -1
  138. package/dist/router/message-router.d.ts +41 -0
  139. package/dist/router/message-router.d.ts.map +1 -1
  140. package/dist/router/message-router.js +136 -5
  141. package/dist/router/message-router.js.map +1 -1
  142. package/dist/store/event-store.d.ts +8 -1
  143. package/dist/store/event-store.d.ts.map +1 -1
  144. package/dist/store/event-store.js +120 -4
  145. package/dist/store/event-store.js.map +1 -1
  146. package/dist/store/types/agents.d.ts +1 -1
  147. package/dist/store/types/agents.d.ts.map +1 -1
  148. package/dist/store/types/events.d.ts +1 -1
  149. package/dist/store/types/events.d.ts.map +1 -1
  150. package/dist/store/types/events.js.map +1 -1
  151. package/dist/store/types/index.d.ts +1 -0
  152. package/dist/store/types/index.d.ts.map +1 -1
  153. package/dist/store/types/index.js +1 -0
  154. package/dist/store/types/index.js.map +1 -1
  155. package/dist/store/types/sessions.d.ts +44 -0
  156. package/dist/store/types/sessions.d.ts.map +1 -0
  157. package/dist/store/types/sessions.js +9 -0
  158. package/dist/store/types/sessions.js.map +1 -0
  159. package/dist/store/types/tasks.d.ts +2 -0
  160. package/dist/store/types/tasks.d.ts.map +1 -1
  161. package/dist/task/backend/memory.d.ts +4 -1
  162. package/dist/task/backend/memory.d.ts.map +1 -1
  163. package/dist/task/backend/memory.js +81 -0
  164. package/dist/task/backend/memory.js.map +1 -1
  165. package/dist/task/backend/types.d.ts +30 -0
  166. package/dist/task/backend/types.d.ts.map +1 -1
  167. package/dist/task/backend/types.js.map +1 -1
  168. package/dist/teams/index.d.ts +4 -0
  169. package/dist/teams/index.d.ts.map +1 -0
  170. package/dist/teams/index.js +4 -0
  171. package/dist/teams/index.js.map +1 -0
  172. package/dist/teams/team-loader.d.ts +20 -0
  173. package/dist/teams/team-loader.d.ts.map +1 -0
  174. package/dist/teams/team-loader.js +293 -0
  175. package/dist/teams/team-loader.js.map +1 -0
  176. package/dist/teams/team-runtime.d.ts +139 -0
  177. package/dist/teams/team-runtime.d.ts.map +1 -0
  178. package/dist/teams/team-runtime.js +613 -0
  179. package/dist/teams/team-runtime.js.map +1 -0
  180. package/dist/teams/types.d.ts +266 -0
  181. package/dist/teams/types.d.ts.map +1 -0
  182. package/dist/teams/types.js +20 -0
  183. package/dist/teams/types.js.map +1 -0
  184. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  185. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  186. package/dist/workspace/dataplane-adapter.js +1 -1
  187. package/dist/workspace/dataplane-adapter.js.map +1 -1
  188. package/dist/workspace/index.d.ts +1 -1
  189. package/dist/workspace/index.d.ts.map +1 -1
  190. package/dist/workspace/strategies/index.d.ts +6 -0
  191. package/dist/workspace/strategies/index.d.ts.map +1 -0
  192. package/dist/workspace/strategies/index.js +5 -0
  193. package/dist/workspace/strategies/index.js.map +1 -0
  194. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  195. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  196. package/dist/workspace/strategies/optimistic.js +121 -0
  197. package/dist/workspace/strategies/optimistic.js.map +1 -0
  198. package/dist/workspace/strategies/queue.d.ts +26 -0
  199. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  200. package/dist/workspace/strategies/queue.js +67 -0
  201. package/dist/workspace/strategies/queue.js.map +1 -0
  202. package/dist/workspace/strategies/registry.d.ts +37 -0
  203. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  204. package/dist/workspace/strategies/registry.js +63 -0
  205. package/dist/workspace/strategies/registry.js.map +1 -0
  206. package/dist/workspace/strategies/trunk.d.ts +20 -0
  207. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  208. package/dist/workspace/strategies/trunk.js +108 -0
  209. package/dist/workspace/strategies/trunk.js.map +1 -0
  210. package/dist/workspace/strategies/types.d.ts +104 -0
  211. package/dist/workspace/strategies/types.d.ts.map +1 -0
  212. package/dist/workspace/strategies/types.js +11 -0
  213. package/dist/workspace/strategies/types.js.map +1 -0
  214. package/dist/workspace/types.d.ts +1 -1
  215. package/dist/workspace/types.d.ts.map +1 -1
  216. package/dist/workspace/workspace-manager.d.ts +1 -1
  217. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  218. package/docs/implementation-details.md +1127 -0
  219. package/docs/implementation-summary.md +448 -0
  220. package/docs/plan-self-driving-support.md +433 -0
  221. package/docs/spec-self-driving-support.md +462 -0
  222. package/docs/team-templates.md +860 -0
  223. package/docs/teams.md +233 -0
  224. package/package.json +4 -2
  225. package/src/acp/__tests__/integration.test.ts +161 -1
  226. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  227. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  228. package/src/acp/macro-agent.ts +79 -7
  229. package/src/acp/session-mapper.ts +108 -1
  230. package/src/acp/types.ts +33 -1
  231. package/src/agent/agent-manager.ts +158 -6
  232. package/src/agent/types.ts +27 -0
  233. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  234. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  235. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  236. package/src/agent-detection/command-builder.ts +90 -0
  237. package/src/agent-detection/detector.ts +307 -0
  238. package/src/agent-detection/index.ts +36 -0
  239. package/src/agent-detection/registry.ts +200 -0
  240. package/src/agent-detection/types.ts +184 -0
  241. package/src/api/server.ts +110 -0
  242. package/src/cli/index.ts +44 -0
  243. package/src/cli/mcp.ts +47 -0
  244. package/src/config/index.ts +9 -0
  245. package/src/config/project-config.ts +107 -0
  246. package/src/lifecycle/cascade.ts +1 -1
  247. package/src/lifecycle/handlers/index.ts +8 -0
  248. package/src/lifecycle/handlers/worker.ts +48 -3
  249. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  250. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  251. package/src/map/adapter/acp-over-map.ts +45 -2
  252. package/src/map/adapter/event-translator.ts +1 -0
  253. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  254. package/src/map/adapter/extensions/index.ts +63 -0
  255. package/src/map/adapter/extensions/resume.ts +114 -0
  256. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  257. package/src/mcp/mcp-server.ts +67 -0
  258. package/src/mcp/tools/claim_task.ts +86 -0
  259. package/src/mcp/tools/done.ts +24 -10
  260. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  261. package/src/mcp/tools/unclaim_task.ts +71 -0
  262. package/src/metrics/index.ts +9 -0
  263. package/src/metrics/metrics.ts +280 -0
  264. package/src/roles/capabilities.ts +3 -0
  265. package/src/roles/types.ts +2 -1
  266. package/src/router/__tests__/message-router.test.ts +561 -0
  267. package/src/router/message-router.ts +223 -6
  268. package/src/store/event-store.ts +151 -3
  269. package/src/store/types/agents.ts +1 -1
  270. package/src/store/types/events.ts +2 -1
  271. package/src/store/types/index.ts +1 -0
  272. package/src/store/types/sessions.ts +53 -0
  273. package/src/store/types/tasks.ts +3 -0
  274. package/src/task/backend/memory.ts +116 -0
  275. package/src/task/backend/types.ts +43 -0
  276. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  277. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  278. package/src/teams/__tests__/team-system.test.ts +1280 -0
  279. package/src/teams/index.ts +13 -0
  280. package/src/teams/team-loader.ts +434 -0
  281. package/src/teams/team-runtime.ts +727 -0
  282. package/src/teams/types.ts +377 -0
  283. package/src/workspace/dataplane-adapter.ts +1 -1
  284. package/src/workspace/index.ts +1 -1
  285. package/src/workspace/strategies/index.ts +18 -0
  286. package/src/workspace/strategies/optimistic.ts +136 -0
  287. package/src/workspace/strategies/queue.ts +81 -0
  288. package/src/workspace/strategies/registry.ts +89 -0
  289. package/src/workspace/strategies/trunk.ts +123 -0
  290. package/src/workspace/strategies/types.ts +145 -0
  291. package/src/workspace/types.ts +1 -1
  292. package/src/workspace/workspace-manager.ts +1 -1
  293. package/.claude/settings.local.json +0 -59
  294. package/dist/map/utils/address-translation.d.ts +0 -99
  295. package/dist/map/utils/address-translation.d.ts.map +0 -1
  296. package/dist/map/utils/address-translation.js +0 -285
  297. package/dist/map/utils/address-translation.js.map +0 -1
  298. package/dist/map/utils/index.d.ts +0 -7
  299. package/dist/map/utils/index.d.ts.map +0 -1
  300. package/dist/map/utils/index.js +0 -7
  301. package/dist/map/utils/index.js.map +0 -1
  302. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  303. package/references/acp-factory-ref/LICENSE +0 -21
  304. package/references/acp-factory-ref/README.md +0 -341
  305. package/references/acp-factory-ref/package-lock.json +0 -3102
  306. package/references/acp-factory-ref/package.json +0 -96
  307. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  308. package/references/acp-factory-ref/python/LICENSE +0 -21
  309. package/references/acp-factory-ref/python/Makefile +0 -57
  310. package/references/acp-factory-ref/python/README.md +0 -253
  311. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  312. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  313. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  314. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  315. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  316. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  317. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  318. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  319. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  320. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  321. package/references/claude-code-acp/.prettierrc.json +0 -4
  322. package/references/claude-code-acp/CHANGELOG.md +0 -249
  323. package/references/claude-code-acp/LICENSE +0 -222
  324. package/references/claude-code-acp/README.md +0 -53
  325. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  326. package/references/claude-code-acp/eslint.config.js +0 -48
  327. package/references/claude-code-acp/package-lock.json +0 -4570
  328. package/references/claude-code-acp/package.json +0 -88
  329. package/references/claude-code-acp/scripts/release.sh +0 -119
  330. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  331. package/references/claude-code-acp/src/index.ts +0 -26
  332. package/references/claude-code-acp/src/lib.ts +0 -38
  333. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  334. package/references/claude-code-acp/src/settings.ts +0 -522
  335. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  336. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  337. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  338. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  339. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  340. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  341. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  342. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  343. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  344. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  345. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  346. package/references/claude-code-acp/src/tools.ts +0 -819
  347. package/references/claude-code-acp/src/utils.ts +0 -171
  348. package/references/claude-code-acp/tsconfig.json +0 -18
  349. package/references/claude-code-acp/vitest.config.ts +0 -19
  350. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
  351. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
  352. package/references/multi-agent-protocol/LICENSE +0 -21
  353. package/references/multi-agent-protocol/README.md +0 -113
  354. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
  355. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  356. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  357. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  358. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  359. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  360. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  361. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  362. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  363. package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
  364. package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
  365. package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
  366. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
  367. package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
  368. package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
  369. package/references/multi-agent-protocol/docs-site/README.md +0 -82
  370. package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
  371. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
  372. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
  373. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
  374. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
  375. package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
  376. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
  377. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
  378. package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
  379. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
  380. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
  381. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
  382. package/references/multi-agent-protocol/docs-site/index.md +0 -136
  383. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
  384. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
  385. package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
  386. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
  387. package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
  388. package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
  389. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
  390. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
  391. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
  392. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
  393. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
  394. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
  395. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
  396. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
  397. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
  398. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
  399. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
  400. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
  401. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
  402. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
  403. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
  404. package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
  405. package/references/multi-agent-protocol/package-lock.json +0 -3886
  406. package/references/multi-agent-protocol/package.json +0 -56
  407. package/references/multi-agent-protocol/schema/meta.json +0 -467
  408. package/references/multi-agent-protocol/schema/schema.json +0 -2558
@@ -0,0 +1,462 @@
1
+ # Spec: Self-Driving Codebases Support
2
+
3
+ Implementation specification for adding modular team templates, pluggable integration strategies, task pull model, and session continuations to macro-agent.
4
+
5
+ ## Overview
6
+
7
+ Enable macro-agent to support multiple agent team configurations — from the existing structured coordinator/integrator/worker pattern to Cursor-style autonomous self-driving teams with planners, workers, and judges — through a declarative team template layer on top of the existing role-agnostic core.
8
+
9
+ ### Companion Documents
10
+
11
+ | Document | Purpose |
12
+ |----------|---------|
13
+ | [plan-self-driving-support.md](plan-self-driving-support.md) | High-level plan, design decisions D1-D5, phase overview |
14
+ | [team-templates.md](team-templates.md) | Team template format, communication topology, examples |
15
+ | [implementation-details.md](implementation-details.md) | Resolved ambiguities A1-A10, concrete code integration points |
16
+
17
+ ---
18
+
19
+ ## Resolved Design Decisions
20
+
21
+ The following decisions were discussed and agreed upon. They are binding for implementation.
22
+
23
+ ### RD1: Fix hardcoded `done()` capability check (Prerequisite)
24
+
25
+ `src/mcp/tools/done.ts:98-103` hardcodes which roles can call `done()`. This blocks team-defined roles from completing.
26
+
27
+ **Decision**: Replace the hardcoded role set with a proper `roleRegistry.hasCapability(role, 'lifecycle.done')` lookup. The `RoleRegistry` must be accessible from the MCP subprocess (it already is via the `roleRegistry` field on `MCPServices`).
28
+
29
+ **Scope**: Prerequisite work before Phase 1. Small, isolated change.
30
+
31
+ ### RD2: Team config shared via EventStore
32
+
33
+ The MCP server runs as a subprocess communicating via stdio. It shares state with the main process through a SQLite-backed EventStore (same `instanceId`).
34
+
35
+ **Decision**: Store team configuration in the EventStore as a `team_config` event when the team initializes. The MCP subprocess reads this event to reconstruct team context (integration strategy name, task mode, communication enforcement level). The subprocess instantiates the integration strategy from the default registry using the stored config.
36
+
37
+ **Rationale**: The EventStore is already the cross-process shared state channel. This avoids adding an HTTP API between main process and MCP subprocess. The MCP subprocess already calls `eventStore.reload()` to get fresh data.
38
+
39
+ **Implementation**:
40
+ ```
41
+ Main process (TeamRuntime.initialize()):
42
+ 1. Store team_config event with { strategy, strategyConfig, taskMode, enforcement, teamName }
43
+ 2. Event persists to SQLite
44
+
45
+ MCP subprocess (mcp.ts):
46
+ 1. Read team_config event from EventStore (after agent lookup)
47
+ 2. If present: instantiate strategy from registry, set taskMode
48
+ 3. Pass to MCPServices → DoneToolDeps → handler deps
49
+ 4. If absent: existing behavior (mergeQueue fallback)
50
+ ```
51
+
52
+ ### RD3: spawn_rules generate capabilities
53
+
54
+ Team manifest `spawn_rules` are syntactic sugar over the capability system.
55
+
56
+ **Decision**: `TeamLoader` translates spawn rules into capability additions on the role definition. `planner: [grinder, planner]` becomes `capabilities_add: ['agent.spawn.grinder', 'agent.spawn.planner']`. The existing `AgentManager.spawn()` capability check runs unchanged.
57
+
58
+ **Why not override**: A single enforcement mechanism is easier to reason about. Spawn rules make the manifest readable; capabilities are the enforcement layer.
59
+
60
+ ### RD4: Team prompt replaces base role systemPrompt
61
+
62
+ When a team provides `prompts/planner.md`, it is the sole role-level prompt for that agent.
63
+
64
+ **Decision**: `customPrompt` in `SpawnAgentOptions` replaces `resolvedRole.systemPrompt` in prompt assembly. The base coordinator's `systemPrompt` is not appended. The team author owns the full role prompt — they can include coordinator-like instructions if needed.
65
+
66
+ **Rationale**: The base role's `systemPrompt` will eventually be factored into a dedicated team topology. Keeping it out of team-loaded agents avoids conflicting instructions.
67
+
68
+ ### RD5: Optimistic strategy is thin — validation is the judge's job
69
+
70
+ The `OptimisticIntegrationStrategy.land()` pushes changes and emits a `validation:requested` event. It does not run build/test/lint.
71
+
72
+ **Decision**: Validation (build, test, fixup task creation, green branch snapshotting) is the responsibility of the judge agent, driven by its role prompt and the team's communication topology. The strategy is intentionally simple.
73
+
74
+ ### RD6: Team selection via macro-agent config, not just CLI flag
75
+
76
+ Rather than requiring `--team` on every invocation, the active team is stored in macro-agent project-level configuration.
77
+
78
+ **Decision**: Add a `team` field to `.macro-agent/config.json` (new file, alongside existing `.macro-agent/roles.json`). The CLI `--team` flag overrides the config. When neither is set, no team is loaded (existing behavior).
79
+
80
+ ```json
81
+ // .macro-agent/config.json
82
+ {
83
+ "team": "self-driving"
84
+ }
85
+ ```
86
+
87
+ **Loading priority**: CLI `--team` flag > `.macro-agent/config.json` > no team (default)
88
+
89
+ ### RD7: YAML library
90
+
91
+ **Decision**: Use `js-yaml` (MIT license, most widely used, stable). Add as a runtime dependency.
92
+
93
+ ---
94
+
95
+ ## Requirements
96
+
97
+ ### Phase 0: Prerequisites
98
+
99
+ #### P0.1: Fix done() capability check
100
+
101
+ | | |
102
+ |---|---|
103
+ | **What** | Replace hardcoded role set in `hasLifecycleDoneCapability()` with `roleRegistry.hasCapability()` lookup |
104
+ | **Where** | `src/mcp/tools/done.ts` |
105
+ | **Input** | Agent ID, EventStore, RoleRegistry |
106
+ | **Output** | `{ hasCapability: boolean, role: string }` using actual capability resolution |
107
+ | **Constraint** | RoleRegistry must be passed through to the done tool. Currently `MCPServices` has an optional `roleRegistry` field — make it required or ensure it's always provided |
108
+ | **Success** | Team-defined roles (planner, grinder, judge) that extend built-in roles and inherit `lifecycle.done` can call `done()` |
109
+ | **Test** | Unit test: register a custom role extending "worker" via RoleRegistry, verify `hasLifecycleDoneCapability` returns true |
110
+
111
+ #### P0.2: Add macro-agent config loader
112
+
113
+ | | |
114
+ |---|---|
115
+ | **What** | Read `.macro-agent/config.json` for project-level settings (starting with `team` field) |
116
+ | **Where** | New: `src/config/project-config.ts` |
117
+ | **Schema** | `{ team?: string, [key: string]: unknown }` |
118
+ | **Loading** | On CLI start/chat, read config file. CLI flags override. Missing file = empty config |
119
+ | **Success** | `loadProjectConfig(projectPath?)` returns parsed config or defaults |
120
+ | **Test** | Unit test: read valid config, missing file, invalid JSON |
121
+
122
+ ### Phase 1: Team Template System
123
+
124
+ #### P1.1: TeamManifest types
125
+
126
+ | | |
127
+ |---|---|
128
+ | **What** | TypeScript types for the full team manifest schema |
129
+ | **Where** | New: `src/teams/types.ts` |
130
+ | **Types** | `TeamManifest`, `TeamTopology`, `TopologyNode`, `TeamCommunication`, `ChannelDefinition`, `ChannelSubscription`, `CommunicationRouting`, `PeerConnection`, `MacroAgentExtensions`, `TeamRoleDefinition`, `ResolvedTeamRole` |
131
+ | **Constraint** | Generic fields (name, roles, topology, communication) separated from `macro_agent` namespace per interoperability design in team-templates.md |
132
+ | **Success** | Types compile, accurately represent team.yaml schema |
133
+ | **Test** | Type-level only (compile check) |
134
+
135
+ #### P1.2: TeamLoader
136
+
137
+ | | |
138
+ |---|---|
139
+ | **What** | Reads `.macro-agent/teams/<name>/` directory, parses and validates team.yaml, resolves role inheritance, loads prompts, loads MCP server configs |
140
+ | **Where** | New: `src/teams/team-loader.ts` |
141
+ | **Interface** | `TeamLoader.load(teamName: string, basePath?: string): Promise<TeamManifest>` |
142
+ | **Dependencies** | `js-yaml` (new), `zod` (existing), `RoleRegistry` (for resolving `extends` chains) |
143
+ | **Steps** | 1. Resolve directory path 2. Parse team.yaml 3. Validate with Zod 4. For each role: load YAML, resolve extends, compute capabilities (add/remove), translate spawn_rules to capabilities (RD3) 5. Load prompt files 6. Load tools/mcp-servers.json 7. Validate communication topology (all refs exist) |
144
+ | **Errors** | Typed `TeamLoadError` with codes: `MANIFEST_NOT_FOUND`, `INVALID_MANIFEST`, `ROLE_NOT_FOUND`, `PROMPT_NOT_FOUND`, `INVALID_COMMUNICATION` |
145
+ | **Success** | Given a valid team directory, returns fully resolved `TeamManifest` with computed capabilities, loaded prompts, and MCP server configs |
146
+ | **Test** | Unit tests with fixture directories: valid team, missing manifest, invalid schema, broken extends chain, missing prompt, invalid communication refs |
147
+
148
+ #### P1.3: TeamRuntime
149
+
150
+ | | |
151
+ |---|---|
152
+ | **What** | Wires a loaded TeamManifest into running services |
153
+ | **Where** | New: `src/teams/team-runtime.ts` |
154
+ | **Interface** | `TeamRuntime` class with `initialize()`, `bootstrap()`, `teardown()`, getters for strategy/taskMode/topics/prompts |
155
+ | **initialize()** | 1. Register team roles into RoleRegistry (highest priority layer) 2. Instantiate IntegrationStrategy from registry 3. Store team_config event in EventStore (RD2) 4. Register spawn interceptor on AgentManager |
156
+ | **bootstrap()** | 1. Spawn root agent per `topology.root` 2. Spawn companions per `topology.companions` (parent: null) 3. Set up peer subscriptions between root and companions 4. Return `{ rootId, companionIds }` |
157
+ | **Spawn interceptor** | Modifies `SpawnAgentOptions` to inject: team topics from communication topology, team MCP servers, team prompt (customPrompt), team env vars, role channel subscription |
158
+ | **Dependencies** | RoleRegistry, AgentManager, MessageRouter, EventStore |
159
+ | **Success** | After `initialize()`: team roles resolvable, strategy available, config in EventStore. After `bootstrap()`: root + companion agents running with correct subscriptions/prompts |
160
+ | **Test** | Unit test with mocked services: verify role registration, strategy selection, event emission, spawn interceptor output. Integration test: full load → initialize → bootstrap cycle |
161
+
162
+ #### P1.4: Spawn interceptor hook on AgentManager
163
+
164
+ | | |
165
+ |---|---|
166
+ | **What** | Add optional `spawnInterceptor` to AgentManager that transforms `SpawnAgentOptions` before spawn proceeds |
167
+ | **Where** | Modified: `src/agent/agent-manager.ts` |
168
+ | **Interface** | `setSpawnInterceptor(fn: SpawnInterceptor)` method. `SpawnInterceptor = (options: SpawnAgentOptions) => SpawnAgentOptions \| Promise<SpawnAgentOptions>` |
169
+ | **Hook point** | After options destructuring, before capability checks. Interceptor can modify topics, config, customPrompt, env vars |
170
+ | **New field** | Add `customPrompt?: string` to `SpawnAgentOptions` |
171
+ | **Prompt assembly** | When `customPrompt` is set, use it instead of `resolvedRole.systemPrompt` (RD4) |
172
+ | **Constraint** | When no interceptor is set, spawn behavior is identical to current (backward compatible) |
173
+ | **Success** | Interceptor can inject topics, MCP servers, prompt, env vars into spawn options |
174
+ | **Test** | Unit test: spawn with interceptor, verify modified options are applied. Spawn without interceptor, verify identical behavior |
175
+
176
+ #### P1.5: System prompt team support
177
+
178
+ | | |
179
+ |---|---|
180
+ | **What** | Support `customPrompt` and interaction pattern injection in system prompt generation |
181
+ | **Where** | Modified: `src/agent/agent-manager.ts` (prompt assembly section), optionally `src/agent/system-prompt.ts` |
182
+ | **Change** | When `customPrompt` is provided in spawn options: append it as `# Role Instructions` section, skip `resolvedRole.systemPrompt`. Append interaction pattern sections after role prompt. |
183
+ | **Interaction patterns** | Auto-generated text sections based on team config: pull mode instructions, trunk integration notes, continuation guidelines. Generated by TeamRuntime, passed via spawn interceptor |
184
+ | **Success** | Agent spawned with team prompt has correct system prompt: base sections + team prompt + interaction patterns + tools + guidelines |
185
+ | **Test** | Unit test: generate prompt with customPrompt set, verify structure. Generate without, verify existing behavior |
186
+
187
+ #### P1.6: CLI and config integration
188
+
189
+ | | |
190
+ |---|---|
191
+ | **What** | Add `--team <name>` CLI flag, read `.macro-agent/config.json`, initialize TeamRuntime in start/chat flows |
192
+ | **Where** | Modified: `src/cli/index.ts` |
193
+ | **Flow** | 1. Read project config (P0.2) 2. Determine team name (CLI flag > config > none) 3. If team: load via TeamLoader, create TeamRuntime, initialize, then bootstrap after server starts |
194
+ | **Constraint** | Chat command also supports team loading (interactive mode with team agents) |
195
+ | **Success** | `multiagent-cli start --team self-driving` loads team, bootstraps agents. `multiagent-cli start` with `.macro-agent/config.json` containing `"team": "self-driving"` does the same |
196
+ | **Test** | Integration test: CLI start with team flag, verify agents spawned with correct roles |
197
+
198
+ #### P1.7: MCP subprocess team context
199
+
200
+ | | |
201
+ |---|---|
202
+ | **What** | MCP subprocess reads team config from EventStore and reconstructs team context |
203
+ | **Where** | Modified: `src/cli/mcp.ts`, `src/mcp/mcp-server.ts` |
204
+ | **Flow** | 1. After EventStore connection (mcp.ts:61), query for `team_config` event 2. If found: instantiate strategy from `IntegrationStrategyRegistry`, set taskMode 3. Pass strategy and taskMode through `MCPServices` → `DoneToolDeps` |
205
+ | **New MCPServices fields** | `integrationStrategy?: IntegrationStrategy`, `taskMode?: 'push' \| 'pull'` |
206
+ | **Constraint** | When no team_config event exists, all new fields are undefined (backward compatible) |
207
+ | **Success** | Worker agent in a team calls `done()` → handler dispatches to correct integration strategy |
208
+ | **Test** | Integration test: emit team_config event, start MCP subprocess, verify strategy is available in done handler |
209
+
210
+ #### P1.8: API endpoint
211
+
212
+ | | |
213
+ |---|---|
214
+ | **What** | `GET /api/team` returns active team info |
215
+ | **Where** | Modified: `src/api/server.ts` |
216
+ | **Response** | `{ active: true, name, roles, topology, strategy, taskMode }` or `{ active: false }` |
217
+ | **Success** | Endpoint returns team config when team is loaded, returns inactive otherwise |
218
+ | **Test** | Unit test with mocked APIServices |
219
+
220
+ #### P1.9: Reference self-driving template
221
+
222
+ | | |
223
+ |---|---|
224
+ | **What** | Complete team template for the self-driving pattern |
225
+ | **Where** | New: `.macro-agent/teams/self-driving/` with team.yaml, roles/*.yaml, prompts/*.md |
226
+ | **Roles** | planner (extends coordinator), grinder (extends worker), judge (extends monitor) |
227
+ | **Topology** | Root: planner. Companions: judge. spawn_rules: planner→[grinder,planner], others→[] |
228
+ | **Communication** | Channels: task_updates, work_coordination, health. Peer routes: judge↔planner |
229
+ | **Integration** | trunk strategy |
230
+ | **Task mode** | pull |
231
+ | **Success** | `TeamLoader.load('self-driving')` succeeds and returns a valid manifest |
232
+ | **Test** | Validated by TeamLoader unit tests |
233
+
234
+ ### Phase 2: Pluggable Integration Strategies
235
+
236
+ #### P2.1: IntegrationStrategy interface and registry
237
+
238
+ | | |
239
+ |---|---|
240
+ | **What** | Strategy interface, LandRequest/LandResult types, and a registry with factory pattern |
241
+ | **Where** | New: `src/workspace/strategies/types.ts`, `src/workspace/strategies/registry.ts` |
242
+ | **Interface** | `IntegrationStrategy { name, land(request), initialize?(), close?() }` |
243
+ | **Registry** | `IntegrationStrategyRegistry { register(name, factory), get(name, config), has(name), list() }` |
244
+ | **Default instance** | `defaultStrategyRegistry` with queue, trunk, optimistic registered |
245
+ | **Success** | `registry.get('trunk', { maxRetries: 3 })` returns a TrunkIntegrationStrategy instance |
246
+ | **Test** | Unit test: register, get, factory invocation, unknown name throws |
247
+
248
+ #### P2.2: QueueIntegrationStrategy
249
+
250
+ | | |
251
+ |---|---|
252
+ | **What** | Wraps existing MergeQueueInterface — same behavior as current worker done() handler |
253
+ | **Where** | New: `src/workspace/strategies/queue.ts` |
254
+ | **Behavior** | Receives MergeQueueInterface at construction. `land()` submits merge request to queue |
255
+ | **Constraint** | Must produce identical behavior to current worker.ts Step 4 merge queue path |
256
+ | **Success** | Existing merge queue tests pass when routed through QueueIntegrationStrategy |
257
+ | **Test** | Unit test with mocked MergeQueueInterface |
258
+
259
+ #### P2.3: TrunkIntegrationStrategy
260
+
261
+ | | |
262
+ |---|---|
263
+ | **What** | Direct push to integration branch with rebase-and-retry on conflict |
264
+ | **Where** | New: `src/workspace/strategies/trunk.ts` |
265
+ | **Config** | `maxRetries` (default: 3), `conflictAction` ('abandon' \| 'queued_for_resolution') |
266
+ | **Behavior** | fetch → rebase → push. On conflict: abort rebase, retry. On exhaustion: return conflict result |
267
+ | **Git operations** | Thin wrapper around child_process git commands (or reuse workspace git helpers if they exist) |
268
+ | **Success** | Pushes cleanly when no conflict. Retries on conflict. Returns appropriate LandResult |
269
+ | **Test** | Unit test with git repo fixture: clean push, conflict + retry, exhaustion |
270
+
271
+ #### P2.4: OptimisticIntegrationStrategy
272
+
273
+ | | |
274
+ |---|---|
275
+ | **What** | Push immediately, emit validation event. No blocking validation (RD5) |
276
+ | **Where** | New: `src/workspace/strategies/optimistic.ts` |
277
+ | **Behavior** | Push to integration branch. Emit `validation:requested` event via EventStore. Return landed |
278
+ | **Constraint** | Does not run build/test. Validation is the judge's responsibility |
279
+ | **Success** | Push succeeds, event emitted. On push conflict: rebase + retry (same as trunk) |
280
+ | **Test** | Unit test: verify push and event emission |
281
+
282
+ #### P2.5: Worker handler refactor
283
+
284
+ | | |
285
+ |---|---|
286
+ | **What** | Add strategy dispatch to worker done() handler |
287
+ | **Where** | Modified: `src/lifecycle/handlers/worker.ts`, `src/lifecycle/handlers/index.ts` |
288
+ | **New deps** | `integrationStrategy?: IntegrationStrategy`, `taskMode?: 'push' \| 'pull'` on `AllHandlerDeps` and `WorkerHandlerDeps` |
289
+ | **Logic** | If `integrationStrategy`: call `strategy.land()`, handle result. Else if `mergeQueue`: existing path. Pull mode: return `shouldTerminate: false` on completed status |
290
+ | **Constraint** | When neither strategy nor mergeQueue is set, skip integration (log warning). Existing tests pass unchanged |
291
+ | **Success** | Workers with trunk strategy push directly. Workers with queue strategy use merge queue. Pull-mode workers stay alive after completion |
292
+ | **Test** | Unit test: strategy dispatch, pull mode shouldTerminate, fallback to mergeQueue |
293
+
294
+ #### P2.6: Done tool dependency wiring
295
+
296
+ | | |
297
+ |---|---|
298
+ | **What** | Pass integration strategy and task mode through DoneToolDeps → AllHandlerDeps |
299
+ | **Where** | Modified: `src/mcp/tools/done.ts`, `src/mcp/mcp-server.ts` |
300
+ | **New fields** | `integrationStrategy?` and `taskMode?` on `DoneToolDeps` and `MCPServices` |
301
+ | **Success** | Strategy flows from MCPServices → DoneToolDeps → AllHandlerDeps → worker handler |
302
+ | **Test** | Integration test: full done() call with strategy set, verify land() called |
303
+
304
+ ### Phase 3: Task Pull Model
305
+
306
+ #### P3.1: Task tags
307
+
308
+ | | |
309
+ |---|---|
310
+ | **What** | Add `tags?: string[]` to task types |
311
+ | **Where** | Modified: `src/store/types/tasks.ts`, `src/task/backend/types.ts` |
312
+ | **Constraint** | Tags set at creation time via `CreateTaskOptions`. Queryable via filters |
313
+ | **Success** | Tasks can be created with tags, filtered by tags in list operations |
314
+ | **Test** | Unit test: create task with tags, filter by tags |
315
+
316
+ #### P3.2: TaskBackend claim/unclaim
317
+
318
+ | | |
319
+ |---|---|
320
+ | **What** | Add `claim()`, `unclaim()`, `listClaimable()` to TaskBackend interface and InMemoryTaskBackend |
321
+ | **Where** | Modified: `src/task/backend/types.ts`, `src/task/backend/memory.ts` |
322
+ | **claim()** | Find first matching pending task, atomically assign to agent. Return null if none available or contention |
323
+ | **unclaim()** | Return claimed task to pending status |
324
+ | **listClaimable()** | Return pending tasks matching optional filters (tags, status) |
325
+ | **Atomicity** | SQLite write serialization ensures no double-claims (see implementation-details.md A6) |
326
+ | **Success** | Agent claims task, task transitions to assigned. Two agents claiming same task: one succeeds, one gets null |
327
+ | **Test** | Unit test: claim, unclaim, contention (two claims on same task), filtered claims |
328
+
329
+ #### P3.3: MCP tools (claim_task, unclaim_task, list_claimable_tasks)
330
+
331
+ | | |
332
+ |---|---|
333
+ | **What** | Three new MCP tools for the pull model |
334
+ | **Where** | New: `src/mcp/tools/claim_task.ts`, `unclaim_task.ts`, `list_claimable_tasks.ts` |
335
+ | **Capability** | Gated by `task.claim` capability |
336
+ | **Registration** | Added to `src/mcp/mcp-server.ts` tool registration, with `task.claim` in capability map (`src/roles/capabilities.ts`) |
337
+ | **Success** | Agent with `task.claim` capability can call `claim_task()` → gets a task → works → `done()` → `claim_task()` again |
338
+ | **Test** | Unit test per tool. Integration test: claim loop cycle |
339
+
340
+ ### Phase 4: Session Continuations
341
+
342
+ #### P4.1: Resume mechanism
343
+
344
+ | | |
345
+ |---|---|
346
+ | **What** | `AgentManager.resume(agentId, options?)` loads conversation history and spawns continuation agent |
347
+ | **Where** | Modified: `src/agent/agent-manager.ts` |
348
+ | **Flow** | 1. Load agent record from EventStore 2. Load conversation turns (existing turn infrastructure) 3. Format as resume context (summarized transcript) 4. Spawn new agent with same role/task + resume context as customPrompt prefix |
349
+ | **Config** | `maxMessages` controls how many turns to include (default: 50) |
350
+ | **Success** | Resumed agent has access to prior conversation context |
351
+ | **Test** | Integration test: spawn agent, record turns, terminate, resume, verify context |
352
+
353
+ #### P4.2: Continuation lifecycle config
354
+
355
+ | | |
356
+ |---|---|
357
+ | **What** | Wire `macro_agent.lifecycle.continuations` from team manifest into agent lifecycle |
358
+ | **Where** | Modified: `src/teams/team-runtime.ts` (config propagation) |
359
+ | **Behavior** | When continuations enabled and agent terminates: eligible for resume. TeamRuntime can auto-resume daemon agents that exit unexpectedly |
360
+ | **Success** | Planner agent in self-driving team auto-resumes after unexpected termination |
361
+ | **Test** | Integration test: daemon agent terminates, TeamRuntime detects and resumes |
362
+
363
+ ### Phase 5: Autonomous Observability
364
+
365
+ #### P5.1: Metric events and views
366
+
367
+ | | |
368
+ |---|---|
369
+ | **What** | Emit metric events from done handlers and strategies. Materialized views for throughput, utilization, errors |
370
+ | **Where** | Modified: `src/store/event-store.ts` (new views), `src/lifecycle/handlers/` (emit events), `src/workspace/strategies/` (emit events) |
371
+ | **API** | `GET /api/metrics/throughput`, `/utilization`, `/errors` |
372
+ | **Success** | After a multi-agent run, API returns meaningful throughput and error metrics |
373
+ | **Test** | Unit test: view computation. Integration test: run agents, query metrics |
374
+
375
+ ### Phase 6: Reference Templates and Documentation
376
+
377
+ #### P6.1: Finalized templates and E2E test
378
+
379
+ | | |
380
+ |---|---|
381
+ | **What** | Finalize self-driving and structured reference templates. Add docs. Run E2E test |
382
+ | **Where** | `.macro-agent/teams/self-driving/`, `.macro-agent/teams/structured/`, `docs/teams.md` |
383
+ | **E2E test** | Full cycle: load self-driving team → planner creates tasks → grinders claim and complete → judge monitors → trunk integration |
384
+ | **Success** | E2E test passes. Documentation covers schema reference, custom strategy guide, examples |
385
+
386
+ ---
387
+
388
+ ## Success Criteria
389
+
390
+ ### Phase-level criteria
391
+
392
+ | Phase | Criterion |
393
+ |-------|-----------|
394
+ | **P0** | `done()` works with any role that has `lifecycle.done` capability. `.macro-agent/config.json` is read on startup |
395
+ | **P1** | `multiagent-cli start --team self-driving` loads a team, registers roles, spawns root + companions, agents have correct prompts and topics. MCP subprocess picks up team config from EventStore. Existing behavior without `--team` is unchanged |
396
+ | **P2** | Worker `done()` dispatches to configured integration strategy. `queue` strategy produces identical behavior to current merge queue. `trunk` strategy pushes directly. Existing merge queue tests pass |
397
+ | **P3** | Agents with `task.claim` capability can `claim_task()` → `done()` → `claim_task()` in a loop. Idle timeout triggers graceful exit |
398
+ | **P4** | `AgentManager.resume()` loads conversation history and spawns continuation. Daemon agents auto-resume on unexpected exit |
399
+ | **P5** | Metrics API returns throughput/utilization/error data after multi-agent run |
400
+ | **P6** | E2E test passes. Docs complete |
401
+
402
+ ### Cross-cutting criteria
403
+
404
+ | Criterion | Description |
405
+ |-----------|-------------|
406
+ | **Backward compatibility** | All existing tests pass without modification. No team loaded = identical behavior to current codebase |
407
+ | **No core rewrites** | Team system composes on top of existing primitives (RoleRegistry, MessageRouter, EventStore, AgentManager). Core modules receive surgical additions (interceptor hook, new deps fields), not rewrites |
408
+ | **Type safety** | All new types have Zod validation schemas. Team manifest validated at load time. Invalid config fails fast with clear error messages |
409
+ | **Test coverage** | Each phase has unit tests for new modules and integration tests for the wiring. Phase 6 has an E2E test for the full self-driving flow |
410
+
411
+ ---
412
+
413
+ ## Implementation Order
414
+
415
+ ```
416
+ P0 (Prerequisites) ────────────────────────────────────►
417
+ P0.1: Fix done() capability ~1 file, small
418
+ P0.2: Project config loader ~1 new file, small
419
+
420
+ P1 (Team Template System) ─────────────────────────────►
421
+ P1.1: Types ~1 new file
422
+ P1.2: TeamLoader ~1 new file + js-yaml dep
423
+ P1.3: TeamRuntime ~1 new file
424
+ P1.4: Spawn interceptor ~1 modified file
425
+ P1.5: System prompt support ~1 modified file
426
+ P1.6: CLI + config ~1 modified file
427
+ P1.7: MCP subprocess context ~2 modified files
428
+ P1.8: API endpoint ~1 modified file
429
+ P1.9: Reference template ~7 new files (yaml/md)
430
+
431
+ ┌──── P2 (Integration) ────────────────────►
432
+ │ P2.1-P2.6 (parallel with P3/P4)
433
+
434
+ P1.3 ────┼──── P3 (Task Pull) ──────────────────────►
435
+ done │ P3.1-P3.3 (parallel with P2/P4)
436
+
437
+ └──── P4 (Session Continuations) ──────────►
438
+ P4.1-P4.2 (parallel with P2/P3)
439
+
440
+ P2+P3 ──────── P5 (Observability) ──────────────────►
441
+ done P5.1
442
+
443
+ All ────────── P6 (Templates + Docs + E2E) ─────────►
444
+ done P6.1
445
+ ```
446
+
447
+ **Total new files**: ~18
448
+ **Total modified files**: ~12
449
+ **New dependency**: `js-yaml`
450
+
451
+ ---
452
+
453
+ ## Risks and Mitigations
454
+
455
+ | Risk | Impact | Mitigation |
456
+ |------|--------|------------|
457
+ | Spawn interceptor introduces subtle bugs in existing spawns | Agents fail to start or have wrong config | Interceptor is no-op when not set. Guarded by `if (spawnInterceptor)` check. Comprehensive test for both paths |
458
+ | Team config event in EventStore is stale after hot-reload | MCP subprocess uses old config | For Phase 1, no hot-reload. Config is set once at initialize(). Future: re-emit event on config change |
459
+ | SQLite contention on claim() under high worker count | Workers waste cycles retrying claims | Randomize candidate selection. Short retry delay with jitter. Metrics track contention rate for observability |
460
+ | trunk strategy corrupts integration branch on crash mid-push | Integration branch in inconsistent state | All git operations are atomic (push either succeeds or fails cleanly). Rebase is aborted on error before retry |
461
+ | YAML parsing adds a new dependency | Supply chain risk, bundle size | `js-yaml` is MIT, 1.4M weekly downloads, well-audited. Pin version. No native bindings |
462
+ | Companion agents (parent: null) confuse hierarchy queries | `getHierarchy()` shows disconnected nodes | Accept this: companions are intentionally outside the spawn tree. API/CLI can group them under "team companions" label |