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
@@ -13,20 +13,32 @@ vi.mock('node:readline/promises', () => ({
13
13
  default: {
14
14
  createInterface: vi.fn(() => ({
15
15
  question: vi.fn(async () => ''),
16
- close: vi.fn()
17
- }))
18
- }
16
+ close: vi.fn(),
17
+ })),
18
+ },
19
19
  }));
20
20
 
21
21
  vi.mock('../src/core/kernel.js', () => {
22
22
  class AopKernel {
23
23
  private readonly repoRoot: string;
24
- constructor(repoRoot: string) { this.repoRoot = repoRoot; }
25
- async ensureLoaded() { await ensureLoadedMock(); }
26
- getRepoRoot() { return this.repoRoot; }
27
- getAgentsConfig() { return {}; }
28
- getRbacPolicy() { return {}; }
29
- getPolicySnapshot() { return {}; }
24
+ constructor(repoRoot: string) {
25
+ this.repoRoot = repoRoot;
26
+ }
27
+ async ensureLoaded() {
28
+ await ensureLoadedMock();
29
+ }
30
+ getRepoRoot() {
31
+ return this.repoRoot;
32
+ }
33
+ getAgentsConfig() {
34
+ return {};
35
+ }
36
+ getRbacPolicy() {
37
+ return {};
38
+ }
39
+ getPolicySnapshot() {
40
+ return {};
41
+ }
30
42
  setProvider() {}
31
43
  }
32
44
  return { AopKernel };
@@ -34,15 +46,25 @@ vi.mock('../src/core/kernel.js', () => {
34
46
 
35
47
  vi.mock('../src/mcp/runtime-factory.js', () => ({
36
48
  createToolingRuntime: createToolingRuntimeMock,
37
- resolveToolClient: resolveToolClientMock
49
+ resolveToolClient: resolveToolClientMock,
38
50
  }));
39
51
 
40
52
  vi.mock('../src/cli/init-command-handler.js', () => ({
41
53
  InitCommandHandler: class InitCommandHandler {
42
54
  async execute() {
43
- return { ok: true, data: { command: 'init', created: [], updated: [], skipped: [], validation_warnings: [], next_steps: [] } };
55
+ return {
56
+ ok: true,
57
+ data: {
58
+ command: 'init',
59
+ created: [],
60
+ updated: [],
61
+ skipped: [],
62
+ validation_warnings: [],
63
+ next_steps: [],
64
+ },
65
+ };
44
66
  }
45
- }
67
+ },
46
68
  }));
47
69
 
48
70
  vi.mock('../src/cli/dashboard-command-handler.js', () => ({
@@ -50,7 +72,7 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
50
72
  async execute() {
51
73
  return { ok: true, data: { message: 'started', port: 3000 } };
52
74
  }
53
- }
75
+ },
54
76
  }));
55
77
 
56
78
  vi.mock('../src/cli/run-command-handler.js', () => ({
@@ -58,7 +80,7 @@ vi.mock('../src/cli/run-command-handler.js', () => ({
58
80
  async execute() {
59
81
  return { ok: true, data: { status: 'running' } };
60
82
  }
61
- }
83
+ },
62
84
  }));
63
85
 
64
86
  vi.mock('../src/cli/resume-command-handler.js', () => ({
@@ -66,7 +88,7 @@ vi.mock('../src/cli/resume-command-handler.js', () => ({
66
88
  async execute() {
67
89
  return { ok: true, data: { resumed: false } };
68
90
  }
69
- }
91
+ },
70
92
  }));
71
93
 
72
94
  vi.mock('../src/cli/attach-command-handler.js', () => ({
@@ -74,10 +96,17 @@ vi.mock('../src/cli/attach-command-handler.js', () => ({
74
96
  async execute() {
75
97
  return {
76
98
  ok: true,
77
- data: { command: 'attach', feature_id: 'feat_x', status: 'building', role: 'builder', session_id: 'sess-1', attached: true }
99
+ data: {
100
+ command: 'attach',
101
+ feature_id: 'feat_x',
102
+ status: 'building',
103
+ role: 'builder',
104
+ session_id: 'sess-1',
105
+ attached: true,
106
+ },
78
107
  };
79
108
  }
80
- }
109
+ },
81
110
  }));
82
111
 
83
112
  describe('bootstrap runCli attach success path', () => {
@@ -100,12 +129,16 @@ describe('bootstrap runCli attach success path', () => {
100
129
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
101
130
  const code = await runCli(['attach', '--feature-id', 'feat_x'], {
102
131
  cwd: '/tmp',
103
- env: { ...process.env, AOP_AGENT_PROVIDER: 'custom' }
132
+ env: { ...process.env, AOP_AGENT_PROVIDER: 'custom' },
104
133
  });
105
134
  // Attach handler mock returns successfully → printPayload → return 0
106
135
  expect(code).toBe(0);
107
136
  const writes = stdoutSpy.mock.calls.flatMap((call) => {
108
- try { return [JSON.parse(String(call[0]))]; } catch { return []; }
137
+ try {
138
+ return [JSON.parse(String(call[0]))];
139
+ } catch {
140
+ return [];
141
+ }
109
142
  });
110
143
  expect(writes[0]).toMatchObject({ ok: true, data: { command: 'attach' } });
111
144
  });
@@ -16,27 +16,29 @@ const toolCallMock = vi.hoisted(() => vi.fn(async () => ({ ok: true, data: {} })
16
16
 
17
17
  /** Allows per-test control of getPolicySnapshot return value */
18
18
  const policySnapshotOverride = vi.hoisted(() => ({
19
- value: {} as Record<string, unknown>
19
+ value: {} as Record<string, unknown>,
20
20
  }));
21
21
 
22
22
  /** Allows per-test control of whether ensureLoaded throws */
23
23
  const kernelThrowOverride = vi.hoisted(() => ({
24
- value: null as Error | null
24
+ value: null as Error | null,
25
25
  }));
26
26
 
27
27
  vi.mock('node:readline/promises', () => ({
28
28
  default: {
29
29
  createInterface: vi.fn(() => ({
30
30
  question: vi.fn(async () => ''),
31
- close: vi.fn()
32
- }))
33
- }
31
+ close: vi.fn(),
32
+ })),
33
+ },
34
34
  }));
35
35
 
36
36
  vi.mock('../src/core/kernel.js', () => {
37
37
  class AopKernel {
38
38
  private readonly repoRoot: string;
39
- constructor(repoRoot: string) { this.repoRoot = repoRoot; }
39
+ constructor(repoRoot: string) {
40
+ this.repoRoot = repoRoot;
41
+ }
40
42
 
41
43
  async ensureLoaded() {
42
44
  await ensureLoadedMock();
@@ -45,9 +47,15 @@ vi.mock('../src/core/kernel.js', () => {
45
47
  }
46
48
  }
47
49
 
48
- getRepoRoot() { return this.repoRoot; }
49
- getAgentsConfig() { return {}; }
50
- getRbacPolicy() { return {}; }
50
+ getRepoRoot() {
51
+ return this.repoRoot;
52
+ }
53
+ getAgentsConfig() {
54
+ return {};
55
+ }
56
+ getRbacPolicy() {
57
+ return {};
58
+ }
51
59
 
52
60
  getPolicySnapshot() {
53
61
  return policySnapshotOverride.value;
@@ -61,15 +69,25 @@ vi.mock('../src/core/kernel.js', () => {
61
69
 
62
70
  vi.mock('../src/mcp/runtime-factory.js', () => ({
63
71
  createToolingRuntime: createToolingRuntimeMock,
64
- resolveToolClient: resolveToolClientMock
72
+ resolveToolClient: resolveToolClientMock,
65
73
  }));
66
74
 
67
75
  vi.mock('../src/cli/init-command-handler.js', () => ({
68
76
  InitCommandHandler: class InitCommandHandler {
69
77
  async execute() {
70
- return { ok: true, data: { command: 'init', created: [], updated: [], skipped: [], validation_warnings: [], next_steps: [] } };
78
+ return {
79
+ ok: true,
80
+ data: {
81
+ command: 'init',
82
+ created: [],
83
+ updated: [],
84
+ skipped: [],
85
+ validation_warnings: [],
86
+ next_steps: [],
87
+ },
88
+ };
71
89
  }
72
- }
90
+ },
73
91
  }));
74
92
 
75
93
  vi.mock('../src/cli/dashboard-command-handler.js', () => ({
@@ -77,7 +95,7 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
77
95
  async execute() {
78
96
  return { ok: true, data: { message: 'started', port: 3000 } };
79
97
  }
80
- }
98
+ },
81
99
  }));
82
100
 
83
101
  vi.mock('../src/cli/run-command-handler.js', () => ({
@@ -85,7 +103,7 @@ vi.mock('../src/cli/run-command-handler.js', () => ({
85
103
  async execute() {
86
104
  return { ok: true, data: { status: 'running' } };
87
105
  }
88
- }
106
+ },
89
107
  }));
90
108
 
91
109
  vi.mock('../src/cli/resume-command-handler.js', () => ({
@@ -93,7 +111,7 @@ vi.mock('../src/cli/resume-command-handler.js', () => ({
93
111
  async execute() {
94
112
  return { ok: true, data: { resumed: false } };
95
113
  }
96
- }
114
+ },
97
115
  }));
98
116
 
99
117
  vi.mock('../src/cli/attach-command-handler.js', () => ({
@@ -101,22 +119,28 @@ vi.mock('../src/cli/attach-command-handler.js', () => ({
101
119
  async execute() {
102
120
  return { ok: true, data: { command: 'attach' } };
103
121
  }
104
- }
122
+ },
105
123
  }));
106
124
 
107
125
  // ── helpers ───────────────────────────────────────────────────────────────────
108
126
 
109
127
  async function writeMultiProjectYaml(dir: string, content: string): Promise<void> {
110
- const configDir = path.join(dir, 'agentic', 'orchestrator');
128
+ const configDir = path.join(dir, 'config', 'agentic', 'orchestrator');
111
129
  await fs.mkdir(configDir, { recursive: true });
112
130
  await fs.writeFile(path.join(configDir, 'multi-project.yaml'), content, 'utf8');
113
131
  }
114
132
 
115
133
  async function writeSchemaFile(dir: string): Promise<void> {
116
- const schemasDir = path.join(dir, 'agentic', 'orchestrator', 'schemas');
134
+ const schemasDir = path.join(dir, 'config', 'agentic', 'orchestrator', 'schemas');
117
135
  await fs.mkdir(schemasDir, { recursive: true });
118
136
  const repoRoot = path.resolve(import.meta.dirname, '../../../');
119
- const srcSchema = path.join(repoRoot, 'agentic', 'orchestrator', 'schemas', 'multi-project.schema.json');
137
+ const srcSchema = path.join(
138
+ repoRoot,
139
+ 'agentic',
140
+ 'orchestrator',
141
+ 'schemas',
142
+ 'multi-project.schema.json',
143
+ );
120
144
  const destSchema = path.join(schemasDir, 'multi-project.schema.json');
121
145
  await fs.copyFile(srcSchema, destSchema);
122
146
  }
@@ -150,7 +174,7 @@ describe('bootstrap edge-case branch coverage', () => {
150
174
  await fs.mkdir(proj1sub, { recursive: true });
151
175
  await writeMultiProjectYaml(
152
176
  tmpDir,
153
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`
177
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
154
178
  );
155
179
 
156
180
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -167,7 +191,7 @@ describe('bootstrap edge-case branch coverage', () => {
167
191
  await fs.mkdir(other, { recursive: true });
168
192
  await writeMultiProjectYaml(
169
193
  tmpDir,
170
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\ndefaults:\n default_project: proj1\n`
194
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\ndefaults:\n default_project: proj1\n`,
171
195
  );
172
196
 
173
197
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -179,7 +203,7 @@ describe('bootstrap edge-case branch coverage', () => {
179
203
  it('GIVEN_cleanup_with_policy_having_grace_period_and_auto_after_merge_WHEN_cleanup_THEN_uses_policy_values', async () => {
180
204
  // Covers lines 291 and 292: cleanup?.grace_period_seconds non-null and auto_after_merge=true
181
205
  policySnapshotOverride.value = {
182
- cleanup: { grace_period_seconds: 120, auto_after_merge: true }
206
+ cleanup: { grace_period_seconds: 120, auto_after_merge: true },
183
207
  };
184
208
  toolCallMock.mockResolvedValue({ ok: true, data: { cleaned: [], would_clean: [] } });
185
209
 
@@ -205,12 +229,15 @@ describe('bootstrap edge-case branch coverage', () => {
205
229
  await fs.mkdir(proj1, { recursive: true });
206
230
  await writeMultiProjectYaml(
207
231
  tmpDir,
208
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\ndefaults:\n max_active_features: 5\n max_parallel_gate_runs: 2\n`
232
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\ndefaults:\n max_active_features: 5\n max_parallel_gate_runs: 2\n`,
209
233
  );
210
234
  toolCallMock.mockResolvedValue({ ok: true, data: { status: 'running' } });
211
235
 
212
236
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
213
- const code = await runCli(['run', '--feature-id', 'feat_test'], { cwd: tmpDir, env: process.env });
237
+ const code = await runCli(['run', '--feature-id', 'feat_test'], {
238
+ cwd: tmpDir,
239
+ env: process.env,
240
+ });
214
241
  expect(code).toBe(0);
215
242
  });
216
243
 
@@ -220,7 +247,7 @@ describe('bootstrap edge-case branch coverage', () => {
220
247
  await fs.mkdir(proj1, { recursive: true });
221
248
  await writeMultiProjectYaml(
222
249
  tmpDir,
223
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n dashboard_port: 4000\n`
250
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n dashboard_port: 4000\n`,
224
251
  );
225
252
 
226
253
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -237,7 +264,7 @@ describe('bootstrap edge-case branch coverage', () => {
237
264
  await fs.mkdir(proj2, { recursive: true });
238
265
  await writeMultiProjectYaml(
239
266
  tmpDir,
240
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
267
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
241
268
  );
242
269
 
243
270
  // proj2 will throw an error without .code property
@@ -255,7 +282,11 @@ describe('bootstrap edge-case branch coverage', () => {
255
282
  const code = await runCli(['status', '--all'], { cwd: tmpDir, env: process.env });
256
283
  expect(code).toBe(0);
257
284
  const writes = stdoutSpy.mock.calls.flatMap((call) => {
258
- try { return [JSON.parse(String(call[0]))]; } catch { return []; }
285
+ try {
286
+ return [JSON.parse(String(call[0]))];
287
+ } catch {
288
+ return [];
289
+ }
259
290
  });
260
291
  expect(writes.some((w) => w.ok === true)).toBe(true);
261
292
  });
@@ -16,9 +16,9 @@ vi.mock('node:readline/promises', () => ({
16
16
  default: {
17
17
  createInterface: vi.fn(() => ({
18
18
  question: readlineQuestionMock,
19
- close: readlineCloseMock
20
- }))
21
- }
19
+ close: readlineCloseMock,
20
+ })),
21
+ },
22
22
  }));
23
23
 
24
24
  vi.mock('../src/core/kernel.js', () => {
@@ -59,7 +59,7 @@ vi.mock('../src/core/kernel.js', () => {
59
59
 
60
60
  vi.mock('../src/mcp/runtime-factory.js', () => ({
61
61
  createToolingRuntime: createToolingRuntimeMock,
62
- resolveToolClient: resolveToolClientMock
62
+ resolveToolClient: resolveToolClientMock,
63
63
  }));
64
64
 
65
65
  vi.mock('../src/cli/init-command-handler.js', () => ({
@@ -73,11 +73,11 @@ vi.mock('../src/cli/init-command-handler.js', () => ({
73
73
  updated: [],
74
74
  skipped: [],
75
75
  validation_warnings: [],
76
- next_steps: []
77
- }
76
+ next_steps: [],
77
+ },
78
78
  };
79
79
  }
80
- }
80
+ },
81
81
  }));
82
82
 
83
83
  vi.mock('../src/cli/dashboard-command-handler.js', () => ({
@@ -85,7 +85,7 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
85
85
  async execute() {
86
86
  return { ok: true, data: { message: 'started', port: 3000 } };
87
87
  }
88
- }
88
+ },
89
89
  }));
90
90
 
91
91
  vi.mock('../src/cli/run-command-handler.js', () => ({
@@ -93,7 +93,7 @@ vi.mock('../src/cli/run-command-handler.js', () => ({
93
93
  async execute() {
94
94
  return { ok: true, data: { status: 'running' } };
95
95
  }
96
- }
96
+ },
97
97
  }));
98
98
 
99
99
  vi.mock('../src/cli/resume-command-handler.js', () => ({
@@ -101,7 +101,7 @@ vi.mock('../src/cli/resume-command-handler.js', () => ({
101
101
  async execute() {
102
102
  return { ok: true, data: { resumed: false } };
103
103
  }
104
- }
104
+ },
105
105
  }));
106
106
 
107
107
  // ── helpers ───────────────────────────────────────────────────────────────────
@@ -121,16 +121,22 @@ function asJsonWrites(spy: ReturnType<typeof vi.spyOn>): unknown[] {
121
121
  }
122
122
 
123
123
  async function writeMultiProjectYaml(dir: string, content: string): Promise<void> {
124
- const configDir = path.join(dir, 'agentic', 'orchestrator');
124
+ const configDir = path.join(dir, 'config', 'agentic', 'orchestrator');
125
125
  await fs.mkdir(configDir, { recursive: true });
126
126
  await fs.writeFile(path.join(configDir, 'multi-project.yaml'), content, 'utf8');
127
127
  }
128
128
 
129
129
  async function writeSchemaFile(dir: string): Promise<void> {
130
- const schemasDir = path.join(dir, 'agentic', 'orchestrator', 'schemas');
130
+ const schemasDir = path.join(dir, 'config', 'agentic', 'orchestrator', 'schemas');
131
131
  await fs.mkdir(schemasDir, { recursive: true });
132
132
  const repoRoot = path.resolve(import.meta.dirname, '../../../');
133
- const srcSchema = path.join(repoRoot, 'agentic', 'orchestrator', 'schemas', 'multi-project.schema.json');
133
+ const srcSchema = path.join(
134
+ repoRoot,
135
+ 'agentic',
136
+ 'orchestrator',
137
+ 'schemas',
138
+ 'multi-project.schema.json',
139
+ );
134
140
  const destSchema = path.join(schemasDir, 'multi-project.schema.json');
135
141
  await fs.copyFile(srcSchema, destSchema);
136
142
  }
@@ -168,7 +174,7 @@ describe('bootstrap runCli', () => {
168
174
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
169
175
  const code = await runCli(['delete', '--feature-id', 'feat_x', '--yes'], {
170
176
  cwd: '/tmp',
171
- env: process.env
177
+ env: process.env,
172
178
  });
173
179
 
174
180
  const writes = asJsonWrites(stdoutSpy);
@@ -185,14 +191,14 @@ describe('bootstrap runCli', () => {
185
191
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
186
192
  const code = await runCli(['retry', '--feature-id', 'feat_x'], {
187
193
  cwd: '/tmp',
188
- env: process.env
194
+ env: process.env,
189
195
  });
190
196
 
191
197
  const writes = asJsonWrites(stdoutSpy);
192
198
  expect(code).toBe(0);
193
199
  expect(writes[0]).toMatchObject({
194
200
  ok: true,
195
- data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true }
201
+ data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true },
196
202
  });
197
203
  expect(toolCallMock).toHaveBeenCalled();
198
204
  });
@@ -203,7 +209,7 @@ describe('bootstrap runCli', () => {
203
209
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
204
210
  const code = await runCli(['send', '--feature-id', 'feat_x', '--message', 'hello'], {
205
211
  cwd: '/tmp',
206
- env: process.env
212
+ env: process.env,
207
213
  });
208
214
 
209
215
  const writes = asJsonWrites(stdoutSpy);
@@ -227,7 +233,7 @@ describe('bootstrap runCli', () => {
227
233
  expect(code).toBe(0);
228
234
  expect(writes[0]).toMatchObject({
229
235
  ok: true,
230
- data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) })
236
+ data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) }),
231
237
  });
232
238
  });
233
239
 
@@ -239,7 +245,7 @@ describe('bootstrap runCli', () => {
239
245
  expect(code).toBe(1);
240
246
  expect(writes[0]).toMatchObject({
241
247
  ok: false,
242
- error: expect.objectContaining({ message: expect.stringContaining('unknown-command') })
248
+ error: expect.objectContaining({ message: expect.stringContaining('unknown-command') }),
243
249
  });
244
250
  });
245
251
 
@@ -281,7 +287,7 @@ describe('bootstrap runCli', () => {
281
287
 
282
288
  it('GIVEN_ensureLoaded_throws_WHEN_run_command_executed_THEN_returns_exit_code_1', async () => {
283
289
  ensureLoadedMock.mockRejectedValueOnce(
284
- Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' })
290
+ Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' }),
285
291
  );
286
292
 
287
293
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -289,7 +295,10 @@ describe('bootstrap runCli', () => {
289
295
 
290
296
  const writes = asJsonWrites(stdoutSpy);
291
297
  expect(code).toBe(1);
292
- expect(writes[0]).toMatchObject({ ok: false, error: expect.objectContaining({ message: 'config load failed' }) });
298
+ expect(writes[0]).toMatchObject({
299
+ ok: false,
300
+ error: expect.objectContaining({ message: 'config load failed' }),
301
+ });
293
302
  });
294
303
 
295
304
  it('GIVEN_project_flag_with_no_multi_project_yaml_WHEN_executed_THEN_returns_exit_code_1', async () => {
@@ -301,7 +310,7 @@ describe('bootstrap runCli', () => {
301
310
  expect(code).toBe(1);
302
311
  expect(writes[0]).toMatchObject({
303
312
  ok: false,
304
- error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') })
313
+ error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') }),
305
314
  });
306
315
  });
307
316
  });
@@ -341,7 +350,7 @@ projects:
341
350
  path: ${proj1}
342
351
  - name: proj2
343
352
  path: ${proj2}
344
- `
353
+ `,
345
354
  );
346
355
 
347
356
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -354,9 +363,9 @@ projects:
354
363
  data: {
355
364
  projects: expect.arrayContaining([
356
365
  expect.objectContaining({ name: 'proj1' }),
357
- expect.objectContaining({ name: 'proj2' })
358
- ])
359
- }
366
+ expect.objectContaining({ name: 'proj2' }),
367
+ ]),
368
+ },
360
369
  });
361
370
  });
362
371
 
@@ -373,20 +382,25 @@ projects:
373
382
  path: ${projGood}
374
383
  - name: proj-bad
375
384
  path: /nonexistent/path/that/will/fail
376
- `
385
+ `,
377
386
  );
378
387
 
379
388
  // First project succeeds, second causes ensureLoaded to fail
380
389
  ensureLoadedMock
381
390
  .mockResolvedValueOnce(undefined)
382
- .mockRejectedValueOnce(Object.assign(new Error('project load error'), { code: 'CONFIG_LOAD_ERROR' }));
391
+ .mockRejectedValueOnce(
392
+ Object.assign(new Error('project load error'), { code: 'CONFIG_LOAD_ERROR' }),
393
+ );
383
394
 
384
395
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
385
396
  const code = await runCli(['status', '--all'], { cwd: tmpDir, env: process.env });
386
397
 
387
398
  const writes = asJsonWrites(stdoutSpy);
388
399
  expect(code).toBe(0);
389
- const aggregate = writes[0] as { ok: boolean; data: { projects: Array<{ name: string; status: unknown }> } };
400
+ const aggregate = writes[0] as {
401
+ ok: boolean;
402
+ data: { projects: Array<{ name: string; status: unknown }> };
403
+ };
390
404
  expect(aggregate.ok).toBe(true);
391
405
  expect(aggregate.data.projects).toHaveLength(2);
392
406
  const badProject = aggregate.data.projects.find((p) => p.name === 'proj-bad');
@@ -417,7 +431,10 @@ describe('bootstrap multi-project selection branches', () => {
417
431
  it('GIVEN_single_project_multi_yaml_WHEN_status_no_project_flag_THEN_auto_selects_only_project', async () => {
418
432
  const proj1 = path.join(tmpDir, 'proj1');
419
433
  await fs.mkdir(proj1, { recursive: true });
420
- await writeMultiProjectYaml(tmpDir, `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`);
434
+ await writeMultiProjectYaml(
435
+ tmpDir,
436
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
437
+ );
421
438
 
422
439
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
423
440
  const code = await runCli(['status'], { cwd: tmpDir, env: process.env });
@@ -431,7 +448,7 @@ describe('bootstrap multi-project selection branches', () => {
431
448
  await fs.mkdir(proj2, { recursive: true });
432
449
  await writeMultiProjectYaml(
433
450
  tmpDir,
434
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
451
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
435
452
  );
436
453
 
437
454
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -447,7 +464,7 @@ describe('bootstrap multi-project selection branches', () => {
447
464
  await fs.mkdir(proj2, { recursive: true });
448
465
  await writeMultiProjectYaml(
449
466
  tmpDir,
450
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n`
467
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n`,
451
468
  );
452
469
 
453
470
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -463,7 +480,7 @@ describe('bootstrap multi-project selection branches', () => {
463
480
  await fs.mkdir(proj2, { recursive: true });
464
481
  await writeMultiProjectYaml(
465
482
  tmpDir,
466
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
483
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
467
484
  );
468
485
 
469
486
  // Mock stdin/stdout to simulate non-TTY environment
@@ -479,17 +496,26 @@ describe('bootstrap multi-project selection branches', () => {
479
496
  expect(code).toBe(1);
480
497
  } finally {
481
498
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
482
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
499
+ Object.defineProperty(process.stdout, 'isTTY', {
500
+ value: origStdoutIsTTY,
501
+ configurable: true,
502
+ });
483
503
  }
484
504
  });
485
505
 
486
506
  it('GIVEN_project_flag_and_project_not_found_WHEN_run_THEN_returns_exit_code_1', async () => {
487
507
  const proj1 = path.join(tmpDir, 'proj1');
488
508
  await fs.mkdir(proj1, { recursive: true });
489
- await writeMultiProjectYaml(tmpDir, `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`);
509
+ await writeMultiProjectYaml(
510
+ tmpDir,
511
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
512
+ );
490
513
 
491
514
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
492
- const code = await runCli(['status', '--project', 'nonexistent'], { cwd: tmpDir, env: process.env });
515
+ const code = await runCli(['status', '--project', 'nonexistent'], {
516
+ cwd: tmpDir,
517
+ env: process.env,
518
+ });
493
519
  expect(code).toBe(1);
494
520
  });
495
521
 
@@ -514,7 +540,7 @@ describe('bootstrap multi-project selection branches', () => {
514
540
  await fs.mkdir(proj2, { recursive: true });
515
541
  await writeMultiProjectYaml(
516
542
  tmpDir,
517
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
543
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
518
544
  );
519
545
 
520
546
  // Simulate TTY and user entering '1' to select first project
@@ -532,7 +558,10 @@ describe('bootstrap multi-project selection branches', () => {
532
558
  expect(readlineQuestionMock).toHaveBeenCalled();
533
559
  } finally {
534
560
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
535
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
561
+ Object.defineProperty(process.stdout, 'isTTY', {
562
+ value: origStdoutIsTTY,
563
+ configurable: true,
564
+ });
536
565
  readlineQuestionMock.mockReset();
537
566
  }
538
567
  });
@@ -544,7 +573,7 @@ describe('bootstrap multi-project selection branches', () => {
544
573
  await fs.mkdir(proj2, { recursive: true });
545
574
  await writeMultiProjectYaml(
546
575
  tmpDir,
547
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
576
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
548
577
  );
549
578
 
550
579
  // Simulate TTY and user entering 'abc' (invalid number)
@@ -561,7 +590,10 @@ describe('bootstrap multi-project selection branches', () => {
561
590
  expect(code).toBe(1);
562
591
  } finally {
563
592
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
564
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
593
+ Object.defineProperty(process.stdout, 'isTTY', {
594
+ value: origStdoutIsTTY,
595
+ configurable: true,
596
+ });
565
597
  readlineQuestionMock.mockReset();
566
598
  }
567
599
  });