mandrel 1.93.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /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' });