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
@@ -4,7 +4,7 @@ import {
4
4
  getUnresolvedDeps,
5
5
  detectCircularDependency,
6
6
  addToDepBlocked,
7
- resolveDepBlocked
7
+ resolveDepBlocked,
8
8
  } from '../src/application/services/dependency-scheduler-service.js';
9
9
  import { makeTempRepo, writeFeatureSpec } from './helpers.js';
10
10
 
@@ -56,20 +56,27 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
56
56
  it('adds a new dep_blocked entry', () => {
57
57
  const index: Record<string, unknown> = { dep_blocked: [] };
58
58
  addToDepBlocked(index, 'feat-child', ['feat-parent']);
59
- expect(index.dep_blocked).toEqual([{ feature_id: 'feat-child', depends_on_unresolved: ['feat-parent'] }]);
59
+ expect(index.dep_blocked).toEqual([
60
+ { feature_id: 'feat-child', depends_on_unresolved: ['feat-parent'] },
61
+ ]);
60
62
  });
61
63
 
62
64
  it('updates existing dep_blocked entry for the same feature', () => {
63
- const index: Record<string, unknown> = { dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-a', 'feat-b'] }] };
65
+ const index: Record<string, unknown> = {
66
+ dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-a', 'feat-b'] }],
67
+ };
64
68
  addToDepBlocked(index, 'feat-child', ['feat-b']);
65
- const entries = index.dep_blocked as Array<{ feature_id: string; depends_on_unresolved: string[] }>;
69
+ const entries = index.dep_blocked as Array<{
70
+ feature_id: string;
71
+ depends_on_unresolved: string[];
72
+ }>;
66
73
  expect(entries).toHaveLength(1);
67
74
  expect(entries[0].depends_on_unresolved).toEqual(['feat-b']);
68
75
  });
69
76
 
70
77
  it('resolveDepBlocked removes entries that are now fully resolved', () => {
71
78
  const index: Record<string, unknown> = {
72
- dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-parent'] }]
79
+ dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-parent'] }],
73
80
  };
74
81
  const promoted = resolveDepBlocked(index, 'feat-parent');
75
82
  expect(promoted).toEqual(['feat-child']);
@@ -78,11 +85,14 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
78
85
 
79
86
  it('resolveDepBlocked reduces unresolved list when multiple deps exist', () => {
80
87
  const index: Record<string, unknown> = {
81
- dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-a', 'feat-b'] }]
88
+ dep_blocked: [{ feature_id: 'feat-child', depends_on_unresolved: ['feat-a', 'feat-b'] }],
82
89
  };
83
90
  const promoted = resolveDepBlocked(index, 'feat-a');
84
91
  expect(promoted).toEqual([]);
85
- const entries = index.dep_blocked as Array<{ feature_id: string; depends_on_unresolved: string[] }>;
92
+ const entries = index.dep_blocked as Array<{
93
+ feature_id: string;
94
+ depends_on_unresolved: string[];
95
+ }>;
86
96
  expect(entries[0].depends_on_unresolved).toEqual(['feat-b']);
87
97
  });
88
98
  });
@@ -98,7 +108,7 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
98
108
  files: { create: [], modify: [], delete: [] },
99
109
  contracts: { openapi: 'none', events: 'none', db: 'none' },
100
110
  acceptance_criteria: ['works'],
101
- gate_profile: 'default'
111
+ gate_profile: 'default',
102
112
  });
103
113
 
104
114
  it('rejects plan when dependency is not merged', async () => {
@@ -111,12 +121,18 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
111
121
 
112
122
  // Set depends_on in feat-child's state
113
123
  await kernel.updateState('feat-child', null, async (fm: Record<string, unknown>) => ({
114
- frontMatter: { ...fm, depends_on: ['feat-parent'] }
124
+ frontMatter: { ...fm, depends_on: ['feat-parent'] },
115
125
  }));
116
126
 
117
- const result = await kernel.invoke('plan.submit', { feature_id: 'feat-child', plan_json: validPlan('feat-child') }, ORCH_CTX);
127
+ const result = await kernel.invoke(
128
+ 'plan.submit',
129
+ { feature_id: 'feat-child', plan_json: validPlan('feat-child') },
130
+ ORCH_CTX,
131
+ );
118
132
  expect(result.ok).toBe(false);
119
- expect((result as { ok: false; error: { code: string } }).error.code).toBe('dependency_unresolved');
133
+ expect((result as { ok: false; error: { code: string } }).error.code).toBe(
134
+ 'dependency_unresolved',
135
+ );
120
136
  });
121
137
 
122
138
  it('accepts plan when dependency is already merged', async () => {
@@ -129,17 +145,21 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
129
145
 
130
146
  // Mark feat-merged-dep as merged directly in index
131
147
  await kernel.withIndexLock(async () => {
132
- const idx = await kernel.readIndex() as Record<string, unknown>;
148
+ const idx = (await kernel.readIndex()) as Record<string, unknown>;
133
149
  idx.merged = [...(Array.isArray(idx.merged) ? idx.merged : []), 'feat-merged-dep'];
134
150
  await kernel.writeIndex(idx);
135
151
  });
136
152
 
137
153
  // Set depends_on in feat-child2's state
138
154
  await kernel.updateState('feat-child2', null, async (fm: Record<string, unknown>) => ({
139
- frontMatter: { ...fm, depends_on: ['feat-merged-dep'] }
155
+ frontMatter: { ...fm, depends_on: ['feat-merged-dep'] },
140
156
  }));
141
157
 
142
- const result = await kernel.invoke('plan.submit', { feature_id: 'feat-child2', plan_json: validPlan('feat-child2') }, ORCH_CTX);
158
+ const result = await kernel.invoke(
159
+ 'plan.submit',
160
+ { feature_id: 'feat-child2', plan_json: validPlan('feat-child2') },
161
+ ORCH_CTX,
162
+ );
143
163
  expect(result.ok).toBe(true);
144
164
  });
145
165
 
@@ -152,13 +172,20 @@ describe('N4: Dependency-Aware Feature Scheduling', () => {
152
172
  await kernel.invoke('feature.init', { feature_id: 'feat-waiter' }, ORCH_CTX);
153
173
 
154
174
  await kernel.updateState('feat-waiter', null, async (fm: Record<string, unknown>) => ({
155
- frontMatter: { ...fm, depends_on: ['feat-blocker'] }
175
+ frontMatter: { ...fm, depends_on: ['feat-blocker'] },
156
176
  }));
157
177
 
158
- await kernel.invoke('plan.submit', { feature_id: 'feat-waiter', plan_json: validPlan('feat-waiter') }, ORCH_CTX);
159
-
160
- const index = await kernel.readIndex() as Record<string, unknown>;
161
- const depBlocked = index.dep_blocked as Array<{ feature_id: string; depends_on_unresolved: string[] }>;
178
+ await kernel.invoke(
179
+ 'plan.submit',
180
+ { feature_id: 'feat-waiter', plan_json: validPlan('feat-waiter') },
181
+ ORCH_CTX,
182
+ );
183
+
184
+ const index = (await kernel.readIndex()) as Record<string, unknown>;
185
+ const depBlocked = index.dep_blocked as Array<{
186
+ feature_id: string;
187
+ depends_on_unresolved: string[];
188
+ }>;
162
189
  expect(depBlocked.some((e) => e.feature_id === 'feat-waiter')).toBe(true);
163
190
  });
164
191
  });
@@ -178,7 +205,7 @@ describe('DependencySchedulerService branch coverage', () => {
178
205
  });
179
206
 
180
207
  it('GIVEN_cycle_with_only_one_node_self_referencing_WHEN_detectCircular_called_THEN_detects_cycle', () => {
181
- const result = detectCircularDependency('self', (id) => id === 'self' ? ['self'] : []);
208
+ const result = detectCircularDependency('self', (id) => (id === 'self' ? ['self'] : []));
182
209
  expect(result).not.toBeNull();
183
210
  });
184
211
 
@@ -19,7 +19,7 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
19
19
  provider: 'custom',
20
20
  model: 'test-model',
21
21
  provider_config_ref_hash: 'hash123',
22
- takeover_stale_run: false
22
+ takeover_stale_run: false,
23
23
  });
24
24
 
25
25
  expect(result.data.runtime_sessions.orchestrator_epoch).toBe(0);
@@ -33,7 +33,7 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
33
33
  provider: 'custom',
34
34
  model: 'test-model',
35
35
  provider_config_ref_hash: 'hash123',
36
- takeover_stale_run: false
36
+ takeover_stale_run: false,
37
37
  });
38
38
 
39
39
  const renewResult = await kernel.renewRunLease('test-run-2', 'test-owner-2');
@@ -50,14 +50,14 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
50
50
  provider: 'custom',
51
51
  model: 'test-model',
52
52
  provider_config_ref_hash: 'hash123',
53
- takeover_stale_run: false
53
+ takeover_stale_run: false,
54
54
  });
55
55
 
56
56
  await kernel.updateOrchestratorSession({
57
57
  run_id: 'test-run-3',
58
58
  owner_instance_id: 'test-owner-3',
59
59
  orchestrator_session_id: 'new-orch-session-1',
60
- increment_epoch: true
60
+ increment_epoch: true,
61
61
  });
62
62
 
63
63
  const sessions = await kernel.getRuntimeSessions();
@@ -71,14 +71,14 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
71
71
  provider: 'custom',
72
72
  model: 'test-model',
73
73
  provider_config_ref_hash: 'hash123',
74
- takeover_stale_run: false
74
+ takeover_stale_run: false,
75
75
  });
76
76
 
77
77
  await kernel.updateOrchestratorSession({
78
78
  run_id: 'test-run-4',
79
79
  owner_instance_id: 'test-owner-4',
80
80
  orchestrator_session_id: 'new-orch-session-2',
81
- increment_epoch: false
81
+ increment_epoch: false,
82
82
  });
83
83
 
84
84
  const sessions = await kernel.getRuntimeSessions();
@@ -92,14 +92,14 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
92
92
  provider: 'custom',
93
93
  model: 'test-model',
94
94
  provider_config_ref_hash: 'hash123',
95
- takeover_stale_run: false
95
+ takeover_stale_run: false,
96
96
  });
97
97
 
98
98
  await kernel.updateOrchestratorSession({
99
99
  run_id: 'test-run-5',
100
100
  owner_instance_id: 'test-owner-5a',
101
101
  orchestrator_session_id: 'orch-session-5',
102
- increment_epoch: true
102
+ increment_epoch: true,
103
103
  });
104
104
 
105
105
  const lease = await kernel.readRunLease();
@@ -112,7 +112,7 @@ describe('Orchestrator Epoch Tracking and Recovery', () => {
112
112
  provider: 'custom',
113
113
  model: 'test-model',
114
114
  provider_config_ref_hash: 'hash123',
115
- takeover_stale_run: true
115
+ takeover_stale_run: true,
116
116
  });
117
117
 
118
118
  expect(takeoverResult.data.took_over_stale).toBe(true);
@@ -4,7 +4,7 @@ import path from 'node:path';
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
5
 
6
6
  vi.mock('../src/core/git.js', () => ({
7
- runGit: vi.fn()
7
+ runGit: vi.fn(),
8
8
  }));
9
9
 
10
10
  import { runGit } from '../src/core/git.js';
@@ -13,13 +13,15 @@ import type { FeatureDeletionServicePort } from '../src/application/services/fea
13
13
  import { ERROR_CODES } from '../src/core/error-codes.js';
14
14
  import type { RuntimeSessionsSnapshot } from '../src/core/runtime-sessions.js';
15
15
 
16
- function commandResult(overrides: Partial<{
17
- code: number;
18
- signal: NodeJS.Signals | null;
19
- stdout: string;
20
- stderr: string;
21
- timeout: boolean;
22
- }> = {}) {
16
+ function commandResult(
17
+ overrides: Partial<{
18
+ code: number;
19
+ signal: NodeJS.Signals | null;
20
+ stdout: string;
21
+ stderr: string;
22
+ timeout: boolean;
23
+ }> = {},
24
+ ) {
23
25
  return { code: 0, signal: null, stdout: '', stderr: '', timeout: false, ...overrides };
24
26
  }
25
27
 
@@ -36,7 +38,7 @@ function makeStaleRunLease(): RuntimeSessionsSnapshot {
36
38
  started_at: now,
37
39
  last_heartbeat_at: now,
38
40
  lease_expires_at: now,
39
- feature_sessions: {}
41
+ feature_sessions: {},
40
42
  };
41
43
  }
42
44
 
@@ -75,31 +77,36 @@ describe('FeatureDeletionService git failure paths', () => {
75
77
  locks: {},
76
78
  lock_leases: {},
77
79
  blocked_queue: [],
78
- updated_at: new Date().toISOString()
80
+ updated_at: new Date().toISOString(),
79
81
  })),
80
82
  writeIndex: vi.fn(async () => {}),
81
83
  readRunLease: vi.fn(async () => ({ ...staleRunLease })),
82
84
  writeRunLease: vi.fn(async () => {}),
83
85
  normalizeRuntimeSessions: vi.fn(() => staleRunLease),
84
86
  isRunLeaseFresh: vi.fn(() => false),
85
- locksRelease: vi.fn(async () => {})
87
+ locksRelease: vi.fn(async () => {}),
86
88
  };
87
89
  }
88
90
 
89
91
  it('GIVEN_worktree_exists_WHEN_runGit_worktree_remove_fails_THEN_throws_GIT_FAILURE', async () => {
90
92
  vi.mocked(runGit)
91
- .mockResolvedValueOnce(commandResult({ code: 1 })) // show-ref → no branch
93
+ .mockResolvedValueOnce(commandResult({ code: 1 })) // show-ref → no branch
92
94
  .mockResolvedValueOnce(commandResult({ code: 1, stderr: 'not a worktree' })); // worktree remove fails
93
95
 
94
96
  const service = new FeatureDeletionService(makeMockPort());
95
97
 
96
98
  await expect(
97
- service.featureDelete('feature_x', { dryRun: false, confirm: true, removeWorktree: true, removeBranch: 'none' })
99
+ service.featureDelete('feature_x', {
100
+ dryRun: false,
101
+ confirm: true,
102
+ removeWorktree: true,
103
+ removeBranch: 'none',
104
+ }),
98
105
  ).rejects.toMatchObject({
99
106
  normalizedResponse: expect.objectContaining({
100
107
  ok: false,
101
- error: expect.objectContaining({ code: ERROR_CODES.GIT_FAILURE })
102
- })
108
+ error: expect.objectContaining({ code: ERROR_CODES.GIT_FAILURE }),
109
+ }),
103
110
  });
104
111
  });
105
112
 
@@ -114,7 +121,7 @@ describe('FeatureDeletionService git failure paths', () => {
114
121
  dryRun: false,
115
122
  confirm: true,
116
123
  removeWorktree: false,
117
- removeBranch: 'safe'
124
+ removeBranch: 'safe',
118
125
  });
119
126
 
120
127
  expect(result.data.summary.branch_removed).toBe(true);
@@ -123,18 +130,23 @@ describe('FeatureDeletionService git failure paths', () => {
123
130
 
124
131
  it('GIVEN_branch_exists_WHEN_runGit_branch_remove_fails_THEN_throws_GIT_FAILURE', async () => {
125
132
  vi.mocked(runGit)
126
- .mockResolvedValueOnce(commandResult({ code: 0 })) // show-ref → branch exists
133
+ .mockResolvedValueOnce(commandResult({ code: 0 })) // show-ref → branch exists
127
134
  .mockResolvedValueOnce(commandResult({ code: 1, stderr: 'branch not merged' })); // branch -d fails
128
135
 
129
136
  const service = new FeatureDeletionService(makeMockPort());
130
137
 
131
138
  await expect(
132
- service.featureDelete('feature_x', { dryRun: false, confirm: true, removeWorktree: false, removeBranch: 'safe' })
139
+ service.featureDelete('feature_x', {
140
+ dryRun: false,
141
+ confirm: true,
142
+ removeWorktree: false,
143
+ removeBranch: 'safe',
144
+ }),
133
145
  ).rejects.toMatchObject({
134
146
  normalizedResponse: expect.objectContaining({
135
147
  ok: false,
136
- error: expect.objectContaining({ code: ERROR_CODES.GIT_FAILURE })
137
- })
148
+ error: expect.objectContaining({ code: ERROR_CODES.GIT_FAILURE }),
149
+ }),
138
150
  });
139
151
  });
140
152
 
@@ -149,7 +161,7 @@ describe('FeatureDeletionService git failure paths', () => {
149
161
  dryRun: false,
150
162
  confirm: true,
151
163
  removeWorktree: false,
152
- removeBranch: 'force'
164
+ removeBranch: 'force',
153
165
  });
154
166
 
155
167
  expect(result.data.summary.branch_removed).toBe(true);
@@ -192,40 +204,36 @@ describe('FeatureDeletionService input validation paths', () => {
192
204
  locks: {},
193
205
  lock_leases: {},
194
206
  blocked_queue: [],
195
- updated_at: new Date().toISOString()
207
+ updated_at: new Date().toISOString(),
196
208
  })),
197
209
  writeIndex: vi.fn(async () => {}),
198
210
  readRunLease: vi.fn(async () => ({ ...staleRunLease })),
199
211
  writeRunLease: vi.fn(async () => {}),
200
212
  normalizeRuntimeSessions: vi.fn(() => staleRunLease),
201
213
  isRunLeaseFresh: vi.fn(() => false),
202
- locksRelease: vi.fn(async () => {})
214
+ locksRelease: vi.fn(async () => {}),
203
215
  };
204
216
  }
205
217
 
206
218
  it('GIVEN_null_feature_id_WHEN_featureDelete_called_THEN_throws_INVALID_ARGUMENT', async () => {
207
219
  const service = new FeatureDeletionService(makeMockPort());
208
220
 
209
- await expect(
210
- service.featureDelete(null)
211
- ).rejects.toMatchObject({
221
+ await expect(service.featureDelete(null)).rejects.toMatchObject({
212
222
  normalizedResponse: expect.objectContaining({
213
223
  ok: false,
214
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
215
- })
224
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
225
+ }),
216
226
  });
217
227
  });
218
228
 
219
229
  it('GIVEN_invalid_feature_id_format_WHEN_featureDelete_called_THEN_throws_INVALID_ARGUMENT', async () => {
220
230
  const service = new FeatureDeletionService(makeMockPort());
221
231
 
222
- await expect(
223
- service.featureDelete('INVALID FEATURE ID!')
224
- ).rejects.toMatchObject({
232
+ await expect(service.featureDelete('INVALID FEATURE ID!')).rejects.toMatchObject({
225
233
  normalizedResponse: expect.objectContaining({
226
234
  ok: false,
227
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
228
- })
235
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
236
+ }),
229
237
  });
230
238
  });
231
239
 
@@ -233,12 +241,12 @@ describe('FeatureDeletionService input validation paths', () => {
233
241
  const service = new FeatureDeletionService(makeMockPort());
234
242
 
235
243
  await expect(
236
- service.featureDelete('feature_x', { removeBranch: 'invalid-mode' })
244
+ service.featureDelete('feature_x', { removeBranch: 'invalid-mode' }),
237
245
  ).rejects.toMatchObject({
238
246
  normalizedResponse: expect.objectContaining({
239
247
  ok: false,
240
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
241
- })
248
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
249
+ }),
242
250
  });
243
251
  });
244
252
 
@@ -246,12 +254,12 @@ describe('FeatureDeletionService input validation paths', () => {
246
254
  const service = new FeatureDeletionService(makeMockPort());
247
255
 
248
256
  await expect(
249
- service.featureDelete('feature_x', { dryRun: false, confirm: false, removeBranch: 'none' })
257
+ service.featureDelete('feature_x', { dryRun: false, confirm: false, removeBranch: 'none' }),
250
258
  ).rejects.toMatchObject({
251
259
  normalizedResponse: expect.objectContaining({
252
260
  ok: false,
253
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
254
- })
261
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
262
+ }),
255
263
  });
256
264
  });
257
265
 
@@ -282,7 +290,7 @@ describe('FeatureDeletionService input validation paths', () => {
282
290
  started_at: now,
283
291
  last_heartbeat_at: now,
284
292
  lease_expires_at: new Date(Date.now() + 60_000).toISOString(),
285
- feature_sessions: {}
293
+ feature_sessions: {},
286
294
  };
287
295
 
288
296
  const port = makeMockPort();
@@ -292,12 +300,12 @@ describe('FeatureDeletionService input validation paths', () => {
292
300
  const service = new FeatureDeletionService(port);
293
301
 
294
302
  await expect(
295
- service.featureDelete('feature_x', { dryRun: false, confirm: true, removeBranch: 'none' })
303
+ service.featureDelete('feature_x', { dryRun: false, confirm: true, removeBranch: 'none' }),
296
304
  ).rejects.toMatchObject({
297
305
  normalizedResponse: expect.objectContaining({
298
306
  ok: false,
299
- error: expect.objectContaining({ code: ERROR_CODES.RUN_ALREADY_ACTIVE })
300
- })
307
+ error: expect.objectContaining({ code: ERROR_CODES.RUN_ALREADY_ACTIVE }),
308
+ }),
301
309
  });
302
310
  });
303
311
 
@@ -310,7 +318,7 @@ describe('FeatureDeletionService input validation paths', () => {
310
318
  dryRun: false,
311
319
  confirm: true,
312
320
  removeWorktree: false,
313
- removeBranch: 'none'
321
+ removeBranch: 'none',
314
322
  });
315
323
 
316
324
  expect(result.data.dry_run).toBe(false);
@@ -354,17 +362,17 @@ describe('FeatureDeletionService readLockResourcesFromIndex and normalizeFeature
354
362
  merged: [],
355
363
  locks: {},
356
364
  lock_leases: {
357
- openapi: { holder: 'feature_lock_lease', expires_at: new Date().toISOString() }
365
+ openapi: { holder: 'feature_lock_lease', expires_at: new Date().toISOString() },
358
366
  },
359
367
  blocked_queue: [],
360
- updated_at: new Date().toISOString()
368
+ updated_at: new Date().toISOString(),
361
369
  })),
362
370
  writeIndex: vi.fn(async () => {}),
363
371
  readRunLease: vi.fn(async () => ({ ...staleRunLease })),
364
372
  writeRunLease: vi.fn(async () => {}),
365
373
  normalizeRuntimeSessions: vi.fn(() => staleRunLease),
366
374
  isRunLeaseFresh: vi.fn(() => false),
367
- locksRelease: vi.fn(async () => {})
375
+ locksRelease: vi.fn(async () => {}),
368
376
  };
369
377
 
370
378
  const service = new FeatureDeletionService(port);
@@ -372,7 +380,7 @@ describe('FeatureDeletionService readLockResourcesFromIndex and normalizeFeature
372
380
  dryRun: false,
373
381
  confirm: true,
374
382
  removeWorktree: false,
375
- removeBranch: 'none'
383
+ removeBranch: 'none',
376
384
  });
377
385
 
378
386
  expect(result.data.summary.locks_released).toContain('openapi');
@@ -383,7 +391,7 @@ describe('FeatureDeletionService readLockResourcesFromIndex and normalizeFeature
383
391
 
384
392
  const staleRunLease = {
385
393
  ...makeStaleRunLease(),
386
- feature_sessions: undefined as unknown as Record<string, unknown>
394
+ feature_sessions: undefined as unknown as Record<string, unknown>,
387
395
  };
388
396
  const port = {
389
397
  getRepoRoot: () => repoRoot,
@@ -400,14 +408,14 @@ describe('FeatureDeletionService readLockResourcesFromIndex and normalizeFeature
400
408
  locks: {},
401
409
  lock_leases: {},
402
410
  blocked_queue: [],
403
- updated_at: new Date().toISOString()
411
+ updated_at: new Date().toISOString(),
404
412
  })),
405
413
  writeIndex: vi.fn(async () => {}),
406
414
  readRunLease: vi.fn(async () => ({ ...staleRunLease })),
407
415
  writeRunLease: vi.fn(async () => {}),
408
416
  normalizeRuntimeSessions: vi.fn(() => ({ ...staleRunLease })),
409
417
  isRunLeaseFresh: vi.fn(() => false),
410
- locksRelease: vi.fn(async () => {})
418
+ locksRelease: vi.fn(async () => {}),
411
419
  };
412
420
 
413
421
  const service = new FeatureDeletionService(port as unknown as FeatureDeletionServicePort);
@@ -415,7 +423,7 @@ describe('FeatureDeletionService readLockResourcesFromIndex and normalizeFeature
415
423
  dryRun: false,
416
424
  confirm: true,
417
425
  removeWorktree: false,
418
- removeBranch: 'none'
426
+ removeBranch: 'none',
419
427
  });
420
428
 
421
429
  expect(result.data.summary.runtime_session_assignment_removed).toBe(false);