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
@@ -0,0 +1,839 @@
1
+ /**
2
+ * Stream/Checkpoint/DiffStack/MergeQueue Extension Methods (_macro/streams/*, _macro/checkpoints/*, etc.)
3
+ *
4
+ * Exposes macro-agent's git-cascade stream, checkpoint, diff stack, and merge queue
5
+ * features to external MAP clients (e.g., the OpenSwarm TUI).
6
+ *
7
+ * Methods:
8
+ * - _macro/streams/list - List streams with optional filters
9
+ * - _macro/streams/get - Get stream details with optional children
10
+ * - _macro/streams/hierarchy - Get stream tree structure
11
+ * - _macro/streams/createPR - Create PR for entire stream branch
12
+ * - _macro/checkpoints/list - List checkpoints for a stream
13
+ * - _macro/checkpoints/get - Get checkpoint details
14
+ * - _macro/checkpoints/select - Fork stream from a checkpoint
15
+ * - _macro/diffStacks/list - List diff stacks
16
+ * - _macro/diffStacks/get - Get diff stack with checkpoints
17
+ * - _macro/diffStacks/create - Create diff stack from checkpoints
18
+ * - _macro/diffStacks/createPR - Create PR from diff stack
19
+ * - _macro/mergeQueue/status - Get merge queue status
20
+ * - _macro/mergeQueue/get - Get merge request details
21
+ *
22
+ * @see specs/s-2b92_stream_checkpoint_merge_queue_tui_integration.md
23
+ */
24
+
25
+ import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
26
+ import type { EventNotification } from "../types.js";
27
+ import type {
28
+ Stream,
29
+ StreamStatus,
30
+ StreamNode,
31
+ Checkpoint,
32
+ DiffStack,
33
+ DiffStackWithCheckpoints,
34
+ DiffStackReviewStatus,
35
+ } from "git-cascade";
36
+ import type { MergeRequest } from "../../../workspace/merge-queue/types.js";
37
+ import { RPCError } from "../rpc-handler.js";
38
+ import { ulid } from "ulid";
39
+
40
+ /** Event emitter function type */
41
+ type EmitEvent = (event: EventNotification) => void;
42
+
43
+ // =============================================================================
44
+ // Error Codes
45
+ // =============================================================================
46
+
47
+ const STREAM_NOT_FOUND = -32040;
48
+ const CHECKPOINT_NOT_FOUND = -32041;
49
+ const DIFF_STACK_NOT_FOUND = -32042;
50
+ const MERGE_REQUEST_NOT_FOUND = -32043;
51
+
52
+ // =============================================================================
53
+ // Request Types
54
+ // =============================================================================
55
+
56
+ interface StreamListParams {
57
+ filter?: {
58
+ status?: string;
59
+ agentId?: string;
60
+ parentStream?: string;
61
+ };
62
+ }
63
+
64
+ interface StreamGetParams {
65
+ streamId: string;
66
+ includeChildren?: boolean;
67
+ }
68
+
69
+ interface StreamHierarchyParams {
70
+ streamId?: string;
71
+ }
72
+
73
+ interface StreamCreatePRParams {
74
+ streamId: string;
75
+ title?: string;
76
+ body?: string;
77
+ draft?: boolean;
78
+ targetBranch?: string;
79
+ }
80
+
81
+ interface CheckpointListParams {
82
+ streamId: string;
83
+ limit?: number;
84
+ }
85
+
86
+ interface CheckpointGetParams {
87
+ checkpointId: string;
88
+ }
89
+
90
+ interface CheckpointSelectParams {
91
+ streamId: string;
92
+ checkpointId: string;
93
+ name?: string;
94
+ agentId?: string;
95
+ }
96
+
97
+ interface DiffStackListParams {
98
+ streamId?: string;
99
+ reviewStatus?: string;
100
+ }
101
+
102
+ interface DiffStackGetParams {
103
+ diffStackId: string;
104
+ }
105
+
106
+ interface DiffStackCreateParams {
107
+ name: string;
108
+ streamId: string;
109
+ checkpointIds: string[];
110
+ targetBranch: string;
111
+ description?: string;
112
+ }
113
+
114
+ interface DiffStackCreatePRParams {
115
+ diffStackId: string;
116
+ title?: string;
117
+ body?: string;
118
+ draft?: boolean;
119
+ }
120
+
121
+ interface MergeQueueStatusParams {
122
+ streamId?: string;
123
+ }
124
+
125
+ interface MergeQueueGetParams {
126
+ requestId: string;
127
+ }
128
+
129
+ // =============================================================================
130
+ // Response Types
131
+ // =============================================================================
132
+
133
+ interface StreamInfo {
134
+ id: string;
135
+ name: string;
136
+ agentId: string;
137
+ status: string;
138
+ parentStream: string | null;
139
+ baseCommit: string;
140
+ branchName: string;
141
+ checkpointCount: number;
142
+ latestCheckpoint?: string;
143
+ createdAt: number;
144
+ updatedAt: number;
145
+ }
146
+
147
+ interface StreamNodeInfo {
148
+ stream: StreamInfo;
149
+ children: StreamNodeInfo[];
150
+ taskCount: number;
151
+ }
152
+
153
+ interface CheckpointInfo {
154
+ id: string;
155
+ streamId: string;
156
+ commitSha: string;
157
+ commitShaShort: string;
158
+ parentCommit: string | null;
159
+ changeId: string | null;
160
+ message: string | null;
161
+ createdAt: number;
162
+ createdBy: string | null;
163
+ }
164
+
165
+ interface DiffStackInfo {
166
+ id: string;
167
+ name: string | null;
168
+ description: string | null;
169
+ targetBranch: string;
170
+ reviewStatus: string;
171
+ queuePosition: number | null;
172
+ checkpointCount?: number;
173
+ createdAt: number;
174
+ createdBy: string | null;
175
+ }
176
+
177
+ interface MergeRequestInfo {
178
+ id: string;
179
+ streamId: string;
180
+ taskId: string;
181
+ workerBranch: string;
182
+ workerAgentId: string;
183
+ status: string;
184
+ priority: number;
185
+ position: number;
186
+ submittedAt: number;
187
+ startedAt?: number;
188
+ completedAt?: number;
189
+ mergeCommit?: string;
190
+ conflictFiles?: string[];
191
+ resolverTaskId?: string;
192
+ }
193
+
194
+ interface PRResult {
195
+ prUrl: string;
196
+ prNumber: number;
197
+ }
198
+
199
+ // =============================================================================
200
+ // Extension Services
201
+ // =============================================================================
202
+
203
+ /**
204
+ * Services required for stream/checkpoint/diffStack/mergeQueue extensions.
205
+ *
206
+ * The combined-server.ts binds these to DataplaneAdapter and git-cascade operations.
207
+ */
208
+ export interface StreamExtensionServices {
209
+ // Stream operations (DataplaneAdapter methods)
210
+ getStream: (streamId: string) => Stream | null;
211
+ listStreams: (options?: { agentId?: string; status?: StreamStatus }) => Stream[];
212
+ getStreamBranchName: (streamId: string) => string;
213
+ getStreamHierarchy: (rootStreamId?: string) => StreamNode | StreamNode[];
214
+
215
+ // Checkpoint operations (git-cascade checkpoints module)
216
+ getCheckpoint: (checkpointId: string) => Checkpoint | null;
217
+ getCheckpointsForStream: (streamId: string) => Checkpoint[];
218
+
219
+ // Checkpoint selection (git-cascade streams.forkFromCheckpoint)
220
+ forkFromCheckpoint: (options: {
221
+ checkpointId: string;
222
+ name?: string;
223
+ agentId: string;
224
+ }) => string;
225
+
226
+ // DiffStack operations (git-cascade diffStacks module)
227
+ getDiffStack: (diffStackId: string) => DiffStack | null;
228
+ getDiffStackWithCheckpoints: (diffStackId: string) => DiffStackWithCheckpoints | null;
229
+ listDiffStacks: (options?: { reviewStatus?: DiffStackReviewStatus; targetBranch?: string }) => DiffStack[];
230
+ createDiffStack: (options: { name?: string; targetBranch?: string; description?: string; createdBy?: string }) => DiffStack;
231
+ addCheckpointToStack: (options: { stackId: string; checkpointId: string; position?: number }) => void;
232
+
233
+ // Merge queue operations (read-only)
234
+ getMergeQueueRequests: (streamId?: string) => MergeRequest[];
235
+ getMergeQueueDepth: (streamId?: string) => number;
236
+ getMergeRequest: (requestId: string) => MergeRequest | null;
237
+
238
+ // PR creation
239
+ createPR: (options: {
240
+ branch: string;
241
+ targetBranch: string;
242
+ title: string;
243
+ body?: string;
244
+ draft?: boolean;
245
+ }) => Promise<PRResult>;
246
+ }
247
+
248
+ // =============================================================================
249
+ // Conversion Helpers
250
+ // =============================================================================
251
+
252
+ function streamToInfo(
253
+ stream: Stream,
254
+ branchName: string,
255
+ checkpointCount: number,
256
+ latestCheckpoint?: string,
257
+ ): StreamInfo {
258
+ return {
259
+ id: stream.id,
260
+ name: stream.name,
261
+ agentId: stream.agentId,
262
+ status: stream.status,
263
+ parentStream: stream.parentStream,
264
+ baseCommit: stream.baseCommit,
265
+ branchName,
266
+ checkpointCount,
267
+ latestCheckpoint,
268
+ createdAt: stream.createdAt,
269
+ updatedAt: stream.updatedAt,
270
+ };
271
+ }
272
+
273
+ function streamNodeToInfo(
274
+ node: StreamNode,
275
+ services: StreamExtensionServices,
276
+ ): StreamNodeInfo {
277
+ const checkpoints = services.getCheckpointsForStream(node.stream.id);
278
+ const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
279
+ let branchName: string;
280
+ try {
281
+ branchName = services.getStreamBranchName(node.stream.id);
282
+ } catch {
283
+ branchName = `stream/${node.stream.id}`;
284
+ }
285
+
286
+ return {
287
+ stream: streamToInfo(
288
+ node.stream,
289
+ branchName,
290
+ checkpoints.length,
291
+ latestCp?.commitSha?.slice(0, 8),
292
+ ),
293
+ children: node.children.map((child) => streamNodeToInfo(child, services)),
294
+ taskCount: node.tasks.length,
295
+ };
296
+ }
297
+
298
+ function checkpointToInfo(cp: Checkpoint): CheckpointInfo {
299
+ return {
300
+ id: cp.id,
301
+ streamId: cp.streamId,
302
+ commitSha: cp.commitSha,
303
+ commitShaShort: cp.commitSha.slice(0, 8),
304
+ parentCommit: cp.parentCommit,
305
+ changeId: cp.changeId,
306
+ message: cp.message,
307
+ createdAt: cp.createdAt,
308
+ createdBy: cp.createdBy,
309
+ };
310
+ }
311
+
312
+ function diffStackToInfo(ds: DiffStack, checkpointCount?: number): DiffStackInfo {
313
+ return {
314
+ id: ds.id,
315
+ name: ds.name,
316
+ description: ds.description,
317
+ targetBranch: ds.targetBranch,
318
+ reviewStatus: ds.reviewStatus,
319
+ queuePosition: ds.queuePosition,
320
+ checkpointCount,
321
+ createdAt: ds.createdAt,
322
+ createdBy: ds.createdBy,
323
+ };
324
+ }
325
+
326
+ function mergeRequestToInfo(mr: MergeRequest): MergeRequestInfo {
327
+ return {
328
+ id: mr.id,
329
+ streamId: mr.streamId,
330
+ taskId: mr.taskId,
331
+ workerBranch: mr.workerBranch,
332
+ workerAgentId: mr.workerAgentId,
333
+ status: mr.status,
334
+ priority: mr.priority,
335
+ position: mr.position ?? 0,
336
+ submittedAt: mr.submittedAt,
337
+ startedAt: mr.startedAt ?? undefined,
338
+ completedAt: mr.completedAt ?? undefined,
339
+ mergeCommit: mr.mergeCommit ?? undefined,
340
+ conflictFiles: mr.conflictFiles ?? undefined,
341
+ resolverTaskId: mr.resolverTaskId ?? undefined,
342
+ };
343
+ }
344
+
345
+ // =============================================================================
346
+ // Stream Handlers
347
+ // =============================================================================
348
+
349
+ function createStreamListHandler(services: StreamExtensionServices): ExtensionHandler {
350
+ return async (_context: ExtensionContext, params: unknown) => {
351
+ const { filter } = (params ?? {}) as StreamListParams;
352
+
353
+ const streams = services.listStreams(
354
+ filter
355
+ ? {
356
+ agentId: filter.agentId,
357
+ status: filter.status as StreamStatus | undefined,
358
+ }
359
+ : undefined,
360
+ );
361
+
362
+ const results: StreamInfo[] = streams.map((stream) => {
363
+ const checkpoints = services.getCheckpointsForStream(stream.id);
364
+ const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
365
+ let branchName: string;
366
+ try {
367
+ branchName = services.getStreamBranchName(stream.id);
368
+ } catch {
369
+ branchName = `stream/${stream.id}`;
370
+ }
371
+ return streamToInfo(stream, branchName, checkpoints.length, latestCp?.commitSha?.slice(0, 8));
372
+ });
373
+
374
+ // Optional parentStream filter (not in git-cascade's listStreams options)
375
+ const filtered = filter?.parentStream
376
+ ? results.filter((s) => s.parentStream === filter.parentStream)
377
+ : results;
378
+
379
+ return { streams: filtered };
380
+ };
381
+ }
382
+
383
+ function createStreamGetHandler(services: StreamExtensionServices): ExtensionHandler {
384
+ return async (_context: ExtensionContext, params: unknown) => {
385
+ const { streamId, includeChildren } = params as StreamGetParams;
386
+
387
+ if (!streamId) {
388
+ throw RPCError.invalidParams("streamId is required");
389
+ }
390
+
391
+ const stream = services.getStream(streamId);
392
+ if (!stream) {
393
+ throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
394
+ }
395
+
396
+ const checkpoints = services.getCheckpointsForStream(streamId);
397
+ const latestCp = checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : undefined;
398
+ let branchName: string;
399
+ try {
400
+ branchName = services.getStreamBranchName(streamId);
401
+ } catch {
402
+ branchName = `stream/${streamId}`;
403
+ }
404
+
405
+ const result: Record<string, unknown> = {
406
+ stream: streamToInfo(stream, branchName, checkpoints.length, latestCp?.commitSha?.slice(0, 8)),
407
+ };
408
+
409
+ if (includeChildren) {
410
+ const hierarchy = services.getStreamHierarchy(streamId);
411
+ const node = Array.isArray(hierarchy) ? hierarchy[0] : hierarchy;
412
+ if (node) {
413
+ result.children = node.children.map((child) => {
414
+ const childCps = services.getCheckpointsForStream(child.stream.id);
415
+ const childLatest = childCps.length > 0 ? childCps[childCps.length - 1] : undefined;
416
+ let childBranch: string;
417
+ try {
418
+ childBranch = services.getStreamBranchName(child.stream.id);
419
+ } catch {
420
+ childBranch = `stream/${child.stream.id}`;
421
+ }
422
+ return streamToInfo(child.stream, childBranch, childCps.length, childLatest?.commitSha?.slice(0, 8));
423
+ });
424
+ }
425
+ }
426
+
427
+ return result;
428
+ };
429
+ }
430
+
431
+ function createStreamHierarchyHandler(services: StreamExtensionServices): ExtensionHandler {
432
+ return async (_context: ExtensionContext, params: unknown) => {
433
+ const { streamId } = (params ?? {}) as StreamHierarchyParams;
434
+
435
+ const hierarchy = services.getStreamHierarchy(streamId);
436
+ const nodes = Array.isArray(hierarchy) ? hierarchy : [hierarchy];
437
+
438
+ return {
439
+ roots: nodes.map((node) => streamNodeToInfo(node, services)),
440
+ };
441
+ };
442
+ }
443
+
444
+ function createStreamCreatePRHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
445
+ return async (_context: ExtensionContext, params: unknown) => {
446
+ const { streamId, title, body, draft, targetBranch } = params as StreamCreatePRParams;
447
+
448
+ if (!streamId) {
449
+ throw RPCError.invalidParams("streamId is required");
450
+ }
451
+
452
+ const stream = services.getStream(streamId);
453
+ if (!stream) {
454
+ throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
455
+ }
456
+
457
+ let branchName: string;
458
+ try {
459
+ branchName = services.getStreamBranchName(streamId);
460
+ } catch {
461
+ branchName = `stream/${streamId}`;
462
+ }
463
+
464
+ const result = await services.createPR({
465
+ branch: branchName,
466
+ targetBranch: targetBranch ?? "main",
467
+ title: title ?? `Merge stream: ${stream.name}`,
468
+ body,
469
+ draft,
470
+ });
471
+
472
+ emit({
473
+ eventId: ulid(),
474
+ type: "stream.updated",
475
+ timestamp: Date.now(),
476
+ data: { streamId, action: "pr_created", result },
477
+ });
478
+
479
+ return result;
480
+ };
481
+ }
482
+
483
+ // =============================================================================
484
+ // Checkpoint Handlers
485
+ // =============================================================================
486
+
487
+ function createCheckpointListHandler(services: StreamExtensionServices): ExtensionHandler {
488
+ return async (_context: ExtensionContext, params: unknown) => {
489
+ const { streamId, limit } = params as CheckpointListParams;
490
+
491
+ if (!streamId) {
492
+ throw RPCError.invalidParams("streamId is required");
493
+ }
494
+
495
+ const stream = services.getStream(streamId);
496
+ if (!stream) {
497
+ throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
498
+ }
499
+
500
+ let checkpoints = services.getCheckpointsForStream(streamId);
501
+
502
+ if (limit && limit > 0) {
503
+ checkpoints = checkpoints.slice(-limit);
504
+ }
505
+
506
+ return { checkpoints: checkpoints.map(checkpointToInfo) };
507
+ };
508
+ }
509
+
510
+ function createCheckpointGetHandler(services: StreamExtensionServices): ExtensionHandler {
511
+ return async (_context: ExtensionContext, params: unknown) => {
512
+ const { checkpointId } = params as CheckpointGetParams;
513
+
514
+ if (!checkpointId) {
515
+ throw RPCError.invalidParams("checkpointId is required");
516
+ }
517
+
518
+ const checkpoint = services.getCheckpoint(checkpointId);
519
+ if (!checkpoint) {
520
+ throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${checkpointId}`);
521
+ }
522
+
523
+ return { checkpoint: checkpointToInfo(checkpoint) };
524
+ };
525
+ }
526
+
527
+ function createCheckpointSelectHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
528
+ return async (context: ExtensionContext, params: unknown) => {
529
+ const { streamId, checkpointId, name, agentId } = params as CheckpointSelectParams;
530
+
531
+ if (!streamId) {
532
+ throw RPCError.invalidParams("streamId is required");
533
+ }
534
+ if (!checkpointId) {
535
+ throw RPCError.invalidParams("checkpointId is required");
536
+ }
537
+
538
+ // Verify stream exists
539
+ const stream = services.getStream(streamId);
540
+ if (!stream) {
541
+ throw new RPCError(STREAM_NOT_FOUND, `Stream not found: ${streamId}`);
542
+ }
543
+
544
+ // Verify checkpoint exists and belongs to stream
545
+ const checkpoint = services.getCheckpoint(checkpointId);
546
+ if (!checkpoint) {
547
+ throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${checkpointId}`);
548
+ }
549
+ if (checkpoint.streamId !== streamId) {
550
+ throw RPCError.invalidParams(
551
+ `Checkpoint ${checkpointId} does not belong to stream ${streamId}`,
552
+ );
553
+ }
554
+
555
+ const forkAgentId = agentId ?? `external:${context.participantId}`;
556
+
557
+ const newStreamId = services.forkFromCheckpoint({
558
+ checkpointId,
559
+ name: name ?? `fork-from-${checkpointId.slice(0, 8)}`,
560
+ agentId: forkAgentId,
561
+ });
562
+
563
+ emit({
564
+ eventId: ulid(),
565
+ type: "stream.updated",
566
+ timestamp: Date.now(),
567
+ data: { streamId, newStreamId, action: "forked", checkpointId },
568
+ });
569
+
570
+ return {
571
+ success: true,
572
+ newStreamId,
573
+ commitSha: checkpoint.commitSha,
574
+ };
575
+ };
576
+ }
577
+
578
+ // =============================================================================
579
+ // DiffStack Handlers
580
+ // =============================================================================
581
+
582
+ function createDiffStackListHandler(services: StreamExtensionServices): ExtensionHandler {
583
+ return async (_context: ExtensionContext, params: unknown) => {
584
+ const { streamId, reviewStatus } = (params ?? {}) as DiffStackListParams;
585
+
586
+ let stacks = services.listDiffStacks({
587
+ reviewStatus: reviewStatus as DiffStackReviewStatus | undefined,
588
+ });
589
+
590
+ // Filter by streamId if provided (need to check checkpoints in each stack)
591
+ if (streamId) {
592
+ const streamCheckpoints = new Set(
593
+ services.getCheckpointsForStream(streamId).map((cp) => cp.id),
594
+ );
595
+ stacks = stacks.filter((stack) => {
596
+ const withCps = services.getDiffStackWithCheckpoints(stack.id);
597
+ if (!withCps) return false;
598
+ return withCps.checkpoints.some((cp) => streamCheckpoints.has(cp.id));
599
+ });
600
+ }
601
+
602
+ const results = stacks.map((stack) => {
603
+ const withCps = services.getDiffStackWithCheckpoints(stack.id);
604
+ return diffStackToInfo(stack, withCps?.checkpoints.length ?? 0);
605
+ });
606
+
607
+ return { diffStacks: results };
608
+ };
609
+ }
610
+
611
+ function createDiffStackGetHandler(services: StreamExtensionServices): ExtensionHandler {
612
+ return async (_context: ExtensionContext, params: unknown) => {
613
+ const { diffStackId } = params as DiffStackGetParams;
614
+
615
+ if (!diffStackId) {
616
+ throw RPCError.invalidParams("diffStackId is required");
617
+ }
618
+
619
+ const withCheckpoints = services.getDiffStackWithCheckpoints(diffStackId);
620
+ if (!withCheckpoints) {
621
+ throw new RPCError(DIFF_STACK_NOT_FOUND, `DiffStack not found: ${diffStackId}`);
622
+ }
623
+
624
+ return {
625
+ diffStack: diffStackToInfo(withCheckpoints, withCheckpoints.checkpoints.length),
626
+ checkpoints: withCheckpoints.checkpoints.map(checkpointToInfo),
627
+ };
628
+ };
629
+ }
630
+
631
+ function createDiffStackCreateHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
632
+ return async (context: ExtensionContext, params: unknown) => {
633
+ const { name, streamId, checkpointIds, targetBranch, description } =
634
+ params as DiffStackCreateParams;
635
+
636
+ if (!name) {
637
+ throw RPCError.invalidParams("name is required");
638
+ }
639
+ if (!checkpointIds || checkpointIds.length === 0) {
640
+ throw RPCError.invalidParams("checkpointIds is required and must not be empty");
641
+ }
642
+ if (!targetBranch) {
643
+ throw RPCError.invalidParams("targetBranch is required");
644
+ }
645
+
646
+ // Verify all checkpoints exist
647
+ for (const cpId of checkpointIds) {
648
+ const cp = services.getCheckpoint(cpId);
649
+ if (!cp) {
650
+ throw new RPCError(CHECKPOINT_NOT_FOUND, `Checkpoint not found: ${cpId}`);
651
+ }
652
+ }
653
+
654
+ const createdBy = `external:${context.participantId}`;
655
+
656
+ // Create the stack
657
+ const stack = services.createDiffStack({
658
+ name,
659
+ targetBranch,
660
+ description,
661
+ createdBy,
662
+ });
663
+
664
+ // Add checkpoints to the stack
665
+ for (let i = 0; i < checkpointIds.length; i++) {
666
+ services.addCheckpointToStack({
667
+ stackId: stack.id,
668
+ checkpointId: checkpointIds[i],
669
+ position: i,
670
+ });
671
+ }
672
+
673
+ // Return the stack with checkpoints
674
+ const withCps = services.getDiffStackWithCheckpoints(stack.id);
675
+
676
+ emit({
677
+ eventId: ulid(),
678
+ type: "diffstack.created",
679
+ timestamp: Date.now(),
680
+ data: { diffStackId: stack.id, name, checkpointCount: checkpointIds.length },
681
+ });
682
+
683
+ return {
684
+ diffStack: diffStackToInfo(stack, withCps?.checkpoints.length ?? checkpointIds.length),
685
+ };
686
+ };
687
+ }
688
+
689
+ function createDiffStackCreatePRHandler(services: StreamExtensionServices, emit: EmitEvent): ExtensionHandler {
690
+ return async (_context: ExtensionContext, params: unknown) => {
691
+ const { diffStackId, title, body, draft } = params as DiffStackCreatePRParams;
692
+
693
+ if (!diffStackId) {
694
+ throw RPCError.invalidParams("diffStackId is required");
695
+ }
696
+
697
+ const withCheckpoints = services.getDiffStackWithCheckpoints(diffStackId);
698
+ if (!withCheckpoints) {
699
+ throw new RPCError(DIFF_STACK_NOT_FOUND, `DiffStack not found: ${diffStackId}`);
700
+ }
701
+
702
+ if (withCheckpoints.checkpoints.length === 0) {
703
+ throw RPCError.invalidParams("DiffStack has no checkpoints");
704
+ }
705
+
706
+ // Determine branch name from the first checkpoint's stream
707
+ const firstCp = withCheckpoints.checkpoints[0];
708
+ let branchName: string;
709
+ try {
710
+ branchName = services.getStreamBranchName(firstCp.streamId);
711
+ } catch {
712
+ branchName = `stream/${firstCp.streamId}`;
713
+ }
714
+
715
+ const result = await services.createPR({
716
+ branch: branchName,
717
+ targetBranch: withCheckpoints.targetBranch,
718
+ title: title ?? `PR: ${withCheckpoints.name ?? diffStackId}`,
719
+ body,
720
+ draft,
721
+ });
722
+
723
+ emit({
724
+ eventId: ulid(),
725
+ type: "diffstack.updated",
726
+ timestamp: Date.now(),
727
+ data: { diffStackId, action: "pr_created", result },
728
+ });
729
+
730
+ return result;
731
+ };
732
+ }
733
+
734
+ // =============================================================================
735
+ // MergeQueue Handlers
736
+ // =============================================================================
737
+
738
+ function createMergeQueueStatusHandler(services: StreamExtensionServices): ExtensionHandler {
739
+ return async (_context: ExtensionContext, params: unknown) => {
740
+ const { streamId } = (params ?? {}) as MergeQueueStatusParams;
741
+
742
+ const requests = services.getMergeQueueRequests(streamId);
743
+ const queueDepth = services.getMergeQueueDepth(streamId);
744
+
745
+ return {
746
+ requests: requests.map(mergeRequestToInfo),
747
+ queueDepth,
748
+ };
749
+ };
750
+ }
751
+
752
+ function createMergeQueueGetHandler(services: StreamExtensionServices): ExtensionHandler {
753
+ return async (_context: ExtensionContext, params: unknown) => {
754
+ const { requestId } = params as MergeQueueGetParams;
755
+
756
+ if (!requestId) {
757
+ throw RPCError.invalidParams("requestId is required");
758
+ }
759
+
760
+ const request = services.getMergeRequest(requestId);
761
+ if (!request) {
762
+ throw new RPCError(MERGE_REQUEST_NOT_FOUND, `Merge request not found: ${requestId}`);
763
+ }
764
+
765
+ return { request: mergeRequestToInfo(request) };
766
+ };
767
+ }
768
+
769
+ // =============================================================================
770
+ // Registration
771
+ // =============================================================================
772
+
773
+ /** All stream-related extension method names */
774
+ export const STREAM_EXTENSION_METHODS = [
775
+ "_macro/streams/list",
776
+ "_macro/streams/get",
777
+ "_macro/streams/hierarchy",
778
+ "_macro/streams/createPR",
779
+ "_macro/checkpoints/list",
780
+ "_macro/checkpoints/get",
781
+ "_macro/checkpoints/select",
782
+ "_macro/diffStacks/list",
783
+ "_macro/diffStacks/get",
784
+ "_macro/diffStacks/create",
785
+ "_macro/diffStacks/createPR",
786
+ "_macro/mergeQueue/status",
787
+ "_macro/mergeQueue/get",
788
+ ] as const;
789
+
790
+ /**
791
+ * Register all stream/checkpoint/diffStack/mergeQueue extension methods.
792
+ *
793
+ * @param adapter - MAPAdapter instance
794
+ * @param services - Stream extension services
795
+ */
796
+ export function registerStreamExtensions(
797
+ adapter: MAPAdapter,
798
+ services: StreamExtensionServices,
799
+ ): void {
800
+ const emit: EmitEvent = (event) => adapter.emitEvent(event);
801
+
802
+ // Stream queries (canQuery)
803
+ adapter.registerExtension("_macro/streams/list", createStreamListHandler(services));
804
+ adapter.registerExtension("_macro/streams/get", createStreamGetHandler(services));
805
+ adapter.registerExtension("_macro/streams/hierarchy", createStreamHierarchyHandler(services));
806
+
807
+ // Stream PR (canManageTasks)
808
+ adapter.registerExtension("_macro/streams/createPR", createStreamCreatePRHandler(services, emit));
809
+
810
+ // Checkpoint queries (canQuery)
811
+ adapter.registerExtension("_macro/checkpoints/list", createCheckpointListHandler(services));
812
+ adapter.registerExtension("_macro/checkpoints/get", createCheckpointGetHandler(services));
813
+
814
+ // Checkpoint select (canManageTasks)
815
+ adapter.registerExtension("_macro/checkpoints/select", createCheckpointSelectHandler(services, emit));
816
+
817
+ // DiffStack queries (canQuery)
818
+ adapter.registerExtension("_macro/diffStacks/list", createDiffStackListHandler(services));
819
+ adapter.registerExtension("_macro/diffStacks/get", createDiffStackGetHandler(services));
820
+
821
+ // DiffStack management (canManageTasks)
822
+ adapter.registerExtension("_macro/diffStacks/create", createDiffStackCreateHandler(services, emit));
823
+ adapter.registerExtension("_macro/diffStacks/createPR", createDiffStackCreatePRHandler(services, emit));
824
+
825
+ // MergeQueue queries (canQuery)
826
+ adapter.registerExtension("_macro/mergeQueue/status", createMergeQueueStatusHandler(services));
827
+ adapter.registerExtension("_macro/mergeQueue/get", createMergeQueueGetHandler(services));
828
+ }
829
+
830
+ /**
831
+ * Unregister all stream/checkpoint/diffStack/mergeQueue extension methods.
832
+ *
833
+ * @param adapter - MAPAdapter instance
834
+ */
835
+ export function unregisterStreamExtensions(adapter: MAPAdapter): void {
836
+ for (const method of STREAM_EXTENSION_METHODS) {
837
+ adapter.unregisterExtension(method);
838
+ }
839
+ }