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,213 +0,0 @@
1
- /**
2
- * manifest-helpers.js
3
- *
4
- * Small pure helpers shared by the dispatch-manifest renderer
5
- * (`manifest-formatter.js`) and the per-wave renderer
6
- * (`manifest-render-waves.js`). Split out (Story #1849 Task #1871) so
7
- * the parent formatter can collapse to the wiring facade. The formatter
8
- * re-exports every name here so existing call-sites' import paths stay
9
- * unchanged.
10
- *
11
- * Post-2-tier (Story #3194 / #3413, Epic #3163): the helpers consume the
12
- * Story-only manifest shape. Stories carry their lifecycle state on a
13
- * top-level `status` field (the parent Story's `agent::*` label) — the
14
- * old per-Story Task array, the per-Task id indirection, and the
15
- * Task-tier summary pass-through have all been deleted. `computeProgress`
16
- * now reports Story-tier aggregates only.
17
- */
18
-
19
- import { AGENT_LABELS } from '../label-constants.js';
20
-
21
- /**
22
- * Pick the per-Story symbol for the wave-grouped Story table:
23
- * 🚧 — Story is `agent::blocked`
24
- * ✅ — Story is `agent::done`
25
- * 🔄 — Story is `agent::executing` (in flight)
26
- * ⬜ — Story is `agent::ready` or unset (planning-time default)
27
- *
28
- * Pure: derives the symbol from `story.status` only.
29
- *
30
- * @param {{ status?: string }} story
31
- * @returns {string}
32
- */
33
- export function deriveStorySymbol(story) {
34
- const status = story?.status;
35
- if (status === AGENT_LABELS.BLOCKED) return '🚧';
36
- if (status === AGENT_LABELS.DONE) return '✅';
37
- if (status === AGENT_LABELS.EXECUTING) return '🔄';
38
- return '⬜';
39
- }
40
-
41
- /**
42
- * Compute aggregate progress numbers for a dispatch manifest. Pure.
43
- *
44
- * Story-only shape (Epic #3163, Story #3413): `doneStories` /
45
- * `totalStories` are derived from each Story's top-level `status` (the
46
- * parent Story's `agent::*` label), not from a nested Task array.
47
- * `storyPct` is the Story-tier completion percentage; the residual
48
- * Task-tier pass-through fields have been deleted.
49
- *
50
- * @param {object} manifest
51
- * @returns {{
52
- * storyPct: number,
53
- * doneStories: number,
54
- * totalStories: number,
55
- * storyWaveCount: number,
56
- * }}
57
- */
58
- export function computeProgress(manifest) {
59
- const storyManifest = manifest?.storyManifest ?? [];
60
-
61
- const allStoryItems = storyManifest.filter(
62
- (s) => s.type === 'story' && s.storyId !== '__ungrouped__',
63
- );
64
- const totalStories = allStoryItems.length;
65
- const doneStories = allStoryItems.filter(
66
- (s) => s.status === AGENT_LABELS.DONE,
67
- ).length;
68
-
69
- const storyWaveSet = new Set(
70
- storyManifest.map((s) => s.earliestWave).filter((w) => w !== -1),
71
- );
72
-
73
- return {
74
- storyPct:
75
- totalStories > 0 ? Math.round((doneStories / totalStories) * 100) : 0,
76
- doneStories,
77
- totalStories,
78
- storyWaveCount: storyWaveSet.size || 1,
79
- };
80
- }
81
-
82
- /**
83
- * Derive a GitHub-flavoured Markdown anchor slug from a heading's
84
- * visible text. GitHub's slug algorithm:
85
- * 1. Lowercase the text.
86
- * 2. Strip emojis and other non-letter/digit/space/hyphen Unicode.
87
- * 3. Replace runs of whitespace with a single hyphen.
88
- * 4. Trim leading/trailing hyphens.
89
- *
90
- * @param {string} text
91
- * @returns {string}
92
- */
93
- export function slugifyHeading(text) {
94
- const raw = String(text ?? '');
95
- const stripped = raw
96
- .toLowerCase()
97
- .replace(/[^\p{L}\p{N}\s-]+/gu, '')
98
- .trim();
99
- return stripped.replace(/[\s-]+/g, '-').replace(/^-+|-+$/g, '');
100
- }
101
-
102
- /**
103
- * Build the visible H2 text for a wave row, e.g. `🚀 Wave 0`. The
104
- * status word lives only in the Wave Summary TOC; the H2 carries the
105
- * emoji as a visual anchor.
106
- *
107
- * @param {string} waveLabel e.g. `Wave 0` or `Ungrouped`
108
- * @param {string} emoji e.g. `🚀`, `⏳`, `✅`
109
- * @returns {string}
110
- */
111
- export function waveHeadingText(waveLabel, emoji) {
112
- return `${emoji} ${waveLabel}`;
113
- }
114
-
115
- /**
116
- * Render a fixed-width unicode progress bar, e.g. `█████░░░░░░░░░░░░░░░`.
117
- *
118
- * @param {number} percent 0..100
119
- * @param {object} [opts]
120
- * @param {number} [opts.width=20]
121
- * @returns {string}
122
- */
123
- export function renderProgressBar(percent, opts = {}) {
124
- const width = opts.width ?? 20;
125
- const pct = Math.max(0, Math.min(100, Number(percent) || 0));
126
- const filled = Math.round((pct / 100) * width);
127
- return '█'.repeat(filled) + '░'.repeat(width - filled);
128
- }
129
-
130
- /**
131
- * Derive the per-wave status label and emoji used by both the TOC table
132
- * and the per-wave H2 heading.
133
- *
134
- * The waveStats map carries an opaque pair `{ total, done }` per wave —
135
- * the meaning of the unit is the caller's choice. Story-only callers
136
- * (`renderWaveSections` here) pass Story counts; Task-aware callers
137
- * (the wave renderer, pending Story #3196's rewrite) pass Task counts.
138
- * Either way, a wave is "done" when `done === total > 0`. "Ready"
139
- * requires every prior wave to be done; otherwise "Blocked".
140
- *
141
- * @param {number} waveIdx
142
- * @param {Map<number, { total: number, done: number }>} waveStats
143
- * @param {number[]} sortedWaves
144
- * @returns {{ emoji: string, word: string, label: string }}
145
- */
146
- export function deriveWaveStatus(waveIdx, waveStats, sortedWaves) {
147
- const stat = waveStats.get(waveIdx);
148
- const isDone = stat && stat.total > 0 && stat.done === stat.total;
149
- if (isDone) return { emoji: '✅', word: 'Done', label: '✅ Done' };
150
- const isReady =
151
- waveIdx === 0 ||
152
- sortedWaves
153
- .filter((sw) => sw < waveIdx)
154
- .every((sw) => {
155
- const swStat = waveStats.get(sw);
156
- return swStat.done === swStat.total;
157
- });
158
- return isReady
159
- ? { emoji: '🚀', word: 'Ready', label: '🚀 Ready' }
160
- : { emoji: '⏳', word: 'Blocked', label: '⏳ Blocked' };
161
- }
162
-
163
- /**
164
- * Render the "## Wave Summary" section for a manifest's wave-eligible
165
- * items (Stories only — Features are containers and excluded by caller).
166
- *
167
- * Story-only shape: per-wave totals count Stories (not Tasks). Each
168
- * row reports `doneStories/storyCount` so the TOC reflects Story-tier
169
- * progress directly.
170
- *
171
- * @param {object[]} waveEligible
172
- * @returns {string} Markdown block, or empty string when nothing to render.
173
- */
174
- export function renderWaveSections(waveEligible) {
175
- if (!waveEligible || waveEligible.length === 0) return '';
176
-
177
- const waveStats = new Map();
178
- for (const s of waveEligible) {
179
- const w = s.earliestWave ?? -1;
180
- if (!waveStats.has(w)) {
181
- // `total` / `done` is the contract `deriveWaveStatus` consumes;
182
- // here each unit is a Story. Other callers (the wave renderer,
183
- // pending Story #3196's rewrite) pass Task counts under the same
184
- // key names so the predicate stays unit-agnostic.
185
- waveStats.set(w, { total: 0, done: 0 });
186
- }
187
- const stat = waveStats.get(w);
188
- stat.total++;
189
- if (s.status === AGENT_LABELS.DONE) stat.done++;
190
- }
191
-
192
- const sortedWaves = [...waveStats.keys()].sort((a, b) => a - b);
193
- const lines = [
194
- '## Wave Summary',
195
- '',
196
- '| Wave | Status | Stories |',
197
- '| :--- | :--- | :--- |',
198
- ];
199
-
200
- for (const w of sortedWaves) {
201
- const stat = waveStats.get(w);
202
- const waveLabel = w === -1 ? 'Ungrouped' : `Wave ${w}`;
203
- const status = deriveWaveStatus(w, waveStats, sortedWaves);
204
- const headingText = waveHeadingText(waveLabel, status.emoji);
205
- const anchor = slugifyHeading(headingText);
206
- const waveCell = `[${waveLabel}](#${anchor})`;
207
- lines.push(
208
- `| ${waveCell} | ${status.label} | ${stat.done}/${stat.total} |`,
209
- );
210
- }
211
- lines.push('');
212
- return lines.join('\n');
213
- }
@@ -1,261 +0,0 @@
1
- /**
2
- * manifest-persistence.js
3
- *
4
- * File I/O for dispatch / story manifests. All fs writes land under the
5
- * per-Epic tree (`temp/epic-<id>/manifest.{md,json}` for Epic dispatch
6
- * manifests; `temp/epic-<id>/stories/story-<sid>/manifest.{md,json}` for Story
7
- * execution manifests — see Epic #1030 Story #1040 / Task #1053). The
8
- * formatter is injected so this module is testable against a tmpdir
9
- * without touching the real filesystem layout.
10
- *
11
- * Story manifests with multiple stories that span Epic IDs (rare —
12
- * happens only when the dispatcher is run against a hand-rolled cohort)
13
- * fall back to the first story's epicId. Manifests with no resolvable
14
- * epicId resolve to the legacy flat layout (`temp/story-manifest-*`)
15
- * which is still understood by downstream cleanup paths.
16
- */
17
-
18
- import fs from 'node:fs';
19
- import path from 'node:path';
20
- import { fileURLToPath } from 'node:url';
21
- import {
22
- epicArtifactPath,
23
- storyArtifactPath,
24
- tempRootFrom,
25
- } from '../config/temp-paths.js';
26
- import { resolveConfig } from '../config-resolver.js';
27
- import {
28
- formatManifestMarkdown,
29
- formatStoryManifestMarkdown,
30
- } from './manifest-formatter.js';
31
-
32
- function getProjectRoot() {
33
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
34
- return path.resolve(__dirname, '../../../..');
35
- }
36
-
37
- /**
38
- * Build a config bag whose `tempRoot` is an ABSOLUTE path anchored to the
39
- * caller-supplied `projectRoot` (Story #3900).
40
- *
41
- * The on-disk dispatch / story manifests are a per-Epic *operator view*
42
- * bound to a specific project root the caller already knows — not a
43
- * lifecycle ledger that must be cwd-independent. The `temp-paths` helpers
44
- * now anchor a *relative* `tempRoot` to the main checkout (the git common
45
- * dir's parent), which is correct for the ledger but wrong here: it would
46
- * ignore the explicit `projectRoot` (e.g. a test tmpdir, or a sandboxed
47
- * dispatcher root). Pre-absolutising the `tempRoot` against `projectRoot`
48
- * makes the helpers honour it verbatim (absolute roots skip git anchoring),
49
- * so manifest writes always land under the project root the caller named.
50
- *
51
- * @param {string} projectRoot
52
- * @param {object|undefined} resolved Resolved config (or undefined).
53
- * @returns {object} A config bag with an absolute `project.paths.tempRoot`.
54
- */
55
- function absoluteTempRootConfig(projectRoot, resolved) {
56
- const tempRoot = tempRootFrom(resolved);
57
- const absoluteTempRoot = path.isAbsolute(tempRoot)
58
- ? tempRoot
59
- : path.join(projectRoot, tempRoot);
60
- return { project: { paths: { tempRoot: absoluteTempRoot } } };
61
- }
62
-
63
- /**
64
- * Resolve absolute path for a legacy flat dispatch-manifest sibling.
65
- */
66
- function legacyOrphanPath(epicId, ext, projectRoot, resolved) {
67
- const rel = epicArtifactPath(
68
- epicId,
69
- `dispatch-manifest-${epicId}.${ext}`,
70
- resolved,
71
- );
72
- return path.isAbsolute(rel) ? rel : path.join(projectRoot, rel);
73
- }
74
-
75
- /**
76
- * Sweep one legacy orphan; returns the path if removed, else null.
77
- */
78
- function sweepOne(target) {
79
- try {
80
- if (!fs.existsSync(target)) return null;
81
- fs.rmSync(target, { force: true });
82
- return target;
83
- } catch {
84
- return null;
85
- }
86
- }
87
-
88
- /**
89
- * Sweep legacy flat-layout dispatch-manifest siblings out of the per-Epic
90
- * temp dir. The Epic manifest layout migrated from
91
- * `temp/epic-<id>/dispatch-manifest-<id>.{md,json}` to
92
- * `temp/epic-<id>/manifest.{md,json}` in Epic #1030 / Story #1040;
93
- * sweeping on each render keeps a single canonical artefact in the
94
- * epic dir. Idempotent: returns `{ removed: [] }` when nothing to do.
95
- *
96
- * @param {number} epicId
97
- * @param {{ projectRoot?: string, config?: object, logger?: { info?: Function } }} [opts]
98
- */
99
- export function deleteLegacyFlatManifest(epicId, opts = {}) {
100
- const projectRoot = opts.projectRoot ?? getProjectRoot();
101
- const resolved = opts.config ?? safeResolveConfig(projectRoot);
102
- const logger = opts.logger ?? console;
103
- const tempPathsConfig = absoluteTempRootConfig(projectRoot, resolved);
104
-
105
- const targets = ['md', 'json'].map((ext) =>
106
- legacyOrphanPath(epicId, ext, projectRoot, tempPathsConfig),
107
- );
108
- const removed = targets.map(sweepOne).filter(Boolean);
109
-
110
- if (removed.length > 0 && typeof logger?.info === 'function') {
111
- logger.info(
112
- `[manifest-persistence] Swept ${removed.length} legacy flat dispatch-manifest orphan(s) for Epic #${epicId}: ${removed.join(', ')}`,
113
- );
114
- }
115
-
116
- return { removed };
117
- }
118
-
119
- /**
120
- * Atomic write-then-rename. On any failure, best-effort remove the `.tmp`
121
- * file and rethrow so the caller can surface a structured result.
122
- *
123
- * Internal crash-safe write primitive for the manifest artefact pair.
124
- */
125
- function atomicWrite(finalPath, content) {
126
- const tmpPath = `${finalPath}.tmp`;
127
- try {
128
- fs.writeFileSync(tmpPath, content, 'utf8');
129
- fs.renameSync(tmpPath, finalPath);
130
- } catch (err) {
131
- try {
132
- fs.rmSync(tmpPath, { force: true });
133
- } catch {
134
- // best-effort; original error is what the caller needs
135
- }
136
- throw err;
137
- }
138
- }
139
-
140
- /**
141
- * Persist a manifest to `temp/`. Story-execution manifests write a
142
- * `story-manifest-<key>.{json,md}` pair keyed on story IDs; Epic manifests
143
- * write a `dispatch-manifest-<epicId>.{json,md}` pair. Each file is written
144
- * via an atomic write-then-rename sequence. On failure the caller receives
145
- * the error string and the `.tmp` residue is removed — the final path is
146
- * left untouched.
147
- *
148
- * When `opts.markdown` is provided (a pre-rendered Markdown string), it is
149
- * used in place of `formatManifestMarkdown(manifest)`. This is the
150
- * injection seam the dispatcher uses to route through `fromSpec` when a
151
- * spec file is present alongside the Epic (Story #1501) without
152
- * coupling persistence to the spec loader.
153
- *
154
- * Config resolution: the caller may pass the canonical resolved config
155
- * via `opts.config` (story-init does this to avoid a redundant resolve);
156
- * otherwise the helper lazy-resolves so `epicArtifactPath` /
157
- * `storyArtifactPath` honour any `project.paths.tempRoot` override.
158
- *
159
- * @param {object} manifest
160
- * @param {{ projectRoot?: string, config?: object, markdown?: string }} [opts]
161
- * @returns {{ persisted: boolean, path: string|null, error: string|null }}
162
- */
163
- export function persistManifest(manifest, opts = {}) {
164
- const projectRoot = opts.projectRoot ?? getProjectRoot();
165
- const resolved = opts.config ?? safeResolveConfig(projectRoot);
166
- // Anchor manifest artifact paths to the explicit projectRoot (Story #3900)
167
- // rather than letting temp-paths anchor a relative tempRoot to the main
168
- // checkout — these manifests are a per-project operator view.
169
- const tempPathsConfig = absoluteTempRootConfig(projectRoot, resolved);
170
-
171
- let jsonPath = null;
172
- let mdPath = null;
173
-
174
- if (manifest.type === 'story-execution') {
175
- // Story manifests live under `temp/epic-<eid>/stories/story-<sid>/`. When the
176
- // manifest carries multiple stories, fall back to the first entry's
177
- // epicId for the directory key (the dispatcher only ever bundles
178
- // stories that share an Epic; the multi-Epic case is a hand-rolled
179
- // cohort we tolerate but don't optimise for). Stories with no
180
- // resolvable epicId fall through to the legacy flat layout so
181
- // downstream cleanup paths keep finding them.
182
- const stories = manifest.stories ?? [];
183
- const epicId = stories.find((s) => s?.epicId)?.epicId;
184
- const key = stories.map((s) => s.storyId).join('-');
185
- if (epicId && stories.length === 1 && stories[0]?.storyId) {
186
- const sid = stories[0].storyId;
187
- const rel = storyArtifactPath(
188
- epicId,
189
- sid,
190
- 'manifest.json',
191
- tempPathsConfig,
192
- );
193
- const relMd = storyArtifactPath(
194
- epicId,
195
- sid,
196
- 'manifest.md',
197
- tempPathsConfig,
198
- );
199
- jsonPath = path.isAbsolute(rel) ? rel : path.join(projectRoot, rel);
200
- mdPath = path.isAbsolute(relMd) ? relMd : path.join(projectRoot, relMd);
201
- } else {
202
- // Legacy flat layout — preserved as a safety net for multi-story
203
- // manifests where the per-story dirs would collide.
204
- const legacyDir = path.join(projectRoot, 'temp');
205
- jsonPath = path.join(legacyDir, `story-manifest-${key}.json`);
206
- mdPath = path.join(legacyDir, `story-manifest-${key}.md`);
207
- }
208
- } else if (manifest.epicId) {
209
- const epicId = manifest.epicId;
210
- // Sweep legacy flat dispatch-manifest-<id>.{md,json} orphans before
211
- // re-rendering so the per-Epic dir only ever shows the canonical
212
- // manifest.{md,json} pair (resolves #1126).
213
- deleteLegacyFlatManifest(epicId, {
214
- projectRoot,
215
- config: resolved,
216
- });
217
- const relJson = epicArtifactPath(epicId, 'manifest.json', tempPathsConfig);
218
- const relMd = epicArtifactPath(epicId, 'manifest.md', tempPathsConfig);
219
- jsonPath = path.isAbsolute(relJson)
220
- ? relJson
221
- : path.join(projectRoot, relJson);
222
- mdPath = path.isAbsolute(relMd) ? relMd : path.join(projectRoot, relMd);
223
- } else {
224
- return { persisted: false, path: null, error: null };
225
- }
226
-
227
- try {
228
- const jsonContent = JSON.stringify(manifest, null, 2);
229
- const mdContent =
230
- typeof opts.markdown === 'string'
231
- ? opts.markdown
232
- : manifest.type === 'story-execution'
233
- ? formatStoryManifestMarkdown(manifest, { config: resolved })
234
- : formatManifestMarkdown(manifest);
235
-
236
- // Ensure both parent directories exist (`temp/epic-<id>/` and
237
- // optionally the per-Story sub-tree). `recursive: true` is a no-op
238
- // when the dir already exists.
239
- fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
240
- fs.mkdirSync(path.dirname(mdPath), { recursive: true });
241
- atomicWrite(jsonPath, jsonContent);
242
- atomicWrite(mdPath, mdContent);
243
- return { persisted: true, path: jsonPath, error: null };
244
- } catch (err) {
245
- return { persisted: false, path: jsonPath, error: err.message };
246
- }
247
- }
248
-
249
- /**
250
- * `resolveConfig` throws when no `.agentrc.json` is loadable from `cwd`
251
- * (zero-config callers — unit tests). Persistence treats that as a
252
- * benign condition: the helpers fall back to the framework default
253
- * (`tempRoot=temp`) when the config bag is absent.
254
- */
255
- function safeResolveConfig(projectRoot) {
256
- try {
257
- return resolveConfig({ cwd: projectRoot });
258
- } catch {
259
- return undefined;
260
- }
261
- }
@@ -1,55 +0,0 @@
1
- /**
2
- * manifest-procedures.js
3
- *
4
- * Renders the bottom collapsed `<details>` block that carries the agent
5
- * operating procedures and the full symbol legend for a dispatch
6
- * manifest. Split out of `manifest-formatter.js` (Story #1849 Task #1871)
7
- * so the parent collapses to the dispatch-manifest wiring facade.
8
- *
9
- * Re-exported from `manifest-formatter.js` so existing call-sites and
10
- * tests that import from there keep working without a path change.
11
- */
12
-
13
- /**
14
- * Render the bottom collapsed `<details>` block carrying the operating
15
- * procedures and the full symbol legend (Story #1194 Task #1214). This is
16
- * the only HTML the manifest emits by AC — every other section is plain
17
- * Markdown.
18
- *
19
- * @param {number|string} epicId the Epic id used to substitute `/deliver` examples.
20
- * @returns {string}
21
- */
22
- export function renderProceduresAndLegendDetails(epicId) {
23
- const lines = [];
24
- lines.push(
25
- '<details><summary>🤖 Agent Operating Procedures &amp; symbol reference</summary>',
26
- );
27
- lines.push('');
28
- lines.push('### Operating Procedures');
29
- lines.push('');
30
- lines.push(
31
- `1. **Deliver**: Run \`/deliver ${epicId}\`. The runner iterates waves in order, fans Stories out in parallel via \`/deliver\`, and only pauses when the Epic flips to \`agent::blocked\`.`,
32
- );
33
- lines.push(
34
- '2. **Resume (granular, optional)**: Re-running `/deliver` resumes from the checkpointed wave. To re-drive a single Story, run `/deliver <storyId>`. Re-runs are checkpoint-idempotent.',
35
- );
36
- lines.push(
37
- `3. **Close**: \`/deliver ${epicId}\` runs close-validation, code-review, retro, and PR-create in its tail. Operators merge the PR via the GitHub UI.`,
38
- );
39
- lines.push('');
40
- lines.push('### Symbol legend');
41
- lines.push('');
42
- lines.push('| Symbol | Meaning |');
43
- lines.push('| :--- | :--- |');
44
- lines.push('| ⬜ | Pending — no Tasks started |');
45
- lines.push('| 🔄 | In-flight — at least one Task done or executing |');
46
- lines.push('| ✅ | Done — every Task complete |');
47
- lines.push('| 🚧 | Blocked — at least one Task is `agent::blocked` |');
48
- lines.push('| 🚀 Ready | Wave is unblocked and ready to dispatch |');
49
- lines.push('| ⏳ Blocked | Wave is gated on a prior wave still completing |');
50
- lines.push('| `█` / `░` | Progress bar: filled / remaining cells |');
51
- lines.push('| `*(after #N)*` | Task callout: depends on in-Story Task #N |');
52
- lines.push('');
53
- lines.push('</details>');
54
- return lines.join('\n');
55
- }