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
@@ -51,14 +51,14 @@ export class AttachCommandHandler {
51
51
  if (!featureId) {
52
52
  invalidCliArgs({
53
53
  reason: '<feature_id> is required for attach',
54
- expected: 'aop attach <feature_id>'
54
+ expected: 'aop attach <feature_id>',
55
55
  });
56
56
  }
57
57
  if (!isValidFeatureId(featureId)) {
58
58
  invalidCliArgs({
59
59
  reason: 'Invalid feature id',
60
60
  provided: featureId,
61
- expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
61
+ expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
62
62
  });
63
63
  }
64
64
 
@@ -67,12 +67,12 @@ export class AttachCommandHandler {
67
67
  if (!featureSessions) {
68
68
  invalidCliArgs({
69
69
  reason: `No active session cluster found for ${featureId}`,
70
- feature_id: featureId
70
+ feature_id: featureId,
71
71
  });
72
72
  }
73
73
 
74
74
  const rawState = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
75
- feature_id: featureId
75
+ feature_id: featureId,
76
76
  });
77
77
  const state = rawState.data as unknown as FeatureStatePayload;
78
78
  const status = state.front_matter.status;
@@ -80,7 +80,7 @@ export class AttachCommandHandler {
80
80
  const sessionByRole = {
81
81
  planner: featureSessions.planner_session_id,
82
82
  builder: featureSessions.builder_session_id,
83
- qa: featureSessions.qa_session_id
83
+ qa: featureSessions.qa_session_id,
84
84
  };
85
85
  const selectedSessionId = sessionByRole[role];
86
86
  const sessionId =
@@ -91,7 +91,7 @@ export class AttachCommandHandler {
91
91
  if (!sessionId || sessionId === 'unknown' || sessionId === 'unassigned') {
92
92
  invalidCliArgs({
93
93
  reason: `No attachable session found for ${featureId}`,
94
- feature_id: featureId
94
+ feature_id: featureId,
95
95
  });
96
96
  }
97
97
 
@@ -99,7 +99,7 @@ export class AttachCommandHandler {
99
99
  invalidCliArgs({
100
100
  reason: `Provider ${this.provider.selection.provider} does not support interactive attach`,
101
101
  feature_id: featureId,
102
- provider: this.provider.selection.provider
102
+ provider: this.provider.selection.provider,
103
103
  });
104
104
  }
105
105
 
@@ -113,8 +113,8 @@ export class AttachCommandHandler {
113
113
  status,
114
114
  role,
115
115
  session_id: sessionId,
116
- attached: true
117
- }
116
+ attached: true,
117
+ },
118
118
  };
119
119
  }
120
120
  }
@@ -32,7 +32,7 @@ export class CleanupCommandHandler {
32
32
  runId: string,
33
33
  repoRoot: string,
34
34
  gracePeriodSeconds = DEFAULT_GRACE_PERIOD_SECONDS,
35
- autoAfterMerge = false
35
+ autoAfterMerge = false,
36
36
  ) {
37
37
  this.toolClient = toolClient;
38
38
  this.runId = runId;
@@ -45,7 +45,7 @@ export class CleanupCommandHandler {
45
45
  const runtimeRoot = path.join(this.repoRoot, '.aop', 'runtime');
46
46
  const candidateLeasePaths = [
47
47
  path.join(runtimeRoot, 'default', 'run-lease.json'),
48
- path.join(runtimeRoot, 'run-lease.json')
48
+ path.join(runtimeRoot, 'run-lease.json'),
49
49
  ];
50
50
 
51
51
  try {
@@ -64,7 +64,8 @@ export class CleanupCommandHandler {
64
64
  const raw = await fs.readFile(leasePath, 'utf8');
65
65
  const lease = JSON.parse(raw) as { run_id?: string; lease_expires_at?: string };
66
66
  const runId = typeof lease.run_id === 'string' ? lease.run_id : 'none';
67
- const leaseExpiresAt = typeof lease.lease_expires_at === 'string' ? lease.lease_expires_at : null;
67
+ const leaseExpiresAt =
68
+ typeof lease.lease_expires_at === 'string' ? lease.lease_expires_at : null;
68
69
  const leaseExpiryMs = leaseExpiresAt ? new Date(leaseExpiresAt).getTime() : NaN;
69
70
  if (runId !== 'none' && Number.isFinite(leaseExpiryMs) && leaseExpiryMs > Date.now()) {
70
71
  return false;
@@ -92,7 +93,7 @@ export class CleanupCommandHandler {
92
93
  const allIndexedIds = new Set([
93
94
  ...(indexData.active ?? []),
94
95
  ...(indexData.blocked ?? []),
95
- ...(indexData.merged ?? [])
96
+ ...(indexData.merged ?? []),
96
97
  ]);
97
98
 
98
99
  const eligible: CleanupDetail[] = [];
@@ -103,7 +104,7 @@ export class CleanupCommandHandler {
103
104
  const candidateIds = [
104
105
  ...(indexData.active ?? []),
105
106
  ...(indexData.blocked ?? []),
106
- ...(this.autoAfterMerge ? (indexData.merged ?? []) : [])
107
+ ...(this.autoAfterMerge ? (indexData.merged ?? []) : []),
107
108
  ];
108
109
  for (const featureId of candidateIds) {
109
110
  const statePath = path.join(this.repoRoot, '.aop', 'features', featureId, 'state.md');
@@ -124,7 +125,11 @@ export class CleanupCommandHandler {
124
125
  }
125
126
  skipped.push({ feature_id: featureId, reason: 'not eligible' });
126
127
  } catch {
127
- if (this.autoAfterMerge && (indexData.merged ?? []).includes(featureId) && runLeaseInactive) {
128
+ if (
129
+ this.autoAfterMerge &&
130
+ (indexData.merged ?? []).includes(featureId) &&
131
+ runLeaseInactive
132
+ ) {
128
133
  eligible.push({ feature_id: featureId, reason: 'merged residue with missing state' });
129
134
  continue;
130
135
  }
@@ -154,8 +159,8 @@ export class CleanupCommandHandler {
154
159
  data: {
155
160
  would_clean: eligible,
156
161
  cleaned: [],
157
- skipped
158
- }
162
+ skipped,
163
+ },
159
164
  };
160
165
  }
161
166
 
@@ -170,7 +175,7 @@ export class CleanupCommandHandler {
170
175
  dry_run: false,
171
176
  confirm: true,
172
177
  remove_worktree: true,
173
- remove_branch: 'none'
178
+ remove_branch: 'none',
174
179
  });
175
180
  cleaned.push(item);
176
181
  } catch {
@@ -183,8 +188,8 @@ export class CleanupCommandHandler {
183
188
  data: {
184
189
  would_clean: eligible,
185
190
  cleaned,
186
- skipped: [...skipped, ...failedToClean]
187
- }
191
+ skipped: [...skipped, ...failedToClean],
192
+ },
188
193
  };
189
194
  }
190
195
  }
@@ -23,7 +23,7 @@ export class CliArgumentParser {
23
23
  const rawCommand = isHelpFlag ? CliCommand.Help : isKnownCommand ? first : CliCommand.Run;
24
24
  const tokens = isHelpFlag || isKnownCommand ? rest : argv;
25
25
  const options: CliOptions = {
26
- command: rawCommand ?? CliCommand.Run
26
+ command: rawCommand ?? CliCommand.Run,
27
27
  };
28
28
 
29
29
  for (let index = 0; index < tokens.length; index += 1) {
@@ -159,7 +159,10 @@ export class CliArgumentParser {
159
159
  }
160
160
 
161
161
  if (!token.startsWith('-')) {
162
- if ((options.command === CliCommand.Send || options.command === CliCommand.Attach) && !options.feature_id) {
162
+ if (
163
+ (options.command === CliCommand.Send || options.command === CliCommand.Attach) &&
164
+ !options.feature_id
165
+ ) {
163
166
  options.feature_id = token;
164
167
  continue;
165
168
  }
@@ -184,7 +187,7 @@ export class CliArgumentParser {
184
187
  error.details = {
185
188
  reason: 'Invalid --transport value',
186
189
  provided: option,
187
- expected: ['inprocess', 'mcp']
190
+ expected: ['inprocess', 'mcp'],
188
191
  };
189
192
  throw error;
190
193
  }
@@ -7,17 +7,30 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
7
  const execFileAsync = promisify(execFile);
8
8
 
9
9
  export class DashboardCommandHandler {
10
- async execute(options: { port?: number; foreground?: boolean; dev?: boolean }): Promise<Record<string, unknown>> {
10
+ async execute(options: {
11
+ port?: number;
12
+ foreground?: boolean;
13
+ dev?: boolean;
14
+ }): Promise<Record<string, unknown>> {
11
15
  const port = options.port ?? 3000;
12
16
  const repoRoot = path.resolve(__dirname, '../../../../');
13
17
  const dashboardWorkspace = '@aop/web-dashboard';
14
18
  const devMode = options.dev === true;
15
19
  const foreground = options.foreground === true || devMode;
16
20
 
17
- const env = { ...process.env, PORT: String(port), HOSTNAME: '0.0.0.0', AOP_ROOT: process.cwd() };
21
+ const env = {
22
+ ...process.env,
23
+ PORT: String(port),
24
+ HOSTNAME: '0.0.0.0',
25
+ AOP_ROOT: process.cwd(),
26
+ };
18
27
 
19
28
  if (devMode) {
20
- const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'dev'], { cwd: repoRoot, env, stdio: 'inherit' });
29
+ const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'dev'], {
30
+ cwd: repoRoot,
31
+ env,
32
+ stdio: 'inherit',
33
+ });
21
34
  await new Promise<void>((resolve, reject) => {
22
35
  child.on('close', resolve);
23
36
  child.on('error', reject);
@@ -25,10 +38,17 @@ export class DashboardCommandHandler {
25
38
  return { ok: true, data: { message: 'Dashboard stopped', port, mode: 'dev' } };
26
39
  }
27
40
 
28
- await execFileAsync('npm', ['run', '--workspace', dashboardWorkspace, 'build'], { cwd: repoRoot, env });
41
+ await execFileAsync('npm', ['run', '--workspace', dashboardWorkspace, 'build'], {
42
+ cwd: repoRoot,
43
+ env,
44
+ });
29
45
 
30
46
  if (foreground) {
31
- const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'start'], { cwd: repoRoot, env, stdio: 'inherit' });
47
+ const child = spawn('npm', ['run', '--workspace', dashboardWorkspace, 'start'], {
48
+ cwd: repoRoot,
49
+ env,
50
+ stdio: 'inherit',
51
+ });
32
52
  await new Promise<void>((resolve, reject) => {
33
53
  child.on('close', resolve);
34
54
  child.on('error', reject);
@@ -40,7 +60,7 @@ export class DashboardCommandHandler {
40
60
  cwd: repoRoot,
41
61
  env,
42
62
  detached: true,
43
- stdio: 'ignore'
63
+ stdio: 'ignore',
44
64
  });
45
65
  child.unref();
46
66
  return {
@@ -50,8 +70,8 @@ export class DashboardCommandHandler {
50
70
  port,
51
71
  background: true,
52
72
  built: true,
53
- mode: 'production'
54
- }
73
+ mode: 'production',
74
+ },
55
75
  };
56
76
  }
57
77
  }
@@ -40,14 +40,14 @@ export class DeleteCommandHandler {
40
40
  if (!featureId) {
41
41
  invalidCliArgs({
42
42
  reason: '--feature-id is required for delete',
43
- expected: '--feature-id <feature_id>'
43
+ expected: '--feature-id <feature_id>',
44
44
  });
45
45
  }
46
46
  if (!isValidFeatureId(featureId)) {
47
47
  invalidCliArgs({
48
48
  reason: 'Invalid --feature-id value',
49
49
  provided: featureId,
50
- expected_pattern: '^[a-z0-9_][a-z0-9_-]*$'
50
+ expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
51
51
  });
52
52
  }
53
53
 
@@ -56,14 +56,14 @@ export class DeleteCommandHandler {
56
56
  invalidCliArgs({
57
57
  reason: 'Invalid --remove-branch value',
58
58
  provided: options.remove_branch,
59
- expected: ['none', 'safe', 'force']
59
+ expected: ['none', 'safe', 'force'],
60
60
  });
61
61
  }
62
62
 
63
63
  if (options.yes !== true && options.dry_run === false) {
64
64
  invalidCliArgs({
65
65
  reason: 'Destructive delete requires --yes',
66
- expected: 'Provide --yes or omit --dry-run=false'
66
+ expected: 'Provide --yes or omit --dry-run=false',
67
67
  });
68
68
  }
69
69
 
@@ -76,15 +76,15 @@ export class DeleteCommandHandler {
76
76
  dry_run: dryRun,
77
77
  confirm,
78
78
  remove_worktree: removeWorktree,
79
- remove_branch: removeBranch
79
+ remove_branch: removeBranch,
80
80
  });
81
81
 
82
82
  return {
83
83
  ok: true,
84
84
  data: {
85
85
  command: 'delete',
86
- ...(response.data ?? {})
87
- }
86
+ ...(response.data ?? {}),
87
+ },
88
88
  };
89
89
  }
90
90
  }
@@ -0,0 +1,115 @@
1
+ import fs from 'node:fs/promises';
2
+
3
+ export type EnvFileValues = Record<string, string>;
4
+
5
+ const SAFE_UNQUOTED_ENV_VALUE = /^[A-Za-z0-9_./:@+=-]+$/;
6
+
7
+ function unquoteValue(raw: string): string {
8
+ const trimmed = raw.trim();
9
+ if (
10
+ (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
11
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))
12
+ ) {
13
+ return trimmed.slice(1, -1);
14
+ }
15
+ return trimmed;
16
+ }
17
+
18
+ function parseEnvLine(line: string): { key: string; value: string } | null {
19
+ const trimmed = line.trim();
20
+ if (trimmed.length === 0 || trimmed.startsWith('#')) {
21
+ return null;
22
+ }
23
+
24
+ const normalized = trimmed.startsWith('export ') ? trimmed.slice('export '.length) : trimmed;
25
+ const separatorIndex = normalized.indexOf('=');
26
+ if (separatorIndex <= 0) {
27
+ return null;
28
+ }
29
+
30
+ const key = normalized.slice(0, separatorIndex).trim();
31
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
32
+ return null;
33
+ }
34
+
35
+ const value = normalized.slice(separatorIndex + 1);
36
+ return { key, value: unquoteValue(value) };
37
+ }
38
+
39
+ function formatEnvValue(value: string): string {
40
+ if (SAFE_UNQUOTED_ENV_VALUE.test(value)) {
41
+ return value;
42
+ }
43
+ return JSON.stringify(value);
44
+ }
45
+
46
+ export async function readEnvFileValues(envPath: string): Promise<EnvFileValues> {
47
+ let content: string;
48
+ try {
49
+ content = await fs.readFile(envPath, 'utf8');
50
+ } catch {
51
+ return {};
52
+ }
53
+
54
+ const values: EnvFileValues = {};
55
+ for (const line of content.split(/\r?\n/)) {
56
+ const parsed = parseEnvLine(line);
57
+ if (!parsed) {
58
+ continue;
59
+ }
60
+ values[parsed.key] = parsed.value;
61
+ }
62
+ return values;
63
+ }
64
+
65
+ export function readNonEmptyEnvValue(
66
+ key: string,
67
+ runtimeEnv: NodeJS.ProcessEnv,
68
+ envFileValues: EnvFileValues,
69
+ ): string | null {
70
+ const runtimeValue = runtimeEnv[key];
71
+ if (typeof runtimeValue === 'string' && runtimeValue.trim().length > 0) {
72
+ return runtimeValue;
73
+ }
74
+
75
+ const fileValue = envFileValues[key];
76
+ if (typeof fileValue === 'string' && fileValue.trim().length > 0) {
77
+ return fileValue;
78
+ }
79
+
80
+ return null;
81
+ }
82
+
83
+ export async function upsertEnvFileValue(
84
+ envPath: string,
85
+ key: string,
86
+ value: string,
87
+ ): Promise<void> {
88
+ let content = '';
89
+ try {
90
+ content = await fs.readFile(envPath, 'utf8');
91
+ } catch {
92
+ // create file from scratch
93
+ }
94
+
95
+ const lines = content.length > 0 ? content.split(/\r?\n/) : [];
96
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
97
+ const matcher = new RegExp(`^\\s*(?:export\\s+)?${escapedKey}\\s*=`);
98
+ const nextLine = `${key}=${formatEnvValue(value)}`;
99
+
100
+ let replaced = false;
101
+ for (let index = 0; index < lines.length; index += 1) {
102
+ if (matcher.test(lines[index])) {
103
+ lines[index] = nextLine;
104
+ replaced = true;
105
+ break;
106
+ }
107
+ }
108
+
109
+ if (!replaced) {
110
+ lines.push(nextLine);
111
+ }
112
+
113
+ const normalized = `${lines.join('\n').replace(/\n*$/, '')}\n`;
114
+ await fs.writeFile(envPath, normalized, 'utf8');
115
+ }
@@ -13,15 +13,24 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
13
13
  flags: [
14
14
  { flag: '-fi <PATH>', description: 'Input spec file path' },
15
15
  { flag: '-fl <PATH>', description: 'Input spec folder path' },
16
- { flag: '--batch', description: 'Batch-ingest all specs in the folder (skip already-active features)' },
17
- { flag: '--agent-provider <name>', description: 'Override agent provider (claude, codex, gemini, …)' },
16
+ {
17
+ flag: '--batch',
18
+ description: 'Batch-ingest all specs in the folder (skip already-active features)',
19
+ },
20
+ {
21
+ flag: '--agent-provider <name>',
22
+ description: 'Override agent provider (claude, codex, gemini, …)',
23
+ },
18
24
  { flag: '--agent-model <name>', description: 'Override agent model' },
19
25
  { flag: '--agent-config <PATH>', description: 'Path to agent config file' },
20
- { flag: '--provider-config-env <var>', description: 'Env var name that holds provider API key' },
26
+ {
27
+ flag: '--provider-config-env <var>',
28
+ description: 'Env var name used for API-backed provider auth/config',
29
+ },
21
30
  { flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' },
22
31
  { flag: '--takeover-stale-run', description: 'Take over a stale run lease' },
23
- { flag: '--project <name>', description: 'Select project from multi-project.yaml' }
24
- ]
32
+ { flag: '--project <name>', description: 'Select project from multi-project.yaml' },
33
+ ],
25
34
  },
26
35
  [CliCommand.Status]: {
27
36
  usage: 'aop status [flags]',
@@ -29,8 +38,8 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
29
38
  flags: [
30
39
  { flag: '--summary', description: 'Print a condensed one-line-per-feature summary' },
31
40
  { flag: '--all', description: 'Aggregate status across all projects in multi-project.yaml' },
32
- { flag: '--project <name>', description: 'Scope to a specific project' }
33
- ]
41
+ { flag: '--project <name>', description: 'Scope to a specific project' },
42
+ ],
34
43
  },
35
44
  [CliCommand.Resume]: {
36
45
  usage: 'aop resume [flags]',
@@ -38,12 +47,12 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
38
47
  flags: [
39
48
  { flag: '--feature-id <id>', description: 'Resume a specific feature' },
40
49
  { flag: '--force', description: 'Force-resume even if the feature is not blocked' },
41
- { flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' }
42
- ]
50
+ { flag: '--transport <inprocess|mcp>', description: 'Tool transport layer (default: mcp)' },
51
+ ],
43
52
  },
44
53
  [CliCommand.Stop]: {
45
54
  usage: 'aop stop',
46
- description: 'Signal the running supervisor to stop gracefully.'
55
+ description: 'Signal the running supervisor to stop gracefully.',
47
56
  },
48
57
  [CliCommand.Delete]: {
49
58
  usage: 'aop delete [flags]',
@@ -51,8 +60,8 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
51
60
  flags: [
52
61
  { flag: '--feature-id <id>', description: 'Feature to delete' },
53
62
  { flag: '--all', description: 'Delete all features' },
54
- { flag: '--dry-run', description: 'Preview what would be deleted without making changes' }
55
- ]
63
+ { flag: '--dry-run', description: 'Preview what would be deleted without making changes' },
64
+ ],
56
65
  },
57
66
  [CliCommand.Cleanup]: {
58
67
  usage: 'aop cleanup [flags]',
@@ -61,10 +70,13 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
61
70
  { flag: '--feature-id <id>', description: 'Clean up a specific feature' },
62
71
  { flag: '--all', description: 'Clean up all eligible features' },
63
72
  { flag: '--remove-worktree', description: 'Remove the git worktree after cleanup' },
64
- { flag: '--remove-branch <none|safe|force>', description: 'Branch removal mode after cleanup' },
73
+ {
74
+ flag: '--remove-branch <none|safe|force>',
75
+ description: 'Branch removal mode after cleanup',
76
+ },
65
77
  { flag: '--dry-run', description: 'Preview what would be cleaned without making changes' },
66
- { flag: '--yes', description: 'Skip confirmation prompts' }
67
- ]
78
+ { flag: '--yes', description: 'Skip confirmation prompts' },
79
+ ],
68
80
  },
69
81
  [CliCommand.Init]: {
70
82
  usage: 'aop init [flags]',
@@ -72,8 +84,12 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
72
84
  flags: [
73
85
  { flag: '--auto', description: 'Run non-interactively with defaults' },
74
86
  { flag: '--force', description: 'Overwrite existing configuration' },
75
- { flag: '--advanced-policy', description: 'Generate full explicit policy.yaml with all advanced controls (default: lean policy)' }
76
- ]
87
+ {
88
+ flag: '--advanced-policy',
89
+ description:
90
+ 'Generate full explicit policy.yaml with all advanced controls (default: lean policy)',
91
+ },
92
+ ],
77
93
  },
78
94
  [CliCommand.Dashboard]: {
79
95
  usage: 'aop dashboard [flags]',
@@ -81,37 +97,46 @@ const COMMAND_HELP: Record<CliCommand, CommandHelp> = {
81
97
  flags: [
82
98
  { flag: '--port <number>', description: 'Port to listen on (default: 3000)' },
83
99
  { flag: '--foreground', description: 'Keep the server in the foreground' },
84
- { flag: '--dev', description: 'Start in Next.js dev mode' }
85
- ]
100
+ { flag: '--dev', description: 'Start in Next.js dev mode' },
101
+ ],
86
102
  },
87
103
  [CliCommand.Retry]: {
88
104
  usage: 'aop retry [flags]',
89
105
  description: 'Retry a failed gate or step for a feature.',
90
106
  flags: [
91
107
  { flag: '--feature-id <id>', description: 'Feature to retry' },
92
- { flag: '--force', description: 'Force retry even if the feature is not in a failed state' }
93
- ]
108
+ { flag: '--force', description: 'Force retry even if the feature is not in a failed state' },
109
+ ],
94
110
  },
95
111
  [CliCommand.Send]: {
96
112
  usage: 'aop send <feature-id> <message>',
97
113
  description: 'Send a message to an active agent for a feature.',
98
114
  flags: [
99
- { flag: '--feature-id <id>', description: 'Target feature (can also be the first positional argument)' },
100
- { flag: '--message <text>', description: 'Message to deliver (can also be the remaining positional arguments)' }
101
- ]
115
+ {
116
+ flag: '--feature-id <id>',
117
+ description: 'Target feature (can also be the first positional argument)',
118
+ },
119
+ {
120
+ flag: '--message <text>',
121
+ description: 'Message to deliver (can also be the remaining positional arguments)',
122
+ },
123
+ ],
102
124
  },
103
125
  [CliCommand.Attach]: {
104
126
  usage: 'aop attach <feature-id>',
105
127
  description: 'Attach to the running agent session for a feature (interactive).',
106
128
  flags: [
107
- { flag: '--feature-id <id>', description: 'Feature to attach to (can also be the first positional argument)' }
108
- ]
129
+ {
130
+ flag: '--feature-id <id>',
131
+ description: 'Feature to attach to (can also be the first positional argument)',
132
+ },
133
+ ],
109
134
  },
110
135
  [CliCommand.Help]: {
111
136
  usage: 'aop help [command]',
112
137
  description: 'Show this help text, or detailed help for a specific command.',
113
- flags: [{ flag: '--help, -h', description: 'Can also be used with any command' }]
114
- }
138
+ flags: [{ flag: '--help, -h', description: 'Can also be used with any command' }],
139
+ },
115
140
  };
116
141
 
117
142
  function pad(str: string, width: number): string {
@@ -149,14 +174,18 @@ export class HelpCommandHandler {
149
174
  '',
150
175
  'Usage: aop <command> [flags]',
151
176
  '',
152
- 'Commands:'
177
+ 'Commands:',
153
178
  ];
154
179
 
155
- const commandLines = (Object.entries(COMMAND_HELP) as Array<[CliCommand, CommandHelp]>).map(([cmd, help]) =>
156
- renderCommand(cmd, help)
180
+ const commandLines = (Object.entries(COMMAND_HELP) as Array<[CliCommand, CommandHelp]>).map(
181
+ ([cmd, help]) => renderCommand(cmd, help),
157
182
  );
158
183
 
159
- const footer = ['', 'Run `aop help <command>` for detailed help on any command.', 'Flags: --help, -h'];
184
+ const footer = [
185
+ '',
186
+ 'Run `aop help <command>` for detailed help on any command.',
187
+ 'Flags: --help, -h',
188
+ ];
160
189
 
161
190
  const help = [...header, ...commandLines, ...footer].join('\n');
162
191
  return { ok: true, data: { help } };