agentic-orchestrator 0.1.2 → 0.1.4

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 (300) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +126 -0
  3. package/README.md +166 -25
  4. package/agentic/orchestrator/adapters.yaml +3 -0
  5. package/agentic/orchestrator/gates.yaml +47 -0
  6. package/agentic/orchestrator/policy.yaml +89 -0
  7. package/agentic/orchestrator/schemas/adapters.schema.json +12 -0
  8. package/agentic/orchestrator/schemas/gates.schema.json +6 -1
  9. package/agentic/orchestrator/schemas/index.schema.json +14 -0
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +41 -0
  11. package/agentic/orchestrator/schemas/policy.schema.json +449 -52
  12. package/agentic/orchestrator/schemas/state.schema.json +16 -0
  13. package/agentic/orchestrator/tools/catalog.json +68 -0
  14. package/agentic/orchestrator/tools/schemas/input/cost.get.input.schema.json +10 -0
  15. package/agentic/orchestrator/tools/schemas/input/cost.record.input.schema.json +13 -0
  16. package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +11 -0
  17. package/agentic/orchestrator/tools/schemas/input/performance.get_analytics.input.schema.json +10 -0
  18. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +18 -0
  19. package/agentic/orchestrator/tools/schemas/output/cost.get.output.schema.json +13 -0
  20. package/agentic/orchestrator/tools/schemas/output/cost.record.output.schema.json +13 -0
  21. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +7 -0
  22. package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +23 -0
  23. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +46 -0
  24. package/agentic/orchestrator/tools/schemas/output/performance.record_outcome.output.schema.json +10 -0
  25. package/agentic/orchestrator/tools.md +5 -0
  26. package/apps/control-plane/scripts/validate-architecture-rules.mjs +28 -2
  27. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +12 -0
  28. package/apps/control-plane/scripts/validate-mcp-contracts.ts +92 -0
  29. package/apps/control-plane/src/application/adapters/adapter-registry.ts +169 -0
  30. package/apps/control-plane/src/application/multi-project-loader.ts +119 -0
  31. package/apps/control-plane/src/application/services/activity-monitor-service.ts +199 -0
  32. package/apps/control-plane/src/application/services/cost-tracking-service.ts +82 -0
  33. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +86 -0
  34. package/apps/control-plane/src/application/services/feature-deletion-service.ts +8 -7
  35. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +15 -0
  36. package/apps/control-plane/src/application/services/gate-service.ts +38 -2
  37. package/apps/control-plane/src/application/services/instance-isolation-service.ts +18 -0
  38. package/apps/control-plane/src/application/services/issue-tracker-service.ts +469 -0
  39. package/apps/control-plane/src/application/services/merge-service.ts +67 -3
  40. package/apps/control-plane/src/application/services/notifier-service.ts +295 -0
  41. package/apps/control-plane/src/application/services/performance-analytics-service.ts +122 -0
  42. package/apps/control-plane/src/application/services/plan-service.ts +51 -0
  43. package/apps/control-plane/src/application/services/pr-monitor-service.ts +262 -0
  44. package/apps/control-plane/src/application/services/reactions-service.ts +175 -0
  45. package/apps/control-plane/src/application/services/reporting-service.ts +17 -2
  46. package/apps/control-plane/src/application/services/run-lease-service.ts +16 -38
  47. package/apps/control-plane/src/application/tools/tool-metadata.ts +4 -1
  48. package/apps/control-plane/src/cli/aop.ts +1 -1
  49. package/apps/control-plane/src/cli/attach-command-handler.ts +120 -0
  50. package/apps/control-plane/src/cli/cleanup-command-handler.ts +190 -0
  51. package/apps/control-plane/src/cli/cli-argument-parser.ts +69 -3
  52. package/apps/control-plane/src/cli/dashboard-command-handler.ts +57 -0
  53. package/apps/control-plane/src/cli/help-command-handler.ts +163 -0
  54. package/apps/control-plane/src/cli/init-command-handler.ts +609 -0
  55. package/apps/control-plane/src/cli/resume-command-handler.ts +1 -0
  56. package/apps/control-plane/src/cli/retry-command-handler.ts +138 -0
  57. package/apps/control-plane/src/cli/run-command-handler.ts +115 -3
  58. package/apps/control-plane/src/cli/send-command-handler.ts +65 -0
  59. package/apps/control-plane/src/cli/status-command-handler.ts +102 -2
  60. package/apps/control-plane/src/cli/types.ts +26 -1
  61. package/apps/control-plane/src/core/constants.ts +8 -2
  62. package/apps/control-plane/src/core/error-codes.ts +3 -1
  63. package/apps/control-plane/src/core/gates.ts +170 -50
  64. package/apps/control-plane/src/core/kernel.ts +280 -5
  65. package/apps/control-plane/src/core/path-layout.ts +12 -0
  66. package/apps/control-plane/src/core/tool-caller.ts +36 -0
  67. package/apps/control-plane/src/core/workspace-hooks.ts +87 -0
  68. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +258 -9
  69. package/apps/control-plane/src/providers/providers.ts +235 -14
  70. package/apps/control-plane/src/supervisor/build-wave-executor.ts +129 -8
  71. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +123 -5
  72. package/apps/control-plane/src/supervisor/run-coordinator.ts +143 -6
  73. package/apps/control-plane/src/supervisor/runtime.ts +135 -6
  74. package/apps/control-plane/src/supervisor/types.ts +12 -21
  75. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +8 -0
  76. package/apps/control-plane/test/activity-monitor.spec.ts +294 -0
  77. package/apps/control-plane/test/adapter-registry.spec.ts +132 -0
  78. package/apps/control-plane/test/batch-operations.spec.ts +112 -0
  79. package/apps/control-plane/test/bootstrap-attach.spec.ts +102 -0
  80. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +252 -0
  81. package/apps/control-plane/test/bootstrap.spec.ts +560 -0
  82. package/apps/control-plane/test/cleanup-command.spec.ts +301 -0
  83. package/apps/control-plane/test/cli-helpers.spec.ts +404 -1
  84. package/apps/control-plane/test/cli.unit.spec.ts +182 -1
  85. package/apps/control-plane/test/collision-queue.spec.ts +104 -1
  86. package/apps/control-plane/test/core-utils.spec.ts +175 -2
  87. package/apps/control-plane/test/cost-tracking.spec.ts +143 -0
  88. package/apps/control-plane/test/dashboard-api.integration.spec.ts +247 -0
  89. package/apps/control-plane/test/dashboard-client.spec.ts +116 -0
  90. package/apps/control-plane/test/dashboard-command.spec.ts +103 -0
  91. package/apps/control-plane/test/dependency-scheduler.spec.ts +189 -0
  92. package/apps/control-plane/test/epoch-tracking.spec.ts +4 -4
  93. package/apps/control-plane/test/feature-deletion-service.spec.ts +422 -0
  94. package/apps/control-plane/test/feature-lifecycle.spec.ts +202 -0
  95. package/apps/control-plane/test/git-spawn-error.spec.ts +24 -0
  96. package/apps/control-plane/test/incremental-gates.spec.ts +137 -0
  97. package/apps/control-plane/test/init-wizard.spec.ts +506 -0
  98. package/apps/control-plane/test/instance-isolation.spec.ts +83 -0
  99. package/apps/control-plane/test/issue-tracker.spec.ts +890 -0
  100. package/apps/control-plane/test/kernel.coverage.spec.ts +3 -5
  101. package/apps/control-plane/test/kernel.coverage2.spec.ts +871 -0
  102. package/apps/control-plane/test/kernel.spec.ts +13 -11
  103. package/apps/control-plane/test/lock-service.spec.ts +508 -0
  104. package/apps/control-plane/test/mcp-helpers.spec.ts +176 -0
  105. package/apps/control-plane/test/mcp.spec.ts +50 -15
  106. package/apps/control-plane/test/merge-service.spec.ts +67 -4
  107. package/apps/control-plane/test/multi-project.spec.ts +372 -0
  108. package/apps/control-plane/test/notifier-service.spec.ts +388 -0
  109. package/apps/control-plane/test/parallel-gates.spec.ts +312 -0
  110. package/apps/control-plane/test/patch-service.spec.ts +253 -0
  111. package/apps/control-plane/test/performance-analytics.spec.ts +338 -0
  112. package/apps/control-plane/test/planning-wave-executor.spec.ts +168 -0
  113. package/apps/control-plane/test/pr-monitor.spec.ts +385 -0
  114. package/apps/control-plane/test/providers.spec.ts +344 -1
  115. package/apps/control-plane/test/reactions.spec.ts +392 -0
  116. package/apps/control-plane/test/resume-command.spec.ts +390 -0
  117. package/apps/control-plane/test/run-coordinator.spec.ts +481 -2
  118. package/apps/control-plane/test/schema-date-time.spec.ts +46 -0
  119. package/apps/control-plane/test/service-retry-paths.spec.ts +30 -0
  120. package/apps/control-plane/test/services.spec.ts +95 -2
  121. package/apps/control-plane/test/session-management.spec.ts +450 -0
  122. package/apps/control-plane/test/spec-ingestion.spec.ts +190 -0
  123. package/apps/control-plane/test/supervisor-collaborators.spec.ts +699 -2
  124. package/apps/control-plane/test/supervisor.spec.ts +36 -30
  125. package/apps/control-plane/test/supervisor.unit.spec.ts +405 -0
  126. package/apps/control-plane/test/worker-decision-loop.spec.ts +57 -0
  127. package/apps/control-plane/test/workspace-hooks.spec.ts +177 -0
  128. package/apps/control-plane/vitest.config.ts +21 -5
  129. package/dist/apps/control-plane/application/adapters/adapter-registry.d.ts +44 -0
  130. package/dist/apps/control-plane/application/adapters/adapter-registry.js +76 -0
  131. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -0
  132. package/dist/apps/control-plane/application/multi-project-loader.d.ts +31 -0
  133. package/dist/apps/control-plane/application/multi-project-loader.js +82 -0
  134. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -0
  135. package/dist/apps/control-plane/application/services/activity-monitor-service.d.ts +43 -0
  136. package/dist/apps/control-plane/application/services/activity-monitor-service.js +132 -0
  137. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -0
  138. package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +28 -0
  139. package/dist/apps/control-plane/application/services/cost-tracking-service.js +48 -0
  140. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -0
  141. package/dist/apps/control-plane/application/services/dependency-scheduler-service.d.ts +26 -0
  142. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js +75 -0
  143. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -0
  144. package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +2 -0
  145. package/dist/apps/control-plane/application/services/feature-deletion-service.js +6 -7
  146. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  147. package/dist/apps/control-plane/application/services/gate-interpolation-service.d.ts +7 -0
  148. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +7 -0
  149. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -0
  150. package/dist/apps/control-plane/application/services/gate-service.js +32 -2
  151. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  152. package/dist/apps/control-plane/application/services/instance-isolation-service.d.ts +11 -0
  153. package/dist/apps/control-plane/application/services/instance-isolation-service.js +17 -0
  154. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -0
  155. package/dist/apps/control-plane/application/services/issue-tracker-service.d.ts +65 -0
  156. package/dist/apps/control-plane/application/services/issue-tracker-service.js +358 -0
  157. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -0
  158. package/dist/apps/control-plane/application/services/merge-service.d.ts +4 -0
  159. package/dist/apps/control-plane/application/services/merge-service.js +44 -2
  160. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  161. package/dist/apps/control-plane/application/services/notifier-service.d.ts +74 -0
  162. package/dist/apps/control-plane/application/services/notifier-service.js +212 -0
  163. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -0
  164. package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +39 -0
  165. package/dist/apps/control-plane/application/services/performance-analytics-service.js +75 -0
  166. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -0
  167. package/dist/apps/control-plane/application/services/plan-service.d.ts +1 -0
  168. package/dist/apps/control-plane/application/services/plan-service.js +53 -0
  169. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  170. package/dist/apps/control-plane/application/services/pr-monitor-service.d.ts +44 -0
  171. package/dist/apps/control-plane/application/services/pr-monitor-service.js +192 -0
  172. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -0
  173. package/dist/apps/control-plane/application/services/reactions-service.d.ts +67 -0
  174. package/dist/apps/control-plane/application/services/reactions-service.js +114 -0
  175. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -0
  176. package/dist/apps/control-plane/application/services/reporting-service.d.ts +1 -0
  177. package/dist/apps/control-plane/application/services/reporting-service.js +13 -2
  178. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  179. package/dist/apps/control-plane/application/services/run-lease-service.d.ts +2 -0
  180. package/dist/apps/control-plane/application/services/run-lease-service.js +14 -38
  181. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  182. package/dist/apps/control-plane/application/tools/tool-metadata.js +3 -1
  183. package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
  184. package/dist/apps/control-plane/cli/aop.d.ts +1 -1
  185. package/dist/apps/control-plane/cli/aop.js +1 -1
  186. package/dist/apps/control-plane/cli/attach-command-handler.d.ts +12 -0
  187. package/dist/apps/control-plane/cli/attach-command-handler.js +98 -0
  188. package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -0
  189. package/dist/apps/control-plane/cli/cleanup-command-handler.d.ts +12 -0
  190. package/dist/apps/control-plane/cli/cleanup-command-handler.js +162 -0
  191. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -0
  192. package/dist/apps/control-plane/cli/cli-argument-parser.js +73 -3
  193. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  194. package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +7 -0
  195. package/dist/apps/control-plane/cli/dashboard-command-handler.js +45 -0
  196. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -0
  197. package/dist/apps/control-plane/cli/help-command-handler.d.ts +8 -0
  198. package/dist/apps/control-plane/cli/help-command-handler.js +146 -0
  199. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -0
  200. package/dist/apps/control-plane/cli/init-command-handler.d.ts +26 -0
  201. package/dist/apps/control-plane/cli/init-command-handler.js +517 -0
  202. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -0
  203. package/dist/apps/control-plane/cli/resume-command-handler.js +1 -1
  204. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  205. package/dist/apps/control-plane/cli/retry-command-handler.d.ts +8 -0
  206. package/dist/apps/control-plane/cli/retry-command-handler.js +111 -0
  207. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -0
  208. package/dist/apps/control-plane/cli/run-command-handler.d.ts +5 -0
  209. package/dist/apps/control-plane/cli/run-command-handler.js +82 -3
  210. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  211. package/dist/apps/control-plane/cli/send-command-handler.d.ts +8 -0
  212. package/dist/apps/control-plane/cli/send-command-handler.js +55 -0
  213. package/dist/apps/control-plane/cli/send-command-handler.js.map +1 -0
  214. package/dist/apps/control-plane/cli/status-command-handler.d.ts +12 -1
  215. package/dist/apps/control-plane/cli/status-command-handler.js +55 -2
  216. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  217. package/dist/apps/control-plane/cli/types.d.ts +26 -1
  218. package/dist/apps/control-plane/cli/types.js +15 -1
  219. package/dist/apps/control-plane/cli/types.js.map +1 -1
  220. package/dist/apps/control-plane/core/constants.d.ts +6 -0
  221. package/dist/apps/control-plane/core/constants.js +8 -2
  222. package/dist/apps/control-plane/core/constants.js.map +1 -1
  223. package/dist/apps/control-plane/core/error-codes.d.ts +2 -0
  224. package/dist/apps/control-plane/core/error-codes.js +3 -1
  225. package/dist/apps/control-plane/core/error-codes.js.map +1 -1
  226. package/dist/apps/control-plane/core/gates.d.ts +4 -0
  227. package/dist/apps/control-plane/core/gates.js +140 -43
  228. package/dist/apps/control-plane/core/gates.js.map +1 -1
  229. package/dist/apps/control-plane/core/kernel.d.ts +50 -1
  230. package/dist/apps/control-plane/core/kernel.js +220 -7
  231. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  232. package/dist/apps/control-plane/core/path-layout.d.ts +3 -0
  233. package/dist/apps/control-plane/core/path-layout.js +9 -0
  234. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  235. package/dist/apps/control-plane/core/tool-caller.d.ts +32 -0
  236. package/dist/apps/control-plane/core/tool-caller.js +2 -0
  237. package/dist/apps/control-plane/core/tool-caller.js.map +1 -0
  238. package/dist/apps/control-plane/core/workspace-hooks.d.ts +20 -0
  239. package/dist/apps/control-plane/core/workspace-hooks.js +69 -0
  240. package/dist/apps/control-plane/core/workspace-hooks.js.map +1 -0
  241. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +245 -9
  242. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  243. package/dist/apps/control-plane/providers/providers.d.ts +42 -3
  244. package/dist/apps/control-plane/providers/providers.js +216 -5
  245. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  246. package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +3 -0
  247. package/dist/apps/control-plane/supervisor/build-wave-executor.js +115 -6
  248. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  249. package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +3 -0
  250. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +109 -5
  251. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  252. package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +15 -0
  253. package/dist/apps/control-plane/supervisor/run-coordinator.js +132 -6
  254. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  255. package/dist/apps/control-plane/supervisor/runtime.d.ts +3 -0
  256. package/dist/apps/control-plane/supervisor/runtime.js +110 -6
  257. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  258. package/dist/apps/control-plane/supervisor/types.d.ts +9 -16
  259. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  260. package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +3 -0
  261. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +5 -0
  262. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  263. package/eslint.config.mjs +2 -1
  264. package/package.json +12 -2
  265. package/packages/web-dashboard/next-env.d.ts +5 -0
  266. package/packages/web-dashboard/next.config.js +7 -0
  267. package/packages/web-dashboard/package.json +26 -0
  268. package/packages/web-dashboard/src/app/api/actions/route.ts +64 -0
  269. package/packages/web-dashboard/src/app/api/events/route.ts +51 -0
  270. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +256 -0
  271. package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +10 -0
  272. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +25 -0
  273. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +63 -0
  274. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +16 -0
  275. package/packages/web-dashboard/src/app/api/projects/route.ts +31 -0
  276. package/packages/web-dashboard/src/app/api/status/route.ts +15 -0
  277. package/packages/web-dashboard/src/app/globals.css +2 -0
  278. package/packages/web-dashboard/src/app/layout.tsx +15 -0
  279. package/packages/web-dashboard/src/app/page.tsx +393 -0
  280. package/packages/web-dashboard/src/lib/aop-client.ts +244 -0
  281. package/packages/web-dashboard/src/lib/multi-project-config.ts +116 -0
  282. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +284 -0
  283. package/packages/web-dashboard/src/lib/types.ts +58 -0
  284. package/packages/web-dashboard/tsconfig.json +40 -0
  285. package/packages/web-dashboard/vitest.config.ts +6 -0
  286. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +1764 -0
  287. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +348 -0
  288. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +344 -0
  289. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +374 -0
  290. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +1059 -0
  291. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +466 -0
  292. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +198 -0
  293. package/spec-files/outstanding/agentic_orchestrator_validator_hardening_spec.md +365 -0
  294. package/spec-files/progress.md +481 -52
  295. /package/spec-files/{agentic_orchestrator_cli_delete_command_spec.md → completed/agentic_orchestrator_cli_delete_command_spec.md} +0 -0
  296. /package/spec-files/{agentic_orchestrator_dot_aop_generated_artifacts_spec.md → completed/agentic_orchestrator_dot_aop_generated_artifacts_spec.md} +0 -0
  297. /package/spec-files/{agentic_orchestrator_mcp_formalization_spec.md → completed/agentic_orchestrator_mcp_formalization_spec.md} +0 -0
  298. /package/spec-files/{agentic_orchestrator_oop_refactor_spec.md → completed/agentic_orchestrator_oop_refactor_spec.md} +0 -0
  299. /package/spec-files/{agentic_orchestrator_single_global_orchestrator_spec.md → completed/agentic_orchestrator_single_global_orchestrator_spec.md} +0 -0
  300. /package/spec-files/{agentic_orchestrator_spec.md → completed/agentic_orchestrator_spec.md} +0 -0
@@ -0,0 +1,36 @@
1
+ export type RuntimeRole = 'orchestrator' | 'planner' | 'builder' | 'qa';
2
+
3
+ export interface ToolCaller {
4
+ callTool<TData = Record<string, unknown>>(
5
+ role: RuntimeRole,
6
+ toolName: string,
7
+ args: Record<string, unknown>
8
+ ): Promise<{ ok: true; data: TData }>;
9
+ }
10
+
11
+ export interface FeatureStateFrontMatter {
12
+ version: number;
13
+ status: string;
14
+ cluster?: Record<string, string>;
15
+ gate_retry_count?: number;
16
+ last_retry_at?: string | null;
17
+ last_heartbeat_at?: string;
18
+ last_run_at?: string;
19
+ worktree_branch?: string;
20
+ branch?: string;
21
+ pr?: {
22
+ number: number;
23
+ url: string;
24
+ ci_status: string;
25
+ review_decision: string;
26
+ merge_ready: boolean;
27
+ pending_review_threads: number;
28
+ has_conflicts: boolean;
29
+ merge_score: number;
30
+ };
31
+ }
32
+
33
+ export interface FeatureStatePayload {
34
+ front_matter: FeatureStateFrontMatter;
35
+ body?: string;
36
+ }
@@ -0,0 +1,87 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { runCommand } from './git.js';
4
+
5
+ export interface WorkspaceHookWarning {
6
+ kind: 'symlink' | 'post_create';
7
+ target: string;
8
+ message: string;
9
+ command?: string;
10
+ code?: number;
11
+ stderr?: string;
12
+ }
13
+
14
+ export function formatWorkspaceHookWarning(warning: WorkspaceHookWarning): string {
15
+ if (warning.kind === 'symlink') {
16
+ return `symlink ${warning.target}: ${warning.message}`;
17
+ }
18
+ const command = warning.command ?? warning.target;
19
+ const codeSegment = typeof warning.code === 'number' ? ` (exit ${warning.code})` : '';
20
+ const stderrSegment = warning.stderr ? ` stderr=${warning.stderr.trim()}` : '';
21
+ return `post_create "${command}"${codeSegment}: ${warning.message}${stderrSegment}`;
22
+ }
23
+
24
+ /**
25
+ * Creates symlinks in the worktree for each listed file, sourcing from the main repo root.
26
+ * Failures are non-fatal and do not block worktree creation.
27
+ */
28
+ export async function applyWorktreeSymlinks(
29
+ repoRoot: string,
30
+ worktreePath: string,
31
+ symlinks: string[],
32
+ onWarning?: (warning: WorkspaceHookWarning) => void
33
+ ): Promise<void> {
34
+ for (const link of symlinks) {
35
+ const src = path.join(repoRoot, link);
36
+ const dst = path.join(worktreePath, link);
37
+ try {
38
+ await fs.mkdir(path.dirname(dst), { recursive: true });
39
+ await fs.symlink(src, dst);
40
+ } catch (error) {
41
+ onWarning?.({
42
+ kind: 'symlink',
43
+ target: link,
44
+ message: error instanceof Error ? error.message : String(error)
45
+ });
46
+ }
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Runs post-create commands in the worktree directory.
52
+ * Each command string is split on whitespace into executable + args.
53
+ * Failures are non-fatal and do not block worktree creation.
54
+ */
55
+ export async function runWorktreePostCreate(
56
+ worktreePath: string,
57
+ commands: string[],
58
+ onWarning?: (warning: WorkspaceHookWarning) => void
59
+ ): Promise<void> {
60
+ for (const cmd of commands) {
61
+ const parts = cmd.trim().split(/\s+/);
62
+ const [executable, ...args] = parts;
63
+ if (!executable) {
64
+ continue;
65
+ }
66
+ try {
67
+ const result = await runCommand(executable, args, { cwd: worktreePath });
68
+ if (result.code !== 0) {
69
+ onWarning?.({
70
+ kind: 'post_create',
71
+ target: cmd,
72
+ command: cmd,
73
+ message: 'command exited with non-zero status',
74
+ code: result.code,
75
+ stderr: result.stderr
76
+ });
77
+ }
78
+ } catch (error) {
79
+ onWarning?.({
80
+ kind: 'post_create',
81
+ target: cmd,
82
+ command: cmd,
83
+ message: error instanceof Error ? error.message : String(error)
84
+ });
85
+ }
86
+ }
87
+ }
@@ -1,18 +1,68 @@
1
1
  import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import readline from 'node:readline/promises';
2
4
  import { AopKernel } from '../../core/kernel.js';
5
+ import { computeInstanceId, defaultConfigPath } from '../../application/services/instance-isolation-service.js';
3
6
  import { ERROR_CODES } from '../../core/error-codes.js';
4
7
  import type { AppError } from '../../providers/providers.js';
5
8
  import { createToolingRuntime, resolveToolClient } from '../../mcp/runtime-factory.js';
6
9
  import { CliArgumentParser } from '../../cli/cli-argument-parser.js';
10
+ import { CliCommand } from '../../cli/types.js';
7
11
  import { printError, printPayload } from '../../cli/io.js';
8
12
  import { StatusCommandHandler } from '../../cli/status-command-handler.js';
9
13
  import { ResumeCommandHandler } from '../../cli/resume-command-handler.js';
10
14
  import { StopCommandHandler } from '../../cli/stop-command-handler.js';
11
15
  import { DeleteCommandHandler } from '../../cli/delete-command-handler.js';
16
+ import { CleanupCommandHandler } from '../../cli/cleanup-command-handler.js';
12
17
  import { RunCommandHandler } from '../../cli/run-command-handler.js';
18
+ import { InitCommandHandler } from '../../cli/init-command-handler.js';
19
+ import { DashboardCommandHandler } from '../../cli/dashboard-command-handler.js';
20
+ import { RetryCommandHandler } from '../../cli/retry-command-handler.js';
21
+ import { SendCommandHandler } from '../../cli/send-command-handler.js';
22
+ import { AttachCommandHandler } from '../../cli/attach-command-handler.js';
23
+ import { HelpCommandHandler } from '../../cli/help-command-handler.js';
24
+ import { MultiProjectLoader } from '../../application/multi-project-loader.js';
25
+ import { NullWorkerProvider, resolveProviderSelection } from '../../providers/providers.js';
13
26
  import type { RuntimeContext } from '../../cli/types.js';
27
+ import type { ProjectConfig } from '../../application/multi-project-loader.js';
14
28
 
15
- const SUPPORTED_COMMANDS = new Set(['run', 'status', 'resume', 'stop', 'delete']);
29
+ const SUPPORTED_COMMANDS = new Set<string>(Object.values(CliCommand));
30
+
31
+ function isPathWithin(parent: string, target: string): boolean {
32
+ const relative = path.relative(path.resolve(parent), path.resolve(target));
33
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
34
+ }
35
+
36
+ function selectProjectByCwd(projects: ProjectConfig[], cwd: string): ProjectConfig | null {
37
+ const matches = projects.filter((project) => isPathWithin(project.path, cwd));
38
+ if (matches.length === 1) {
39
+ return matches[0];
40
+ }
41
+ return null;
42
+ }
43
+
44
+ async function promptForProjectSelection(projects: ProjectConfig[]): Promise<string | null> {
45
+ const sorted = [...projects].sort((a, b) => a.name.localeCompare(b.name));
46
+ process.stdout.write('Multiple projects configured. Select one:\n');
47
+ for (let index = 0; index < sorted.length; index += 1) {
48
+ const project = sorted[index];
49
+ process.stdout.write(` ${index + 1}. ${project.name} (${project.path})\n`);
50
+ }
51
+ const rl = readline.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout
54
+ });
55
+ try {
56
+ const answer = await rl.question('Project number: ');
57
+ const numeric = Number.parseInt(answer.trim(), 10);
58
+ if (!Number.isFinite(numeric) || numeric < 1 || numeric > sorted.length) {
59
+ return null;
60
+ }
61
+ return sorted[numeric - 1].name;
62
+ } finally {
63
+ rl.close();
64
+ }
65
+ }
16
66
 
17
67
  export async function runCli(
18
68
  argv: string[] = process.argv.slice(2),
@@ -20,7 +70,73 @@ export async function runCli(
20
70
  ): Promise<number> {
21
71
  const parser = new CliArgumentParser();
22
72
  const options = parser.parse(argv);
23
- const repoRoot = runtime.cwd;
73
+
74
+ const multiLoader = new MultiProjectLoader();
75
+ const multiConfig = await multiLoader.load(runtime.cwd);
76
+
77
+ // Resolve repo root and project context.
78
+ let repoRoot = runtime.cwd;
79
+ let selectedProject: ProjectConfig | null = null;
80
+
81
+ if (options.project) {
82
+ if (!multiConfig) {
83
+ printError(ERROR_CODES.INVALID_CLI_ARGS, 'No multi-project.yaml found; cannot use --project', {
84
+ project: options.project
85
+ });
86
+ return 1;
87
+ }
88
+ selectedProject = multiLoader.getProject(multiConfig, options.project);
89
+ if (!selectedProject) {
90
+ printError(ERROR_CODES.INVALID_CLI_ARGS, `Project not found: ${options.project}`, {
91
+ project: options.project,
92
+ available: multiConfig.projects.map((p) => p.name)
93
+ });
94
+ return 1;
95
+ }
96
+ repoRoot = selectedProject.path;
97
+ } else if (multiConfig && !options.all && options.command !== CliCommand.Init) {
98
+ if (multiConfig.projects.length === 1) {
99
+ selectedProject = multiConfig.projects[0];
100
+ repoRoot = selectedProject.path;
101
+ } else {
102
+ const cwdSelection = selectProjectByCwd(multiConfig.projects, runtime.cwd);
103
+ if (cwdSelection) {
104
+ selectedProject = cwdSelection;
105
+ repoRoot = selectedProject.path;
106
+ } else {
107
+ const defaultProjectName = multiConfig.defaults?.default_project;
108
+ const defaultProject =
109
+ typeof defaultProjectName === 'string' && defaultProjectName.length > 0
110
+ ? multiLoader.getProject(multiConfig, defaultProjectName)
111
+ : null;
112
+ if (defaultProject) {
113
+ selectedProject = defaultProject;
114
+ repoRoot = selectedProject.path;
115
+ } else if (process.stdin.isTTY && process.stdout.isTTY) {
116
+ const selectedName = await promptForProjectSelection(multiConfig.projects);
117
+ if (!selectedName) {
118
+ printError(ERROR_CODES.INVALID_CLI_ARGS, 'Invalid project selection', {
119
+ available_projects: multiConfig.projects.map((p) => p.name)
120
+ });
121
+ return 1;
122
+ }
123
+ selectedProject = multiLoader.getProject(multiConfig, selectedName);
124
+ if (!selectedProject) {
125
+ printError(ERROR_CODES.INVALID_CLI_ARGS, 'Selected project was not found in configuration', {
126
+ selected_project: selectedName
127
+ });
128
+ return 1;
129
+ }
130
+ repoRoot = selectedProject.path;
131
+ } else {
132
+ printError(ERROR_CODES.INVALID_CLI_ARGS, 'Multiple projects configured; --project is required', {
133
+ available_projects: multiConfig.projects.map((p) => p.name)
134
+ });
135
+ return 1;
136
+ }
137
+ }
138
+ }
139
+ }
24
140
 
25
141
  try {
26
142
  if (!SUPPORTED_COMMANDS.has(options.command)) {
@@ -30,23 +146,116 @@ export async function runCli(
30
146
  return 1;
31
147
  }
32
148
 
149
+ if (options.command === CliCommand.Help) {
150
+ // The next argv token (if any) is the subcommand to explain
151
+ const subcommand = argv.find((a) => !a.startsWith('-') && a !== CliCommand.Help);
152
+ const handler = new HelpCommandHandler();
153
+ const payload = handler.execute(subcommand);
154
+ process.stdout.write(payload.data.help + '\n');
155
+ return 0;
156
+ }
157
+
158
+ if (options.command === CliCommand.Init) {
159
+ const handler = new InitCommandHandler(repoRoot);
160
+ const payload = await handler.execute({ auto: options.auto, force: options.force });
161
+ printPayload(payload);
162
+ return 0;
163
+ }
164
+
165
+ if (options.command === CliCommand.Dashboard) {
166
+ const handler = new DashboardCommandHandler();
167
+ const defaultDashboardPort = selectedProject?.dashboard_port ?? multiConfig?.defaults?.dashboard_port;
168
+ const payload = await handler.execute({
169
+ port: options.port ?? defaultDashboardPort,
170
+ foreground: options.foreground,
171
+ dev: options.dev
172
+ });
173
+ printPayload(payload);
174
+ return 0;
175
+ }
176
+
33
177
  const transport = parser.resolveTransport(options.transport);
34
178
  const runId = `run:${crypto.randomUUID()}`;
35
179
 
36
- const kernel = new AopKernel(repoRoot);
180
+ // Handle --all for status: aggregate across all projects in multi-project.yaml
181
+ if (options.command === CliCommand.Status && options.all) {
182
+ if (!multiConfig) {
183
+ // No multi-project.yaml — fall through to normal single-project status below
184
+ } else {
185
+ const projectStatuses: Array<{ name: string; path: string; status: unknown }> = [];
186
+ for (const project of multiConfig.projects) {
187
+ try {
188
+ const projectPolicyPath = multiLoader.resolveProjectPolicyPath(multiConfig, project);
189
+ const projectGatesPath = multiLoader.resolveProjectGatesPath(multiConfig, project);
190
+ const projectKernel = new AopKernel(project.path, computeInstanceId(defaultConfigPath(project.path)), {
191
+ policyPath: projectPolicyPath,
192
+ gatesPath: projectGatesPath
193
+ });
194
+ await projectKernel.ensureLoaded();
195
+ const projectTooling = await createToolingRuntime(project.path, projectKernel);
196
+ const projectToolClient = resolveToolClient(transport, projectTooling);
197
+ const projectHandler = new StatusCommandHandler(projectToolClient, runId);
198
+ const projectStatus = await projectHandler.execute({ summary: options.summary });
199
+ projectStatuses.push({ name: project.name, path: project.path, status: projectStatus });
200
+ } catch (err) {
201
+ const typed = err as AppError;
202
+ projectStatuses.push({
203
+ name: project.name,
204
+ path: project.path,
205
+ status: { ok: false, error: { code: typed.code ?? ERROR_CODES.INTERNAL_ERROR, message: typed.message } }
206
+ });
207
+ }
208
+ }
209
+ const payload = { ok: true, data: { projects: projectStatuses } };
210
+ printPayload(payload);
211
+ return 0;
212
+ }
213
+ }
214
+
215
+ const selectedPolicyPath =
216
+ selectedProject && multiConfig ? multiLoader.resolveProjectPolicyPath(multiConfig, selectedProject) : undefined;
217
+ const selectedGatesPath =
218
+ selectedProject && multiConfig ? multiLoader.resolveProjectGatesPath(multiConfig, selectedProject) : undefined;
219
+
220
+ const instanceId = computeInstanceId(defaultConfigPath(repoRoot));
221
+ const kernel = new AopKernel(repoRoot, instanceId, {
222
+ policyPath: selectedPolicyPath,
223
+ gatesPath: selectedGatesPath
224
+ });
37
225
  await kernel.ensureLoaded();
38
226
 
39
227
  const tooling = await createToolingRuntime(repoRoot, kernel);
40
228
  const toolClient = resolveToolClient(transport, tooling);
41
229
 
42
- if (options.command === 'status') {
230
+ let commandProvider: NullWorkerProvider | null = null;
231
+ if (options.command === CliCommand.Send || options.command === CliCommand.Attach) {
232
+ let selection;
233
+ try {
234
+ selection = resolveProviderSelection({
235
+ cli: options as unknown as Record<string, string | undefined>,
236
+ env: runtime.env,
237
+ agentsConfig: kernel.getAgentsConfig()
238
+ });
239
+ } catch {
240
+ selection = {
241
+ provider: 'custom',
242
+ model: 'custom-default',
243
+ provider_config_env: null,
244
+ provider_config_ref: null
245
+ };
246
+ }
247
+ commandProvider = new NullWorkerProvider(selection);
248
+ kernel.setProvider(commandProvider);
249
+ }
250
+
251
+ if (options.command === CliCommand.Status) {
43
252
  const handler = new StatusCommandHandler(toolClient, runId);
44
- const payload = await handler.execute();
253
+ const payload = await handler.execute({ summary: options.summary });
45
254
  printPayload(payload);
46
255
  return 0;
47
256
  }
48
257
 
49
- if (options.command === 'resume') {
258
+ if (options.command === CliCommand.Resume) {
50
259
  const handler = new ResumeCommandHandler();
51
260
  const payload = await handler.execute({
52
261
  repoRoot,
@@ -61,20 +270,58 @@ export async function runCli(
61
270
  return 0;
62
271
  }
63
272
 
64
- if (options.command === 'stop') {
273
+ if (options.command === CliCommand.Stop) {
65
274
  const handler = new StopCommandHandler();
66
275
  const payload = await handler.execute();
67
276
  printPayload(payload);
68
277
  return 0;
69
278
  }
70
279
 
71
- if (options.command === 'delete') {
280
+ if (options.command === CliCommand.Delete) {
72
281
  const handler = new DeleteCommandHandler(toolClient, runId);
73
282
  const payload = await handler.execute(options);
74
283
  printPayload(payload);
75
284
  return 0;
76
285
  }
77
286
 
287
+ if (options.command === CliCommand.Cleanup) {
288
+ const policySnapshot = kernel.getPolicySnapshot() as {
289
+ cleanup?: { grace_period_seconds?: number; auto_after_merge?: boolean };
290
+ };
291
+ const gracePeriodSeconds = policySnapshot.cleanup?.grace_period_seconds;
292
+ const autoAfterMerge = policySnapshot.cleanup?.auto_after_merge === true;
293
+ const handler = new CleanupCommandHandler(toolClient, runId, repoRoot, gracePeriodSeconds, autoAfterMerge);
294
+ const payload = await handler.execute(options);
295
+ printPayload(payload);
296
+ return 0;
297
+ }
298
+
299
+ if (options.command === CliCommand.Retry) {
300
+ const handler = new RetryCommandHandler(toolClient, runId);
301
+ const payload = await handler.execute(options);
302
+ printPayload(payload);
303
+ return 0;
304
+ }
305
+
306
+ if (options.command === CliCommand.Send) {
307
+ const handler = new SendCommandHandler(toolClient, runId);
308
+ const payload = await handler.execute(options);
309
+ printPayload(payload);
310
+ return 0;
311
+ }
312
+
313
+ if (options.command === CliCommand.Attach) {
314
+ if (!commandProvider) {
315
+ const error = new Error('attach provider was not initialized') as AppError;
316
+ error.code = ERROR_CODES.INTERNAL_ERROR;
317
+ throw error;
318
+ }
319
+ const handler = new AttachCommandHandler(toolClient, runId, kernel, commandProvider);
320
+ const payload = await handler.execute(options);
321
+ printPayload(payload);
322
+ return 0;
323
+ }
324
+
78
325
  const handler = new RunCommandHandler();
79
326
  const payload = await handler.execute({
80
327
  repoRoot,
@@ -83,7 +330,9 @@ export async function runCli(
83
330
  transport,
84
331
  options,
85
332
  kernel,
86
- toolClient
333
+ toolClient,
334
+ maxActiveFeatures: multiConfig?.defaults?.max_active_features ?? undefined,
335
+ maxParallelGateRuns: multiConfig?.defaults?.max_parallel_gate_runs ?? undefined
87
336
  });
88
337
  printPayload(payload);
89
338
  return 0;