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
@@ -21,7 +21,7 @@ export function getUnresolvedDeps(dependsOn: string[], mergedFeatures: string[])
21
21
  */
22
22
  export function detectCircularDependency(
23
23
  startId: string,
24
- getDirectDeps: (id: string) => string[]
24
+ getDirectDeps: (id: string) => string[],
25
25
  ): string | null {
26
26
  const visited = new Set<string>();
27
27
  const stack: string[] = [];
@@ -30,11 +30,15 @@ export function detectCircularDependency(
30
30
  if (stack.includes(id)) {
31
31
  return true; // cycle found
32
32
  }
33
- if (visited.has(id)) {return false;}
33
+ if (visited.has(id)) {
34
+ return false;
35
+ }
34
36
  visited.add(id);
35
37
  stack.push(id);
36
38
  for (const dep of getDirectDeps(id)) {
37
- if (dfs(dep)) {return true;}
39
+ if (dfs(dep)) {
40
+ return true;
41
+ }
38
42
  }
39
43
  stack.pop();
40
44
  return false;
@@ -50,7 +54,11 @@ export function detectCircularDependency(
50
54
  /**
51
55
  * Adds (or updates) a feature's entry in `index.dep_blocked`.
52
56
  */
53
- export function addToDepBlocked(index: AnyRecord, featureId: string, unresolvedDeps: string[]): void {
57
+ export function addToDepBlocked(
58
+ index: AnyRecord,
59
+ featureId: string,
60
+ unresolvedDeps: string[],
61
+ ): void {
54
62
  const depBlocked: DepBlockedEntry[] = Array.isArray(index.dep_blocked) ? index.dep_blocked : [];
55
63
  const existing = depBlocked.findIndex((e) => e.feature_id === featureId);
56
64
  const entry: DepBlockedEntry = { feature_id: featureId, depends_on_unresolved: unresolvedDeps };
@@ -127,11 +127,13 @@ function makeEmptySummary(): FeatureDeleteSummary {
127
127
  index_updated: false,
128
128
  locks_released: [],
129
129
  blocked_queue_entries_removed: 0,
130
- runtime_session_assignment_removed: false
130
+ runtime_session_assignment_removed: false,
131
131
  };
132
132
  }
133
133
 
134
- function normalizeFeatureSessions(runtimeSessions: RuntimeSessionsSnapshot): Record<string, unknown> {
134
+ function normalizeFeatureSessions(
135
+ runtimeSessions: RuntimeSessionsSnapshot,
136
+ ): Record<string, unknown> {
135
137
  return runtimeSessions.feature_sessions && typeof runtimeSessions.feature_sessions === 'object'
136
138
  ? (runtimeSessions.feature_sessions as unknown as Record<string, unknown>)
137
139
  : {};
@@ -160,13 +162,16 @@ export class FeatureDeletionService {
160
162
  this.port = port;
161
163
  }
162
164
 
163
- async featureDelete(featureId: string | null, options: DeleteOptions = {}): Promise<FeatureDeleteResult> {
165
+ async featureDelete(
166
+ featureId: string | null,
167
+ options: DeleteOptions = {},
168
+ ): Promise<FeatureDeleteResult> {
164
169
  if (!featureId) {
165
170
  throw {
166
171
  normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'feature_id is required', {
167
172
  retryable: false,
168
- requires_human: true
169
- })
173
+ requires_human: true,
174
+ }),
170
175
  };
171
176
  }
172
177
  if (!isFeatureId(featureId)) {
@@ -175,19 +180,23 @@ export class FeatureDeletionService {
175
180
  feature_id: featureId,
176
181
  expected_pattern: '^[a-z0-9_][a-z0-9_-]*$',
177
182
  retryable: false,
178
- requires_human: true
179
- })
183
+ requires_human: true,
184
+ }),
180
185
  };
181
186
  }
182
187
 
183
188
  const branchMode = readBranchMode(options.removeBranch);
184
189
  if (!branchMode) {
185
190
  throw {
186
- normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'remove_branch must be one of none|safe|force', {
187
- remove_branch: options.removeBranch,
188
- retryable: false,
189
- requires_human: true
190
- })
191
+ normalizedResponse: fail(
192
+ ERROR_CODES.INVALID_ARGUMENT,
193
+ 'remove_branch must be one of none|safe|force',
194
+ {
195
+ remove_branch: options.removeBranch,
196
+ retryable: false,
197
+ requires_human: true,
198
+ },
199
+ ),
191
200
  };
192
201
  }
193
202
 
@@ -196,10 +205,14 @@ export class FeatureDeletionService {
196
205
  const removeWorktree = options.removeWorktree ?? true;
197
206
  if (!dryRun && !confirm) {
198
207
  throw {
199
- normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'confirm must be true when dry_run is false', {
200
- retryable: false,
201
- requires_human: true
202
- })
208
+ normalizedResponse: fail(
209
+ ERROR_CODES.INVALID_ARGUMENT,
210
+ 'confirm must be true when dry_run is false',
211
+ {
212
+ retryable: false,
213
+ requires_human: true,
214
+ },
215
+ ),
203
216
  };
204
217
  }
205
218
 
@@ -214,7 +227,7 @@ export class FeatureDeletionService {
214
227
  qa_test_index_json: await pathExists(path.join(featurePath, 'qa_test_index.json')),
215
228
  decisions_md: await pathExists(path.join(featurePath, 'decisions.md')),
216
229
  logs_dir: await pathExists(path.join(featurePath, 'logs')),
217
- evidence_dir: await pathExists(path.join(featurePath, 'evidence'))
230
+ evidence_dir: await pathExists(path.join(featurePath, 'evidence')),
218
231
  };
219
232
  const featureDirExists = await pathExists(featurePath);
220
233
  const worktreeExists = await pathExists(worktreePath);
@@ -227,34 +240,40 @@ export class FeatureDeletionService {
227
240
  const runtimeSessions = await this.port.readRunLease();
228
241
  if (this.hasFreshRunLease(runtimeSessions)) {
229
242
  throw {
230
- normalizedResponse: fail(ERROR_CODES.RUN_ALREADY_ACTIVE, 'Cannot delete feature while a run lease is active', {
231
- active_run_id: runtimeSessions.run_id,
232
- owner_instance_id: runtimeSessions.owner_instance_id,
233
- lease_expires_at: runtimeSessions.lease_expires_at,
234
- stale: false,
235
- retryable: false,
236
- requires_human: true
237
- })
243
+ normalizedResponse: fail(
244
+ ERROR_CODES.RUN_ALREADY_ACTIVE,
245
+ 'Cannot delete feature while a run lease is active',
246
+ {
247
+ active_run_id: runtimeSessions.run_id,
248
+ owner_instance_id: runtimeSessions.owner_instance_id,
249
+ lease_expires_at: runtimeSessions.lease_expires_at,
250
+ stale: false,
251
+ retryable: false,
252
+ requires_human: true,
253
+ },
254
+ ),
238
255
  };
239
256
  }
240
257
 
241
258
  const blockedQueueEntries = asStringArray(
242
259
  asArray(indexSnapshot.blocked_queue).map((entry) => {
243
260
  const record = asRecord(entry);
244
- return typeof record.feature_id === 'string' && record.feature_id === featureId ? featureId : null;
245
- })
261
+ return typeof record.feature_id === 'string' && record.feature_id === featureId
262
+ ? featureId
263
+ : null;
264
+ }),
246
265
  ).length;
247
266
 
248
267
  const indexMembership = {
249
268
  active: asStringArray(indexSnapshot.active).includes(featureId),
250
269
  blocked: asStringArray(indexSnapshot.blocked).includes(featureId),
251
- merged: asStringArray(indexSnapshot.merged).includes(featureId)
270
+ merged: asStringArray(indexSnapshot.merged).includes(featureId),
252
271
  };
253
272
 
254
273
  const runtimeFeatureSessions = normalizeFeatureSessions(runtimeSessions);
255
274
  const runtimeSessionAssignmentExists = Object.prototype.hasOwnProperty.call(
256
275
  runtimeFeatureSessions,
257
- featureId
276
+ featureId,
258
277
  );
259
278
  const indexHeldLocks = readLockResourcesFromIndex(indexSnapshot, featureId);
260
279
 
@@ -264,14 +283,14 @@ export class FeatureDeletionService {
264
283
  index_membership: indexMembership,
265
284
  locks: {
266
285
  state_held: stateHeldLocks,
267
- index_held_resources: indexHeldLocks
286
+ index_held_resources: indexHeldLocks,
268
287
  },
269
288
  blocked_queue_entries: blockedQueueEntries,
270
289
  runtime_session_assignment_exists: runtimeSessionAssignmentExists,
271
290
  worktree_exists: worktreeExists,
272
291
  branch_exists: branchExists,
273
292
  remove_worktree: removeWorktree,
274
- remove_branch: branchMode
293
+ remove_branch: branchMode,
275
294
  };
276
295
 
277
296
  const summary = makeEmptySummary();
@@ -281,8 +300,8 @@ export class FeatureDeletionService {
281
300
  feature_id: featureId,
282
301
  dry_run: true,
283
302
  plan,
284
- summary
285
- }
303
+ summary,
304
+ },
286
305
  };
287
306
  }
288
307
 
@@ -352,7 +371,8 @@ export class FeatureDeletionService {
352
371
  const featureSessions = normalizeFeatureSessions(currentRunLease);
353
372
  if (Object.prototype.hasOwnProperty.call(featureSessions, featureId)) {
354
373
  delete featureSessions[featureId];
355
- currentRunLease.feature_sessions = featureSessions as RuntimeSessionsSnapshot['feature_sessions'];
374
+ currentRunLease.feature_sessions =
375
+ featureSessions as RuntimeSessionsSnapshot['feature_sessions'];
356
376
  await this.port.writeRunLease(currentRunLease);
357
377
  runtimeSessionRemoved = true;
358
378
  changed = true;
@@ -368,7 +388,7 @@ export class FeatureDeletionService {
368
388
  return {
369
389
  changed,
370
390
  blockedQueueRemoved,
371
- runtimeSessionRemoved
391
+ runtimeSessionRemoved,
372
392
  };
373
393
  });
374
394
 
@@ -382,38 +402,54 @@ export class FeatureDeletionService {
382
402
  }
383
403
 
384
404
  if (removeWorktree && worktreeExists) {
385
- const removeWorktreeResult = await runGit(repoRoot, ['worktree', 'remove', '--force', worktreePath]);
405
+ const removeWorktreeResult = await runGit(repoRoot, [
406
+ 'worktree',
407
+ 'remove',
408
+ '--force',
409
+ worktreePath,
410
+ ]);
386
411
  if (removeWorktreeResult.code !== 0) {
387
412
  throw {
388
- normalizedResponse: fail(ERROR_CODES.GIT_FAILURE, 'Failed to remove feature worktree', {
389
- feature_id: featureId,
390
- stderr: removeWorktreeResult.stderr,
391
- retryable: false,
392
- requires_human: true
393
- }, {
394
- command: ['git', 'worktree', 'remove', '--force', worktreePath],
395
- exit_code: removeWorktreeResult.code
396
- })
413
+ normalizedResponse: fail(
414
+ ERROR_CODES.GIT_FAILURE,
415
+ 'Failed to remove feature worktree',
416
+ {
417
+ feature_id: featureId,
418
+ stderr: removeWorktreeResult.stderr,
419
+ retryable: false,
420
+ requires_human: true,
421
+ },
422
+ {
423
+ command: ['git', 'worktree', 'remove', '--force', worktreePath],
424
+ exit_code: removeWorktreeResult.code,
425
+ },
426
+ ),
397
427
  };
398
428
  }
399
429
  summary.worktree_removed = true;
400
430
  }
401
431
 
402
432
  if (branchMode !== 'none' && branchExists) {
403
- const args = branchMode === 'safe' ? ['branch', '-d', featureId] : ['branch', '-D', featureId];
433
+ const args =
434
+ branchMode === 'safe' ? ['branch', '-d', featureId] : ['branch', '-D', featureId];
404
435
  const removeBranchResult = await runGit(repoRoot, args);
405
436
  if (removeBranchResult.code !== 0) {
406
437
  throw {
407
- normalizedResponse: fail(ERROR_CODES.GIT_FAILURE, 'Failed to remove feature branch', {
408
- feature_id: featureId,
409
- remove_branch: branchMode,
410
- stderr: removeBranchResult.stderr,
411
- retryable: false,
412
- requires_human: true
413
- }, {
414
- command: ['git', ...args],
415
- exit_code: removeBranchResult.code
416
- })
438
+ normalizedResponse: fail(
439
+ ERROR_CODES.GIT_FAILURE,
440
+ 'Failed to remove feature branch',
441
+ {
442
+ feature_id: featureId,
443
+ remove_branch: branchMode,
444
+ stderr: removeBranchResult.stderr,
445
+ retryable: false,
446
+ requires_human: true,
447
+ },
448
+ {
449
+ command: ['git', ...args],
450
+ exit_code: removeBranchResult.code,
451
+ },
452
+ ),
417
453
  };
418
454
  }
419
455
  summary.branch_removed = true;
@@ -425,8 +461,8 @@ export class FeatureDeletionService {
425
461
  dry_run: false,
426
462
  plan,
427
463
  applied: summary,
428
- summary
429
- }
464
+ summary,
465
+ },
430
466
  };
431
467
  }
432
468
 
@@ -52,7 +52,9 @@ export class FeatureLifecycleService {
52
52
  this.port = port;
53
53
  }
54
54
 
55
- async featureDiscoverSpecs(): Promise<{ data: { specs: Array<{ feature_id: string; spec_path: string }> } }> {
55
+ async featureDiscoverSpecs(): Promise<{
56
+ data: { specs: Array<{ feature_id: string; spec_path: string }> };
57
+ }> {
56
58
  const discovered: Array<{ feature_id: string; spec_path: string }> = [];
57
59
  const repoRoot = this.port.getRepoRoot();
58
60
  const featuresDir = this.port.getFeaturesDir();
@@ -70,7 +72,7 @@ export class FeatureLifecycleService {
70
72
  if (await pathExists(specPath)) {
71
73
  discovered.push({
72
74
  feature_id: entry.name,
73
- spec_path: normalizeRepoPathForState(repoRoot, specPath)
75
+ spec_path: normalizeRepoPathForState(repoRoot, specPath),
74
76
  });
75
77
  }
76
78
  }
@@ -86,8 +88,8 @@ export class FeatureLifecycleService {
86
88
  throw {
87
89
  normalizedResponse: fail(ERROR_CODES.INVALID_ARGUMENT, 'feature_id is required', {
88
90
  retryable: false,
89
- requires_human: true
90
- })
91
+ requires_human: true,
92
+ }),
91
93
  };
92
94
  }
93
95
 
@@ -97,7 +99,11 @@ export class FeatureLifecycleService {
97
99
 
98
100
  const stateFileExists = await pathExists(this.port.statePath(featureId));
99
101
  if (!stateFileExists) {
100
- const defaultState = this.port.makeDefaultState(featureId, featureId, worktreeResult.data.worktree_path_abs);
102
+ const defaultState = this.port.makeDefaultState(
103
+ featureId,
104
+ featureId,
105
+ worktreeResult.data.worktree_path_abs,
106
+ );
101
107
  await this.port.writeState(featureId, defaultState, '## Activity\n\nInitialized feature.\n');
102
108
  }
103
109
 
@@ -107,7 +113,7 @@ export class FeatureLifecycleService {
107
113
  feature_id: featureId,
108
114
  version: 1,
109
115
  source_diff_ref: stableHash('empty'),
110
- items: []
116
+ items: [],
111
117
  });
112
118
  }
113
119
 
@@ -124,8 +130,8 @@ export class FeatureLifecycleService {
124
130
  data: {
125
131
  feature_id: featureId,
126
132
  initialized: true,
127
- worktree_path: normalizeRepoPathForState(repoRoot, worktreeResult.data.worktree_path_abs)
128
- }
133
+ worktree_path: normalizeRepoPathForState(repoRoot, worktreeResult.data.worktree_path_abs),
134
+ },
129
135
  };
130
136
  }
131
137
 
@@ -152,15 +158,15 @@ export class FeatureLifecycleService {
152
158
  state: state.data,
153
159
  plan: plan.data.plan,
154
160
  qa_test_index: qaIndex.data,
155
- latest_evidence: evidence.data?.latest ?? null
156
- }
161
+ latest_evidence: evidence.data?.latest ?? null,
162
+ },
157
163
  };
158
164
  }
159
165
 
160
166
  async featureLogAppend(
161
167
  featureId: string,
162
168
  note: string,
163
- context: FeatureContext
169
+ context: FeatureContext,
164
170
  ): Promise<{ data: { feature_id: string; appended: boolean; log_path: string } }> {
165
171
  const repoRoot = this.port.getRepoRoot();
166
172
  const logPath = this.port.decisionsPath(featureId);
@@ -170,8 +176,8 @@ export class FeatureLifecycleService {
170
176
  data: {
171
177
  feature_id: featureId,
172
178
  appended: true,
173
- log_path: normalizeRepoPathForState(repoRoot, logPath)
174
- }
179
+ log_path: normalizeRepoPathForState(repoRoot, logPath),
180
+ },
175
181
  };
176
182
  }
177
183
  }
@@ -14,7 +14,7 @@ type StateReadResult = {
14
14
 
15
15
  type StateUpdater = (
16
16
  frontMatter: AnyRecord,
17
- body: string
17
+ body: string,
18
18
  ) => Promise<{ frontMatter?: AnyRecord; body?: string }>;
19
19
 
20
20
  const LEGAL_TRANSITIONS = {
@@ -24,7 +24,7 @@ const LEGAL_TRANSITIONS = {
24
24
  [STATUS.READY_TO_MERGE]: [STATUS.MERGED, STATUS.BLOCKED, STATUS.READY_TO_MERGE],
25
25
  [STATUS.BLOCKED]: [STATUS.PLANNING, STATUS.BUILDING, STATUS.QA, STATUS.BLOCKED],
26
26
  [STATUS.MERGED]: [STATUS.MERGED],
27
- [STATUS.FAILED]: [STATUS.FAILED, STATUS.BLOCKED]
27
+ [STATUS.FAILED]: [STATUS.FAILED, STATUS.BLOCKED],
28
28
  };
29
29
 
30
30
  function isTransitionLegal(from: string, to: string): boolean {
@@ -53,7 +53,11 @@ export class FeatureStateService {
53
53
  this.port = port;
54
54
  }
55
55
 
56
- async updateState(featureId: string, expectedVersion: number | null, updater: StateUpdater): Promise<AnyRecord> {
56
+ async updateState(
57
+ featureId: string,
58
+ expectedVersion: number | null,
59
+ updater: StateUpdater,
60
+ ): Promise<AnyRecord> {
57
61
  return await this.port.withFeatureLock(featureId, async () => {
58
62
  const current = await this.port.readState(featureId);
59
63
  if (expectedVersion != null && current.frontMatter.version !== expectedVersion) {
@@ -62,8 +66,8 @@ export class FeatureStateService {
62
66
  expected_version: expectedVersion,
63
67
  actual_version: current.frontMatter.version,
64
68
  retryable: true,
65
- requires_human: false
66
- })
69
+ requires_human: false,
70
+ }),
67
71
  };
68
72
  }
69
73
 
@@ -72,17 +76,21 @@ export class FeatureStateService {
72
76
  ...current.frontMatter,
73
77
  ...next.frontMatter,
74
78
  version: readVersion(current.frontMatter) + 1,
75
- last_updated: nowIso()
79
+ last_updated: nowIso(),
76
80
  };
77
81
 
78
82
  if (!isTransitionLegal(current.frontMatter.status, merged.status)) {
79
83
  throw {
80
- normalizedResponse: fail(ERROR_CODES.INVALID_STATUS_TRANSITION, 'illegal state status transition', {
81
- from: current.frontMatter.status,
82
- to: merged.status,
83
- retryable: false,
84
- requires_human: true
85
- })
84
+ normalizedResponse: fail(
85
+ ERROR_CODES.INVALID_STATUS_TRANSITION,
86
+ 'illegal state status transition',
87
+ {
88
+ from: current.frontMatter.status,
89
+ to: merged.status,
90
+ retryable: false,
91
+ requires_human: true,
92
+ },
93
+ ),
86
94
  };
87
95
  }
88
96
 
@@ -91,26 +99,28 @@ export class FeatureStateService {
91
99
  });
92
100
  }
93
101
 
94
- async featureStateGet(featureId: string): Promise<{ data: { front_matter: AnyRecord; body: string } }> {
102
+ async featureStateGet(
103
+ featureId: string,
104
+ ): Promise<{ data: { front_matter: AnyRecord; body: string } }> {
95
105
  const state = await this.port.readState(featureId);
96
106
  return {
97
107
  data: {
98
108
  front_matter: state.frontMatter,
99
- body: state.body
100
- }
109
+ body: state.body,
110
+ },
101
111
  };
102
112
  }
103
113
 
104
114
  async featureStatePatch(
105
115
  featureId: string,
106
116
  expectedVersion: number | null,
107
- patch: AnyRecord | null | undefined
117
+ patch: AnyRecord | null | undefined,
108
118
  ): Promise<{ data: { feature_id: string; version: number; status: string } }> {
109
119
  const updated = await this.updateState(featureId, expectedVersion, (frontMatter, body) => {
110
120
  const nextFront = { ...frontMatter, ...(patch?.front_matter ?? {}) };
111
121
  return Promise.resolve({
112
122
  frontMatter: nextFront,
113
- body: patch?.body ?? body
123
+ body: patch?.body ?? body,
114
124
  });
115
125
  });
116
126
 
@@ -118,8 +128,8 @@ export class FeatureStateService {
118
128
  data: {
119
129
  feature_id: featureId,
120
130
  version: updated.version,
121
- status: updated.status
122
- }
131
+ status: updated.status,
132
+ },
123
133
  };
124
134
  }
125
135
  }
@@ -4,9 +4,14 @@ export interface InterpolationContext {
4
4
  worktree_path?: string;
5
5
  }
6
6
 
7
- export function interpolateGateCommands(commands: string[], context: InterpolationContext): string[] {
7
+ export function interpolateGateCommands(
8
+ commands: string[],
9
+ context: InterpolationContext,
10
+ ): string[] {
8
11
  return commands.map((token) =>
9
- token.replaceAll('{base_branch}', context.base_branch).replaceAll('{feature_id}', context.feature_id)
12
+ token
13
+ .replaceAll('{base_branch}', context.base_branch)
14
+ .replaceAll('{feature_id}', context.feature_id),
10
15
  );
11
16
  }
12
17