macro-agent 0.1.1 → 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 (406) hide show
  1. package/.sudocode/issues.jsonl +28 -0
  2. package/.sudocode/specs.jsonl +4 -0
  3. package/CLAUDE.md +9 -3
  4. package/dist/agent/agent-manager.d.ts.map +1 -1
  5. package/dist/agent/agent-manager.js +111 -48
  6. package/dist/agent/agent-manager.js.map +1 -1
  7. package/dist/agent/types.d.ts +7 -0
  8. package/dist/agent/types.d.ts.map +1 -1
  9. package/dist/agent/types.js.map +1 -1
  10. package/dist/api/server.d.ts +5 -1
  11. package/dist/api/server.d.ts.map +1 -1
  12. package/dist/api/server.js +100 -3
  13. package/dist/api/server.js.map +1 -1
  14. package/dist/api/types.d.ts +1 -1
  15. package/dist/api/types.d.ts.map +1 -1
  16. package/dist/cli/acp.d.ts.map +1 -1
  17. package/dist/cli/acp.js +71 -1
  18. package/dist/cli/acp.js.map +1 -1
  19. package/dist/cli/index.js +5 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/mcp.js +27 -8
  22. package/dist/cli/mcp.js.map +1 -1
  23. package/dist/config/project-config.d.ts +13 -2
  24. package/dist/config/project-config.d.ts.map +1 -1
  25. package/dist/config/project-config.js +12 -2
  26. package/dist/config/project-config.js.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/lifecycle/handlers/index.d.ts +7 -3
  32. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  33. package/dist/lifecycle/handlers/index.js +25 -8
  34. package/dist/lifecycle/handlers/index.js.map +1 -1
  35. package/dist/lifecycle/types.d.ts +2 -0
  36. package/dist/lifecycle/types.d.ts.map +1 -1
  37. package/dist/lifecycle/types.js.map +1 -1
  38. package/dist/map/adapter/extensions/index.d.ts +4 -1
  39. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  40. package/dist/map/adapter/extensions/index.js +27 -0
  41. package/dist/map/adapter/extensions/index.js.map +1 -1
  42. package/dist/map/adapter/extensions/streams.d.ts +95 -0
  43. package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
  44. package/dist/map/adapter/extensions/streams.js +515 -0
  45. package/dist/map/adapter/extensions/streams.js.map +1 -0
  46. package/dist/map/adapter/index.d.ts +1 -1
  47. package/dist/map/adapter/index.d.ts.map +1 -1
  48. package/dist/map/adapter/index.js +3 -1
  49. package/dist/map/adapter/index.js.map +1 -1
  50. package/dist/map/adapter/types.d.ts +1 -1
  51. package/dist/map/adapter/types.d.ts.map +1 -1
  52. package/dist/mcp/mcp-server.d.ts +2 -0
  53. package/dist/mcp/mcp-server.d.ts.map +1 -1
  54. package/dist/mcp/mcp-server.js +12 -3
  55. package/dist/mcp/mcp-server.js.map +1 -1
  56. package/dist/mcp/tools/done.d.ts.map +1 -1
  57. package/dist/mcp/tools/done.js +18 -0
  58. package/dist/mcp/tools/done.js.map +1 -1
  59. package/dist/roles/builtin/coordinator.d.ts.map +1 -1
  60. package/dist/roles/builtin/coordinator.js +2 -1
  61. package/dist/roles/builtin/coordinator.js.map +1 -1
  62. package/dist/roles/builtin/integrator.d.ts.map +1 -1
  63. package/dist/roles/builtin/integrator.js +2 -1
  64. package/dist/roles/builtin/integrator.js.map +1 -1
  65. package/dist/roles/builtin/worker.d.ts.map +1 -1
  66. package/dist/roles/builtin/worker.js +3 -1
  67. package/dist/roles/builtin/worker.js.map +1 -1
  68. package/dist/roles/capabilities.d.ts +6 -0
  69. package/dist/roles/capabilities.d.ts.map +1 -1
  70. package/dist/roles/capabilities.js +10 -0
  71. package/dist/roles/capabilities.js.map +1 -1
  72. package/dist/roles/config-loader.d.ts +1 -1
  73. package/dist/roles/config-loader.d.ts.map +1 -1
  74. package/dist/roles/config-loader.js +3 -2
  75. package/dist/roles/config-loader.js.map +1 -1
  76. package/dist/roles/types.d.ts +3 -1
  77. package/dist/roles/types.d.ts.map +1 -1
  78. package/dist/server/combined-server.d.ts +8 -1
  79. package/dist/server/combined-server.d.ts.map +1 -1
  80. package/dist/server/combined-server.js +6 -2
  81. package/dist/server/combined-server.js.map +1 -1
  82. package/dist/store/event-store.d.ts.map +1 -1
  83. package/dist/store/event-store.js +12 -5
  84. package/dist/store/event-store.js.map +1 -1
  85. package/dist/store/instance.d.ts +1 -1
  86. package/dist/store/instance.d.ts.map +1 -1
  87. package/dist/store/instance.js +2 -2
  88. package/dist/store/instance.js.map +1 -1
  89. package/dist/store/types/agents.d.ts +5 -0
  90. package/dist/store/types/agents.d.ts.map +1 -1
  91. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -1
  92. package/dist/task/backend/opentasks/daemon-manager.js +1 -1
  93. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -1
  94. package/dist/teams/index.d.ts +3 -1
  95. package/dist/teams/index.d.ts.map +1 -1
  96. package/dist/teams/index.js +2 -0
  97. package/dist/teams/index.js.map +1 -1
  98. package/dist/teams/seed-defaults.d.ts +20 -0
  99. package/dist/teams/seed-defaults.d.ts.map +1 -0
  100. package/dist/teams/seed-defaults.js +71 -0
  101. package/dist/teams/seed-defaults.js.map +1 -0
  102. package/dist/teams/team-loader.d.ts +6 -2
  103. package/dist/teams/team-loader.d.ts.map +1 -1
  104. package/dist/teams/team-loader.js +154 -162
  105. package/dist/teams/team-loader.js.map +1 -1
  106. package/dist/teams/team-manager.d.ts +112 -0
  107. package/dist/teams/team-manager.d.ts.map +1 -0
  108. package/dist/teams/team-manager.js +305 -0
  109. package/dist/teams/team-manager.js.map +1 -0
  110. package/dist/teams/team-runtime.d.ts +125 -19
  111. package/dist/teams/team-runtime.d.ts.map +1 -1
  112. package/dist/teams/team-runtime.js +527 -119
  113. package/dist/teams/team-runtime.js.map +1 -1
  114. package/dist/teams/types.d.ts +41 -151
  115. package/dist/teams/types.d.ts.map +1 -1
  116. package/dist/teams/types.js +2 -3
  117. package/dist/teams/types.js.map +1 -1
  118. package/docs/teams.md +73 -0
  119. package/package.json +2 -1
  120. package/references/minimem/.claude/settings.json +7 -0
  121. package/references/minimem/.sudocode/issues.jsonl +18 -0
  122. package/references/minimem/.sudocode/specs.jsonl +1 -0
  123. package/references/minimem/CLAUDE.md +310 -0
  124. package/references/minimem/README.md +562 -0
  125. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  126. package/references/minimem/claude-plugin/.mcp.json +7 -0
  127. package/references/minimem/claude-plugin/README.md +158 -0
  128. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  129. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  130. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  131. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  132. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  133. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  134. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  135. package/references/minimem/media/banner.png +0 -0
  136. package/references/minimem/package-lock.json +5373 -0
  137. package/references/minimem/package.json +72 -0
  138. package/references/minimem/scripts/postbuild.js +35 -0
  139. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  140. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  141. package/references/minimem/src/__tests__/helpers.ts +199 -0
  142. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  143. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  144. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  145. package/references/minimem/src/__tests__/session.test.ts +190 -0
  146. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  147. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  148. package/references/minimem/src/cli/commands/append.ts +76 -0
  149. package/references/minimem/src/cli/commands/config.ts +262 -0
  150. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  151. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  152. package/references/minimem/src/cli/commands/index.ts +12 -0
  153. package/references/minimem/src/cli/commands/init.ts +88 -0
  154. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  155. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  156. package/references/minimem/src/cli/commands/search.ts +158 -0
  157. package/references/minimem/src/cli/commands/status.ts +84 -0
  158. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  159. package/references/minimem/src/cli/commands/sync.ts +70 -0
  160. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  161. package/references/minimem/src/cli/config.ts +584 -0
  162. package/references/minimem/src/cli/index.ts +264 -0
  163. package/references/minimem/src/cli/shared.ts +161 -0
  164. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  165. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  166. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  167. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  168. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  169. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  170. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  171. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  172. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  173. package/references/minimem/src/cli/sync/central.ts +292 -0
  174. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  175. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  176. package/references/minimem/src/cli/sync/detection.ts +138 -0
  177. package/references/minimem/src/cli/sync/index.ts +107 -0
  178. package/references/minimem/src/cli/sync/operations.ts +373 -0
  179. package/references/minimem/src/cli/sync/registry.ts +279 -0
  180. package/references/minimem/src/cli/sync/state.ts +355 -0
  181. package/references/minimem/src/cli/sync/validation.ts +206 -0
  182. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  183. package/references/minimem/src/cli/version.ts +34 -0
  184. package/references/minimem/src/core/index.ts +9 -0
  185. package/references/minimem/src/core/indexer.ts +628 -0
  186. package/references/minimem/src/core/searcher.ts +221 -0
  187. package/references/minimem/src/db/schema.ts +183 -0
  188. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  189. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  190. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  191. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  192. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  193. package/references/minimem/src/index.ts +109 -0
  194. package/references/minimem/src/internal.ts +299 -0
  195. package/references/minimem/src/minimem.ts +1276 -0
  196. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  197. package/references/minimem/src/search/graph.ts +234 -0
  198. package/references/minimem/src/search/hybrid.ts +151 -0
  199. package/references/minimem/src/search/search.ts +256 -0
  200. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  201. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  202. package/references/minimem/src/server/mcp.ts +326 -0
  203. package/references/minimem/src/server/tools.ts +720 -0
  204. package/references/minimem/src/session.ts +460 -0
  205. package/references/minimem/tsconfig.json +19 -0
  206. package/references/minimem/tsup.config.ts +26 -0
  207. package/references/minimem/vitest.config.ts +24 -0
  208. package/references/openteams/.claude/settings.json +6 -0
  209. package/references/openteams/README.md +1 -0
  210. package/references/openteams/SKILL.md +341 -0
  211. package/references/openteams/design.md +411 -0
  212. package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
  213. package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
  214. package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
  215. package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
  216. package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
  217. package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
  218. package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
  219. package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
  220. package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
  221. package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
  222. package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
  223. package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
  224. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
  225. package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
  226. package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
  227. package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
  228. package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
  229. package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
  230. package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
  231. package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
  232. package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
  233. package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
  234. package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
  235. package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
  236. package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
  237. package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
  238. package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
  239. package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
  240. package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
  241. package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
  242. package/references/openteams/examples/bmad-method/team.yaml +161 -0
  243. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
  244. package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
  245. package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
  246. package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
  247. package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
  248. package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
  249. package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
  250. package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
  251. package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
  252. package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
  253. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
  254. package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
  255. package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
  256. package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
  257. package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
  258. package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
  259. package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
  260. package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
  261. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
  262. package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
  263. package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
  264. package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
  265. package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
  266. package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
  267. package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
  268. package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
  269. package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
  270. package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
  271. package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
  272. package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
  273. package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
  274. package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
  275. package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
  276. package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
  277. package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
  278. package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
  279. package/references/openteams/examples/get-shit-done/team.yaml +154 -0
  280. package/references/openteams/package-lock.json +2181 -0
  281. package/references/openteams/package.json +48 -0
  282. package/references/openteams/schema/role.schema.json +125 -0
  283. package/references/openteams/schema/team.schema.json +284 -0
  284. package/references/openteams/src/cli/agent.ts +104 -0
  285. package/references/openteams/src/cli/cli.test.ts +381 -0
  286. package/references/openteams/src/cli/generate.ts +220 -0
  287. package/references/openteams/src/cli/message.ts +241 -0
  288. package/references/openteams/src/cli/task.ts +154 -0
  289. package/references/openteams/src/cli/team.ts +104 -0
  290. package/references/openteams/src/cli/template.ts +207 -0
  291. package/references/openteams/src/cli.ts +45 -0
  292. package/references/openteams/src/db/database.test.ts +185 -0
  293. package/references/openteams/src/db/database.ts +240 -0
  294. package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
  295. package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
  296. package/references/openteams/src/generators/package-generator.test.ts +129 -0
  297. package/references/openteams/src/generators/package-generator.ts +102 -0
  298. package/references/openteams/src/generators/skill-generator.test.ts +246 -0
  299. package/references/openteams/src/generators/skill-generator.ts +374 -0
  300. package/references/openteams/src/index.ts +104 -0
  301. package/references/openteams/src/services/agent-service.test.ts +158 -0
  302. package/references/openteams/src/services/agent-service.ts +84 -0
  303. package/references/openteams/src/services/communication-service.test.ts +455 -0
  304. package/references/openteams/src/services/communication-service.ts +371 -0
  305. package/references/openteams/src/services/message-service.test.ts +342 -0
  306. package/references/openteams/src/services/message-service.ts +203 -0
  307. package/references/openteams/src/services/task-service.test.ts +434 -0
  308. package/references/openteams/src/services/task-service.ts +239 -0
  309. package/references/openteams/src/services/team-service.test.ts +181 -0
  310. package/references/openteams/src/services/team-service.ts +139 -0
  311. package/references/openteams/src/services/template-service.test.ts +306 -0
  312. package/references/openteams/src/services/template-service.ts +182 -0
  313. package/references/openteams/src/spawner/acp-factory.ts +96 -0
  314. package/references/openteams/src/spawner/interface.ts +31 -0
  315. package/references/openteams/src/spawner/mock.test.ts +93 -0
  316. package/references/openteams/src/spawner/mock.ts +59 -0
  317. package/references/openteams/src/template/loader.test.ts +1319 -0
  318. package/references/openteams/src/template/loader.ts +698 -0
  319. package/references/openteams/src/template/types.ts +200 -0
  320. package/references/openteams/src/types.ts +205 -0
  321. package/references/openteams/tsconfig.json +18 -0
  322. package/references/openteams/vitest.config.ts +9 -0
  323. package/references/skill-tree/.claude/settings.json +6 -0
  324. package/references/skill-tree/.sudocode/issues.jsonl +11 -0
  325. package/references/skill-tree/.sudocode/specs.jsonl +1 -0
  326. package/references/skill-tree/CLAUDE.md +150 -0
  327. package/references/skill-tree/README.md +324 -0
  328. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  329. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  330. package/references/skill-tree/docs/TODOS.md +91 -0
  331. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  332. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  333. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  334. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  335. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  336. package/references/skill-tree/docs/scraper/README.md +170 -0
  337. package/references/skill-tree/examples/basic-usage.ts +190 -0
  338. package/references/skill-tree/package-lock.json +1509 -0
  339. package/references/skill-tree/package.json +66 -0
  340. package/references/skill-tree/scraper/README.md +123 -0
  341. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  342. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  343. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  344. package/references/skill-tree/scraper/package-lock.json +6329 -0
  345. package/references/skill-tree/scraper/package.json +68 -0
  346. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  347. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  348. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  349. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  350. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  351. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  352. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  353. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  354. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  355. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  356. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  357. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  358. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  359. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  360. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  361. package/references/skill-tree/test/run-all.ts +106 -0
  362. package/references/skill-tree/test/utils.ts +128 -0
  363. package/references/skill-tree/vitest.config.ts +16 -0
  364. package/src/agent/agent-manager.ts +143 -72
  365. package/src/agent/types.ts +9 -0
  366. package/src/api/__tests__/server.test.ts +203 -4
  367. package/src/api/server.ts +130 -5
  368. package/src/api/types.ts +3 -1
  369. package/src/cli/acp.ts +68 -1
  370. package/src/cli/index.ts +5 -1
  371. package/src/cli/mcp.ts +27 -13
  372. package/src/config/project-config.ts +27 -3
  373. package/src/index.ts +3 -0
  374. package/src/lifecycle/__tests__/handlers.test.ts +53 -0
  375. package/src/lifecycle/handlers/index.ts +25 -8
  376. package/src/lifecycle/types.ts +3 -0
  377. package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
  378. package/src/map/adapter/extensions/index.ts +36 -0
  379. package/src/map/adapter/extensions/streams.ts +839 -0
  380. package/src/map/adapter/index.ts +5 -0
  381. package/src/map/adapter/types.ts +8 -1
  382. package/src/mcp/mcp-server.ts +14 -3
  383. package/src/mcp/tools/done.ts +19 -0
  384. package/src/roles/builtin/coordinator.ts +2 -0
  385. package/src/roles/builtin/integrator.ts +2 -0
  386. package/src/roles/builtin/worker.ts +3 -0
  387. package/src/roles/capabilities.ts +11 -0
  388. package/src/roles/config-loader.ts +3 -2
  389. package/src/roles/types.ts +7 -0
  390. package/src/server/combined-server.ts +15 -1
  391. package/src/store/__tests__/event-store-oob.test.ts +109 -0
  392. package/src/store/event-store.ts +13 -3
  393. package/src/store/instance.ts +2 -2
  394. package/src/store/types/agents.ts +5 -0
  395. package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
  396. package/src/task/backend/opentasks/daemon-manager.ts +4 -1
  397. package/src/teams/CLAUDE.md +180 -0
  398. package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
  399. package/src/teams/__tests__/team-manager.test.ts +814 -0
  400. package/src/teams/__tests__/team-system.test.ts +1291 -8
  401. package/src/teams/index.ts +21 -3
  402. package/src/teams/seed-defaults.ts +79 -0
  403. package/src/teams/team-loader.ts +200 -234
  404. package/src/teams/team-manager.ts +387 -0
  405. package/src/teams/team-runtime.ts +590 -121
  406. package/src/teams/types.ts +99 -200
@@ -1,25 +1,26 @@
1
1
  /**
2
2
  * Team Template Loader
3
3
  *
4
- * Reads .multiagent/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
9
 
10
- import * as fs from "fs";
11
10
  import * as path from "path";
12
- import yaml from "js-yaml";
11
+ import { TemplateLoader } from "openteams";
12
+ import type {
13
+ ResolvedRole,
14
+ TeamManifest as OpenTeamsManifest,
15
+ } from "openteams";
13
16
  import type { RoleRegistry, RoleDefinition, Capability } from "../roles/types.js";
14
17
  import {
15
18
  TeamLoadError,
16
19
  type TeamManifest,
17
- type TeamTopology,
18
- type TeamCommunication,
20
+ type TeamRoleMacroAgent,
19
21
  type MacroAgentExtensions,
20
- type TeamRoleDefinition,
21
22
  type ResolvedTeamRole,
22
- type McpServerEntry,
23
+ type CommunicationConfig,
23
24
  } from "./types.js";
24
25
 
25
26
  // =============================================================================
@@ -27,11 +28,6 @@ import {
27
28
  // =============================================================================
28
29
 
29
30
  const TEAMS_DIR = ".multiagent/teams";
30
- const MANIFEST_FILE = "team.yaml";
31
- const ROLES_DIR = "roles";
32
- const PROMPTS_DIR = "prompts";
33
- const TOOLS_DIR = "tools";
34
- const MCP_SERVERS_FILE = "mcp-servers.json";
35
31
 
36
32
  // =============================================================================
37
33
  // TeamLoader
@@ -40,6 +36,10 @@ const MCP_SERVERS_FILE = "mcp-servers.json";
40
36
  /**
41
37
  * Load a team template from disk and resolve all references.
42
38
  *
39
+ * Delegates to openteams TemplateLoader for YAML parsing, role resolution,
40
+ * prompt loading, and MCP server config. Enriches the result with macro-agent
41
+ * specific enforcement (workspace, lifecycle, spawn rules).
42
+ *
43
43
  * @param teamName - Team name (directory name under .multiagent/teams/)
44
44
  * @param roleRegistry - Role registry for resolving extends chains
45
45
  * @param basePath - Project root (default: process.cwd())
@@ -53,248 +53,206 @@ export async function loadTeam(
53
53
  const root = basePath ?? process.cwd();
54
54
  const teamDir = path.join(root, TEAMS_DIR, teamName);
55
55
 
56
- // 1. Check team directory exists
57
- if (!fs.existsSync(teamDir)) {
58
- throw new TeamLoadError(
59
- `Team directory not found: ${teamDir}`,
60
- "MANIFEST_NOT_FOUND",
61
- teamName
62
- );
63
- }
64
-
65
- // 2. Read and parse team.yaml
66
- const manifestPath = path.join(teamDir, MANIFEST_FILE);
67
- if (!fs.existsSync(manifestPath)) {
68
- throw new TeamLoadError(
69
- `Team manifest not found: ${manifestPath}`,
70
- "MANIFEST_NOT_FOUND",
71
- teamName
72
- );
73
- }
74
-
75
- const raw = fs.readFileSync(manifestPath, "utf-8");
76
- let parsed: Record<string, unknown>;
56
+ // 1. Load via openteams TemplateLoader with hooks
57
+ let template;
77
58
  try {
78
- parsed = yaml.load(raw) as Record<string, unknown>;
59
+ template = await TemplateLoader.loadAsync(teamDir, {
60
+ resolveExternalRole: (name) => mapRegistryRole(roleRegistry, name),
61
+ postProcessRole: (role, manifest) =>
62
+ enrichRoleWithSpawnRules(role, manifest),
63
+ });
79
64
  } catch (err) {
80
- throw new TeamLoadError(
81
- `Failed to parse ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,
82
- "INVALID_MANIFEST",
83
- teamName
84
- );
65
+ throw mapToTeamLoadError(err, teamName, teamDir);
85
66
  }
86
67
 
87
- // 3. Validate required fields
88
- validateManifest(parsed, teamName);
89
-
90
- const topology = parsed.topology as TeamTopology;
91
- const communication = (parsed.communication ?? {}) as TeamCommunication;
92
- const macroAgent = (parsed.macro_agent ?? {}) as MacroAgentExtensions;
93
- const roleNames = parsed.roles as string[];
68
+ const manifest = template.manifest;
69
+ const communication = (manifest.communication ?? {}) as CommunicationConfig;
70
+ const macroAgent = parseMacroAgentExtensions(manifest.macro_agent);
94
71
 
95
- // 4. Resolve roles
72
+ // 2. Build enforcement-enriched roles
96
73
  const resolvedRoles = new Map<string, ResolvedTeamRole>();
97
- const spawnRules = topology.spawn_rules ?? {};
98
-
99
- for (const roleName of roleNames) {
100
- const resolved = resolveTeamRole(
74
+ for (const [roleName, openteamsRole] of template.roles) {
75
+ resolvedRoles.set(
101
76
  roleName,
102
- teamDir,
103
- roleRegistry,
104
- spawnRules
77
+ buildResolvedTeamRole(roleName, openteamsRole, roleRegistry)
105
78
  );
106
- resolvedRoles.set(roleName, resolved);
107
79
  }
108
80
 
109
- // 5. Load prompts
81
+ // 3. Build loaded prompts map (backward compat: path → assembled content)
82
+ // Assembles multi-file prompts (primary + additional sections) into a single
83
+ // string so the runtime can use it transparently.
110
84
  const loadedPrompts = new Map<string, string>();
85
+ for (const [roleName, resolvedPrompts] of template.prompts) {
86
+ if (!resolvedPrompts.primary) continue;
87
+ const role = template.roles.get(roleName);
88
+
89
+ // Assemble full prompt: primary + additional sections
90
+ let fullPrompt = resolvedPrompts.primary;
91
+ for (const section of resolvedPrompts.additional) {
92
+ fullPrompt += `\n\n## ${section.name}\n\n${section.content}`;
93
+ }
111
94
 
112
- // Load prompts from topology nodes
113
- const promptRefs = collectPromptRefs(topology, resolvedRoles);
114
- for (const promptPath of promptRefs) {
115
- const fullPath = path.join(teamDir, promptPath);
116
- if (!fs.existsSync(fullPath)) {
117
- throw new TeamLoadError(
118
- `Prompt file not found: ${fullPath}`,
119
- "PROMPT_NOT_FOUND",
120
- teamName
121
- );
95
+ // Store under role's promptFile key (used by getPromptForRole)
96
+ if (role?.promptFile) {
97
+ loadedPrompts.set(role.promptFile, fullPrompt);
98
+ }
99
+
100
+ // Store under topology node prompt keys (used by getPromptForTopologyNode)
101
+ if (manifest.topology.root.role === roleName && manifest.topology.root.prompt) {
102
+ loadedPrompts.set(manifest.topology.root.prompt, fullPrompt);
103
+ }
104
+ for (const comp of manifest.topology.companions ?? []) {
105
+ if (comp.role === roleName && comp.prompt) {
106
+ loadedPrompts.set(comp.prompt, fullPrompt);
107
+ }
122
108
  }
123
- loadedPrompts.set(promptPath, fs.readFileSync(fullPath, "utf-8"));
124
- }
125
109
 
126
- // 6. Load MCP server configs
127
- const mcpServers = loadMcpServers(teamDir);
110
+ // Convention fallback key
111
+ if (!role?.promptFile) {
112
+ loadedPrompts.set(`prompts/${roleName}.md`, fullPrompt);
113
+ }
114
+ }
128
115
 
129
- // 7. Validate communication topology
130
- validateCommunication(communication, roleNames, teamName);
116
+ // 4. Validate communication topology
117
+ validateCommunication(communication, manifest.roles, teamName);
131
118
 
132
119
  return {
133
- name: parsed.name as string,
134
- description: (parsed.description as string) ?? "",
135
- version: (parsed.version as number) ?? 1,
136
- roles: roleNames,
137
- topology,
120
+ name: manifest.name,
121
+ description: (manifest.description as string) ?? "",
122
+ version: manifest.version ?? 1,
123
+ roles: manifest.roles,
124
+ topology: manifest.topology,
138
125
  communication,
139
126
  macro_agent: macroAgent,
140
127
  _resolvedRoles: resolvedRoles,
141
128
  _loadedPrompts: loadedPrompts,
142
- _mcpServers: mcpServers,
129
+ _mcpServers: template.mcpServers,
143
130
  };
144
131
  }
145
132
 
146
133
  // =============================================================================
147
- // Manifest Validation
134
+ // Hook: Map RoleRegistry → openteams ResolvedRole
148
135
  // =============================================================================
149
136
 
150
- function validateManifest(
151
- parsed: Record<string, unknown>,
152
- teamName: string
153
- ): void {
154
- if (!parsed || typeof parsed !== "object") {
155
- throw new TeamLoadError(
156
- "Team manifest must be a YAML object",
157
- "INVALID_MANIFEST",
158
- teamName
159
- );
160
- }
161
-
162
- if (!parsed.name || typeof parsed.name !== "string") {
163
- throw new TeamLoadError(
164
- "Team manifest requires a 'name' string field",
165
- "INVALID_MANIFEST",
166
- teamName
167
- );
137
+ /**
138
+ * Convert a macro-agent RoleRegistry entry to an openteams ResolvedRole.
139
+ * Used as the resolveExternalRole hook for TemplateLoader.
140
+ */
141
+ function mapRegistryRole(
142
+ roleRegistry: RoleRegistry,
143
+ name: string
144
+ ): ResolvedRole | null {
145
+ try {
146
+ const rd = roleRegistry.resolveRole(name);
147
+ return {
148
+ name: rd.name,
149
+ displayName: rd.displayName ?? rd.name,
150
+ description: rd.description ?? `Role: ${rd.name}`,
151
+ capabilities: [...rd.capabilities],
152
+ raw: { name: rd.name, capabilities: [...rd.capabilities] },
153
+ };
154
+ } catch {
155
+ return null;
168
156
  }
157
+ }
169
158
 
170
- if (!Array.isArray(parsed.roles) || parsed.roles.length === 0) {
171
- throw new TeamLoadError(
172
- "Team manifest requires a non-empty 'roles' array",
173
- "INVALID_MANIFEST",
174
- teamName
175
- );
176
- }
159
+ // =============================================================================
160
+ // Hook: Enrich roles with spawn_rules capabilities
161
+ // =============================================================================
177
162
 
178
- if (!parsed.topology || typeof parsed.topology !== "object") {
179
- throw new TeamLoadError(
180
- "Team manifest requires a 'topology' object",
181
- "INVALID_MANIFEST",
182
- teamName
183
- );
163
+ /**
164
+ * Translate team topology spawn_rules into agent.spawn.* capabilities.
165
+ * Used as the postProcessRole hook for TemplateLoader.
166
+ */
167
+ function enrichRoleWithSpawnRules(
168
+ role: ResolvedRole,
169
+ manifest: OpenTeamsManifest
170
+ ): ResolvedRole {
171
+ const spawnRules = manifest.topology.spawn_rules;
172
+ if (!spawnRules) return role;
173
+
174
+ const allowedSpawns = spawnRules[role.name];
175
+ if (!allowedSpawns || allowedSpawns.length === 0) return role;
176
+
177
+ const capabilities = [...role.capabilities];
178
+ for (const target of allowedSpawns) {
179
+ const cap = `agent.spawn.${target}`;
180
+ if (!capabilities.includes(cap)) {
181
+ capabilities.push(cap);
182
+ }
184
183
  }
185
184
 
186
- const topology = parsed.topology as Record<string, unknown>;
187
- if (!topology.root || typeof topology.root !== "object") {
188
- throw new TeamLoadError(
189
- "Team topology requires a 'root' object",
190
- "INVALID_MANIFEST",
191
- teamName
192
- );
193
- }
185
+ return { ...role, capabilities };
194
186
  }
195
187
 
196
188
  // =============================================================================
197
- // Role Resolution
189
+ // Build ResolvedTeamRole
198
190
  // =============================================================================
199
191
 
200
192
  /**
201
- * Resolve a single team role: load YAML if present, resolve extends,
202
- * compute capabilities, translate spawn rules.
193
+ * Build a macro-agent ResolvedTeamRole from an openteams ResolvedRole.
194
+ * Enriches with enforcement-specific fields (workspace, lifecycle, tools, etc.)
195
+ * from the parent RoleDefinition and macro_agent overrides from role YAML.
203
196
  */
204
- function resolveTeamRole(
197
+ function buildResolvedTeamRole(
205
198
  roleName: string,
206
- teamDir: string,
207
- roleRegistry: RoleRegistry,
208
- spawnRules: Record<string, string[]>
199
+ openteamsRole: ResolvedRole,
200
+ roleRegistry: RoleRegistry
209
201
  ): ResolvedTeamRole {
210
- // Try to load role YAML from team directory
211
- const roleFilePath = path.join(teamDir, ROLES_DIR, `${roleName}.yaml`);
212
- let teamRoleDef: TeamRoleDefinition | null = null;
213
-
214
- if (fs.existsSync(roleFilePath)) {
215
- const raw = fs.readFileSync(roleFilePath, "utf-8");
216
- try {
217
- teamRoleDef = yaml.load(raw) as TeamRoleDefinition;
218
- } catch (err) {
219
- throw new TeamLoadError(
220
- `Failed to parse role file ${roleFilePath}: ${err instanceof Error ? err.message : String(err)}`,
221
- "INVALID_ROLE",
222
- roleName
223
- );
224
- }
225
- }
202
+ const baseRoleName = openteamsRole.extends ?? roleName;
226
203
 
227
- // Determine base role
228
- const baseRoleName = teamRoleDef?.extends ?? roleName;
229
204
  let parentRole: RoleDefinition;
230
205
  try {
231
206
  parentRole = roleRegistry.resolveRole(baseRoleName);
232
207
  } catch {
233
- throw new TeamLoadError(
234
- `Base role '${baseRoleName}' not found for team role '${roleName}'`,
235
- "ROLE_NOT_FOUND",
236
- roleName
237
- );
208
+ // Fallback for roles without a registry parent
209
+ parentRole = {
210
+ name: baseRoleName,
211
+ displayName: baseRoleName,
212
+ description: `Role: ${baseRoleName}`,
213
+ capabilities: [],
214
+ } as RoleDefinition;
238
215
  }
239
216
 
240
- // Compute capabilities
241
- let capabilities: Capability[];
242
- if (teamRoleDef?.capabilities) {
243
- // Full replacement
244
- capabilities = teamRoleDef.capabilities as Capability[];
245
- } else if (teamRoleDef?.capabilities_add || teamRoleDef?.capabilities_remove) {
246
- // Additive/subtractive
247
- const base = new Set(parentRole.capabilities);
248
- for (const cap of teamRoleDef.capabilities_add ?? []) {
249
- base.add(cap as Capability);
250
- }
251
- for (const cap of teamRoleDef.capabilities_remove ?? []) {
252
- base.delete(cap as Capability);
253
- }
254
- capabilities = Array.from(base);
255
- } else {
256
- // Inherit parent capabilities
257
- capabilities = [...parentRole.capabilities];
217
+ const macroAgent = openteamsRole.raw.macro_agent as TeamRoleMacroAgent | undefined;
218
+ let capabilities = openteamsRole.capabilities as Capability[];
219
+
220
+ // If the role YAML had no capability specification (no capabilities,
221
+ // capabilities_add, or capabilities_remove), openteams leaves capabilities
222
+ // empty. In that case, inherit all parent capabilities. Spawn-rule enrichment
223
+ // may have already added some caps, so merge with parent.
224
+ const hasExplicitCapabilitySpec = openteamsRole.raw.capabilities !== undefined;
225
+ if (!hasExplicitCapabilitySpec && parentRole.capabilities.length > 0) {
226
+ const merged = new Set<string>([...parentRole.capabilities, ...capabilities]);
227
+ capabilities = [...merged] as Capability[];
258
228
  }
259
229
 
260
- // Translate spawn_rules into capability additions (RD3)
261
- const allowedSpawns = spawnRules[roleName];
262
- if (allowedSpawns) {
263
- for (const targetRole of allowedSpawns) {
264
- const spawnCap = `agent.spawn.${targetRole}` as Capability;
265
- if (!capabilities.includes(spawnCap)) {
266
- capabilities.push(spawnCap);
267
- }
268
- }
269
- }
270
-
271
- // Build the resolved RoleDefinition for registry
272
230
  const roleDefinition: RoleDefinition = {
273
231
  name: roleName,
274
- displayName: teamRoleDef?.display_name ?? parentRole.displayName,
275
- description: teamRoleDef?.description ?? parentRole.description,
232
+ displayName: openteamsRole.displayName,
233
+ description: openteamsRole.description,
276
234
  capabilities,
277
- workspace: teamRoleDef?.macro_agent?.workspace
235
+ workspace: macroAgent?.workspace
278
236
  ? {
279
- type: (teamRoleDef.macro_agent.workspace.type ?? "own") as "own" | "shared" | "mount" | "none",
280
- branchPattern: teamRoleDef.macro_agent.workspace.branch_pattern,
281
- cleanupOnTerminate: teamRoleDef.macro_agent.workspace.cleanup_on_terminate,
237
+ type: (macroAgent.workspace.type ?? "own") as "own" | "shared" | "mount" | "none",
238
+ branchPattern: macroAgent.workspace.branch_pattern,
239
+ cleanupOnTerminate: macroAgent.workspace.cleanup_on_terminate,
282
240
  }
283
241
  : parentRole.workspace,
284
- lifecycle: teamRoleDef?.macro_agent?.lifecycle
242
+ lifecycle: macroAgent?.lifecycle
285
243
  ? {
286
- type: (teamRoleDef.macro_agent.lifecycle.type ?? "ephemeral") as "ephemeral" | "persistent" | "daemon" | "event-driven",
287
- cascadeTerminate: teamRoleDef.macro_agent.lifecycle.cascade_terminate,
288
- selfCleanup: teamRoleDef.macro_agent.lifecycle.self_cleanup,
289
- taskBound: teamRoleDef.macro_agent.lifecycle.task_bound,
290
- parentBound: teamRoleDef.macro_agent.lifecycle.parent_bound,
291
- maxDurationMs: teamRoleDef.macro_agent.lifecycle.max_duration_ms,
244
+ type: (macroAgent.lifecycle.type ?? "ephemeral") as "ephemeral" | "persistent" | "daemon" | "event-driven",
245
+ cascadeTerminate: macroAgent.lifecycle.cascade_terminate,
246
+ selfCleanup: macroAgent.lifecycle.self_cleanup,
247
+ taskBound: macroAgent.lifecycle.task_bound,
248
+ parentBound: macroAgent.lifecycle.parent_bound,
249
+ maxDurationMs: macroAgent.lifecycle.max_duration_ms,
292
250
  }
293
251
  : parentRole.lifecycle,
294
252
  tools: parentRole.tools,
295
253
  protocol: parentRole.protocol,
296
254
  permissions: parentRole.permissions,
297
- extends: teamRoleDef?.extends,
255
+ extends: openteamsRole.extends,
298
256
  systemPrompt: parentRole.systemPrompt,
299
257
  };
300
258
 
@@ -302,69 +260,77 @@ function resolveTeamRole(
302
260
  name: roleName,
303
261
  baseRole: baseRoleName,
304
262
  capabilities,
305
- prompt: teamRoleDef?.prompt,
263
+ prompt: openteamsRole.promptFile,
306
264
  roleDefinition,
307
265
  };
308
266
  }
309
267
 
310
268
  // =============================================================================
311
- // Prompt Collection
269
+ // Parse macro_agent extensions
312
270
  // =============================================================================
313
271
 
314
272
  /**
315
- * Collect all prompt file paths referenced by topology and roles.
273
+ * Parse the opaque macro_agent field from the manifest into typed extensions.
316
274
  */
317
- function collectPromptRefs(
318
- topology: TeamTopology,
319
- resolvedRoles: Map<string, ResolvedTeamRole>
320
- ): Set<string> {
321
- const refs = new Set<string>();
322
-
323
- // From topology nodes
324
- if (topology.root.prompt) refs.add(topology.root.prompt);
325
- for (const companion of topology.companions ?? []) {
326
- if (companion.prompt) refs.add(companion.prompt);
327
- }
328
-
329
- // From role definitions
330
- for (const resolved of resolvedRoles.values()) {
331
- if (resolved.prompt) refs.add(resolved.prompt);
332
- }
333
-
334
- return refs;
275
+ function parseMacroAgentExtensions(
276
+ raw: Record<string, unknown> | undefined
277
+ ): MacroAgentExtensions {
278
+ if (!raw) return {};
279
+ return raw as MacroAgentExtensions;
335
280
  }
336
281
 
337
282
  // =============================================================================
338
- // MCP Server Loading
283
+ // Error Mapping
339
284
  // =============================================================================
340
285
 
341
286
  /**
342
- * Load tools/mcp-servers.json if it exists.
343
- * Returns a map of role name → MCP server entries.
287
+ * Map openteams loader errors to macro-agent TeamLoadError for backward compat.
344
288
  */
345
- function loadMcpServers(
289
+ function mapToTeamLoadError(
290
+ err: unknown,
291
+ teamName: string,
346
292
  teamDir: string
347
- ): Map<string, McpServerEntry[]> {
348
- const result = new Map<string, McpServerEntry[]>();
349
- const mcpPath = path.join(teamDir, TOOLS_DIR, MCP_SERVERS_FILE);
293
+ ): TeamLoadError {
294
+ const message = err instanceof Error ? err.message : String(err);
295
+
296
+ if (message.includes("not found") || message.includes("not exist")) {
297
+ return new TeamLoadError(
298
+ `Team directory or manifest not found: ${teamDir}`,
299
+ "MANIFEST_NOT_FOUND",
300
+ teamName
301
+ );
302
+ }
350
303
 
351
- if (!fs.existsSync(mcpPath)) {
352
- return result;
304
+ if (message.includes("parse") || message.includes("YAML")) {
305
+ return new TeamLoadError(
306
+ `Failed to parse team manifest: ${message}`,
307
+ "INVALID_MANIFEST",
308
+ teamName
309
+ );
353
310
  }
354
311
 
355
- const raw = fs.readFileSync(mcpPath, "utf-8");
356
- const parsed = JSON.parse(raw) as Record<
357
- string,
358
- { servers: McpServerEntry[] }
359
- >;
312
+ if (message.includes("role") && message.includes("not in")) {
313
+ return new TeamLoadError(
314
+ message,
315
+ "INVALID_MANIFEST",
316
+ teamName
317
+ );
318
+ }
360
319
 
361
- for (const [roleName, config] of Object.entries(parsed)) {
362
- if (config.servers && Array.isArray(config.servers)) {
363
- result.set(roleName, config.servers);
364
- }
320
+ if (message.includes("Circular")) {
321
+ return new TeamLoadError(
322
+ message,
323
+ "INVALID_ROLE",
324
+ teamName
325
+ );
365
326
  }
366
327
 
367
- return result;
328
+ // Default: treat as invalid manifest
329
+ return new TeamLoadError(
330
+ `Failed to load team '${teamName}': ${message}`,
331
+ "INVALID_MANIFEST",
332
+ teamName
333
+ );
368
334
  }
369
335
 
370
336
  // =============================================================================
@@ -375,7 +341,7 @@ function loadMcpServers(
375
341
  * Validate communication topology references.
376
342
  */
377
343
  function validateCommunication(
378
- communication: TeamCommunication,
344
+ communication: CommunicationConfig,
379
345
  roleNames: string[],
380
346
  teamName: string
381
347
  ): void {