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,54 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * epic-plan-decompose.js — RETIRED delegate CLI (Epic #4474, PR7).
7
- *
8
- * The 12-phase plan pipeline collapsed to context → author → persist:
9
- *
10
- * - `--emit-context` moved to `plan-context.js` (the single authoring
11
- * envelope carries the decomposer context — ticket schema, risk
12
- * heuristics, ticket cap — alongside the spec half).
13
- * - The persist half (ticket validator, file-assumption gate, DAG,
14
- * budget, story creation, healthcheck, `agent::ready` flip) moved to
15
- * `plan-persist.js` (single GitHub-write surface).
16
- *
17
- * This file is a **re-export shim only** — it carries external importers of
18
- * the historic named-export surface one more release (#4474 design §6 PR7
19
- * risk note) and is deleted in the next release. Internal consumers import
20
- * the phase modules directly; do not add new imports of this file.
21
- *
22
- * Invoking it as a CLI is refused with a pointer to the successor CLIs.
23
- */
24
-
25
- // cli-opt-out: retired delegate shim (Epic #4474 PR7) — deliberately
26
- // refuses CLI execution with a pointer to plan-context.js/plan-persist.js
27
- // instead of wiring runAsCli around a dead main().
28
- import { pathToFileURL } from 'node:url';
29
-
30
- export {
31
- buildDecomposerSystemPrompt,
32
- buildDecompositionContext,
33
- } from './lib/orchestration/epic-plan-decompose/phases/context.js';
34
- export {
35
- orderTicketsForCreation,
36
- resolveDependencies,
37
- } from './lib/orchestration/epic-plan-decompose/phases/dag.js';
38
- export { runDecomposePhase } from './lib/orchestration/epic-plan-decompose/phases/persist.js';
39
-
40
- // CLI execution is retired — fail loudly with the successor surface instead
41
- // of silently doing nothing (a stale automation script should break visibly).
42
- if (
43
- process.argv[1] &&
44
- import.meta.url === pathToFileURL(process.argv[1]).href
45
- ) {
46
- process.stderr.write(
47
- '[epic-plan-decompose] retired (Epic #4474): the plan pipeline is ' +
48
- 'context → author → persist.\n' +
49
- ' - authoring envelope: node .agents/scripts/plan-context.js --epic <id>\n' +
50
- ' - persist (all gates): node .agents/scripts/plan-persist.js --epic <id> --tickets ...\n' +
51
- 'This file survives one release as an import shim only.\n',
52
- );
53
- process.exit(1);
54
- }
@@ -1,581 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * epic-plan-healthcheck.js — Post-Plan Readiness Check
7
- *
8
- * Library home of `runPlanHealthcheck`, the **inline** blocking check the
9
- * collapsed persist surface runs as the `agent::ready` exit condition
10
- * (`plan-persist.js` step 9 — the authoritative invocation since Epic
11
- * #4474 retired the standalone Phase 10 workflow step). The CLI form
12
- * remains for manual re-validation and the opt-in slow paths below; no
13
- * workflow mandates running it standalone.
14
- *
15
- * Modes (additive — the fast checks below always run):
16
- * (default) — config validation + git remote check only.
17
- * Targets <2s.
18
- * --paranoid — adds ticket-hierarchy revalidation plus a
19
- * navigability-reachability semantic check (silent
20
- * no-op unless `planning.navigation.routeGlobs` is
21
- * configured).
22
- * --prime-install — adds the pnpm content-addressable-store priming
23
- * path (up to 300s).
24
- *
25
- * Output: a single line of structured JSON on stdout —
26
- * { ok, degraded, reason, checks: [{name, ok, durationMs, detail}] }
27
- *
28
- * The script always exits 0; callers decide whether to act on `ok: false`.
29
- * The plan is already committed to GitHub, so failing the script does not
30
- * un-create tickets.
31
- *
32
- * Usage:
33
- * node epic-plan-healthcheck.js --epic <EPIC_ID> \
34
- * [--paranoid] [--prime-install] [--dry-run]
35
- *
36
- * @see .agents/workflows/helpers/plan-epic.md (persist step — inline gate)
37
- */
38
-
39
- import { spawnSync } from 'node:child_process';
40
- import fs from 'node:fs';
41
- import path from 'node:path';
42
- import { parseArgs } from 'node:util';
43
- import { parseTicketId } from './lib/cli-args.js';
44
- import { runAsCli } from './lib/cli-utils.js';
45
- import {
46
- PROJECT_ROOT,
47
- resolveConfig,
48
- validateOrchestrationConfig,
49
- } from './lib/config-resolver.js';
50
- import { gitSpawn } from './lib/git-utils.js';
51
- import { Logger } from './lib/Logger.js';
52
- import { TYPE_LABELS } from './lib/label-constants.js';
53
- import { recordPlanInvocation } from './lib/orchestration/plan-metrics.js';
54
- import { createProvider } from './lib/provider-factory.js';
55
-
56
- const progress = Logger.createProgress('plan-healthcheck', { stderr: true });
57
-
58
- // ---------------------------------------------------------------------------
59
- // CLI parsing
60
- // ---------------------------------------------------------------------------
61
-
62
- /**
63
- * Parse the healthcheck-specific CLI surface. Kept local to the script so the
64
- * shared `parseSprintArgs` helper does not have to learn about every script's
65
- * private flags.
66
- *
67
- * @param {string[]} [argv]
68
- * @returns {{ epicId: number|null, paranoid: boolean,
69
- * primeInstall: boolean, dryRun: boolean }}
70
- */
71
- function parseHealthcheckArgs(argv = process.argv) {
72
- const { values, positionals } = parseArgs({
73
- args: argv.slice(2),
74
- options: {
75
- epic: { type: 'string', short: 'e' },
76
- paranoid: { type: 'boolean', default: false },
77
- 'prime-install': { type: 'boolean', default: false },
78
- 'dry-run': { type: 'boolean', default: false },
79
- },
80
- allowPositionals: true,
81
- strict: false,
82
- });
83
-
84
- return {
85
- epicId: parseTicketId(values.epic) ?? parseTicketId(positionals[0]),
86
- paranoid: !!values.paranoid,
87
- primeInstall: !!values['prime-install'],
88
- dryRun: !!values['dry-run'],
89
- };
90
- }
91
-
92
- // ---------------------------------------------------------------------------
93
- // Individual checks
94
- //
95
- // Each check returns { ok: boolean, detail: string }. The orchestrator wraps
96
- // it with `name` and `durationMs` for the structured output.
97
- // ---------------------------------------------------------------------------
98
-
99
- /** Validate the resolved `.agentrc.json` config. */
100
- function checkConfig(config) {
101
- try {
102
- validateOrchestrationConfig(config);
103
- return { ok: true, detail: 'Config is valid.' };
104
- } catch (err) {
105
- return { ok: false, detail: `Config validation failed: ${err.message}` };
106
- }
107
- }
108
-
109
- /** Verify `origin` is reachable and `baseBranch` exists on it. */
110
- function checkGitRemote(baseBranch, cwd) {
111
- const remote = gitSpawn(
112
- cwd,
113
- 'ls-remote',
114
- '--exit-code',
115
- 'origin',
116
- baseBranch,
117
- );
118
- if (remote.status === 0) {
119
- return {
120
- ok: true,
121
- detail: `Remote reachable, base branch '${baseBranch}' exists.`,
122
- };
123
- }
124
- if (
125
- remote.stderr.includes('Could not resolve host') ||
126
- remote.stderr.includes('unable to access')
127
- ) {
128
- return {
129
- ok: false,
130
- detail: `Git remote 'origin' is not reachable: ${remote.stderr.slice(0, 200)}`,
131
- };
132
- }
133
- return {
134
- ok: false,
135
- detail: `Base branch '${baseBranch}' not found on origin.`,
136
- };
137
- }
138
-
139
- /**
140
- * Detect whether a Story body carries an inline `## Acceptance` section with
141
- * at least one checklist item. Epic #3078 — under 2-tier hierarchy, Stories
142
- * carry acceptance inline, so the hierarchy check uses this signal as the
143
- * mark of a complete, executable Story.
144
- *
145
- * @param {string} body
146
- * @returns {boolean}
147
- */
148
- function hasInlineAcceptance(body) {
149
- if (typeof body !== 'string' || body.length === 0) return false;
150
- const match = body.match(/^##\s+Acceptance\s*$/im);
151
- if (!match) return false;
152
- const tail = body.slice(match.index + match[0].length);
153
- // Capture until the next top-level `## ` heading (or EOF).
154
- const sectionEnd = tail.search(/^##\s+\S/m);
155
- const section = sectionEnd === -1 ? tail : tail.slice(0, sectionEnd);
156
- // A non-empty acceptance section needs at least one bullet (with or
157
- // without a checkbox marker).
158
- return /^\s*-\s+(?:\[[ xX]\]\s+)?\S/m.test(section);
159
- }
160
-
161
- /**
162
- * Validate Epic ticket hierarchy. 2-tier is the only supported hierarchy
163
- * after Task #3154 deleted `planning.hierarchy`: every Story must carry an
164
- * inline `## Acceptance` checklist; there is no Task layer to graph.
165
- *
166
- * @param {object} provider
167
- * @param {number|null} epicId
168
- */
169
- async function checkTickets(provider, epicId) {
170
- if (!epicId) {
171
- return {
172
- ok: false,
173
- detail: '--paranoid requires --epic <ID> to fetch the ticket hierarchy.',
174
- };
175
- }
176
-
177
- let tickets;
178
- try {
179
- tickets = await provider.getSubTickets(epicId);
180
- } catch (err) {
181
- return {
182
- ok: false,
183
- detail: `Could not fetch Epic #${epicId} tickets: ${err.message}`,
184
- };
185
- }
186
-
187
- if (tickets.length === 0) {
188
- return { ok: false, detail: `Epic #${epicId} has no child tickets.` };
189
- }
190
-
191
- const stories = tickets.filter((t) => t.labels.includes(TYPE_LABELS.STORY));
192
-
193
- const errors = [];
194
- if (stories.length === 0) errors.push('no type::story tickets');
195
-
196
- const missingAcceptance = stories.filter(
197
- (s) => !hasInlineAcceptance(s.body ?? ''),
198
- );
199
- if (missingAcceptance.length > 0) {
200
- const ids = missingAcceptance.map((s) => `#${s.id}`).join(', ');
201
- errors.push(
202
- `${missingAcceptance.length} story/stories missing inline acceptance: ${ids}`,
203
- );
204
- }
205
-
206
- if (errors.length > 0) {
207
- return { ok: false, detail: errors.join('; ') };
208
- }
209
-
210
- const missingComplexity = stories.filter(
211
- (s) => !s.labels.some((l) => l.startsWith('complexity::')),
212
- );
213
- const advisory =
214
- missingComplexity.length > 0
215
- ? ` (advisory: ${missingComplexity.length} story/stories missing complexity label)`
216
- : '';
217
-
218
- return {
219
- ok: true,
220
- detail: `${stories.length} stories (2-tier, inline acceptance) — hierarchy valid${advisory}.`,
221
- };
222
- }
223
-
224
- /**
225
- * Resolve the navigation config that drives the reachability check.
226
- *
227
- * The check is opt-in: a consumer that has not configured
228
- * `planning.navigation.routeGlobs` gets a silent no-op (F7 / AC-13). The
229
- * nav-registry token list is what a route-adding Story is expected to
230
- * reference somewhere in its body or `## Acceptance` section.
231
- *
232
- * @param {object} config Resolved `.agentrc.json`.
233
- * @returns {{ routeGlobs: string[], navRegistry: string[] }}
234
- */
235
- function resolveNavConfig(config) {
236
- const nav = config?.planning?.navigation ?? {};
237
- const toList = (v) =>
238
- (Array.isArray(v) ? v : v == null ? [] : [v])
239
- .filter((s) => typeof s === 'string' && s.trim().length > 0)
240
- .map((s) => s.trim());
241
- return {
242
- routeGlobs: toList(nav.routeGlobs),
243
- navRegistry: toList(nav.navRegistry),
244
- };
245
- }
246
-
247
- /**
248
- * Translate a route glob (`pages/**`, `app/**\/route.ts`) into a RegExp that
249
- * matches a path string. Supports `**` (any depth, including `/`), `*` (any
250
- * run of non-separator chars), and `?` (single non-separator char). All other
251
- * characters are matched literally.
252
- *
253
- * @param {string} glob
254
- * @returns {RegExp}
255
- */
256
- function globToRegExp(glob) {
257
- // Collapse adjacent `**` segments before compiling. `**/**` and `***` both
258
- // mean "any depth", but compiling them literally emits adjacent `.*` runs
259
- // (`.*/.*` / `.*.*`) that backtrack catastrophically on a long non-matching
260
- // path. Collapsing to a single `**` preserves semantics and keeps the
261
- // matcher linear (ReDoS hardening — Epic #4131 audit follow-up).
262
- const normalized = glob
263
- .replace(/\*\*(?:\/\*\*)+/g, '**')
264
- .replace(/\*{3,}/g, '**');
265
- let re = '';
266
- for (let i = 0; i < normalized.length; i++) {
267
- const ch = normalized[i];
268
- if (ch === '*') {
269
- if (normalized[i + 1] === '*') {
270
- re += '.*';
271
- i++;
272
- } else {
273
- re += '[^/]*';
274
- }
275
- } else if (ch === '?') {
276
- re += '[^/]';
277
- } else {
278
- re += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
279
- }
280
- }
281
- return new RegExp(`^${re}$`);
282
- }
283
-
284
- /**
285
- * Extract the candidate route-touching paths a Story declares. Reads the
286
- * `## Changes` block (the decompose-author emits one `{"path":...}` JSON
287
- * object per bullet) and falls back to any bare ```` `path/like/this` ````
288
- * inline-code spans in the body.
289
- *
290
- * @param {string} body
291
- * @returns {string[]}
292
- */
293
- function extractStoryPaths(body) {
294
- if (typeof body !== 'string' || body.length === 0) return [];
295
- const paths = new Set();
296
- // `{"path":"pages/foo.tsx", ...}` change descriptors.
297
- for (const m of body.matchAll(/"path"\s*:\s*"([^"]+)"/g)) {
298
- paths.add(m[1]);
299
- }
300
- // Inline-code spans that look like a path (contain a slash or a dotted ext).
301
- for (const m of body.matchAll(/`([^`]+)`/g)) {
302
- const token = m[1].trim();
303
- if (/[/.]/.test(token) && !token.includes(' ')) paths.add(token);
304
- }
305
- return [...paths];
306
- }
307
-
308
- /**
309
- * Return the `## Acceptance` + full-body text a Story is expected to reference
310
- * the nav registry from. The whole body is searched (the registry can be cited
311
- * in the Goal, Changes, or Acceptance), so this just lower-cases the body once.
312
- *
313
- * @param {string} body
314
- * @returns {string}
315
- */
316
- function referenceableText(body) {
317
- return typeof body === 'string' ? body.toLowerCase() : '';
318
- }
319
-
320
- /**
321
- * Navigability-reachability semantic check (F7 / AC-8).
322
- *
323
- * Flags every Story that adds a route (touches a path matching a configured
324
- * `planning.navigation.routeGlobs` entry) but whose body / acceptance never
325
- * references the configured nav registry. Silent no-op (returns ok with an
326
- * explicit detail) when no route-glob config is present.
327
- *
328
- * @param {object} provider
329
- * @param {number|null} epicId
330
- * @param {object} config
331
- */
332
- async function checkReachability(provider, epicId, config) {
333
- const { routeGlobs, navRegistry } = resolveNavConfig(config);
334
-
335
- // Opt-in: unconfigured consumers degrade to a silent no-op.
336
- if (routeGlobs.length === 0) {
337
- return {
338
- ok: true,
339
- detail: 'No planning.navigation.routeGlobs configured — skipped.',
340
- };
341
- }
342
-
343
- if (!epicId) {
344
- return {
345
- ok: false,
346
- detail:
347
- 'reachability check requires --epic <ID> to fetch the ticket hierarchy.',
348
- };
349
- }
350
-
351
- let tickets;
352
- try {
353
- tickets = await provider.getSubTickets(epicId);
354
- } catch (err) {
355
- return {
356
- ok: false,
357
- detail: `Could not fetch Epic #${epicId} tickets: ${err.message}`,
358
- };
359
- }
360
-
361
- const stories = tickets.filter((t) => t.labels.includes(TYPE_LABELS.STORY));
362
- const matchers = routeGlobs.map(globToRegExp);
363
- const registryTokens = navRegistry.map((t) => t.toLowerCase());
364
-
365
- const flagged = [];
366
- for (const story of stories) {
367
- const body = story.body ?? '';
368
- const addsRoute = extractStoryPaths(body).some((p) =>
369
- matchers.some((rx) => rx.test(p)),
370
- );
371
- if (!addsRoute) continue;
372
-
373
- const text = referenceableText(body);
374
- // When no explicit registry token is configured, fall back to the
375
- // generic "nav registry" phrase so a route-adding Story is still
376
- // expected to mention the navigation surface.
377
- const tokens =
378
- registryTokens.length > 0
379
- ? registryTokens
380
- : ['nav registry', 'navigation'];
381
- const referencesRegistry = tokens.some((tok) => text.includes(tok));
382
- if (!referencesRegistry) flagged.push(`#${story.id}`);
383
- }
384
-
385
- if (flagged.length > 0) {
386
- const registryHint =
387
- navRegistry.length > 0 ? navRegistry.join(', ') : 'the nav registry';
388
- return {
389
- ok: false,
390
- detail: `${flagged.length} route-adding story/stories never reference ${registryHint}: ${flagged.join(', ')}`,
391
- };
392
- }
393
-
394
- return {
395
- ok: true,
396
- detail: `${stories.length} stories scanned — every route-adding story references the nav registry.`,
397
- };
398
- }
399
-
400
- /** Prime the pnpm content-addressable store via `pnpm install --frozen-lockfile`. */
401
- function primePnpmStore(cwd, dryRun) {
402
- const lockFile = path.join(cwd, 'pnpm-lock.yaml');
403
- if (!fs.existsSync(lockFile)) {
404
- return {
405
- ok: false,
406
- detail: 'No pnpm-lock.yaml found — cannot prime store.',
407
- };
408
- }
409
- if (dryRun) {
410
- return { ok: true, detail: 'pnpm store prime skipped (dry-run).' };
411
- }
412
-
413
- progress('PRIME', 'Priming pnpm content-addressable store...');
414
- const start = Date.now();
415
- const result = spawnSync('pnpm', ['install', '--frozen-lockfile'], {
416
- cwd,
417
- stdio: 'pipe',
418
- encoding: 'utf-8',
419
- shell: process.platform === 'win32',
420
- timeout: 300_000,
421
- });
422
- const elapsed = ((Date.now() - start) / 1000).toFixed(1);
423
-
424
- if (result.status === 0) {
425
- return { ok: true, detail: `pnpm store primed in ${elapsed}s.` };
426
- }
427
- const reason =
428
- result.signal === 'SIGTERM'
429
- ? `timeout after ${elapsed}s`
430
- : `exit ${result.status}`;
431
- return {
432
- ok: false,
433
- detail: `pnpm store prime failed (${reason}). First worktree install will be slower. stderr: ${(result.stderr ?? '').slice(0, 300)}`,
434
- };
435
- }
436
-
437
- // ---------------------------------------------------------------------------
438
- // Orchestration
439
- // ---------------------------------------------------------------------------
440
-
441
- async function timed(name, fn) {
442
- const start = Date.now();
443
- const { ok, detail } = await fn();
444
- return { name, ok, durationMs: Date.now() - start, detail };
445
- }
446
-
447
- /**
448
- * Run the post-plan health check.
449
- *
450
- * @param {object} [opts]
451
- * @param {number} [opts.epicId] Epic ID (required for --paranoid).
452
- * @param {boolean} [opts.paranoid] Add ticket-hierarchy revalidation.
453
- * @param {boolean} [opts.primeInstall] Add pnpm-store priming.
454
- * @param {boolean} [opts.dryRun] Skip real install side effects.
455
- * @param {object} [opts.injectedProvider] Test-only injection point.
456
- * @param {object} [opts.injectedConfig] Test-only injection point.
457
- * @returns {Promise<{ok: boolean, degraded: boolean, reason: string|null,
458
- * checks: Array<{name: string, ok: boolean, durationMs: number, detail: string}>}>}
459
- */
460
- // exported for tests — direct-unit coverage of the reachability semantics.
461
- // (`resolveNavConfig` / `extractStoryPaths` / `globToRegExp` are also the
462
- // shared mechanics of the persist-side draft reachability check —
463
- // `lib/orchestration/plan-reachability.js`, Epic #4474 PR6 — so the two
464
- // surfaces can never drift apart.)
465
- export { checkReachability, extractStoryPaths, globToRegExp, resolveNavConfig };
466
-
467
- // exported for tests — Story-level reuse runner reserved for future test coverage
468
- export async function runPlanHealthcheck(opts = {}) {
469
- const ARG_KEYS = ['epicId', 'paranoid', 'primeInstall', 'dryRun'];
470
- const hasExplicitArgs = ARG_KEYS.some((k) => Object.hasOwn(opts, k));
471
- const parsed = hasExplicitArgs
472
- ? {
473
- epicId: opts.epicId ?? null,
474
- paranoid: !!opts.paranoid,
475
- primeInstall: !!opts.primeInstall,
476
- dryRun: !!opts.dryRun,
477
- }
478
- : parseHealthcheckArgs();
479
-
480
- const { epicId, paranoid, primeInstall, dryRun } = parsed;
481
- const cwd = PROJECT_ROOT;
482
-
483
- const config = opts.injectedConfig || resolveConfig();
484
- const baseBranch = config.project?.baseBranch ?? 'main';
485
-
486
- progress(
487
- 'HEALTH',
488
- `Running post-plan health check${epicId ? ` for Epic #${epicId}` : ''} (mode=${paranoid ? 'paranoid' : 'fast'}${primeInstall ? '+prime-install' : ''})...`,
489
- );
490
-
491
- const checks = [];
492
-
493
- // Fast lane: config + git remote always run.
494
- progress('CHECK', 'Validating resolved config...');
495
- checks.push(await timed('config', async () => checkConfig(config)));
496
-
497
- progress('CHECK', 'Checking git remote...');
498
- checks.push(
499
- await timed('git-remote', async () => checkGitRemote(baseBranch, cwd)),
500
- );
501
-
502
- // Paranoid lane: ticket-hierarchy revalidation (2-tier only) plus the
503
- // navigability-reachability semantic check (silent no-op when unconfigured).
504
- if (paranoid) {
505
- const provider = opts.injectedProvider || createProvider(config);
506
- progress('CHECK', 'Validating ticket hierarchy...');
507
- checks.push(
508
- await timed('ticket-hierarchy', () => checkTickets(provider, epicId)),
509
- );
510
- progress('CHECK', 'Checking route-reachability (nav registry)...');
511
- checks.push(
512
- await timed('reachability', () =>
513
- checkReachability(provider, epicId, config),
514
- ),
515
- );
516
- }
517
-
518
- // Optional pnpm-store priming.
519
- if (primeInstall) {
520
- progress('CHECK', 'Priming pnpm store...');
521
- checks.push(
522
- await timed('prime-install', async () => primePnpmStore(cwd, dryRun)),
523
- );
524
- }
525
-
526
- const failed = checks.filter((c) => !c.ok);
527
- const ok = failed.length === 0;
528
- const result = {
529
- ok,
530
- degraded: !ok,
531
- reason: ok ? null : failed.map((c) => `${c.name}: ${c.detail}`).join('; '),
532
- checks,
533
- };
534
-
535
- if (ok) {
536
- progress('HEALTH', `All ${checks.length} check(s) passed.`);
537
- } else {
538
- progress(
539
- 'HEALTH',
540
- `${failed.length} of ${checks.length} check(s) failed: ${failed.map((c) => c.name).join(', ')}.`,
541
- );
542
- }
543
-
544
- // The structured result is the only thing on stdout.
545
- Logger.info(JSON.stringify(result));
546
-
547
- return result;
548
- }
549
-
550
- // ---------------------------------------------------------------------------
551
- // Main guard
552
- // ---------------------------------------------------------------------------
553
-
554
- /**
555
- * CLI wrapper: stamp the plan-metrics ledger (#4474 PR1) around the direct
556
- * invocation only. In-process callers (the decompose persist gate imports
557
- * `runPlanHealthcheck` directly) are already covered by their own CLI's
558
- * stamp — wrapping here too would double-count the inline gate.
559
- */
560
- async function cliMain() {
561
- const { epicId } = parseHealthcheckArgs();
562
- let config;
563
- try {
564
- config = resolveConfig();
565
- } catch {
566
- config = undefined;
567
- }
568
- return recordPlanInvocation(
569
- {
570
- cli: 'epic-plan-healthcheck',
571
- mode: 'healthcheck',
572
- epicId: epicId ?? null,
573
- config,
574
- },
575
- () => runPlanHealthcheck(),
576
- );
577
- }
578
-
579
- runAsCli(import.meta.url, cliMain, {
580
- source: 'epic-plan-healthcheck',
581
- });
@@ -1,64 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * epic-plan-spec.js — RETIRED delegate CLI (Epic #4474, PR7).
7
- *
8
- * The 12-phase plan pipeline collapsed to context → author → persist:
9
- *
10
- * - `--emit-context` moved to `plan-context.js` (single authoring
11
- * envelope: Epic body + docs digest + codebase snapshot + duplicate
12
- * search + clarity + system prompts).
13
- * - The persist half (section gate, risk verdict, managed sections,
14
- * checkpoint) moved to `plan-persist.js` (single GitHub-write surface).
15
- *
16
- * This file is a **re-export shim only** — it carries external importers of
17
- * the historic named-export surface one more release (#4474 design §6 PR7
18
- * risk note) and is deleted in the next release. Internal consumers import
19
- * the phase modules directly; do not add new imports of this file.
20
- *
21
- * Invoking it as a CLI is refused with a pointer to the successor CLIs.
22
- */
23
-
24
- // cli-opt-out: retired delegate shim (Epic #4474 PR7) — deliberately
25
- // refuses CLI execution with a pointer to plan-context.js/plan-persist.js
26
- // instead of wiring runAsCli around a dead main().
27
- import { pathToFileURL } from 'node:url';
28
-
29
- export {
30
- forkAndCommitEpicSnapshot,
31
- forkMainToEpic,
32
- } from './lib/baseline-snapshot.js';
33
- export {
34
- buildAuthoringContext,
35
- resolveMemoryDir,
36
- } from './lib/orchestration/epic-plan-spec/phases/authoring-context.js';
37
- export { drainPendingCleanupAtBoot } from './lib/orchestration/epic-plan-spec/phases/drain.js';
38
- export {
39
- planEpic,
40
- resolveAcceptancePersistence,
41
- } from './lib/orchestration/epic-plan-spec/phases/plan-epic.js';
42
- export {
43
- loadRiskVerdict,
44
- validateRiskVerdict,
45
- } from './lib/orchestration/epic-plan-spec/phases/risk-verdict.js';
46
- export { runSpecPhase } from './lib/orchestration/epic-plan-spec/phases/run-spec-phase.js';
47
- export { runSpecFreshnessCheck } from './lib/orchestration/epic-plan-spec/phases/spec-freshness.js';
48
- export { resolveReviewRouting } from './lib/orchestration/plan-review-routing.js';
49
-
50
- // CLI execution is retired — fail loudly with the successor surface instead
51
- // of silently doing nothing (a stale automation script should break visibly).
52
- if (
53
- process.argv[1] &&
54
- import.meta.url === pathToFileURL(process.argv[1]).href
55
- ) {
56
- process.stderr.write(
57
- '[epic-plan-spec] retired (Epic #4474): the plan pipeline is ' +
58
- 'context → author → persist.\n' +
59
- ' - authoring envelope: node .agents/scripts/plan-context.js --epic <id>\n' +
60
- ' - persist (all gates): node .agents/scripts/plan-persist.js --epic <id> ...\n' +
61
- 'This file survives one release as an import shim only.\n',
62
- );
63
- process.exit(1);
64
- }