mandrel 2.0.0 → 2.2.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 (323) hide show
  1. package/.agents/README.md +59 -28
  2. package/.agents/agents/acceptance-critic.md +20 -9
  3. package/.agents/agents/story-worker.md +45 -48
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +60 -46
  6. package/.agents/docs/agentrc-reference.json +8 -13
  7. package/.agents/docs/configuration.md +33 -57
  8. package/.agents/docs/execution-reference.md +39 -10
  9. package/.agents/docs/quality-gates.md +17 -19
  10. package/.agents/docs/workflows.md +6 -6
  11. package/.agents/instructions.md +64 -79
  12. package/.agents/rules/ci-remediation.md +3 -3
  13. package/.agents/rules/gherkin-standards.md +10 -0
  14. package/.agents/rules/git-conventions-reference.md +42 -51
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +2 -2
  16. package/.agents/schemas/agentrc.schema.json +35 -46
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  24. package/.agents/schemas/signal-event.schema.json +3 -3
  25. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  26. package/.agents/schemas/validation-evidence.schema.json +1 -1
  27. package/.agents/scripts/acceptance-eval.js +24 -68
  28. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  29. package/.agents/scripts/bootstrap.js +3 -3
  30. package/.agents/scripts/check-dead-exports.js +43 -104
  31. package/.agents/scripts/check-doc-links.js +2 -2
  32. package/.agents/scripts/check-lifecycle-lint.js +1 -1
  33. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  34. package/.agents/scripts/deliver-recover.js +122 -0
  35. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  36. package/.agents/scripts/evidence-gate.js +20 -50
  37. package/.agents/scripts/generate-skills-index.js +17 -1
  38. package/.agents/scripts/generate-workflows-doc.js +4 -4
  39. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  40. package/.agents/scripts/lib/audit-suite/selector.js +323 -23
  41. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -11
  42. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  43. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  44. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  45. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  46. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -1
  47. package/.agents/scripts/lib/checks/index.js +1 -1
  48. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  49. package/.agents/scripts/lib/checks/state.js +17 -248
  50. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +3 -3
  51. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  52. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  53. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  54. package/.agents/scripts/lib/cli-args.js +23 -2
  55. package/.agents/scripts/lib/close-validation/gates.js +13 -13
  56. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  57. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  58. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  59. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  60. package/.agents/scripts/lib/config/acceptance-eval.js +2 -2
  61. package/.agents/scripts/lib/config/delivery-routing.js +7 -6
  62. package/.agents/scripts/lib/config/explain.js +10 -16
  63. package/.agents/scripts/lib/config/github.js +7 -5
  64. package/.agents/scripts/lib/config/limits.js +15 -25
  65. package/.agents/scripts/lib/config/quality.js +11 -14
  66. package/.agents/scripts/lib/config/runners.js +8 -21
  67. package/.agents/scripts/lib/config/temp-paths.js +18 -56
  68. package/.agents/scripts/lib/config-settings-schema-delivery.js +34 -16
  69. package/.agents/scripts/lib/config-settings-schema-quality.js +9 -2
  70. package/.agents/scripts/lib/config-settings-schema.js +48 -22
  71. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  72. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  73. package/.agents/scripts/lib/duplicate-search.js +38 -7
  74. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  75. package/.agents/scripts/lib/format-generated-json.js +97 -0
  76. package/.agents/scripts/lib/framework-version.js +19 -189
  77. package/.agents/scripts/lib/gh-exec.js +8 -0
  78. package/.agents/scripts/lib/git-branch-lifecycle.js +0 -158
  79. package/.agents/scripts/lib/git-utils.js +0 -14
  80. package/.agents/scripts/lib/json-utils.js +1 -2
  81. package/.agents/scripts/lib/label-constants.js +0 -15
  82. package/.agents/scripts/lib/label-taxonomy.js +1 -12
  83. package/.agents/scripts/lib/observability/active-story-env.js +42 -163
  84. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  85. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  86. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  87. package/.agents/scripts/lib/observability/source-classifier.js +2 -2
  88. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  89. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  90. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  91. package/.agents/scripts/lib/orchestration/ceremony-routing.js +43 -45
  92. package/.agents/scripts/lib/orchestration/change-set.js +103 -0
  93. package/.agents/scripts/lib/orchestration/code-review.js +70 -191
  94. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +3 -3
  95. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  96. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  97. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  98. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  99. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  100. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +9 -11
  101. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  102. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  103. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +7 -3
  104. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  105. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  106. package/.agents/scripts/lib/orchestration/merge-block-class.js +76 -20
  107. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  108. package/.agents/scripts/lib/orchestration/plan-context.js +116 -33
  109. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +26 -36
  110. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +31 -22
  111. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  112. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +16 -6
  113. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +173 -25
  114. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  115. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +280 -100
  116. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +472 -55
  117. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +21 -16
  118. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  119. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +230 -0
  120. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +41 -40
  121. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +1 -2
  122. package/.agents/scripts/lib/orchestration/planning/spec-authoring-grounding.js +1 -1
  123. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  124. package/.agents/scripts/lib/orchestration/retro-proposals.js +7 -7
  125. package/.agents/scripts/lib/orchestration/review-depth.js +105 -40
  126. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  127. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  128. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  129. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  130. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  131. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  132. package/.agents/scripts/lib/orchestration/run-epilogue.js +374 -16
  133. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +24 -0
  134. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  135. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  136. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +4 -13
  137. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  138. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +72 -30
  139. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  140. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  141. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +12 -8
  142. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  143. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  144. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +264 -43
  145. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  146. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  147. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +104 -279
  148. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +191 -0
  149. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +120 -0
  150. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  151. package/.agents/scripts/lib/orchestration/story-follow-ups.js +75 -14
  152. package/.agents/scripts/lib/orchestration/story-init-remote.js +12 -8
  153. package/.agents/scripts/lib/orchestration/story-plan-state.js +14 -29
  154. package/.agents/scripts/lib/orchestration/task-body-validator.js +52 -7
  155. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  156. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +119 -14
  157. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +3 -4
  158. package/.agents/scripts/lib/orchestration/ticket-validator.js +121 -18
  159. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -47
  160. package/.agents/scripts/lib/orchestration/ticketing/reads.js +19 -32
  161. package/.agents/scripts/lib/orchestration/ticketing/transition.js +61 -1
  162. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  163. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  164. package/.agents/scripts/lib/planning-corpus.js +12 -286
  165. package/.agents/scripts/lib/preflight-runner.js +2 -2
  166. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  167. package/.agents/scripts/lib/signals/index.js +4 -17
  168. package/.agents/scripts/lib/signals/read.js +35 -35
  169. package/.agents/scripts/lib/signals/schema.js +8 -11
  170. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  171. package/.agents/scripts/lib/signals/write.js +0 -1
  172. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  173. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  174. package/.agents/scripts/lib/story-adjacency.js +8 -7
  175. package/.agents/scripts/lib/story-body/story-body.js +81 -13
  176. package/.agents/scripts/lib/templates/decomposer-prompts.js +15 -16
  177. package/.agents/scripts/lib/test-env.js +14 -1
  178. package/.agents/scripts/lib/test-tiers.js +0 -3
  179. package/.agents/scripts/lib/ticket-body-sections.js +0 -14
  180. package/.agents/scripts/lib/validation-evidence.js +31 -59
  181. package/.agents/scripts/lib/wave-runner/live-probe.js +315 -0
  182. package/.agents/scripts/lib/wave-runner/ready-set.js +32 -6
  183. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  184. package/.agents/scripts/lib/worktree/lifecycle/reap.js +68 -19
  185. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  186. package/.agents/scripts/plan-context.js +38 -7
  187. package/.agents/scripts/plan-critics.js +203 -0
  188. package/.agents/scripts/plan-persist.js +145 -35
  189. package/.agents/scripts/plan-run-epilogue.js +83 -38
  190. package/.agents/scripts/post-structured-comment.js +0 -38
  191. package/.agents/scripts/pr-watch-with-update.js +43 -22
  192. package/.agents/scripts/providers/github/compose.js +0 -1
  193. package/.agents/scripts/providers/github/errors.js +0 -19
  194. package/.agents/scripts/providers/github/issues.js +1 -11
  195. package/.agents/scripts/providers/github/mappers.js +5 -0
  196. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  197. package/.agents/scripts/providers/github/tickets.js +33 -153
  198. package/.agents/scripts/providers/github.js +17 -6
  199. package/.agents/scripts/quality-preview.js +13 -6
  200. package/.agents/scripts/resolve-stories.js +236 -0
  201. package/.agents/scripts/run-coverage.js +4 -1
  202. package/.agents/scripts/run-lint.js +2 -2
  203. package/.agents/scripts/run-verify.js +31 -2
  204. package/.agents/scripts/signals-view.js +9 -10
  205. package/.agents/scripts/single-story-close.js +173 -18
  206. package/.agents/scripts/single-story-confirm-merge.js +288 -15
  207. package/.agents/scripts/single-story-init.js +6 -10
  208. package/.agents/scripts/stories-wave-tick.js +380 -53
  209. package/.agents/scripts/story-plan.js +3 -3
  210. package/.agents/scripts/update-ticket-state.js +8 -50
  211. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  212. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  213. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  214. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  215. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  216. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  217. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  218. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  219. package/.agents/skills/core/idea-refinement/SKILL.md +3 -3
  220. package/.agents/skills/core/scope-triage/SKILL.md +3 -0
  221. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  222. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  223. package/.agents/skills/skills.index.json +2 -12
  224. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  225. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  226. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  227. package/.agents/workflows/audit-architecture.md +3 -4
  228. package/.agents/workflows/audit-clean-code.md +4 -4
  229. package/.agents/workflows/audit-documentation.md +4 -5
  230. package/.agents/workflows/audit-lighthouse.md +8 -0
  231. package/.agents/workflows/audit-navigability.md +10 -0
  232. package/.agents/workflows/audit-performance.md +2 -3
  233. package/.agents/workflows/audit-quality.md +8 -9
  234. package/.agents/workflows/audit-security.md +1 -2
  235. package/.agents/workflows/audit-seo.md +10 -0
  236. package/.agents/workflows/audit-ux-ui.md +7 -0
  237. package/.agents/workflows/deliver.md +133 -45
  238. package/.agents/workflows/git-cleanup.md +2 -2
  239. package/.agents/workflows/git-deliver.md +1 -1
  240. package/.agents/workflows/helpers/acceptance-self-eval.md +34 -17
  241. package/.agents/workflows/helpers/code-quality-guardrails.md +15 -12
  242. package/.agents/workflows/helpers/code-review.md +14 -12
  243. package/.agents/workflows/helpers/deliver-story-reference.md +73 -32
  244. package/.agents/workflows/helpers/deliver-story.md +209 -118
  245. package/.agents/workflows/helpers/parallel-tooling.md +2 -2
  246. package/.agents/workflows/helpers/worktree-lifecycle.md +28 -32
  247. package/.agents/workflows/plan.md +239 -19
  248. package/.agents/workflows/qa-assist.md +6 -6
  249. package/.agents/workflows/qa-explore.md +3 -3
  250. package/.agents/workflows/qa-run.md +1 -5
  251. package/bin/mandrel.js +12 -1
  252. package/docs/CHANGELOG.md +62 -0
  253. package/lib/cli/registry.js +262 -19
  254. package/lib/cli/sync-agents.js +157 -0
  255. package/lib/cli/sync-commands.js +115 -6
  256. package/lib/cli/sync.js +168 -6
  257. package/lib/cli/update.js +105 -8
  258. package/lib/cli/version-helpers.js +131 -0
  259. package/lib/migrations/README.md +7 -5
  260. package/lib/migrations/index.js +17 -9
  261. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  262. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  263. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +154 -0
  264. package/package.json +2 -2
  265. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  266. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  267. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  268. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  269. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  270. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  271. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  272. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  273. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  274. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  275. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  276. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  277. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  278. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  279. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  280. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  281. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  282. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  283. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  284. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  285. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  286. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  287. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  288. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  289. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  290. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  291. package/.agents/schemas/risk-verdict.schema.json +0 -53
  292. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  293. package/.agents/scripts/analyze-execution.js +0 -444
  294. package/.agents/scripts/check-prepush-recovery.js +0 -90
  295. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  296. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  297. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -187
  298. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  299. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  300. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  301. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +0 -128
  302. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -273
  303. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  304. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  305. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  306. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  307. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  308. package/.agents/scripts/lib/orchestration/planning/risk-verdict.js +0 -104
  309. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  310. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  311. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  312. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -21
  313. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  314. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  315. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  316. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -397
  317. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  318. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +0 -155
  319. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  320. package/.agents/scripts/lib/orchestration/story-progress/story-run-progress-writer.js +0 -400
  321. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +0 -36
  322. package/.agents/scripts/resolve-plan-run.js +0 -117
  323. package/.agents/skills/core/analyze-execution/SKILL.md +0 -101
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * deliver-recover.js — probe a stranded Story's live state and print the ONE
5
+ * command that resumes it (Story #4543).
6
+ *
7
+ * Read-only by construction. This CLI mutates nothing: it reads the ticket's
8
+ * labels and lease, the Story branch locally and via its tracking ref, the
9
+ * worktree, and the PR (state + checks), then walks a fixed decision table
10
+ * and prints one command with the evidence it was derived from. It never
11
+ * prints a menu — a menu of options is what the operator already has, and it
12
+ * is the thing they cannot act on.
13
+ *
14
+ * The strand this exists for above all others is the **merged-but-label-stale**
15
+ * Story: a `/deliver` re-run refuses it outright, because
16
+ * `single-story-init.js` hard-errors on an already-closed Story. Before this
17
+ * surface, that Story had no automated way back.
18
+ *
19
+ * Usage:
20
+ * node .agents/scripts/deliver-recover.js --story <STORY_ID> [--cwd <main-repo>]
21
+ * [--json]
22
+ *
23
+ * Exit codes:
24
+ * 0 — a recovery shape was resolved and its next command printed (including
25
+ * the "nothing to recover" shapes). Reading state is not a failure.
26
+ * 1 — the probe itself could not run (unreadable ticket, bad input).
27
+ *
28
+ * @see .agents/scripts/lib/orchestration/deliver-recover.js
29
+ * @see .agents/schemas/story-deliver-terminal.schema.json
30
+ */
31
+
32
+ import { parseArgs } from 'node:util';
33
+ import { runAsCli } from './lib/cli-utils.js';
34
+ import { resolveConfig } from './lib/config-resolver.js';
35
+ import { Logger } from './lib/Logger.js';
36
+ import {
37
+ recoverStory,
38
+ renderRecovery,
39
+ } from './lib/orchestration/deliver-recover.js';
40
+ import { PROJECT_ROOT } from './lib/project-root.js';
41
+ import { createProvider } from './lib/provider-factory.js';
42
+
43
+ const HELP = `Usage: node .agents/scripts/deliver-recover.js --story <id> [--cwd <main-repo>] [--json]
44
+
45
+ Probes a Story's live delivery state — labels, lease, branch, worktree, PR
46
+ state and checks — and prints the single next command that resumes it, with
47
+ the evidence it was derived from. Read-only: mutates nothing.
48
+
49
+ Flags:
50
+ --story GitHub issue number of the Story (required).
51
+ --cwd Main-repo checkout to probe (default: project root).
52
+ --json Emit the full recovery envelope as JSON instead of prose.
53
+ --help Show this message.
54
+ `;
55
+
56
+ export function parseArgv(argv) {
57
+ const { values } = parseArgs({
58
+ args: argv,
59
+ options: {
60
+ story: { type: 'string' },
61
+ cwd: { type: 'string' },
62
+ json: { type: 'boolean', default: false },
63
+ help: { type: 'boolean', default: false },
64
+ },
65
+ strict: false,
66
+ });
67
+ return {
68
+ storyId: Number.parseInt(String(values.story ?? ''), 10),
69
+ cwd: values.cwd ?? null,
70
+ json: Boolean(values.json),
71
+ help: Boolean(values.help),
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Probe and report. Exported for testing.
77
+ */
78
+ export async function runDeliverRecover({
79
+ storyId: storyIdParam,
80
+ cwd: cwdParam,
81
+ json: jsonParam,
82
+ argv,
83
+ injectedProvider,
84
+ injectedConfig,
85
+ injectedGh,
86
+ injectedGitSpawn,
87
+ } = {}) {
88
+ const parsed =
89
+ storyIdParam !== undefined
90
+ ? { storyId: storyIdParam, cwd: cwdParam ?? null, json: !!jsonParam }
91
+ : parseArgv(argv ?? process.argv.slice(2));
92
+
93
+ if (parsed.help) {
94
+ Logger.info(HELP);
95
+ return { success: true, result: null };
96
+ }
97
+ if (!Number.isInteger(parsed.storyId) || parsed.storyId <= 0) {
98
+ throw new Error(
99
+ 'Usage: node deliver-recover.js --story <STORY_ID> [--cwd <main-repo>] [--json]',
100
+ );
101
+ }
102
+
103
+ const cwd = parsed.cwd ?? PROJECT_ROOT;
104
+ const config = injectedConfig || resolveConfig({ cwd });
105
+ const provider = injectedProvider || createProvider(config);
106
+
107
+ const recovery = await recoverStory({
108
+ storyId: parsed.storyId,
109
+ cwd,
110
+ provider,
111
+ config,
112
+ gh: injectedGh,
113
+ gitSpawnFn: injectedGitSpawn,
114
+ });
115
+
116
+ Logger.info(
117
+ parsed.json ? JSON.stringify(recovery, null, 2) : renderRecovery(recovery),
118
+ );
119
+ return { success: true, result: recovery };
120
+ }
121
+
122
+ runAsCli(import.meta.url, runDeliverRecover, { source: 'deliver-recover' });
@@ -8,7 +8,7 @@
8
8
  * any still-stuck entries by enumerating the processes holding handles
9
9
  * inside the worktree path and terminating them.
10
10
  *
11
- * Invoked by `/deliver`, `/epic-plan-spec` / `/epic-plan-decompose`
11
+ * Invoked by `/deliver` and `/plan`
12
12
  * (via `drainPendingCleanupAtBoot` → `worktree-sweep.js`), and
13
13
  * `story-close` so the pending-cleanup ledger drains automatically
14
14
  * across the sprint lifecycle. Operators can also run it standalone:
@@ -13,42 +13,22 @@
13
13
  *
14
14
  * Usage:
15
15
  * node .agents/scripts/evidence-gate.js \
16
- * (--epic-id <epicId> | --standalone) --scope-id <storyOrEpicId> --gate <name> \
16
+ * --standalone --scope-id <storyId> --gate <name> \
17
17
  * [--worktree <path>] [--no-evidence] -- <cmd> [args...]
18
18
  *
19
19
  * Examples:
20
- * node .agents/scripts/evidence-gate.js --epic-id 802 --scope-id 817 --gate lint -- npm run lint
21
- * node .agents/scripts/evidence-gate.js --epic-id 1030 --scope-id 1030 --gate test -- npm test
22
- * node .agents/scripts/evidence-gate.js --epic-id 1114 --scope-id 1120 --gate test \
23
- * --worktree .worktrees/story-1120 -- npm test
24
20
  * node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate lint \
25
21
  * --worktree .worktrees/story-4250 -- npm run lint
22
+ * node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate test \
23
+ * --worktree .worktrees/story-4250 -- npm test
26
24
  *
27
- * Either `--epic-id` or `--standalone` is required. When `scope-id ===
28
- * epic-id` the evidence file is Epic-scoped
29
- * (`<tempRoot>/epic-<eid>/validation-evidence.json`); when `scope-id !==
30
- * epic-id` it is Story-scoped under
31
- * `<tempRoot>/epic-<eid>/story-<sid>/validation-evidence.json`. With
32
- * `--standalone` (Story #4250) the file is anchored on the Story id alone at
25
+ * `--standalone` (Story #4250) is required: the evidence file is anchored on
26
+ * the Story id at
33
27
  * `<tempRoot>/standalone/stories/story-<sid>/validation-evidence.json` — the
34
28
  * same keyspace the standalone close consults, so the acceptance-self-eval
35
29
  * critic's verify[] runs (lint / typecheck) are shared with the close.
36
- *
37
- * **Worktree-aware spawn (Story #1120).** `--cwd` (default `PROJECT_ROOT`)
38
- * is the *evidence cwd* — it locates the per-Epic temp tree under the main
39
- * checkout's `.git/`. `--worktree` is the *spawn cwd* — when supplied, the
40
- * gate runner is launched with `cwd: <worktree>` and the HEAD-SHA used as
41
- * the evidence key is read from the worktree (so caching keys to the Story
42
- * branch's HEAD, not the main branch's). When `--worktree` is omitted,
43
- * spawn cwd falls back to `--cwd` (legacy single-tree behaviour).
44
- *
45
- * Exit codes:
46
- * 0 — gate passed (or skipped via evidence)
47
- * N — gate failed (passes through the runner's exit code)
48
- *
49
- * `--no-evidence` forces the runner regardless of recorded state. The
50
- * evidence file is gitignored — evidence is a perf optimization, not a
51
- * trust boundary; pre-push hooks and CI continue to verify independently.
30
+ * v2.0.0 removed the Epic tier along with the `--epic-id` Epic-keyed
31
+ * keyspace.
52
32
  */
53
33
 
54
34
  import { spawnSync } from 'node:child_process';
@@ -88,7 +68,6 @@ export function parseWrapperArgs(argv) {
88
68
  args: argv,
89
69
  options: {
90
70
  'scope-id': { type: 'string' },
91
- 'epic-id': { type: 'string' },
92
71
  gate: { type: 'string' },
93
72
  'no-evidence': { type: 'boolean', default: false },
94
73
  standalone: { type: 'boolean', default: false },
@@ -98,10 +77,8 @@ export function parseWrapperArgs(argv) {
98
77
  strict: false,
99
78
  });
100
79
  const scopeId = Number.parseInt(values['scope-id'] ?? '', 10);
101
- const epicId = Number.parseInt(values['epic-id'] ?? '', 10);
102
80
  return {
103
81
  scopeId: Number.isNaN(scopeId) || scopeId <= 0 ? null : scopeId,
104
- epicId: Number.isNaN(epicId) || epicId <= 0 ? null : epicId,
105
82
  standalone: values.standalone === true,
106
83
  gate: values.gate ?? null,
107
84
  useEvidence: values['no-evidence'] !== true,
@@ -126,15 +103,13 @@ function resolveHeadShaDefault(cwd, gitSpawnFn) {
126
103
  * Exported for tests + the CLI `main()`.
127
104
  *
128
105
  * @param {object} params
129
- * @param {number} params.scopeId — Story / Epic ID (positive integer).
130
- * @param {number|null} [params.epicId] Parent Epic id (Epic-keyed path).
131
- * @param {boolean} [params.standalone] When true, route to the
132
- * storyId-anchored standalone keyspace instead of the Epic-keyed path
133
- * (Story #4250). Substitutes for `epicId`.
106
+ * @param {number} params.scopeId — Story ID (positive integer).
107
+ * @param {boolean} [params.standalone] Required. Routes to the
108
+ * storyId-anchored standalone keyspace (Story #4250).
134
109
  * @param {string} params.gate — Logical gate name (`lint`, `typecheck`, …).
135
110
  * @param {boolean} params.useEvidence — When false, force the runner.
136
- * @param {string} params.cwd — Evidence cwd (locates the per-Epic
137
- * temp tree). The runner is spawned in `worktreePath` when set, else `cwd`.
111
+ * @param {string} params.cwd — Evidence cwd (locates the temp
112
+ * tree). The runner is spawned in `worktreePath` when set, else `cwd`.
138
113
  * @param {string|null} [params.worktreePath] — Spawn cwd override (Story #1120).
139
114
  * When set, the runner runs in the Story worktree and the HEAD-SHA used as
140
115
  * the evidence cache key is read from the worktree, not from `cwd`.
@@ -159,7 +134,6 @@ export async function runEvidenceGate(params, deps = {}) {
159
134
  } = deps;
160
135
  const {
161
136
  scopeId,
162
- epicId,
163
137
  standalone = false,
164
138
  gate,
165
139
  useEvidence,
@@ -168,31 +142,27 @@ export async function runEvidenceGate(params, deps = {}) {
168
142
  runnerArgs,
169
143
  } = params ?? {};
170
144
 
171
- // `--epic-id` is required for the Epic-keyed path; `--standalone` (Story
172
- // #4250) substitutes for it and routes the evidence file to the
173
- // storyId-anchored standalone keyspace so the acceptance-self-eval critic
174
- // can record verify[] evidence into the same keyspace the standalone close
175
- // consults.
145
+ // `--standalone` (Story #4250) routes the evidence file to the
146
+ // storyId-anchored keyspace so the acceptance-self-eval critic can record
147
+ // verify[] evidence into the same keyspace the standalone close consults.
176
148
  if (
177
149
  !scopeId ||
178
- (!epicId && !standalone) ||
150
+ !standalone ||
179
151
  !gate ||
180
152
  !runnerArgs ||
181
153
  runnerArgs.length === 0
182
154
  ) {
183
155
  logger.fatal(
184
- 'Usage: node evidence-gate.js (--epic-id <epicId> | --standalone) --scope-id <id> --gate <name> [--worktree <path>] [--no-evidence] -- <cmd> [args...]',
156
+ 'Usage: node evidence-gate.js --standalone --scope-id <id> --gate <name> [--worktree <path>] [--no-evidence] -- <cmd> [args...]',
185
157
  );
186
158
  return { status: 1, skipped: false };
187
159
  }
188
- // Evidence-store opts shared by shouldSkip + recordPass below. `standalone`
189
- // routes to the storyId-anchored keyspace; otherwise the Epic-keyed path
190
- // resolves under `epicId`.
191
- const evidenceStoreOpts = { cwd, epicId, standalone };
160
+ // Evidence-store opts shared by shouldSkip + recordPass below.
161
+ const evidenceStoreOpts = { cwd, standalone };
192
162
 
193
163
  // Spawn cwd is the worktree when supplied — every gate command sees the
194
164
  // Story branch's tree, not the main checkout. Evidence cwd stays anchored
195
- // to the main checkout so the per-Epic temp tree resolves under the main
165
+ // to the main checkout so the temp tree resolves under the main
196
166
  // `.git/`. The HEAD-SHA used as the cache key is read from the spawn cwd
197
167
  // (the worktree), so cache entries key against the Story branch's HEAD.
198
168
  const spawnCwd = worktreePath ?? cwd;
@@ -21,6 +21,11 @@
21
21
  // --out <file> Override the manifest output path (defaults to
22
22
  // `<root>/.agents/skills/skills.index.json`).
23
23
  //
24
+ // Written output is passed through the project formatter (Biome) so that
25
+ // regenerating on a clean tree leaves no format drift behind; the step is
26
+ // best-effort and degrades to plain `JSON.stringify` output where Biome is
27
+ // not installed. See `lib/format-generated-json.js`.
28
+ //
24
29
  // Honors AGENT_LOG_LEVEL via the shared `Logger`. Stdout is reserved for
25
30
  // the diff text in --check failure mode; informational progress goes to
26
31
  // stderr.
@@ -30,6 +35,7 @@ import path from 'node:path';
30
35
  import { fileURLToPath } from 'node:url';
31
36
  import { parseStandardCliArgs } from './lib/cli/standard-args.js';
32
37
  import { runAsCli } from './lib/cli-utils.js';
38
+ import { formatGeneratedJson } from './lib/format-generated-json.js';
33
39
  import { Logger } from './lib/Logger.js';
34
40
  import { parseSkill } from './lib/skills/parse-skill.js';
35
41
  import { collectSkillFiles } from './lib/skills/walk-skill-files.js';
@@ -125,6 +131,12 @@ export function buildManifest(repoRoot, { nowIso } = {}) {
125
131
  * Serialize a manifest object as canonical JSON: 2-space indent,
126
132
  * trailing newline. Two runs against an unchanged corpus produce
127
133
  * byte-identical output modulo `generatedAt`.
134
+ *
135
+ * This is the *pre-format* shape. `JSON.stringify` expands every array
136
+ * across multiple lines, while Biome collapses short ones that fit
137
+ * inside `lineWidth` (`"allowedTools": ["Read", "Bash"]`). Writing this
138
+ * text verbatim therefore leaves the tree format-dirty on every run —
139
+ * see `lib/format-generated-json.js`, which reconciles the two.
128
140
  */
129
141
  export function serializeManifest(manifest) {
130
142
  return `${JSON.stringify(manifest, null, 2)}\n`;
@@ -233,8 +245,12 @@ export function run({ argv = [], now = new Date(), repoRoot } = {}) {
233
245
  }
234
246
 
235
247
  const serialized = serializeManifest(fresh);
248
+ const opts = { cwd: root, filename: 'skills.index.json' };
236
249
  fs.mkdirSync(path.dirname(outPath), { recursive: true });
237
- fs.writeFileSync(outPath, serialized);
250
+ fs.writeFileSync(
251
+ outPath,
252
+ formatGeneratedJson(serialized, opts) ?? serialized,
253
+ );
238
254
  Logger.info(
239
255
  `wrote ${path.relative(root, outPath).split(path.sep).join('/')} (${fresh.skills.length} entries)`,
240
256
  );
@@ -91,10 +91,10 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
91
91
  'compose. This file is only for "which command does X?" lookups.',
92
92
  '',
93
93
  'Every command file lives at `.agents/workflows/<name>.md` and is projected',
94
- 'into a flat `.claude/commands/` tree by `npm run sync:commands` (the',
95
- 'UserPromptSubmit hook keeps it current) so it shows up as a bare `/<name>`',
96
- 'slash command (e.g. `/deliver`). The projection writes only',
97
- '`.claude/commands/<name>.md` — there is no plugin manifest and no',
94
+ 'into a flat `.claude/commands/` tree by `npm run sync:commands` (kept',
95
+ 'current at install time and on every `mandrel sync`/`update`) so it shows',
96
+ 'up as a bare `/<name>` slash command (e.g. `/deliver`). The projection',
97
+ 'writes only `.claude/commands/<name>.md` — there is no plugin manifest and no',
98
98
  'marketplace listing. The commands load in every Claude Code environment.',
99
99
  '',
100
100
  'Loop units are the one namespaced exception: files under',
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ITicketingProvider — Abstract Ticketing Provider Interface
3
3
  *
4
- * All ticketing interactions in the v5 Epic-centric orchestration are mediated
4
+ * All ticketing interactions in the v5 Story-centric orchestration are mediated
5
5
  * through this interface. Concrete implementations (e.g., `providers/github.js`)
6
6
  * extend this class and override every method.
7
7
  *
@@ -17,21 +17,6 @@ export class ITicketingProvider {
17
17
  // Read Operations
18
18
  // ---------------------------------------------------------------------------
19
19
 
20
- /**
21
- * Fetch all Epic tickets in the repository.
22
- *
23
- * @param {{ state?: 'open'|'closed'|'all' }} [filters={}]
24
- * @returns {Promise<Array<{
25
- * id: number,
26
- * title: string,
27
- * labels: string[],
28
- * state: 'open'|'closed'
29
- * }>>}
30
- */
31
- async getEpics(_filters = {}) {
32
- throw new Error('Not implemented: getEpics');
33
- }
34
-
35
20
  /**
36
21
  * Fetch the Epic issue with its body — the single planning document
37
22
  * (ideation sections plus the folded Tech Spec / Acceptance Table
@@ -165,9 +150,6 @@ export class ITicketingProvider {
165
150
  * }} ticketData - The ticket content and metadata.
166
151
  * @returns {Promise<{ id: number, url: string }>}
167
152
  */
168
- async createTicket(_parentId, _ticketData) {
169
- throw new Error('Not implemented: createTicket');
170
- }
171
153
 
172
154
  /**
173
155
  * Link an existing issue as a sub-issue of a parent.