agentic-orchestrator 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -7,7 +7,11 @@ import type { AppError } from '../providers/providers.js';
7
7
  import type { ToolClient } from '../mcp/tool-client.js';
8
8
  import type { FeatureStatePayload } from './types.js';
9
9
  import { callCliTool } from './tooling.js';
10
- import { canonicalFeatureIdFromPath, isCanonicalSpecPath, isLegacyCanonicalSpecPath } from './spec-utils.js';
10
+ import {
11
+ canonicalFeatureIdFromPath,
12
+ isCanonicalSpecPath,
13
+ isLegacyCanonicalSpecPath,
14
+ } from './spec-utils.js';
11
15
 
12
16
  export class SpecIngestionService {
13
17
  private readonly repoRoot: string;
@@ -26,7 +30,9 @@ export class SpecIngestionService {
26
30
 
27
31
  for (const sourcePath of resolvedPaths) {
28
32
  const canonical = isCanonicalSpecPath(this.repoRoot, sourcePath);
29
- const legacyCanonical = canonical ? null : isLegacyCanonicalSpecPath(this.repoRoot, sourcePath);
33
+ const legacyCanonical = canonical
34
+ ? null
35
+ : isLegacyCanonicalSpecPath(this.repoRoot, sourcePath);
30
36
  let featureId: string;
31
37
  let targetPath: string;
32
38
  if (canonical) {
@@ -59,7 +65,7 @@ export class SpecIngestionService {
59
65
  const sourceContent = await fs.readFile(sourcePath, 'utf8');
60
66
  const sourceHash = stableHash(sourceContent);
61
67
  const state = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_STATE_GET, {
62
- feature_id: featureId
68
+ feature_id: featureId,
63
69
  });
64
70
  const typedState = state.data as unknown as FeatureStatePayload;
65
71
 
@@ -70,16 +76,16 @@ export class SpecIngestionService {
70
76
  front_matter: {
71
77
  source: {
72
78
  path: path.relative(this.repoRoot, sourcePath).replaceAll('\\\\', '/'),
73
- hash: sourceHash
74
- }
75
- }
76
- }
79
+ hash: sourceHash,
80
+ },
81
+ },
82
+ },
77
83
  });
78
84
 
79
85
  items.push({
80
86
  feature_id: featureId,
81
87
  source_path: path.relative(this.repoRoot, sourcePath).replaceAll('\\\\', '/'),
82
- canonical_spec_path: path.relative(this.repoRoot, targetPath).replaceAll('\\\\', '/')
88
+ canonical_spec_path: path.relative(this.repoRoot, targetPath).replaceAll('\\\\', '/'),
83
89
  });
84
90
  }
85
91
 
@@ -82,7 +82,12 @@ export class SpecInputResolver {
82
82
  return markdownFiles;
83
83
  }
84
84
 
85
- const discovered = await callCliTool(this.toolClient, this.runId, TOOLS.FEATURE_DISCOVER_SPECS, {});
85
+ const discovered = await callCliTool(
86
+ this.toolClient,
87
+ this.runId,
88
+ TOOLS.FEATURE_DISCOVER_SPECS,
89
+ {},
90
+ );
86
91
  const specs = (discovered.data as unknown as DiscoveredSpecsPayload).specs ?? [];
87
92
  if (specs.length === 0) {
88
93
  const error = new Error(ERROR_CODES.NO_SPECS_FOUND) as AppError;
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
- import {ERROR_CODES} from '../core/error-codes.js';
3
- import type {AppError} from '../providers/providers.js';
2
+ import { ERROR_CODES } from '../core/error-codes.js';
3
+ import type { AppError } from '../providers/providers.js';
4
4
 
5
5
  export function canonicalFeatureIdFromPath(inputPath: string): string {
6
6
  const basename = path.basename(inputPath);
@@ -1,6 +1,6 @@
1
- import {TOOLS} from '../core/constants.js';
2
- import type {ToolClient} from '../mcp/tool-client.js';
3
- import {callCliTool} from './tooling.js';
1
+ import { TOOLS } from '../core/constants.js';
2
+ import type { ToolClient } from '../mcp/tool-client.js';
3
+ import { callCliTool } from './tooling.js';
4
4
 
5
5
  interface ProjectStatusEntry {
6
6
  name: string;
@@ -55,7 +55,8 @@ function computeFeatureActivity(feature: DashboardFeature): ExtendedActivityStat
55
55
  return feature.activity_state;
56
56
  }
57
57
 
58
- const timestamp = feature.activity_last_event_at ?? feature.last_heartbeat_at ?? feature.last_run_at;
58
+ const timestamp =
59
+ feature.activity_last_event_at ?? feature.last_heartbeat_at ?? feature.last_run_at;
59
60
  if (!timestamp) {
60
61
  return 'unknown';
61
62
  }
@@ -78,8 +79,8 @@ export class StatusCommandHandler {
78
79
  return {
79
80
  ok: true,
80
81
  data: {
81
- projects: options.projectStatuses
82
- }
82
+ projects: options.projectStatuses,
83
+ },
83
84
  };
84
85
  }
85
86
 
@@ -94,9 +95,9 @@ export class StatusCommandHandler {
94
95
  summary: features.map((f) => ({
95
96
  feature_id: f.feature_id,
96
97
  status: f.status ?? 'unknown',
97
- activity: computeFeatureActivity(f)
98
- }))
99
- }
98
+ activity: computeFeatureActivity(f),
99
+ })),
100
+ },
100
101
  };
101
102
  }
102
103
 
@@ -109,9 +110,9 @@ export class StatusCommandHandler {
109
110
  features: rawFeatures.map((f) => ({
110
111
  ...f,
111
112
  activity: computeFeatureActivity(f),
112
- ...(f.pr !== undefined ? { pr_info: f.pr } : {})
113
- }))
114
- }
113
+ ...(f.pr !== undefined ? { pr_info: f.pr } : {}),
114
+ })),
115
+ },
115
116
  };
116
117
  }
117
118
  }
@@ -5,7 +5,7 @@ import { createOperationId, type ToolClient } from '../mcp/tool-client.js';
5
5
  import { withOperationIdIfRequired } from '../application/tools/tool-metadata.js';
6
6
 
7
7
  export function assertOkResponse<TData extends Record<string, unknown>>(
8
- response: ToolResponse<TData>
8
+ response: ToolResponse<TData>,
9
9
  ): OkResponse<TData> {
10
10
  if (!response.ok) {
11
11
  const failed = response as FailResponse;
@@ -21,7 +21,7 @@ export async function callCliTool(
21
21
  toolClient: ToolClient,
22
22
  runId: string,
23
23
  toolName: string,
24
- args: Record<string, unknown>
24
+ args: Record<string, unknown>,
25
25
  ): Promise<OkResponse<Record<string, unknown>>> {
26
26
  const payload = withOperationIdIfRequired(toolName, args, createOperationId);
27
27
 
@@ -29,7 +29,7 @@ export async function callCliTool(
29
29
  run_id: runId,
30
30
  session_id: 'bootstrap:cli',
31
31
  actor_type: 'system',
32
- actor_id: 'cli:system'
32
+ actor_id: 'cli:system',
33
33
  });
34
34
 
35
35
  return assertOkResponse(response);
@@ -10,7 +10,7 @@ export enum CliCommand {
10
10
  Retry = 'retry',
11
11
  Send = 'send',
12
12
  Attach = 'attach',
13
- Help = 'help'
13
+ Help = 'help',
14
14
  }
15
15
 
16
16
  export interface CliOptions {
@@ -41,23 +41,37 @@ function collectPlanFiles(plan: PlanShape): string[] {
41
41
  return [
42
42
  ...(plan.files?.create ?? []),
43
43
  ...(plan.files?.modify ?? []),
44
- ...(plan.files?.delete ?? [])
44
+ ...(plan.files?.delete ?? []),
45
45
  ];
46
46
  }
47
47
 
48
- export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanShape[], policy: PolicyShape): {
48
+ export function detectPlanCollisions(
49
+ candidate: PlanShape,
50
+ acceptedPlans: PlanShape[],
51
+ policy: PolicyShape,
52
+ ): {
49
53
  hasCollisions: boolean;
50
54
  collisions: {
51
55
  files: Array<{ with_feature_id: string; paths: string[] }>;
52
56
  areas: Array<{ with_feature_id: string; overlaps: Array<[string, string]> }>;
53
- contracts: Array<{ with_feature_id: string; contract: string; candidate_mode: string; other_mode: string }>;
57
+ contracts: Array<{
58
+ with_feature_id: string;
59
+ contract: string;
60
+ candidate_mode: string;
61
+ other_mode: string;
62
+ }>;
54
63
  };
55
64
  fingerprint: string | null;
56
65
  } {
57
66
  const collisions = {
58
67
  files: [] as Array<{ with_feature_id: string; paths: string[] }>,
59
68
  areas: [] as Array<{ with_feature_id: string; overlaps: Array<[string, string]> }>,
60
- contracts: [] as Array<{ with_feature_id: string; contract: string; candidate_mode: string; other_mode: string }>
69
+ contracts: [] as Array<{
70
+ with_feature_id: string;
71
+ contract: string;
72
+ candidate_mode: string;
73
+ other_mode: string;
74
+ }>,
61
75
  };
62
76
 
63
77
  const candidateFiles = collectPlanFiles(candidate);
@@ -71,7 +85,7 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
71
85
  if (fileOverlap.length > 0) {
72
86
  collisions.files.push({
73
87
  with_feature_id: plan.feature_id,
74
- paths: fileOverlap
88
+ paths: fileOverlap,
75
89
  });
76
90
  }
77
91
 
@@ -80,12 +94,15 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
80
94
  const protectedAreas = policy.protected_areas ?? [];
81
95
  const relevant = areaOverlap.filter(
82
96
  ([a, b]) =>
83
- exclusives.includes(a) || exclusives.includes(b) || protectedAreas.includes(a) || protectedAreas.includes(b)
97
+ exclusives.includes(a) ||
98
+ exclusives.includes(b) ||
99
+ protectedAreas.includes(a) ||
100
+ protectedAreas.includes(b),
84
101
  );
85
102
  if (relevant.length > 0) {
86
103
  collisions.areas.push({
87
104
  with_feature_id: plan.feature_id,
88
- overlaps: relevant
105
+ overlaps: relevant,
89
106
  });
90
107
  }
91
108
 
@@ -99,7 +116,7 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
99
116
  with_feature_id: plan.feature_id,
100
117
  contract,
101
118
  candidate_mode: candidateMode,
102
- other_mode: otherMode
119
+ other_mode: otherMode,
103
120
  });
104
121
  }
105
122
  }
@@ -110,12 +127,12 @@ export function detectPlanCollisions(candidate: PlanShape, acceptedPlans: PlanSh
110
127
 
111
128
  const fingerprintInput = JSON.stringify({
112
129
  feature_id: candidate.feature_id,
113
- collisions
130
+ collisions,
114
131
  });
115
132
 
116
133
  return {
117
134
  hasCollisions,
118
135
  collisions,
119
- fingerprint: hasCollisions ? stableHash(fingerprintInput) : null
136
+ fingerprint: hasCollisions ? stableHash(fingerprintInput) : null,
120
137
  };
121
138
  }
@@ -8,7 +8,7 @@ export const STATUS = {
8
8
  READY_TO_MERGE: 'ready_to_merge',
9
9
  MERGED: 'merged',
10
10
  FAILED: 'failed',
11
- PAUSED_BUDGET: 'paused_budget'
11
+ PAUSED_BUDGET: 'paused_budget',
12
12
  } as const;
13
13
 
14
14
  export type FeatureStatus = (typeof STATUS)[keyof typeof STATUS];
@@ -17,7 +17,7 @@ export const ROLE_STATUS = {
17
17
  READY: 'ready',
18
18
  RUNNING: 'running',
19
19
  BLOCKED: 'blocked',
20
- DONE: 'done'
20
+ DONE: 'done',
21
21
  } as const;
22
22
 
23
23
  export const TOOLS = {
@@ -53,26 +53,32 @@ export const TOOLS = {
53
53
  COST_RECORD: 'cost.record',
54
54
  COST_GET: 'cost.get',
55
55
  PERFORMANCE_RECORD_OUTCOME: 'performance.record_outcome',
56
- PERFORMANCE_GET_ANALYTICS: 'performance.get_analytics'
56
+ PERFORMANCE_GET_ANALYTICS: 'performance.get_analytics',
57
57
  } as const;
58
58
 
59
59
  export const DEFAULT_CLUSTER = {
60
60
  orchestrator_session_id: 'unknown',
61
61
  planner_session_id: 'unknown',
62
62
  builder_session_id: 'unknown',
63
- qa_session_id: 'unknown'
63
+ qa_session_id: 'unknown',
64
64
  };
65
65
 
66
66
  export const DEFAULT_ROLE_STATUS = {
67
67
  planner: ROLE_STATUS.READY,
68
68
  builder: ROLE_STATUS.READY,
69
- qa: ROLE_STATUS.READY
69
+ qa: ROLE_STATUS.READY,
70
70
  };
71
71
 
72
72
  export const GATE_RESULT = {
73
73
  PASS: 'pass',
74
74
  FAIL: 'fail',
75
- NA: 'na'
75
+ NA: 'na',
76
76
  } as const;
77
77
 
78
- export const ALLOWED_ACTORS = new Set<string>(['orchestrator', 'planner', 'builder', 'qa', 'system']);
78
+ export const ALLOWED_ACTORS = new Set<string>([
79
+ 'orchestrator',
80
+ 'planner',
81
+ 'builder',
82
+ 'qa',
83
+ 'system',
84
+ ]);
@@ -46,7 +46,7 @@ export const ERROR_CODES = {
46
46
  INVALID_ARGUMENT: 'invalid_argument',
47
47
  INTERNAL_ERROR: 'internal_error',
48
48
  DEPENDENCY_UNRESOLVED: 'dependency_unresolved',
49
- DEPENDENCY_CIRCULAR: 'dependency_circular'
49
+ DEPENDENCY_CIRCULAR: 'dependency_circular',
50
50
  } as const;
51
51
 
52
52
  export type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];
@@ -87,7 +87,7 @@ export class FileLockManager {
87
87
  async withFileLock<T>(
88
88
  lockPath: string,
89
89
  operation: () => Promise<T>,
90
- options: FileLockOptions = {}
90
+ options: FileLockOptions = {},
91
91
  ): Promise<T> {
92
92
  const timeoutMs = options.timeoutMs ?? 30_000;
93
93
  const initialBackoffMs = options.initialBackoffMs ?? 30;
@@ -103,10 +103,13 @@ export class FileLockManager {
103
103
  const lockHandle = await fsp.open(
104
104
  lockPath,
105
105
  fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_RDWR,
106
- 0o644
106
+ 0o644,
107
107
  );
108
108
  try {
109
- await lockHandle.writeFile(JSON.stringify({ pid: process.pid, at: new Date().toISOString() }), 'utf8');
109
+ await lockHandle.writeFile(
110
+ JSON.stringify({ pid: process.pid, at: new Date().toISOString() }),
111
+ 'utf8',
112
+ );
110
113
  await lockHandle.sync();
111
114
  } finally {
112
115
  await lockHandle.close();
@@ -144,7 +147,10 @@ export async function pathExists(targetPath: string): Promise<boolean> {
144
147
  return await pathFsAdapter.pathExists(targetPath);
145
148
  }
146
149
 
147
- export async function readJson<T = unknown>(filePath: string, fallback: T | null = null): Promise<T | null> {
150
+ export async function readJson<T = unknown>(
151
+ filePath: string,
152
+ fallback: T | null = null,
153
+ ): Promise<T | null> {
148
154
  return await pathFsAdapter.readJson(filePath, fallback);
149
155
  }
150
156
 
@@ -159,7 +165,7 @@ export async function atomicWriteJson(filePath: string, value: unknown): Promise
159
165
  export async function withFileLock<T>(
160
166
  lockPath: string,
161
167
  operation: () => Promise<T>,
162
- options: FileLockOptions = {}
168
+ options: FileLockOptions = {},
163
169
  ): Promise<T> {
164
170
  return await fileLockManager.withFileLock(lockPath, operation, options);
165
171
  }
@@ -73,7 +73,7 @@ class LcovCoverageParser implements CoverageParserStrategy {
73
73
  return {
74
74
  line: linesFound > 0 ? linesHit / linesFound : 1,
75
75
  branch: branchesFound > 0 ? branchesHit / branchesFound : 1,
76
- details: { linesFound, linesHit, branchesFound, branchesHit }
76
+ details: { linesFound, linesHit, branchesFound, branchesHit },
77
77
  };
78
78
  }
79
79
  }
@@ -103,7 +103,7 @@ class JacocoXmlCoverageParser implements CoverageParserStrategy {
103
103
  return {
104
104
  line: lineCovered + lineMissed > 0 ? lineCovered / (lineCovered + lineMissed) : 1,
105
105
  branch: branchCovered + branchMissed > 0 ? branchCovered / (branchCovered + branchMissed) : 1,
106
- details: { lineMissed, lineCovered, branchMissed, branchCovered }
106
+ details: { lineMissed, lineCovered, branchMissed, branchCovered },
107
107
  };
108
108
  }
109
109
  }
@@ -117,7 +117,7 @@ class CoberturaXmlCoverageParser implements CoverageParserStrategy {
117
117
  return {
118
118
  line: lineRate,
119
119
  branch: branchRate,
120
- details: { lineRate, branchRate }
120
+ details: { lineRate, branchRate },
121
121
  };
122
122
  }
123
123
  }
@@ -145,10 +145,22 @@ export class CoverageParserRegistry {
145
145
  export class CoverageThresholdPolicy {
146
146
  merge(policy: PolicyShape, profileThresholds: Partial<GateThresholds> = {}): GateThresholds {
147
147
  return {
148
- coverage_line_min: Math.max(policy.testing.coverage.minimums.line, profileThresholds.coverage_line_min ?? 0),
149
- coverage_branch_min: Math.max(policy.testing.coverage.minimums.branch, profileThresholds.coverage_branch_min ?? 0),
150
- coverage_line_target: Math.max(policy.testing.coverage.targets.line, profileThresholds.coverage_line_target ?? 0),
151
- coverage_branch_target: Math.max(policy.testing.coverage.targets.branch, profileThresholds.coverage_branch_target ?? 0)
148
+ coverage_line_min: Math.max(
149
+ policy.testing.coverage.minimums.line,
150
+ profileThresholds.coverage_line_min ?? 0,
151
+ ),
152
+ coverage_branch_min: Math.max(
153
+ policy.testing.coverage.minimums.branch,
154
+ profileThresholds.coverage_branch_min ?? 0,
155
+ ),
156
+ coverage_line_target: Math.max(
157
+ policy.testing.coverage.targets.line,
158
+ profileThresholds.coverage_line_target ?? 0,
159
+ ),
160
+ coverage_branch_target: Math.max(
161
+ policy.testing.coverage.targets.branch,
162
+ profileThresholds.coverage_branch_target ?? 0,
163
+ ),
152
164
  };
153
165
  }
154
166
  }
@@ -163,7 +175,10 @@ function pickAllowedEnv(envAllowlist: string[] = []): NodeJS.ProcessEnv {
163
175
  return env;
164
176
  }
165
177
 
166
- export async function parseCoverage(parserConfig: ParserConfig | undefined, worktreePath: string): Promise<CoverageMetrics | null> {
178
+ export async function parseCoverage(
179
+ parserConfig: ParserConfig | undefined,
180
+ worktreePath: string,
181
+ ): Promise<CoverageMetrics | null> {
167
182
  if (!parserConfig || parserConfig.type === 'none') {
168
183
  return null;
169
184
  }
@@ -221,17 +236,25 @@ export class GateExecutionService {
221
236
  env: NodeJS.ProcessEnv;
222
237
  worktreePath: string;
223
238
  logDirectory: string;
224
- }
239
+ },
225
240
  ): Promise<Record<string, unknown>> {
226
- const timeoutSeconds = Number(step.timeout_seconds ?? ctx.policy.execution.default_step_timeout_seconds);
241
+ const timeoutSeconds = Number(
242
+ step.timeout_seconds ?? ctx.policy.execution.default_step_timeout_seconds,
243
+ );
227
244
  const stepLogPath = path.join(
228
245
  ctx.logDirectory,
229
- `${Date.now()}-${ctx.mode}-${step.name.replaceAll(/[^a-zA-Z0-9_-]/g, '_')}.log`
246
+ `${Date.now()}-${ctx.mode}-${step.name.replaceAll(/[^a-zA-Z0-9_-]/g, '_')}.log`,
230
247
  );
231
248
 
232
249
  const retryPolicy = ctx.policy.execution.retry_policy;
233
250
  let attempts = 0;
234
- let lastResult: CommandResult = { code: 1, signal: null, stdout: '', stderr: '', timeout: false };
251
+ let lastResult: CommandResult = {
252
+ code: 1,
253
+ signal: null,
254
+ stdout: '',
255
+ stderr: '',
256
+ timeout: false,
257
+ };
235
258
  const maxAttempts = retryPolicy.transient_max_retries + 1;
236
259
 
237
260
  while (attempts < maxAttempts) {
@@ -239,7 +262,7 @@ export class GateExecutionService {
239
262
  const result = await runCommand(step.cmd[0], step.cmd.slice(1), {
240
263
  cwd: step.cwd ? path.join(ctx.worktreePath, step.cwd) : ctx.worktreePath,
241
264
  env: { ...ctx.env, ...step.env },
242
- timeoutMs: timeoutSeconds * 1000
265
+ timeoutMs: timeoutSeconds * 1000,
243
266
  });
244
267
 
245
268
  lastResult = result;
@@ -252,7 +275,7 @@ export class GateExecutionService {
252
275
  result.stdout,
253
276
  '',
254
277
  '## stderr',
255
- result.stderr
278
+ result.stderr,
256
279
  ].join('\n');
257
280
  await fs.writeFile(stepLogPath, `${logText}\n`, 'utf8');
258
281
 
@@ -272,7 +295,7 @@ export class GateExecutionService {
272
295
  attempts,
273
296
  exit_code: lastResult.code,
274
297
  timeout: lastResult.timeout,
275
- log_path: stepLogPath
298
+ log_path: stepLogPath,
276
299
  };
277
300
  }
278
301
 
@@ -284,7 +307,7 @@ export class GateExecutionService {
284
307
  policy,
285
308
  worktreePath,
286
309
  logDirectory,
287
- evidenceDirectory
310
+ evidenceDirectory,
288
311
  }: {
289
312
  featureId: string;
290
313
  mode: string;
@@ -335,7 +358,7 @@ export class GateExecutionService {
335
358
  skip_reason: 'dependency_failed',
336
359
  parallel_group: step.parallel_group,
337
360
  started_at: nowIso(),
338
- finished_at: nowIso()
361
+ finished_at: nowIso(),
339
362
  });
340
363
  }
341
364
 
@@ -348,13 +371,13 @@ export class GateExecutionService {
348
371
  policy,
349
372
  env,
350
373
  worktreePath,
351
- logDirectory
374
+ logDirectory,
352
375
  });
353
376
  stepResult['parallel_group'] = step.parallel_group;
354
377
  stepResult['started_at'] = startedAt;
355
378
  stepResult['finished_at'] = nowIso();
356
379
  return stepResult;
357
- })
380
+ }),
358
381
  );
359
382
 
360
383
  for (const result of results) {
@@ -379,7 +402,7 @@ export class GateExecutionService {
379
402
  policy,
380
403
  env,
381
404
  worktreePath,
382
- logDirectory
405
+ logDirectory,
383
406
  });
384
407
 
385
408
  stepResults.push({ ...result, started_at: startedAt, finished_at: nowIso() });
@@ -397,14 +420,17 @@ export class GateExecutionService {
397
420
  let coverageStatus = 'na';
398
421
  let coverageFailure: Record<string, unknown> | null = null;
399
422
  if (coverage) {
400
- if (coverage.line < thresholds.coverage_line_min || coverage.branch < thresholds.coverage_branch_min) {
423
+ if (
424
+ coverage.line < thresholds.coverage_line_min ||
425
+ coverage.branch < thresholds.coverage_branch_min
426
+ ) {
401
427
  coverageStatus = 'fail';
402
428
  overall = 'fail';
403
429
  coverageFailure = {
404
430
  line: coverage.line,
405
431
  branch: coverage.branch,
406
432
  min_line: thresholds.coverage_line_min,
407
- min_branch: thresholds.coverage_branch_min
433
+ min_branch: thresholds.coverage_branch_min,
408
434
  };
409
435
  } else {
410
436
  coverageStatus = 'pass';
@@ -421,7 +447,7 @@ export class GateExecutionService {
421
447
  coverage_failure: coverageFailure,
422
448
  thresholds,
423
449
  step_results: stepResults,
424
- finished_at: nowIso()
450
+ finished_at: nowIso(),
425
451
  };
426
452
 
427
453
  const evidencePath = path.join(evidenceDirectory, `gate-${mode}-${Date.now()}.json`);
@@ -436,7 +462,7 @@ export class GateExecutionService {
436
462
  coverage_status: coverageStatus,
437
463
  evidence_path: evidencePath,
438
464
  latest_path: latestPath,
439
- thresholds
465
+ thresholds,
440
466
  };
441
467
  }
442
468
  }
@@ -445,7 +471,7 @@ const defaultCoverageParserRegistry = new CoverageParserRegistry([
445
471
  new LcovCoverageParser(),
446
472
  new JunitXmlCoverageParser(),
447
473
  new JacocoXmlCoverageParser(),
448
- new CoberturaXmlCoverageParser()
474
+ new CoberturaXmlCoverageParser(),
449
475
  ]);
450
476
  const defaultGateExecutionService = new GateExecutionService(new CoverageThresholdPolicy());
451
477
 
@@ -457,7 +483,7 @@ export async function runGateMode({
457
483
  policy,
458
484
  worktreePath,
459
485
  logDirectory,
460
- evidenceDirectory
486
+ evidenceDirectory,
461
487
  }: {
462
488
  featureId: string;
463
489
  mode: string;
@@ -476,6 +502,6 @@ export async function runGateMode({
476
502
  policy,
477
503
  worktreePath,
478
504
  logDirectory,
479
- evidenceDirectory
505
+ evidenceDirectory,
480
506
  });
481
507
  }
@@ -32,7 +32,7 @@ export class NodeCommandRunner implements CommandRunner {
32
32
  child = spawn(cmd, args, {
33
33
  cwd: options.cwd,
34
34
  env: options.env,
35
- stdio: ['pipe', 'pipe', 'pipe']
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
36
  });
37
37
  } catch (err) {
38
38
  return resolve({
@@ -40,7 +40,7 @@ export class NodeCommandRunner implements CommandRunner {
40
40
  signal: null,
41
41
  stdout: '',
42
42
  stderr: (err as Error).message,
43
- timeout: false
43
+ timeout: false,
44
44
  });
45
45
  }
46
46
 
@@ -82,7 +82,7 @@ export class NodeCommandRunner implements CommandRunner {
82
82
  signal,
83
83
  stdout,
84
84
  stderr,
85
- timeout: killedByTimeout
85
+ timeout: killedByTimeout,
86
86
  });
87
87
  });
88
88
  });
@@ -96,7 +96,11 @@ export class NodeGitClient implements GitClient {
96
96
  this.commandRunner = commandRunner;
97
97
  }
98
98
 
99
- async runGit(repoRoot: string, args: string[], options: RunCommandOptions = {}): Promise<CommandResult> {
99
+ async runGit(
100
+ repoRoot: string,
101
+ args: string[],
102
+ options: RunCommandOptions = {},
103
+ ): Promise<CommandResult> {
100
104
  return await this.commandRunner.run('git', args, { ...options, cwd: options.cwd ?? repoRoot });
101
105
  }
102
106
  }
@@ -104,10 +108,18 @@ export class NodeGitClient implements GitClient {
104
108
  export const commandRunner: CommandRunner = new NodeCommandRunner();
105
109
  export const gitClient: GitClient = new NodeGitClient(commandRunner);
106
110
 
107
- export function runCommand(cmd: string, args: string[], options: RunCommandOptions = {}): Promise<CommandResult> {
111
+ export function runCommand(
112
+ cmd: string,
113
+ args: string[],
114
+ options: RunCommandOptions = {},
115
+ ): Promise<CommandResult> {
108
116
  return commandRunner.run(cmd, args, options);
109
117
  }
110
118
 
111
- export async function runGit(repoRoot: string, args: string[], options: RunCommandOptions = {}): Promise<CommandResult> {
119
+ export async function runGit(
120
+ repoRoot: string,
121
+ args: string[],
122
+ options: RunCommandOptions = {},
123
+ ): Promise<CommandResult> {
112
124
  return await gitClient.runGit(repoRoot, args, options);
113
125
  }