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
@@ -4,7 +4,11 @@ import { ERROR_CODES } from '../src/core/error-codes.js';
4
4
  import { TOOLS } from '../src/core/constants.js';
5
5
  import { CliArgumentParser } from '../src/cli/cli-argument-parser.js';
6
6
  import { assertOkResponse, callCliTool } from '../src/cli/tooling.js';
7
- import { canonicalFeatureIdFromPath, isCanonicalSpecPath, isLegacyCanonicalSpecPath } from '../src/cli/spec-utils.js';
7
+ import {
8
+ canonicalFeatureIdFromPath,
9
+ isCanonicalSpecPath,
10
+ isLegacyCanonicalSpecPath,
11
+ } from '../src/cli/spec-utils.js';
8
12
  import { RetryCommandHandler } from '../src/cli/retry-command-handler.js';
9
13
  import { StatusCommandHandler } from '../src/cli/status-command-handler.js';
10
14
  import { SendCommandHandler } from '../src/cli/send-command-handler.js';
@@ -29,7 +33,7 @@ describe('cli helper modules', () => {
29
33
  '--batch',
30
34
  '--takeover-stale-run',
31
35
  '--message',
32
- 'hello world'
36
+ 'hello world',
33
37
  ]);
34
38
  expect(miscParsed).toMatchObject({
35
39
  command: 'status',
@@ -43,7 +47,7 @@ describe('cli helper modules', () => {
43
47
  auto: true,
44
48
  batch: true,
45
49
  takeover_stale_run: true,
46
- message: 'hello world'
50
+ message: 'hello world',
47
51
  });
48
52
  // --port with non-numeric next token (no value consumed)
49
53
  const portNoNum = parser.parse(['run', '--port', '--foreground']);
@@ -51,7 +55,7 @@ describe('cli helper modules', () => {
51
55
  expect(portNoNum.foreground).toBe(true);
52
56
  expect(parser.parse(['-fi', '.aop/features/feature_x/spec.md'])).toMatchObject({
53
57
  command: 'run',
54
- file_input: '.aop/features/feature_x/spec.md'
58
+ file_input: '.aop/features/feature_x/spec.md',
55
59
  });
56
60
 
57
61
  const parsed = parser.parse([
@@ -63,7 +67,7 @@ describe('cli helper modules', () => {
63
67
  '--provider-config-env',
64
68
  'AOP_PROVIDER_CFG',
65
69
  '--transport',
66
- 'mcp'
70
+ 'mcp',
67
71
  ]);
68
72
 
69
73
  expect(parsed).toMatchObject({
@@ -71,7 +75,7 @@ describe('cli helper modules', () => {
71
75
  agent_model: 'gpt-5',
72
76
  agent_config: '{"command":"kiro-cli","args":["chat","--agent","dev"]}',
73
77
  provider_config_env: 'AOP_PROVIDER_CFG',
74
- transport: 'mcp'
78
+ transport: 'mcp',
75
79
  });
76
80
  const deleteParsed = parser.parse([
77
81
  'delete',
@@ -83,7 +87,7 @@ describe('cli helper modules', () => {
83
87
  '--remove-worktree',
84
88
  'false',
85
89
  '--remove-branch',
86
- 'force'
90
+ 'force',
87
91
  ]);
88
92
  expect(deleteParsed).toMatchObject({
89
93
  command: 'delete',
@@ -91,18 +95,22 @@ describe('cli helper modules', () => {
91
95
  yes: true,
92
96
  dry_run: false,
93
97
  remove_worktree: false,
94
- remove_branch: 'force'
98
+ remove_branch: 'force',
95
99
  });
96
- const positionalSend = parser.parse(['send', 'feature_positional', 'please rerun qa with latest fixes']);
100
+ const positionalSend = parser.parse([
101
+ 'send',
102
+ 'feature_positional',
103
+ 'please rerun qa with latest fixes',
104
+ ]);
97
105
  expect(positionalSend).toMatchObject({
98
106
  command: 'send',
99
107
  feature_id: 'feature_positional',
100
- message: 'please rerun qa with latest fixes'
108
+ message: 'please rerun qa with latest fixes',
101
109
  });
102
110
  const positionalAttach = parser.parse(['attach', 'feature_positional']);
103
111
  expect(positionalAttach).toMatchObject({
104
112
  command: 'attach',
105
- feature_id: 'feature_positional'
113
+ feature_id: 'feature_positional',
106
114
  });
107
115
  expect(parser.resolveTransport('InProcess')).toBe('inprocess');
108
116
  expect(parser.resolveTransport(undefined)).toBe('mcp');
@@ -111,16 +119,24 @@ describe('cli helper modules', () => {
111
119
  it('GIVEN_noncanonical_paths_WHEN_deriving_feature_id_or_canonical_spec_THEN_throws_or_returns_null', () => {
112
120
  expect(canonicalFeatureIdFromPath('feature_x.spec.md')).toBe('feature_x');
113
121
  expect(canonicalFeatureIdFromPath('feature_x-spec.md')).toBe('feature_x');
114
- expect(() => canonicalFeatureIdFromPath('INVALID Feature.md')).toThrow(ERROR_CODES.INVALID_FEATURE_SLUG);
122
+ expect(() => canonicalFeatureIdFromPath('INVALID Feature.md')).toThrow(
123
+ ERROR_CODES.INVALID_FEATURE_SLUG,
124
+ );
115
125
 
116
126
  expect(
117
- isCanonicalSpecPath('/repo', path.join('/repo', '.aop', 'features', 'feature_a', 'spec.md'))
127
+ isCanonicalSpecPath('/repo', path.join('/repo', '.aop', 'features', 'feature_a', 'spec.md')),
118
128
  ).toBe('feature_a');
119
129
  expect(
120
- isLegacyCanonicalSpecPath('/repo', path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'))
130
+ isLegacyCanonicalSpecPath(
131
+ '/repo',
132
+ path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'),
133
+ ),
121
134
  ).toBe('feature_a');
122
135
  expect(
123
- isCanonicalSpecPath('/repo', path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'))
136
+ isCanonicalSpecPath(
137
+ '/repo',
138
+ path.join('/repo', 'agentic', 'features', 'feature_a', 'spec.md'),
139
+ ),
124
140
  ).toBeNull();
125
141
  expect(isCanonicalSpecPath('/repo', '/repo/spec-files/feature_a.md')).toBeNull();
126
142
  });
@@ -129,17 +145,19 @@ describe('cli helper modules', () => {
129
145
  expect(() =>
130
146
  assertOkResponse({
131
147
  ok: false,
132
- error: {}
133
- } as any)
148
+ error: {},
149
+ } as any),
134
150
  ).toThrow(ERROR_CODES.INTERNAL_ERROR);
135
151
  });
136
152
 
137
153
  it('GIVEN_tool_client_response_WHEN_calling_cli_tool_THEN_uses_system_identity_and_returns_ok_payload', async () => {
138
154
  const toolClient = {
139
- call: vi.fn(async () => ({ ok: true, data: { accepted: true } }))
155
+ call: vi.fn(async () => ({ ok: true, data: { accepted: true } })),
140
156
  };
141
157
 
142
- const response = await callCliTool(toolClient as any, 'run:cli', 'report.dashboard', { sample: true });
158
+ const response = await callCliTool(toolClient as any, 'run:cli', 'report.dashboard', {
159
+ sample: true,
160
+ });
143
161
 
144
162
  expect(response).toMatchObject({ ok: true, data: { accepted: true } });
145
163
  expect(toolClient.call).toHaveBeenCalledWith(
@@ -149,8 +167,8 @@ describe('cli helper modules', () => {
149
167
  run_id: 'run:cli',
150
168
  session_id: 'bootstrap:cli',
151
169
  actor_type: 'system',
152
- actor_id: 'cli:system'
153
- })
170
+ actor_id: 'cli:system',
171
+ }),
154
172
  );
155
173
  });
156
174
  });
@@ -164,7 +182,7 @@ describe('RetryCommandHandler', () => {
164
182
  const toolClient = { call: vi.fn() };
165
183
  const handler = new RetryCommandHandler(toolClient as never, 'run:test');
166
184
  await expect(handler.execute({ command: 'retry' })).rejects.toMatchObject({
167
- code: ERROR_CODES.INVALID_CLI_ARGS
185
+ code: ERROR_CODES.INVALID_CLI_ARGS,
168
186
  });
169
187
  });
170
188
 
@@ -172,7 +190,7 @@ describe('RetryCommandHandler', () => {
172
190
  const toolClient = { call: vi.fn() };
173
191
  const handler = new RetryCommandHandler(toolClient as never, 'run:test');
174
192
  await expect(
175
- handler.execute({ command: 'retry', feature_id: 'INVALID Feature ID' })
193
+ handler.execute({ command: 'retry', feature_id: 'INVALID Feature ID' }),
176
194
  ).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
177
195
  });
178
196
 
@@ -195,13 +213,13 @@ describe('RetryCommandHandler', () => {
195
213
  retry_count_reset: false,
196
214
  retry_executed: true,
197
215
  retry_mode: 'full',
198
- retry_outcome: 'pass'
199
- }
216
+ retry_outcome: 'pass',
217
+ },
200
218
  });
201
219
  expect(callMock).toHaveBeenCalledWith(
202
220
  TOOLS.GATES_RUN,
203
221
  expect.objectContaining({ feature_id: 'feature_abc', mode: 'full' }),
204
- expect.any(Object)
222
+ expect.any(Object),
205
223
  );
206
224
  });
207
225
 
@@ -216,26 +234,30 @@ describe('RetryCommandHandler', () => {
216
234
  return { ok: true, data: {} };
217
235
  });
218
236
  const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
219
- const result = await handler.execute({ command: 'retry', feature_id: 'feature_abc', force: true });
237
+ const result = await handler.execute({
238
+ command: 'retry',
239
+ feature_id: 'feature_abc',
240
+ force: true,
241
+ });
220
242
 
221
243
  expect(result).toMatchObject({
222
244
  ok: true,
223
- data: { feature_id: 'feature_abc', retry_count_reset: true }
245
+ data: { feature_id: 'feature_abc', retry_count_reset: true },
224
246
  });
225
247
  expect(callMock).toHaveBeenCalledWith(
226
248
  TOOLS.FEATURE_STATE_GET,
227
249
  expect.objectContaining({ feature_id: 'feature_abc' }),
228
- expect.any(Object)
250
+ expect.any(Object),
229
251
  );
230
252
  expect(callMock).toHaveBeenCalledWith(
231
253
  TOOLS.FEATURE_STATE_PATCH,
232
254
  expect.objectContaining({ feature_id: 'feature_abc', expected_version: 5 }),
233
- expect.any(Object)
255
+ expect.any(Object),
234
256
  );
235
257
  expect(callMock).toHaveBeenCalledWith(
236
258
  TOOLS.GATES_RUN,
237
259
  expect.objectContaining({ feature_id: 'feature_abc' }),
238
- expect.any(Object)
260
+ expect.any(Object),
239
261
  );
240
262
  });
241
263
  });
@@ -260,7 +282,7 @@ describe('StatusCommandHandler', () => {
260
282
  const features = [
261
283
  { feature_id: 'no_ts', status: 'planning' },
262
284
  { feature_id: 'recent', status: 'building', last_heartbeat_at: recentTs },
263
- { feature_id: 'old_one', status: 'merged', last_run_at: oldTs }
285
+ { feature_id: 'old_one', status: 'merged', last_run_at: oldTs },
264
286
  ];
265
287
  const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
266
288
  const handler = new StatusCommandHandler(toolClient as never, 'run:test');
@@ -272,9 +294,9 @@ describe('StatusCommandHandler', () => {
272
294
  summary: [
273
295
  { feature_id: 'no_ts', status: 'planning', activity: 'unknown' },
274
296
  { feature_id: 'recent', status: 'building', activity: 'active' },
275
- { feature_id: 'old_one', status: 'merged', activity: 'idle' }
276
- ]
277
- }
297
+ { feature_id: 'old_one', status: 'merged', activity: 'idle' },
298
+ ],
299
+ },
278
300
  });
279
301
  });
280
302
 
@@ -287,7 +309,7 @@ describe('StatusCommandHandler', () => {
287
309
  merge_ready: true,
288
310
  pending_review_threads: 0,
289
311
  has_conflicts: false,
290
- merge_score: 100
312
+ merge_score: 100,
291
313
  };
292
314
  const features = [{ feature_id: 'feature_a', status: 'review', pr: prData }];
293
315
  const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
@@ -297,8 +319,8 @@ describe('StatusCommandHandler', () => {
297
319
  expect(result).toMatchObject({
298
320
  ok: true,
299
321
  data: {
300
- features: [expect.objectContaining({ feature_id: 'feature_a', pr_info: prData })]
301
- }
322
+ features: [expect.objectContaining({ feature_id: 'feature_a', pr_info: prData })],
323
+ },
302
324
  });
303
325
  });
304
326
 
@@ -318,7 +340,7 @@ describe('SendCommandHandler', () => {
318
340
  const toolClient = { call: vi.fn() };
319
341
  const handler = new SendCommandHandler(toolClient as never, 'run:test');
320
342
  await expect(
321
- handler.execute({ command: 'send', feature_id: 'INVALID Feature ID', message: 'hello' })
343
+ handler.execute({ command: 'send', feature_id: 'INVALID Feature ID', message: 'hello' }),
322
344
  ).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
323
345
  });
324
346
  });
@@ -333,14 +355,19 @@ describe('RetryCommandHandler branch coverage', () => {
333
355
  });
334
356
  const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
335
357
  await expect(
336
- handler.execute({ command: 'retry', feature_id: 'feature_x' })
358
+ handler.execute({ command: 'retry', feature_id: 'feature_x' }),
337
359
  ).rejects.toMatchObject({ code: ERROR_CODES.INVALID_CLI_ARGS });
338
360
  });
339
361
 
340
362
  it('GIVEN_feature_blocked_with_forced_retry_fast_reason_WHEN_execute_called_THEN_infers_fast_mode', async () => {
341
363
  const callMock = vi.fn().mockImplementation(async (toolName: string) => {
342
364
  if (toolName === TOOLS.FEATURE_STATE_GET) {
343
- return { ok: true, data: { front_matter: { version: 2, status: 'blocked', status_reason: 'forced_retry:fast' } } };
365
+ return {
366
+ ok: true,
367
+ data: {
368
+ front_matter: { version: 2, status: 'blocked', status_reason: 'forced_retry:fast' },
369
+ },
370
+ };
344
371
  }
345
372
  if (toolName === TOOLS.GATES_RUN) {
346
373
  return { ok: true, data: { overall: 'pass' } };
@@ -348,7 +375,11 @@ describe('RetryCommandHandler branch coverage', () => {
348
375
  return { ok: true, data: {} };
349
376
  });
350
377
  const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
351
- const result = await handler.execute({ command: 'retry', feature_id: 'feature_y', force: true }) as Record<string, unknown>;
378
+ const result = (await handler.execute({
379
+ command: 'retry',
380
+ feature_id: 'feature_y',
381
+ force: true,
382
+ })) as Record<string, unknown>;
352
383
  const data = result.data as Record<string, unknown>;
353
384
  expect(data.retry_mode).toBe('fast');
354
385
  });
@@ -356,7 +387,12 @@ describe('RetryCommandHandler branch coverage', () => {
356
387
  it('GIVEN_feature_blocked_with_force_and_last_gate_mode_full_WHEN_execute_called_THEN_patches_status_to_qa', async () => {
357
388
  const callMock = vi.fn().mockImplementation(async (toolName: string) => {
358
389
  if (toolName === TOOLS.FEATURE_STATE_GET) {
359
- return { ok: true, data: { front_matter: { version: 3, status: 'blocked', evidence: { last_gate_mode: 'full' } } } };
390
+ return {
391
+ ok: true,
392
+ data: {
393
+ front_matter: { version: 3, status: 'blocked', evidence: { last_gate_mode: 'full' } },
394
+ },
395
+ };
360
396
  }
361
397
  if (toolName === TOOLS.GATES_RUN) {
362
398
  return { ok: true, data: { overall: 'pass' } };
@@ -364,22 +400,33 @@ describe('RetryCommandHandler branch coverage', () => {
364
400
  return { ok: true, data: {} };
365
401
  });
366
402
  const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
367
- const result = await handler.execute({ command: 'retry', feature_id: 'feature_z', force: true }) as Record<string, unknown>;
403
+ const result = (await handler.execute({
404
+ command: 'retry',
405
+ feature_id: 'feature_z',
406
+ force: true,
407
+ })) as Record<string, unknown>;
368
408
  const data = result.data as Record<string, unknown>;
369
409
  expect(data.retry_mode).toBe('full');
370
410
  expect(data.forced_retry_executed).toBe(true);
371
411
  // verify patch was called with status qa
372
412
  expect(callMock).toHaveBeenCalledWith(
373
413
  TOOLS.FEATURE_STATE_PATCH,
374
- expect.objectContaining({ patch: expect.objectContaining({ front_matter: expect.objectContaining({ status: 'qa' }) }) }),
375
- expect.any(Object)
414
+ expect.objectContaining({
415
+ patch: expect.objectContaining({ front_matter: expect.objectContaining({ status: 'qa' }) }),
416
+ }),
417
+ expect.any(Object),
376
418
  );
377
419
  });
378
420
 
379
421
  it('GIVEN_feature_blocked_with_force_and_merge_gate_mode_WHEN_execute_called_THEN_patches_status_to_ready_to_merge', async () => {
380
422
  const callMock = vi.fn().mockImplementation(async (toolName: string) => {
381
423
  if (toolName === TOOLS.FEATURE_STATE_GET) {
382
- return { ok: true, data: { front_matter: { version: 4, status: 'blocked', evidence: { last_gate_mode: 'merge' } } } };
424
+ return {
425
+ ok: true,
426
+ data: {
427
+ front_matter: { version: 4, status: 'blocked', evidence: { last_gate_mode: 'merge' } },
428
+ },
429
+ };
383
430
  }
384
431
  if (toolName === TOOLS.GATES_RUN) {
385
432
  return { ok: true, data: { overall: 'pass' } };
@@ -387,13 +434,21 @@ describe('RetryCommandHandler branch coverage', () => {
387
434
  return { ok: true, data: {} };
388
435
  });
389
436
  const handler = new RetryCommandHandler({ call: callMock } as never, 'run:test');
390
- const result = await handler.execute({ command: 'retry', feature_id: 'feature_m', force: true }) as Record<string, unknown>;
437
+ const result = (await handler.execute({
438
+ command: 'retry',
439
+ feature_id: 'feature_m',
440
+ force: true,
441
+ })) as Record<string, unknown>;
391
442
  const data = result.data as Record<string, unknown>;
392
443
  expect(data.retry_mode).toBe('merge');
393
444
  expect(callMock).toHaveBeenCalledWith(
394
445
  TOOLS.FEATURE_STATE_PATCH,
395
- expect.objectContaining({ patch: expect.objectContaining({ front_matter: expect.objectContaining({ status: 'ready_to_merge' }) }) }),
396
- expect.any(Object)
446
+ expect.objectContaining({
447
+ patch: expect.objectContaining({
448
+ front_matter: expect.objectContaining({ status: 'ready_to_merge' }),
449
+ }),
450
+ }),
451
+ expect.any(Object),
397
452
  );
398
453
  });
399
454
  });
@@ -440,12 +495,10 @@ describe('HelpCommandHandler', () => {
440
495
 
441
496
  describe('StatusCommandHandler feature with no timestamp', () => {
442
497
  it('GIVEN_feature_with_no_timestamp_fields_WHEN_summary_THEN_activity_is_unknown', async () => {
443
- const features = [
444
- { feature_id: 'feat_no_ts', status: 'planning' }
445
- ];
498
+ const features = [{ feature_id: 'feat_no_ts', status: 'planning' }];
446
499
  const toolClient = { call: vi.fn(async () => ({ ok: true, data: { features } })) };
447
500
  const handler = new StatusCommandHandler(toolClient as never, 'run:test');
448
- const result = await handler.execute({ summary: true }) as any;
501
+ const result = (await handler.execute({ summary: true })) as any;
449
502
  expect(result.ok).toBe(true);
450
503
  const found = result.data.summary.find((f: any) => f.feature_id === 'feat_no_ts');
451
504
  expect(found?.activity).toBe('unknown');
@@ -462,13 +515,13 @@ describe('StatusCommandHandler explicit activity_state branches', () => {
462
515
  { feature_id: 'feat_idle', status: 'building', activity_state: 'idle' },
463
516
  { feature_id: 'feat_waiting', status: 'building', activity_state: 'waiting_input' },
464
517
  { feature_id: 'feat_blocked', status: 'blocked', activity_state: 'blocked' },
465
- { feature_id: 'feat_exited', status: 'failed', activity_state: 'exited' }
466
- ]
467
- }
468
- }))
518
+ { feature_id: 'feat_exited', status: 'failed', activity_state: 'exited' },
519
+ ],
520
+ },
521
+ })),
469
522
  };
470
523
  const handler = new StatusCommandHandler(toolClient as never, 'run:test');
471
- const result = await handler.execute({ summary: true }) as any;
524
+ const result = (await handler.execute({ summary: true })) as any;
472
525
  expect(result.ok).toBe(true);
473
526
  const idle = result.data.summary.find((f: any) => f.feature_id === 'feat_idle');
474
527
  expect(idle?.activity).toBe('idle');
@@ -493,15 +546,15 @@ describe('StatusCommandHandler explicit activity_state branches', () => {
493
546
  merge_ready: true,
494
547
  pending_review_threads: 0,
495
548
  has_conflicts: false,
496
- merge_score: 1
497
- }
498
- }
499
- ]
500
- }
501
- }))
549
+ merge_score: 1,
550
+ },
551
+ },
552
+ ],
553
+ },
554
+ })),
502
555
  };
503
556
  const handler = new StatusCommandHandler(toolClient as never, 'run:test');
504
- const result = await handler.execute({}) as any;
557
+ const result = (await handler.execute({})) as any;
505
558
  expect(result.ok).toBe(true);
506
559
  expect(result.data.features[0].pr_info.number).toBe(42);
507
560
  });
@@ -5,7 +5,7 @@ describe('aop CLI', () => {
5
5
  it('returns non-zero for invalid mutual exclusion', async () => {
6
6
  const exitCode = await main(['run', '-fi', 'a.md', '-fl', 'specs'], {
7
7
  cwd: process.cwd(),
8
- env: process.env
8
+ env: process.env,
9
9
  });
10
10
  expect(exitCode).toBe(1);
11
11
  });