mandrel 1.94.0 → 2.0.0

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 (393) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/story-worker.md +12 -13
  3. package/.agents/docs/SDLC.md +489 -1285
  4. package/.agents/docs/agentrc-reference.json +177 -67
  5. package/.agents/docs/configuration.md +104 -138
  6. package/.agents/docs/execution-reference.md +17 -20
  7. package/.agents/docs/quality-gates.md +13 -19
  8. package/.agents/docs/workflows.md +3 -3
  9. package/.agents/instructions.md +70 -81
  10. package/.agents/rules/ci-remediation.md +8 -12
  11. package/.agents/rules/git-conventions-reference.md +6 -7
  12. package/.agents/rules/git-conventions.md +16 -22
  13. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  14. package/.agents/schemas/agentrc.schema.json +54 -214
  15. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  16. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  17. package/.agents/schemas/risk-verdict.schema.json +0 -13
  18. package/.agents/scripts/analyze-execution.js +1 -1
  19. package/.agents/scripts/audit-to-stories.js +7 -7
  20. package/.agents/scripts/boot-sweep.js +1 -1
  21. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  22. package/.agents/scripts/check-prepush-recovery.js +1 -1
  23. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  24. package/.agents/scripts/lib/Logger.js +6 -10
  25. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  26. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  27. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  28. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  29. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  30. package/.agents/scripts/lib/baselines/reader.js +1 -6
  31. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  32. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  33. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  34. package/.agents/scripts/lib/checks/index.js +2 -1
  35. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  36. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  37. package/.agents/scripts/lib/cli-args.js +16 -7
  38. package/.agents/scripts/lib/close-validation/gates.js +2 -2
  39. package/.agents/scripts/lib/config/ci.js +6 -31
  40. package/.agents/scripts/lib/config/delivery-routing.js +45 -29
  41. package/.agents/scripts/lib/config/explain.js +55 -36
  42. package/.agents/scripts/lib/config/limits.js +17 -58
  43. package/.agents/scripts/lib/config/paths.js +0 -2
  44. package/.agents/scripts/lib/config/quality.js +1 -1
  45. package/.agents/scripts/lib/config/runners.js +17 -50
  46. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  47. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  48. package/.agents/scripts/lib/config-resolver.js +2 -7
  49. package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
  50. package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
  51. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  52. package/.agents/scripts/lib/dependency-parser.js +3 -2
  53. package/.agents/scripts/lib/doc-tiers.js +2 -2
  54. package/.agents/scripts/lib/duplicate-search.js +211 -41
  55. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  56. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  57. package/.agents/scripts/lib/framework-version.js +2 -3
  58. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  59. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  60. package/.agents/scripts/lib/git-utils.js +32 -6
  61. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  62. package/.agents/scripts/lib/label-constants.js +10 -23
  63. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  64. package/.agents/scripts/lib/observability/active-story-env.js +1 -1
  65. package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
  66. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  67. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  68. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  69. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
  70. package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
  71. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  72. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  73. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  74. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  75. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  76. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  77. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  78. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  79. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  80. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  81. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  82. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  83. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  84. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  85. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  86. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  87. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  88. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  89. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  90. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  91. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  92. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  93. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  94. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  95. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +13 -13
  96. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  97. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  98. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  99. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  100. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  101. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  102. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  103. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  104. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  105. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  106. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  107. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  108. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  109. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  110. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  111. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  112. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  113. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  114. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  115. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  116. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  117. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  118. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  119. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  120. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  121. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  122. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  123. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  124. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  125. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  126. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  127. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  128. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  129. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  130. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  131. package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
  132. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  133. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  134. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  135. package/.agents/scripts/lib/planning-corpus.js +16 -11
  136. package/.agents/scripts/lib/preflight-runner.js +2 -2
  137. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  138. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  139. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  140. package/.agents/scripts/lib/story-adjacency.js +11 -14
  141. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  142. package/.agents/scripts/lib/story-plan.js +2 -4
  143. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  144. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  145. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  146. package/.agents/scripts/lib/validation-evidence.js +1 -1
  147. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  148. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  149. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  150. package/.agents/scripts/lint-issue-body.js +71 -40
  151. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  152. package/.agents/scripts/notify.js +4 -3
  153. package/.agents/scripts/plan-context.js +64 -74
  154. package/.agents/scripts/plan-persist.js +121 -280
  155. package/.agents/scripts/plan-run-epilogue.js +97 -0
  156. package/.agents/scripts/providers/github/issues.js +17 -33
  157. package/.agents/scripts/providers/github/mappers.js +0 -12
  158. package/.agents/scripts/providers/github/tickets.js +2 -5
  159. package/.agents/scripts/resolve-plan-run.js +117 -0
  160. package/.agents/scripts/signals-view.js +24 -19
  161. package/.agents/scripts/single-story-close.js +11 -14
  162. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  163. package/.agents/scripts/single-story-init.js +29 -20
  164. package/.agents/scripts/stories-wave-tick.js +6 -6
  165. package/.agents/scripts/story-plan.js +26 -47
  166. package/.agents/scripts/update-ticket-state.js +6 -15
  167. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  168. package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
  169. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  170. package/.agents/skills/skills.index.json +3 -43
  171. package/.agents/starter-agentrc.json +0 -5
  172. package/.agents/templates/agent-protocol.md +9 -10
  173. package/.agents/workflows/audit-architecture.md +3 -3
  174. package/.agents/workflows/audit-clean-code.md +3 -3
  175. package/.agents/workflows/audit-dependencies.md +3 -3
  176. package/.agents/workflows/audit-devops.md +3 -3
  177. package/.agents/workflows/audit-documentation.md +5 -5
  178. package/.agents/workflows/audit-lighthouse.md +3 -3
  179. package/.agents/workflows/audit-navigability.md +3 -2
  180. package/.agents/workflows/audit-performance.md +3 -3
  181. package/.agents/workflows/audit-privacy.md +3 -3
  182. package/.agents/workflows/audit-quality.md +3 -3
  183. package/.agents/workflows/audit-security.md +3 -3
  184. package/.agents/workflows/audit-seo.md +3 -3
  185. package/.agents/workflows/audit-sre.md +3 -3
  186. package/.agents/workflows/audit-to-stories.md +20 -20
  187. package/.agents/workflows/audit-ux-ui.md +3 -3
  188. package/.agents/workflows/deliver.md +122 -174
  189. package/.agents/workflows/git-cleanup.md +3 -4
  190. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  191. package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
  192. package/.agents/workflows/helpers/code-review.md +70 -193
  193. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  194. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  195. package/.agents/workflows/helpers/diagnose.md +10 -10
  196. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  197. package/.agents/workflows/helpers/signals.md +16 -16
  198. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  199. package/.agents/workflows/mandrel-update.md +2 -1
  200. package/.agents/workflows/plan.md +112 -145
  201. package/.agents/workflows/qa-assist.md +24 -30
  202. package/.agents/workflows/qa-explore.md +29 -38
  203. package/.agents/workflows/qa-run.md +2 -2
  204. package/README.md +9 -8
  205. package/docs/CHANGELOG.md +30 -0
  206. package/lib/migrations/index.js +6 -5
  207. package/package.json +2 -2
  208. package/.agents/agents/retro.md +0 -42
  209. package/.agents/personas/architect.md +0 -113
  210. package/.agents/personas/devops-engineer.md +0 -38
  211. package/.agents/personas/engineer.md +0 -33
  212. package/.agents/personas/project-manager.md +0 -114
  213. package/.agents/personas/qa-engineer.md +0 -95
  214. package/.agents/personas/security-engineer.md +0 -111
  215. package/.agents/personas/technical-writer.md +0 -101
  216. package/.agents/schemas/dispatch-manifest.json +0 -232
  217. package/.agents/schemas/epic-spec.schema.json +0 -153
  218. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  219. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  220. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  221. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  222. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  223. package/.agents/scripts/dispatcher.js +0 -295
  224. package/.agents/scripts/epic-audit-prepare.js +0 -497
  225. package/.agents/scripts/epic-audit-recheck.js +0 -274
  226. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  227. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  228. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  229. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  230. package/.agents/scripts/epic-plan-clarity.js +0 -211
  231. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  232. package/.agents/scripts/epic-reconcile.js +0 -625
  233. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  234. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  235. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  236. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  237. package/.agents/scripts/lib/config/preflight.js +0 -58
  238. package/.agents/scripts/lib/config/retro.js +0 -77
  239. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  240. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  241. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  242. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  243. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  244. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  245. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  246. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  247. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  248. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  249. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  250. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  251. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  252. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  253. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  254. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  255. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  256. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  257. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  258. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  259. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  260. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  261. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  262. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  263. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  264. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  265. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  266. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  267. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  268. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  269. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  270. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  271. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  272. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  273. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  274. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  275. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  276. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  277. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  278. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  279. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  280. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  281. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  282. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  283. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  284. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  285. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  286. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  287. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  288. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  289. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  290. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  291. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  292. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  293. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  294. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  295. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  296. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  297. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  298. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  299. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  300. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  301. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  302. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  303. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  304. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  305. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  306. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  307. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  308. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  309. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  310. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  311. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  312. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  313. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  314. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  315. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  316. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  317. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  318. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  319. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  320. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  321. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  322. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  323. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  324. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  325. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  326. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  327. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  328. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  329. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  330. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  331. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  332. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  333. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  334. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  335. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  336. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  337. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  338. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  339. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  340. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  341. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  342. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  343. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  344. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  345. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  346. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  347. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  348. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  349. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  350. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  351. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  352. package/.agents/scripts/lib/spec/index.js +0 -36
  353. package/.agents/scripts/lib/spec/loader.js +0 -425
  354. package/.agents/scripts/lib/spec/state.js +0 -208
  355. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  356. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  357. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  358. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  359. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  360. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  361. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  362. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  363. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  364. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  365. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  366. package/.agents/scripts/lifecycle-emit.js +0 -510
  367. package/.agents/scripts/retro-run.js +0 -218
  368. package/.agents/scripts/slice-phase.js +0 -361
  369. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  370. package/.agents/scripts/story-close.js +0 -294
  371. package/.agents/scripts/story-init.js +0 -599
  372. package/.agents/scripts/story-phase.js +0 -369
  373. package/.agents/scripts/wave-tick.js +0 -464
  374. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  375. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  376. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  377. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  378. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  379. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  380. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  381. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  382. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  383. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  384. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  385. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  386. package/.agents/workflows/helpers/epic-audit.md +0 -189
  387. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  388. package/.agents/workflows/helpers/epic-testing.md +0 -125
  389. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  390. package/.agents/workflows/helpers/plan-epic.md +0 -353
  391. package/.agents/workflows/helpers/plan-story.md +0 -251
  392. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  393. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,274 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * epic-audit-recheck.js — Cross-phase re-trigger selector.
6
- *
7
- * Story #2619 (Epic #2586). Read a list of touched files (provided by the
8
- * caller after the code-review auto-fix loop in
9
- * `.agents/workflows/helpers/code-review.md` Step 4.6) and emit the
10
- * subset of audit lenses whose `filePatterns` overlap that list.
11
- *
12
- * The CLI is intentionally narrower than `lib/audit-suite/selector.js`: it does NOT
13
- * run a git diff and does NOT consult the Epic ticket body for keyword
14
- * triggers. The auto-fix tail already knows exactly which paths it touched —
15
- * only file-pattern overlap is relevant for deciding which lenses are stale
16
- * and need re-invocation.
17
- *
18
- * Tier gate (Epic #4405): this is the **Epic-close** re-check, so it emits
19
- * only non-`local` lenses. A `local`-tier lens is verified shift-left at
20
- * write-time and Story-scope review; re-running it here would verify the same
21
- * concern at a second tier. The overlap set is therefore filtered through
22
- * `resolveLensTier`, dropping every `local` lens (including the universal
23
- * `audit-clean-code`) so a focused-fix commit cannot drag one back into the
24
- * Epic-close re-check.
25
- *
26
- * Usage:
27
- * node .agents/scripts/epic-audit-recheck.js \
28
- * --epic <id> --files <comma-list-or-@file>
29
- *
30
- * --files comma-list: --files src/auth/login.js,src/api/users.ts
31
- * --files @path: --files @temp/touched.txt (newline-delimited)
32
- *
33
- * Output: a single JSON envelope on stdout:
34
- * {
35
- * epicId,
36
- * selectedAudits: string[], // lenses whose filePatterns overlap input
37
- * context: {
38
- * changedFiles: string[], // normalized input list (dedup, non-empty)
39
- * changedFilesCount: number,
40
- * }
41
- * }
42
- *
43
- * Exit codes:
44
- * 0 — emitted envelope (selectedAudits MAY be empty when no lens overlaps)
45
- * 2 — validation error (missing --epic, missing --files, unreadable
46
- * @file). Error message written to stderr.
47
- */
48
-
49
- import fs from 'node:fs';
50
- import path from 'node:path';
51
- import {
52
- matchesAnyFilePattern,
53
- resolveLensTier,
54
- } from './lib/audit-suite/index.js';
55
- import { defineFlags } from './lib/cli-args.js';
56
- import { runAsCli } from './lib/cli-utils.js';
57
- import {
58
- getPaths,
59
- PROJECT_ROOT,
60
- resolveConfig,
61
- } from './lib/config-resolver.js';
62
-
63
- const HELP = `Usage: node .agents/scripts/epic-audit-recheck.js \\
64
- --epic <id> --files <comma-list-or-@file>
65
-
66
- Flags:
67
- --epic GitHub Epic issue number (required).
68
- --files Comma-separated list of touched file paths, OR @<path> to read
69
- a newline-delimited list from a file (required). Empty entries
70
- are stripped.
71
- --help Show this message.
72
- `;
73
-
74
- export function parseArgv(argv) {
75
- const { values } = defineFlags(
76
- {
77
- epic: { type: 'ticket' },
78
- files: { type: 'string' },
79
- help: { type: 'boolean' },
80
- },
81
- argv,
82
- );
83
- return values;
84
- }
85
-
86
- /**
87
- * Normalize a `--files` value into a deduped array of non-empty paths.
88
- * Accepts either a comma-separated literal or `@<path>` (newline-delimited
89
- * file). Returns `{ files, error }` — exactly one is populated.
90
- *
91
- * @param {string} raw
92
- * @param {{ readFileSync?: typeof fs.readFileSync, cwd?: string }} [deps]
93
- */
94
- export function resolveFilesArg(raw, deps = {}) {
95
- if (typeof raw !== 'string' || raw.trim() === '') {
96
- return { error: '[epic-audit-recheck] --files is required.' };
97
- }
98
- const readFile = deps.readFileSync ?? fs.readFileSync;
99
- const cwd = deps.cwd ?? process.cwd();
100
-
101
- let listText = raw;
102
- if (raw.startsWith('@')) {
103
- const filePath = raw.slice(1);
104
- if (!filePath) {
105
- return { error: '[epic-audit-recheck] --files @<path> missing path.' };
106
- }
107
- const absPath = path.isAbsolute(filePath)
108
- ? filePath
109
- : path.join(cwd, filePath);
110
- try {
111
- listText = readFile(absPath, 'utf8');
112
- } catch (err) {
113
- return {
114
- error: `[epic-audit-recheck] Failed to read ${absPath}: ${err.message}`,
115
- };
116
- }
117
- }
118
-
119
- // Comma or newline are both valid delimiters — the @file form is
120
- // newline-delimited, the inline form is comma-delimited. Splitting on
121
- // either keeps both code paths converging on the same normalizer.
122
- const seen = new Set();
123
- const files = [];
124
- for (const token of listText.split(/[\n,]/)) {
125
- const trimmed = token.trim();
126
- if (trimmed === '') continue;
127
- if (seen.has(trimmed)) continue;
128
- seen.add(trimmed);
129
- files.push(trimmed);
130
- }
131
- return { files };
132
- }
133
-
134
- /**
135
- * Load the audit-rules document validated elsewhere by
136
- * `lib/audit-suite/selector.js`. Surfaced as a separate function so tests
137
- * can swap a fixture in without touching the on-disk schema file.
138
- *
139
- * @param {{ readFileSync?: typeof fs.readFileSync }} [deps]
140
- */
141
- export function loadAuditRules(deps = {}) {
142
- const config = resolveConfig();
143
- const rulesPath = path.join(
144
- PROJECT_ROOT,
145
- getPaths(config).schemasRoot,
146
- 'audit-rules.json',
147
- );
148
- const read = deps.readFileSync ?? fs.readFileSync;
149
- let text;
150
- try {
151
- text = read(rulesPath, 'utf8');
152
- } catch (err) {
153
- throw new Error(
154
- `[epic-audit-recheck] Failed to read audit-rules from ${rulesPath}: ${err.message}`,
155
- );
156
- }
157
- return JSON.parse(text);
158
- }
159
-
160
- /**
161
- * Pure overlap detector. Walks the audit-rules document and returns the
162
- * names of every **non-`local`** audit whose `triggers.filePatterns` matches
163
- * at least one entry in `files`. Lenses without `filePatterns` (or with an
164
- * empty array) NEVER appear in the output — keyword triggers are
165
- * intentionally ignored: this CLI answers "what was invalidated by the
166
- * touched paths?", not "what should I run from scratch?".
167
- *
168
- * The output is additionally gated by tier (Epic #4405): a `local`-tier lens
169
- * is verified shift-left (write-time + Story-scope) and is never re-run at
170
- * Epic close, so it is dropped here even when its patterns overlap. This
171
- * matters now that `audit-clean-code` carries the universal `**` glob — its
172
- * overlap is universal, so without the tier gate every focused-fix commit
173
- * would drag it (and any other local lens) back into the Epic-close re-check.
174
- *
175
- * @param {{ audits: Record<string, { triggers?: { filePatterns?: string[] } }> }} rules
176
- * @param {string[]} files
177
- * @param {(lens: string) => string} [resolveLensTierFn] tier resolver
178
- * (injectable seam; defaults to {@link resolveLensTier}).
179
- */
180
- export function selectOverlappingAudits(
181
- rules,
182
- files,
183
- resolveLensTierFn = resolveLensTier,
184
- ) {
185
- const selected = [];
186
- for (const [auditName, ruleOpts] of Object.entries(rules?.audits ?? {})) {
187
- const patterns = ruleOpts?.triggers?.filePatterns;
188
- if (!Array.isArray(patterns) || patterns.length === 0) continue;
189
- if (!matchesAnyFilePattern(patterns, files)) continue;
190
- // Epic-close tier gate: skip `local` lenses (verified shift-left). A
191
- // malformed/unknown tier is drift the schema guards against — skip it
192
- // rather than throw the whole selection.
193
- let tier;
194
- try {
195
- tier = resolveLensTierFn(auditName);
196
- } catch {
197
- continue;
198
- }
199
- if (tier === 'local') continue;
200
- selected.push(auditName);
201
- }
202
- return selected;
203
- }
204
-
205
- /**
206
- * Pure pipeline body. Returns `{ exitCode, result }` where
207
- * `result.kind` is `'help' | 'validation-error' | 'envelope'`. `main`
208
- * renders these; tests drive this directly.
209
- */
210
- export async function runEpicAuditRecheckCli(values, deps = {}) {
211
- const helpText = deps.help ?? HELP;
212
- if (values.help) {
213
- return { exitCode: 0, result: { kind: 'help', text: helpText } };
214
- }
215
-
216
- const { epic, files: filesRaw } = values;
217
-
218
- if (!Number.isFinite(epic) || epic <= 0) {
219
- return {
220
- exitCode: 2,
221
- result: {
222
- kind: 'validation-error',
223
- message: '[epic-audit-recheck] --epic <id> is required.',
224
- help: helpText,
225
- },
226
- };
227
- }
228
-
229
- const filesResult = (deps.resolveFilesArg ?? resolveFilesArg)(filesRaw, deps);
230
- if (filesResult.error) {
231
- return {
232
- exitCode: 2,
233
- result: {
234
- kind: 'validation-error',
235
- message: filesResult.error,
236
- help: helpText,
237
- },
238
- };
239
- }
240
-
241
- const rules = (deps.loadAuditRules ?? loadAuditRules)(deps);
242
- const selectedAudits = (
243
- deps.selectOverlappingAudits ?? selectOverlappingAudits
244
- )(rules, filesResult.files);
245
-
246
- const envelope = {
247
- epicId: epic,
248
- selectedAudits,
249
- context: {
250
- changedFiles: filesResult.files,
251
- changedFilesCount: filesResult.files.length,
252
- },
253
- };
254
-
255
- return { exitCode: 0, result: { kind: 'envelope', envelope } };
256
- }
257
-
258
- export async function main(argv = process.argv.slice(2)) {
259
- const values = parseArgv(argv);
260
- const { exitCode, result } = await runEpicAuditRecheckCli(values);
261
-
262
- if (result.kind === 'help') {
263
- process.stdout.write(result.text);
264
- return;
265
- }
266
- if (result.kind === 'validation-error') {
267
- process.stderr.write(`${result.message}\n${result.help}`);
268
- process.exit(exitCode);
269
- }
270
- process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
271
- if (exitCode !== 0) process.exit(exitCode);
272
- }
273
-
274
- runAsCli(import.meta.url, main, { source: 'epic-audit-recheck' });
@@ -1,192 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * epic-deliver-note-intervention.js — record a manual-intervention event
6
- * against the active `/deliver` run-state checkpoint.
7
- *
8
- * The host LLM driving `/deliver` invokes this CLI whenever it does
9
- * something out-of-band that disqualifies the Epic from auto-merge:
10
- *
11
- * - `AskUserQuestion` to the operator mid-run
12
- * - `git restore` / `git reset` against the working tree
13
- * - manual `--no-ff` recovery merge
14
- * - per-Story close that needed `--skipValidation`
15
- *
16
- * The auto-merge predicate (see
17
- * `lib/orchestration/lifecycle/listeners/automerge-predicate.js`) reads
18
- * `state.manualInterventions[]` and refuses to fire when the array is
19
- * non-empty.
20
- *
21
- * Story #2413 / Task #2426 — the CLI no longer writes the structured
22
- * comment directly. It builds an `intervention.recorded` payload, emits
23
- * it through a one-shot lifecycle bus, and lets the
24
- * `InterventionRecorder` listener (registered against the same bus)
25
- * persist the record via the epic-run-state-store. This collapses the
26
- * legacy script-level checkpoint consumer to a single bus emit, matching
27
- * the canonical pattern for state mutations described in the lifecycle
28
- * listeners README.
29
- *
30
- * Usage:
31
- * node .agents/scripts/epic-deliver-note-intervention.js \
32
- * --epic <epicId> --reason "<text>" [--source <text>]
33
- *
34
- * Output: a single JSON envelope `{ epicId, intervention, total }`.
35
- */
36
-
37
- import { parseArgs } from 'node:util';
38
-
39
- import { runAsCli } from './lib/cli-utils.js';
40
- import { resolveConfig } from './lib/config-resolver.js';
41
- import { Logger } from './lib/Logger.js';
42
- import { read as readEpicRunState } from './lib/orchestration/epic-run-state-store.js';
43
- import { createBus } from './lib/orchestration/lifecycle/bus.js';
44
- import {
45
- INTERVENTION_RECORDED_EVENT,
46
- InterventionRecorder,
47
- } from './lib/orchestration/lifecycle/listeners/intervention-recorder.js';
48
- import { createProvider } from './lib/provider-factory.js';
49
-
50
- const HELP = `Usage: node .agents/scripts/epic-deliver-note-intervention.js \\
51
- --epic <epicId> --reason "<text>" [--source <text>]
52
-
53
- Emits an \`intervention.recorded\` lifecycle event for Epic #<epicId>. The
54
- InterventionRecorder listener appends the payload to the epic-run-state
55
- structured comment, disqualifying the Epic from auto-merge.
56
- `;
57
-
58
- /**
59
- * Pure: parse argv into the normalized option bag. Exported for tests.
60
- *
61
- * @param {string[]} argv
62
- * @returns {{ epicId: number|null, reason: string|null, source: string|null, help: boolean }}
63
- */
64
- export function parseNoteArgs(argv) {
65
- const { values } = parseArgs({
66
- args: argv,
67
- options: {
68
- epic: { type: 'string' },
69
- reason: { type: 'string' },
70
- source: { type: 'string' },
71
- help: { type: 'boolean', short: 'h' },
72
- },
73
- strict: false,
74
- });
75
- const epicId = Number.parseInt(values.epic ?? '', 10);
76
- const reason = typeof values.reason === 'string' ? values.reason.trim() : '';
77
- const source = typeof values.source === 'string' ? values.source.trim() : '';
78
- return {
79
- epicId: Number.isNaN(epicId) || epicId <= 0 ? null : epicId,
80
- reason: reason.length > 0 ? reason : null,
81
- source: source.length > 0 ? source : null,
82
- help: values.help === true,
83
- };
84
- }
85
-
86
- /**
87
- * Runner-shaped entry point. DI-friendly so tests can stub the provider
88
- * and bus without touching disk or the GitHub API.
89
- *
90
- * The bus emit drives the InterventionRecorder listener, which grows
91
- * the `manualInterventions` array on the epic-run-state structured
92
- * comment via the function-based store. After the emit settles, we
93
- * read the comment back so the CLI's stdout envelope can report
94
- * `{ intervention, total }` exactly as before the script-level
95
- * checkpoint cut-over.
96
- *
97
- * @param {{
98
- * epicId: number,
99
- * reason: string,
100
- * source?: string,
101
- * injectedConfig?: object,
102
- * injectedProvider?: object,
103
- * busFactory?: () => { emit: Function, on: Function },
104
- * listenerFactory?: (deps: { provider: object, epicId: number, bus: object }) => { register: Function },
105
- * readEpicRunState?: (deps: { provider: object, epicId: number }) => Promise<object|null>,
106
- * now?: () => string,
107
- * }} args
108
- * @returns {Promise<{ epicId: number, intervention: object, total: number }>}
109
- */
110
- export async function runNoteIntervention({
111
- epicId,
112
- reason,
113
- source,
114
- injectedConfig,
115
- injectedProvider,
116
- busFactory,
117
- listenerFactory,
118
- readEpicRunState: readEpicRunStateFn,
119
- now,
120
- } = {}) {
121
- if (!Number.isInteger(epicId) || epicId <= 0) {
122
- throw new TypeError(
123
- 'runNoteIntervention: epicId must be a positive integer',
124
- );
125
- }
126
- if (typeof reason !== 'string' || reason.length === 0) {
127
- throw new TypeError('runNoteIntervention: reason is required');
128
- }
129
-
130
- const config = injectedConfig ?? resolveConfig();
131
- const provider = injectedProvider ?? createProvider(config);
132
- const bus = busFactory ? busFactory() : createBus();
133
- const buildListener =
134
- listenerFactory ?? ((deps) => new InterventionRecorder(deps));
135
- const listener = buildListener({ provider, epicId, bus });
136
- if (typeof listener.register === 'function') {
137
- listener.register(bus);
138
- }
139
-
140
- const ts = typeof now === 'function' ? now() : new Date().toISOString();
141
- const resolvedSource =
142
- typeof source === 'string' && source.length > 0 ? source : 'host-llm';
143
- const payload = {
144
- epicId,
145
- reason,
146
- source: resolvedSource,
147
- ts,
148
- };
149
- await bus.emit(INTERVENTION_RECORDED_EVENT, payload);
150
-
151
- // Read the state back so the stdout envelope reports the canonical
152
- // `{ intervention, total }` shape. The listener has already persisted
153
- // the record by the time `emit` resolves (sequential awaited mediator);
154
- // a missing comment collapses to `total: 0` defensively.
155
- const readFn = readEpicRunStateFn ?? readEpicRunState;
156
- const state = (await readFn({ provider, epicId })) ?? {};
157
- const list = Array.isArray(state.manualInterventions)
158
- ? state.manualInterventions
159
- : [];
160
- const intervention = list[list.length - 1] ?? null;
161
- return { epicId, intervention, total: list.length };
162
- }
163
-
164
- async function main() {
165
- const args = parseNoteArgs(process.argv.slice(2));
166
- if (args.help) {
167
- Logger.info(HELP);
168
- return;
169
- }
170
- if (args.epicId === null) {
171
- Logger.error(
172
- '[epic-deliver-note-intervention] ERROR: --epic <epicId> is required.',
173
- );
174
- Logger.error(HELP);
175
- process.exit(2);
176
- }
177
- if (args.reason === null) {
178
- Logger.error(
179
- '[epic-deliver-note-intervention] ERROR: --reason "<text>" is required.',
180
- );
181
- Logger.error(HELP);
182
- process.exit(2);
183
- }
184
- const out = await runNoteIntervention({
185
- epicId: args.epicId,
186
- reason: args.reason,
187
- source: args.source ?? undefined,
188
- });
189
- Logger.info(JSON.stringify(out, null, 2));
190
- }
191
-
192
- runAsCli(import.meta.url, main, { source: 'epic-deliver-note-intervention' });