macro-agent 0.1.0 → 0.1.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 (660) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/issues.jsonl +28 -0
  3. package/.sudocode/specs.jsonl +8 -0
  4. package/CLAUDE.md +25 -17
  5. package/README.md +11 -29
  6. package/dist/acp/macro-agent.d.ts +15 -0
  7. package/dist/acp/macro-agent.d.ts.map +1 -1
  8. package/dist/acp/macro-agent.js +131 -35
  9. package/dist/acp/macro-agent.js.map +1 -1
  10. package/dist/acp/types.d.ts +32 -1
  11. package/dist/acp/types.d.ts.map +1 -1
  12. package/dist/acp/types.js.map +1 -1
  13. package/dist/agent/agent-manager.d.ts +65 -1
  14. package/dist/agent/agent-manager.d.ts.map +1 -1
  15. package/dist/agent/agent-manager.js +544 -200
  16. package/dist/agent/agent-manager.js.map +1 -1
  17. package/dist/agent/types.d.ts +8 -1
  18. package/dist/agent/types.d.ts.map +1 -1
  19. package/dist/agent/types.js.map +1 -1
  20. package/dist/api/server.d.ts +8 -1
  21. package/dist/api/server.d.ts.map +1 -1
  22. package/dist/api/server.js +136 -8
  23. package/dist/api/server.js.map +1 -1
  24. package/dist/api/types.d.ts +1 -1
  25. package/dist/api/types.d.ts.map +1 -1
  26. package/dist/auth/index.d.ts +2 -0
  27. package/dist/auth/index.d.ts.map +1 -0
  28. package/dist/auth/index.js +2 -0
  29. package/dist/auth/index.js.map +1 -0
  30. package/dist/auth/token.d.ts +41 -0
  31. package/dist/auth/token.d.ts.map +1 -0
  32. package/dist/auth/token.js +73 -0
  33. package/dist/auth/token.js.map +1 -0
  34. package/dist/cli/acp.d.ts +2 -23
  35. package/dist/cli/acp.d.ts.map +1 -1
  36. package/dist/cli/acp.js +197 -61
  37. package/dist/cli/acp.js.map +1 -1
  38. package/dist/cli/index.js +152 -16
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/mcp.d.ts +6 -0
  41. package/dist/cli/mcp.d.ts.map +1 -1
  42. package/dist/cli/mcp.js +279 -173
  43. package/dist/cli/mcp.js.map +1 -1
  44. package/dist/cli/parse-args.d.ts +20 -0
  45. package/dist/cli/parse-args.d.ts.map +1 -0
  46. package/dist/cli/parse-args.js +43 -0
  47. package/dist/cli/parse-args.js.map +1 -0
  48. package/dist/cli/stable-instance-id.d.ts +8 -0
  49. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  50. package/dist/cli/stable-instance-id.js +14 -0
  51. package/dist/cli/stable-instance-id.js.map +1 -0
  52. package/dist/config/project-config.d.ts +85 -7
  53. package/dist/config/project-config.d.ts.map +1 -1
  54. package/dist/config/project-config.js +133 -20
  55. package/dist/config/project-config.js.map +1 -1
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/lifecycle/handlers/index.d.ts +7 -3
  61. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/index.js +25 -8
  63. package/dist/lifecycle/handlers/index.js.map +1 -1
  64. package/dist/lifecycle/types.d.ts +2 -0
  65. package/dist/lifecycle/types.d.ts.map +1 -1
  66. package/dist/lifecycle/types.js.map +1 -1
  67. package/dist/map/adapter/acp-over-map.d.ts +17 -0
  68. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  69. package/dist/map/adapter/acp-over-map.js +384 -23
  70. package/dist/map/adapter/acp-over-map.js.map +1 -1
  71. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  72. package/dist/map/adapter/connection-manager.js +3 -0
  73. package/dist/map/adapter/connection-manager.js.map +1 -1
  74. package/dist/map/adapter/event-log.d.ts +87 -0
  75. package/dist/map/adapter/event-log.d.ts.map +1 -0
  76. package/dist/map/adapter/event-log.js +122 -0
  77. package/dist/map/adapter/event-log.js.map +1 -0
  78. package/dist/map/adapter/event-translator.js +6 -6
  79. package/dist/map/adapter/event-translator.js.map +1 -1
  80. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  81. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  82. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  83. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  84. package/dist/map/adapter/extensions/index.d.ts +13 -1
  85. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  86. package/dist/map/adapter/extensions/index.js +61 -0
  87. package/dist/map/adapter/extensions/index.js.map +1 -1
  88. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  89. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  91. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  92. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  93. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  94. package/dist/map/adapter/extensions/rename.js +49 -0
  95. package/dist/map/adapter/extensions/rename.js.map +1 -0
  96. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  97. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/streams.js +515 -0
  99. package/dist/map/adapter/extensions/streams.js.map +1 -0
  100. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  101. package/dist/map/adapter/extensions/task.js +10 -0
  102. package/dist/map/adapter/extensions/task.js.map +1 -1
  103. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  104. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  105. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  106. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  107. package/dist/map/adapter/index.d.ts +2 -1
  108. package/dist/map/adapter/index.d.ts.map +1 -1
  109. package/dist/map/adapter/index.js +10 -2
  110. package/dist/map/adapter/index.js.map +1 -1
  111. package/dist/map/adapter/interface.d.ts +2 -0
  112. package/dist/map/adapter/interface.d.ts.map +1 -1
  113. package/dist/map/adapter/map-adapter.d.ts +3 -0
  114. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  115. package/dist/map/adapter/map-adapter.js +258 -35
  116. package/dist/map/adapter/map-adapter.js.map +1 -1
  117. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  118. package/dist/map/adapter/subscription-manager.js +5 -1
  119. package/dist/map/adapter/subscription-manager.js.map +1 -1
  120. package/dist/map/adapter/types.d.ts +3 -1
  121. package/dist/map/adapter/types.d.ts.map +1 -1
  122. package/dist/mcp/map-client.d.ts +39 -0
  123. package/dist/mcp/map-client.d.ts.map +1 -0
  124. package/dist/mcp/map-client.js +129 -0
  125. package/dist/mcp/map-client.js.map +1 -0
  126. package/dist/mcp/mcp-server.d.ts +16 -0
  127. package/dist/mcp/mcp-server.d.ts.map +1 -1
  128. package/dist/mcp/mcp-server.js +125 -88
  129. package/dist/mcp/mcp-server.js.map +1 -1
  130. package/dist/mcp/tools/done.d.ts.map +1 -1
  131. package/dist/mcp/tools/done.js +18 -0
  132. package/dist/mcp/tools/done.js.map +1 -1
  133. package/dist/mcp/types.d.ts +9 -1
  134. package/dist/mcp/types.d.ts.map +1 -1
  135. package/dist/mcp/types.js.map +1 -1
  136. package/dist/metrics/metrics.js +1 -1
  137. package/dist/metrics/metrics.js.map +1 -1
  138. package/dist/roles/builtin/coordinator.d.ts.map +1 -1
  139. package/dist/roles/builtin/coordinator.js +2 -1
  140. package/dist/roles/builtin/coordinator.js.map +1 -1
  141. package/dist/roles/builtin/integrator.d.ts.map +1 -1
  142. package/dist/roles/builtin/integrator.js +2 -1
  143. package/dist/roles/builtin/integrator.js.map +1 -1
  144. package/dist/roles/builtin/worker.d.ts.map +1 -1
  145. package/dist/roles/builtin/worker.js +3 -1
  146. package/dist/roles/builtin/worker.js.map +1 -1
  147. package/dist/roles/capabilities.d.ts +9 -1
  148. package/dist/roles/capabilities.d.ts.map +1 -1
  149. package/dist/roles/capabilities.js +27 -7
  150. package/dist/roles/capabilities.js.map +1 -1
  151. package/dist/roles/config-loader.d.ts +6 -6
  152. package/dist/roles/config-loader.d.ts.map +1 -1
  153. package/dist/roles/config-loader.js +8 -7
  154. package/dist/roles/config-loader.js.map +1 -1
  155. package/dist/roles/registry.d.ts +2 -2
  156. package/dist/roles/registry.js +2 -2
  157. package/dist/roles/types.d.ts +3 -1
  158. package/dist/roles/types.d.ts.map +1 -1
  159. package/dist/server/combined-server.d.ts +28 -1
  160. package/dist/server/combined-server.d.ts.map +1 -1
  161. package/dist/server/combined-server.js +111 -8
  162. package/dist/server/combined-server.js.map +1 -1
  163. package/dist/store/event-store.d.ts +2 -1
  164. package/dist/store/event-store.d.ts.map +1 -1
  165. package/dist/store/event-store.js +80 -24
  166. package/dist/store/event-store.js.map +1 -1
  167. package/dist/store/instance.d.ts +1 -1
  168. package/dist/store/instance.d.ts.map +1 -1
  169. package/dist/store/instance.js +2 -2
  170. package/dist/store/instance.js.map +1 -1
  171. package/dist/store/types/agents.d.ts +23 -0
  172. package/dist/store/types/agents.d.ts.map +1 -1
  173. package/dist/store/types/events.d.ts +1 -1
  174. package/dist/store/types/events.d.ts.map +1 -1
  175. package/dist/task/backend/index.d.ts +47 -29
  176. package/dist/task/backend/index.d.ts.map +1 -1
  177. package/dist/task/backend/index.js +109 -71
  178. package/dist/task/backend/index.js.map +1 -1
  179. package/dist/task/backend/memory.d.ts +1 -0
  180. package/dist/task/backend/memory.d.ts.map +1 -1
  181. package/dist/task/backend/memory.js +3 -0
  182. package/dist/task/backend/memory.js.map +1 -1
  183. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  184. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  185. package/dist/task/backend/opentasks/backend.js +1023 -0
  186. package/dist/task/backend/opentasks/backend.js.map +1 -0
  187. package/dist/task/backend/opentasks/client.d.ts +337 -0
  188. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  189. package/dist/task/backend/opentasks/client.js +225 -0
  190. package/dist/task/backend/opentasks/client.js.map +1 -0
  191. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  192. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  193. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  194. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  195. package/dist/task/backend/opentasks/index.d.ts +21 -0
  196. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  197. package/dist/task/backend/opentasks/index.js +21 -0
  198. package/dist/task/backend/opentasks/index.js.map +1 -0
  199. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  200. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  201. package/dist/task/backend/opentasks/mapping.js +77 -0
  202. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  203. package/dist/task/backend/types.d.ts +33 -53
  204. package/dist/task/backend/types.d.ts.map +1 -1
  205. package/dist/task/backend/types.js +7 -11
  206. package/dist/task/backend/types.js.map +1 -1
  207. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  208. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  209. package/dist/task/backend/unified-tool-provider.js +623 -0
  210. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  211. package/dist/teams/index.d.ts +3 -1
  212. package/dist/teams/index.d.ts.map +1 -1
  213. package/dist/teams/index.js +2 -0
  214. package/dist/teams/index.js.map +1 -1
  215. package/dist/teams/seed-defaults.d.ts +20 -0
  216. package/dist/teams/seed-defaults.d.ts.map +1 -0
  217. package/dist/teams/seed-defaults.js +71 -0
  218. package/dist/teams/seed-defaults.js.map +1 -0
  219. package/dist/teams/team-loader.d.ts +7 -3
  220. package/dist/teams/team-loader.d.ts.map +1 -1
  221. package/dist/teams/team-loader.js +156 -164
  222. package/dist/teams/team-loader.js.map +1 -1
  223. package/dist/teams/team-manager.d.ts +112 -0
  224. package/dist/teams/team-manager.d.ts.map +1 -0
  225. package/dist/teams/team-manager.js +305 -0
  226. package/dist/teams/team-manager.js.map +1 -0
  227. package/dist/teams/team-runtime.d.ts +125 -19
  228. package/dist/teams/team-runtime.d.ts.map +1 -1
  229. package/dist/teams/team-runtime.js +529 -119
  230. package/dist/teams/team-runtime.js.map +1 -1
  231. package/dist/teams/types.d.ts +41 -151
  232. package/dist/teams/types.d.ts.map +1 -1
  233. package/dist/teams/types.js +2 -3
  234. package/dist/teams/types.js.map +1 -1
  235. package/docs/architecture.md +7 -6
  236. package/docs/configuration.md +26 -62
  237. package/docs/implementation-details.md +5 -5
  238. package/docs/implementation-summary.md +17 -17
  239. package/docs/plan-self-driving-support.md +4 -4
  240. package/docs/spec-self-driving-support.md +10 -10
  241. package/docs/team-templates.md +2 -2
  242. package/docs/teams.md +76 -3
  243. package/docs/troubleshooting.md +10 -11
  244. package/package.json +7 -4
  245. package/references/minimem/.claude/settings.json +7 -0
  246. package/references/minimem/.sudocode/issues.jsonl +18 -0
  247. package/references/minimem/.sudocode/specs.jsonl +1 -0
  248. package/references/minimem/CLAUDE.md +310 -0
  249. package/references/minimem/README.md +562 -0
  250. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  251. package/references/minimem/claude-plugin/.mcp.json +7 -0
  252. package/references/minimem/claude-plugin/README.md +158 -0
  253. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  254. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  255. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  256. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  257. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  258. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  259. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  260. package/references/minimem/media/banner.png +0 -0
  261. package/references/minimem/package-lock.json +5373 -0
  262. package/references/minimem/package.json +72 -0
  263. package/references/minimem/scripts/postbuild.js +35 -0
  264. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  265. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  266. package/references/minimem/src/__tests__/helpers.ts +199 -0
  267. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  268. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  269. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  270. package/references/minimem/src/__tests__/session.test.ts +190 -0
  271. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  272. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  273. package/references/minimem/src/cli/commands/append.ts +76 -0
  274. package/references/minimem/src/cli/commands/config.ts +262 -0
  275. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  276. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  277. package/references/minimem/src/cli/commands/index.ts +12 -0
  278. package/references/minimem/src/cli/commands/init.ts +88 -0
  279. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  280. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  281. package/references/minimem/src/cli/commands/search.ts +158 -0
  282. package/references/minimem/src/cli/commands/status.ts +84 -0
  283. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  284. package/references/minimem/src/cli/commands/sync.ts +70 -0
  285. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  286. package/references/minimem/src/cli/config.ts +584 -0
  287. package/references/minimem/src/cli/index.ts +264 -0
  288. package/references/minimem/src/cli/shared.ts +161 -0
  289. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  290. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  291. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  292. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  293. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  294. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  295. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  296. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  297. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  298. package/references/minimem/src/cli/sync/central.ts +292 -0
  299. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  300. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  301. package/references/minimem/src/cli/sync/detection.ts +138 -0
  302. package/references/minimem/src/cli/sync/index.ts +107 -0
  303. package/references/minimem/src/cli/sync/operations.ts +373 -0
  304. package/references/minimem/src/cli/sync/registry.ts +279 -0
  305. package/references/minimem/src/cli/sync/state.ts +355 -0
  306. package/references/minimem/src/cli/sync/validation.ts +206 -0
  307. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  308. package/references/minimem/src/cli/version.ts +34 -0
  309. package/references/minimem/src/core/index.ts +9 -0
  310. package/references/minimem/src/core/indexer.ts +628 -0
  311. package/references/minimem/src/core/searcher.ts +221 -0
  312. package/references/minimem/src/db/schema.ts +183 -0
  313. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  314. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  315. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  316. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  317. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  318. package/references/minimem/src/index.ts +109 -0
  319. package/references/minimem/src/internal.ts +299 -0
  320. package/references/minimem/src/minimem.ts +1276 -0
  321. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  322. package/references/minimem/src/search/graph.ts +234 -0
  323. package/references/minimem/src/search/hybrid.ts +151 -0
  324. package/references/minimem/src/search/search.ts +256 -0
  325. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  326. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  327. package/references/minimem/src/server/mcp.ts +326 -0
  328. package/references/minimem/src/server/tools.ts +720 -0
  329. package/references/minimem/src/session.ts +460 -0
  330. package/references/minimem/tsconfig.json +19 -0
  331. package/references/minimem/tsup.config.ts +26 -0
  332. package/references/minimem/vitest.config.ts +24 -0
  333. package/references/openteams/.claude/settings.json +6 -0
  334. package/references/openteams/README.md +1 -0
  335. package/references/openteams/SKILL.md +341 -0
  336. package/references/openteams/design.md +411 -0
  337. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
  338. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
  339. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
  340. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
  341. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
  342. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
  343. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
  344. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
  345. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
  346. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
  347. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
  348. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
  349. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
  350. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
  351. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
  352. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
  353. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
  354. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
  355. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
  356. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
  357. package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
  358. package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
  359. package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
  360. package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
  361. package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
  362. package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
  363. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
  364. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
  365. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
  366. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
  367. package/references/openteams/examples/bmad-method/team.yaml +161 -0
  368. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
  369. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
  370. package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
  371. package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
  372. package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
  373. package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
  374. package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
  375. package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
  376. package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
  377. package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
  378. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
  379. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
  380. package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
  381. package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
  382. package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
  383. package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
  384. package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
  385. package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
  386. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
  387. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
  388. package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
  389. package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
  390. package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
  391. package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
  392. package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
  393. package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
  394. package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
  395. package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
  396. package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
  397. package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
  398. package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
  399. package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
  400. package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
  401. package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
  402. package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
  403. package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
  404. package/references/openteams/examples/get-shit-done/team.yaml +154 -0
  405. package/references/openteams/package-lock.json +2181 -0
  406. package/references/openteams/package.json +48 -0
  407. package/references/openteams/schema/role.schema.json +125 -0
  408. package/references/openteams/schema/team.schema.json +284 -0
  409. package/references/openteams/src/cli/agent.ts +104 -0
  410. package/references/openteams/src/cli/cli.test.ts +381 -0
  411. package/references/openteams/src/cli/generate.ts +220 -0
  412. package/references/openteams/src/cli/message.ts +241 -0
  413. package/references/openteams/src/cli/task.ts +154 -0
  414. package/references/openteams/src/cli/team.ts +104 -0
  415. package/references/openteams/src/cli/template.ts +207 -0
  416. package/references/openteams/src/cli.ts +45 -0
  417. package/references/openteams/src/db/database.test.ts +185 -0
  418. package/references/openteams/src/db/database.ts +240 -0
  419. package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
  420. package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
  421. package/references/openteams/src/generators/package-generator.test.ts +129 -0
  422. package/references/openteams/src/generators/package-generator.ts +102 -0
  423. package/references/openteams/src/generators/skill-generator.test.ts +246 -0
  424. package/references/openteams/src/generators/skill-generator.ts +374 -0
  425. package/references/openteams/src/index.ts +104 -0
  426. package/references/openteams/src/services/agent-service.test.ts +158 -0
  427. package/references/openteams/src/services/agent-service.ts +84 -0
  428. package/references/openteams/src/services/communication-service.test.ts +455 -0
  429. package/references/openteams/src/services/communication-service.ts +371 -0
  430. package/references/openteams/src/services/message-service.test.ts +342 -0
  431. package/references/openteams/src/services/message-service.ts +203 -0
  432. package/references/openteams/src/services/task-service.test.ts +434 -0
  433. package/references/openteams/src/services/task-service.ts +239 -0
  434. package/references/openteams/src/services/team-service.test.ts +181 -0
  435. package/references/openteams/src/services/team-service.ts +139 -0
  436. package/references/openteams/src/services/template-service.test.ts +306 -0
  437. package/references/openteams/src/services/template-service.ts +182 -0
  438. package/references/openteams/src/spawner/acp-factory.ts +96 -0
  439. package/references/openteams/src/spawner/interface.ts +31 -0
  440. package/references/openteams/src/spawner/mock.test.ts +93 -0
  441. package/references/openteams/src/spawner/mock.ts +59 -0
  442. package/references/openteams/src/template/loader.test.ts +1319 -0
  443. package/references/openteams/src/template/loader.ts +698 -0
  444. package/references/openteams/src/template/types.ts +200 -0
  445. package/references/openteams/src/types.ts +205 -0
  446. package/references/openteams/tsconfig.json +18 -0
  447. package/references/openteams/vitest.config.ts +9 -0
  448. package/references/skill-tree/.claude/settings.json +6 -0
  449. package/references/skill-tree/.sudocode/issues.jsonl +11 -0
  450. package/references/skill-tree/.sudocode/specs.jsonl +1 -0
  451. package/references/skill-tree/CLAUDE.md +150 -0
  452. package/references/skill-tree/README.md +324 -0
  453. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  454. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  455. package/references/skill-tree/docs/TODOS.md +91 -0
  456. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  457. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  458. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  459. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  460. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  461. package/references/skill-tree/docs/scraper/README.md +170 -0
  462. package/references/skill-tree/examples/basic-usage.ts +190 -0
  463. package/references/skill-tree/package-lock.json +1509 -0
  464. package/references/skill-tree/package.json +66 -0
  465. package/references/skill-tree/scraper/README.md +123 -0
  466. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  467. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  468. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  469. package/references/skill-tree/scraper/package-lock.json +6329 -0
  470. package/references/skill-tree/scraper/package.json +68 -0
  471. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  472. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  473. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  474. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  475. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  476. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  477. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  478. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  479. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  480. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  481. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  482. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  483. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  484. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  485. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  486. package/references/skill-tree/test/run-all.ts +106 -0
  487. package/references/skill-tree/test/utils.ts +128 -0
  488. package/references/skill-tree/vitest.config.ts +16 -0
  489. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  490. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  491. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  492. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  493. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  494. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  495. package/src/acp/__tests__/integration.test.ts +56 -31
  496. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  497. package/src/acp/macro-agent.ts +170 -36
  498. package/src/acp/types.ts +46 -1
  499. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  500. package/src/agent/agent-manager.ts +809 -285
  501. package/src/agent/types.ts +12 -1
  502. package/src/api/__tests__/server.test.ts +203 -4
  503. package/src/api/server.ts +169 -10
  504. package/src/api/types.ts +3 -1
  505. package/src/auth/__tests__/token.test.ts +100 -0
  506. package/src/auth/index.ts +1 -0
  507. package/src/auth/token.ts +82 -0
  508. package/src/cli/__tests__/acp.test.ts +1 -1
  509. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  510. package/src/cli/acp.ts +197 -72
  511. package/src/cli/index.ts +125 -15
  512. package/src/cli/mcp.ts +315 -197
  513. package/src/cli/parse-args.ts +54 -0
  514. package/src/cli/stable-instance-id.ts +14 -0
  515. package/src/config/project-config.ts +214 -27
  516. package/src/index.ts +3 -0
  517. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  518. package/src/lifecycle/__tests__/handlers.test.ts +53 -0
  519. package/src/lifecycle/handlers/index.ts +25 -8
  520. package/src/lifecycle/types.ts +3 -0
  521. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
  522. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  523. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
  524. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  525. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  526. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  527. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  528. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  529. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  530. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  531. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  532. package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
  533. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  534. package/src/map/adapter/acp-over-map.ts +678 -66
  535. package/src/map/adapter/connection-manager.ts +3 -0
  536. package/src/map/adapter/event-log.ts +208 -0
  537. package/src/map/adapter/event-translator.ts +6 -6
  538. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  539. package/src/map/adapter/extensions/index.ts +96 -0
  540. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  541. package/src/map/adapter/extensions/streams.ts +839 -0
  542. package/src/map/adapter/extensions/task.ts +11 -0
  543. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  544. package/src/map/adapter/index.ts +33 -0
  545. package/src/map/adapter/interface.ts +2 -0
  546. package/src/map/adapter/map-adapter.ts +312 -47
  547. package/src/map/adapter/subscription-manager.ts +5 -1
  548. package/src/map/adapter/types.ts +10 -1
  549. package/src/mcp/__tests__/map-client.test.ts +386 -0
  550. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  551. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  552. package/src/mcp/map-client.ts +177 -0
  553. package/src/mcp/mcp-server.ts +205 -103
  554. package/src/mcp/tools/done.ts +19 -0
  555. package/src/mcp/types.ts +6 -1
  556. package/src/metrics/metrics.ts +1 -1
  557. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  558. package/src/roles/__tests__/config-loader.test.ts +7 -7
  559. package/src/roles/builtin/coordinator.ts +2 -0
  560. package/src/roles/builtin/integrator.ts +2 -0
  561. package/src/roles/builtin/worker.ts +3 -0
  562. package/src/roles/capabilities.ts +28 -7
  563. package/src/roles/config-loader.ts +8 -7
  564. package/src/roles/registry.ts +2 -2
  565. package/src/roles/types.ts +7 -0
  566. package/src/server/__tests__/combined-server.test.ts +94 -21
  567. package/src/server/combined-server.ts +203 -33
  568. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  569. package/src/store/__tests__/event-store-oob.test.ts +109 -0
  570. package/src/store/__tests__/event-store.test.ts +196 -1
  571. package/src/store/__tests__/instance.test.ts +3 -3
  572. package/src/store/event-store.ts +92 -23
  573. package/src/store/instance.ts +2 -2
  574. package/src/store/types/agents.ts +20 -0
  575. package/src/store/types/events.ts +1 -1
  576. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  577. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  578. package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
  579. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  580. package/src/task/backend/index.ts +156 -106
  581. package/src/task/backend/memory.ts +4 -0
  582. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  583. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  584. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  585. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  586. package/src/task/backend/opentasks/backend.ts +1323 -0
  587. package/src/task/backend/opentasks/client.ts +652 -0
  588. package/src/task/backend/opentasks/daemon-manager.ts +256 -0
  589. package/src/task/backend/opentasks/index.ts +69 -0
  590. package/src/task/backend/opentasks/mapping.ts +94 -0
  591. package/src/task/backend/types.ts +42 -66
  592. package/src/task/backend/unified-tool-provider.ts +779 -0
  593. package/src/teams/CLAUDE.md +180 -0
  594. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  595. package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
  596. package/src/teams/__tests__/team-manager.test.ts +814 -0
  597. package/src/teams/__tests__/team-system.test.ts +1291 -8
  598. package/src/teams/index.ts +21 -3
  599. package/src/teams/seed-defaults.ts +79 -0
  600. package/src/teams/team-loader.ts +202 -236
  601. package/src/teams/team-manager.ts +387 -0
  602. package/src/teams/team-runtime.ts +592 -121
  603. package/src/teams/types.ts +99 -200
  604. package/test_fixtures/README.md +2 -3
  605. package/test_fixtures/fixtures/index.ts +0 -3
  606. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  607. package/test_fixtures/fixtures/repos/index.ts +1 -3
  608. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  609. package/test_fixtures/fixtures/repos/types.ts +0 -11
  610. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  611. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  612. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  613. package/vitest.config.ts +1 -1
  614. package/vitest.e2e.config.ts +1 -1
  615. package/vitest.setup.ts +1 -30
  616. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  617. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  618. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  619. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  620. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  621. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  622. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  623. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  624. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  625. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  626. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  627. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  628. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  629. package/.macro-agent/teams/structured/team.yaml +0 -89
  630. package/docs/sudocode-integration.md +0 -383
  631. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  632. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  633. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  634. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  635. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  636. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  637. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  638. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  639. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  640. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  641. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  642. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  643. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  644. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  645. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  646. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  647. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  648. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  649. package/src/task/backend/sudocode/backend.ts +0 -1237
  650. package/src/task/backend/sudocode/client.ts +0 -515
  651. package/src/task/backend/sudocode/index.ts +0 -120
  652. package/src/task/backend/sudocode/mapping.ts +0 -93
  653. package/src/task/backend/sudocode/server-client.ts +0 -522
  654. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  655. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  656. package/src/task/backend/sudocode/tools.ts +0 -896
  657. package/src/task/backend/tool-provider.ts +0 -506
  658. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  659. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  660. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
@@ -1,4 +1,6 @@
1
1
  export { loadTeam } from "./team-loader.js";
2
2
  export { TeamRuntime } from "./team-runtime.js";
3
+ export { TeamManager } from "./team-manager.js";
4
+ export { seedDefaultTemplates } from "./seed-defaults.js";
3
5
  export { TeamLoadError, } from "./types.js";
4
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAA+C,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EACL,aAAa,GASd,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAA+C,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAA8C,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,aAAa,GAyBd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Seed Default Team Templates
3
+ *
4
+ * Copies bundled default team templates from the macro-agent package
5
+ * to the project's .multiagent/teams/ directory on first use.
6
+ * Idempotent — only copies templates that don't already exist.
7
+ *
8
+ * @module teams/seed-defaults
9
+ */
10
+ /**
11
+ * Copy bundled default team templates to the project's .multiagent/teams/ directory.
12
+ *
13
+ * Only copies templates that don't already exist at the target path —
14
+ * user-customized templates are never overwritten. Safe to call on every startup.
15
+ *
16
+ * @param basePath - Project root directory (e.g., process.cwd())
17
+ * @returns Names of templates that were copied
18
+ */
19
+ export declare function seedDefaultTemplates(basePath: string): Promise<string[]>;
20
+ //# sourceMappingURL=seed-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-defaults.d.ts","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiC9E"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Seed Default Team Templates
3
+ *
4
+ * Copies bundled default team templates from the macro-agent package
5
+ * to the project's .multiagent/teams/ directory on first use.
6
+ * Idempotent — only copies templates that don't already exist.
7
+ *
8
+ * @module teams/seed-defaults
9
+ */
10
+ import * as fs from "fs";
11
+ import * as path from "path";
12
+ import { fileURLToPath } from "url";
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ // Package root: up from src/teams/ → src/ → package root
15
+ const PACKAGE_ROOT = path.resolve(__dirname, "..", "..");
16
+ const BUNDLED_TEAMS_DIR = path.join(PACKAGE_ROOT, ".multiagent", "teams");
17
+ const TEAMS_DIR = ".multiagent/teams";
18
+ /**
19
+ * Copy bundled default team templates to the project's .multiagent/teams/ directory.
20
+ *
21
+ * Only copies templates that don't already exist at the target path —
22
+ * user-customized templates are never overwritten. Safe to call on every startup.
23
+ *
24
+ * @param basePath - Project root directory (e.g., process.cwd())
25
+ * @returns Names of templates that were copied
26
+ */
27
+ export async function seedDefaultTemplates(basePath) {
28
+ const targetDir = path.join(basePath, TEAMS_DIR);
29
+ const seeded = [];
30
+ // Check if bundled templates exist in the package
31
+ if (!fs.existsSync(BUNDLED_TEAMS_DIR))
32
+ return seeded;
33
+ let bundledTemplates;
34
+ try {
35
+ bundledTemplates = fs.readdirSync(BUNDLED_TEAMS_DIR, { withFileTypes: true })
36
+ .filter(d => d.isDirectory());
37
+ }
38
+ catch {
39
+ return seeded;
40
+ }
41
+ if (bundledTemplates.length === 0)
42
+ return seeded;
43
+ // Ensure target directory exists
44
+ fs.mkdirSync(targetDir, { recursive: true });
45
+ for (const templateDir of bundledTemplates) {
46
+ const targetTemplatePath = path.join(targetDir, templateDir.name);
47
+ if (fs.existsSync(targetTemplatePath))
48
+ continue; // Don't overwrite
49
+ // Recursive copy of the entire template directory
50
+ copyDirRecursive(path.join(BUNDLED_TEAMS_DIR, templateDir.name), targetTemplatePath);
51
+ seeded.push(templateDir.name);
52
+ }
53
+ return seeded;
54
+ }
55
+ /**
56
+ * Recursively copy a directory tree.
57
+ */
58
+ function copyDirRecursive(src, dest) {
59
+ fs.mkdirSync(dest, { recursive: true });
60
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
61
+ const srcPath = path.join(src, entry.name);
62
+ const destPath = path.join(dest, entry.name);
63
+ if (entry.isDirectory()) {
64
+ copyDirRecursive(srcPath, destPath);
65
+ }
66
+ else {
67
+ fs.copyFileSync(srcPath, destPath);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=seed-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-defaults.js","sourceRoot":"","sources":["../../src/teams/seed-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,yDAAyD;AACzD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC1E,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,kDAAkD;IAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,MAAM,CAAC;IAErD,IAAI,gBAA6B,CAAC;IAClC,IAAI,CAAC;QACH,gBAAgB,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC1E,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEjD,iCAAiC;IACjC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;QAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAAE,SAAS,CAAC,kBAAkB;QAEnE,kDAAkD;QAClD,gBAAgB,CACd,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,IAAI,CAAC,EAC9C,kBAAkB,CACnB,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACjD,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Team Template Loader
3
3
  *
4
- * Reads .macro-agent/teams/<name>/ directories, parses team.yaml,
5
- * resolves role inheritance, loads prompts, and validates communication.
4
+ * Thin wrapper around openteams TemplateLoader that maps the result
5
+ * into macro-agent's TeamManifest format with enforcement-enriched roles.
6
6
  *
7
7
  * @module teams/team-loader
8
8
  */
@@ -11,7 +11,11 @@ import { type TeamManifest } from "./types.js";
11
11
  /**
12
12
  * Load a team template from disk and resolve all references.
13
13
  *
14
- * @param teamName - Team name (directory name under .macro-agent/teams/)
14
+ * Delegates to openteams TemplateLoader for YAML parsing, role resolution,
15
+ * prompt loading, and MCP server config. Enriches the result with macro-agent
16
+ * specific enforcement (workspace, lifecycle, spawn rules).
17
+ *
18
+ * @param teamName - Team name (directory name under .multiagent/teams/)
15
19
  * @param roleRegistry - Role registry for resolving extends chains
16
20
  * @param basePath - Project root (default: process.cwd())
17
21
  * @returns Fully resolved TeamManifest
@@ -1 +1 @@
1
- {"version":3,"file":"team-loader.d.ts","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAEL,KAAK,YAAY,EAOlB,MAAM,YAAY,CAAC;AAiBpB;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CA4FvB"}
1
+ {"version":3,"file":"team-loader.d.ts","sourceRoot":"","sources":["../../src/teams/team-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAC;AAYpB;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CA+EvB"}
@@ -1,31 +1,29 @@
1
1
  /**
2
2
  * Team Template Loader
3
3
  *
4
- * Reads .macro-agent/teams/<name>/ directories, parses team.yaml,
5
- * resolves role inheritance, loads prompts, and validates communication.
4
+ * Thin wrapper around openteams TemplateLoader that maps the result
5
+ * into macro-agent's TeamManifest format with enforcement-enriched roles.
6
6
  *
7
7
  * @module teams/team-loader
8
8
  */
9
- import * as fs from "fs";
10
9
  import * as path from "path";
11
- import yaml from "js-yaml";
10
+ import { TemplateLoader } from "openteams";
12
11
  import { TeamLoadError, } from "./types.js";
13
12
  // =============================================================================
14
13
  // Constants
15
14
  // =============================================================================
16
- const TEAMS_DIR = ".macro-agent/teams";
17
- const MANIFEST_FILE = "team.yaml";
18
- const ROLES_DIR = "roles";
19
- const PROMPTS_DIR = "prompts";
20
- const TOOLS_DIR = "tools";
21
- const MCP_SERVERS_FILE = "mcp-servers.json";
15
+ const TEAMS_DIR = ".multiagent/teams";
22
16
  // =============================================================================
23
17
  // TeamLoader
24
18
  // =============================================================================
25
19
  /**
26
20
  * Load a team template from disk and resolve all references.
27
21
  *
28
- * @param teamName - Team name (directory name under .macro-agent/teams/)
22
+ * Delegates to openteams TemplateLoader for YAML parsing, role resolution,
23
+ * prompt loading, and MCP server config. Enriches the result with macro-agent
24
+ * specific enforcement (workspace, lifecycle, spawn rules).
25
+ *
26
+ * @param teamName - Team name (directory name under .multiagent/teams/)
29
27
  * @param roleRegistry - Role registry for resolving extends chains
30
28
  * @param basePath - Project root (default: process.cwd())
31
29
  * @returns Fully resolved TeamManifest
@@ -33,225 +31,219 @@ const MCP_SERVERS_FILE = "mcp-servers.json";
33
31
  export async function loadTeam(teamName, roleRegistry, basePath) {
34
32
  const root = basePath ?? process.cwd();
35
33
  const teamDir = path.join(root, TEAMS_DIR, teamName);
36
- // 1. Check team directory exists
37
- if (!fs.existsSync(teamDir)) {
38
- throw new TeamLoadError(`Team directory not found: ${teamDir}`, "MANIFEST_NOT_FOUND", teamName);
39
- }
40
- // 2. Read and parse team.yaml
41
- const manifestPath = path.join(teamDir, MANIFEST_FILE);
42
- if (!fs.existsSync(manifestPath)) {
43
- throw new TeamLoadError(`Team manifest not found: ${manifestPath}`, "MANIFEST_NOT_FOUND", teamName);
44
- }
45
- const raw = fs.readFileSync(manifestPath, "utf-8");
46
- let parsed;
34
+ // 1. Load via openteams TemplateLoader with hooks
35
+ let template;
47
36
  try {
48
- parsed = yaml.load(raw);
37
+ template = await TemplateLoader.loadAsync(teamDir, {
38
+ resolveExternalRole: (name) => mapRegistryRole(roleRegistry, name),
39
+ postProcessRole: (role, manifest) => enrichRoleWithSpawnRules(role, manifest),
40
+ });
49
41
  }
50
42
  catch (err) {
51
- throw new TeamLoadError(`Failed to parse ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`, "INVALID_MANIFEST", teamName);
43
+ throw mapToTeamLoadError(err, teamName, teamDir);
52
44
  }
53
- // 3. Validate required fields
54
- validateManifest(parsed, teamName);
55
- const topology = parsed.topology;
56
- const communication = (parsed.communication ?? {});
57
- const macroAgent = (parsed.macro_agent ?? {});
58
- const roleNames = parsed.roles;
59
- // 4. Resolve roles
45
+ const manifest = template.manifest;
46
+ const communication = (manifest.communication ?? {});
47
+ const macroAgent = parseMacroAgentExtensions(manifest.macro_agent);
48
+ // 2. Build enforcement-enriched roles
60
49
  const resolvedRoles = new Map();
61
- const spawnRules = topology.spawn_rules ?? {};
62
- for (const roleName of roleNames) {
63
- const resolved = resolveTeamRole(roleName, teamDir, roleRegistry, spawnRules);
64
- resolvedRoles.set(roleName, resolved);
50
+ for (const [roleName, openteamsRole] of template.roles) {
51
+ resolvedRoles.set(roleName, buildResolvedTeamRole(roleName, openteamsRole, roleRegistry));
65
52
  }
66
- // 5. Load prompts
53
+ // 3. Build loaded prompts map (backward compat: path → assembled content)
54
+ // Assembles multi-file prompts (primary + additional sections) into a single
55
+ // string so the runtime can use it transparently.
67
56
  const loadedPrompts = new Map();
68
- // Load prompts from topology nodes
69
- const promptRefs = collectPromptRefs(topology, resolvedRoles);
70
- for (const promptPath of promptRefs) {
71
- const fullPath = path.join(teamDir, promptPath);
72
- if (!fs.existsSync(fullPath)) {
73
- throw new TeamLoadError(`Prompt file not found: ${fullPath}`, "PROMPT_NOT_FOUND", teamName);
57
+ for (const [roleName, resolvedPrompts] of template.prompts) {
58
+ if (!resolvedPrompts.primary)
59
+ continue;
60
+ const role = template.roles.get(roleName);
61
+ // Assemble full prompt: primary + additional sections
62
+ let fullPrompt = resolvedPrompts.primary;
63
+ for (const section of resolvedPrompts.additional) {
64
+ fullPrompt += `\n\n## ${section.name}\n\n${section.content}`;
65
+ }
66
+ // Store under role's promptFile key (used by getPromptForRole)
67
+ if (role?.promptFile) {
68
+ loadedPrompts.set(role.promptFile, fullPrompt);
69
+ }
70
+ // Store under topology node prompt keys (used by getPromptForTopologyNode)
71
+ if (manifest.topology.root.role === roleName && manifest.topology.root.prompt) {
72
+ loadedPrompts.set(manifest.topology.root.prompt, fullPrompt);
73
+ }
74
+ for (const comp of manifest.topology.companions ?? []) {
75
+ if (comp.role === roleName && comp.prompt) {
76
+ loadedPrompts.set(comp.prompt, fullPrompt);
77
+ }
78
+ }
79
+ // Convention fallback key
80
+ if (!role?.promptFile) {
81
+ loadedPrompts.set(`prompts/${roleName}.md`, fullPrompt);
74
82
  }
75
- loadedPrompts.set(promptPath, fs.readFileSync(fullPath, "utf-8"));
76
83
  }
77
- // 6. Load MCP server configs
78
- const mcpServers = loadMcpServers(teamDir);
79
- // 7. Validate communication topology
80
- validateCommunication(communication, roleNames, teamName);
84
+ // 4. Validate communication topology
85
+ validateCommunication(communication, manifest.roles, teamName);
81
86
  return {
82
- name: parsed.name,
83
- description: parsed.description ?? "",
84
- version: parsed.version ?? 1,
85
- roles: roleNames,
86
- topology,
87
+ name: manifest.name,
88
+ description: manifest.description ?? "",
89
+ version: manifest.version ?? 1,
90
+ roles: manifest.roles,
91
+ topology: manifest.topology,
87
92
  communication,
88
93
  macro_agent: macroAgent,
89
94
  _resolvedRoles: resolvedRoles,
90
95
  _loadedPrompts: loadedPrompts,
91
- _mcpServers: mcpServers,
96
+ _mcpServers: template.mcpServers,
92
97
  };
93
98
  }
94
99
  // =============================================================================
95
- // Manifest Validation
100
+ // Hook: Map RoleRegistry → openteams ResolvedRole
96
101
  // =============================================================================
97
- function validateManifest(parsed, teamName) {
98
- if (!parsed || typeof parsed !== "object") {
99
- throw new TeamLoadError("Team manifest must be a YAML object", "INVALID_MANIFEST", teamName);
100
- }
101
- if (!parsed.name || typeof parsed.name !== "string") {
102
- throw new TeamLoadError("Team manifest requires a 'name' string field", "INVALID_MANIFEST", teamName);
103
- }
104
- if (!Array.isArray(parsed.roles) || parsed.roles.length === 0) {
105
- throw new TeamLoadError("Team manifest requires a non-empty 'roles' array", "INVALID_MANIFEST", teamName);
106
- }
107
- if (!parsed.topology || typeof parsed.topology !== "object") {
108
- throw new TeamLoadError("Team manifest requires a 'topology' object", "INVALID_MANIFEST", teamName);
102
+ /**
103
+ * Convert a macro-agent RoleRegistry entry to an openteams ResolvedRole.
104
+ * Used as the resolveExternalRole hook for TemplateLoader.
105
+ */
106
+ function mapRegistryRole(roleRegistry, name) {
107
+ try {
108
+ const rd = roleRegistry.resolveRole(name);
109
+ return {
110
+ name: rd.name,
111
+ displayName: rd.displayName ?? rd.name,
112
+ description: rd.description ?? `Role: ${rd.name}`,
113
+ capabilities: [...rd.capabilities],
114
+ raw: { name: rd.name, capabilities: [...rd.capabilities] },
115
+ };
109
116
  }
110
- const topology = parsed.topology;
111
- if (!topology.root || typeof topology.root !== "object") {
112
- throw new TeamLoadError("Team topology requires a 'root' object", "INVALID_MANIFEST", teamName);
117
+ catch {
118
+ return null;
113
119
  }
114
120
  }
115
121
  // =============================================================================
116
- // Role Resolution
122
+ // Hook: Enrich roles with spawn_rules capabilities
117
123
  // =============================================================================
118
124
  /**
119
- * Resolve a single team role: load YAML if present, resolve extends,
120
- * compute capabilities, translate spawn rules.
125
+ * Translate team topology spawn_rules into agent.spawn.* capabilities.
126
+ * Used as the postProcessRole hook for TemplateLoader.
121
127
  */
122
- function resolveTeamRole(roleName, teamDir, roleRegistry, spawnRules) {
123
- // Try to load role YAML from team directory
124
- const roleFilePath = path.join(teamDir, ROLES_DIR, `${roleName}.yaml`);
125
- let teamRoleDef = null;
126
- if (fs.existsSync(roleFilePath)) {
127
- const raw = fs.readFileSync(roleFilePath, "utf-8");
128
- try {
129
- teamRoleDef = yaml.load(raw);
130
- }
131
- catch (err) {
132
- throw new TeamLoadError(`Failed to parse role file ${roleFilePath}: ${err instanceof Error ? err.message : String(err)}`, "INVALID_ROLE", roleName);
128
+ function enrichRoleWithSpawnRules(role, manifest) {
129
+ const spawnRules = manifest.topology.spawn_rules;
130
+ if (!spawnRules)
131
+ return role;
132
+ const allowedSpawns = spawnRules[role.name];
133
+ if (!allowedSpawns || allowedSpawns.length === 0)
134
+ return role;
135
+ const capabilities = [...role.capabilities];
136
+ for (const target of allowedSpawns) {
137
+ const cap = `agent.spawn.${target}`;
138
+ if (!capabilities.includes(cap)) {
139
+ capabilities.push(cap);
133
140
  }
134
141
  }
135
- // Determine base role
136
- const baseRoleName = teamRoleDef?.extends ?? roleName;
142
+ return { ...role, capabilities };
143
+ }
144
+ // =============================================================================
145
+ // Build ResolvedTeamRole
146
+ // =============================================================================
147
+ /**
148
+ * Build a macro-agent ResolvedTeamRole from an openteams ResolvedRole.
149
+ * Enriches with enforcement-specific fields (workspace, lifecycle, tools, etc.)
150
+ * from the parent RoleDefinition and macro_agent overrides from role YAML.
151
+ */
152
+ function buildResolvedTeamRole(roleName, openteamsRole, roleRegistry) {
153
+ const baseRoleName = openteamsRole.extends ?? roleName;
137
154
  let parentRole;
138
155
  try {
139
156
  parentRole = roleRegistry.resolveRole(baseRoleName);
140
157
  }
141
158
  catch {
142
- throw new TeamLoadError(`Base role '${baseRoleName}' not found for team role '${roleName}'`, "ROLE_NOT_FOUND", roleName);
143
- }
144
- // Compute capabilities
145
- let capabilities;
146
- if (teamRoleDef?.capabilities) {
147
- // Full replacement
148
- capabilities = teamRoleDef.capabilities;
149
- }
150
- else if (teamRoleDef?.capabilities_add || teamRoleDef?.capabilities_remove) {
151
- // Additive/subtractive
152
- const base = new Set(parentRole.capabilities);
153
- for (const cap of teamRoleDef.capabilities_add ?? []) {
154
- base.add(cap);
155
- }
156
- for (const cap of teamRoleDef.capabilities_remove ?? []) {
157
- base.delete(cap);
158
- }
159
- capabilities = Array.from(base);
159
+ // Fallback for roles without a registry parent
160
+ parentRole = {
161
+ name: baseRoleName,
162
+ displayName: baseRoleName,
163
+ description: `Role: ${baseRoleName}`,
164
+ capabilities: [],
165
+ };
160
166
  }
161
- else {
162
- // Inherit parent capabilities
163
- capabilities = [...parentRole.capabilities];
167
+ const macroAgent = openteamsRole.raw.macro_agent;
168
+ let capabilities = openteamsRole.capabilities;
169
+ // If the role YAML had no capability specification (no capabilities,
170
+ // capabilities_add, or capabilities_remove), openteams leaves capabilities
171
+ // empty. In that case, inherit all parent capabilities. Spawn-rule enrichment
172
+ // may have already added some caps, so merge with parent.
173
+ const hasExplicitCapabilitySpec = openteamsRole.raw.capabilities !== undefined;
174
+ if (!hasExplicitCapabilitySpec && parentRole.capabilities.length > 0) {
175
+ const merged = new Set([...parentRole.capabilities, ...capabilities]);
176
+ capabilities = [...merged];
164
177
  }
165
- // Translate spawn_rules into capability additions (RD3)
166
- const allowedSpawns = spawnRules[roleName];
167
- if (allowedSpawns) {
168
- for (const targetRole of allowedSpawns) {
169
- const spawnCap = `agent.spawn.${targetRole}`;
170
- if (!capabilities.includes(spawnCap)) {
171
- capabilities.push(spawnCap);
172
- }
173
- }
174
- }
175
- // Build the resolved RoleDefinition for registry
176
178
  const roleDefinition = {
177
179
  name: roleName,
178
- displayName: teamRoleDef?.display_name ?? parentRole.displayName,
179
- description: teamRoleDef?.description ?? parentRole.description,
180
+ displayName: openteamsRole.displayName,
181
+ description: openteamsRole.description,
180
182
  capabilities,
181
- workspace: teamRoleDef?.macro_agent?.workspace
183
+ workspace: macroAgent?.workspace
182
184
  ? {
183
- type: (teamRoleDef.macro_agent.workspace.type ?? "own"),
184
- branchPattern: teamRoleDef.macro_agent.workspace.branch_pattern,
185
- cleanupOnTerminate: teamRoleDef.macro_agent.workspace.cleanup_on_terminate,
185
+ type: (macroAgent.workspace.type ?? "own"),
186
+ branchPattern: macroAgent.workspace.branch_pattern,
187
+ cleanupOnTerminate: macroAgent.workspace.cleanup_on_terminate,
186
188
  }
187
189
  : parentRole.workspace,
188
- lifecycle: teamRoleDef?.macro_agent?.lifecycle
190
+ lifecycle: macroAgent?.lifecycle
189
191
  ? {
190
- type: (teamRoleDef.macro_agent.lifecycle.type ?? "ephemeral"),
191
- cascadeTerminate: teamRoleDef.macro_agent.lifecycle.cascade_terminate,
192
- selfCleanup: teamRoleDef.macro_agent.lifecycle.self_cleanup,
193
- taskBound: teamRoleDef.macro_agent.lifecycle.task_bound,
194
- parentBound: teamRoleDef.macro_agent.lifecycle.parent_bound,
195
- maxDurationMs: teamRoleDef.macro_agent.lifecycle.max_duration_ms,
192
+ type: (macroAgent.lifecycle.type ?? "ephemeral"),
193
+ cascadeTerminate: macroAgent.lifecycle.cascade_terminate,
194
+ selfCleanup: macroAgent.lifecycle.self_cleanup,
195
+ taskBound: macroAgent.lifecycle.task_bound,
196
+ parentBound: macroAgent.lifecycle.parent_bound,
197
+ maxDurationMs: macroAgent.lifecycle.max_duration_ms,
196
198
  }
197
199
  : parentRole.lifecycle,
198
200
  tools: parentRole.tools,
199
201
  protocol: parentRole.protocol,
200
202
  permissions: parentRole.permissions,
201
- extends: teamRoleDef?.extends,
203
+ extends: openteamsRole.extends,
202
204
  systemPrompt: parentRole.systemPrompt,
203
205
  };
204
206
  return {
205
207
  name: roleName,
206
208
  baseRole: baseRoleName,
207
209
  capabilities,
208
- prompt: teamRoleDef?.prompt,
210
+ prompt: openteamsRole.promptFile,
209
211
  roleDefinition,
210
212
  };
211
213
  }
212
214
  // =============================================================================
213
- // Prompt Collection
215
+ // Parse macro_agent extensions
214
216
  // =============================================================================
215
217
  /**
216
- * Collect all prompt file paths referenced by topology and roles.
218
+ * Parse the opaque macro_agent field from the manifest into typed extensions.
217
219
  */
218
- function collectPromptRefs(topology, resolvedRoles) {
219
- const refs = new Set();
220
- // From topology nodes
221
- if (topology.root.prompt)
222
- refs.add(topology.root.prompt);
223
- for (const companion of topology.companions ?? []) {
224
- if (companion.prompt)
225
- refs.add(companion.prompt);
226
- }
227
- // From role definitions
228
- for (const resolved of resolvedRoles.values()) {
229
- if (resolved.prompt)
230
- refs.add(resolved.prompt);
231
- }
232
- return refs;
220
+ function parseMacroAgentExtensions(raw) {
221
+ if (!raw)
222
+ return {};
223
+ return raw;
233
224
  }
234
225
  // =============================================================================
235
- // MCP Server Loading
226
+ // Error Mapping
236
227
  // =============================================================================
237
228
  /**
238
- * Load tools/mcp-servers.json if it exists.
239
- * Returns a map of role name → MCP server entries.
229
+ * Map openteams loader errors to macro-agent TeamLoadError for backward compat.
240
230
  */
241
- function loadMcpServers(teamDir) {
242
- const result = new Map();
243
- const mcpPath = path.join(teamDir, TOOLS_DIR, MCP_SERVERS_FILE);
244
- if (!fs.existsSync(mcpPath)) {
245
- return result;
231
+ function mapToTeamLoadError(err, teamName, teamDir) {
232
+ const message = err instanceof Error ? err.message : String(err);
233
+ if (message.includes("not found") || message.includes("not exist")) {
234
+ return new TeamLoadError(`Team directory or manifest not found: ${teamDir}`, "MANIFEST_NOT_FOUND", teamName);
246
235
  }
247
- const raw = fs.readFileSync(mcpPath, "utf-8");
248
- const parsed = JSON.parse(raw);
249
- for (const [roleName, config] of Object.entries(parsed)) {
250
- if (config.servers && Array.isArray(config.servers)) {
251
- result.set(roleName, config.servers);
252
- }
236
+ if (message.includes("parse") || message.includes("YAML")) {
237
+ return new TeamLoadError(`Failed to parse team manifest: ${message}`, "INVALID_MANIFEST", teamName);
238
+ }
239
+ if (message.includes("role") && message.includes("not in")) {
240
+ return new TeamLoadError(message, "INVALID_MANIFEST", teamName);
241
+ }
242
+ if (message.includes("Circular")) {
243
+ return new TeamLoadError(message, "INVALID_ROLE", teamName);
253
244
  }
254
- return result;
245
+ // Default: treat as invalid manifest
246
+ return new TeamLoadError(`Failed to load team '${teamName}': ${message}`, "INVALID_MANIFEST", teamName);
255
247
  }
256
248
  // =============================================================================
257
249
  // Communication Validation