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
@@ -8,11 +8,17 @@ import { fileURLToPath } from 'node:url';
8
8
  import YAML from 'yaml';
9
9
  import { SchemaRegistry } from '../core/schemas.js';
10
10
  import { loadComposedPolicy } from '../application/services/policy-loader-service.js';
11
- import { AGENT_PROVIDER_SLOT, SCM_PROVIDER_SLOT, globalAdapterRegistry } from '../application/adapters/adapter-registry.js';
11
+ import { readEnvFileValues, readNonEmptyEnvValue, upsertEnvFileValue } from './env-file.js';
12
+ import {
13
+ AGENT_PROVIDER_SLOT,
14
+ SCM_PROVIDER_SLOT,
15
+ globalAdapterRegistry,
16
+ } from '../application/adapters/adapter-registry.js';
12
17
 
13
18
  const execFileAsync = promisify(execFile);
14
19
  const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
15
20
  const TEMPLATE_ROOT = path.resolve(MODULE_DIR, '../../../../agentic/orchestrator');
21
+ const GENERATED_CONFIG_ROOT = 'config/agentic/orchestrator';
16
22
  const DEFAULT_AGENT_PROVIDER = 'custom';
17
23
  const DEFAULT_AGENT_MODEL = 'local-default';
18
24
  const DEFAULT_SCM_PROVIDER = 'github';
@@ -42,6 +48,8 @@ interface WizardConfig {
42
48
  framework: TestFramework;
43
49
  defaultProvider: string;
44
50
  defaultModel: string;
51
+ providerConfigEnv: string | null;
52
+ providerCredentialBootstrapped: boolean;
45
53
  scmProvider: string;
46
54
  notifications: {
47
55
  desktop: boolean;
@@ -91,7 +99,7 @@ async function detectGitContext(repoRoot: string): Promise<GitContext> {
91
99
  const { stdout } = await execFileAsync(
92
100
  'git',
93
101
  ['-C', repoRoot, 'symbolic-ref', 'refs/remotes/origin/HEAD', '--short'],
94
- { timeout: 3000 }
102
+ { timeout: 3000 },
95
103
  );
96
104
  const ref = stdout.trim();
97
105
  const parts = ref.split('/');
@@ -113,7 +121,7 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
113
121
  : {}),
114
122
  ...(typeof pkg.devDependencies === 'object' && pkg.devDependencies !== null
115
123
  ? (pkg.devDependencies as Record<string, unknown>)
116
- : {})
124
+ : {}),
117
125
  };
118
126
  if ('vitest' in deps) {
119
127
  return 'vitest';
@@ -130,7 +138,7 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
130
138
  ['pyproject.toml', 'pytest'],
131
139
  ['pom.xml', 'maven'],
132
140
  ['build.gradle', 'gradle'],
133
- ['build.gradle.kts', 'gradle']
141
+ ['build.gradle.kts', 'gradle'],
134
142
  ];
135
143
 
136
144
  for (const [file, framework] of buildFileChecks) {
@@ -145,7 +153,10 @@ async function detectTestFramework(repoRoot: string): Promise<TestFramework> {
145
153
  return 'vitest';
146
154
  }
147
155
 
148
- function buildGateCommands(framework: TestFramework): { test: string[]; testWithCoverage: string[] } {
156
+ function buildGateCommands(framework: TestFramework): {
157
+ test: string[];
158
+ testWithCoverage: string[];
159
+ } {
149
160
  switch (framework) {
150
161
  case 'jest':
151
162
  return { test: ['npx', 'jest'], testWithCoverage: ['npx', 'jest', '--coverage'] };
@@ -156,7 +167,10 @@ function buildGateCommands(framework: TestFramework): { test: string[]; testWith
156
167
  case 'gradle':
157
168
  return { test: ['./gradlew', 'test'], testWithCoverage: ['./gradlew', 'check'] };
158
169
  default:
159
- return { test: ['npx', 'vitest', 'run'], testWithCoverage: ['npx', 'vitest', 'run', '--coverage'] };
170
+ return {
171
+ test: ['npx', 'vitest', 'run'],
172
+ testWithCoverage: ['npx', 'vitest', 'run', '--coverage'],
173
+ };
160
174
  }
161
175
  }
162
176
 
@@ -169,7 +183,8 @@ function escapeYamlString(value: string): string {
169
183
  }
170
184
 
171
185
  function generateLeanPolicyYaml(wizard: WizardConfig): string {
172
- const notificationsEnabled = wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
186
+ const notificationsEnabled =
187
+ wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
173
188
  return `version: 1
174
189
  worktree:
175
190
  base_branch: ${wizard.baseBranch}
@@ -196,7 +211,8 @@ notifications:
196
211
  }
197
212
 
198
213
  function generateFullPolicyYaml(context: GitContext, wizard: WizardConfig): string {
199
- const notificationsEnabled = wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
214
+ const notificationsEnabled =
215
+ wizard.notifications.desktop || wizard.notifications.slack || wizard.notifications.webhook;
200
216
  return `version: 1
201
217
  commit_policy:
202
218
  allow_commit: false
@@ -222,7 +238,7 @@ locks:
222
238
  multiplier: 2
223
239
  jitter_ms: 150
224
240
  protected_areas:
225
- - agentic/orchestrator/policy.yaml
241
+ - config/agentic/orchestrator/policy.yaml
226
242
  required_modes:
227
243
  - fast
228
244
  - full
@@ -389,20 +405,22 @@ capabilities:
389
405
  }
390
406
 
391
407
  function generateAgentsYaml(wizard: WizardConfig): string {
408
+ const providerConfigEnvLine = wizard.providerConfigEnv
409
+ ? ` provider_config_env: ${wizard.providerConfigEnv}\n`
410
+ : '';
392
411
  return `version: 1
393
412
  roles:
394
413
  planner:
395
- system_prompt_path: agentic/orchestrator/prompts/planner.system.md
414
+ system_prompt_path: config/agentic/orchestrator/prompts/planner.system.md
396
415
  builder:
397
- system_prompt_path: agentic/orchestrator/prompts/builder.system.md
416
+ system_prompt_path: config/agentic/orchestrator/prompts/builder.system.md
398
417
  qa:
399
- system_prompt_path: agentic/orchestrator/prompts/qa.system.md
418
+ system_prompt_path: config/agentic/orchestrator/prompts/qa.system.md
400
419
  missing_prompt_behavior: ignore
401
420
  runtime:
402
421
  default_provider: ${wizard.defaultProvider}
403
422
  default_model: ${wizard.defaultModel}
404
- provider_config_env: AOP_PROVIDER_CONFIG_ENV
405
- role_provider_overrides: {}
423
+ ${providerConfigEnvLine} role_provider_overrides: {}
406
424
  `;
407
425
  }
408
426
 
@@ -434,26 +452,45 @@ function parseInteger(raw: string, fallback: number, min: number, max: number):
434
452
 
435
453
  function parseFramework(raw: string, fallback: TestFramework): TestFramework {
436
454
  const value = raw.trim().toLowerCase();
437
- if (value === 'vitest' || value === 'jest' || value === 'pytest' || value === 'maven' || value === 'gradle') {
455
+ if (
456
+ value === 'vitest' ||
457
+ value === 'jest' ||
458
+ value === 'pytest' ||
459
+ value === 'maven' ||
460
+ value === 'gradle'
461
+ ) {
438
462
  return value;
439
463
  }
440
464
  return fallback;
441
465
  }
442
466
 
443
- function parseNotificationChannels(raw: string): { desktop: boolean; slack: boolean; webhook: boolean } {
467
+ function parseNotificationChannels(raw: string): {
468
+ desktop: boolean;
469
+ slack: boolean;
470
+ webhook: boolean;
471
+ } {
444
472
  const normalized = raw.trim().toLowerCase();
445
473
  if (!normalized || normalized === 'none') {
446
474
  return { desktop: false, slack: false, webhook: false };
447
475
  }
448
- const channels = new Set(normalized.split(',').map((token) => token.trim()).filter((token) => token.length > 0));
476
+ const channels = new Set(
477
+ normalized
478
+ .split(',')
479
+ .map((token) => token.trim())
480
+ .filter((token) => token.length > 0),
481
+ );
449
482
  return {
450
483
  desktop: channels.has('desktop'),
451
484
  slack: channels.has('slack'),
452
- webhook: channels.has('webhook')
485
+ webhook: channels.has('webhook'),
453
486
  };
454
487
  }
455
488
 
456
- function parseAdapterName(raw: string, supportedNames: ReadonlySet<string>, fallback: string): string {
489
+ function parseAdapterName(
490
+ raw: string,
491
+ supportedNames: ReadonlySet<string>,
492
+ fallback: string,
493
+ ): string {
457
494
  const value = raw.trim();
458
495
  if (supportedNames.has(value)) {
459
496
  return value;
@@ -471,12 +508,35 @@ function resolveActivityDetector(defaultProvider: string): string {
471
508
  return 'process-heuristic';
472
509
  }
473
510
 
474
- async function askWithDefault(prompt: PromptSession, label: string, defaultValue: string): Promise<string> {
511
+ async function askWithDefault(
512
+ prompt: PromptSession,
513
+ label: string,
514
+ defaultValue: string,
515
+ ): Promise<string> {
475
516
  const raw = (await prompt.question(`${label} [${defaultValue}]: `)).trim();
476
517
  return raw.length > 0 ? raw : defaultValue;
477
518
  }
478
519
 
520
+ function parseYesNo(raw: string, fallback: boolean): boolean {
521
+ const normalized = raw.trim().toLowerCase();
522
+ if (normalized === 'yes' || normalized === 'y' || normalized === 'true') {
523
+ return true;
524
+ }
525
+ if (normalized === 'no' || normalized === 'n' || normalized === 'false') {
526
+ return false;
527
+ }
528
+ return fallback;
529
+ }
530
+
531
+ function defaultProviderConfigEnvName(provider: string): string {
532
+ if (provider === 'gemini') {
533
+ return 'GEMINI_API_KEY';
534
+ }
535
+ return 'AOP_PROVIDER_CONFIG_ENV';
536
+ }
537
+
479
538
  async function collectWizardConfig(
539
+ repoRoot: string,
480
540
  defaults: {
481
541
  branch: string;
482
542
  framework: TestFramework;
@@ -484,36 +544,42 @@ async function collectWizardConfig(
484
544
  defaultModel: string;
485
545
  defaultScmProvider: string;
486
546
  },
487
- promptFactory: () => PromptSession
547
+ promptFactory: () => PromptSession,
488
548
  ): Promise<WizardConfig> {
489
549
  const prompt = promptFactory();
490
550
  try {
491
- const supportedProviders = new Set(globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((adapter) => adapter.name));
492
- const supportedScmProviders = new Set(globalAdapterRegistry.list(SCM_PROVIDER_SLOT.name).map((adapter) => adapter.name));
551
+ const envFilePath = path.join(repoRoot, '.env');
552
+ const envFileValues = await readEnvFileValues(envFilePath);
553
+ const supportedProviders = new Set(
554
+ globalAdapterRegistry.list(AGENT_PROVIDER_SLOT.name).map((adapter) => adapter.name),
555
+ );
556
+ const supportedScmProviders = new Set(
557
+ globalAdapterRegistry.list(SCM_PROVIDER_SLOT.name).map((adapter) => adapter.name),
558
+ );
493
559
 
494
560
  const baseBranch = await askWithDefault(prompt, 'Worktree base branch', defaults.branch);
495
561
  const defaultProviderRaw = await askWithDefault(
496
562
  prompt,
497
563
  `Default agent provider (${Array.from(supportedProviders).join('|')})`,
498
- defaults.defaultProvider
564
+ defaults.defaultProvider,
499
565
  );
500
566
  const defaultModel = await askWithDefault(prompt, 'Default model', defaults.defaultModel);
501
567
  const scmProviderRaw = await askWithDefault(
502
568
  prompt,
503
569
  `SCM provider (${Array.from(supportedScmProviders).join('|')})`,
504
- defaults.defaultScmProvider
570
+ defaults.defaultScmProvider,
505
571
  );
506
572
  const maxParallelGateRunsRaw = await askWithDefault(prompt, 'Max parallel gate runs', '3');
507
573
  const dashboardPortRaw = await askWithDefault(prompt, 'Dashboard port', '3000');
508
574
  const channelsRaw = await askWithDefault(
509
575
  prompt,
510
576
  'Notification channels (comma-separated: desktop,slack,webhook,none)',
511
- 'none'
577
+ 'none',
512
578
  );
513
579
  const frameworkRaw = await askWithDefault(
514
580
  prompt,
515
581
  'Test framework (vitest|jest|pytest|maven|gradle)',
516
- defaults.framework
582
+ defaults.framework,
517
583
  );
518
584
 
519
585
  const channels = parseNotificationChannels(channelsRaw);
@@ -527,11 +593,57 @@ async function collectWizardConfig(
527
593
  webhookUrl = (await prompt.question('Webhook URL []: ')).trim();
528
594
  }
529
595
 
596
+ const localCliAnswer = await askWithDefault(
597
+ prompt,
598
+ 'Will you use a local agent CLI (codex/claude-code/kiro-cli/copilot)? (yes/no)',
599
+ 'yes',
600
+ );
601
+ const usesLocalCli = parseYesNo(localCliAnswer, true);
602
+
603
+ let providerConfigEnv: string | null = null;
604
+ let providerCredentialBootstrapped = false;
605
+
606
+ if (!usesLocalCli) {
607
+ const envVarName = await askWithDefault(
608
+ prompt,
609
+ 'Provider config env var name',
610
+ defaultProviderConfigEnvName(defaultProviderRaw),
611
+ );
612
+ const envValue = readNonEmptyEnvValue(envVarName, process.env, envFileValues);
613
+
614
+ if (envValue) {
615
+ providerConfigEnv = envVarName;
616
+ } else {
617
+ output.write(
618
+ `Environment variable "${envVarName}" was not found in process env or ${envFilePath}.\n`,
619
+ );
620
+ let pastedKey = '';
621
+ while (pastedKey.length === 0) {
622
+ pastedKey = (
623
+ await prompt.question('Paste provider key to store in AOP_PROVIDER_CONFIG_ENV: ')
624
+ ).trim();
625
+ }
626
+ await upsertEnvFileValue(envFilePath, 'AOP_PROVIDER_CONFIG_ENV', pastedKey);
627
+ providerConfigEnv = 'AOP_PROVIDER_CONFIG_ENV';
628
+ providerCredentialBootstrapped = true;
629
+ }
630
+ }
631
+
530
632
  return {
531
633
  baseBranch,
532
- defaultProvider: parseAdapterName(defaultProviderRaw, supportedProviders, defaults.defaultProvider),
634
+ defaultProvider: parseAdapterName(
635
+ defaultProviderRaw,
636
+ supportedProviders,
637
+ defaults.defaultProvider,
638
+ ),
533
639
  defaultModel,
534
- scmProvider: parseAdapterName(scmProviderRaw, supportedScmProviders, defaults.defaultScmProvider),
640
+ providerConfigEnv,
641
+ providerCredentialBootstrapped,
642
+ scmProvider: parseAdapterName(
643
+ scmProviderRaw,
644
+ supportedScmProviders,
645
+ defaults.defaultScmProvider,
646
+ ),
535
647
  maxParallelGateRuns: parseInteger(maxParallelGateRunsRaw, 3, 1, 64),
536
648
  dashboardPort: parseInteger(dashboardPortRaw, 3000, 1, 65535),
537
649
  framework: parseFramework(frameworkRaw, defaults.framework),
@@ -540,8 +652,8 @@ async function collectWizardConfig(
540
652
  slack: channels.slack,
541
653
  webhook: channels.webhook,
542
654
  slackWebhook,
543
- webhookUrl
544
- }
655
+ webhookUrl,
656
+ },
545
657
  };
546
658
  } finally {
547
659
  prompt.close();
@@ -550,7 +662,7 @@ async function collectWizardConfig(
550
662
 
551
663
  async function loadTemplateFiles(
552
664
  subdir: 'prompts',
553
- matcher: (filename: string) => boolean
665
+ matcher: (filename: string) => boolean,
554
666
  ): Promise<Array<{ rel: string; content: string }>> {
555
667
  const sourceDir = path.join(TEMPLATE_ROOT, subdir);
556
668
  const entries = await fs.readdir(sourceDir, { withFileTypes: true });
@@ -561,8 +673,8 @@ async function loadTemplateFiles(
561
673
  }
562
674
  const full = path.join(sourceDir, entry.name);
563
675
  templates.push({
564
- rel: `agentic/orchestrator/${subdir}/${entry.name}`,
565
- content: await fs.readFile(full, 'utf8')
676
+ rel: `${GENERATED_CONFIG_ROOT}/${subdir}/${entry.name}`,
677
+ content: await fs.readFile(full, 'utf8'),
566
678
  });
567
679
  }
568
680
  return templates.sort((a, b) => a.rel.localeCompare(b.rel));
@@ -585,6 +697,8 @@ export class InitCommandHandler {
585
697
  baseBranch: gitContext.defaultBranch,
586
698
  defaultProvider: DEFAULT_AGENT_PROVIDER,
587
699
  defaultModel: DEFAULT_AGENT_MODEL,
700
+ providerConfigEnv: null,
701
+ providerCredentialBootstrapped: false,
588
702
  scmProvider: DEFAULT_SCM_PROVIDER,
589
703
  maxParallelGateRuns: 3,
590
704
  dashboardPort: 3000,
@@ -594,21 +708,22 @@ export class InitCommandHandler {
594
708
  slack: false,
595
709
  webhook: false,
596
710
  slackWebhook: '',
597
- webhookUrl: ''
598
- }
711
+ webhookUrl: '',
712
+ },
599
713
  }
600
714
  : await collectWizardConfig(
715
+ this.repoRoot,
601
716
  {
602
717
  branch: gitContext.defaultBranch,
603
718
  framework,
604
719
  defaultProvider: DEFAULT_AGENT_PROVIDER,
605
720
  defaultModel: DEFAULT_AGENT_MODEL,
606
- defaultScmProvider: DEFAULT_SCM_PROVIDER
721
+ defaultScmProvider: DEFAULT_SCM_PROVIDER,
607
722
  },
608
- this.promptFactory
723
+ this.promptFactory,
609
724
  );
610
725
 
611
- const orchestratorDir = path.join(this.repoRoot, 'agentic', 'orchestrator');
726
+ const orchestratorDir = path.join(this.repoRoot, 'config', 'agentic', 'orchestrator');
612
727
  await fs.mkdir(orchestratorDir, { recursive: true });
613
728
 
614
729
  const policyContent = options.advanced_policy
@@ -617,14 +732,16 @@ export class InitCommandHandler {
617
732
 
618
733
  const configFiles: Array<{ rel: string; content: string }> = [
619
734
  {
620
- rel: 'agentic/orchestrator/policy.yaml',
621
- content: policyContent
735
+ rel: `${GENERATED_CONFIG_ROOT}/policy.yaml`,
736
+ content: policyContent,
622
737
  },
623
- { rel: 'agentic/orchestrator/gates.yaml', content: generateGatesYaml(wizard.framework) },
624
- { rel: 'agentic/orchestrator/agents.yaml', content: generateAgentsYaml(wizard) },
625
- { rel: 'agentic/orchestrator/adapters.yaml', content: generateAdaptersYaml(wizard) }
738
+ { rel: `${GENERATED_CONFIG_ROOT}/gates.yaml`, content: generateGatesYaml(wizard.framework) },
739
+ { rel: `${GENERATED_CONFIG_ROOT}/agents.yaml`, content: generateAgentsYaml(wizard) },
740
+ { rel: `${GENERATED_CONFIG_ROOT}/adapters.yaml`, content: generateAdaptersYaml(wizard) },
626
741
  ];
627
- const templateFiles = await loadTemplateFiles('prompts', (filename) => filename.endsWith('.md'));
742
+ const templateFiles = await loadTemplateFiles('prompts', (filename) =>
743
+ filename.endsWith('.md'),
744
+ );
628
745
  const writableFiles = [...configFiles, ...templateFiles];
629
746
 
630
747
  const created: string[] = [];
@@ -660,19 +777,23 @@ export class InitCommandHandler {
660
777
 
661
778
  // Validate policy.yaml via composition loader (merges user policy over bundled defaults
662
779
  // then validates the merged result against the full schema).
663
- const policyRel = 'agentic/orchestrator/policy.yaml';
780
+ const policyRel = `${GENERATED_CONFIG_ROOT}/policy.yaml`;
664
781
  if (!skipped.includes(policyRel)) {
665
782
  try {
666
- await loadComposedPolicy(this.repoRoot, path.join(this.repoRoot, policyRel), schemaRegistry);
783
+ await loadComposedPolicy(
784
+ this.repoRoot,
785
+ path.join(this.repoRoot, policyRel),
786
+ schemaRegistry,
787
+ );
667
788
  } catch (err) {
668
789
  validationWarnings.push(`Failed to validate ${policyRel}: ${String(err)}`);
669
790
  }
670
791
  }
671
792
 
672
793
  const nonPolicyTargets: Array<{ schema: string; rel: string }> = [
673
- { schema: 'gates.schema.json', rel: 'agentic/orchestrator/gates.yaml' },
674
- { schema: 'agents.schema.json', rel: 'agentic/orchestrator/agents.yaml' },
675
- { schema: 'adapters.schema.json', rel: 'agentic/orchestrator/adapters.yaml' }
794
+ { schema: 'gates.schema.json', rel: `${GENERATED_CONFIG_ROOT}/gates.yaml` },
795
+ { schema: 'agents.schema.json', rel: `${GENERATED_CONFIG_ROOT}/agents.yaml` },
796
+ { schema: 'adapters.schema.json', rel: `${GENERATED_CONFIG_ROOT}/adapters.yaml` },
676
797
  ];
677
798
 
678
799
  for (const { schema, rel } of nonPolicyTargets) {
@@ -695,12 +816,17 @@ export class InitCommandHandler {
695
816
  const policyMode = options.advanced_policy ? 'full (advanced)' : 'lean (common controls only)';
696
817
  const nextSteps = [
697
818
  `Generated policy.yaml in ${policyMode} mode`,
698
- 'Review generated files in agentic/orchestrator/{policy,gates,agents,adapters}.yaml',
699
- 'Verify prompts under agentic/orchestrator/prompts/',
700
- 'Run: aop run -fi <spec.md> to start orchestrating features'
819
+ 'Review generated files in config/agentic/orchestrator/{policy,gates,agents,adapters}.yaml',
820
+ 'Verify prompts under config/agentic/orchestrator/prompts/',
821
+ 'Run: aop run -fi <spec.md> to start orchestrating features',
701
822
  ];
702
823
  if (!options.advanced_policy) {
703
- nextSteps.push('To generate a full explicit policy with all advanced controls, re-run: aop init --advanced-policy --force');
824
+ nextSteps.push(
825
+ 'To generate a full explicit policy with all advanced controls, re-run: aop init --advanced-policy --force',
826
+ );
827
+ }
828
+ if (wizard.providerCredentialBootstrapped) {
829
+ nextSteps.push('Stored provider credential in .env as AOP_PROVIDER_CONFIG_ENV.');
704
830
  }
705
831
 
706
832
  return {
@@ -711,8 +837,8 @@ export class InitCommandHandler {
711
837
  updated,
712
838
  skipped,
713
839
  validation_warnings: validationWarnings,
714
- next_steps: nextSteps
715
- }
840
+ next_steps: nextSteps,
841
+ },
716
842
  };
717
843
  }
718
844
  }
@@ -2,13 +2,17 @@ export function printPayload(payload: unknown): void {
2
2
  process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
3
3
  }
4
4
 
5
- export function printError(code: string, message: string, details: Record<string, unknown> = {}): void {
5
+ export function printError(
6
+ code: string,
7
+ message: string,
8
+ details: Record<string, unknown> = {},
9
+ ): void {
6
10
  printPayload({
7
11
  ok: false,
8
12
  error: {
9
13
  code,
10
14
  message,
11
- details
12
- }
15
+ details,
16
+ },
13
17
  });
14
18
  }
@@ -97,15 +97,15 @@ export class ResumeCommandHandler {
97
97
  transport,
98
98
  resumed: false,
99
99
  recovery: recovery.data,
100
- resume_plan: resumePlan
101
- }
100
+ resume_plan: resumePlan,
101
+ },
102
102
  };
103
103
  }
104
104
 
105
105
  const selection = resolveProviderSelection({
106
106
  cli: options as unknown as Record<string, string | undefined>,
107
107
  env,
108
- agentsConfig: kernel.getAgentsConfig()
108
+ agentsConfig: kernel.getAgentsConfig(),
109
109
  });
110
110
 
111
111
  const provider = new NullWorkerProvider(selection);
@@ -114,13 +114,13 @@ export class ResumeCommandHandler {
114
114
  max_parallel_gate_runs: 3,
115
115
  run_id: resumePlan.run_id,
116
116
  owner_instance_id: resumePlan.owner_instance_id,
117
- takeover_stale_run: options.takeover_stale_run
117
+ takeover_stale_run: options.takeover_stale_run,
118
118
  });
119
119
 
120
120
  const startResult = await supervisor.start(
121
121
  resumePlan.features.map((feature) => ({
122
- feature_id: feature.feature_id
123
- }))
122
+ feature_id: feature.feature_id,
123
+ })),
124
124
  );
125
125
 
126
126
  return {
@@ -134,8 +134,8 @@ export class ResumeCommandHandler {
134
134
  runtime_status: startResult.status,
135
135
  run_metadata: startResult.run_metadata,
136
136
  dashboard: startResult.dashboard,
137
- recovery: recovery.data
138
- }
137
+ recovery: recovery.data,
138
+ },
139
139
  };
140
140
  }
141
141
 
@@ -177,7 +177,8 @@ export class ResumeCommandHandler {
177
177
  try {
178
178
  const state = await kernel.featureStateGet(featureId);
179
179
  const frontMatter = asRecord(state.data.front_matter);
180
- const status = typeof frontMatter.status === 'string' ? frontMatter.status : STATUS.PLANNING;
180
+ const status =
181
+ typeof frontMatter.status === 'string' ? frontMatter.status : STATUS.PLANNING;
181
182
  if (isTerminalStatus(status)) {
182
183
  continue;
183
184
  }
@@ -186,7 +187,9 @@ export class ResumeCommandHandler {
186
187
  feature_id: featureId,
187
188
  status,
188
189
  resume_phase: toResumePhase(status),
189
- sources: [...(sourcesByFeature.get(featureId) ?? new Set<string>())].sort((a, b) => a.localeCompare(b))
190
+ sources: [...(sourcesByFeature.get(featureId) ?? new Set<string>())].sort((a, b) =>
191
+ a.localeCompare(b),
192
+ ),
190
193
  });
191
194
  } catch (_error) {
192
195
  // Silently skip features with parse errors
@@ -201,7 +204,8 @@ export class ResumeCommandHandler {
201
204
  return a.feature_id.localeCompare(b.feature_id);
202
205
  });
203
206
 
204
- const resolvedRunId = runtimeSessions.run_id !== 'none' ? runtimeSessions.run_id : fallbackRunId;
207
+ const resolvedRunId =
208
+ runtimeSessions.run_id !== 'none' ? runtimeSessions.run_id : fallbackRunId;
205
209
  const resolvedOwnerInstanceId =
206
210
  runtimeSessions.owner_instance_id !== 'none'
207
211
  ? runtimeSessions.owner_instance_id
@@ -210,11 +214,15 @@ export class ResumeCommandHandler {
210
214
  return {
211
215
  run_id: resolvedRunId,
212
216
  owner_instance_id: resolvedOwnerInstanceId,
213
- features: resumable
217
+ features: resumable,
214
218
  };
215
219
  }
216
220
 
217
- private addSource(sourcesByFeature: Map<string, Set<string>>, featureId: string, source: string): void {
221
+ private addSource(
222
+ sourcesByFeature: Map<string, Set<string>>,
223
+ featureId: string,
224
+ source: string,
225
+ ): void {
218
226
  if (!featureId) {
219
227
  return;
220
228
  }
@@ -41,14 +41,14 @@ export class RetryCommandHandler {
41
41
  if (!featureId) {
42
42
  invalidCliArgs({
43
43
  reason: '--feature-id is required for retry',
44
- expected: '--feature-id <feature_id>'
44
+ expected: '--feature-id <feature_id>',
45
45
  });
46
46
  }
47
47
  if (!isValidFeatureId(featureId)) {
48
48
  invalidCliArgs({
49
49
  reason: 'Invalid --feature-id value',
50
50
  provided: featureId,
51
- expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
51
+ expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
52
52
  });
53
53
  }
54
54
 
@@ -57,7 +57,7 @@ export class RetryCommandHandler {
57
57
  let forcedRetryExecuted = false;
58
58
 
59
59
  const current = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
60
- feature_id: featureId
60
+ feature_id: featureId,
61
61
  });
62
62
  const statePayload = current.data as unknown as RetryFeatureStatePayload;
63
63
 
@@ -70,7 +70,8 @@ export class RetryCommandHandler {
70
70
  ? 'fast'
71
71
  : status === 'qa' || status === 'ready_to_merge'
72
72
  ? 'full'
73
- : status === 'blocked' && statePayload.front_matter.status_reason?.includes('forced_retry:fast')
73
+ : status === 'blocked' &&
74
+ statePayload.front_matter.status_reason?.includes('forced_retry:fast')
74
75
  ? 'fast'
75
76
  : 'full';
76
77
 
@@ -78,14 +79,14 @@ export class RetryCommandHandler {
78
79
  invalidCliArgs({
79
80
  reason: 'Cannot retry a terminal feature status without --force',
80
81
  status,
81
- expected_status: ['building', 'qa', 'ready_to_merge', 'blocked']
82
+ expected_status: ['building', 'qa', 'ready_to_merge', 'blocked'],
82
83
  });
83
84
  }
84
85
 
85
86
  if (force) {
86
87
  const frontMatterPatch: Record<string, unknown> = {
87
88
  gate_retry_count: 0,
88
- last_retry_at: null
89
+ last_retry_at: null,
89
90
  };
90
91
  if (status === 'blocked') {
91
92
  frontMatterPatch.status =
@@ -103,8 +104,8 @@ export class RetryCommandHandler {
103
104
  feature_id: featureId,
104
105
  expected_version: statePayload.front_matter.version,
105
106
  patch: {
106
- front_matter: frontMatterPatch
107
- }
107
+ front_matter: frontMatterPatch,
108
+ },
108
109
  });
109
110
  retryCountReset = true;
110
111
  forcedRetryExecuted = true;
@@ -113,7 +114,7 @@ export class RetryCommandHandler {
113
114
  const gate = await callCliTool(this.toolClient, this.runId, TOOLS.GATES_RUN, {
114
115
  feature_id: featureId,
115
116
  profile: null,
116
- mode: inferredMode
117
+ mode: inferredMode,
117
118
  });
118
119
  const retryExecuted = true;
119
120
  const retryMode = inferredMode;
@@ -128,8 +129,8 @@ export class RetryCommandHandler {
128
129
  retry_executed: retryExecuted,
129
130
  forced_retry_executed: forcedRetryExecuted,
130
131
  retry_mode: retryMode,
131
- retry_outcome: retryOutcome
132
- }
132
+ retry_outcome: retryOutcome,
133
+ },
133
134
  };
134
135
  }
135
136
  }