agentic-orchestrator 0.1.6 → 0.1.7

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 (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -6,72 +6,65 @@ import { ERROR_CODES } from '../src/core/error-codes.js';
6
6
  import { STATUS, TOOLS } from '../src/core/constants.js';
7
7
 
8
8
  const ensureLoadedMock = vi.hoisted(() => vi.fn(async () => undefined));
9
- const recoverFromStateMock = vi.hoisted(
10
- () =>
11
- vi.fn(async () => ({
12
- data: {
13
- recovered: true,
14
- stale_features: [] as string[],
15
- active: {}
16
- }
17
- }))
9
+ const recoverFromStateMock = vi.hoisted(() =>
10
+ vi.fn(async () => ({
11
+ data: {
12
+ recovered: true,
13
+ stale_features: [] as string[],
14
+ active: {},
15
+ },
16
+ })),
18
17
  );
19
18
  const createToolingRuntimeMock = vi.hoisted(() => vi.fn(async () => ({ runtime: 'ok' })));
20
19
  const resolveToolClientMock = vi.hoisted(() => vi.fn());
21
20
  const toolCallMock = vi.hoisted(() => vi.fn());
22
- const readIndexMock = vi.hoisted(
23
- () =>
24
- vi.fn(async () => ({
25
- version: 1,
26
- active: ['feature_resume'],
27
- blocked: [],
28
- blocked_queue: []
29
- }))
21
+ const readIndexMock = vi.hoisted(() =>
22
+ vi.fn(async () => ({
23
+ version: 1,
24
+ active: ['feature_resume'],
25
+ blocked: [],
26
+ blocked_queue: [],
27
+ })),
30
28
  );
31
- const getRuntimeSessionsMock = vi.hoisted(
32
- () =>
33
- vi.fn(async () => ({
34
- run_id: 'run:resume',
35
- owner_instance_id: 'owner:resume',
36
- feature_sessions: {}
37
- }))
29
+ const getRuntimeSessionsMock = vi.hoisted(() =>
30
+ vi.fn(async () => ({
31
+ run_id: 'run:resume',
32
+ owner_instance_id: 'owner:resume',
33
+ feature_sessions: {},
34
+ })),
38
35
  );
39
- const featureDiscoverSpecsMock = vi.hoisted(
40
- () =>
41
- vi.fn(async () => ({
42
- data: {
43
- specs: [{ feature_id: 'feature_resume', spec_path: '.aop/features/feature_resume/spec.md' }]
44
- }
45
- }))
36
+ const featureDiscoverSpecsMock = vi.hoisted(() =>
37
+ vi.fn(async () => ({
38
+ data: {
39
+ specs: [{ feature_id: 'feature_resume', spec_path: '.aop/features/feature_resume/spec.md' }],
40
+ },
41
+ })),
46
42
  );
47
- const featureStateGetMock = vi.hoisted(
48
- () =>
49
- vi.fn(async (_featureId?: string) => ({
50
- data: {
51
- front_matter: {
52
- status: 'planning'
53
- }
54
- }
55
- }))
43
+ const featureStateGetMock = vi.hoisted(() =>
44
+ vi.fn(async (_featureId?: string) => ({
45
+ data: {
46
+ front_matter: {
47
+ status: 'planning',
48
+ },
49
+ },
50
+ })),
56
51
  );
57
- const resolveProviderSelectionMock = vi.hoisted(
58
- () =>
59
- vi.fn(() => ({
60
- provider: 'custom',
61
- model: 'model',
62
- provider_config_env: null,
63
- provider_config_ref: null
64
- }))
52
+ const resolveProviderSelectionMock = vi.hoisted(() =>
53
+ vi.fn(() => ({
54
+ provider: 'custom',
55
+ model: 'model',
56
+ provider_config_env: null,
57
+ provider_config_ref: null,
58
+ })),
65
59
  );
66
60
  const supervisorConstructorOptionsMock = vi.hoisted(() => vi.fn());
67
- const supervisorStartMock = vi.hoisted(
68
- () =>
69
- vi.fn(async (..._args: unknown[]) => ({
70
- queue_depth: 0,
71
- status: 'running',
72
- run_metadata: { started_at: 'now' } as Record<string, unknown>,
73
- dashboard: { features: [] }
74
- }))
61
+ const supervisorStartMock = vi.hoisted(() =>
62
+ vi.fn(async (..._args: unknown[]) => ({
63
+ queue_depth: 0,
64
+ status: 'running',
65
+ run_metadata: { started_at: 'now' } as Record<string, unknown>,
66
+ dashboard: { features: [] },
67
+ })),
75
68
  );
76
69
 
77
70
  vi.mock('../src/core/kernel.js', () => {
@@ -126,7 +119,7 @@ vi.mock('../src/core/kernel.js', () => {
126
119
 
127
120
  vi.mock('../src/mcp/runtime-factory.js', () => ({
128
121
  createToolingRuntime: createToolingRuntimeMock,
129
- resolveToolClient: resolveToolClientMock
122
+ resolveToolClient: resolveToolClientMock,
130
123
  }));
131
124
 
132
125
  vi.mock('../src/providers/providers.js', () => ({
@@ -137,19 +130,14 @@ vi.mock('../src/providers/providers.js', () => ({
137
130
  constructor(selection: unknown) {
138
131
  this.selection = selection;
139
132
  }
140
- }
133
+ },
141
134
  }));
142
135
 
143
136
  vi.mock('../src/supervisor/runtime.js', () => {
144
137
  class SupervisorRuntime {
145
138
  private readonly options: unknown;
146
139
 
147
- constructor(
148
- _kernel: unknown,
149
- _provider: unknown,
150
- _toolClient: unknown,
151
- options: unknown
152
- ) {
140
+ constructor(_kernel: unknown, _provider: unknown, _toolClient: unknown, options: unknown) {
153
141
  this.options = options;
154
142
  supervisorConstructorOptionsMock(options);
155
143
  }
@@ -188,35 +176,37 @@ describe('aop CLI unit', () => {
188
176
  data: {
189
177
  recovered: true,
190
178
  stale_features: [],
191
- active: {}
192
- }
179
+ active: {},
180
+ },
193
181
  });
194
182
  readIndexMock.mockReset();
195
183
  readIndexMock.mockResolvedValue({
196
184
  version: 1,
197
185
  active: ['feature_resume'],
198
186
  blocked: [],
199
- blocked_queue: []
187
+ blocked_queue: [],
200
188
  });
201
189
  getRuntimeSessionsMock.mockReset();
202
190
  getRuntimeSessionsMock.mockResolvedValue({
203
191
  run_id: 'run:resume',
204
192
  owner_instance_id: 'owner:resume',
205
- feature_sessions: {}
193
+ feature_sessions: {},
206
194
  });
207
195
  featureDiscoverSpecsMock.mockReset();
208
196
  featureDiscoverSpecsMock.mockResolvedValue({
209
197
  data: {
210
- specs: [{ feature_id: 'feature_resume', spec_path: '.aop/features/feature_resume/spec.md' }]
211
- }
198
+ specs: [
199
+ { feature_id: 'feature_resume', spec_path: '.aop/features/feature_resume/spec.md' },
200
+ ],
201
+ },
212
202
  });
213
203
  featureStateGetMock.mockReset();
214
204
  featureStateGetMock.mockResolvedValue({
215
205
  data: {
216
206
  front_matter: {
217
- status: 'planning'
218
- }
219
- }
207
+ status: 'planning',
208
+ },
209
+ },
220
210
  });
221
211
  createToolingRuntimeMock.mockReset();
222
212
  createToolingRuntimeMock.mockResolvedValue({ runtime: 'ok' });
@@ -225,7 +215,7 @@ describe('aop CLI unit', () => {
225
215
  provider: 'custom',
226
216
  model: 'model',
227
217
  provider_config_env: null,
228
- provider_config_ref: null
218
+ provider_config_ref: null,
229
219
  });
230
220
  supervisorConstructorOptionsMock.mockReset();
231
221
  supervisorStartMock.mockReset();
@@ -233,7 +223,7 @@ describe('aop CLI unit', () => {
233
223
  queue_depth: 0,
234
224
  status: 'running',
235
225
  run_metadata: { started_at: 'now' },
236
- dashboard: { features: [] }
226
+ dashboard: { features: [] },
237
227
  });
238
228
  stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
239
229
  });
@@ -252,8 +242,8 @@ describe('aop CLI unit', () => {
252
242
  expect(writes[0]).toMatchObject({
253
243
  ok: false,
254
244
  error: {
255
- code: ERROR_CODES.INVALID_CLI_ARGS
256
- }
245
+ code: ERROR_CODES.INVALID_CLI_ARGS,
246
+ },
257
247
  });
258
248
  });
259
249
 
@@ -265,8 +255,8 @@ describe('aop CLI unit', () => {
265
255
  expect(writes[0]).toMatchObject({
266
256
  ok: false,
267
257
  error: {
268
- code: ERROR_CODES.INVALID_CLI_ARGS
269
- }
258
+ code: ERROR_CODES.INVALID_CLI_ARGS,
259
+ },
270
260
  });
271
261
  });
272
262
 
@@ -280,18 +270,20 @@ describe('aop CLI unit', () => {
280
270
  expect(toolCallMock).toHaveBeenCalledWith(
281
271
  TOOLS.REPORT_DASHBOARD,
282
272
  expect.any(Object),
283
- expect.objectContaining({ actor_type: 'system' })
273
+ expect.objectContaining({ actor_type: 'system' }),
284
274
  );
285
275
  expect(writes[0]).toMatchObject({ ok: true, data: { healthy: true } });
286
276
  });
287
277
 
288
278
  it('GIVEN_resume_command_WHEN_main_runs_THEN_resumes_non_terminal_features_from_persisted_state', async () => {
289
- recoverFromStateMock.mockResolvedValue({ data: { recovered: true, stale_features: ['f1'], active: {} } });
279
+ recoverFromStateMock.mockResolvedValue({
280
+ data: { recovered: true, stale_features: ['f1'], active: {} },
281
+ });
290
282
  supervisorStartMock.mockResolvedValue({
291
283
  queue_depth: 0,
292
284
  status: 'running',
293
285
  run_metadata: { resumed: true },
294
- dashboard: { features: ['feature_resume'] }
286
+ dashboard: { features: ['feature_resume'] },
295
287
  });
296
288
  const code = await main(['resume'], { cwd, env: {} as NodeJS.ProcessEnv });
297
289
  const writes = asJsonWrites(stdoutSpy);
@@ -300,7 +292,10 @@ describe('aop CLI unit', () => {
300
292
  expect(recoverFromStateMock).toHaveBeenCalledTimes(1);
301
293
  expect(featureDiscoverSpecsMock).toHaveBeenCalledTimes(1);
302
294
  expect(featureStateGetMock).toHaveBeenCalledWith('feature_resume');
303
- expect(supervisorStartMock).toHaveBeenCalledWith([{ feature_id: 'feature_resume' }], expect.any(Object));
295
+ expect(supervisorStartMock).toHaveBeenCalledWith(
296
+ [{ feature_id: 'feature_resume' }],
297
+ expect.any(Object),
298
+ );
304
299
  expect(writes[0]).toMatchObject({
305
300
  ok: true,
306
301
  data: {
@@ -309,11 +304,11 @@ describe('aop CLI unit', () => {
309
304
  resumed_features: [
310
305
  expect.objectContaining({
311
306
  feature_id: 'feature_resume',
312
- resume_phase: 'planning'
313
- })
307
+ resume_phase: 'planning',
308
+ }),
314
309
  ],
315
- recovery: { stale_features: ['f1'] }
316
- }
310
+ recovery: { stale_features: ['f1'] },
311
+ },
317
312
  });
318
313
  });
319
314
 
@@ -324,7 +319,7 @@ describe('aop CLI unit', () => {
324
319
  expect(code).toBe(0);
325
320
  expect(writes[0]).toMatchObject({
326
321
  ok: true,
327
- data: { status: 'stop_not_implemented_yet' }
322
+ data: { status: 'stop_not_implemented_yet' },
328
323
  });
329
324
  });
330
325
 
@@ -336,8 +331,8 @@ describe('aop CLI unit', () => {
336
331
  expect(writes[0]).toMatchObject({
337
332
  ok: false,
338
333
  error: {
339
- code: ERROR_CODES.INVALID_CLI_ARGS
340
- }
334
+ code: ERROR_CODES.INVALID_CLI_ARGS,
335
+ },
341
336
  });
342
337
  expect(toolCallMock).not.toHaveBeenCalled();
343
338
  });
@@ -349,11 +344,14 @@ describe('aop CLI unit', () => {
349
344
  feature_id: 'feature_delete',
350
345
  dry_run: true,
351
346
  plan: { feature_dir_exists: true },
352
- summary: { feature_dir_removed: false }
353
- }
347
+ summary: { feature_dir_removed: false },
348
+ },
354
349
  });
355
350
 
356
- const code = await main(['delete', '--feature-id', 'feature_delete'], { cwd, env: {} as NodeJS.ProcessEnv });
351
+ const code = await main(['delete', '--feature-id', 'feature_delete'], {
352
+ cwd,
353
+ env: {} as NodeJS.ProcessEnv,
354
+ });
357
355
  const writes = asJsonWrites(stdoutSpy);
358
356
 
359
357
  expect(code).toBe(0);
@@ -364,17 +362,17 @@ describe('aop CLI unit', () => {
364
362
  dry_run: true,
365
363
  confirm: false,
366
364
  remove_worktree: true,
367
- remove_branch: 'none'
365
+ remove_branch: 'none',
368
366
  }),
369
- expect.objectContaining({ actor_type: 'system' })
367
+ expect.objectContaining({ actor_type: 'system' }),
370
368
  );
371
369
  expect(writes[0]).toMatchObject({
372
370
  ok: true,
373
371
  data: {
374
372
  command: 'delete',
375
373
  feature_id: 'feature_delete',
376
- dry_run: true
377
- }
374
+ dry_run: true,
375
+ },
378
376
  });
379
377
  });
380
378
 
@@ -386,8 +384,8 @@ describe('aop CLI unit', () => {
386
384
  dry_run: false,
387
385
  plan: { feature_dir_exists: true },
388
386
  applied: { feature_dir_removed: true },
389
- summary: { feature_dir_removed: true }
390
- }
387
+ summary: { feature_dir_removed: true },
388
+ },
391
389
  });
392
390
 
393
391
  const code = await main(
@@ -399,9 +397,9 @@ describe('aop CLI unit', () => {
399
397
  '--remove-worktree',
400
398
  'false',
401
399
  '--remove-branch',
402
- 'force'
400
+ 'force',
403
401
  ],
404
- { cwd, env: {} as NodeJS.ProcessEnv }
402
+ { cwd, env: {} as NodeJS.ProcessEnv },
405
403
  );
406
404
 
407
405
  expect(code).toBe(0);
@@ -412,16 +410,16 @@ describe('aop CLI unit', () => {
412
410
  dry_run: false,
413
411
  confirm: true,
414
412
  remove_worktree: false,
415
- remove_branch: 'force'
413
+ remove_branch: 'force',
416
414
  }),
417
- expect.objectContaining({ actor_type: 'system' })
415
+ expect.objectContaining({ actor_type: 'system' }),
418
416
  );
419
417
  });
420
418
 
421
419
  it('GIVEN_delete_with_invalid_remove_branch_WHEN_main_runs_THEN_returns_invalid_cli_args', async () => {
422
420
  const code = await main(
423
421
  ['delete', '--feature-id', 'feature_delete', '--remove-branch', 'hard'],
424
- { cwd, env: {} as NodeJS.ProcessEnv }
422
+ { cwd, env: {} as NodeJS.ProcessEnv },
425
423
  );
426
424
  const writes = asJsonWrites(stdoutSpy);
427
425
 
@@ -429,8 +427,8 @@ describe('aop CLI unit', () => {
429
427
  expect(writes[0]).toMatchObject({
430
428
  ok: false,
431
429
  error: {
432
- code: ERROR_CODES.INVALID_CLI_ARGS
433
- }
430
+ code: ERROR_CODES.INVALID_CLI_ARGS,
431
+ },
434
432
  });
435
433
  expect(toolCallMock).not.toHaveBeenCalled();
436
434
  });
@@ -443,8 +441,8 @@ describe('aop CLI unit', () => {
443
441
  expect(writes[0]).toMatchObject({
444
442
  ok: false,
445
443
  error: {
446
- code: ERROR_CODES.INPUT_PATH_NOT_FOUND
447
- }
444
+ code: ERROR_CODES.INPUT_PATH_NOT_FOUND,
445
+ },
448
446
  });
449
447
  });
450
448
 
@@ -457,8 +455,8 @@ describe('aop CLI unit', () => {
457
455
  expect(writes[0]).toMatchObject({
458
456
  ok: false,
459
457
  error: {
460
- code: ERROR_CODES.NO_SPECS_FOUND
461
- }
458
+ code: ERROR_CODES.NO_SPECS_FOUND,
459
+ },
462
460
  });
463
461
  });
464
462
 
@@ -476,8 +474,8 @@ describe('aop CLI unit', () => {
476
474
  expect(writes[0]).toMatchObject({
477
475
  ok: false,
478
476
  error: {
479
- code: ERROR_CODES.FEATURE_SLUG_COLLISION
480
- }
477
+ code: ERROR_CODES.FEATURE_SLUG_COLLISION,
478
+ },
481
479
  });
482
480
  });
483
481
 
@@ -495,32 +493,36 @@ describe('aop CLI unit', () => {
495
493
 
496
494
  const code = await main(
497
495
  ['run', '-fi', path.join('incoming', 'feature_one.md'), '--agent-provider', 'custom'],
498
- { cwd, env: {} as NodeJS.ProcessEnv }
496
+ { cwd, env: {} as NodeJS.ProcessEnv },
499
497
  );
500
498
  const writes = asJsonWrites(stdoutSpy);
501
499
 
502
500
  expect(code).toBe(0);
503
501
  expect(supervisorStartMock).toHaveBeenCalledWith(
504
502
  [expect.objectContaining({ feature_id: 'feature_one' })],
505
- expect.any(Object)
503
+ expect.any(Object),
506
504
  );
507
505
  expect(resolveProviderSelectionMock).toHaveBeenCalledTimes(1);
508
506
  expect(writes.at(-1)).toMatchObject({
509
507
  ok: true,
510
508
  data: {
511
509
  command: 'run',
512
- runtime_status: 'running'
513
- }
510
+ runtime_status: 'running',
511
+ },
514
512
  });
515
513
  await expect(
516
- fs.stat(path.join(cwd, '.aop', 'features', 'feature_one', 'spec.md'))
514
+ fs.stat(path.join(cwd, '.aop', 'features', 'feature_one', 'spec.md')),
517
515
  ).resolves.toBeTruthy();
518
516
  });
519
517
 
520
518
  it('GIVEN_takeover_flag_WHEN_run_command_THEN_forwards_takeover_option_to_supervisor', async () => {
521
519
  const incoming = path.join(cwd, 'incoming');
522
520
  await fs.mkdir(incoming, { recursive: true });
523
- await fs.writeFile(path.join(incoming, 'feature_takeover.md'), '# Spec\n\nRecover stale run.\n', 'utf8');
521
+ await fs.writeFile(
522
+ path.join(incoming, 'feature_takeover.md'),
523
+ '# Spec\n\nRecover stale run.\n',
524
+ 'utf8',
525
+ );
524
526
 
525
527
  toolCallMock.mockImplementation(async (toolName: string) => {
526
528
  if (toolName === TOOLS.FEATURE_STATE_GET) {
@@ -530,22 +532,33 @@ describe('aop CLI unit', () => {
530
532
  });
531
533
 
532
534
  const code = await main(
533
- ['run', '-fi', path.join('incoming', 'feature_takeover.md'), '--agent-provider', 'custom', '--takeover-stale-run'],
534
- { cwd, env: {} as NodeJS.ProcessEnv }
535
+ [
536
+ 'run',
537
+ '-fi',
538
+ path.join('incoming', 'feature_takeover.md'),
539
+ '--agent-provider',
540
+ 'custom',
541
+ '--takeover-stale-run',
542
+ ],
543
+ { cwd, env: {} as NodeJS.ProcessEnv },
535
544
  );
536
545
 
537
546
  expect(code).toBe(0);
538
547
  expect(supervisorConstructorOptionsMock).toHaveBeenCalledWith(
539
548
  expect.objectContaining({
540
- takeover_stale_run: true
541
- })
549
+ takeover_stale_run: true,
550
+ }),
542
551
  );
543
552
  });
544
553
 
545
554
  it('GIVEN_stale_takeover_contract_WHEN_run_without_and_with_flag_THEN_returns_run_already_active_then_succeeds', async () => {
546
555
  const incoming = path.join(cwd, 'incoming');
547
556
  await fs.mkdir(incoming, { recursive: true });
548
- await fs.writeFile(path.join(incoming, 'feature_stale.md'), '# Spec\n\nHandle takeover.\n', 'utf8');
557
+ await fs.writeFile(
558
+ path.join(incoming, 'feature_stale.md'),
559
+ '# Spec\n\nHandle takeover.\n',
560
+ 'utf8',
561
+ );
549
562
 
550
563
  toolCallMock.mockImplementation(async (toolName: string) => {
551
564
  if (toolName === TOOLS.FEATURE_STATE_GET) {
@@ -554,38 +567,47 @@ describe('aop CLI unit', () => {
554
567
  return { ok: true, data: {} };
555
568
  });
556
569
 
557
- supervisorStartMock.mockImplementation(async (_features: Array<{ feature_id: string }>, options?: any) => {
558
- if (!options?.takeover_stale_run) {
559
- const error = new Error('run_already_active');
560
- (error as any).code = ERROR_CODES.RUN_ALREADY_ACTIVE;
561
- throw error;
562
- }
563
- return {
564
- queue_depth: 0,
565
- status: 'running',
566
- run_metadata: { started_at: 'now', took_over_stale: true },
567
- dashboard: { features: [] }
568
- };
569
- });
570
+ supervisorStartMock.mockImplementation(
571
+ async (_features: Array<{ feature_id: string }>, options?: any) => {
572
+ if (!options?.takeover_stale_run) {
573
+ const error = new Error('run_already_active');
574
+ (error as any).code = ERROR_CODES.RUN_ALREADY_ACTIVE;
575
+ throw error;
576
+ }
577
+ return {
578
+ queue_depth: 0,
579
+ status: 'running',
580
+ run_metadata: { started_at: 'now', took_over_stale: true },
581
+ dashboard: { features: [] },
582
+ };
583
+ },
584
+ );
570
585
 
571
586
  const noTakeoverCode = await main(
572
587
  ['run', '-fi', path.join('incoming', 'feature_stale.md'), '--agent-provider', 'custom'],
573
- { cwd, env: {} as NodeJS.ProcessEnv }
588
+ { cwd, env: {} as NodeJS.ProcessEnv },
574
589
  );
575
590
  const noTakeoverWrites = asJsonWrites(stdoutSpy);
576
591
  expect(noTakeoverCode).toBe(1);
577
592
  expect(noTakeoverWrites.at(-1)).toMatchObject({
578
593
  ok: false,
579
594
  error: {
580
- code: ERROR_CODES.RUN_ALREADY_ACTIVE
581
- }
595
+ code: ERROR_CODES.RUN_ALREADY_ACTIVE,
596
+ },
582
597
  });
583
598
 
584
599
  stdoutSpy.mockClear();
585
600
 
586
601
  const withTakeoverCode = await main(
587
- ['run', '-fi', path.join('incoming', 'feature_stale.md'), '--agent-provider', 'custom', '--takeover-stale-run'],
588
- { cwd, env: {} as NodeJS.ProcessEnv }
602
+ [
603
+ 'run',
604
+ '-fi',
605
+ path.join('incoming', 'feature_stale.md'),
606
+ '--agent-provider',
607
+ 'custom',
608
+ '--takeover-stale-run',
609
+ ],
610
+ { cwd, env: {} as NodeJS.ProcessEnv },
589
611
  );
590
612
  const withTakeoverWrites = asJsonWrites(stdoutSpy);
591
613
  expect(withTakeoverCode).toBe(0);
@@ -593,8 +615,8 @@ describe('aop CLI unit', () => {
593
615
  ok: true,
594
616
  data: {
595
617
  command: 'run',
596
- runtime_status: 'running'
597
- }
618
+ runtime_status: 'running',
619
+ },
598
620
  });
599
621
  });
600
622
 
@@ -613,15 +635,18 @@ describe('aop CLI unit', () => {
613
635
  expect(writes[0]).toMatchObject({
614
636
  ok: false,
615
637
  error: {
616
- code: ERROR_CODES.NO_SPECS_FOUND
617
- }
638
+ code: ERROR_CODES.NO_SPECS_FOUND,
639
+ },
618
640
  });
619
641
  });
620
642
 
621
643
  it('GIVEN_inprocess_transport_flag_WHEN_status_runs_THEN_uses_inprocess_transport_override', async () => {
622
644
  toolCallMock.mockResolvedValue({ ok: true, data: { healthy: true } });
623
645
 
624
- const code = await main(['status', '--transport', 'inprocess'], { cwd, env: {} as NodeJS.ProcessEnv });
646
+ const code = await main(['status', '--transport', 'inprocess'], {
647
+ cwd,
648
+ env: {} as NodeJS.ProcessEnv,
649
+ });
625
650
  const writes = asJsonWrites(stdoutSpy);
626
651
 
627
652
  expect(code).toBe(0);
@@ -635,8 +660,8 @@ describe('aop CLI unit', () => {
635
660
  error: {
636
661
  code: ERROR_CODES.INTERNAL_ERROR,
637
662
  message: 'tool failure',
638
- details: { reason: 'simulated' }
639
- }
663
+ details: { reason: 'simulated' },
664
+ },
640
665
  });
641
666
 
642
667
  const code = await main(['run'], { cwd, env: {} as NodeJS.ProcessEnv });
@@ -647,8 +672,8 @@ describe('aop CLI unit', () => {
647
672
  ok: false,
648
673
  error: {
649
674
  code: ERROR_CODES.INTERNAL_ERROR,
650
- message: 'tool failure'
651
- }
675
+ message: 'tool failure',
676
+ },
652
677
  });
653
678
  });
654
679
 
@@ -659,7 +684,10 @@ describe('aop CLI unit', () => {
659
684
  expect(code).toBe(0);
660
685
  expect(writes[0]).toMatchObject({
661
686
  ok: true,
662
- data: { resumed: true, resumed_features: [expect.objectContaining({ resume_phase: STATUS.BUILDING })] }
687
+ data: {
688
+ resumed: true,
689
+ resumed_features: [expect.objectContaining({ resume_phase: STATUS.BUILDING })],
690
+ },
663
691
  });
664
692
  });
665
693
 
@@ -670,18 +698,22 @@ describe('aop CLI unit', () => {
670
698
  expect(code).toBe(0);
671
699
  expect(writes[0]).toMatchObject({
672
700
  ok: true,
673
- data: { resumed_features: [expect.objectContaining({ resume_phase: STATUS.QA })] }
701
+ data: { resumed_features: [expect.objectContaining({ resume_phase: STATUS.QA })] },
674
702
  });
675
703
  });
676
704
 
677
705
  it('GIVEN_resume_with_READY_TO_MERGE_status_WHEN_main_runs_THEN_resumes_in_ready_to_merge_phase', async () => {
678
- featureStateGetMock.mockResolvedValue({ data: { front_matter: { status: STATUS.READY_TO_MERGE } } });
706
+ featureStateGetMock.mockResolvedValue({
707
+ data: { front_matter: { status: STATUS.READY_TO_MERGE } },
708
+ });
679
709
  const code = await main(['resume'], { cwd, env: {} as NodeJS.ProcessEnv });
680
710
  const writes = asJsonWrites(stdoutSpy);
681
711
  expect(code).toBe(0);
682
712
  expect(writes[0]).toMatchObject({
683
713
  ok: true,
684
- data: { resumed_features: [expect.objectContaining({ resume_phase: STATUS.READY_TO_MERGE })] }
714
+ data: {
715
+ resumed_features: [expect.objectContaining({ resume_phase: STATUS.READY_TO_MERGE })],
716
+ },
685
717
  });
686
718
  });
687
719
 
@@ -713,7 +745,7 @@ describe('aop CLI unit', () => {
713
745
  getRuntimeSessionsMock.mockResolvedValue({
714
746
  run_id: 'run:from-sessions',
715
747
  owner_instance_id: 'owner:from-sessions',
716
- feature_sessions: { feature_resume: { planner: 'p1', builder: 'b1', qa: 'q1' } }
748
+ feature_sessions: { feature_resume: { planner: 'p1', builder: 'b1', qa: 'q1' } },
717
749
  });
718
750
  featureDiscoverSpecsMock.mockResolvedValue({ data: { specs: [] } });
719
751
  readIndexMock.mockResolvedValue({ version: 1, active: [], blocked: [], blocked_queue: [] });
@@ -724,7 +756,10 @@ describe('aop CLI unit', () => {
724
756
  expect(code).toBe(0);
725
757
  expect(writes[0]).toMatchObject({
726
758
  ok: true,
727
- data: { resumed: true, resumed_features: [expect.objectContaining({ feature_id: 'feature_resume' })] }
759
+ data: {
760
+ resumed: true,
761
+ resumed_features: [expect.objectContaining({ feature_id: 'feature_resume' })],
762
+ },
728
763
  });
729
764
  });
730
765
 
@@ -733,12 +768,12 @@ describe('aop CLI unit', () => {
733
768
  version: 1,
734
769
  active: [],
735
770
  blocked: [],
736
- blocked_queue: [{ feature_id: 'feature_queued' }]
771
+ blocked_queue: [{ feature_id: 'feature_queued' }],
737
772
  });
738
773
  getRuntimeSessionsMock.mockResolvedValue({
739
774
  run_id: 'none',
740
775
  owner_instance_id: 'none',
741
- feature_sessions: {}
776
+ feature_sessions: {},
742
777
  });
743
778
  featureDiscoverSpecsMock.mockResolvedValue({ data: { specs: [] } });
744
779
  featureStateGetMock.mockResolvedValue({ data: { front_matter: { status: STATUS.PLANNING } } });
@@ -754,9 +789,13 @@ describe('aop CLI unit', () => {
754
789
  version: 1,
755
790
  active: [],
756
791
  blocked: ['feature_blocked'],
757
- blocked_queue: []
792
+ blocked_queue: [],
793
+ });
794
+ getRuntimeSessionsMock.mockResolvedValue({
795
+ run_id: 'none',
796
+ owner_instance_id: 'none',
797
+ feature_sessions: {},
758
798
  });
759
- getRuntimeSessionsMock.mockResolvedValue({ run_id: 'none', owner_instance_id: 'none', feature_sessions: {} });
760
799
  featureDiscoverSpecsMock.mockResolvedValue({ data: { specs: [] } });
761
800
  featureStateGetMock.mockResolvedValue({ data: { front_matter: { status: STATUS.PLANNING } } });
762
801
 
@@ -769,9 +808,13 @@ describe('aop CLI unit', () => {
769
808
  version: 1,
770
809
  active: ['feature_a', 'feature_b'],
771
810
  blocked: [],
772
- blocked_queue: []
811
+ blocked_queue: [],
812
+ });
813
+ getRuntimeSessionsMock.mockResolvedValue({
814
+ run_id: 'none',
815
+ owner_instance_id: 'none',
816
+ feature_sessions: {},
773
817
  });
774
- getRuntimeSessionsMock.mockResolvedValue({ run_id: 'none', owner_instance_id: 'none', feature_sessions: {} });
775
818
  featureDiscoverSpecsMock.mockResolvedValue({ data: { specs: [] } });
776
819
  featureStateGetMock.mockImplementation(async (featureId?: string) => {
777
820
  if (featureId === 'feature_a') {
@@ -796,7 +839,10 @@ describe('aop CLI unit', () => {
796
839
 
797
840
  toolCallMock.mockResolvedValue({ ok: true, data: {} });
798
841
 
799
- const code = await main(['run', '-fl', 'batch_folder', '--batch'], { cwd, env: {} as NodeJS.ProcessEnv });
842
+ const code = await main(['run', '-fl', 'batch_folder', '--batch'], {
843
+ cwd,
844
+ env: {} as NodeJS.ProcessEnv,
845
+ });
800
846
  const writes = asJsonWrites(stdoutSpy);
801
847
  expect(code).toBe(0);
802
848
  expect(writes[0]).toMatchObject({ ok: true, data: { command: 'batch-run', created: 1 } });
@@ -810,14 +856,24 @@ describe('aop CLI unit', () => {
810
856
  // Write an index that marks this feature as already active
811
857
  const indexDir = path.join(cwd, '.aop', 'features');
812
858
  await fs.mkdir(indexDir, { recursive: true });
813
- await fs.writeFile(path.join(indexDir, 'index.json'), JSON.stringify({ active: ['existing_feature'] }), 'utf8');
859
+ await fs.writeFile(
860
+ path.join(indexDir, 'index.json'),
861
+ JSON.stringify({ active: ['existing_feature'] }),
862
+ 'utf8',
863
+ );
814
864
 
815
865
  toolCallMock.mockResolvedValue({ ok: true, data: {} });
816
866
 
817
- const code = await main(['run', '-fl', 'batch_folder2', '--batch'], { cwd, env: {} as NodeJS.ProcessEnv });
867
+ const code = await main(['run', '-fl', 'batch_folder2', '--batch'], {
868
+ cwd,
869
+ env: {} as NodeJS.ProcessEnv,
870
+ });
818
871
  const writes = asJsonWrites(stdoutSpy);
819
872
  expect(code).toBe(0);
820
- expect(writes[0]).toMatchObject({ ok: true, data: { command: 'batch-run', skipped: 1, created: 0 } });
873
+ expect(writes[0]).toMatchObject({
874
+ ok: true,
875
+ data: { command: 'batch-run', skipped: 1, created: 0 },
876
+ });
821
877
  });
822
878
 
823
879
  it('GIVEN_batch_mode_with_init_failure_WHEN_run_command_THEN_counts_as_failed', async () => {
@@ -827,7 +883,10 @@ describe('aop CLI unit', () => {
827
883
 
828
884
  toolCallMock.mockRejectedValue(new Error('init failure'));
829
885
 
830
- const code = await main(['run', '-fl', 'batch_folder3', '--batch'], { cwd, env: {} as NodeJS.ProcessEnv });
886
+ const code = await main(['run', '-fl', 'batch_folder3', '--batch'], {
887
+ cwd,
888
+ env: {} as NodeJS.ProcessEnv,
889
+ });
831
890
  const writes = asJsonWrites(stdoutSpy);
832
891
  expect(code).toBe(0);
833
892
  expect(writes[0]).toMatchObject({ ok: true, data: { command: 'batch-run', failed: 1 } });