agentic-orchestrator 0.1.6 → 0.1.8

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 (438) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +71 -48
  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 +5 -22
  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/env-file.ts +115 -0
  107. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  108. package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
  109. package/apps/control-plane/src/cli/io.ts +7 -3
  110. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  111. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  112. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  113. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  114. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  115. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  116. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  117. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  118. package/apps/control-plane/src/cli/tooling.ts +3 -3
  119. package/apps/control-plane/src/cli/types.ts +1 -1
  120. package/apps/control-plane/src/core/collisions.ts +27 -10
  121. package/apps/control-plane/src/core/constants.ts +13 -7
  122. package/apps/control-plane/src/core/error-codes.ts +1 -1
  123. package/apps/control-plane/src/core/fs.ts +11 -5
  124. package/apps/control-plane/src/core/gates.ts +53 -27
  125. package/apps/control-plane/src/core/git.ts +18 -6
  126. package/apps/control-plane/src/core/kernel.ts +513 -227
  127. package/apps/control-plane/src/core/patch.ts +7 -3
  128. package/apps/control-plane/src/core/path-layout.ts +5 -1
  129. package/apps/control-plane/src/core/path-rules.ts +19 -5
  130. package/apps/control-plane/src/core/qa-index.ts +26 -12
  131. package/apps/control-plane/src/core/response.ts +9 -6
  132. package/apps/control-plane/src/core/schemas.ts +29 -10
  133. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  134. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  135. package/apps/control-plane/src/index.ts +3 -9
  136. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
  137. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  138. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  139. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  140. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  141. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  142. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  143. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  144. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  145. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  146. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  147. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  148. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  149. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  150. package/apps/control-plane/src/providers/providers.ts +137 -54
  151. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  152. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  153. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  154. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  155. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  156. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  157. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  158. package/apps/control-plane/src/supervisor/types.ts +22 -7
  159. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  160. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  161. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  162. package/apps/control-plane/test/aop.spec.ts +4 -4
  163. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  164. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  165. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  166. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  167. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  168. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  169. package/apps/control-plane/test/cli.spec.ts +1 -1
  170. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  171. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  172. package/apps/control-plane/test/collisions.spec.ts +30 -30
  173. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  174. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  175. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  176. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  177. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  178. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  179. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  180. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  181. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  182. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  183. package/apps/control-plane/test/gates.spec.ts +101 -81
  184. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  185. package/apps/control-plane/test/helpers.ts +10 -6
  186. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  187. package/apps/control-plane/test/init-wizard.spec.ts +328 -68
  188. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  189. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  190. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  191. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  192. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  193. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  194. package/apps/control-plane/test/kernel.spec.ts +134 -51
  195. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  196. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  197. package/apps/control-plane/test/mcp.spec.ts +231 -115
  198. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  199. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  200. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  201. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  202. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  203. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  204. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  205. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  206. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  207. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  208. package/apps/control-plane/test/providers.spec.ts +208 -104
  209. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  210. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  211. package/apps/control-plane/test/reactions.spec.ts +88 -45
  212. package/apps/control-plane/test/response.spec.ts +5 -5
  213. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  214. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  215. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  216. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  217. package/apps/control-plane/test/services.spec.ts +147 -129
  218. package/apps/control-plane/test/session-management.spec.ts +136 -74
  219. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  220. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  221. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  222. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  223. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  224. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  225. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  226. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  227. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  228. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  229. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  230. package/apps/control-plane/tsconfig.build.json +2 -7
  231. package/apps/control-plane/tsconfig.json +1 -5
  232. package/apps/control-plane/vitest.config.ts +7 -7
  233. package/config/agentic/orchestrator/adapters.yaml +3 -0
  234. package/config/agentic/orchestrator/agents.yaml +14 -0
  235. package/config/agentic/orchestrator/gates.yaml +28 -0
  236. package/config/agentic/orchestrator/policy.yaml +22 -0
  237. package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
  238. package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
  239. package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
  240. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  241. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  242. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  243. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  244. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  245. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  246. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  247. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  248. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  249. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  250. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  252. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  254. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  256. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  258. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  260. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  262. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  264. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  266. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  268. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  270. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  271. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  272. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  273. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  274. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  275. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  276. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  277. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  279. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  281. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  282. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  283. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  284. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  285. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  286. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  287. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  288. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  289. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  290. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  291. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  292. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  293. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  294. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  295. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  296. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  297. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  298. package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
  299. package/dist/apps/control-plane/cli/env-file.js +89 -0
  300. package/dist/apps/control-plane/cli/env-file.js.map +1 -0
  301. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  302. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  303. package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
  304. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  305. package/dist/apps/control-plane/cli/io.js +2 -2
  306. package/dist/apps/control-plane/cli/io.js.map +1 -1
  307. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  308. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  310. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  311. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  312. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  313. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  314. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  315. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  316. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  317. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  318. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  319. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  320. package/dist/apps/control-plane/cli/tooling.js +1 -1
  321. package/dist/apps/control-plane/core/collisions.js +11 -8
  322. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  323. package/dist/apps/control-plane/core/constants.js +13 -7
  324. package/dist/apps/control-plane/core/constants.js.map +1 -1
  325. package/dist/apps/control-plane/core/error-codes.js +1 -1
  326. package/dist/apps/control-plane/core/fs.js.map +1 -1
  327. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  328. package/dist/apps/control-plane/core/gates.js +26 -19
  329. package/dist/apps/control-plane/core/gates.js.map +1 -1
  330. package/dist/apps/control-plane/core/git.js +3 -3
  331. package/dist/apps/control-plane/core/git.js.map +1 -1
  332. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  333. package/dist/apps/control-plane/core/kernel.js +134 -81
  334. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  335. package/dist/apps/control-plane/core/patch.js +7 -3
  336. package/dist/apps/control-plane/core/patch.js.map +1 -1
  337. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  338. package/dist/apps/control-plane/core/path-layout.js +4 -1
  339. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  340. package/dist/apps/control-plane/core/path-rules.js +3 -1
  341. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  342. package/dist/apps/control-plane/core/qa-index.js +5 -5
  343. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  344. package/dist/apps/control-plane/core/response.js +3 -3
  345. package/dist/apps/control-plane/core/response.js.map +1 -1
  346. package/dist/apps/control-plane/core/schemas.js +10 -6
  347. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  348. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  349. package/dist/apps/control-plane/index.d.ts +1 -1
  350. package/dist/apps/control-plane/index.js +1 -1
  351. package/dist/apps/control-plane/index.js.map +1 -1
  352. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
  353. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  355. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  357. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  359. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  361. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  362. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  363. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  364. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  365. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  366. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  367. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  368. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  369. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  370. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  371. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  372. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  373. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  374. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  375. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  376. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  377. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  378. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  379. package/dist/apps/control-plane/providers/providers.d.ts +3 -2
  380. package/dist/apps/control-plane/providers/providers.js +81 -39
  381. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  383. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  385. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  387. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  388. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  389. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  390. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  391. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  392. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  393. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  394. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  395. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  396. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  397. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  398. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  399. package/eslint.config.mjs +20 -20
  400. package/example-configurations/README.md +1 -1
  401. package/example-configurations/java/agents.yaml +3 -3
  402. package/example-configurations/java/policy.yaml +1 -1
  403. package/example-configurations/node/agents.yaml +3 -3
  404. package/example-configurations/node/policy.yaml +1 -1
  405. package/package.json +10 -5
  406. package/packages/web-dashboard/next.config.js +2 -2
  407. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  408. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  409. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  410. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  411. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  412. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  413. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  414. package/packages/web-dashboard/src/app/globals.css +10 -2
  415. package/packages/web-dashboard/src/app/page.tsx +100 -37
  416. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  417. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  418. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  419. package/packages/web-dashboard/tsconfig.json +3 -11
  420. package/scripts/nx-safe.mjs +10 -10
  421. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  422. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
  423. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  424. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  425. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  426. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  427. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  428. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  429. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  430. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  431. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  432. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  433. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  434. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  435. package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
  436. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  437. package/spec-files/progress.md +186 -175
  438. package/tsconfig.json +2 -8
@@ -52,15 +52,19 @@ describe('CleanupCommandHandler', () => {
52
52
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
53
53
 
54
54
  const callMock = vi.fn();
55
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
55
+ const handler = new CleanupCommandHandler(
56
+ makeToolClient(callMock) as never,
57
+ 'run:test',
58
+ '/repo',
59
+ );
56
60
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
57
61
 
58
62
  expect(result).toMatchObject({
59
63
  ok: true,
60
64
  data: {
61
65
  would_clean: [{ feature_id: 'feature_a', reason: 'terminal status: merged' }],
62
- cleaned: []
63
- }
66
+ cleaned: [],
67
+ },
64
68
  });
65
69
  expect(callMock).not.toHaveBeenCalled();
66
70
  });
@@ -81,20 +85,24 @@ describe('CleanupCommandHandler', () => {
81
85
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
82
86
 
83
87
  const callMock = vi.fn(async () => ({ ok: true, data: {} }));
84
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
88
+ const handler = new CleanupCommandHandler(
89
+ makeToolClient(callMock) as never,
90
+ 'run:test',
91
+ '/repo',
92
+ );
85
93
  const result = await handler.execute({ command: 'cleanup', yes: true });
86
94
 
87
95
  expect(result).toMatchObject({
88
96
  ok: true,
89
97
  data: {
90
98
  would_clean: [{ feature_id: 'feature_a' }],
91
- cleaned: [{ feature_id: 'feature_a' }]
92
- }
99
+ cleaned: [{ feature_id: 'feature_a' }],
100
+ },
93
101
  });
94
102
  expect(callMock).toHaveBeenCalledWith(
95
103
  TOOLS.FEATURE_DELETE,
96
104
  expect.objectContaining({ feature_id: 'feature_a', confirm: true, dry_run: false }),
97
- expect.any(Object)
105
+ expect.any(Object),
98
106
  );
99
107
  });
100
108
 
@@ -112,19 +120,23 @@ describe('CleanupCommandHandler', () => {
112
120
  vi.spyOn(fs, 'readdir').mockResolvedValue([
113
121
  { name: 'orphan_feature', isDirectory: () => true },
114
122
  { name: 'feature_a', isDirectory: () => true },
115
- { name: 'not_a_dir.txt', isDirectory: () => false }
123
+ { name: 'not_a_dir.txt', isDirectory: () => false },
116
124
  ] as never);
117
125
 
118
126
  const callMock = vi.fn();
119
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
127
+ const handler = new CleanupCommandHandler(
128
+ makeToolClient(callMock) as never,
129
+ 'run:test',
130
+ '/repo',
131
+ );
120
132
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
121
133
 
122
134
  expect(result).toMatchObject({
123
135
  ok: true,
124
136
  data: {
125
137
  would_clean: [{ feature_id: 'orphan_feature', reason: 'orphan worktree' }],
126
- cleaned: []
127
- }
138
+ cleaned: [],
139
+ },
128
140
  });
129
141
  expect(callMock).not.toHaveBeenCalled();
130
142
  });
@@ -145,7 +157,11 @@ describe('CleanupCommandHandler', () => {
145
157
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
146
158
 
147
159
  const callMock = vi.fn().mockRejectedValue(new Error('delete failed'));
148
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
160
+ const handler = new CleanupCommandHandler(
161
+ makeToolClient(callMock) as never,
162
+ 'run:test',
163
+ '/repo',
164
+ );
149
165
  const result = await handler.execute({ command: 'cleanup', yes: true });
150
166
 
151
167
  expect(result).toMatchObject({
@@ -153,8 +169,8 @@ describe('CleanupCommandHandler', () => {
153
169
  data: {
154
170
  would_clean: [{ feature_id: 'feature_a' }],
155
171
  cleaned: [],
156
- skipped: [{ feature_id: 'feature_a' }]
157
- }
172
+ skipped: [{ feature_id: 'feature_a' }],
173
+ },
158
174
  });
159
175
  });
160
176
 
@@ -173,23 +189,35 @@ describe('CleanupCommandHandler', () => {
173
189
  });
174
190
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
175
191
 
176
- const defaultHandler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
192
+ const defaultHandler = new CleanupCommandHandler(
193
+ makeToolClient() as never,
194
+ 'run:test',
195
+ '/repo',
196
+ 3600,
197
+ false,
198
+ );
177
199
  const defaultResult = await defaultHandler.execute({ command: 'cleanup', dry_run: true });
178
200
  expect(defaultResult).toMatchObject({
179
201
  ok: true,
180
202
  data: {
181
- would_clean: []
182
- }
203
+ would_clean: [],
204
+ },
183
205
  });
184
206
 
185
- const autoHandler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, true);
207
+ const autoHandler = new CleanupCommandHandler(
208
+ makeToolClient() as never,
209
+ 'run:test',
210
+ '/repo',
211
+ 3600,
212
+ true,
213
+ );
186
214
  const autoResult = await autoHandler.execute({ command: 'cleanup', dry_run: true });
187
215
  expect(autoResult).toMatchObject({
188
216
  ok: true,
189
217
  data: {
190
218
  would_clean: [{ feature_id: 'feature_merged', reason: 'terminal status: merged' }],
191
- cleaned: []
192
- }
219
+ cleaned: [],
220
+ },
193
221
  });
194
222
  });
195
223
  });
@@ -219,14 +247,20 @@ describe('CleanupCommandHandler branch coverage', () => {
219
247
  // Allow readdir to succeed with empty array so isRunLeaseInactive checks candidate paths
220
248
  vi.spyOn(fs, 'readdir').mockResolvedValue([]);
221
249
 
222
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
250
+ const handler = new CleanupCommandHandler(
251
+ makeToolClient() as never,
252
+ 'run:test',
253
+ '/repo',
254
+ 3600,
255
+ false,
256
+ );
223
257
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
224
258
  expect(result).toMatchObject({
225
259
  ok: true,
226
260
  data: {
227
261
  would_clean: [],
228
- skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }]
229
- }
262
+ skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }],
263
+ },
230
264
  });
231
265
  });
232
266
 
@@ -245,14 +279,20 @@ describe('CleanupCommandHandler branch coverage', () => {
245
279
  });
246
280
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
247
281
 
248
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
282
+ const handler = new CleanupCommandHandler(
283
+ makeToolClient() as never,
284
+ 'run:test',
285
+ '/repo',
286
+ 3600,
287
+ false,
288
+ );
249
289
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
250
290
  expect(result).toMatchObject({
251
291
  ok: true,
252
292
  data: {
253
293
  would_clean: [],
254
- skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }]
255
- }
294
+ skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }],
295
+ },
256
296
  });
257
297
  });
258
298
 
@@ -266,13 +306,21 @@ describe('CleanupCommandHandler branch coverage', () => {
266
306
  });
267
307
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
268
308
 
269
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, true);
309
+ const handler = new CleanupCommandHandler(
310
+ makeToolClient() as never,
311
+ 'run:test',
312
+ '/repo',
313
+ 3600,
314
+ true,
315
+ );
270
316
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
271
317
  expect(result).toMatchObject({
272
318
  ok: true,
273
319
  data: {
274
- would_clean: [{ feature_id: 'feature_no_state', reason: 'merged residue with missing state' }]
275
- }
320
+ would_clean: [
321
+ { feature_id: 'feature_no_state', reason: 'merged residue with missing state' },
322
+ ],
323
+ },
276
324
  });
277
325
  });
278
326
  });
@@ -288,14 +336,20 @@ describe('CleanupCommandHandler state unreadable branch', () => {
288
336
  });
289
337
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
290
338
 
291
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
339
+ const handler = new CleanupCommandHandler(
340
+ makeToolClient() as never,
341
+ 'run:test',
342
+ '/repo',
343
+ 3600,
344
+ false,
345
+ );
292
346
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
293
347
  expect(result).toMatchObject({
294
348
  ok: true,
295
349
  data: {
296
350
  would_clean: [],
297
- skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }]
298
- }
351
+ skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }],
352
+ },
299
353
  });
300
354
  });
301
355
  });
@@ -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
  });