macro-agent 0.1.0 → 0.1.1

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 (337) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/.sudocode/specs.jsonl +4 -0
  3. package/CLAUDE.md +16 -14
  4. package/README.md +11 -29
  5. package/dist/acp/macro-agent.d.ts +15 -0
  6. package/dist/acp/macro-agent.d.ts.map +1 -1
  7. package/dist/acp/macro-agent.js +131 -35
  8. package/dist/acp/macro-agent.js.map +1 -1
  9. package/dist/acp/types.d.ts +32 -1
  10. package/dist/acp/types.d.ts.map +1 -1
  11. package/dist/acp/types.js.map +1 -1
  12. package/dist/agent/agent-manager.d.ts +65 -1
  13. package/dist/agent/agent-manager.d.ts.map +1 -1
  14. package/dist/agent/agent-manager.js +464 -183
  15. package/dist/agent/agent-manager.js.map +1 -1
  16. package/dist/agent/types.d.ts +1 -1
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/api/server.d.ts +3 -0
  19. package/dist/api/server.d.ts.map +1 -1
  20. package/dist/api/server.js +37 -6
  21. package/dist/api/server.js.map +1 -1
  22. package/dist/auth/index.d.ts +2 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +2 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/token.d.ts +41 -0
  27. package/dist/auth/token.d.ts.map +1 -0
  28. package/dist/auth/token.js +73 -0
  29. package/dist/auth/token.js.map +1 -0
  30. package/dist/cli/acp.d.ts +2 -23
  31. package/dist/cli/acp.d.ts.map +1 -1
  32. package/dist/cli/acp.js +127 -61
  33. package/dist/cli/acp.js.map +1 -1
  34. package/dist/cli/index.js +147 -15
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/mcp.d.ts +6 -0
  37. package/dist/cli/mcp.d.ts.map +1 -1
  38. package/dist/cli/mcp.js +268 -181
  39. package/dist/cli/mcp.js.map +1 -1
  40. package/dist/cli/parse-args.d.ts +20 -0
  41. package/dist/cli/parse-args.d.ts.map +1 -0
  42. package/dist/cli/parse-args.js +43 -0
  43. package/dist/cli/parse-args.js.map +1 -0
  44. package/dist/cli/stable-instance-id.d.ts +8 -0
  45. package/dist/cli/stable-instance-id.d.ts.map +1 -0
  46. package/dist/cli/stable-instance-id.js +14 -0
  47. package/dist/cli/stable-instance-id.js.map +1 -0
  48. package/dist/config/project-config.d.ts +74 -7
  49. package/dist/config/project-config.d.ts.map +1 -1
  50. package/dist/config/project-config.js +123 -20
  51. package/dist/config/project-config.js.map +1 -1
  52. package/dist/map/adapter/acp-over-map.d.ts +17 -0
  53. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  54. package/dist/map/adapter/acp-over-map.js +384 -23
  55. package/dist/map/adapter/acp-over-map.js.map +1 -1
  56. package/dist/map/adapter/connection-manager.d.ts.map +1 -1
  57. package/dist/map/adapter/connection-manager.js +3 -0
  58. package/dist/map/adapter/connection-manager.js.map +1 -1
  59. package/dist/map/adapter/event-log.d.ts +87 -0
  60. package/dist/map/adapter/event-log.d.ts.map +1 -0
  61. package/dist/map/adapter/event-log.js +122 -0
  62. package/dist/map/adapter/event-log.js.map +1 -0
  63. package/dist/map/adapter/event-translator.js +6 -6
  64. package/dist/map/adapter/event-translator.js.map +1 -1
  65. package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
  66. package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
  67. package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
  68. package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
  69. package/dist/map/adapter/extensions/index.d.ts +10 -1
  70. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  71. package/dist/map/adapter/extensions/index.js +34 -0
  72. package/dist/map/adapter/extensions/index.js.map +1 -1
  73. package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
  74. package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
  75. package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
  76. package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
  77. package/dist/map/adapter/extensions/rename.d.ts +29 -0
  78. package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
  79. package/dist/map/adapter/extensions/rename.js +49 -0
  80. package/dist/map/adapter/extensions/rename.js.map +1 -0
  81. package/dist/map/adapter/extensions/task.d.ts.map +1 -1
  82. package/dist/map/adapter/extensions/task.js +10 -0
  83. package/dist/map/adapter/extensions/task.js.map +1 -1
  84. package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
  85. package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
  86. package/dist/map/adapter/extensions/update-metadata.js +67 -0
  87. package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
  88. package/dist/map/adapter/index.d.ts +2 -1
  89. package/dist/map/adapter/index.d.ts.map +1 -1
  90. package/dist/map/adapter/index.js +8 -2
  91. package/dist/map/adapter/index.js.map +1 -1
  92. package/dist/map/adapter/interface.d.ts +2 -0
  93. package/dist/map/adapter/interface.d.ts.map +1 -1
  94. package/dist/map/adapter/map-adapter.d.ts +3 -0
  95. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  96. package/dist/map/adapter/map-adapter.js +258 -35
  97. package/dist/map/adapter/map-adapter.js.map +1 -1
  98. package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
  99. package/dist/map/adapter/subscription-manager.js +5 -1
  100. package/dist/map/adapter/subscription-manager.js.map +1 -1
  101. package/dist/map/adapter/types.d.ts +2 -0
  102. package/dist/map/adapter/types.d.ts.map +1 -1
  103. package/dist/mcp/map-client.d.ts +39 -0
  104. package/dist/mcp/map-client.d.ts.map +1 -0
  105. package/dist/mcp/map-client.js +129 -0
  106. package/dist/mcp/map-client.js.map +1 -0
  107. package/dist/mcp/mcp-server.d.ts +14 -0
  108. package/dist/mcp/mcp-server.d.ts.map +1 -1
  109. package/dist/mcp/mcp-server.js +113 -85
  110. package/dist/mcp/mcp-server.js.map +1 -1
  111. package/dist/mcp/types.d.ts +9 -1
  112. package/dist/mcp/types.d.ts.map +1 -1
  113. package/dist/mcp/types.js.map +1 -1
  114. package/dist/metrics/metrics.js +1 -1
  115. package/dist/metrics/metrics.js.map +1 -1
  116. package/dist/roles/capabilities.d.ts +3 -1
  117. package/dist/roles/capabilities.d.ts.map +1 -1
  118. package/dist/roles/capabilities.js +17 -7
  119. package/dist/roles/capabilities.js.map +1 -1
  120. package/dist/roles/config-loader.d.ts +6 -6
  121. package/dist/roles/config-loader.d.ts.map +1 -1
  122. package/dist/roles/config-loader.js +6 -6
  123. package/dist/roles/config-loader.js.map +1 -1
  124. package/dist/roles/registry.d.ts +2 -2
  125. package/dist/roles/registry.js +2 -2
  126. package/dist/server/combined-server.d.ts +20 -0
  127. package/dist/server/combined-server.d.ts.map +1 -1
  128. package/dist/server/combined-server.js +107 -8
  129. package/dist/server/combined-server.js.map +1 -1
  130. package/dist/store/event-store.d.ts +2 -1
  131. package/dist/store/event-store.d.ts.map +1 -1
  132. package/dist/store/event-store.js +69 -20
  133. package/dist/store/event-store.js.map +1 -1
  134. package/dist/store/types/agents.d.ts +18 -0
  135. package/dist/store/types/agents.d.ts.map +1 -1
  136. package/dist/store/types/events.d.ts +1 -1
  137. package/dist/store/types/events.d.ts.map +1 -1
  138. package/dist/task/backend/index.d.ts +47 -29
  139. package/dist/task/backend/index.d.ts.map +1 -1
  140. package/dist/task/backend/index.js +109 -71
  141. package/dist/task/backend/index.js.map +1 -1
  142. package/dist/task/backend/memory.d.ts +1 -0
  143. package/dist/task/backend/memory.d.ts.map +1 -1
  144. package/dist/task/backend/memory.js +3 -0
  145. package/dist/task/backend/memory.js.map +1 -1
  146. package/dist/task/backend/opentasks/backend.d.ts +140 -0
  147. package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
  148. package/dist/task/backend/opentasks/backend.js +1023 -0
  149. package/dist/task/backend/opentasks/backend.js.map +1 -0
  150. package/dist/task/backend/opentasks/client.d.ts +337 -0
  151. package/dist/task/backend/opentasks/client.d.ts.map +1 -0
  152. package/dist/task/backend/opentasks/client.js +225 -0
  153. package/dist/task/backend/opentasks/client.js.map +1 -0
  154. package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
  155. package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
  156. package/dist/task/backend/opentasks/daemon-manager.js +195 -0
  157. package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
  158. package/dist/task/backend/opentasks/index.d.ts +21 -0
  159. package/dist/task/backend/opentasks/index.d.ts.map +1 -0
  160. package/dist/task/backend/opentasks/index.js +21 -0
  161. package/dist/task/backend/opentasks/index.js.map +1 -0
  162. package/dist/task/backend/opentasks/mapping.d.ts +48 -0
  163. package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
  164. package/dist/task/backend/opentasks/mapping.js +77 -0
  165. package/dist/task/backend/opentasks/mapping.js.map +1 -0
  166. package/dist/task/backend/types.d.ts +33 -53
  167. package/dist/task/backend/types.d.ts.map +1 -1
  168. package/dist/task/backend/types.js +7 -11
  169. package/dist/task/backend/types.js.map +1 -1
  170. package/dist/task/backend/unified-tool-provider.d.ts +57 -0
  171. package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
  172. package/dist/task/backend/unified-tool-provider.js +623 -0
  173. package/dist/task/backend/unified-tool-provider.js.map +1 -0
  174. package/dist/teams/team-loader.d.ts +2 -2
  175. package/dist/teams/team-loader.js +3 -3
  176. package/dist/teams/team-loader.js.map +1 -1
  177. package/dist/teams/team-runtime.d.ts.map +1 -1
  178. package/dist/teams/team-runtime.js +2 -0
  179. package/dist/teams/team-runtime.js.map +1 -1
  180. package/docs/architecture.md +7 -6
  181. package/docs/configuration.md +26 -62
  182. package/docs/implementation-details.md +5 -5
  183. package/docs/implementation-summary.md +17 -17
  184. package/docs/plan-self-driving-support.md +4 -4
  185. package/docs/spec-self-driving-support.md +10 -10
  186. package/docs/team-templates.md +2 -2
  187. package/docs/teams.md +3 -3
  188. package/docs/troubleshooting.md +10 -11
  189. package/package.json +6 -4
  190. package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
  191. package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
  192. package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
  193. package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
  194. package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
  195. package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
  196. package/src/acp/__tests__/integration.test.ts +56 -31
  197. package/src/acp/__tests__/macro-agent.test.ts +16 -7
  198. package/src/acp/macro-agent.ts +170 -36
  199. package/src/acp/types.ts +46 -1
  200. package/src/agent/__tests__/agent-manager.test.ts +228 -2
  201. package/src/agent/agent-manager.ts +714 -261
  202. package/src/agent/types.ts +3 -1
  203. package/src/api/server.ts +41 -7
  204. package/src/auth/__tests__/token.test.ts +100 -0
  205. package/src/auth/index.ts +1 -0
  206. package/src/auth/token.ts +82 -0
  207. package/src/cli/__tests__/acp.test.ts +1 -1
  208. package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
  209. package/src/cli/acp.ts +130 -72
  210. package/src/cli/index.ts +120 -14
  211. package/src/cli/mcp.ts +311 -207
  212. package/src/cli/parse-args.ts +54 -0
  213. package/src/cli/stable-instance-id.ts +14 -0
  214. package/src/config/project-config.ts +190 -27
  215. package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
  216. package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
  217. package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
  218. package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
  219. package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
  220. package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
  221. package/src/map/adapter/__tests__/event-log.test.ts +527 -0
  222. package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
  223. package/src/map/adapter/__tests__/extensions.test.ts +408 -0
  224. package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
  225. package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
  226. package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
  227. package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
  228. package/src/map/adapter/acp-over-map.ts +678 -66
  229. package/src/map/adapter/connection-manager.ts +3 -0
  230. package/src/map/adapter/event-log.ts +208 -0
  231. package/src/map/adapter/event-translator.ts +6 -6
  232. package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
  233. package/src/map/adapter/extensions/index.ts +60 -0
  234. package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
  235. package/src/map/adapter/extensions/task.ts +11 -0
  236. package/src/map/adapter/extensions/update-metadata.ts +126 -0
  237. package/src/map/adapter/index.ts +28 -0
  238. package/src/map/adapter/interface.ts +2 -0
  239. package/src/map/adapter/map-adapter.ts +312 -47
  240. package/src/map/adapter/subscription-manager.ts +5 -1
  241. package/src/map/adapter/types.ts +2 -0
  242. package/src/mcp/__tests__/map-client.test.ts +386 -0
  243. package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
  244. package/src/mcp/__tests__/mcp-server.test.ts +100 -1
  245. package/src/mcp/map-client.ts +177 -0
  246. package/src/mcp/mcp-server.ts +191 -100
  247. package/src/mcp/types.ts +6 -1
  248. package/src/metrics/metrics.ts +1 -1
  249. package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
  250. package/src/roles/__tests__/config-loader.test.ts +7 -7
  251. package/src/roles/capabilities.ts +17 -7
  252. package/src/roles/config-loader.ts +6 -6
  253. package/src/roles/registry.ts +2 -2
  254. package/src/server/__tests__/combined-server.test.ts +94 -21
  255. package/src/server/combined-server.ts +189 -33
  256. package/src/steering/__tests__/steering-integration.test.ts +1 -1
  257. package/src/store/__tests__/event-store.test.ts +196 -1
  258. package/src/store/__tests__/instance.test.ts +3 -3
  259. package/src/store/event-store.ts +80 -21
  260. package/src/store/types/agents.ts +15 -0
  261. package/src/store/types/events.ts +1 -1
  262. package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
  263. package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
  264. package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
  265. package/src/task/backend/index.ts +156 -106
  266. package/src/task/backend/memory.ts +4 -0
  267. package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
  268. package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
  269. package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
  270. package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
  271. package/src/task/backend/opentasks/backend.ts +1323 -0
  272. package/src/task/backend/opentasks/client.ts +652 -0
  273. package/src/task/backend/opentasks/daemon-manager.ts +253 -0
  274. package/src/task/backend/opentasks/index.ts +69 -0
  275. package/src/task/backend/opentasks/mapping.ts +94 -0
  276. package/src/task/backend/types.ts +42 -66
  277. package/src/task/backend/unified-tool-provider.ts +779 -0
  278. package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
  279. package/src/teams/team-loader.ts +3 -3
  280. package/src/teams/team-runtime.ts +2 -0
  281. package/test_fixtures/README.md +2 -3
  282. package/test_fixtures/fixtures/index.ts +0 -3
  283. package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
  284. package/test_fixtures/fixtures/repos/index.ts +1 -3
  285. package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
  286. package/test_fixtures/fixtures/repos/types.ts +0 -11
  287. package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
  288. package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
  289. package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
  290. package/vitest.config.ts +1 -1
  291. package/vitest.e2e.config.ts +1 -1
  292. package/vitest.setup.ts +1 -30
  293. package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
  294. package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
  295. package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
  296. package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
  297. package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
  298. package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
  299. package/.macro-agent/teams/self-driving/team.yaml +0 -103
  300. package/.macro-agent/teams/structured/prompts/developer.md +0 -26
  301. package/.macro-agent/teams/structured/prompts/lead.md +0 -25
  302. package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
  303. package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
  304. package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
  305. package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
  306. package/.macro-agent/teams/structured/team.yaml +0 -89
  307. package/docs/sudocode-integration.md +0 -383
  308. package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
  309. package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
  310. package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
  311. package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
  312. package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
  313. package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
  314. package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
  315. package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
  316. package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
  317. package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
  318. package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
  319. package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
  320. package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
  321. package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
  322. package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
  323. package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
  324. package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
  325. package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
  326. package/src/task/backend/sudocode/backend.ts +0 -1237
  327. package/src/task/backend/sudocode/client.ts +0 -515
  328. package/src/task/backend/sudocode/index.ts +0 -120
  329. package/src/task/backend/sudocode/mapping.ts +0 -93
  330. package/src/task/backend/sudocode/server-client.ts +0 -522
  331. package/src/task/backend/sudocode/standalone-client.ts +0 -623
  332. package/src/task/backend/sudocode/sync-policy.ts +0 -387
  333. package/src/task/backend/sudocode/tools.ts +0 -896
  334. package/src/task/backend/tool-provider.ts +0 -506
  335. package/test_fixtures/fixtures/sudocode/index.ts +0 -29
  336. package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
  337. package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
@@ -1,383 +0,0 @@
1
- # Sudocode Integration
2
-
3
- macro-agent integrates with [sudocode](https://github.com/sudocode-ai/sudocode) to provide external issue tracking and dependency management for tasks. This enables agents to work on issues from a structured backlog with proper dependency ordering.
4
-
5
- ## Overview
6
-
7
- When using the sudocode backend:
8
- - Tasks are bound to sudocode issues via `external_id`
9
- - Blocking relationships come from sudocode's issue links
10
- - `listReady()` returns only tasks whose bound issues have no incomplete blockers
11
- - Task status can optionally sync with issue status
12
-
13
- ## Quick Start
14
-
15
- ### 1. Set Environment Variables
16
-
17
- ```bash
18
- # Enable sudocode backend
19
- export MACRO_TASK_BACKEND=sudocode
20
-
21
- # Set project path (defaults to cwd)
22
- export SUDOCODE_PROJECT_PATH=/path/to/project
23
- ```
24
-
25
- ### 2. Start macro-agent
26
-
27
- ```bash
28
- npx multiagent
29
- ```
30
-
31
- The agent will automatically connect to sudocode and use issues as the task source.
32
-
33
- ## Configuration Reference
34
-
35
- ### Environment Variables
36
-
37
- | Variable | Description | Default |
38
- |----------|-------------|---------|
39
- | `MACRO_TASK_BACKEND` | Backend type: `memory` or `sudocode` | `memory` |
40
- | `MACRO_TASK_TOOL_MODE` | Tool exposure mode: `abstract`, `native`, `both`, `auto` | `auto` |
41
- | `SUDOCODE_PROJECT_PATH` | Path to sudocode project root | `process.cwd()` |
42
- | `SUDOCODE_TOOL_MODE` | Sudocode tool mode: `native`, `mapped`, `both` | `mapped` |
43
-
44
- ### Programmatic Configuration
45
-
46
- ```typescript
47
- import { createTaskBackend, loadTaskConfigFromEnv } from 'macro-agent';
48
-
49
- // Load from environment
50
- const config = loadTaskConfigFromEnv();
51
-
52
- // Or configure manually
53
- const config = {
54
- backend: {
55
- type: 'sudocode',
56
- projectPath: '/path/to/project',
57
- idStrategy: 'dual', // Task ID strategy
58
- syncMode: 'realtime', // Event sync mode
59
- executionTracking: { mode: 'bound-only' },
60
- autoLinkSpecs: true, // Link tasks to specs
61
- toolMode: 'mapped', // Tool exposure mode
62
- },
63
- toolMode: 'auto',
64
- };
65
-
66
- const { backend, toolProvider, toolMode } = await createTaskBackend(config, eventStore);
67
- ```
68
-
69
- ### Backend Configuration Options
70
-
71
- ```typescript
72
- interface SudocodeBackendConfig {
73
- type: 'sudocode';
74
-
75
- /** Path to sudocode project root (contains .sudocode/) */
76
- projectPath: string;
77
-
78
- /** ID strategy (default: 'dual') */
79
- idStrategy?: 'dual';
80
-
81
- /** Sync mode for event subscriptions */
82
- syncMode?: 'realtime' | 'batch';
83
-
84
- /** Execution tracking configuration */
85
- executionTracking?: ExecutionTrackingConfig;
86
-
87
- /** Auto-link tasks to specs when created from spec context */
88
- autoLinkSpecs?: boolean;
89
-
90
- /** Tool mode for this backend */
91
- toolMode?: 'native' | 'mapped' | 'both';
92
- }
93
- ```
94
-
95
- ### Execution Tracking Options
96
-
97
- Control when execution records are created:
98
-
99
- ```typescript
100
- type ExecutionTrackingConfig =
101
- | { mode: 'none' } // No execution records
102
- | { mode: 'bound-only' } // Only tasks with external binding (default)
103
- | { mode: 'all' } // All agent runs
104
- | { mode: 'filter'; filter: ExecutionFilter };
105
- ```
106
-
107
- ## Usage Guide
108
-
109
- ### Creating Tasks Bound to Issues
110
-
111
- ```typescript
112
- // Create task bound to an existing sudocode issue
113
- const task = await backend.create({
114
- description: 'Implement feature X',
115
- external_id: 'i-abc123', // sudocode issue ID
116
- });
117
-
118
- console.log(task.external_id); // 'i-abc123'
119
- ```
120
-
121
- ### Multiple Tasks Per Issue
122
-
123
- Multiple tasks (parallel workers) can work on the same issue:
124
-
125
- ```typescript
126
- // Parallel workers on same issue
127
- const task1 = await backend.create({
128
- description: 'Worker 1 attempt',
129
- external_id: 'i-abc123',
130
- });
131
-
132
- const task2 = await backend.create({
133
- description: 'Worker 2 attempt',
134
- external_id: 'i-abc123',
135
- });
136
-
137
- // Assign to different agents
138
- await backend.assign(task1.id, 'worker-1');
139
- await backend.assign(task2.id, 'worker-2');
140
- ```
141
-
142
- ### Working with Dependencies
143
-
144
- Sudocode's blocking relationships determine task readiness:
145
-
146
- ```typescript
147
- // Get tasks that are ready (no blocking dependencies)
148
- const ready = await backend.listReady();
149
-
150
- // Check if a specific task is blocked
151
- const task = await backend.get(taskId);
152
- if (task.isBlocked) {
153
- // Task's bound issue has incomplete blockers
154
- const blockers = await backend.getBlockers(taskId);
155
- console.log('Blocked by:', blockers.map(b => b.external_id));
156
- }
157
- ```
158
-
159
- ### Task Lifecycle
160
-
161
- ```typescript
162
- // 1. Create task bound to issue
163
- const task = await backend.create({
164
- description: 'Implement feature',
165
- external_id: 'i-abc123',
166
- });
167
-
168
- // 2. Assign to agent
169
- await backend.assign(task.id, 'agent-1');
170
-
171
- // 3. Start execution
172
- await backend.start(task.id);
173
- // Issue status syncs to 'in_progress' if syncStatus enabled
174
-
175
- // 4. Complete task
176
- await backend.complete(task.id, {
177
- summary: 'Feature implemented',
178
- result: { files_changed: 3 },
179
- });
180
-
181
- // 5. (Optional) Issue is closed by coordinator, not automatically
182
- ```
183
-
184
- ### Event Subscriptions
185
-
186
- ```typescript
187
- // Subscribe to all task changes
188
- const unsubscribe = backend.onTaskChange((event) => {
189
- console.log(`Task ${event.taskId}: ${event.type}`);
190
- });
191
-
192
- // Subscribe to specific task
193
- const unsubscribe = backend.onTaskChange(taskId, (event) => {
194
- console.log(`Task updated: ${event.type}`);
195
- });
196
- ```
197
-
198
- ## Tool Modes
199
-
200
- The sudocode backend supports different tool exposure modes:
201
-
202
- | Mode | Description |
203
- |------|-------------|
204
- | `native` | Expose sudocode's native tools (`upsert_issue`, `link`, etc.) |
205
- | `mapped` | Map to abstract task tools (`create_task`, `complete_task`, etc.) |
206
- | `both` | Expose both tool sets |
207
-
208
- ### Auto Mode Behavior
209
-
210
- When `toolMode: 'auto'`:
211
- - Sudocode backend defaults to `mapped` (abstract tools)
212
- - Memory backend defaults to `abstract`
213
-
214
- ## Architecture
215
-
216
- ```
217
- ┌─────────────────────────────────────────────────────────────┐
218
- │ SudocodeTaskBackend │
219
- │ │
220
- │ ┌─────────────────────────────────────────────────────┐ │
221
- │ │ EventStore (Task Storage) │ │
222
- │ │ - Tasks with external_id bindings │ │
223
- │ │ - Task-level state (assignment, status, outputs) │ │
224
- │ └─────────────────────────────────────────────────────┘ │
225
- │ │ │
226
- │ ┌─────────────────────────────────────────────────────┐ │
227
- │ │ SudocodeClient (Interface) │ │
228
- │ │ - Abstracts deployment mode │ │
229
- │ │ - Issue/spec/relationship operations │ │
230
- │ └─────────────────────────────────────────────────────┘ │
231
- └──────────────────────────────┼───────────────────────────────┘
232
-
233
- ┌──────────────────┴──────────────────┐
234
- ▼ ▼
235
- ┌───────────────────────────┐ ┌───────────────────────────┐
236
- │ ServerClient │ │ StandaloneClient │
237
- │ (Managed Mode) │ │ (Standalone Mode) │
238
- │ - REST API + WebSocket │ │ - CLI + File Watcher │
239
- └───────────────────────────┘ └───────────────────────────┘
240
- ```
241
-
242
- ### Data Flow
243
-
244
- 1. **Task Creation**: Backend creates task in EventStore, binds to issue via `external_id`
245
- 2. **Blocker Lookup**: When `isBlocked` is queried, client fetches issue's blockers
246
- 3. **Status Sync**: Task status changes optionally sync to issue status
247
- 4. **Ready Queries**: `listReady()` filters tasks by sudocode's ready issues
248
-
249
- ## Migration Guide
250
-
251
- ### From InMemoryTaskBackend
252
-
253
- #### Breaking Changes
254
-
255
- 1. **No `subtasks[]` array** - Use `getChildren(parentId)` instead
256
- 2. **No `agent_history[]` array** - Use `getAgentHistory(taskId)` instead
257
- 3. **`isBlocked` is computed** - Based on sudocode relationships, not task.blockers
258
-
259
- #### Migration Steps
260
-
261
- 1. Update task creation to use `external_id` for issue binding:
262
- ```typescript
263
- // Before
264
- const task = await backend.create({ description: 'Work' });
265
-
266
- // After (with issue binding)
267
- const task = await backend.create({
268
- description: 'Work',
269
- external_id: 'i-abc123',
270
- });
271
- ```
272
-
273
- 2. Replace direct property access with method calls:
274
- ```typescript
275
- // Before
276
- const children = task.subtasks;
277
- const history = task.agent_history;
278
-
279
- // After
280
- const children = await backend.getChildren(task.id);
281
- const history = await backend.getAgentHistory(task.id);
282
- ```
283
-
284
- 3. Use `listReady()` for dependency-aware queries:
285
- ```typescript
286
- // Before (manual filtering)
287
- const tasks = await backend.list({ status: 'pending' });
288
- const ready = tasks.filter(t => !t.blockers?.length);
289
-
290
- // After
291
- const ready = await backend.listReady({ status: 'pending' });
292
- ```
293
-
294
- ### Coexistence
295
-
296
- Both backends can coexist during migration:
297
- - Tasks without `external_id` work like in-memory tasks
298
- - Tasks with `external_id` are bound to sudocode issues
299
- - Switch backends via environment variable without code changes
300
-
301
- ## Sync Policy
302
-
303
- Configure how task and issue state synchronize:
304
-
305
- ```typescript
306
- interface SyncPolicy {
307
- /** Action when bound issue is closed externally */
308
- onIssueClosed: 'complete_task' | 'fail_task' | 'notify_only';
309
-
310
- /** Action when issue description changes */
311
- onDescriptionChanged: 'propagate' | 'snapshot';
312
-
313
- /** Action when blocker status changes */
314
- onBlockerChanged: 'update_blocked' | 'notify_only';
315
-
316
- /** Update issue status when task starts */
317
- updateIssueOnStart: boolean;
318
-
319
- /** Update issue when task completes */
320
- updateIssueOnComplete: 'close' | 'comment' | 'never';
321
- }
322
- ```
323
-
324
- Default policy:
325
- ```typescript
326
- const defaultSyncPolicy = {
327
- onIssueClosed: 'notify_only', // Don't auto-complete/fail tasks
328
- onDescriptionChanged: 'snapshot', // Keep original description
329
- onBlockerChanged: 'update_blocked', // Update isBlocked state
330
- updateIssueOnStart: true, // Sync status to in_progress
331
- updateIssueOnComplete: 'never', // Let coordinator close issues
332
- };
333
- ```
334
-
335
- ## API Reference
336
-
337
- ### TaskBackend Methods
338
-
339
- | Method | Description |
340
- |--------|-------------|
341
- | `create(options)` | Create task, optionally bound to issue |
342
- | `get(id)` | Get task with computed `isBlocked` |
343
- | `update(id, updates)` | Update task metadata |
344
- | `assign(id, agentId)` | Assign task to agent |
345
- | `start(id)` | Start task, optionally sync to issue |
346
- | `complete(id, outputs?)` | Complete task |
347
- | `fail(id, error)` | Mark task as failed |
348
- | `list(filter?)` | List tasks with optional filter |
349
- | `listReady(filter?)` | List unblocked tasks |
350
- | `getBlockers(id)` | Get blocking tasks |
351
- | `getBlocking(id)` | Get tasks blocked by this one |
352
- | `getChildren(id)` | Get subtasks |
353
- | `getAgentHistory(id)` | Get assignment history |
354
- | `onTaskChange(callback)` | Subscribe to task events |
355
-
356
- ### ExtendedTask Fields
357
-
358
- | Field | Type | Description |
359
- |-------|------|-------------|
360
- | `id` | `string` | Internal task ID |
361
- | `external_id` | `string?` | Bound sudocode issue ID |
362
- | `status` | `TaskStatus` | Current status |
363
- | `isBlocked` | `boolean` | Computed from issue blockers |
364
- | `assigned_agent` | `string?` | Assigned agent ID |
365
- | `parent_task` | `string?` | Parent task ID |
366
- | `outputs` | `object?` | Task outputs on completion |
367
-
368
- ## Troubleshooting
369
-
370
- ### Task shows isBlocked=false when issue has blockers
371
-
372
- Ensure the sudocode client has fetched the latest issue state. Call `backend.getBlockers(taskId)` to refresh blocker data.
373
-
374
- ### Status not syncing to issue
375
-
376
- Check that `syncStatus: true` is set in backend config (default is true).
377
-
378
- ### Tasks not appearing in listReady()
379
-
380
- Tasks must:
381
- 1. Have status `pending` or `assigned`
382
- 2. Be bound to an issue with no incomplete blockers
383
- 3. Not be excluded by filter criteria