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
@@ -5,7 +5,7 @@ import {
5
5
  WebhookNotifierChannel,
6
6
  createNotifierService,
7
7
  type NotificationConfig,
8
- type NotificationPayload
8
+ type NotificationPayload,
9
9
  } from '../src/application/services/notifier-service.js';
10
10
 
11
11
  describe('NotifierService', () => {
@@ -13,13 +13,15 @@ describe('NotifierService', () => {
13
13
  const config: NotificationConfig = {
14
14
  enabled: false,
15
15
  channels: {
16
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#test' }
17
- }
16
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#test' },
17
+ },
18
18
  };
19
19
  const service = new NotifierService(config);
20
20
 
21
21
  // Override channels via a subclass approach — use spy on fetch instead
22
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
22
+ const fetchSpy = vi
23
+ .spyOn(globalThis, 'fetch')
24
+ .mockResolvedValue(new Response('ok', { status: 200 }));
23
25
 
24
26
  await service.notify('gate_failed', { feature_id: 'feat_a', message: 'Gate failed' });
25
27
 
@@ -28,13 +30,15 @@ describe('NotifierService', () => {
28
30
  });
29
31
 
30
32
  it('GIVEN_slack_channel_enabled_WHEN_gate_failed_THEN_slack_notified', async () => {
31
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
33
+ const fetchSpy = vi
34
+ .spyOn(globalThis, 'fetch')
35
+ .mockResolvedValue(new Response('ok', { status: 200 }));
32
36
 
33
37
  const config: NotificationConfig = {
34
38
  enabled: true,
35
39
  channels: {
36
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' }
37
- }
40
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' },
41
+ },
38
42
  };
39
43
  const service = new NotifierService(config);
40
44
 
@@ -44,20 +48,22 @@ describe('NotifierService', () => {
44
48
  'https://hooks.slack.com/test',
45
49
  expect.objectContaining({
46
50
  method: 'POST',
47
- headers: expect.objectContaining({ 'Content-Type': 'application/json' })
48
- })
51
+ headers: expect.objectContaining({ 'Content-Type': 'application/json' }),
52
+ }),
49
53
  );
50
54
  fetchSpy.mockRestore();
51
55
  });
52
56
 
53
57
  it('GIVEN_same_event_within_throttle_window_WHEN_notify_twice_THEN_second_suppressed', async () => {
54
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
58
+ const fetchSpy = vi
59
+ .spyOn(globalThis, 'fetch')
60
+ .mockResolvedValue(new Response('ok', { status: 200 }));
55
61
 
56
62
  const config: NotificationConfig = {
57
63
  enabled: true,
58
64
  channels: {
59
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' }
60
- }
65
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' },
66
+ },
61
67
  };
62
68
  const service = new NotifierService(config);
63
69
 
@@ -73,8 +79,8 @@ describe('NotifierService', () => {
73
79
  const config: NotificationConfig = {
74
80
  enabled: true,
75
81
  channels: {
76
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' }
77
- }
82
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' },
83
+ },
78
84
  };
79
85
 
80
86
  const fetchSpy = vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('network error'));
@@ -84,7 +90,7 @@ describe('NotifierService', () => {
84
90
 
85
91
  // Should not throw even when channel fails
86
92
  await expect(
87
- service.notify('gate_failed', { feature_id: 'feat_d', message: 'Failure' })
93
+ service.notify('gate_failed', { feature_id: 'feat_d', message: 'Failure' }),
88
94
  ).resolves.toBeUndefined();
89
95
 
90
96
  expect(stderrSpy).toHaveBeenCalled();
@@ -93,19 +99,21 @@ describe('NotifierService', () => {
93
99
  });
94
100
 
95
101
  it('GIVEN_critical_priority_WHEN_notify_THEN_all_enabled_channels_receive', async () => {
96
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
102
+ const fetchSpy = vi
103
+ .spyOn(globalThis, 'fetch')
104
+ .mockResolvedValue(new Response('ok', { status: 200 }));
97
105
 
98
106
  const config: NotificationConfig = {
99
107
  enabled: true,
100
108
  channels: {
101
109
  slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#alerts' },
102
- webhook: { enabled: true, url: 'https://example.com/hook' }
110
+ webhook: { enabled: true, url: 'https://example.com/hook' },
103
111
  },
104
112
  routing: {
105
113
  critical: ['slack', 'webhook'],
106
114
  warning: ['slack'],
107
- info: ['slack']
108
- }
115
+ info: ['slack'],
116
+ },
109
117
  };
110
118
  const service = new NotifierService(config);
111
119
 
@@ -121,7 +129,9 @@ describe('NotifierService', () => {
121
129
 
122
130
  describe('SlackNotifierChannel', () => {
123
131
  it('GIVEN_valid_webhook_WHEN_send_called_THEN_posts_to_webhook', async () => {
124
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
132
+ const fetchSpy = vi
133
+ .spyOn(globalThis, 'fetch')
134
+ .mockResolvedValue(new Response('ok', { status: 200 }));
125
135
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#test');
126
136
 
127
137
  await channel.send({
@@ -129,12 +139,12 @@ describe('NotifierService', () => {
129
139
  priority: 'critical',
130
140
  feature_id: 'feat_x',
131
141
  message: 'Test message',
132
- timestamp: new Date().toISOString()
142
+ timestamp: new Date().toISOString(),
133
143
  });
134
144
 
135
145
  expect(fetchSpy).toHaveBeenCalledWith(
136
146
  'https://hooks.slack.com/test',
137
- expect.objectContaining({ method: 'POST' })
147
+ expect.objectContaining({ method: 'POST' }),
138
148
  );
139
149
  fetchSpy.mockRestore();
140
150
  });
@@ -142,7 +152,9 @@ describe('NotifierService', () => {
142
152
 
143
153
  describe('WebhookNotifierChannel', () => {
144
154
  it('GIVEN_valid_url_WHEN_send_called_THEN_posts_full_payload', async () => {
145
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
155
+ const fetchSpy = vi
156
+ .spyOn(globalThis, 'fetch')
157
+ .mockResolvedValue(new Response('ok', { status: 200 }));
146
158
  const channel = new WebhookNotifierChannel('https://example.com/notify');
147
159
 
148
160
  const payload: NotificationPayload = {
@@ -150,7 +162,7 @@ describe('NotifierService', () => {
150
162
  priority: 'info',
151
163
  feature_id: 'feat_y',
152
164
  message: 'Merged',
153
- timestamp: new Date().toISOString()
165
+ timestamp: new Date().toISOString(),
154
166
  };
155
167
  await channel.send(payload);
156
168
 
@@ -158,22 +170,26 @@ describe('NotifierService', () => {
158
170
  'https://example.com/notify',
159
171
  expect.objectContaining({
160
172
  method: 'POST',
161
- body: expect.stringContaining('feature_merged')
162
- })
173
+ body: expect.stringContaining('feature_merged'),
174
+ }),
163
175
  );
164
176
  fetchSpy.mockRestore();
165
177
  });
166
178
 
167
179
  it('GIVEN_non_ok_response_WHEN_send_called_THEN_throws_error', async () => {
168
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('bad', { status: 500 }));
180
+ const fetchSpy = vi
181
+ .spyOn(globalThis, 'fetch')
182
+ .mockResolvedValue(new Response('bad', { status: 500 }));
169
183
  const channel = new WebhookNotifierChannel('https://example.com/notify');
170
184
 
171
- await expect(channel.send({
172
- event: 'gate_failed',
173
- priority: 'critical',
174
- message: 'Test',
175
- timestamp: new Date().toISOString()
176
- })).rejects.toThrow('Webhook returned 500');
185
+ await expect(
186
+ channel.send({
187
+ event: 'gate_failed',
188
+ priority: 'critical',
189
+ message: 'Test',
190
+ timestamp: new Date().toISOString(),
191
+ }),
192
+ ).rejects.toThrow('Webhook returned 500');
177
193
 
178
194
  fetchSpy.mockRestore();
179
195
  });
@@ -181,15 +197,19 @@ describe('NotifierService', () => {
181
197
 
182
198
  describe('SlackNotifierChannel non-ok response', () => {
183
199
  it('GIVEN_non_ok_response_WHEN_send_called_THEN_throws_error', async () => {
184
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('bad', { status: 403 }));
200
+ const fetchSpy = vi
201
+ .spyOn(globalThis, 'fetch')
202
+ .mockResolvedValue(new Response('bad', { status: 403 }));
185
203
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#alerts');
186
204
 
187
- await expect(channel.send({
188
- event: 'gate_failed',
189
- priority: 'critical',
190
- message: 'Test',
191
- timestamp: new Date().toISOString()
192
- })).rejects.toThrow('Slack webhook returned 403');
205
+ await expect(
206
+ channel.send({
207
+ event: 'gate_failed',
208
+ priority: 'critical',
209
+ message: 'Test',
210
+ timestamp: new Date().toISOString(),
211
+ }),
212
+ ).rejects.toThrow('Slack webhook returned 403');
193
213
 
194
214
  fetchSpy.mockRestore();
195
215
  });
@@ -198,21 +218,25 @@ describe('NotifierService', () => {
198
218
  describe('createNotifierService factory', () => {
199
219
  it('GIVEN_no_notifications_key_WHEN_createNotifierService_called_THEN_returns_disabled_service', async () => {
200
220
  const service = createNotifierService({});
201
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
221
+ const fetchSpy = vi
222
+ .spyOn(globalThis, 'fetch')
223
+ .mockResolvedValue(new Response('ok', { status: 200 }));
202
224
  await service.notify('gate_failed', { message: 'test' });
203
225
  expect(fetchSpy).not.toHaveBeenCalled();
204
226
  fetchSpy.mockRestore();
205
227
  });
206
228
 
207
229
  it('GIVEN_notifications_object_WHEN_createNotifierService_called_THEN_returns_configured_service', async () => {
208
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
230
+ const fetchSpy = vi
231
+ .spyOn(globalThis, 'fetch')
232
+ .mockResolvedValue(new Response('ok', { status: 200 }));
209
233
  const service = createNotifierService({
210
234
  notifications: {
211
235
  enabled: true,
212
236
  channels: {
213
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#aop' }
214
- }
215
- }
237
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#aop' },
238
+ },
239
+ },
216
240
  });
217
241
  await service.notify('gate_failed', { feature_id: 'feat_z', message: 'Gate failed' });
218
242
  expect(fetchSpy).toHaveBeenCalled();
@@ -223,18 +247,21 @@ describe('NotifierService', () => {
223
247
 
224
248
  describe('DesktopNotifierChannel darwin branch', () => {
225
249
  it('GIVEN_darwin_platform_WHEN_send_called_THEN_silently_handles_osascript_failure', async () => {
226
- const { DesktopNotifierChannel } = await import('../src/application/services/notifier-service.js');
250
+ const { DesktopNotifierChannel } =
251
+ await import('../src/application/services/notifier-service.js');
227
252
  const originalPlatform = process.platform;
228
253
  Object.defineProperty(process, 'platform', { value: 'darwin', configurable: true });
229
254
  try {
230
255
  const channel = new DesktopNotifierChannel();
231
- await expect(channel.send({
232
- event: 'gate_failed',
233
- priority: 'critical',
234
- feature_id: 'feat_darwin',
235
- message: 'darwin test',
236
- timestamp: new Date().toISOString()
237
- })).resolves.toBeUndefined();
256
+ await expect(
257
+ channel.send({
258
+ event: 'gate_failed',
259
+ priority: 'critical',
260
+ feature_id: 'feat_darwin',
261
+ message: 'darwin test',
262
+ timestamp: new Date().toISOString(),
263
+ }),
264
+ ).resolves.toBeUndefined();
238
265
  } finally {
239
266
  Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true });
240
267
  }
@@ -243,37 +270,43 @@ describe('DesktopNotifierChannel darwin branch', () => {
243
270
 
244
271
  describe('SlackNotifierChannel dashboard URL branches', () => {
245
272
  it('GIVEN_dashboard_feature_url_in_details_WHEN_send_called_THEN_appends_dashboard_link', async () => {
246
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
273
+ const fetchSpy = vi
274
+ .spyOn(globalThis, 'fetch')
275
+ .mockResolvedValue(new Response('ok', { status: 200 }));
247
276
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#test');
248
277
  await channel.send({
249
278
  event: 'gate_failed',
250
279
  priority: 'critical',
251
280
  message: 'Test',
252
281
  timestamp: new Date().toISOString(),
253
- details: { dashboard_feature_url: 'http://localhost:3000/features/feat1' }
282
+ details: { dashboard_feature_url: 'http://localhost:3000/features/feat1' },
254
283
  });
255
- const body = JSON.parse((fetchSpy.mock.calls[0][1]).body as string);
284
+ const body = JSON.parse(fetchSpy.mock.calls[0][1].body as string);
256
285
  expect(body.text).toContain('Dashboard:');
257
286
  fetchSpy.mockRestore();
258
287
  });
259
288
 
260
289
  it('GIVEN_dashboard_url_in_details_WHEN_send_called_THEN_falls_back_to_dashboard_url', async () => {
261
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
290
+ const fetchSpy = vi
291
+ .spyOn(globalThis, 'fetch')
292
+ .mockResolvedValue(new Response('ok', { status: 200 }));
262
293
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#test');
263
294
  await channel.send({
264
295
  event: 'gate_failed',
265
296
  priority: 'critical',
266
297
  message: 'Test2',
267
298
  timestamp: new Date().toISOString(),
268
- details: { dashboard_url: 'http://localhost:3000' }
299
+ details: { dashboard_url: 'http://localhost:3000' },
269
300
  });
270
- const body = JSON.parse((fetchSpy.mock.calls[0][1]).body as string);
301
+ const body = JSON.parse(fetchSpy.mock.calls[0][1].body as string);
271
302
  expect(body.text).toContain('Dashboard:');
272
303
  fetchSpy.mockRestore();
273
304
  });
274
305
 
275
306
  it('GIVEN_long_details_json_WHEN_send_called_THEN_truncates_to_800_chars', async () => {
276
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
307
+ const fetchSpy = vi
308
+ .spyOn(globalThis, 'fetch')
309
+ .mockResolvedValue(new Response('ok', { status: 200 }));
277
310
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#test');
278
311
  const longValue = 'x'.repeat(1000);
279
312
  await channel.send({
@@ -281,23 +314,25 @@ describe('SlackNotifierChannel dashboard URL branches', () => {
281
314
  priority: 'critical',
282
315
  message: 'Long details',
283
316
  timestamp: new Date().toISOString(),
284
- details: { data: longValue }
317
+ details: { data: longValue },
285
318
  });
286
- const body = JSON.parse((fetchSpy.mock.calls[0][1]).body as string);
319
+ const body = JSON.parse(fetchSpy.mock.calls[0][1].body as string);
287
320
  expect(body.text).toContain('…');
288
321
  fetchSpy.mockRestore();
289
322
  });
290
323
 
291
324
  it('GIVEN_no_feature_id_WHEN_send_called_THEN_message_without_backtick_feature', async () => {
292
- const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('ok', { status: 200 }));
325
+ const fetchSpy = vi
326
+ .spyOn(globalThis, 'fetch')
327
+ .mockResolvedValue(new Response('ok', { status: 200 }));
293
328
  const channel = new SlackNotifierChannel('https://hooks.slack.com/test', '#test');
294
329
  await channel.send({
295
330
  event: 'feature_merged',
296
331
  priority: 'info',
297
332
  message: 'No feature id',
298
- timestamp: new Date().toISOString()
333
+ timestamp: new Date().toISOString(),
299
334
  });
300
- const body = JSON.parse((fetchSpy.mock.calls[0][1]).body as string);
335
+ const body = JSON.parse(fetchSpy.mock.calls[0][1].body as string);
301
336
  expect(body.text).not.toContain('`');
302
337
  fetchSpy.mockRestore();
303
338
  });
@@ -305,38 +340,44 @@ describe('SlackNotifierChannel dashboard URL branches', () => {
305
340
 
306
341
  describe('DesktopNotifierChannel additional coverage', () => {
307
342
  it('GIVEN_linux_platform_and_successful_execFile_WHEN_send_called_THEN_resolves_without_error', async () => {
308
- const { DesktopNotifierChannel } = await import('../src/application/services/notifier-service.js');
343
+ const { DesktopNotifierChannel } =
344
+ await import('../src/application/services/notifier-service.js');
309
345
  const originalPlatform = process.platform;
310
346
  Object.defineProperty(process, 'platform', { value: 'linux', configurable: true });
311
347
  try {
312
348
  const channel = new DesktopNotifierChannel();
313
349
  // notify-send may not be installed; the channel silently catches errors
314
- await expect(channel.send({
315
- event: 'gate_failed',
316
- priority: 'critical',
317
- feature_id: undefined,
318
- message: 'linux test without feature id',
319
- timestamp: new Date().toISOString()
320
- })).resolves.toBeUndefined();
350
+ await expect(
351
+ channel.send({
352
+ event: 'gate_failed',
353
+ priority: 'critical',
354
+ feature_id: undefined,
355
+ message: 'linux test without feature id',
356
+ timestamp: new Date().toISOString(),
357
+ }),
358
+ ).resolves.toBeUndefined();
321
359
  } finally {
322
360
  Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true });
323
361
  }
324
362
  });
325
363
 
326
364
  it('GIVEN_darwin_platform_and_successful_osascript_WHEN_send_called_THEN_resolves_without_error', async () => {
327
- const { DesktopNotifierChannel } = await import('../src/application/services/notifier-service.js');
365
+ const { DesktopNotifierChannel } =
366
+ await import('../src/application/services/notifier-service.js');
328
367
  const originalPlatform = process.platform;
329
368
  Object.defineProperty(process, 'platform', { value: 'darwin', configurable: true });
330
369
  try {
331
370
  const channel = new DesktopNotifierChannel();
332
371
  // osascript may not be available; channel silently catches errors
333
- await expect(channel.send({
334
- event: 'ready_to_merge',
335
- priority: 'info',
336
- feature_id: undefined,
337
- message: 'darwin test without feature id',
338
- timestamp: new Date().toISOString()
339
- })).resolves.toBeUndefined();
372
+ await expect(
373
+ channel.send({
374
+ event: 'ready_to_merge',
375
+ priority: 'info',
376
+ feature_id: undefined,
377
+ message: 'darwin test without feature id',
378
+ timestamp: new Date().toISOString(),
379
+ }),
380
+ ).resolves.toBeUndefined();
340
381
  } finally {
341
382
  Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true });
342
383
  }
@@ -352,9 +393,9 @@ describe('createNotifierService AOP_DASHBOARD_URL branch', () => {
352
393
  notifications: {
353
394
  enabled: true,
354
395
  channels: {
355
- slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#aop' }
356
- }
357
- }
396
+ slack: { enabled: true, webhook: 'https://hooks.slack.com/test', channel: '#aop' },
397
+ },
398
+ },
358
399
  });
359
400
  expect(service).toBeDefined();
360
401
  } finally {
@@ -369,18 +410,21 @@ describe('createNotifierService AOP_DASHBOARD_URL branch', () => {
369
410
 
370
411
  describe('DesktopNotifierChannel other platform branch', () => {
371
412
  it('GIVEN_win32_platform_WHEN_send_called_THEN_silently_skips', async () => {
372
- const { DesktopNotifierChannel } = await import('../src/application/services/notifier-service.js');
413
+ const { DesktopNotifierChannel } =
414
+ await import('../src/application/services/notifier-service.js');
373
415
  const originalPlatform = process.platform;
374
416
  Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
375
417
  try {
376
418
  const channel = new DesktopNotifierChannel();
377
- await expect(channel.send({
378
- event: 'gate_failed',
379
- priority: 'critical',
380
- feature_id: 'feat_win',
381
- message: 'win32 test',
382
- timestamp: new Date().toISOString()
383
- })).resolves.toBeUndefined();
419
+ await expect(
420
+ channel.send({
421
+ event: 'gate_failed',
422
+ priority: 'critical',
423
+ feature_id: 'feat_win',
424
+ message: 'win32 test',
425
+ timestamp: new Date().toISOString(),
426
+ }),
427
+ ).resolves.toBeUndefined();
384
428
  } finally {
385
429
  Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true });
386
430
  }