mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
package/lib/cli/doctor.js CHANGED
@@ -1,26 +1,8 @@
1
1
  // lib/cli/doctor.js
2
2
  /**
3
- * `mandrel doctor` subcommand.
4
- *
5
- * Runs every check from lib/cli/registry.js in registration order,
6
- * prints a ✔/✘ per-check report with remedies for failures, prints a
7
- * final summary line, and exits 0 when all checks pass or non-zero when
8
- * any check fails.
9
- *
10
- * Output contract (per Story #3450 AC):
11
- * pass → "✔ <name> <detail>"
12
- * fail → "✘ <name> <detail>\n → <remedy>"
13
- * final → "✅ Ready (N/N checks passed)"
14
- * | "❌ Not ready (N/N checks failed)"
15
- *
16
- * All output goes to process.stdout so it can be captured by tests.
17
- * Exit code 0 = all pass, 1 = any fail.
18
- *
19
- * Injectable seams (used by tests):
20
- * - `checks` — replaces the default registry array
21
- * - `write` — replaces process.stdout.write
22
- * - `exit` — replaces process.exit
23
- * - `writeResultCache` — replaces the temp/doctor-result.json writer
3
+ * `mandrel doctor`: run the registry checks in order, print a ✔/✘ line per
4
+ * check (with the remedy under a failure) and a summary; exit 1 on any
5
+ * failure.
24
6
  */
25
7
 
26
8
  import nodeFs from 'node:fs';
@@ -32,13 +14,7 @@ import {
32
14
  } from '../../.agents/scripts/lib/doc-tiers.js';
33
15
  import { registry } from './registry.js';
34
16
 
35
- // ---------------------------------------------------------------------------
36
- // Formatting helpers
37
- // ---------------------------------------------------------------------------
38
-
39
17
  /**
40
- * Pad or truncate `name` to `width` characters so columns line up neatly.
41
- *
42
18
  * @param {string} name
43
19
  * @param {number} width
44
20
  * @returns {string}
@@ -47,13 +23,10 @@ function padName(name, width) {
47
23
  return name.length >= width ? name : name + ' '.repeat(width - name.length);
48
24
  }
49
25
 
50
- // Column width for the check-name field (longest registry name is
51
- // "agents-materialized" = 19 chars; use 21 for breathing room).
26
+ // Longest check name is 19 chars.
52
27
  const NAME_COL = 21;
53
28
 
54
29
  /**
55
- * Format a single check result line (or lines when a remedy is present).
56
- *
57
30
  * @param {{ name: string, ok: boolean, detail: string, remedy?: string }} result
58
31
  * @returns {string}
59
32
  */
@@ -68,8 +41,6 @@ function formatResult({ name, ok, detail, remedy }) {
68
41
  }
69
42
 
70
43
  /**
71
- * Format the final summary line.
72
- *
73
44
  * @param {number} passed
74
45
  * @param {number} total
75
46
  * @returns {string}
@@ -83,17 +54,9 @@ function formatSummary(passed, total) {
83
54
  }
84
55
 
85
56
  /**
86
- * Build the one report-only line describing the always-loaded documentation
87
- * closure (the `CLAUDE.md` `@`-import graph) — its file count and total size in
88
- * KB. This is **informational only**: it is never counted toward the pass/fail
89
- * tally and therefore never changes the doctor exit code (Story #4438). Any
90
- * failure to resolve the closure degrades to a neutral line rather than
91
- * throwing, so an unreadable tree never breaks the doctor run.
92
- *
93
- * Security (security-baseline § 5 — Data Leakage & Logging): emits only a file
94
- * count and byte total, never file contents.
95
- *
96
- * Exported for testing.
57
+ * Informational line for the `CLAUDE.md` always-loaded closure (file count,
58
+ * KB). Never counted toward the verdict; a resolve failure degrades to a
59
+ * neutral line.
97
60
  *
98
61
  * @param {{ cwd?: () => string, resolveClosure?: (root: string) => Array<{ path: string, bytes: number }> }} [opts]
99
62
  * @returns {string} a single line terminated by `\n`
@@ -116,19 +79,9 @@ export function formatClosureReport({
116
79
  return `ℹ ${label} ${files.length} file(s), ${kb} KB always-loaded\n`;
117
80
  }
118
81
 
119
- // ---------------------------------------------------------------------------
120
- // Result cache
121
- // ---------------------------------------------------------------------------
122
-
123
82
  /**
124
- * Best-effort write of the doctor verdict to `temp/doctor-result.json` under
125
- * the consumer root so downstream workflows (e.g. the `/mandrel-plan` first-run
126
- * preflight) can read the last recorded verdict without re-running doctor.
127
- * `temp/` is the gitignored scratch root, so neither git nor the sync prune
128
- * pass ever sees the cache. Any write failure is swallowed — the cache is
129
- * advisory, never a gate.
130
- *
131
- * Exported for testing.
83
+ * Record the verdict in `temp/doctor-result.json` for workflows that read it
84
+ * without re-running doctor. Advisory: write failures are swallowed.
132
85
  *
133
86
  * @param {'ready'|'unready'} verdict
134
87
  * @param {{ fs?: typeof nodeFs, cwd?: () => string }} [opts]
@@ -146,17 +99,11 @@ export function writeDoctorResultCache(
146
99
  `${JSON.stringify({ verdict, checkedAt: new Date().toISOString() }, null, 2)}\n`,
147
100
  );
148
101
  } catch {
149
- // Best-effort only — an unwritable temp/ must never fail the doctor run.
102
+ // An unwritable temp/ must never fail the doctor run.
150
103
  }
151
104
  }
152
105
 
153
- // ---------------------------------------------------------------------------
154
- // Doctor runner (exported for testing)
155
- // ---------------------------------------------------------------------------
156
-
157
106
  /**
158
- * Run all checks and emit a formatted report.
159
- *
160
107
  * @param {{
161
108
  * checks?: Array<{ name: string, run(opts?: unknown): { ok: boolean, detail: string, remedy?: string } }>,
162
109
  * write?: (s: string) => void,
@@ -181,8 +128,7 @@ export async function runDoctor({
181
128
  write(formatResult({ name: check.name, ...result }));
182
129
  }
183
130
 
184
- // Report-only informational line — NOT counted toward passed/total, so it
185
- // never affects the doctor verdict or exit code (Story #4438).
131
+ // Report-only: not counted toward passed/total.
186
132
  write(closureReport());
187
133
 
188
134
  const total = checks.length;
@@ -195,13 +141,7 @@ export async function runDoctor({
195
141
  }
196
142
  }
197
143
 
198
- // ---------------------------------------------------------------------------
199
- // Subcommand entry point (called by bin/mandrel.js)
200
- // ---------------------------------------------------------------------------
201
-
202
144
  /**
203
- * Default export consumed by `bin/mandrel.js`.
204
- *
205
145
  * @param {string[]} _argv Unused — `mandrel doctor` takes no arguments.
206
146
  * @returns {Promise<void>}
207
147
  */
package/lib/cli/init.js CHANGED
@@ -1,67 +1,14 @@
1
1
  // lib/cli/init.js
2
2
  /**
3
- * `mandrel init` subcommand — one-command cold start (Story #3975).
3
+ * `mandrel init`: cold start. When `./.agents/` is absent, run
4
+ * `npm install mandrel --ignore-scripts` then an explicit sync through the
5
+ * installed bin (one deterministic materialization, no lifecycle scripts);
6
+ * then ask whether to run `bootstrap.js` now (default yes). `--assume-yes`
7
+ * skips the prompt; a non-TTY without it stays files-only so GitHub
8
+ * provisioning never runs unattended.
4
9
  *
5
- * Folds the former `create-mandrel` launcher logic into a subcommand of the
6
- * single published `mandrel` package. `npx mandrel init` (≡ `npm exec --
7
- * mandrel init`, or `mandrel init` once installed) takes a project from a
8
- * blank folder to a configured Mandrel environment in one command:
9
- *
10
- * 1. **Install-if-absent.** When `./.agents/` is missing in the cwd, install
11
- * the framework deterministically — `npm install mandrel --ignore-scripts`
12
- * followed by an explicit sync run against the freshly installed bin
13
- * (`node ./node_modules/mandrel/bin/mandrel.js sync`, NOT a bare `mandrel`
14
- * on `PATH` — see `SYNC_BIN` below). The `--ignore-scripts` install
15
- * skips the package's best-effort `postinstall` sync so the explicit
16
- * `sync` is the single, deterministic materialization (review rec D.3 —
17
- * no postinstall-then-init double-sync, and no arbitrary install
18
- * lifecycle scripts during cold start). When `./.agents/` already exists
19
- * (the operator ran `npm install mandrel` first), step 1 is skipped and
20
- * `init` goes straight to the prompt — the one subcommand is idempotent
21
- * across both the cold-start and post-install entry points.
22
- *
23
- * 2. **Yes/no prompt.** Ask whether to begin the interactive setup now
24
- * (yes → run `node .agents/scripts/bootstrap.js`, forwarding every
25
- * passthrough flag unchanged) or stop at "just the files" (no → print a
26
- * re-run hint and exit 0). Yes is the default, so a bare Enter configures
27
- * (mirrors the `[Y/n]` convention in bootstrap.js). `--assume-yes` skips
28
- * the prompt and configures (the flag is also forwarded to bootstrap for
29
- * its own non-interactive run). A non-TTY stdin without `--assume-yes`
30
- * defaults to no (files-only) so the side-effecting GitHub provisioning
31
- * never runs unattended.
32
- *
33
- * ## Cold-start provenance
34
- *
35
- * The installed package name is the **hardcoded build-time constant**
36
- * `PACKAGE_NAME` below — it is NEVER read from argv or the environment. A
37
- * cold start fetches `mandrel` from npx's temp cache and runs this bin; the
38
- * package it then installs into the project must be the same `mandrel`, not an
39
- * attacker-influenced name supplied on the command line. The forwarded
40
- * passthrough flags reach `bootstrap.js` (the sole bootstrap orchestrator),
41
- * which owns its own summary + confirm loop and validates its own inputs.
42
- *
43
- * ## Injectable seams (used by tests/cli/init.test.js)
44
- *
45
- * The plan/decision logic is a pure function (`planInit`) over injected
46
- * boundaries so the suite is hermetic — no real TTY, npm, or network:
47
- *
48
- * - `argv` — subcommand args (after `mandrel init`)
49
- * - `exists` — `(path) => boolean`; defaults to an `fs.existsSync` probe
50
- * for `./.agents/` in the cwd
51
- * - `runStep` — `(cmd, args) => { status }`; runs one install/sync/bootstrap
52
- * step. Defaults to a `spawnSync` runner with `stdio: inherit`.
53
- * - `confirm` — `() => boolean | Promise<boolean>`; reads the operator's
54
- * yes/no answer (true = configure now). Defaults to a
55
- * `node:readline` stdin prompt (awaited) with yes as the
56
- * default.
57
- * - `stdout` — `(s) => void`; defaults to `process.stdout.write`.
58
- * - `isTTY` — boolean; defaults to `process.stdin.isTTY`.
59
- * - `exit` — `(code) => void`; defaults to `process.exit`.
60
- *
61
- * Security (security-baseline § 5/6): logs only flag/step descriptions and
62
- * never reads or echoes tokens, credentials, or env values. The package name
63
- * is a hardcoded constant rather than interpolated input, and the step runner
64
- * passes argv as an array (no shell-string concatenation of user input).
10
+ * The installed package is the hardcoded `PACKAGE_NAME`, never argv or env,
11
+ * so a cold start cannot be steered to another package.
65
12
  */
66
13
 
67
14
  import { spawnSync } from 'node:child_process';
@@ -70,10 +17,7 @@ import path from 'node:path';
70
17
  import readline from 'node:readline/promises';
71
18
  import { pathToFileURL } from 'node:url';
72
19
 
73
- // Lazily resolved at runtime so cold-start `npx mandrel init` (where
74
- // `.agents/` is absent) does not try to import from a directory that does not
75
- // exist yet. The import is performed after bootstrap succeeds and `.agents/`
76
- // is guaranteed to be materialised.
20
+ // Lazy: `.agents/` does not exist until the cold start has materialized it.
77
21
  let _runInitTail = null;
78
22
  async function getRunInitTail(projectRoot) {
79
23
  if (_runInitTail) return _runInitTail;
@@ -85,39 +29,21 @@ async function getRunInitTail(projectRoot) {
85
29
  'onboard',
86
30
  'init-tail.js',
87
31
  );
88
- // pathToFileURL handles Windows drive letters correctly (a raw
89
- // `file://C:\…` template treats the drive letter as a URL host — same
90
- // fix as commit 2e3d210b in lib/transpile.js).
32
+ // A raw `file://C:\…` template would read the drive letter as a URL host.
91
33
  const mod = await import(pathToFileURL(tailPath).href);
92
34
  _runInitTail = mod.runInitTail;
93
35
  return _runInitTail;
94
36
  }
95
37
 
96
- /**
97
- * Hardcoded build-time package name. NEVER read from argv or env — cold-start
98
- * provenance requires the install target to be the same package this bin
99
- * shipped from. See the module header.
100
- */
38
+ /** Never read from argv or env (see the module header). */
101
39
  const PACKAGE_NAME = 'mandrel';
102
40
 
103
- // The `mandrel sync` and `node .agents/scripts/bootstrap.js` invocations both
104
- // resolve relative to the consumer's cwd at run time (the materialized
105
- // `.agents/` lives there), so they are expressed as cwd-relative steps rather
106
- // than against PROJECT_ROOT (which, under npx, is npx's throwaway cache).
41
+ // Cwd-relative: under npx the package root is npx's throwaway cache.
107
42
  const BOOTSTRAP_SCRIPT = path.join('.agents', 'scripts', 'bootstrap.js');
108
43
 
109
- // The `sync` step is dispatched against the **locally installed** Mandrel bin
110
- // rather than a bare `mandrel` on `PATH`. A bare `spawnSync('mandrel', …)` only
111
- // resolves while npx keeps its throwaway `.bin` on `PATH`; reached any other
112
- // way (a documented `npm install mandrel` then `mandrel init`, or a plain
113
- // `node bin/mandrel.js init`), the freshly installed binary lives at
114
- // `./node_modules/mandrel/bin/mandrel.js` — off `PATH` — and a bare spawn dies
115
- // with ENOENT, leaving `.agents/` un-materialized. Spawning `process.execPath`
116
- // against the package entrypoint resolves identically under npx, under a
117
- // post-install invocation, and in tests — and, by going through `node`, also
118
- // sidesteps the win32 `.cmd`-shim concern entirely (no `shell: true` needed for
119
- // this step). The path is cwd-relative because the package is installed into
120
- // the consumer's cwd (the same reason BOOTSTRAP_SCRIPT is cwd-relative).
44
+ // Spawned as `node <installed bin>`, not a bare `mandrel`: the bare name only
45
+ // resolves while npx's `.bin` is on PATH (ENOENT after a plain `npm install`),
46
+ // and going through node avoids the win32 `.cmd` shim.
121
47
  const SYNC_BIN = path.join('node_modules', PACKAGE_NAME, 'bin', 'mandrel.js');
122
48
 
123
49
  const PROMPT_TEXT =
@@ -128,12 +54,7 @@ const PROMPT_TEXT =
128
54
 
129
55
  const FILES_ONLY_HINT = 'Setup any time with: npx mandrel init\n';
130
56
 
131
- // ASCII banner printed once at the very top of `mandrel init`, before any
132
- // install/sync output streams to the terminal. Paste multi-line ASCII art
133
- // between the fences below. `String.raw` keeps backslashes literal so the art
134
- // renders exactly as pasted — the only characters to avoid inside are a
135
- // literal backtick and the `${` sequence. The leading/trailing blank lines
136
- // frame the art in the terminal.
57
+ // `String.raw` keeps the art's backslashes literal; avoid backticks and `${`.
137
58
  const BANNER = String.raw`
138
59
 
139
60
  ______ ___ _________ ______
@@ -145,20 +66,11 @@ ____________________________________________________
145
66
 
146
67
  `;
147
68
 
148
- // On win32, `npm` resolves to a `.cmd` shim that Node refuses to spawn without
149
- // a shell after the CVE-2024-27980 hardening; mirror update.js and set
150
- // `shell: true` only there. Off win32, never shell out — array argv stays
151
- // injection-proof. (The `sync` step no longer hits a `.cmd` shim at all: it is
152
- // dispatched as `process.execPath` + `SYNC_BIN`, a plain `node` spawn — but the
153
- // `npm install` step still needs the shim handling, so `NEEDS_SHELL` stays.)
69
+ // Win32 `npm` is a `.cmd` shim Node will not spawn without a shell
70
+ // (CVE-2024-27980); shell nowhere else, so array argv stays injection-proof.
154
71
  const NEEDS_SHELL = process.platform === 'win32';
155
72
 
156
73
  /**
157
- * Strip the `--assume-yes` flag from a passthrough argv, returning the
158
- * remaining flags. `--assume-yes` is consumed by `init` to skip the prompt but
159
- * is ALSO forwarded to bootstrap (see `buildBootstrapArgs`), so this helper
160
- * exists only to detect its presence, not to drop it from the forward set.
161
- *
162
74
  * @param {string[]} argv
163
75
  * @returns {boolean} whether `--assume-yes` is present
164
76
  */
@@ -167,9 +79,7 @@ function hasAssumeYes(argv) {
167
79
  }
168
80
 
169
81
  /**
170
- * Build the forwarded argv for the bootstrap step. Every passthrough flag is
171
- * forwarded unchanged; `--assume-yes` is appended when chosen but absent so
172
- * bootstrap runs non-interactively without the operator having typed it.
82
+ * All flags forwarded unchanged, plus `--assume-yes` when chosen but absent.
173
83
  *
174
84
  * @param {string[]} argv
175
85
  * @param {boolean} assumeYes
@@ -183,13 +93,7 @@ function buildBootstrapArgs(argv, assumeYes) {
183
93
  }
184
94
 
185
95
  /**
186
- * Decide and execute the cold-start plan over injected boundaries.
187
- *
188
- * This is the testable core: it consults `exists` to decide whether to run the
189
- * install + sync steps, resolves the prompt outcome from `isTTY` / `--assume-yes`
190
- * / `confirm`, and either runs the bootstrap step or prints the files-only hint.
191
- * Every effectful boundary is injected so the suite never touches a real TTY,
192
- * npm, or the network.
96
+ * The cold-start plan over injected boundaries.
193
97
  *
194
98
  * @param {{
195
99
  * argv?: string[],
@@ -219,10 +123,6 @@ export async function planInit({
219
123
  const steps = [];
220
124
 
221
125
  /**
222
- * Run one step through the injected runner and record it. A non-zero status
223
- * short-circuits the plan with that exit code (the runner inherits stdio, so
224
- * the failing tool's own output already reached the terminal).
225
- *
226
126
  * @param {string} cmd
227
127
  * @param {string[]} args
228
128
  * @returns {number} the step's exit code (0 on success)
@@ -233,10 +133,6 @@ export async function planInit({
233
133
  return result?.status ?? 1;
234
134
  };
235
135
 
236
- // --- Step 1: install-if-absent ------------------------------------------
237
- // When `./.agents/` is missing, materialize the framework deterministically:
238
- // `npm install <pkg> --ignore-scripts` then explicit `mandrel sync`. When it
239
- // is present, skip straight to the prompt (idempotent post-install path).
240
136
  const agentsPresent = exists('.agents');
241
137
  if (!agentsPresent) {
242
138
  const installStatus = step('npm', [
@@ -266,13 +162,8 @@ export async function planInit({
266
162
 
267
163
  const installed = !agentsPresent;
268
164
 
269
- // --- Step 2: configure-or-files prompt ----------------------------------
270
165
  const assumeYes = hasAssumeYes(argv);
271
166
 
272
- // Decide the outcome: configure (run bootstrap) vs. files-only.
273
- // - `--assume-yes` → configure, prompt skipped entirely.
274
- // - non-TTY without `--assume-yes` → files-only (never provision unattended).
275
- // - TTY → consult the confirm seam for the yes/no answer (yes = configure).
276
167
  let proceed;
277
168
  if (assumeYes) {
278
169
  proceed = true;
@@ -298,11 +189,8 @@ export async function planInit({
298
189
  };
299
190
  }
300
191
 
301
- // Bootstrap succeeded — run the onboarding tail: stack detection, docs
302
- // scaffolding offer, doctor gate, and /mandrel-plan handoff. A tail that reports
303
- // `ok: false` (the doctor gate failed) makes the whole init exit
304
- // non-zero; the tail already printed its own remediation message, and the
305
- // earlier install/sync/bootstrap phases' results stand as completed.
192
+ // A tail reporting `ok: false` (doctor gate failed) fails init; it has
193
+ // already printed its own remediation.
306
194
  if (afterBootstrap) {
307
195
  const tail = await afterBootstrap(process.cwd());
308
196
  if (tail && tail.ok === false) {
@@ -323,14 +211,11 @@ export async function planInit({
323
211
  };
324
212
  }
325
213
 
326
- // Declined (files-only): print the re-run hint and exit cleanly.
327
214
  stdout(FILES_ONLY_HINT);
328
215
  return { installed, ranBootstrap: false, steps, exitCode: 0 };
329
216
  }
330
217
 
331
218
  /**
332
- * Default `exists` seam — probe for `./.agents/` in the consumer's cwd.
333
- *
334
219
  * @param {string} relPath
335
220
  * @returns {boolean}
336
221
  */
@@ -339,12 +224,6 @@ function defaultExists(relPath) {
339
224
  }
340
225
 
341
226
  /**
342
- * Default step runner — spawn the tool synchronously, inheriting stdio so its
343
- * output streams to the terminal. Sets `shell: true` only on win32 so the
344
- * `npm.cmd` shim resolves under CVE-2024-27980 hardening. The `sync` and
345
- * bootstrap steps spawn `process.execPath` (a plain `node`), which needs no
346
- * shell on any platform.
347
- *
348
227
  * @param {string} cmd
349
228
  * @param {string[]} args
350
229
  * @returns {{ status: number | null }}
@@ -358,23 +237,10 @@ function defaultRunStep(cmd, args) {
358
237
  }
359
238
 
360
239
  /**
361
- * Default `confirm` seam — yes/no prompt read via `node:readline` (mirrors the
362
- * prompt mechanism in `bootstrap.js`). Returns on Enter and never blocks
363
- * waiting for EOF the way `fs.readFileSync(0)` did — that EOF-blocking read hung
364
- * `mandrel init` on an interactive TTY. Any input other than an explicit "no"
365
- * (`n`/`no`, case-insensitive) — including bare Enter — resolves to `true`
366
- * (configure), matching the `[Y/n]` convention where yes is the default. The
367
- * prompt text is written by `planInit` via `stdout`, so the question string
368
- * passed here is empty.
369
- *
370
- * `terminal: false` is **load-bearing**, not cosmetic: with terminal mode on
371
- * (the default when stdout is a TTY) readline emits cursor-control escapes
372
- * (`\x1b[1G\x1b[0J` — column-1 + erase-to-end-of-screen) when it takes over the
373
- * line, which **erases the `[Y/n]:` prompt already written via `stdout`** — the
374
- * operator then sees only the first prompt line and a dead-looking cursor.
375
- * Disabling terminal mode leaves the pre-written prompt intact and reads the
376
- * line via the TTY's own cooked-mode echo. `createInterface` is injectable so a
377
- * test can assert this option is set (regression guard).
240
+ * Anything but `n`/`no` (including bare Enter) means yes. Reads a line rather
241
+ * than waiting for EOF, which would hang on a TTY. `terminal: false` is
242
+ * load-bearing: terminal mode emits erase-line escapes that wipe the
243
+ * `[Y/n]:` prompt `planInit` already wrote.
378
244
  *
379
245
  * @param {{ createInterface?: typeof readline.createInterface }} [opts]
380
246
  * @returns {Promise<boolean>}
@@ -391,7 +257,6 @@ export async function defaultConfirm({
391
257
  const answer = (await rl.question('')).trim().toLowerCase();
392
258
  return answer !== 'n' && answer !== 'no';
393
259
  } catch {
394
- // No readable line (e.g. stdin closed) → default to yes (configure).
395
260
  return true;
396
261
  } finally {
397
262
  rl.close();
@@ -399,8 +264,6 @@ export async function defaultConfirm({
399
264
  }
400
265
 
401
266
  /**
402
- * Default export consumed by `bin/mandrel.js`.
403
- *
404
267
  * @param {string[]} [argv] - Subcommand arguments (after `mandrel init`).
405
268
  * @returns {Promise<void>}
406
269
  */
@@ -417,8 +280,6 @@ export default async function run(argv = []) {
417
280
  return;
418
281
  }
419
282
 
420
- // Banner is the very first output — before the install + sync steps that
421
- // planInit kicks off — so it greets the operator on a cold start.
422
283
  process.stdout.write(BANNER);
423
284
 
424
285
  const result = await planInit({
@@ -1,54 +1,8 @@
1
1
  // lib/cli/migrate.js
2
2
  /**
3
- * `mandrel migrate` subcommand — the standalone migration runner entry
4
- * (f-migration-runner, Story #3505, Epic #3437 — Auto-Update & Version
5
- * Lifecycle).
6
- *
7
- * Exposes the version-keyed migration runner from `lib/migrations/index.js` as
8
- * a standalone command so operators can apply (or preview) on-disk migrations
9
- * without going through a full `mandrel update` cycle or a package bump. This
10
- * is the manual escape hatch for re-running a migration that a prior upgrade
11
- * missed, or for inspecting what a version crossing would do before committing
12
- * to it.
13
- *
14
- * ## CLI surface
15
- *
16
- * mandrel migrate --from <v> --to <v> [--dry-run]
17
- *
18
- * --from <v> Version the tree is currently on (exclusive lower bound).
19
- * --to <v> Version the tree is upgrading to (inclusive upper bound).
20
- * --dry-run Report the steps that WOULD run and write nothing.
21
- *
22
- * Both `--from` and `--to` are required for a live run; a missing bound is a
23
- * usage error (non-zero exit). `--from`/`--to` accept either `--from 1.4.0` or
24
- * `--from=1.4.0` spellings.
25
- *
26
- * ## `--dry-run`
27
- *
28
- * Resolves the in-range steps from the registry, consults each step's
29
- * `detect(ctx)` against a throwaway context to decide whether it would apply
30
- * or be skipped, prints the plan, and returns WITHOUT calling any step's
31
- * `apply` — nothing on disk changes. The dry-run never mutates the shared
32
- * context the caller would use for a live run; it probes a fresh `{}` so
33
- * `detect` side effects (there should be none) cannot leak into a later live
34
- * pass.
35
- *
36
- * ## Injectable seams (used by lib/cli/__tests__/migrate.test.js)
37
- *
38
- * - `argv` — subcommand args (after `mandrel migrate`)
39
- * - `runMigrations` — version-keyed migration runner (lib/migrations)
40
- * - `registry` — step registry; defaults to the module `migrations`
41
- * array, injected by tests with fixture steps so the
42
- * dry-run plan and the live pass are both exercisable
43
- * without a real contract step existing
44
- * - `ctx` — opaque context threaded to each step's detect/apply
45
- * - `write`/`writeErr` — stdout / stderr sinks
46
- * - `exit` — process.exit replacement
47
- *
48
- * Security (security-baseline § 5 — Data Leakage & Logging): logs only version
49
- * strings and step descriptions. No tokens, credentials, or env values are
50
- * read or logged, and no shell-string interpolation occurs (the runner is a
51
- * pure in-process call; transport is owned by the steps themselves).
3
+ * `mandrel migrate --from <v> --to <v> [--dry-run]`: run (or preview) the
4
+ * version-keyed migrations outside an `update` cycle, e.g. to re-run one a
5
+ * prior upgrade missed. Both bounds are required.
52
6
  */
53
7
 
54
8
  import {
@@ -58,8 +12,6 @@ import {
58
12
  } from '../migrations/index.js';
59
13
 
60
14
  /**
61
- * Parse a single `--flag value` / `--flag=value` option out of argv.
62
- *
63
15
  * @param {string[]} argv
64
16
  * @param {string} flag The long flag name including leading dashes (e.g. `--from`).
65
17
  * @returns {string | undefined} The option value, or undefined when absent.
@@ -78,9 +30,6 @@ function parseOption(argv, flag) {
78
30
  }
79
31
 
80
32
  /**
81
- * The envelope shape every `runMigrate` exit returns. Centralised so the four
82
- * exits cannot drift in which fields they populate.
83
- *
84
33
  * @param {object} fields
85
34
  * @returns {object}
86
35
  */
@@ -115,10 +64,8 @@ function reportUsageError({ writeErr, exit }) {
115
64
  }
116
65
 
117
66
  /**
118
- * Report the in-range steps and whether each WOULD apply or be skipped,
119
- * probing a throwaway context so no step's `apply` runs and nothing on disk
120
- * changes. The ordering comes from `selectStepsInRange`, the same selector the
121
- * live run uses, so the preview cannot disagree with what would happen.
67
+ * Probes `detect` against a throwaway context and never calls `apply`. Uses
68
+ * the live run's selector, so the preview cannot disagree with it.
122
69
  *
123
70
  * @param {{
124
71
  * registry: Array<object>,
@@ -172,8 +119,6 @@ function reportApplied({ applied, fromVersion, toVersion, write }) {
172
119
  }
173
120
 
174
121
  /**
175
- * Run the standalone `mandrel migrate` command.
176
- *
177
122
  * @param {{
178
123
  * argv?: string[],
179
124
  * runMigrations?: typeof defaultRunMigrations,
@@ -235,8 +180,6 @@ export function runMigrate({
235
180
  });
236
181
  }
237
182
 
238
- // The runner owns ordering, range filtering, idempotency, and the per-step
239
- // `migrated …` log line.
240
183
  const { applied, skipped } = runMigrations({
241
184
  fromVersion,
242
185
  toVersion,
@@ -256,8 +199,6 @@ export function runMigrate({
256
199
  }
257
200
 
258
201
  /**
259
- * Default export consumed by `bin/mandrel.js`.
260
- *
261
202
  * @param {string[]} argv - Subcommand arguments (after `mandrel migrate`).
262
203
  * @returns {Promise<void>}
263
204
  */