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,609 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { execFile } from 'node:child_process';
4
+ import { createInterface } from 'node:readline/promises';
5
+ import { promisify } from 'node:util';
6
+ import { stdin as input, stdout as output } from 'node:process';
7
+ import { fileURLToPath } from 'node:url';
8
+ import YAML from 'yaml';
9
+ import { SchemaRegistry } from '../core/schemas.js';
10
+
11
+ const execFileAsync = promisify(execFile);
12
+ const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
13
+ const TEMPLATE_ROOT = path.resolve(MODULE_DIR, '../../../../agentic/orchestrator');
14
+
15
+ export interface InitOptions {
16
+ auto?: boolean;
17
+ force?: boolean;
18
+ }
19
+
20
+ type TestFramework = 'vitest' | 'jest' | 'pytest' | 'maven' | 'gradle';
21
+
22
+ interface PromptSession {
23
+ question(query: string): Promise<string>;
24
+ close(): void;
25
+ }
26
+
27
+ interface GitContext {
28
+ remoteUrl: string | null;
29
+ defaultBranch: string;
30
+ }
31
+
32
+ interface WizardConfig {
33
+ baseBranch: string;
34
+ maxParallelGateRuns: number;
35
+ dashboardPort: number;
36
+ framework: TestFramework;
37
+ notifications: {
38
+ desktop: boolean;
39
+ slack: boolean;
40
+ webhook: boolean;
41
+ slackWebhook: string;
42
+ webhookUrl: string;
43
+ };
44
+ }
45
+
46
+ export interface InitCommandResult {
47
+ ok: true;
48
+ data: {
49
+ command: 'init';
50
+ created: string[];
51
+ updated: string[];
52
+ skipped: string[];
53
+ validation_warnings: string[];
54
+ next_steps: string[];
55
+ };
56
+ }
57
+
58
+ function createPromptSession(): PromptSession {
59
+ return createInterface({ input, output });
60
+ }
61
+
62
+ async function detectGitContext(repoRoot: string): Promise<GitContext> {
63
+ let remoteUrl: string | null = null;
64
+ try {
65
+ const gitConfig = await fs.readFile(path.join(repoRoot, '.git', 'config'), 'utf8');
66
+ const sections = gitConfig.split(/\n(?=\[)/);
67
+ for (const section of sections) {
68
+ if (/^\[remote "origin"]/.test(section)) {
69
+ const urlMatch = /\s+url\s*=\s*(.+)/.exec(section);
70
+ if (urlMatch) {
71
+ remoteUrl = urlMatch[1].trim();
72
+ }
73
+ break;
74
+ }
75
+ }
76
+ } catch {
77
+ // not a git repo or no .git/config
78
+ }
79
+
80
+ let defaultBranch = 'main';
81
+ try {
82
+ const { stdout } = await execFileAsync(
83
+ 'git',
84
+ ['-C', repoRoot, 'symbolic-ref', 'refs/remotes/origin/HEAD', '--short'],
85
+ { timeout: 3000 }
86
+ );
87
+ const ref = stdout.trim();
88
+ const parts = ref.split('/');
89
+ defaultBranch = parts[parts.length - 1] ?? 'main';
90
+ } catch {
91
+ // use default
92
+ }
93
+
94
+ return { remoteUrl, defaultBranch };
95
+ }
96
+
97
+ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
98
+ try {
99
+ const content = await fs.readFile(path.join(repoRoot, 'package.json'), 'utf8');
100
+ const pkg = JSON.parse(content) as Record<string, unknown>;
101
+ const deps: Record<string, unknown> = {
102
+ ...(typeof pkg.dependencies === 'object' && pkg.dependencies !== null
103
+ ? (pkg.dependencies as Record<string, unknown>)
104
+ : {}),
105
+ ...(typeof pkg.devDependencies === 'object' && pkg.devDependencies !== null
106
+ ? (pkg.devDependencies as Record<string, unknown>)
107
+ : {})
108
+ };
109
+ if ('vitest' in deps) {
110
+ return 'vitest';
111
+ }
112
+ if ('jest' in deps) {
113
+ return 'jest';
114
+ }
115
+ } catch {
116
+ // no package.json
117
+ }
118
+
119
+ const buildFileChecks: Array<[string, TestFramework]> = [
120
+ ['setup.py', 'pytest'],
121
+ ['pyproject.toml', 'pytest'],
122
+ ['pom.xml', 'maven'],
123
+ ['build.gradle', 'gradle'],
124
+ ['build.gradle.kts', 'gradle']
125
+ ];
126
+
127
+ for (const [file, framework] of buildFileChecks) {
128
+ try {
129
+ await fs.access(path.join(repoRoot, file));
130
+ return framework;
131
+ } catch {
132
+ // continue
133
+ }
134
+ }
135
+
136
+ return 'vitest';
137
+ }
138
+
139
+ function buildGateCommands(framework: TestFramework): { test: string[]; testWithCoverage: string[] } {
140
+ switch (framework) {
141
+ case 'jest':
142
+ return { test: ['npx', 'jest'], testWithCoverage: ['npx', 'jest', '--coverage'] };
143
+ case 'pytest':
144
+ return { test: ['pytest'], testWithCoverage: ['pytest', '--cov'] };
145
+ case 'maven':
146
+ return { test: ['mvn', 'test'], testWithCoverage: ['mvn', 'verify'] };
147
+ case 'gradle':
148
+ return { test: ['./gradlew', 'test'], testWithCoverage: ['./gradlew', 'check'] };
149
+ default:
150
+ return { test: ['npx', 'vitest', 'run'], testWithCoverage: ['npx', 'vitest', 'run', '--coverage'] };
151
+ }
152
+ }
153
+
154
+ function yamlList(items: string[]): string {
155
+ return items.map((item) => `"${item}"`).join(', ');
156
+ }
157
+
158
+ function escapeYamlString(value: string): string {
159
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
160
+ }
161
+
162
+ function generatePolicyYaml(context: GitContext, wizard: WizardConfig): string {
163
+ const notificationsEnabled = wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
164
+ return `version: 1
165
+ commit_policy:
166
+ allow_commit: false
167
+ allow_merge: false
168
+ patch_policy:
169
+ enforce_plan: true
170
+ enforce_allowed_areas: true
171
+ locks:
172
+ resources:
173
+ - openapi
174
+ - events
175
+ - db_migrations
176
+ contract_to_resource:
177
+ openapi: openapi
178
+ events: events
179
+ db: db_migrations
180
+ lease_ttl_seconds: 300
181
+ acquire_behavior: wait
182
+ default_wait_timeout_seconds: 300
183
+ acquire_backoff:
184
+ initial_ms: 200
185
+ max_ms: 5000
186
+ multiplier: 2
187
+ jitter_ms: 150
188
+ protected_areas:
189
+ - agentic/orchestrator/schemas
190
+ - agentic/orchestrator/policy.yaml
191
+ required_modes:
192
+ - fast
193
+ - full
194
+ required_merge_mode: merge
195
+ collision_policy: reject
196
+ config_precedence:
197
+ policy_hard_constraints:
198
+ - execution.default_step_timeout_seconds
199
+ - testing.coverage.minimums
200
+ - testing.coverage.targets
201
+ gates_profile_defaults:
202
+ - profiles
203
+ plan_verification_overrides:
204
+ - verification_overrides
205
+ path_rules:
206
+ matching: repo_prefix
207
+ normalize_paths: true
208
+ allow_symlink_traversal: false
209
+ execution:
210
+ default_step_timeout_seconds: 600
211
+ retry_policy:
212
+ transient_max_retries: 1
213
+ transient_error_codes:
214
+ - 124
215
+ non_retryable_error_codes:
216
+ - 2
217
+ - 126
218
+ - 127
219
+ env_allowlist:
220
+ - PATH
221
+ - HOME
222
+ implementation:
223
+ workspace: nx
224
+ testing:
225
+ framework: vitest
226
+ coverage:
227
+ minimums:
228
+ line: 0.7
229
+ branch: 0.7
230
+ targets:
231
+ line: 1.0
232
+ branch: 1.0
233
+ merge_policy:
234
+ require_user_approval: true
235
+ allowed_strategies:
236
+ - merge_commit
237
+ - squash
238
+ - rebase
239
+ worktree:
240
+ base_branch: ${context.defaultBranch}
241
+ rbac:
242
+ orchestrator:
243
+ - feature.discover_specs
244
+ - feature.init
245
+ - feature.get_context
246
+ - feature.state_get
247
+ - feature.state_patch
248
+ - feature.log_append
249
+ - plan.submit
250
+ - plan.get
251
+ - plan.update
252
+ - repo.ensure_worktree
253
+ - repo.apply_patch
254
+ - repo.status
255
+ - repo.diff
256
+ - repo.read_file
257
+ - repo.search
258
+ - gates.list
259
+ - gates.run
260
+ - evidence.latest
261
+ - locks.acquire
262
+ - locks.release
263
+ - collisions.scan
264
+ - report.dashboard
265
+ - report.feature_summary
266
+ - feature.ready_to_merge
267
+ - feature.delete
268
+ planner:
269
+ - feature.get_context
270
+ - feature.state_get
271
+ - plan.submit
272
+ - plan.update
273
+ - collisions.scan
274
+ - repo.read_file
275
+ - repo.search
276
+ builder:
277
+ - feature.get_context
278
+ - feature.state_get
279
+ - repo.apply_patch
280
+ - repo.status
281
+ - repo.diff
282
+ - repo.read_file
283
+ - repo.search
284
+ - gates.run
285
+ qa:
286
+ - feature.get_context
287
+ - feature.state_get
288
+ - repo.apply_patch
289
+ - repo.diff
290
+ - repo.read_file
291
+ - repo.search
292
+ - gates.run
293
+ - evidence.latest
294
+ system:
295
+ - "*"
296
+ recovery:
297
+ orchestrator_session_reattach_timeout_ms: 5000
298
+ orphan_session_cleanup_enabled: true
299
+ supervisor:
300
+ max_iterations_per_phase: 6
301
+ max_parallel_gate_runs: ${wizard.maxParallelGateRuns}
302
+ cleanup:
303
+ auto_after_merge: false
304
+ grace_period_seconds: 3600
305
+ dashboard:
306
+ enabled: true
307
+ port: ${wizard.dashboardPort}
308
+ notifications:
309
+ enabled: ${notificationsEnabled}
310
+ channels:
311
+ desktop:
312
+ enabled: ${wizard.notifications.desktop}
313
+ slack:
314
+ enabled: ${wizard.notifications.slack}
315
+ webhook: "${escapeYamlString(wizard.notifications.slackWebhook)}"
316
+ channel: "#aop-alerts"
317
+ webhook:
318
+ enabled: ${wizard.notifications.webhook}
319
+ url: "${escapeYamlString(wizard.notifications.webhookUrl)}"
320
+ `;
321
+ }
322
+
323
+ function generateGatesYaml(framework: TestFramework): string {
324
+ const cmds = buildGateCommands(framework);
325
+ return `version: 1
326
+ profiles:
327
+ default:
328
+ modes:
329
+ fast:
330
+ - name: test
331
+ cmd: [${yamlList(cmds.test)}]
332
+ timeout_seconds: 600
333
+ full:
334
+ - name: test_with_coverage
335
+ cmd: [${yamlList(cmds.testWithCoverage)}]
336
+ timeout_seconds: 1200
337
+ merge:
338
+ - name: merge_safety
339
+ cmd: [${yamlList(cmds.testWithCoverage)}]
340
+ timeout_seconds: 1200
341
+ parsers:
342
+ coverage:
343
+ type: lcov
344
+ path: coverage/lcov.info
345
+ thresholds:
346
+ coverage_line_min: 0.7
347
+ coverage_branch_min: 0.7
348
+ coverage_line_target: 1.0
349
+ coverage_branch_target: 1.0
350
+ capabilities:
351
+ - none
352
+ - lcov
353
+ `;
354
+ }
355
+
356
+ function generateAgentsYaml(): string {
357
+ return `version: 1
358
+ roles:
359
+ planner:
360
+ system_prompt_path: agentic/orchestrator/prompts/planner.system.md
361
+ builder:
362
+ system_prompt_path: agentic/orchestrator/prompts/builder.system.md
363
+ qa:
364
+ system_prompt_path: agentic/orchestrator/prompts/qa.system.md
365
+ missing_prompt_behavior: ignore
366
+ runtime:
367
+ default_provider: custom
368
+ default_model: local-default
369
+ provider_config_env: AOP_PROVIDER_CONFIG_ENV
370
+ role_provider_overrides: {}
371
+ `;
372
+ }
373
+
374
+ function generateAdaptersYaml(): string {
375
+ return `notification-channel: desktop
376
+ activity-detector: claude-jsonl
377
+ scm-provider: github
378
+ `;
379
+ }
380
+
381
+ function parseInteger(raw: string, fallback: number, min: number, max: number): number {
382
+ const parsed = Number.parseInt(raw, 10);
383
+ if (Number.isNaN(parsed)) {
384
+ return fallback;
385
+ }
386
+ if (parsed < min || parsed > max) {
387
+ return fallback;
388
+ }
389
+ return parsed;
390
+ }
391
+
392
+ function parseFramework(raw: string, fallback: TestFramework): TestFramework {
393
+ const value = raw.trim().toLowerCase();
394
+ if (value === 'vitest' || value === 'jest' || value === 'pytest' || value === 'maven' || value === 'gradle') {
395
+ return value;
396
+ }
397
+ return fallback;
398
+ }
399
+
400
+ function parseNotificationChannels(raw: string): { desktop: boolean; slack: boolean; webhook: boolean } {
401
+ const normalized = raw.trim().toLowerCase();
402
+ if (!normalized || normalized === 'none') {
403
+ return { desktop: false, slack: false, webhook: false };
404
+ }
405
+ const channels = new Set(normalized.split(',').map((token) => token.trim()).filter((token) => token.length > 0));
406
+ return {
407
+ desktop: channels.has('desktop'),
408
+ slack: channels.has('slack'),
409
+ webhook: channels.has('webhook')
410
+ };
411
+ }
412
+
413
+ async function askWithDefault(prompt: PromptSession, label: string, defaultValue: string): Promise<string> {
414
+ const raw = (await prompt.question(`${label} [${defaultValue}]: `)).trim();
415
+ return raw.length > 0 ? raw : defaultValue;
416
+ }
417
+
418
+ async function collectWizardConfig(
419
+ defaults: { branch: string; framework: TestFramework },
420
+ promptFactory: () => PromptSession
421
+ ): Promise<WizardConfig> {
422
+ const prompt = promptFactory();
423
+ try {
424
+ const baseBranch = await askWithDefault(prompt, 'Worktree base branch', defaults.branch);
425
+ const maxParallelGateRunsRaw = await askWithDefault(prompt, 'Max parallel gate runs', '3');
426
+ const dashboardPortRaw = await askWithDefault(prompt, 'Dashboard port', '3000');
427
+ const channelsRaw = await askWithDefault(
428
+ prompt,
429
+ 'Notification channels (comma-separated: desktop,slack,webhook,none)',
430
+ 'none'
431
+ );
432
+ const frameworkRaw = await askWithDefault(
433
+ prompt,
434
+ 'Test framework (vitest|jest|pytest|maven|gradle)',
435
+ defaults.framework
436
+ );
437
+
438
+ const channels = parseNotificationChannels(channelsRaw);
439
+ let slackWebhook = '';
440
+ let webhookUrl = '';
441
+
442
+ if (channels.slack) {
443
+ slackWebhook = (await prompt.question('Slack webhook URL []: ')).trim();
444
+ }
445
+ if (channels.webhook) {
446
+ webhookUrl = (await prompt.question('Webhook URL []: ')).trim();
447
+ }
448
+
449
+ return {
450
+ baseBranch,
451
+ maxParallelGateRuns: parseInteger(maxParallelGateRunsRaw, 3, 1, 64),
452
+ dashboardPort: parseInteger(dashboardPortRaw, 3000, 1, 65535),
453
+ framework: parseFramework(frameworkRaw, defaults.framework),
454
+ notifications: {
455
+ desktop: channels.desktop,
456
+ slack: channels.slack,
457
+ webhook: channels.webhook,
458
+ slackWebhook,
459
+ webhookUrl
460
+ }
461
+ };
462
+ } finally {
463
+ prompt.close();
464
+ }
465
+ }
466
+
467
+ async function loadTemplateFiles(
468
+ subdir: 'prompts' | 'schemas',
469
+ matcher: (filename: string) => boolean
470
+ ): Promise<Array<{ rel: string; content: string }>> {
471
+ const sourceDir = path.join(TEMPLATE_ROOT, subdir);
472
+ const entries = await fs.readdir(sourceDir, { withFileTypes: true });
473
+ const templates: Array<{ rel: string; content: string }> = [];
474
+ for (const entry of entries) {
475
+ if (!entry.isFile() || !matcher(entry.name)) {
476
+ continue;
477
+ }
478
+ const full = path.join(sourceDir, entry.name);
479
+ templates.push({
480
+ rel: `agentic/orchestrator/${subdir}/${entry.name}`,
481
+ content: await fs.readFile(full, 'utf8')
482
+ });
483
+ }
484
+ return templates.sort((a, b) => a.rel.localeCompare(b.rel));
485
+ }
486
+
487
+ export class InitCommandHandler {
488
+ private readonly repoRoot: string;
489
+ private readonly promptFactory: () => PromptSession;
490
+
491
+ constructor(repoRoot: string, promptFactory: () => PromptSession = createPromptSession) {
492
+ this.repoRoot = repoRoot;
493
+ this.promptFactory = promptFactory;
494
+ }
495
+
496
+ async execute(options: InitOptions): Promise<InitCommandResult> {
497
+ const gitContext = await detectGitContext(this.repoRoot);
498
+ const framework = await detectTestFramework(this.repoRoot);
499
+ const wizard = options.auto
500
+ ? {
501
+ baseBranch: gitContext.defaultBranch,
502
+ maxParallelGateRuns: 3,
503
+ dashboardPort: 3000,
504
+ framework,
505
+ notifications: {
506
+ desktop: false,
507
+ slack: false,
508
+ webhook: false,
509
+ slackWebhook: '',
510
+ webhookUrl: ''
511
+ }
512
+ }
513
+ : await collectWizardConfig(
514
+ {
515
+ branch: gitContext.defaultBranch,
516
+ framework
517
+ },
518
+ this.promptFactory
519
+ );
520
+
521
+ const orchestratorDir = path.join(this.repoRoot, 'agentic', 'orchestrator');
522
+ await fs.mkdir(orchestratorDir, { recursive: true });
523
+
524
+ const configFiles: Array<{ rel: string; content: string }> = [
525
+ {
526
+ rel: 'agentic/orchestrator/policy.yaml',
527
+ content: generatePolicyYaml({ ...gitContext, defaultBranch: wizard.baseBranch }, wizard)
528
+ },
529
+ { rel: 'agentic/orchestrator/gates.yaml', content: generateGatesYaml(wizard.framework) },
530
+ { rel: 'agentic/orchestrator/agents.yaml', content: generateAgentsYaml() },
531
+ { rel: 'agentic/orchestrator/adapters.yaml', content: generateAdaptersYaml() }
532
+ ];
533
+ const templateFiles = [
534
+ ...(await loadTemplateFiles('prompts', (filename) => filename.endsWith('.md'))),
535
+ ...(await loadTemplateFiles('schemas', (filename) => filename.endsWith('.json')))
536
+ ];
537
+ const writableFiles = [...configFiles, ...templateFiles];
538
+
539
+ const created: string[] = [];
540
+ const updated: string[] = [];
541
+ const skipped: string[] = [];
542
+
543
+ for (const { rel, content } of writableFiles) {
544
+ const filePath = path.join(this.repoRoot, rel);
545
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
546
+ let exists = false;
547
+ try {
548
+ await fs.access(filePath);
549
+ exists = true;
550
+ } catch {
551
+ // file does not exist
552
+ }
553
+
554
+ if (exists && !options.force) {
555
+ skipped.push(rel);
556
+ continue;
557
+ }
558
+
559
+ await fs.writeFile(filePath, content, 'utf8');
560
+ if (exists) {
561
+ updated.push(rel);
562
+ } else {
563
+ created.push(rel);
564
+ }
565
+ }
566
+
567
+ const validationWarnings: string[] = [];
568
+ const schemaRegistry = new SchemaRegistry(this.repoRoot);
569
+ const validationTargets: Array<{ schema: string; rel: string }> = [
570
+ { schema: 'policy.schema.json', rel: 'agentic/orchestrator/policy.yaml' },
571
+ { schema: 'gates.schema.json', rel: 'agentic/orchestrator/gates.yaml' },
572
+ { schema: 'agents.schema.json', rel: 'agentic/orchestrator/agents.yaml' },
573
+ { schema: 'adapters.schema.json', rel: 'agentic/orchestrator/adapters.yaml' }
574
+ ];
575
+
576
+ for (const { schema, rel } of validationTargets) {
577
+ if (skipped.includes(rel)) {
578
+ continue;
579
+ }
580
+ try {
581
+ const raw = await fs.readFile(path.join(this.repoRoot, rel), 'utf8');
582
+ const parsed: unknown = YAML.parse(raw);
583
+ const result = await schemaRegistry.validate(schema, parsed);
584
+ if (!result.valid) {
585
+ const messages = result.errors.map((e) => e.message ?? String(e)).join('; ');
586
+ validationWarnings.push(`${rel}: ${messages}`);
587
+ }
588
+ } catch (err) {
589
+ validationWarnings.push(`Failed to validate ${rel}: ${String(err)}`);
590
+ }
591
+ }
592
+
593
+ return {
594
+ ok: true,
595
+ data: {
596
+ command: 'init',
597
+ created,
598
+ updated,
599
+ skipped,
600
+ validation_warnings: validationWarnings,
601
+ next_steps: [
602
+ 'Review generated files in agentic/orchestrator/{policy,gates,agents,adapters}.yaml',
603
+ 'Verify prompts under agentic/orchestrator/prompts/ and schemas under agentic/orchestrator/schemas/',
604
+ 'Run: aop run -fi <spec.md> to start orchestrating features'
605
+ ]
606
+ }
607
+ };
608
+ }
609
+ }
@@ -189,6 +189,7 @@ export class ResumeCommandHandler {
189
189
  sources: [...(sourcesByFeature.get(featureId) ?? new Set<string>())].sort((a, b) => a.localeCompare(b))
190
190
  });
191
191
  } catch (_error) {
192
+ // Silently skip features with parse errors
192
193
  }
193
194
  }
194
195