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,117 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * bookkeeping-reconcile.js — Epic #4476 (M5).
5
- *
6
- * Drain the per-Epic bookkeeping outbox (buffered structured-comment upserts
7
- * and `agent::*` label flips accumulated during an unattended run) to GitHub,
8
- * once, at finalize. GitHub becomes the source of truth at rest; the outbox is
9
- * cleared only when the whole batch lands (crash-recovery: a partial drain
10
- * leaves the remainder for the next reconcile).
11
- *
12
- * The `/deliver` Phase 7 finalize step calls this once after the merge tail
13
- * opens the PR. It is idempotent: an empty / already-drained outbox is a
14
- * no-op, and both sink operations converge on a re-run.
15
- *
16
- * Usage:
17
- * node .agents/scripts/bookkeeping-reconcile.js --epic <id> [--provider github]
18
- *
19
- * Stdout: a single JSON envelope
20
- * { ok, epicId, drained, comments, labels, errors, cleared }
21
- *
22
- * Exit codes:
23
- * 0 — every buffered op drained (or nothing was buffered)
24
- * 1 — one or more ops failed (outbox retained for the next reconcile)
25
- * 2 — usage error
26
- */
27
-
28
- import { parseArgs } from 'node:util';
29
-
30
- import { runAsCli } from './lib/cli-utils.js';
31
- import { resolveConfig } from './lib/config-resolver.js';
32
- import { Logger } from './lib/Logger.js';
33
- import {
34
- outboxPathFor,
35
- reconcileOutbox,
36
- } from './lib/orchestration/bookkeeping-outbox.js';
37
- import { createProvider } from './lib/provider-factory.js';
38
-
39
- const HELP = `Usage: node .agents/scripts/bookkeeping-reconcile.js \\
40
- --epic <id> [--provider github]
41
-
42
- Drains temp/epic-<id>/bookkeeping-outbox.ndjson (buffered comment upserts +
43
- label flips from an unattended run) to GitHub once, at finalize. Idempotent.
44
-
45
- Flags:
46
- --epic Epic id whose outbox to drain (required).
47
- --provider Provider name (default: inferred from .agentrc.json github block).
48
- --help Show this message.
49
- `;
50
-
51
- /**
52
- * Core: resolve the outbox path and drain it. Exported so tests can drive it
53
- * with a fake provider and an injected outbox path.
54
- *
55
- * @param {{ epicId: number, provider: object, config?: object,
56
- * outboxPath?: string, logger?: object }} args
57
- * @returns {Promise<object>}
58
- */
59
- export async function runBookkeepingReconcile({
60
- epicId,
61
- provider,
62
- config,
63
- outboxPath,
64
- logger = Logger,
65
- }) {
66
- const resolvedOutbox = outboxPath ?? outboxPathFor(epicId, config);
67
- const result = await reconcileOutbox({
68
- outboxPath: resolvedOutbox,
69
- provider,
70
- logger,
71
- });
72
- return { ok: result.errors.length === 0, epicId, ...result };
73
- }
74
-
75
- export function parseArgv(argv) {
76
- const { values } = parseArgs({
77
- args: argv,
78
- options: {
79
- epic: { type: 'string' },
80
- provider: { type: 'string' },
81
- help: { type: 'boolean' },
82
- },
83
- strict: false,
84
- });
85
- return values;
86
- }
87
-
88
- export async function main(argv = process.argv.slice(2)) {
89
- const values = parseArgv(argv);
90
- if (values.help) {
91
- process.stdout.write(HELP);
92
- return;
93
- }
94
-
95
- const epicId = Number.parseInt(values.epic ?? '', 10);
96
- if (!Number.isInteger(epicId) || epicId <= 0) {
97
- process.stderr.write('[bookkeeping-reconcile] --epic <id> is required.\n');
98
- process.stderr.write(HELP);
99
- process.exit(2);
100
- }
101
-
102
- const config = resolveConfig();
103
- const effectiveConfig = values.provider
104
- ? { ...config, provider: values.provider }
105
- : config;
106
- const provider = createProvider(effectiveConfig);
107
-
108
- const envelope = await runBookkeepingReconcile({
109
- epicId,
110
- provider,
111
- config,
112
- });
113
- process.stdout.write(`${JSON.stringify(envelope)}\n`);
114
- if (!envelope.ok) process.exitCode = 1;
115
- }
116
-
117
- runAsCli(import.meta.url, main, { source: 'bookkeeping-reconcile' });
@@ -1,295 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * dispatcher.js — CLI Entry Point for the Dispatch Engine
6
- *
7
- * Thin wrapper around the dispatcher SDK. Parses CLI arguments,
8
- * delegates core logic to `lib/orchestration/dispatch-engine.js`, then
9
- * handles file I/O and console output.
10
- *
11
- * Usage:
12
- * node dispatcher.js <ticketId> [--dry-run]
13
- *
14
- * The script auto-detects whether the ticket is an Epic or Story
15
- * and routes to the appropriate execution mode.
16
- *
17
- * Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
18
- *
19
- * @see .agents/schemas/dispatch-manifest.json
20
- */
21
-
22
- import { runAsCli } from './lib/cli-utils.js';
23
- import {
24
- dispatch,
25
- resolveAndDispatch,
26
- } from './lib/orchestration/dispatch-engine.js';
27
-
28
- // Re-export SDK functions so that direct consumers of dispatcher.js
29
- // (tests, CI scripts) continue to work without modification.
30
- export { dispatch, resolveAndDispatch };
31
-
32
- // ---------------------------------------------------------------------------
33
- // Presentation helpers (CLI-only — not part of the SDK)
34
- // ---------------------------------------------------------------------------
35
-
36
- import { parseSprintArgs } from './lib/cli-args.js';
37
- import { resolveConfig } from './lib/config-resolver.js';
38
- import { Logger } from './lib/Logger.js';
39
- import {
40
- fromSpec,
41
- persistManifest,
42
- postManifestEpicComment,
43
- postParkedFollowOnsComment,
44
- printStoryDispatchTable,
45
- } from './lib/presentation/manifest-renderer.js';
46
- import { createProvider } from './lib/provider-factory.js';
47
- import { loadSpec, loadState } from './lib/spec/index.js';
48
-
49
- /**
50
- * Best-effort: load the structural spec + state for `epicId` and render
51
- * the dispatch manifest Markdown via `fromSpec`. Returns `null` when the
52
- * spec is absent or any loader step throws (parse/validation/io errors
53
- * downgrade to fallback so the pre-spec dispatcher path keeps working
54
- * untouched). Story #1501 — preserves `fromManifest` behaviour for
55
- * non-spec callers.
56
- *
57
- * The loaders are injectable so tests can drive the spec-present /
58
- * spec-absent branches without writing to the real `.agents/epics/`
59
- * directory.
60
- *
61
- * @param {object} manifest — the dispatch manifest already built by `resolveAndDispatch`.
62
- * @param {{
63
- * loadSpec?: typeof loadSpec,
64
- * loadState?: typeof loadState,
65
- * fromSpec?: typeof fromSpec,
66
- * loaderOpts?: object,
67
- * }} [deps]
68
- * @returns {string|null} pre-rendered Markdown, or null on any failure.
69
- */
70
- /**
71
- * Overlay live Story `status` labels from the just-built manifest onto the
72
- * loaded state mapping. The spec-aware renderer (`buildManifestFromSpec`)
73
- * looks up each Story's status via `state.mapping[slug].lastObservedAgentState`;
74
- * that field is only refreshed by the structural reconciler, so during
75
- * `/deliver` execution it stays `null` and every Story renders as ⬜
76
- * pending even after the Story merges. The wave-runner replaced the
77
- * dispatcher-per-wave refresh loop and the local state.json never sees
78
- * the progress signal.
79
- *
80
- * Under the 2-tier hierarchy (Epic #3163) the runtime manifest's wave
81
- * records carry `stories[]` (each with the live `storyId` + `status` from
82
- * `fetchEpicContext`'s GH query), not the retired `tasks[]` shape. The
83
- * overlay walks `manifest.waves[].stories[]` and copies each Story's
84
- * status onto the slug that matches its `storyId` (issueNumber). Pure;
85
- * returns the mutated state. Safe on null/undefined.
86
- *
87
- * @param {object|null|undefined} state
88
- * @param {object|null|undefined} manifest
89
- * @returns {object|null|undefined}
90
- */
91
- export function overlayLiveTaskStateFromManifest(state, manifest) {
92
- if (!state?.mapping || !manifest?.waves) return state;
93
- const issueNumberToSlug = new Map();
94
- for (const [slug, entry] of Object.entries(state.mapping)) {
95
- if (entry && typeof entry.issueNumber === 'number') {
96
- issueNumberToSlug.set(entry.issueNumber, slug);
97
- }
98
- }
99
- for (const wave of manifest.waves) {
100
- if (!Array.isArray(wave?.stories)) continue;
101
- for (const story of wave.stories) {
102
- const slug = issueNumberToSlug.get(story?.storyId);
103
- if (!slug) continue;
104
- if (
105
- typeof story.status === 'string' &&
106
- story.status.startsWith('agent::')
107
- ) {
108
- state.mapping[slug].lastObservedAgentState = story.status;
109
- }
110
- }
111
- }
112
- return state;
113
- }
114
-
115
- export function tryRenderFromSpec(manifest, deps = {}) {
116
- const epicId = manifest?.epicId;
117
- if (!epicId || manifest.type === 'story-execution') return null;
118
- const loadSpecFn = deps.loadSpec ?? loadSpec;
119
- const loadStateFn = deps.loadState ?? loadState;
120
- const fromSpecFn = deps.fromSpec ?? fromSpec;
121
- const overlayFn =
122
- deps.overlayLiveTaskState ?? overlayLiveTaskStateFromManifest;
123
- const loaderOpts = deps.loaderOpts ?? {};
124
- try {
125
- const spec = loadSpecFn(epicId, loaderOpts);
126
- const state = loadStateFn(epicId, loaderOpts);
127
- const overlayedState = overlayFn(state, manifest);
128
- return fromSpecFn(spec, {
129
- state: overlayedState,
130
- generatedAt: manifest.generatedAt,
131
- executor: manifest.executor,
132
- dryRun: manifest.dryRun,
133
- agentTelemetry: manifest.agentTelemetry,
134
- });
135
- } catch (err) {
136
- /* node:coverage ignore next */
137
- Logger.debug?.(
138
- `[Dispatcher] spec-aware render unavailable for Epic #${epicId} (${err?.name ?? 'Error'}: ${err?.message ?? 'unknown'}); falling back to fromManifest`,
139
- );
140
- return null;
141
- }
142
- }
143
- /**
144
- * High-level orchestrator that resolves the execution strategy, generates the manifest,
145
- * persists the files to temp, and outputs summaries.
146
- *
147
- * @param {number} ticketId
148
- * @param {boolean} [dryRun]
149
- * @param {{ provider?: object }} [opts] - Optional overrides. `provider`
150
- * lets callers pass a provider whose per-instance ticket cache is already
151
- * primed, so dashboard regeneration issues zero extra REST calls.
152
- */
153
- /* node:coverage ignore next 8 */
154
- function persistAndAnnounceMarkdown(manifest) {
155
- const specMarkdown = tryRenderFromSpec(manifest);
156
- if (specMarkdown !== null) {
157
- Logger.info(
158
- `[Dispatcher] 📐 Rendering Markdown via fromSpec (spec found for Epic #${manifest.epicId})`,
159
- );
160
- }
161
- persistManifest(manifest, specMarkdown ? { markdown: specMarkdown } : {});
162
- }
163
-
164
- /* node:coverage ignore next 13 */
165
- async function postManifestCommentSafely(manifest, provider) {
166
- try {
167
- const result = await postManifestEpicComment(manifest, provider);
168
- if (result.posted) {
169
- Logger.info(
170
- `[Dispatcher] 💬 Dispatch manifest comment posted on Epic #${manifest.epicId}`,
171
- );
172
- }
173
- } catch (err) {
174
- /* node:coverage ignore next */
175
- Logger.warn(
176
- `[Dispatcher] Non-fatal: could not post manifest comment — ${err.message}`,
177
- );
178
- }
179
- }
180
-
181
- /* node:coverage ignore next 16 */
182
- async function postParkedCommentSafely(manifest, provider) {
183
- try {
184
- const parkedResult = await postParkedFollowOnsComment(manifest, provider);
185
- if (!parkedResult.posted) return;
186
- const hasExtras = parkedResult.recuts > 0 || parkedResult.parked > 0;
187
- Logger.info(
188
- hasExtras
189
- ? `[Dispatcher] 🪝 Parked follow-ons comment posted on Epic #${manifest.epicId} (${parkedResult.recuts} recut, ${parkedResult.parked} parked)`
190
- : `[Dispatcher] 🪝 No out-of-manifest Stories detected on Epic #${manifest.epicId}`,
191
- );
192
- } catch (err) {
193
- /* node:coverage ignore next */
194
- Logger.warn(
195
- `[Dispatcher] Non-fatal: could not post parked-follow-ons comment — ${err.message}`,
196
- );
197
- }
198
- }
199
-
200
- /* node:coverage ignore next 6 */
201
- async function maybePostEpicComments(manifest, resolveProvider) {
202
- if (manifest.type === 'story-execution' || !manifest.epicId) return;
203
- const provider = resolveProvider();
204
- await postManifestCommentSafely(manifest, provider);
205
- await postParkedCommentSafely(manifest, provider);
206
- }
207
-
208
- /* node:coverage ignore next 18 */
209
- function logStoryManifestPaths(manifest) {
210
- const stories = manifest.stories ?? [];
211
- const eid = stories.find((s) => s?.epicId)?.epicId;
212
- if (eid && stories.length === 1) {
213
- const sid = stories[0].storyId;
214
- Logger.info(
215
- `\n[Dispatcher] ✅ Story manifest: temp/epic-${eid}/stories/story-${sid}/manifest.json`,
216
- );
217
- Logger.info(
218
- `[Dispatcher] 📄 Markdown: temp/epic-${eid}/stories/story-${sid}/manifest.md\n`,
219
- );
220
- return;
221
- }
222
- const key = stories.map((s) => s.storyId).join('-');
223
- Logger.info(
224
- `\n[Dispatcher] ✅ Story manifest: temp/story-manifest-${key}.json`,
225
- );
226
- Logger.info(`[Dispatcher] 📄 Markdown: temp/story-manifest-${key}.md\n`);
227
- }
228
-
229
- /* node:coverage ignore next 10 */
230
- function logEpicManifestSummary(manifest) {
231
- const epicId = manifest.epicId;
232
- Logger.info(`\n[Dispatcher] ✅ Manifest: temp/epic-${epicId}/manifest.json`);
233
- Logger.info(`[Dispatcher] 📄 Markdown: temp/epic-${epicId}/manifest.md`);
234
- Logger.info(
235
- `[Dispatcher] Progress: ${manifest.summary.doneStories}/${manifest.summary.totalStories} stories done (${manifest.summary.progressPercent}%)`,
236
- );
237
- Logger.info(`[Dispatcher] Dispatched: ${manifest.summary.dispatched}`);
238
- printStoryDispatchTable(manifest.storyManifest);
239
- }
240
-
241
- /* node:coverage ignore next 7 */
242
- function logManifestSummary(manifest) {
243
- if (manifest.type === 'story-execution') {
244
- logStoryManifestPaths(manifest);
245
- return;
246
- }
247
- logEpicManifestSummary(manifest);
248
- }
249
-
250
- export async function generateAndSaveManifest(
251
- ticketId,
252
- dryRun = false,
253
- opts = {},
254
- ) {
255
- const manifest = await resolveAndDispatch({
256
- ticketId,
257
- dryRun,
258
- provider: opts.provider,
259
- });
260
- persistAndAnnounceMarkdown(manifest);
261
- await maybePostEpicComments(
262
- manifest,
263
- () => opts.provider ?? createProvider(resolveConfig()),
264
- );
265
- logManifestSummary(manifest);
266
- return manifest;
267
- }
268
-
269
- // ---------------------------------------------------------------------------
270
- // CLI entry point
271
- // ---------------------------------------------------------------------------
272
-
273
- /* node:coverage ignore next */
274
- /* node:coverage ignore next */
275
- async function main() {
276
- const { ticketId, dryRun } = parseSprintArgs();
277
-
278
- if (!ticketId) {
279
- Logger.error(
280
- '[Dispatcher] Error: No valid Issue ID provided.\n' +
281
- 'Usage: node dispatcher.js <ticketId> [--dry-run]',
282
- );
283
- process.exit(1);
284
- }
285
-
286
- await generateAndSaveManifest(ticketId, dryRun);
287
- }
288
-
289
- runAsCli(import.meta.url, main, {
290
- source: 'Dispatcher',
291
- onError: (err) => {
292
- Logger.error('[Dispatcher] Fatal error:', err.message);
293
- process.exit(1);
294
- },
295
- });