agentic-orchestrator 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +71 -48
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +5 -22
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/env-file.ts +115 -0
  107. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  108. package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
  109. package/apps/control-plane/src/cli/io.ts +7 -3
  110. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  111. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  112. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  113. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  114. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  115. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  116. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  117. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  118. package/apps/control-plane/src/cli/tooling.ts +3 -3
  119. package/apps/control-plane/src/cli/types.ts +1 -1
  120. package/apps/control-plane/src/core/collisions.ts +27 -10
  121. package/apps/control-plane/src/core/constants.ts +13 -7
  122. package/apps/control-plane/src/core/error-codes.ts +1 -1
  123. package/apps/control-plane/src/core/fs.ts +11 -5
  124. package/apps/control-plane/src/core/gates.ts +53 -27
  125. package/apps/control-plane/src/core/git.ts +18 -6
  126. package/apps/control-plane/src/core/kernel.ts +513 -227
  127. package/apps/control-plane/src/core/patch.ts +7 -3
  128. package/apps/control-plane/src/core/path-layout.ts +5 -1
  129. package/apps/control-plane/src/core/path-rules.ts +19 -5
  130. package/apps/control-plane/src/core/qa-index.ts +26 -12
  131. package/apps/control-plane/src/core/response.ts +9 -6
  132. package/apps/control-plane/src/core/schemas.ts +29 -10
  133. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  134. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  135. package/apps/control-plane/src/index.ts +3 -9
  136. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
  137. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  138. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  139. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  140. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  141. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  142. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  143. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  144. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  145. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  146. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  147. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  148. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  149. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  150. package/apps/control-plane/src/providers/providers.ts +137 -54
  151. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  152. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  153. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  154. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  155. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  156. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  157. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  158. package/apps/control-plane/src/supervisor/types.ts +22 -7
  159. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  160. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  161. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  162. package/apps/control-plane/test/aop.spec.ts +4 -4
  163. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  164. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  165. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  166. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  167. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  168. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  169. package/apps/control-plane/test/cli.spec.ts +1 -1
  170. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  171. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  172. package/apps/control-plane/test/collisions.spec.ts +30 -30
  173. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  174. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  175. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  176. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  177. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  178. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  179. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  180. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  181. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  182. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  183. package/apps/control-plane/test/gates.spec.ts +101 -81
  184. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  185. package/apps/control-plane/test/helpers.ts +10 -6
  186. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  187. package/apps/control-plane/test/init-wizard.spec.ts +328 -68
  188. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  189. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  190. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  191. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  192. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  193. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  194. package/apps/control-plane/test/kernel.spec.ts +134 -51
  195. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  196. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  197. package/apps/control-plane/test/mcp.spec.ts +231 -115
  198. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  199. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  200. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  201. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  202. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  203. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  204. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  205. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  206. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  207. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  208. package/apps/control-plane/test/providers.spec.ts +208 -104
  209. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  210. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  211. package/apps/control-plane/test/reactions.spec.ts +88 -45
  212. package/apps/control-plane/test/response.spec.ts +5 -5
  213. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  214. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  215. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  216. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  217. package/apps/control-plane/test/services.spec.ts +147 -129
  218. package/apps/control-plane/test/session-management.spec.ts +136 -74
  219. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  220. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  221. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  222. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  223. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  224. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  225. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  226. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  227. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  228. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  229. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  230. package/apps/control-plane/tsconfig.build.json +2 -7
  231. package/apps/control-plane/tsconfig.json +1 -5
  232. package/apps/control-plane/vitest.config.ts +7 -7
  233. package/config/agentic/orchestrator/adapters.yaml +3 -0
  234. package/config/agentic/orchestrator/agents.yaml +14 -0
  235. package/config/agentic/orchestrator/gates.yaml +28 -0
  236. package/config/agentic/orchestrator/policy.yaml +22 -0
  237. package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
  238. package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
  239. package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
  240. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  241. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  242. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  243. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  244. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  245. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  246. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  247. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  248. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  249. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  250. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  252. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  254. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  256. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  258. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  260. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  262. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  264. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  266. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  268. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  270. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  271. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  272. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  273. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  274. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  275. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  276. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  277. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  279. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  281. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  282. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  283. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  284. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  285. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  286. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  287. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  288. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  289. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  290. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  291. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  292. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  293. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  294. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  295. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  296. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  297. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  298. package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
  299. package/dist/apps/control-plane/cli/env-file.js +89 -0
  300. package/dist/apps/control-plane/cli/env-file.js.map +1 -0
  301. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  302. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  303. package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
  304. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  305. package/dist/apps/control-plane/cli/io.js +2 -2
  306. package/dist/apps/control-plane/cli/io.js.map +1 -1
  307. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  308. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  310. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  311. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  312. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  313. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  314. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  315. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  316. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  317. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  318. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  319. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  320. package/dist/apps/control-plane/cli/tooling.js +1 -1
  321. package/dist/apps/control-plane/core/collisions.js +11 -8
  322. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  323. package/dist/apps/control-plane/core/constants.js +13 -7
  324. package/dist/apps/control-plane/core/constants.js.map +1 -1
  325. package/dist/apps/control-plane/core/error-codes.js +1 -1
  326. package/dist/apps/control-plane/core/fs.js.map +1 -1
  327. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  328. package/dist/apps/control-plane/core/gates.js +26 -19
  329. package/dist/apps/control-plane/core/gates.js.map +1 -1
  330. package/dist/apps/control-plane/core/git.js +3 -3
  331. package/dist/apps/control-plane/core/git.js.map +1 -1
  332. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  333. package/dist/apps/control-plane/core/kernel.js +134 -81
  334. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  335. package/dist/apps/control-plane/core/patch.js +7 -3
  336. package/dist/apps/control-plane/core/patch.js.map +1 -1
  337. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  338. package/dist/apps/control-plane/core/path-layout.js +4 -1
  339. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  340. package/dist/apps/control-plane/core/path-rules.js +3 -1
  341. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  342. package/dist/apps/control-plane/core/qa-index.js +5 -5
  343. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  344. package/dist/apps/control-plane/core/response.js +3 -3
  345. package/dist/apps/control-plane/core/response.js.map +1 -1
  346. package/dist/apps/control-plane/core/schemas.js +10 -6
  347. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  348. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  349. package/dist/apps/control-plane/index.d.ts +1 -1
  350. package/dist/apps/control-plane/index.js +1 -1
  351. package/dist/apps/control-plane/index.js.map +1 -1
  352. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
  353. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  355. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  357. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  359. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  361. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  362. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  363. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  364. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  365. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  366. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  367. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  368. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  369. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  370. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  371. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  372. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  373. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  374. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  375. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  376. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  377. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  378. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  379. package/dist/apps/control-plane/providers/providers.d.ts +3 -2
  380. package/dist/apps/control-plane/providers/providers.js +81 -39
  381. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  383. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  385. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  387. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  388. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  389. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  390. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  391. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  392. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  393. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  394. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  395. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  396. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  397. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  398. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  399. package/eslint.config.mjs +20 -20
  400. package/example-configurations/README.md +1 -1
  401. package/example-configurations/java/agents.yaml +3 -3
  402. package/example-configurations/java/policy.yaml +1 -1
  403. package/example-configurations/node/agents.yaml +3 -3
  404. package/example-configurations/node/policy.yaml +1 -1
  405. package/package.json +10 -5
  406. package/packages/web-dashboard/next.config.js +2 -2
  407. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  408. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  409. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  410. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  411. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  412. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  413. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  414. package/packages/web-dashboard/src/app/globals.css +10 -2
  415. package/packages/web-dashboard/src/app/page.tsx +100 -37
  416. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  417. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  418. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  419. package/packages/web-dashboard/tsconfig.json +3 -11
  420. package/scripts/nx-safe.mjs +10 -10
  421. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  422. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
  423. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  424. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  425. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  426. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  427. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  428. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  429. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  430. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  431. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  432. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  433. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  434. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  435. package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
  436. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  437. package/spec-files/progress.md +186 -175
  438. package/tsconfig.json +2 -8
@@ -12,13 +12,16 @@ describe('Collision Queue Re-Drive Service', () => {
12
12
 
13
13
  beforeEach(async () => {
14
14
  tempDir = await makeTempRepo(process.cwd());
15
-
15
+
16
16
  // Update policy.yaml to use block collision policy for these tests
17
17
  const policyPath = path.join(tempDir, 'agentic', 'orchestrator', 'policy.yaml');
18
18
  const policyContent = await fs.readFile(policyPath, 'utf8');
19
- const updatedPolicy = policyContent.replace(/collision_policy:\s*reject/, 'collision_policy: block');
19
+ const updatedPolicy = policyContent.replace(
20
+ /collision_policy:\s*reject/,
21
+ 'collision_policy: block',
22
+ );
20
23
  await fs.writeFile(policyPath, updatedPolicy, 'utf8');
21
-
24
+
22
25
  kernel = new AopKernel(tempDir);
23
26
  await kernel.ensureLoaded();
24
27
  collisionQueueService = new CollisionQueueService(kernel);
@@ -26,9 +29,9 @@ describe('Collision Queue Re-Drive Service', () => {
26
29
 
27
30
  it('should return zero when collision_policy is not block', async () => {
28
31
  kernel.policy.collision_policy = 'reject';
29
-
32
+
30
33
  const result = await collisionQueueService.reDriveBlockedQueue();
31
-
34
+
32
35
  expect(result.data.processed).toBe(0);
33
36
  expect(result.data.retried).toBe(0);
34
37
  expect(result.data.still_blocked).toBe(0);
@@ -36,7 +39,7 @@ describe('Collision Queue Re-Drive Service', () => {
36
39
 
37
40
  it('should return zero when blocked_queue is empty', async () => {
38
41
  const result = await collisionQueueService.reDriveBlockedQueue();
39
-
42
+
40
43
  expect(result.data.processed).toBe(0);
41
44
  expect(result.data.retried).toBe(0);
42
45
  expect(result.data.still_blocked).toBe(0);
@@ -53,15 +56,15 @@ describe('Collision Queue Re-Drive Service', () => {
53
56
  plan_version: 1,
54
57
  detected_at: '2026-02-28T12:00:00Z',
55
58
  collision_fingerprint: 'hash-b',
56
- required_resources: []
59
+ required_resources: [],
57
60
  },
58
61
  {
59
62
  feature_id: 'feature-a',
60
63
  plan_version: 1,
61
64
  detected_at: '2026-02-28T11:00:00Z',
62
65
  collision_fingerprint: 'hash-a',
63
- required_resources: []
64
- }
66
+ required_resources: [],
67
+ },
65
68
  ];
66
69
  await kernel.writeIndex(index);
67
70
 
@@ -72,7 +75,7 @@ describe('Collision Queue Re-Drive Service', () => {
72
75
 
73
76
  it('should keep entry in queue if plan is missing', async () => {
74
77
  await kernel.featureInit('feature-missing');
75
-
78
+
76
79
  const index = await kernel.readIndex();
77
80
  index.blocked_queue = [
78
81
  {
@@ -80,8 +83,8 @@ describe('Collision Queue Re-Drive Service', () => {
80
83
  plan_version: 1,
81
84
  detected_at: '2026-02-28T12:00:00Z',
82
85
  collision_fingerprint: 'hash-missing',
83
- required_resources: []
84
- }
86
+ required_resources: [],
87
+ },
85
88
  ];
86
89
  await kernel.writeIndex(index);
87
90
 
@@ -94,20 +97,20 @@ describe('Collision Queue Re-Drive Service', () => {
94
97
 
95
98
  it('should keep entry in queue if locks not held', async () => {
96
99
  await kernel.featureInit('feature-locked');
97
-
100
+
98
101
  await fs.mkdir(path.join(tempDir, '.aop', 'features', 'feature-locked'), { recursive: true });
99
-
102
+
100
103
  const plan = {
101
104
  feature_id: 'feature-locked',
102
105
  plan_version: 1,
103
106
  summary: 'Test plan requiring lock',
104
107
  files: { create: [], modify: [], delete: [] },
105
- contracts: { openapi: 'modify', events: 'none', db: 'none' }
108
+ contracts: { openapi: 'modify', events: 'none', db: 'none' },
106
109
  };
107
110
 
108
111
  await fs.writeFile(
109
112
  path.join(tempDir, '.aop', 'features', 'feature-locked', 'plan.json'),
110
- JSON.stringify(plan, null, 2)
113
+ JSON.stringify(plan, null, 2),
111
114
  );
112
115
 
113
116
  const index = await kernel.readIndex();
@@ -117,8 +120,8 @@ describe('Collision Queue Re-Drive Service', () => {
117
120
  plan_version: 1,
118
121
  detected_at: '2026-02-28T12:00:00Z',
119
122
  collision_fingerprint: 'hash-locked',
120
- required_resources: ['openapi']
121
- }
123
+ required_resources: ['openapi'],
124
+ },
122
125
  ];
123
126
  await kernel.writeIndex(index);
124
127
 
@@ -131,7 +134,7 @@ describe('Collision Queue Re-Drive Service', () => {
131
134
 
132
135
  it('should remove cleared entry from queue', async () => {
133
136
  await kernel.featureInit('feature-clear');
134
-
137
+
135
138
  const index = await kernel.readIndex();
136
139
  index.blocked_queue = [
137
140
  {
@@ -139,8 +142,8 @@ describe('Collision Queue Re-Drive Service', () => {
139
142
  plan_version: 1,
140
143
  detected_at: '2026-02-28T12:00:00Z',
141
144
  collision_fingerprint: 'hash-clear',
142
- required_resources: []
143
- }
145
+ required_resources: [],
146
+ },
144
147
  ];
145
148
  await kernel.writeIndex(index);
146
149
 
@@ -166,7 +169,10 @@ describe('CollisionQueueService additional branches', () => {
166
169
  tempDir = await makeTempRepo(process.cwd());
167
170
  const policyPath = path.join(tempDir, 'agentic', 'orchestrator', 'policy.yaml');
168
171
  const policyContent = await fs.readFile(policyPath, 'utf8');
169
- const updatedPolicy = policyContent.replace(/collision_policy:\s*reject/, 'collision_policy: block');
172
+ const updatedPolicy = policyContent.replace(
173
+ /collision_policy:\s*reject/,
174
+ 'collision_policy: block',
175
+ );
170
176
  await fs.writeFile(policyPath, updatedPolicy, 'utf8');
171
177
  kernel = new AopKernel(tempDir);
172
178
  await kernel.ensureLoaded();
@@ -183,25 +189,28 @@ describe('CollisionQueueService additional branches', () => {
183
189
  feature_id: 'feature-snap',
184
190
  plan_version: 99,
185
191
  summary: 'Stale plan',
186
- allowed_areas: [], forbidden_areas: [], base_ref: 'main',
192
+ allowed_areas: [],
193
+ forbidden_areas: [],
194
+ base_ref: 'main',
187
195
  files: { create: [], modify: [], delete: [] },
188
196
  contracts: { openapi: 'none', events: 'none', db: 'none' },
189
- acceptance_criteria: [], gate_profile: 'default'
197
+ acceptance_criteria: [],
198
+ gate_profile: 'default',
190
199
  };
191
- await fs.writeFile(
192
- path.join(featureDir, 'plan.json'),
193
- JSON.stringify(persistedPlan, null, 2)
194
- );
200
+ await fs.writeFile(path.join(featureDir, 'plan.json'), JSON.stringify(persistedPlan, null, 2));
195
201
 
196
202
  // Snapshot has the matching version (1 = queue entry plan_version)
197
203
  const snapshotPlan = {
198
204
  feature_id: 'feature-snap',
199
205
  plan_version: 1,
200
206
  summary: 'Snapshot plan',
201
- allowed_areas: [], forbidden_areas: [], base_ref: 'main',
207
+ allowed_areas: [],
208
+ forbidden_areas: [],
209
+ base_ref: 'main',
202
210
  files: { create: [], modify: [], delete: [] },
203
211
  contracts: { openapi: 'none', events: 'none', db: 'none' },
204
- acceptance_criteria: [], gate_profile: 'default'
212
+ acceptance_criteria: [],
213
+ gate_profile: 'default',
205
214
  };
206
215
 
207
216
  const index = await kernel.readIndex();
@@ -212,8 +221,8 @@ describe('CollisionQueueService additional branches', () => {
212
221
  detected_at: new Date().toISOString(),
213
222
  collision_fingerprint: 'hash-snap',
214
223
  required_resources: [],
215
- plan_snapshot: snapshotPlan
216
- }
224
+ plan_snapshot: snapshotPlan,
225
+ },
217
226
  ];
218
227
  await kernel.writeIndex(index);
219
228
 
@@ -232,15 +241,15 @@ describe('CollisionQueueService additional branches', () => {
232
241
  plan_version: 1,
233
242
  revision_of: 'not-a-number',
234
243
  summary: 'Test plan',
235
- allowed_areas: [], forbidden_areas: [], base_ref: 'main',
244
+ allowed_areas: [],
245
+ forbidden_areas: [],
246
+ base_ref: 'main',
236
247
  files: { create: [], modify: [], delete: [] },
237
248
  contracts: { openapi: 'none', events: 'none', db: 'none' },
238
- acceptance_criteria: [], gate_profile: 'default'
249
+ acceptance_criteria: [],
250
+ gate_profile: 'default',
239
251
  };
240
- await fs.writeFile(
241
- path.join(featureDir, 'plan.json'),
242
- JSON.stringify(plan, null, 2)
243
- );
252
+ await fs.writeFile(path.join(featureDir, 'plan.json'), JSON.stringify(plan, null, 2));
244
253
 
245
254
  const index = await kernel.readIndex();
246
255
  index.blocked_queue = [
@@ -249,8 +258,8 @@ describe('CollisionQueueService additional branches', () => {
249
258
  plan_version: 1,
250
259
  detected_at: new Date().toISOString(),
251
260
  collision_fingerprint: 'hash-revof',
252
- required_resources: []
253
- }
261
+ required_resources: [],
262
+ },
254
263
  ];
255
264
  await kernel.writeIndex(index);
256
265
 
@@ -8,27 +8,27 @@ describe('detectPlanCollisions', () => {
8
8
  feature_id: 'feature_a',
9
9
  files: { modify: ['src/a.ts'] },
10
10
  allowed_areas: ['src/a'],
11
- contracts: { openapi: 'none', events: 'none', db: 'none' }
11
+ contracts: { openapi: 'none', events: 'none', db: 'none' },
12
12
  },
13
13
  [
14
14
  {
15
15
  feature_id: 'feature_b',
16
16
  files: { modify: ['src/b.ts'] },
17
17
  allowed_areas: ['src/b'],
18
- contracts: { openapi: 'none', events: 'none', db: 'none' }
19
- }
18
+ contracts: { openapi: 'none', events: 'none', db: 'none' },
19
+ },
20
20
  ],
21
21
  {
22
22
  exclusive_areas: ['libs/core'],
23
- protected_areas: ['agentic/orchestrator/policy.yaml']
24
- }
23
+ protected_areas: ['config/agentic/orchestrator/policy.yaml'],
24
+ },
25
25
  );
26
26
 
27
27
  expect(result.hasCollisions).toBe(false);
28
28
  expect(result.collisions).toEqual({
29
29
  files: [],
30
30
  areas: [],
31
- contracts: []
31
+ contracts: [],
32
32
  });
33
33
  expect(result.fingerprint).toBeNull();
34
34
  });
@@ -37,23 +37,23 @@ describe('detectPlanCollisions', () => {
37
37
  const result = detectPlanCollisions(
38
38
  {
39
39
  feature_id: 'feature_a',
40
- files: { create: ['src/shared.ts'] }
40
+ files: { create: ['src/shared.ts'] },
41
41
  },
42
42
  [
43
43
  {
44
44
  feature_id: 'feature_b',
45
- files: { modify: ['src/shared.ts'] }
46
- }
45
+ files: { modify: ['src/shared.ts'] },
46
+ },
47
47
  ],
48
- {}
48
+ {},
49
49
  );
50
50
 
51
51
  expect(result.hasCollisions).toBe(true);
52
52
  expect(result.collisions.files).toEqual([
53
53
  {
54
54
  with_feature_id: 'feature_b',
55
- paths: ['src/shared.ts']
56
- }
55
+ paths: ['src/shared.ts'],
56
+ },
57
57
  ]);
58
58
  expect(typeof result.fingerprint).toBe('string');
59
59
  });
@@ -62,32 +62,32 @@ describe('detectPlanCollisions', () => {
62
62
  const result = detectPlanCollisions(
63
63
  {
64
64
  feature_id: 'feature_a',
65
- allowed_areas: ['libs/core/module_a', 'agentic/orchestrator/schemas']
65
+ allowed_areas: ['libs/core/module_a', 'config/agentic/orchestrator/schemas'],
66
66
  },
67
67
  [
68
68
  {
69
69
  feature_id: 'feature_b',
70
- allowed_areas: ['libs/core']
70
+ allowed_areas: ['libs/core'],
71
71
  },
72
72
  {
73
73
  feature_id: 'feature_c',
74
- allowed_areas: ['agentic/orchestrator']
75
- }
74
+ allowed_areas: ['config/agentic/orchestrator'],
75
+ },
76
76
  ],
77
77
  {
78
78
  exclusive_areas: ['libs/core'],
79
- protected_areas: ['agentic/orchestrator']
80
- }
79
+ protected_areas: ['config/agentic/orchestrator'],
80
+ },
81
81
  );
82
82
 
83
83
  expect(result.hasCollisions).toBe(true);
84
84
  expect(result.collisions.areas).toContainEqual({
85
85
  with_feature_id: 'feature_b',
86
- overlaps: [['libs/core/module_a', 'libs/core']]
86
+ overlaps: [['libs/core/module_a', 'libs/core']],
87
87
  });
88
88
  expect(result.collisions.areas).toContainEqual({
89
89
  with_feature_id: 'feature_c',
90
- overlaps: [['agentic/orchestrator/schemas', 'agentic/orchestrator']]
90
+ overlaps: [['config/agentic/orchestrator/schemas', 'config/agentic/orchestrator']],
91
91
  });
92
92
  });
93
93
 
@@ -95,15 +95,15 @@ describe('detectPlanCollisions', () => {
95
95
  const result = detectPlanCollisions(
96
96
  {
97
97
  feature_id: 'feature_a',
98
- contracts: { openapi: 'modify', events: 'none', db: 'none' }
98
+ contracts: { openapi: 'modify', events: 'none', db: 'none' },
99
99
  },
100
100
  [
101
101
  {
102
102
  feature_id: 'feature_b',
103
- contracts: { openapi: 'modify', events: 'none', db: 'none' }
104
- }
103
+ contracts: { openapi: 'modify', events: 'none', db: 'none' },
104
+ },
105
105
  ],
106
- {}
106
+ {},
107
107
  );
108
108
 
109
109
  expect(result.hasCollisions).toBe(true);
@@ -112,8 +112,8 @@ describe('detectPlanCollisions', () => {
112
112
  with_feature_id: 'feature_b',
113
113
  contract: 'openapi',
114
114
  candidate_mode: 'modify',
115
- other_mode: 'modify'
116
- }
115
+ other_mode: 'modify',
116
+ },
117
117
  ]);
118
118
  });
119
119
 
@@ -121,15 +121,15 @@ describe('detectPlanCollisions', () => {
121
121
  const result = detectPlanCollisions(
122
122
  {
123
123
  feature_id: 'feature_a',
124
- files: { modify: ['src/same.ts'] }
124
+ files: { modify: ['src/same.ts'] },
125
125
  },
126
126
  [
127
127
  {
128
128
  feature_id: 'feature_a',
129
- files: { modify: ['src/same.ts'] }
130
- }
129
+ files: { modify: ['src/same.ts'] },
130
+ },
131
131
  ],
132
- {}
132
+ {},
133
133
  );
134
134
 
135
135
  expect(result.hasCollisions).toBe(false);
@@ -4,7 +4,12 @@ import path from 'node:path';
4
4
  import { describe, expect, it, vi } from 'vitest';
5
5
  import { NodeCommandRunner, NodeGitClient } from '../src/core/git.js';
6
6
  import { parseFrontMatter, buildFrontMatter } from '../src/core/frontmatter.js';
7
- import { anyAreaMatch, areaMatches, normalizeRepoPath, sortResourcesDeterministically } from '../src/core/path-rules.js';
7
+ import {
8
+ anyAreaMatch,
9
+ areaMatches,
10
+ normalizeRepoPath,
11
+ sortResourcesDeterministically,
12
+ } from '../src/core/path-rules.js';
8
13
  import { DiffParser, parseUnifiedDiff, touchedPathsFromDiff } from '../src/core/patch.js';
9
14
 
10
15
  describe('core utility branches', () => {
@@ -12,7 +17,7 @@ describe('core utility branches', () => {
12
17
  expect(parseFrontMatter('plain text')).toEqual({ frontMatter: {}, body: 'plain text' });
13
18
  expect(parseFrontMatter('---\nkey: value\nno_end_marker')).toEqual({
14
19
  frontMatter: {},
15
- body: '---\nkey: value\nno_end_marker'
20
+ body: '---\nkey: value\nno_end_marker',
16
21
  });
17
22
 
18
23
  const parsed = parseFrontMatter('---\nfeature_id: abc\nversion: 1\n---\n\nBody');
@@ -31,9 +36,9 @@ describe('core utility branches', () => {
31
36
  await fs.writeFile(nested, 'export const a = 1;\n', 'utf8');
32
37
 
33
38
  await expect(normalizeRepoPath(repoRoot, nested)).resolves.toBe('src/a.ts');
34
- await expect(normalizeRepoPath(repoRoot, path.join(repoRoot, '../outside.txt'))).rejects.toThrow(
35
- 'path_out_of_bounds'
36
- );
39
+ await expect(
40
+ normalizeRepoPath(repoRoot, path.join(repoRoot, '../outside.txt')),
41
+ ).rejects.toThrow('path_out_of_bounds');
37
42
  await expect(normalizeRepoPath(repoRoot, nested, true)).resolves.toBe('src/a.ts');
38
43
 
39
44
  expect(areaMatches('src/a.ts', 'src')).toBe(true);
@@ -65,7 +70,7 @@ describe('core utility branches', () => {
65
70
  '+++ b/src/added.ts',
66
71
  '@@ -0,0 +4,2 @@',
67
72
  '+x',
68
- '+y'
73
+ '+y',
69
74
  ].join('\n');
70
75
 
71
76
  const parsed = parseUnifiedDiff(diff);
@@ -73,32 +78,37 @@ describe('core utility branches', () => {
73
78
  expect(parsed[0]).toMatchObject({
74
79
  oldPath: 'src/renamed.ts',
75
80
  newPath: 'src/new-name.ts',
76
- changeType: 'modify'
81
+ changeType: 'modify',
77
82
  });
78
83
  expect(parsed[1]).toMatchObject({
79
84
  oldPath: 'src/deleted.ts',
80
85
  newPath: 'src/deleted.ts',
81
- changeType: 'delete'
86
+ changeType: 'delete',
82
87
  });
83
88
  expect(parsed[2]).toMatchObject({
84
89
  oldPath: 'src/added.ts',
85
90
  newPath: 'src/added.ts',
86
- changeType: 'add'
91
+ changeType: 'add',
87
92
  });
88
93
 
89
94
  expect(parsed[1].hunks[0]).toEqual({
90
95
  start_line: 2,
91
96
  end_line: 3,
92
- change_type: 'delete'
97
+ change_type: 'delete',
93
98
  });
94
99
  expect(parsed[2].hunks[0]).toEqual({
95
100
  start_line: 4,
96
101
  end_line: 5,
97
- change_type: 'add'
102
+ change_type: 'add',
98
103
  });
99
104
 
100
105
  const touched = touchedPathsFromDiff(parsed);
101
- expect(touched).toEqual(['src/renamed.ts', 'src/new-name.ts', 'src/deleted.ts', 'src/added.ts']);
106
+ expect(touched).toEqual([
107
+ 'src/renamed.ts',
108
+ 'src/new-name.ts',
109
+ 'src/deleted.ts',
110
+ 'src/added.ts',
111
+ ]);
102
112
  });
103
113
  });
104
114
 
@@ -149,7 +159,9 @@ describe('NodeCommandRunner and NodeGitClient', () => {
149
159
  });
150
160
 
151
161
  it('GIVEN_NodeGitClient_WHEN_runGit_called_THEN_delegates_to_commandRunner', async () => {
152
- const mockRunner = { run: vi.fn(async () => ({ code: 0, signal: null, stdout: 'ok', stderr: '', timeout: false })) };
162
+ const mockRunner = {
163
+ run: vi.fn(async () => ({ code: 0, signal: null, stdout: 'ok', stderr: '', timeout: false })),
164
+ };
153
165
  const client = new NodeGitClient(mockRunner);
154
166
  const result = await client.runGit('/repo', ['status']);
155
167
  expect(mockRunner.run).toHaveBeenCalledWith('git', ['status'], { cwd: '/repo' });
@@ -157,7 +169,9 @@ describe('NodeCommandRunner and NodeGitClient', () => {
157
169
  });
158
170
 
159
171
  it('GIVEN_NodeGitClient_with_cwd_option_WHEN_runGit_called_THEN_uses_provided_cwd', async () => {
160
- const mockRunner = { run: vi.fn(async () => ({ code: 0, signal: null, stdout: '', stderr: '', timeout: false })) };
172
+ const mockRunner = {
173
+ run: vi.fn(async () => ({ code: 0, signal: null, stdout: '', stderr: '', timeout: false })),
174
+ };
161
175
  const client = new NodeGitClient(mockRunner);
162
176
  await client.runGit('/repo', ['log'], { cwd: '/worktree' });
163
177
  expect(mockRunner.run).toHaveBeenCalledWith('git', ['log'], { cwd: '/worktree' });
@@ -219,7 +233,7 @@ rename to new.ts
219
233
  it('GIVEN_diff_with_devnull_paths_WHEN_touchedPaths_called_THEN_devnull_excluded', () => {
220
234
  const result = touchedPathsFromDiff([
221
235
  { oldPath: '/dev/null', newPath: 'src/new.ts', changeType: 'add', hunks: [] },
222
- { oldPath: 'src/old.ts', newPath: '/dev/null', changeType: 'delete', hunks: [] }
236
+ { oldPath: 'src/old.ts', newPath: '/dev/null', changeType: 'delete', hunks: [] },
223
237
  ]);
224
238
  expect(result).not.toContain('/dev/null');
225
239
  expect(result).toContain('src/new.ts');
@@ -48,11 +48,11 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
48
48
  await kernel.invoke('feature.init', { feature_id: 'feat-cost-3' }, ORCH_CTX);
49
49
 
50
50
  const service = new CostTrackingService(kernel);
51
- await service.recordCost('feat-cost-3', 100, 1.00);
51
+ await service.recordCost('feat-cost-3', 100, 1.0);
52
52
 
53
53
  const check = await service.checkBudget('feat-cost-3');
54
54
  expect(check.over_budget).toBe(false);
55
- expect(check.limit_usd).toBe(50.00); // from policy.yaml
55
+ expect(check.limit_usd).toBe(50.0); // from policy.yaml
56
56
  });
57
57
 
58
58
  it('checkBudget returns over_budget=true when cost exceeds limit', async () => {
@@ -63,11 +63,11 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
63
63
 
64
64
  const service = new CostTrackingService(kernel);
65
65
  // Record cost exceeding the $50 limit
66
- await service.recordCost('feat-cost-4', 100000, 55.00);
66
+ await service.recordCost('feat-cost-4', 100000, 55.0);
67
67
 
68
68
  const check = await service.checkBudget('feat-cost-4');
69
69
  expect(check.over_budget).toBe(true);
70
- expect(check.current_cost_usd).toBeCloseTo(55.00);
70
+ expect(check.current_cost_usd).toBeCloseTo(55.0);
71
71
  });
72
72
 
73
73
  it('checkBudget returns alert_threshold_reached at 80% of limit', async () => {
@@ -78,7 +78,7 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
78
78
 
79
79
  const service = new CostTrackingService(kernel);
80
80
  // Record cost at exactly 80% of $50 = $40
81
- await service.recordCost('feat-cost-5', 50000, 40.00);
81
+ await service.recordCost('feat-cost-5', 50000, 40.0);
82
82
 
83
83
  const check = await service.checkBudget('feat-cost-5');
84
84
  expect(check.over_budget).toBe(false);
@@ -88,7 +88,7 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
88
88
  it('checkBudget returns over_budget=false when no budget limit configured', async () => {
89
89
  const service = new CostTrackingService({
90
90
  featureCostPath: () => '/nonexistent/cost.json',
91
- getPolicySnapshot: () => ({}) // no budget key
91
+ getPolicySnapshot: () => ({}), // no budget key
92
92
  });
93
93
 
94
94
  const check = await service.checkBudget('any-feature');
@@ -104,16 +104,24 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
104
104
  await writeFeatureSpec(repoRoot, 'feat-kernel-cost');
105
105
  await kernel.invoke('feature.init', { feature_id: 'feat-kernel-cost' }, ORCH_CTX);
106
106
 
107
- const recordResult = await kernel.invoke('cost.record', {
108
- feature_id: 'feat-kernel-cost',
109
- tokens_used_delta: 2000,
110
- estimated_cost_usd_delta: 0.04
111
- }, ORCH_CTX);
107
+ const recordResult = await kernel.invoke(
108
+ 'cost.record',
109
+ {
110
+ feature_id: 'feat-kernel-cost',
111
+ tokens_used_delta: 2000,
112
+ estimated_cost_usd_delta: 0.04,
113
+ },
114
+ ORCH_CTX,
115
+ );
112
116
  expect(recordResult.ok).toBe(true);
113
117
 
114
- const getResult = await kernel.invoke('cost.get', {
115
- feature_id: 'feat-kernel-cost'
116
- }, ORCH_CTX);
118
+ const getResult = await kernel.invoke(
119
+ 'cost.get',
120
+ {
121
+ feature_id: 'feat-kernel-cost',
122
+ },
123
+ ORCH_CTX,
124
+ );
117
125
  expect(getResult.ok).toBe(true);
118
126
  expect(getResult.data.tokens_used).toBe(2000);
119
127
  expect(getResult.data.estimated_cost_usd).toBeCloseTo(0.04);
@@ -127,17 +135,25 @@ describe('N3: Cost Tracking & Budget Enforcement', () => {
127
135
  await writeFeatureSpec(repoRoot, 'feat-dash-cost');
128
136
  await kernel.invoke('feature.init', { feature_id: 'feat-dash-cost' }, ORCH_CTX);
129
137
 
130
- await kernel.invoke('cost.record', {
131
- feature_id: 'feat-dash-cost',
132
- tokens_used_delta: 500,
133
- estimated_cost_usd_delta: 0.01
134
- }, ORCH_CTX);
138
+ await kernel.invoke(
139
+ 'cost.record',
140
+ {
141
+ feature_id: 'feat-dash-cost',
142
+ tokens_used_delta: 500,
143
+ estimated_cost_usd_delta: 0.01,
144
+ },
145
+ ORCH_CTX,
146
+ );
135
147
 
136
148
  const dashboard = await kernel.invoke('report.dashboard', {}, ORCH_CTX);
137
149
  expect(dashboard.ok).toBe(true);
138
- const feature = (dashboard.data.features as Array<{ feature_id: string; cost: unknown }>)
139
- .find((f) => f.feature_id === 'feat-dash-cost');
140
- expect(feature?.cost).toMatchObject({ estimated_cost_usd: expect.closeTo(0.01), tokens_used: 500 });
150
+ const feature = (
151
+ dashboard.data.features as Array<{ feature_id: string; cost: unknown }>
152
+ ).find((f) => f.feature_id === 'feat-dash-cost');
153
+ expect(feature?.cost).toMatchObject({
154
+ estimated_cost_usd: expect.closeTo(0.01),
155
+ tokens_used: 500,
156
+ });
141
157
  });
142
158
  });
143
159
  });