agentic-orchestrator 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -6,12 +6,15 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
6
  const runGateModeMock = vi.hoisted(() => vi.fn());
7
7
 
8
8
  vi.mock('../src/core/gates.js', () => ({
9
- runGateMode: runGateModeMock
9
+ runGateMode: runGateModeMock,
10
10
  }));
11
11
 
12
12
  import { GateService } from '../src/application/services/gate-service.js';
13
13
  import type { GateServicePort } from '../src/application/services/gate-service.js';
14
- import { interpolateGateCommands, isIncrementalMode } from '../src/application/services/gate-interpolation-service.js';
14
+ import {
15
+ interpolateGateCommands,
16
+ isIncrementalMode,
17
+ } from '../src/application/services/gate-interpolation-service.js';
15
18
 
16
19
  describe('incremental gate execution', () => {
17
20
  let tempDir: string;
@@ -39,22 +42,36 @@ describe('incremental gate execution', () => {
39
42
  evidence_path: path.join(tempDir, 'evidence.json'),
40
43
  latest_path: path.join(tempDir, 'latest.json'),
41
44
  coverage: null,
42
- thresholds: {}
45
+ thresholds: {},
43
46
  });
44
47
 
45
48
  const profile = {
46
49
  modes: {
47
- full: [{ name: 'test_full', cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'], timeout_seconds: 60 }]
50
+ full: [
51
+ {
52
+ name: 'test_full',
53
+ cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'],
54
+ timeout_seconds: 60,
55
+ },
56
+ ],
48
57
  },
49
- thresholds: {}
58
+ thresholds: {},
50
59
  };
51
60
 
52
61
  const port: GateServicePort = buildPort(tempDir, { profiles: { default: profile } });
53
62
  const service = new GateService(port);
54
63
  await service.gatesRun('feature-abc', 'default', 'full');
55
64
 
56
- const callArgs = runGateModeMock.mock.calls[0][0] as { profile: { modes: { full: Array<{ cmd: string[] }> } } };
57
- expect(callArgs.profile.modes.full[0].cmd).toEqual(['npx', 'vitest', 'run', '--changed', '{base_branch}']);
65
+ const callArgs = runGateModeMock.mock.calls[0][0] as {
66
+ profile: { modes: { full: Array<{ cmd: string[] }> } };
67
+ };
68
+ expect(callArgs.profile.modes.full[0].cmd).toEqual([
69
+ 'npx',
70
+ 'vitest',
71
+ 'run',
72
+ '--changed',
73
+ '{base_branch}',
74
+ ]);
58
75
  });
59
76
 
60
77
  it('GIVEN feature_id in command WHEN interpolateGateCommands called THEN feature_id substituted correctly', () => {
@@ -78,7 +95,11 @@ describe('incremental gate execution', () => {
78
95
  it('GIVEN gate run in fast mode with base_branch command WHEN GateService runs THEN command has base_branch interpolated', async () => {
79
96
  const evidenceFile = path.join(tempDir, 'gate-fast-123.json');
80
97
  const latestFile = path.join(tempDir, 'latest-fast.json');
81
- const initialEvidence = JSON.stringify({ feature_id: 'feature-123', mode: 'fast', overall: 'pass' });
98
+ const initialEvidence = JSON.stringify({
99
+ feature_id: 'feature-123',
100
+ mode: 'fast',
101
+ overall: 'pass',
102
+ });
82
103
  await fs.writeFile(evidenceFile, initialEvidence, 'utf8');
83
104
  await fs.writeFile(latestFile, initialEvidence, 'utf8');
84
105
 
@@ -88,14 +109,20 @@ describe('incremental gate execution', () => {
88
109
  evidence_path: evidenceFile,
89
110
  latest_path: latestFile,
90
111
  coverage: null,
91
- thresholds: {}
112
+ thresholds: {},
92
113
  });
93
114
 
94
115
  const profile = {
95
116
  modes: {
96
- fast: [{ name: 'test_incremental', cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'], timeout_seconds: 60 }]
117
+ fast: [
118
+ {
119
+ name: 'test_incremental',
120
+ cmd: ['npx', 'vitest', 'run', '--changed', '{base_branch}'],
121
+ timeout_seconds: 60,
122
+ },
123
+ ],
97
124
  },
98
- thresholds: {}
125
+ thresholds: {},
99
126
  };
100
127
 
101
128
  const port: GateServicePort = buildPort(tempDir, { profiles: { default: profile } });
@@ -103,11 +130,22 @@ describe('incremental gate execution', () => {
103
130
  await service.gatesRun('feature-123', 'default', 'fast');
104
131
 
105
132
  expect(runGateModeMock).toHaveBeenCalledOnce();
106
- const callArgs = runGateModeMock.mock.calls[0][0] as { profile: { modes: { fast: Array<{ cmd: string[] }> } } };
107
- expect(callArgs.profile.modes.fast[0].cmd).toEqual(['npx', 'vitest', 'run', '--changed', 'main']);
133
+ const callArgs = runGateModeMock.mock.calls[0][0] as {
134
+ profile: { modes: { fast: Array<{ cmd: string[] }> } };
135
+ };
136
+ expect(callArgs.profile.modes.fast[0].cmd).toEqual([
137
+ 'npx',
138
+ 'vitest',
139
+ 'run',
140
+ '--changed',
141
+ 'main',
142
+ ]);
108
143
 
109
144
  // Verify evidence files were augmented with incremental metadata
110
- const updatedEvidence = JSON.parse(await fs.readFile(evidenceFile, 'utf8')) as Record<string, unknown>;
145
+ const updatedEvidence = JSON.parse(await fs.readFile(evidenceFile, 'utf8')) as Record<
146
+ string,
147
+ unknown
148
+ >;
111
149
  expect(updatedEvidence['skipped_reason']).toBe('incremental_mode');
112
150
  expect(updatedEvidence['base_branch']).toBe('main');
113
151
  });
@@ -122,16 +160,17 @@ function buildPort(tempDir: string, gatesConfig: Record<string, unknown>): GateS
122
160
  execution: {
123
161
  retry_policy: { transient_max_retries: 0, transient_error_codes: [] },
124
162
  env_allowlist: [],
125
- default_step_timeout_seconds: 60
163
+ default_step_timeout_seconds: 60,
126
164
  },
127
- testing: { coverage: { minimums: { line: 0, branch: 0 }, targets: { line: 1, branch: 1 } } }
128
- }),
129
- readState: (_featureId: string) => Promise.resolve({
130
- frontMatter: { status: 'building', version: 1, gate_profile: 'default', gates: {} }
165
+ testing: { coverage: { minimums: { line: 0, branch: 0 }, targets: { line: 1, branch: 1 } } },
131
166
  }),
167
+ readState: (_featureId: string) =>
168
+ Promise.resolve({
169
+ frontMatter: { status: 'building', version: 1, gate_profile: 'default', gates: {} },
170
+ }),
132
171
  updateState: vi.fn().mockResolvedValue({}),
133
172
  worktreePath: () => tempDir,
134
173
  logsPath: () => tempDir,
135
- evidencePath: () => tempDir
174
+ evidencePath: () => tempDir,
136
175
  };
137
176
  }
@@ -8,13 +8,19 @@ const execFileMock = vi.hoisted(() => vi.fn());
8
8
 
9
9
  vi.mock('node:child_process', () => ({
10
10
  execFile: (...args: unknown[]) => {
11
- const cb = args[args.length - 1] as (err: null | Error, result?: { stdout: string; stderr: string }) => void;
12
- const promise = execFileMock(...args.slice(0, -1)) as Promise<{ stdout: string; stderr: string }>;
11
+ const cb = args[args.length - 1] as (
12
+ err: null | Error,
13
+ result?: { stdout: string; stderr: string },
14
+ ) => void;
15
+ const promise = execFileMock(...args.slice(0, -1)) as Promise<{
16
+ stdout: string;
17
+ stderr: string;
18
+ }>;
13
19
  void promise.then(
14
20
  (result) => cb(null, result),
15
- (err: Error) => cb(err)
21
+ (err: Error) => cb(err),
16
22
  );
17
- }
23
+ },
18
24
  }));
19
25
 
20
26
  import { InitCommandHandler } from '../src/cli/init-command-handler.js';
@@ -46,7 +52,7 @@ describe('InitCommandHandler', () => {
46
52
  await fs.writeFile(
47
53
  path.join(cwd, '.git', 'config'),
48
54
  `[core]\n repositoryformatversion = 0\n[remote "origin"]\n url = https://github.com/example/repo.git\n fetch = +refs/heads/*:refs/remotes/origin/*\n`,
49
- 'utf8'
55
+ 'utf8',
50
56
  );
51
57
 
52
58
  // Mock git symbolic-ref to return origin/main
@@ -57,47 +63,68 @@ describe('InitCommandHandler', () => {
57
63
 
58
64
  expect(result.ok).toBe(true);
59
65
  expect(result.data.command).toBe('init');
60
- expect(result.data.created).toContain('agentic/orchestrator/policy.yaml');
61
- expect(result.data.created).toContain('agentic/orchestrator/gates.yaml');
62
- expect(result.data.created).toContain('agentic/orchestrator/agents.yaml');
63
- expect(result.data.created).toContain('agentic/orchestrator/adapters.yaml');
64
- expect(result.data.created).toContain('agentic/orchestrator/prompts/planner.system.md');
66
+ expect(result.data.created).toContain('config/agentic/orchestrator/policy.yaml');
67
+ expect(result.data.created).toContain('config/agentic/orchestrator/gates.yaml');
68
+ expect(result.data.created).toContain('config/agentic/orchestrator/agents.yaml');
69
+ expect(result.data.created).toContain('config/agentic/orchestrator/adapters.yaml');
70
+ expect(result.data.created).toContain('config/agentic/orchestrator/prompts/planner.system.md');
65
71
  expect(result.data.skipped).toHaveLength(0);
66
72
  expect(result.data.updated).toHaveLength(0);
67
73
  expect(result.data.validation_warnings).toHaveLength(0);
68
74
 
69
75
  // Verify files were created
70
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
76
+ const policyContent = await fs.readFile(
77
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
78
+ 'utf8',
79
+ );
71
80
  expect(policyContent).toContain('base_branch: main');
72
81
  // lean policy does not include advanced fields like testing.framework
73
82
  expect(policyContent).not.toContain('framework: vitest');
74
83
  expect(policyContent).toContain('notifications:');
75
84
 
76
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
85
+ const gatesContent = await fs.readFile(
86
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
87
+ 'utf8',
88
+ );
77
89
  expect(gatesContent).toContain('version: 1');
78
90
  expect(gatesContent).toContain('profiles:');
79
91
 
80
- const agentsContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'agents.yaml'), 'utf8');
92
+ const agentsContent = await fs.readFile(
93
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'agents.yaml'),
94
+ 'utf8',
95
+ );
81
96
  expect(agentsContent).toContain('version: 1');
82
97
  expect(agentsContent).toContain('roles:');
83
98
  expect(agentsContent).toContain('default_provider: custom');
84
99
  expect(agentsContent).toContain('default_model: local-default');
85
100
 
86
- const adaptersContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'adapters.yaml'), 'utf8');
101
+ const adaptersContent = await fs.readFile(
102
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
103
+ 'utf8',
104
+ );
87
105
  expect(adaptersContent).toContain('activity-detector: process-heuristic');
88
106
  expect(adaptersContent).toContain('scm-provider: github');
89
107
 
90
108
  await expect(
91
- fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'prompts', 'planner.system.md'), 'utf8')
109
+ fs.readFile(
110
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'prompts', 'planner.system.md'),
111
+ 'utf8',
112
+ ),
92
113
  ).resolves.toContain('planner');
93
- await expect(fs.stat(path.join(cwd, 'agentic', 'orchestrator', 'schemas'))).rejects.toThrow();
114
+ await expect(
115
+ fs.stat(path.join(cwd, 'config', 'agentic', 'orchestrator', 'schemas')),
116
+ ).rejects.toThrow();
94
117
  });
95
118
 
96
119
  it('GIVEN_existing_config_WHEN_init_without_force_THEN_skips_existing_files', async () => {
97
120
  // Pre-create the orchestrator directory and policy.yaml
98
- const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
121
+ const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
99
122
  await fs.mkdir(orchestratorDir, { recursive: true });
100
- await fs.writeFile(path.join(orchestratorDir, 'policy.yaml'), 'version: 1\n# existing\n', 'utf8');
123
+ await fs.writeFile(
124
+ path.join(orchestratorDir, 'policy.yaml'),
125
+ 'version: 1\n# existing\n',
126
+ 'utf8',
127
+ );
101
128
 
102
129
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
103
130
 
@@ -105,9 +132,9 @@ describe('InitCommandHandler', () => {
105
132
  const result = await handler.execute({ auto: true });
106
133
 
107
134
  expect(result.ok).toBe(true);
108
- expect(result.data.skipped).toContain('agentic/orchestrator/policy.yaml');
109
- expect(result.data.created).not.toContain('agentic/orchestrator/policy.yaml');
110
- expect(result.data.updated).not.toContain('agentic/orchestrator/policy.yaml');
135
+ expect(result.data.skipped).toContain('config/agentic/orchestrator/policy.yaml');
136
+ expect(result.data.created).not.toContain('config/agentic/orchestrator/policy.yaml');
137
+ expect(result.data.updated).not.toContain('config/agentic/orchestrator/policy.yaml');
111
138
 
112
139
  // Verify file was NOT overwritten
113
140
  const content = await fs.readFile(path.join(orchestratorDir, 'policy.yaml'), 'utf8');
@@ -116,9 +143,13 @@ describe('InitCommandHandler', () => {
116
143
 
117
144
  it('GIVEN_existing_config_WHEN_init_with_force_THEN_overwrites_files', async () => {
118
145
  // Pre-create the orchestrator directory and policy.yaml
119
- const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
146
+ const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
120
147
  await fs.mkdir(orchestratorDir, { recursive: true });
121
- await fs.writeFile(path.join(orchestratorDir, 'policy.yaml'), 'version: 1\n# existing\n', 'utf8');
148
+ await fs.writeFile(
149
+ path.join(orchestratorDir, 'policy.yaml'),
150
+ 'version: 1\n# existing\n',
151
+ 'utf8',
152
+ );
122
153
 
123
154
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
124
155
 
@@ -126,8 +157,8 @@ describe('InitCommandHandler', () => {
126
157
  const result = await handler.execute({ auto: true, force: true });
127
158
 
128
159
  expect(result.ok).toBe(true);
129
- expect(result.data.updated).toContain('agentic/orchestrator/policy.yaml');
130
- expect(result.data.skipped).not.toContain('agentic/orchestrator/policy.yaml');
160
+ expect(result.data.updated).toContain('config/agentic/orchestrator/policy.yaml');
161
+ expect(result.data.skipped).not.toContain('config/agentic/orchestrator/policy.yaml');
131
162
 
132
163
  // Verify file WAS overwritten with generated content (lean policy by default)
133
164
  const content = await fs.readFile(path.join(orchestratorDir, 'policy.yaml'), 'utf8');
@@ -144,11 +175,14 @@ describe('InitCommandHandler', () => {
144
175
  const result = await handler.execute({ auto: true });
145
176
 
146
177
  expect(result.ok).toBe(true);
147
- expect(result.data.created).toContain('agentic/orchestrator/policy.yaml');
178
+ expect(result.data.created).toContain('config/agentic/orchestrator/policy.yaml');
148
179
  expect(result.data.validation_warnings).toHaveLength(0);
149
180
 
150
181
  // Should default to main branch
151
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
182
+ const policyContent = await fs.readFile(
183
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
184
+ 'utf8',
185
+ );
152
186
  expect(policyContent).toContain('base_branch: main');
153
187
  });
154
188
 
@@ -156,7 +190,7 @@ describe('InitCommandHandler', () => {
156
190
  await fs.writeFile(
157
191
  path.join(cwd, 'package.json'),
158
192
  JSON.stringify({ devDependencies: { jest: '^29.0.0' } }),
159
- 'utf8'
193
+ 'utf8',
160
194
  );
161
195
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
162
196
 
@@ -164,20 +198,30 @@ describe('InitCommandHandler', () => {
164
198
  const result = await handler.execute({ auto: true });
165
199
 
166
200
  expect(result.ok).toBe(true);
167
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
201
+ const gatesContent = await fs.readFile(
202
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
203
+ 'utf8',
204
+ );
168
205
  expect(gatesContent).toContain('"npx"');
169
206
  expect(gatesContent).toContain('"jest"');
170
207
  });
171
208
 
172
209
  it('GIVEN_pyproject_toml_WHEN_init_THEN_generates_pytest_gate_commands', async () => {
173
- await fs.writeFile(path.join(cwd, 'pyproject.toml'), '[tool.poetry]\nname = "myproject"\n', 'utf8');
210
+ await fs.writeFile(
211
+ path.join(cwd, 'pyproject.toml'),
212
+ '[tool.poetry]\nname = "myproject"\n',
213
+ 'utf8',
214
+ );
174
215
  execFileMock.mockRejectedValue(new Error('not git'));
175
216
 
176
217
  const handler = new InitCommandHandler(cwd);
177
218
  const result = await handler.execute({ auto: true });
178
219
 
179
220
  expect(result.ok).toBe(true);
180
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
221
+ const gatesContent = await fs.readFile(
222
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
223
+ 'utf8',
224
+ );
181
225
  expect(gatesContent).toContain('"pytest"');
182
226
  });
183
227
 
@@ -189,7 +233,10 @@ describe('InitCommandHandler', () => {
189
233
  const result = await handler.execute({ auto: true });
190
234
 
191
235
  expect(result.ok).toBe(true);
192
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
236
+ const gatesContent = await fs.readFile(
237
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
238
+ 'utf8',
239
+ );
193
240
  expect(gatesContent).toContain('"mvn"');
194
241
  });
195
242
 
@@ -201,7 +248,10 @@ describe('InitCommandHandler', () => {
201
248
  const result = await handler.execute({ auto: true });
202
249
 
203
250
  expect(result.ok).toBe(true);
204
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
251
+ const gatesContent = await fs.readFile(
252
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
253
+ 'utf8',
254
+ );
205
255
  expect(gatesContent).toContain('"./gradlew"');
206
256
  });
207
257
 
@@ -210,7 +260,7 @@ describe('InitCommandHandler', () => {
210
260
  await fs.writeFile(
211
261
  path.join(cwd, '.git', 'config'),
212
262
  '[core]\n repositoryformatversion = 0\n',
213
- 'utf8'
263
+ 'utf8',
214
264
  );
215
265
  execFileMock.mockResolvedValue({ stdout: 'origin/develop\n', stderr: '' });
216
266
 
@@ -218,7 +268,10 @@ describe('InitCommandHandler', () => {
218
268
  const result = await handler.execute({ auto: true });
219
269
 
220
270
  expect(result.ok).toBe(true);
221
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
271
+ const policyContent = await fs.readFile(
272
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
273
+ 'utf8',
274
+ );
222
275
  expect(policyContent).toContain('base_branch: develop');
223
276
  });
224
277
 
@@ -231,7 +284,10 @@ describe('InitCommandHandler', () => {
231
284
  const result = await handler.execute({ auto: true });
232
285
 
233
286
  expect(result.ok).toBe(true);
234
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
287
+ const policyContent = await fs.readFile(
288
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
289
+ 'utf8',
290
+ );
235
291
  expect(policyContent).toContain('base_branch: master');
236
292
  });
237
293
 
@@ -261,7 +317,7 @@ describe('InitCommandHandler', () => {
261
317
  '4500',
262
318
  'desktop,slack',
263
319
  'jest',
264
- 'https://hooks.slack.example/webhook'
320
+ 'https://hooks.slack.example/webhook',
265
321
  ]);
266
322
  const handler = new InitCommandHandler(cwd, prompts.factory);
267
323
  const result = await handler.execute({ auto: false });
@@ -270,7 +326,10 @@ describe('InitCommandHandler', () => {
270
326
  expect(prompts.factory).toHaveBeenCalledTimes(1);
271
327
  expect(prompts.close).toHaveBeenCalledTimes(1);
272
328
 
273
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
329
+ const policyContent = await fs.readFile(
330
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
331
+ 'utf8',
332
+ );
274
333
  expect(policyContent).toContain('base_branch: release');
275
334
  expect(policyContent).toContain('max_parallel_gate_runs: 4');
276
335
  expect(policyContent).toContain('port: 4500');
@@ -278,15 +337,24 @@ describe('InitCommandHandler', () => {
278
337
  expect(policyContent).toContain('enabled: true');
279
338
  expect(policyContent).toContain('webhook: "https://hooks.slack.example/webhook"');
280
339
 
281
- const gatesContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'gates.yaml'), 'utf8');
340
+ const gatesContent = await fs.readFile(
341
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'gates.yaml'),
342
+ 'utf8',
343
+ );
282
344
  expect(gatesContent).toContain('"npx"');
283
345
  expect(gatesContent).toContain('"jest"');
284
346
 
285
- const agentsContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'agents.yaml'), 'utf8');
347
+ const agentsContent = await fs.readFile(
348
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'agents.yaml'),
349
+ 'utf8',
350
+ );
286
351
  expect(agentsContent).toContain('default_provider: claude');
287
352
  expect(agentsContent).toContain('default_model: sonnet-4.5');
288
353
 
289
- const adaptersContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'adapters.yaml'), 'utf8');
354
+ const adaptersContent = await fs.readFile(
355
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
356
+ 'utf8',
357
+ );
290
358
  expect(adaptersContent).toContain('activity-detector: claude-jsonl');
291
359
  expect(adaptersContent).toContain('scm-provider: github');
292
360
  });
@@ -306,7 +374,7 @@ describe('InitCommandHandler validation branches', () => {
306
374
  });
307
375
 
308
376
  it('GIVEN_skipped_file_WHEN_validation_loop_runs_THEN_skipped_rel_is_not_validated', async () => {
309
- const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
377
+ const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
310
378
  await fs.mkdir(orchestratorDir, { recursive: true });
311
379
  // Pre-create policy.yaml so it gets skipped (no --force)
312
380
  await fs.writeFile(path.join(orchestratorDir, 'policy.yaml'), '# existing\n', 'utf8');
@@ -317,7 +385,7 @@ describe('InitCommandHandler validation branches', () => {
317
385
 
318
386
  expect(result.ok).toBe(true);
319
387
  // policy.yaml was skipped, so the validation loop skipped it too (no error about it)
320
- expect(result.data.skipped).toContain('agentic/orchestrator/policy.yaml');
388
+ expect(result.data.skipped).toContain('config/agentic/orchestrator/policy.yaml');
321
389
  // Validation warnings should be empty (skipped file is not validated)
322
390
  expect(result.data.validation_warnings).toHaveLength(0);
323
391
  });
@@ -327,7 +395,7 @@ describe('InitCommandHandler validation branches', () => {
327
395
  const { SchemaRegistry } = await import('../src/core/schemas.js');
328
396
  const validateSpy = vi.spyOn(SchemaRegistry.prototype, 'validate').mockResolvedValue({
329
397
  valid: false,
330
- errors: [{ message: 'test-schema-error' } as any]
398
+ errors: [{ message: 'test-schema-error' } as any],
331
399
  });
332
400
 
333
401
  const handler = new InitCommandHandler(cwd);
@@ -342,9 +410,9 @@ describe('InitCommandHandler validation branches', () => {
342
410
  it('GIVEN_schema_registry_throws_WHEN_init_runs_THEN_adds_catch_validation_warning', async () => {
343
411
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
344
412
  const { SchemaRegistry } = await import('../src/core/schemas.js');
345
- const validateSpy = vi.spyOn(SchemaRegistry.prototype, 'validate').mockRejectedValue(
346
- new Error('schema-load-failure')
347
- );
413
+ const validateSpy = vi
414
+ .spyOn(SchemaRegistry.prototype, 'validate')
415
+ .mockRejectedValue(new Error('schema-load-failure'));
348
416
 
349
417
  const handler = new InitCommandHandler(cwd);
350
418
  const result = await handler.execute({ auto: true });
@@ -356,19 +424,27 @@ describe('InitCommandHandler validation branches', () => {
356
424
  });
357
425
 
358
426
  it('GIVEN_skipped_non_policy_files_WHEN_validation_loop_runs_THEN_skipped_rels_are_not_validated', async () => {
359
- const orchestratorDir = path.join(cwd, 'agentic', 'orchestrator');
427
+ const orchestratorDir = path.join(cwd, 'config', 'agentic', 'orchestrator');
360
428
  await fs.mkdir(orchestratorDir, { recursive: true });
361
429
  // Pre-create gates.yaml and agents.yaml so they get skipped (no --force)
362
- await fs.writeFile(path.join(orchestratorDir, 'gates.yaml'), 'version: 1\n# existing gates\n', 'utf8');
363
- await fs.writeFile(path.join(orchestratorDir, 'agents.yaml'), 'version: 1\n# existing agents\n', 'utf8');
430
+ await fs.writeFile(
431
+ path.join(orchestratorDir, 'gates.yaml'),
432
+ 'version: 1\n# existing gates\n',
433
+ 'utf8',
434
+ );
435
+ await fs.writeFile(
436
+ path.join(orchestratorDir, 'agents.yaml'),
437
+ 'version: 1\n# existing agents\n',
438
+ 'utf8',
439
+ );
364
440
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
365
441
 
366
442
  const handler = new InitCommandHandler(cwd);
367
443
  const result = await handler.execute({ auto: true });
368
444
 
369
445
  expect(result.ok).toBe(true);
370
- expect(result.data.skipped).toContain('agentic/orchestrator/gates.yaml');
371
- expect(result.data.skipped).toContain('agentic/orchestrator/agents.yaml');
446
+ expect(result.data.skipped).toContain('config/agentic/orchestrator/gates.yaml');
447
+ expect(result.data.skipped).toContain('config/agentic/orchestrator/agents.yaml');
372
448
  // Skipped files are not validated — no errors from their existing (partial) content
373
449
  expect(result.data.validation_warnings).toHaveLength(0);
374
450
  });
@@ -400,13 +476,16 @@ describe('InitCommandHandler codex activity detector branch', () => {
400
476
  '3',
401
477
  '3000',
402
478
  'none',
403
- 'vitest'
479
+ 'vitest',
404
480
  ]);
405
481
  const handler = new InitCommandHandler(cwd, prompts.factory);
406
482
  const result = await handler.execute({ auto: false });
407
483
 
408
484
  expect(result.ok).toBe(true);
409
- const adaptersContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'adapters.yaml'), 'utf8');
485
+ const adaptersContent = await fs.readFile(
486
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'adapters.yaml'),
487
+ 'utf8',
488
+ );
410
489
  expect(adaptersContent).toContain('activity-detector: codex-rpc');
411
490
  });
412
491
  });
@@ -438,13 +517,16 @@ describe('InitCommandHandler webhook channel branch', () => {
438
517
  '3000',
439
518
  'webhook',
440
519
  'jest',
441
- 'https://example.com/my-webhook'
520
+ 'https://example.com/my-webhook',
442
521
  ]);
443
522
  const handler = new InitCommandHandler(cwd, prompts.factory);
444
523
  const result = await handler.execute({ auto: false });
445
524
 
446
525
  expect(result.ok).toBe(true);
447
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
526
+ const policyContent = await fs.readFile(
527
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
528
+ 'utf8',
529
+ );
448
530
  expect(policyContent).toContain('url: "https://example.com/my-webhook"');
449
531
  });
450
532
  });
@@ -475,13 +557,16 @@ describe('InitCommandHandler parseNotificationChannels none branch', () => {
475
557
  '3',
476
558
  '3000',
477
559
  'none',
478
- 'jest'
560
+ 'jest',
479
561
  ]);
480
562
  const handler = new InitCommandHandler(cwd, prompts.factory);
481
563
  const result = await handler.execute({ auto: false });
482
564
 
483
565
  expect(result.ok).toBe(true);
484
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
566
+ const policyContent = await fs.readFile(
567
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
568
+ 'utf8',
569
+ );
485
570
  expect(policyContent).toContain('notifications:');
486
571
  });
487
572
  });
@@ -505,8 +590,9 @@ describe('InitCommandHandler loadTemplateFiles non-file entry', () => {
505
590
  execFileMock.mockResolvedValue({ stdout: 'origin/main\n', stderr: '' });
506
591
 
507
592
  const readdirSpy = vi.spyOn(fs, 'readdir').mockImplementation(async (dirPath, opts) => {
508
- const originalReaddir = (await vi.importActual<typeof FsPromises>('node:fs/promises')).readdir;
509
- const entries = await (originalReaddir)(dirPath, opts as never);
593
+ const originalReaddir = (await vi.importActual<typeof FsPromises>('node:fs/promises'))
594
+ .readdir;
595
+ const entries = await originalReaddir(dirPath, opts as never);
510
596
  const fakeDir = {
511
597
  name: 'subdir',
512
598
  isFile: () => false,
@@ -517,7 +603,7 @@ describe('InitCommandHandler loadTemplateFiles non-file entry', () => {
517
603
  isSocket: () => false,
518
604
  isSymbolicLink: () => false,
519
605
  parentPath: String(dirPath),
520
- path: String(dirPath)
606
+ path: String(dirPath),
521
607
  };
522
608
  return [...entries, fakeDir] as never;
523
609
  });
@@ -553,16 +639,19 @@ describe('InitCommandHandler parseInteger out-of-range and parseFramework fallba
553
639
  'custom',
554
640
  'local-default',
555
641
  'github',
556
- '0', // out of range (min=1) → parseInteger returns fallback 3
642
+ '0', // out of range (min=1) → parseInteger returns fallback 3
557
643
  '3000',
558
644
  'none',
559
- 'vitest'
645
+ 'vitest',
560
646
  ]);
561
647
  const handler = new InitCommandHandler(cwd, prompts.factory);
562
648
  const result = await handler.execute({ auto: false });
563
649
 
564
650
  expect(result.ok).toBe(true);
565
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
651
+ const policyContent = await fs.readFile(
652
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
653
+ 'utf8',
654
+ );
566
655
  // Falls back to default 3
567
656
  expect(policyContent).toContain('max_parallel_gate_runs: 3');
568
657
  });
@@ -580,7 +669,7 @@ describe('InitCommandHandler parseInteger out-of-range and parseFramework fallba
580
669
  '3',
581
670
  '3000',
582
671
  'none',
583
- 'unknown_framework' // not vitest/jest/pytest/maven/gradle → parseFramework returns fallback
672
+ 'unknown_framework', // not vitest/jest/pytest/maven/gradle → parseFramework returns fallback
584
673
  ]);
585
674
  const handler = new InitCommandHandler(cwd, prompts.factory);
586
675
  const result = await handler.execute({ auto: false });
@@ -611,7 +700,10 @@ describe('InitCommandHandler lean vs advanced policy', () => {
611
700
  expect(result.ok).toBe(true);
612
701
  expect(result.data.validation_warnings).toHaveLength(0);
613
702
 
614
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
703
+ const policyContent = await fs.readFile(
704
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
705
+ 'utf8',
706
+ );
615
707
  // Lean policy contains common controls
616
708
  expect(policyContent).toContain('worktree:');
617
709
  expect(policyContent).toContain('base_branch:');
@@ -638,7 +730,10 @@ describe('InitCommandHandler lean vs advanced policy', () => {
638
730
  expect(result.ok).toBe(true);
639
731
  expect(result.data.validation_warnings).toHaveLength(0);
640
732
 
641
- const policyContent = await fs.readFile(path.join(cwd, 'agentic', 'orchestrator', 'policy.yaml'), 'utf8');
733
+ const policyContent = await fs.readFile(
734
+ path.join(cwd, 'config', 'agentic', 'orchestrator', 'policy.yaml'),
735
+ 'utf8',
736
+ );
642
737
  // Full policy contains advanced controls
643
738
  expect(policyContent).toContain('commit_policy:');
644
739
  expect(policyContent).toContain('patch_policy:');