agentic-orchestrator 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -16,9 +16,9 @@ vi.mock('node:readline/promises', () => ({
16
16
  default: {
17
17
  createInterface: vi.fn(() => ({
18
18
  question: readlineQuestionMock,
19
- close: readlineCloseMock
20
- }))
21
- }
19
+ close: readlineCloseMock,
20
+ })),
21
+ },
22
22
  }));
23
23
 
24
24
  vi.mock('../src/core/kernel.js', () => {
@@ -59,7 +59,7 @@ vi.mock('../src/core/kernel.js', () => {
59
59
 
60
60
  vi.mock('../src/mcp/runtime-factory.js', () => ({
61
61
  createToolingRuntime: createToolingRuntimeMock,
62
- resolveToolClient: resolveToolClientMock
62
+ resolveToolClient: resolveToolClientMock,
63
63
  }));
64
64
 
65
65
  vi.mock('../src/cli/init-command-handler.js', () => ({
@@ -73,11 +73,11 @@ vi.mock('../src/cli/init-command-handler.js', () => ({
73
73
  updated: [],
74
74
  skipped: [],
75
75
  validation_warnings: [],
76
- next_steps: []
77
- }
76
+ next_steps: [],
77
+ },
78
78
  };
79
79
  }
80
- }
80
+ },
81
81
  }));
82
82
 
83
83
  vi.mock('../src/cli/dashboard-command-handler.js', () => ({
@@ -85,7 +85,7 @@ vi.mock('../src/cli/dashboard-command-handler.js', () => ({
85
85
  async execute() {
86
86
  return { ok: true, data: { message: 'started', port: 3000 } };
87
87
  }
88
- }
88
+ },
89
89
  }));
90
90
 
91
91
  vi.mock('../src/cli/run-command-handler.js', () => ({
@@ -93,7 +93,7 @@ vi.mock('../src/cli/run-command-handler.js', () => ({
93
93
  async execute() {
94
94
  return { ok: true, data: { status: 'running' } };
95
95
  }
96
- }
96
+ },
97
97
  }));
98
98
 
99
99
  vi.mock('../src/cli/resume-command-handler.js', () => ({
@@ -101,7 +101,7 @@ vi.mock('../src/cli/resume-command-handler.js', () => ({
101
101
  async execute() {
102
102
  return { ok: true, data: { resumed: false } };
103
103
  }
104
- }
104
+ },
105
105
  }));
106
106
 
107
107
  // ── helpers ───────────────────────────────────────────────────────────────────
@@ -121,16 +121,22 @@ function asJsonWrites(spy: ReturnType<typeof vi.spyOn>): unknown[] {
121
121
  }
122
122
 
123
123
  async function writeMultiProjectYaml(dir: string, content: string): Promise<void> {
124
- const configDir = path.join(dir, 'agentic', 'orchestrator');
124
+ const configDir = path.join(dir, 'config', 'agentic', 'orchestrator');
125
125
  await fs.mkdir(configDir, { recursive: true });
126
126
  await fs.writeFile(path.join(configDir, 'multi-project.yaml'), content, 'utf8');
127
127
  }
128
128
 
129
129
  async function writeSchemaFile(dir: string): Promise<void> {
130
- const schemasDir = path.join(dir, 'agentic', 'orchestrator', 'schemas');
130
+ const schemasDir = path.join(dir, 'config', 'agentic', 'orchestrator', 'schemas');
131
131
  await fs.mkdir(schemasDir, { recursive: true });
132
132
  const repoRoot = path.resolve(import.meta.dirname, '../../../');
133
- const srcSchema = path.join(repoRoot, 'agentic', 'orchestrator', 'schemas', 'multi-project.schema.json');
133
+ const srcSchema = path.join(
134
+ repoRoot,
135
+ 'agentic',
136
+ 'orchestrator',
137
+ 'schemas',
138
+ 'multi-project.schema.json',
139
+ );
134
140
  const destSchema = path.join(schemasDir, 'multi-project.schema.json');
135
141
  await fs.copyFile(srcSchema, destSchema);
136
142
  }
@@ -168,7 +174,7 @@ describe('bootstrap runCli', () => {
168
174
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
169
175
  const code = await runCli(['delete', '--feature-id', 'feat_x', '--yes'], {
170
176
  cwd: '/tmp',
171
- env: process.env
177
+ env: process.env,
172
178
  });
173
179
 
174
180
  const writes = asJsonWrites(stdoutSpy);
@@ -185,14 +191,14 @@ describe('bootstrap runCli', () => {
185
191
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
186
192
  const code = await runCli(['retry', '--feature-id', 'feat_x'], {
187
193
  cwd: '/tmp',
188
- env: process.env
194
+ env: process.env,
189
195
  });
190
196
 
191
197
  const writes = asJsonWrites(stdoutSpy);
192
198
  expect(code).toBe(0);
193
199
  expect(writes[0]).toMatchObject({
194
200
  ok: true,
195
- data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true }
201
+ data: { feature_id: 'feat_x', retry_count_reset: false, retry_executed: true },
196
202
  });
197
203
  expect(toolCallMock).toHaveBeenCalled();
198
204
  });
@@ -203,7 +209,7 @@ describe('bootstrap runCli', () => {
203
209
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
204
210
  const code = await runCli(['send', '--feature-id', 'feat_x', '--message', 'hello'], {
205
211
  cwd: '/tmp',
206
- env: process.env
212
+ env: process.env,
207
213
  });
208
214
 
209
215
  const writes = asJsonWrites(stdoutSpy);
@@ -227,7 +233,7 @@ describe('bootstrap runCli', () => {
227
233
  expect(code).toBe(0);
228
234
  expect(writes[0]).toMatchObject({
229
235
  ok: true,
230
- data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) })
236
+ data: expect.objectContaining({ would_clean: expect.any(Array), cleaned: expect.any(Array) }),
231
237
  });
232
238
  });
233
239
 
@@ -239,7 +245,7 @@ describe('bootstrap runCli', () => {
239
245
  expect(code).toBe(1);
240
246
  expect(writes[0]).toMatchObject({
241
247
  ok: false,
242
- error: expect.objectContaining({ message: expect.stringContaining('unknown-command') })
248
+ error: expect.objectContaining({ message: expect.stringContaining('unknown-command') }),
243
249
  });
244
250
  });
245
251
 
@@ -281,7 +287,7 @@ describe('bootstrap runCli', () => {
281
287
 
282
288
  it('GIVEN_ensureLoaded_throws_WHEN_run_command_executed_THEN_returns_exit_code_1', async () => {
283
289
  ensureLoadedMock.mockRejectedValueOnce(
284
- Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' })
290
+ Object.assign(new Error('config load failed'), { code: 'CONFIG_LOAD_ERROR' }),
285
291
  );
286
292
 
287
293
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -289,7 +295,10 @@ describe('bootstrap runCli', () => {
289
295
 
290
296
  const writes = asJsonWrites(stdoutSpy);
291
297
  expect(code).toBe(1);
292
- expect(writes[0]).toMatchObject({ ok: false, error: expect.objectContaining({ message: 'config load failed' }) });
298
+ expect(writes[0]).toMatchObject({
299
+ ok: false,
300
+ error: expect.objectContaining({ message: 'config load failed' }),
301
+ });
293
302
  });
294
303
 
295
304
  it('GIVEN_project_flag_with_no_multi_project_yaml_WHEN_executed_THEN_returns_exit_code_1', async () => {
@@ -301,7 +310,7 @@ describe('bootstrap runCli', () => {
301
310
  expect(code).toBe(1);
302
311
  expect(writes[0]).toMatchObject({
303
312
  ok: false,
304
- error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') })
313
+ error: expect.objectContaining({ message: expect.stringContaining('multi-project.yaml') }),
305
314
  });
306
315
  });
307
316
  });
@@ -341,7 +350,7 @@ projects:
341
350
  path: ${proj1}
342
351
  - name: proj2
343
352
  path: ${proj2}
344
- `
353
+ `,
345
354
  );
346
355
 
347
356
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -354,9 +363,9 @@ projects:
354
363
  data: {
355
364
  projects: expect.arrayContaining([
356
365
  expect.objectContaining({ name: 'proj1' }),
357
- expect.objectContaining({ name: 'proj2' })
358
- ])
359
- }
366
+ expect.objectContaining({ name: 'proj2' }),
367
+ ]),
368
+ },
360
369
  });
361
370
  });
362
371
 
@@ -373,20 +382,25 @@ projects:
373
382
  path: ${projGood}
374
383
  - name: proj-bad
375
384
  path: /nonexistent/path/that/will/fail
376
- `
385
+ `,
377
386
  );
378
387
 
379
388
  // First project succeeds, second causes ensureLoaded to fail
380
389
  ensureLoadedMock
381
390
  .mockResolvedValueOnce(undefined)
382
- .mockRejectedValueOnce(Object.assign(new Error('project load error'), { code: 'CONFIG_LOAD_ERROR' }));
391
+ .mockRejectedValueOnce(
392
+ Object.assign(new Error('project load error'), { code: 'CONFIG_LOAD_ERROR' }),
393
+ );
383
394
 
384
395
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
385
396
  const code = await runCli(['status', '--all'], { cwd: tmpDir, env: process.env });
386
397
 
387
398
  const writes = asJsonWrites(stdoutSpy);
388
399
  expect(code).toBe(0);
389
- const aggregate = writes[0] as { ok: boolean; data: { projects: Array<{ name: string; status: unknown }> } };
400
+ const aggregate = writes[0] as {
401
+ ok: boolean;
402
+ data: { projects: Array<{ name: string; status: unknown }> };
403
+ };
390
404
  expect(aggregate.ok).toBe(true);
391
405
  expect(aggregate.data.projects).toHaveLength(2);
392
406
  const badProject = aggregate.data.projects.find((p) => p.name === 'proj-bad');
@@ -417,7 +431,10 @@ describe('bootstrap multi-project selection branches', () => {
417
431
  it('GIVEN_single_project_multi_yaml_WHEN_status_no_project_flag_THEN_auto_selects_only_project', async () => {
418
432
  const proj1 = path.join(tmpDir, 'proj1');
419
433
  await fs.mkdir(proj1, { recursive: true });
420
- await writeMultiProjectYaml(tmpDir, `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`);
434
+ await writeMultiProjectYaml(
435
+ tmpDir,
436
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
437
+ );
421
438
 
422
439
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
423
440
  const code = await runCli(['status'], { cwd: tmpDir, env: process.env });
@@ -431,7 +448,7 @@ describe('bootstrap multi-project selection branches', () => {
431
448
  await fs.mkdir(proj2, { recursive: true });
432
449
  await writeMultiProjectYaml(
433
450
  tmpDir,
434
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
451
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
435
452
  );
436
453
 
437
454
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -447,7 +464,7 @@ describe('bootstrap multi-project selection branches', () => {
447
464
  await fs.mkdir(proj2, { recursive: true });
448
465
  await writeMultiProjectYaml(
449
466
  tmpDir,
450
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n`
467
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\ndefaults:\n default_project: proj1\n`,
451
468
  );
452
469
 
453
470
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
@@ -463,7 +480,7 @@ describe('bootstrap multi-project selection branches', () => {
463
480
  await fs.mkdir(proj2, { recursive: true });
464
481
  await writeMultiProjectYaml(
465
482
  tmpDir,
466
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
483
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
467
484
  );
468
485
 
469
486
  // Mock stdin/stdout to simulate non-TTY environment
@@ -479,17 +496,26 @@ describe('bootstrap multi-project selection branches', () => {
479
496
  expect(code).toBe(1);
480
497
  } finally {
481
498
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
482
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
499
+ Object.defineProperty(process.stdout, 'isTTY', {
500
+ value: origStdoutIsTTY,
501
+ configurable: true,
502
+ });
483
503
  }
484
504
  });
485
505
 
486
506
  it('GIVEN_project_flag_and_project_not_found_WHEN_run_THEN_returns_exit_code_1', async () => {
487
507
  const proj1 = path.join(tmpDir, 'proj1');
488
508
  await fs.mkdir(proj1, { recursive: true });
489
- await writeMultiProjectYaml(tmpDir, `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`);
509
+ await writeMultiProjectYaml(
510
+ tmpDir,
511
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n`,
512
+ );
490
513
 
491
514
  const { runCli } = await import('../src/interfaces/cli/bootstrap.js');
492
- const code = await runCli(['status', '--project', 'nonexistent'], { cwd: tmpDir, env: process.env });
515
+ const code = await runCli(['status', '--project', 'nonexistent'], {
516
+ cwd: tmpDir,
517
+ env: process.env,
518
+ });
493
519
  expect(code).toBe(1);
494
520
  });
495
521
 
@@ -514,7 +540,7 @@ describe('bootstrap multi-project selection branches', () => {
514
540
  await fs.mkdir(proj2, { recursive: true });
515
541
  await writeMultiProjectYaml(
516
542
  tmpDir,
517
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
543
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
518
544
  );
519
545
 
520
546
  // Simulate TTY and user entering '1' to select first project
@@ -532,7 +558,10 @@ describe('bootstrap multi-project selection branches', () => {
532
558
  expect(readlineQuestionMock).toHaveBeenCalled();
533
559
  } finally {
534
560
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
535
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
561
+ Object.defineProperty(process.stdout, 'isTTY', {
562
+ value: origStdoutIsTTY,
563
+ configurable: true,
564
+ });
536
565
  readlineQuestionMock.mockReset();
537
566
  }
538
567
  });
@@ -544,7 +573,7 @@ describe('bootstrap multi-project selection branches', () => {
544
573
  await fs.mkdir(proj2, { recursive: true });
545
574
  await writeMultiProjectYaml(
546
575
  tmpDir,
547
- `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`
576
+ `version: "1.0"\nprojects:\n - name: proj1\n path: ${proj1}\n - name: proj2\n path: ${proj2}\n`,
548
577
  );
549
578
 
550
579
  // Simulate TTY and user entering 'abc' (invalid number)
@@ -561,7 +590,10 @@ describe('bootstrap multi-project selection branches', () => {
561
590
  expect(code).toBe(1);
562
591
  } finally {
563
592
  Object.defineProperty(process.stdin, 'isTTY', { value: origStdinIsTTY, configurable: true });
564
- Object.defineProperty(process.stdout, 'isTTY', { value: origStdoutIsTTY, configurable: true });
593
+ Object.defineProperty(process.stdout, 'isTTY', {
594
+ value: origStdoutIsTTY,
595
+ configurable: true,
596
+ });
565
597
  readlineQuestionMock.mockReset();
566
598
  }
567
599
  });
@@ -52,15 +52,19 @@ describe('CleanupCommandHandler', () => {
52
52
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
53
53
 
54
54
  const callMock = vi.fn();
55
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
55
+ const handler = new CleanupCommandHandler(
56
+ makeToolClient(callMock) as never,
57
+ 'run:test',
58
+ '/repo',
59
+ );
56
60
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
57
61
 
58
62
  expect(result).toMatchObject({
59
63
  ok: true,
60
64
  data: {
61
65
  would_clean: [{ feature_id: 'feature_a', reason: 'terminal status: merged' }],
62
- cleaned: []
63
- }
66
+ cleaned: [],
67
+ },
64
68
  });
65
69
  expect(callMock).not.toHaveBeenCalled();
66
70
  });
@@ -81,20 +85,24 @@ describe('CleanupCommandHandler', () => {
81
85
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
82
86
 
83
87
  const callMock = vi.fn(async () => ({ ok: true, data: {} }));
84
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
88
+ const handler = new CleanupCommandHandler(
89
+ makeToolClient(callMock) as never,
90
+ 'run:test',
91
+ '/repo',
92
+ );
85
93
  const result = await handler.execute({ command: 'cleanup', yes: true });
86
94
 
87
95
  expect(result).toMatchObject({
88
96
  ok: true,
89
97
  data: {
90
98
  would_clean: [{ feature_id: 'feature_a' }],
91
- cleaned: [{ feature_id: 'feature_a' }]
92
- }
99
+ cleaned: [{ feature_id: 'feature_a' }],
100
+ },
93
101
  });
94
102
  expect(callMock).toHaveBeenCalledWith(
95
103
  TOOLS.FEATURE_DELETE,
96
104
  expect.objectContaining({ feature_id: 'feature_a', confirm: true, dry_run: false }),
97
- expect.any(Object)
105
+ expect.any(Object),
98
106
  );
99
107
  });
100
108
 
@@ -112,19 +120,23 @@ describe('CleanupCommandHandler', () => {
112
120
  vi.spyOn(fs, 'readdir').mockResolvedValue([
113
121
  { name: 'orphan_feature', isDirectory: () => true },
114
122
  { name: 'feature_a', isDirectory: () => true },
115
- { name: 'not_a_dir.txt', isDirectory: () => false }
123
+ { name: 'not_a_dir.txt', isDirectory: () => false },
116
124
  ] as never);
117
125
 
118
126
  const callMock = vi.fn();
119
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
127
+ const handler = new CleanupCommandHandler(
128
+ makeToolClient(callMock) as never,
129
+ 'run:test',
130
+ '/repo',
131
+ );
120
132
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
121
133
 
122
134
  expect(result).toMatchObject({
123
135
  ok: true,
124
136
  data: {
125
137
  would_clean: [{ feature_id: 'orphan_feature', reason: 'orphan worktree' }],
126
- cleaned: []
127
- }
138
+ cleaned: [],
139
+ },
128
140
  });
129
141
  expect(callMock).not.toHaveBeenCalled();
130
142
  });
@@ -145,7 +157,11 @@ describe('CleanupCommandHandler', () => {
145
157
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
146
158
 
147
159
  const callMock = vi.fn().mockRejectedValue(new Error('delete failed'));
148
- const handler = new CleanupCommandHandler(makeToolClient(callMock) as never, 'run:test', '/repo');
160
+ const handler = new CleanupCommandHandler(
161
+ makeToolClient(callMock) as never,
162
+ 'run:test',
163
+ '/repo',
164
+ );
149
165
  const result = await handler.execute({ command: 'cleanup', yes: true });
150
166
 
151
167
  expect(result).toMatchObject({
@@ -153,8 +169,8 @@ describe('CleanupCommandHandler', () => {
153
169
  data: {
154
170
  would_clean: [{ feature_id: 'feature_a' }],
155
171
  cleaned: [],
156
- skipped: [{ feature_id: 'feature_a' }]
157
- }
172
+ skipped: [{ feature_id: 'feature_a' }],
173
+ },
158
174
  });
159
175
  });
160
176
 
@@ -173,23 +189,35 @@ describe('CleanupCommandHandler', () => {
173
189
  });
174
190
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
175
191
 
176
- const defaultHandler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
192
+ const defaultHandler = new CleanupCommandHandler(
193
+ makeToolClient() as never,
194
+ 'run:test',
195
+ '/repo',
196
+ 3600,
197
+ false,
198
+ );
177
199
  const defaultResult = await defaultHandler.execute({ command: 'cleanup', dry_run: true });
178
200
  expect(defaultResult).toMatchObject({
179
201
  ok: true,
180
202
  data: {
181
- would_clean: []
182
- }
203
+ would_clean: [],
204
+ },
183
205
  });
184
206
 
185
- const autoHandler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, true);
207
+ const autoHandler = new CleanupCommandHandler(
208
+ makeToolClient() as never,
209
+ 'run:test',
210
+ '/repo',
211
+ 3600,
212
+ true,
213
+ );
186
214
  const autoResult = await autoHandler.execute({ command: 'cleanup', dry_run: true });
187
215
  expect(autoResult).toMatchObject({
188
216
  ok: true,
189
217
  data: {
190
218
  would_clean: [{ feature_id: 'feature_merged', reason: 'terminal status: merged' }],
191
- cleaned: []
192
- }
219
+ cleaned: [],
220
+ },
193
221
  });
194
222
  });
195
223
  });
@@ -219,14 +247,20 @@ describe('CleanupCommandHandler branch coverage', () => {
219
247
  // Allow readdir to succeed with empty array so isRunLeaseInactive checks candidate paths
220
248
  vi.spyOn(fs, 'readdir').mockResolvedValue([]);
221
249
 
222
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
250
+ const handler = new CleanupCommandHandler(
251
+ makeToolClient() as never,
252
+ 'run:test',
253
+ '/repo',
254
+ 3600,
255
+ false,
256
+ );
223
257
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
224
258
  expect(result).toMatchObject({
225
259
  ok: true,
226
260
  data: {
227
261
  would_clean: [],
228
- skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }]
229
- }
262
+ skipped: [{ feature_id: 'feature_active_lease', reason: 'run lease still active' }],
263
+ },
230
264
  });
231
265
  });
232
266
 
@@ -245,14 +279,20 @@ describe('CleanupCommandHandler branch coverage', () => {
245
279
  });
246
280
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
247
281
 
248
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
282
+ const handler = new CleanupCommandHandler(
283
+ makeToolClient() as never,
284
+ 'run:test',
285
+ '/repo',
286
+ 3600,
287
+ false,
288
+ );
249
289
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
250
290
  expect(result).toMatchObject({
251
291
  ok: true,
252
292
  data: {
253
293
  would_clean: [],
254
- skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }]
255
- }
294
+ skipped: [{ feature_id: 'feature_grace_period', reason: 'not eligible' }],
295
+ },
256
296
  });
257
297
  });
258
298
 
@@ -266,13 +306,21 @@ describe('CleanupCommandHandler branch coverage', () => {
266
306
  });
267
307
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
268
308
 
269
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, true);
309
+ const handler = new CleanupCommandHandler(
310
+ makeToolClient() as never,
311
+ 'run:test',
312
+ '/repo',
313
+ 3600,
314
+ true,
315
+ );
270
316
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
271
317
  expect(result).toMatchObject({
272
318
  ok: true,
273
319
  data: {
274
- would_clean: [{ feature_id: 'feature_no_state', reason: 'merged residue with missing state' }]
275
- }
320
+ would_clean: [
321
+ { feature_id: 'feature_no_state', reason: 'merged residue with missing state' },
322
+ ],
323
+ },
276
324
  });
277
325
  });
278
326
  });
@@ -288,14 +336,20 @@ describe('CleanupCommandHandler state unreadable branch', () => {
288
336
  });
289
337
  vi.spyOn(fs, 'readdir').mockRejectedValue(new Error('no dir'));
290
338
 
291
- const handler = new CleanupCommandHandler(makeToolClient() as never, 'run:test', '/repo', 3600, false);
339
+ const handler = new CleanupCommandHandler(
340
+ makeToolClient() as never,
341
+ 'run:test',
342
+ '/repo',
343
+ 3600,
344
+ false,
345
+ );
292
346
  const result = await handler.execute({ command: 'cleanup', dry_run: true });
293
347
  expect(result).toMatchObject({
294
348
  ok: true,
295
349
  data: {
296
350
  would_clean: [],
297
- skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }]
298
- }
351
+ skipped: [{ feature_id: 'feature_bad_state', reason: 'state unreadable' }],
352
+ },
299
353
  });
300
354
  });
301
355
  });