mandrel 2.60.0 → 2.61.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 (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,27 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * sync-agentrc.js — default-aware `.agentrc.json` reconciliation (Story #1995).
5
- *
6
- * Replaces the manual procedure formerly described in
7
- * `.agents/workflows/helpers/mandrel-sync-config.md`. Invoked by
8
- * `/mandrel-update` Step 3 after the package upgrade re-materializes `.agents/`.
9
- *
10
- * Contract:
11
- * - Validates the project config against the framework schema. On
12
- * failure, prints diagnostics and exits 1.
13
- * - Never auto-fills optional keys from `.agents/docs/agentrc-reference.json`.
14
- * The runtime layers framework defaults at read time, so an absent
15
- * key resolves to the framework default without being written.
16
- * - For every project leaf whose value equals the framework default,
17
- * prints an informational `[REDUNDANT]` advisory. The project file
18
- * is never modified.
19
- *
20
- * Exit codes:
21
- * 0 — Config is valid (advisories may still appear).
22
- * 1 — Config is missing, malformed, or fails schema validation.
23
- *
24
- * The flag contract lives in `USAGE` below — `--help` is the one home for it.
4
+ * Validate `.agentrc.json` and flag leaves that restate a framework default.
5
+ * Never writes the file: defaults are layered at read time, so absent keys
6
+ * need no filling. Flags and exit codes live in `USAGE`.
25
7
  */
26
8
 
27
9
  import { fileURLToPath } from 'node:url';
@@ -1,34 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Projects .agents/agents/ (and .agents/local/agents/ when present) into a flat
5
- * `.claude/agents/` tree so Claude Code exposes each role definition as a
6
- * role-scoped sub-agent (`subagent_type: <name>`). Exact sibling of
7
- * `sync-claude-commands.js` — same header, same local-shadow policy, same
8
- * orphan-reap, same prune-exempt handling for the consumer-authored
9
- * `.agents/local/agents/` source. Two source directories are enumerated in
10
- * order:
11
- *
12
- * 1. PAYLOAD_SRC — `.agents/agents/` (the installed Mandrel payload)
13
- * 2. LOCAL_SRC — `.agents/local/agents/` (consumer-authored, prune-exempt)
14
- *
15
- * The payload directory wins on basename collision: if both sources supply
16
- * `foo.md`, the payload copy is projected and the local copy is ignored with a
17
- * `shadowed` warning. Because both sources are unioned into `sourceSet`, local
18
- * agent defs are also protected from the orphan-reap — they survive
19
- * `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
20
- *
21
- * Only top-level `.md` files project (`.claude/agents/<name>.md`). Unlike the
22
- * commands sync there is no `loops/` namespace and no plugin tree to reap — the
23
- * agent surface is flat.
24
- *
25
- * A `.claude/agents/<name>.md` runs on its **own** system prompt — it does NOT
26
- * inherit the `CLAUDE.md` @-import closure — so a spawn routed to a role agent
27
- * stops re-paying the always-loaded context (issue #4478). The role defs
28
- * @-import `security-baseline.md` so the inviolable security MUSTs stay
29
- * single-sourced.
30
- *
31
- * Usage: node .agents/scripts/sync-claude-agents.js
4
+ * Project `.agents/agents/` and `.agents/local/agents/` into a flat
5
+ * `.claude/agents/` tree — the sibling of `sync-claude-commands.js`, with the
6
+ * same payload-wins shadowing and orphan-reap. A role agent runs on its own
7
+ * system prompt (no `CLAUDE.md` closure), which is the point of routing to it.
32
8
  */
33
9
 
34
10
  // cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
@@ -38,21 +14,10 @@ import path from 'node:path';
38
14
  import { applyHeader } from './lib/command-header.js';
39
15
  import { Logger } from './lib/Logger.js';
40
16
 
41
- // Resolve the project root from the invocation cwd — the consumer project where
42
- // `.agents/` is materialized and where Claude Code loads `.claude/agents/`.
43
- // It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
44
- // runs from `node_modules/mandrel/.agents/scripts/`, so that climb lands on the
45
- // package dir and the defs would be written *inside node_modules* rather than
46
- // the consumer. Every real invocation runs with cwd at the project root
47
- // (`npm run sync:agents`, the prepare hook). Tests drive fixture trees via the
48
- // SYNC_CLAUDE_AGENTS_SRC/DEST overrides below.
17
+ // cwd, never `__dirname/../..`, which lands inside node_modules when installed.
49
18
  const PROJECT_ROOT = process.cwd();
50
19
 
51
- // Env-var overrides exist so the sync logic can be exercised against a fixture
52
- // agents tree in isolation. When unset, behaviour is unchanged — the script
53
- // defaults to the real agents / .claude/agents directories. SYNC_CLAUDE_AGENTS_SRC
54
- // overrides the PAYLOAD source only; LOCAL_SRC is always derived from the project
55
- // root so fixture tests can isolate the payload source.
20
+ // Test overrides; SYNC_CLAUDE_AGENTS_SRC replaces the payload source only.
56
21
  const PAYLOAD_SRC =
57
22
  process.env.SYNC_CLAUDE_AGENTS_SRC ??
58
23
  path.join(PROJECT_ROOT, '.agents', 'agents');
@@ -69,8 +34,6 @@ export const LOCAL_HEADER =
69
34
  '<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
70
35
 
71
36
  /**
72
- * Return true when the given directory path exists and is accessible.
73
- *
74
37
  * @param {string} dir
75
38
  * @returns {boolean}
76
39
  */
@@ -84,11 +47,9 @@ function dirExists(dir) {
84
47
 
85
48
  fs.mkdirSync(DEST_DIR, { recursive: true });
86
49
 
87
- // Top-level .md files project flat. Subdirectories are skipped.
88
50
  const isTopLevelAgent = (entry) => entry.isFile() && entry.name.endsWith('.md');
89
51
 
90
- // Enumerate sources: payload first, then local (if it exists). Payload wins on
91
- // basename collision — a consumer must not silently shadow a core role def.
52
+ // Payload first, so it wins a collision.
92
53
  const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
93
54
 
94
55
  /** @type {Array<{dir: string, name: string}>} */
@@ -99,7 +60,6 @@ const entries = SRC_DIRS.flatMap((dir) =>
99
60
  .map((e) => ({ dir, name: e.name })),
100
61
  );
101
62
 
102
- // Collision policy: payload wins, warn on a shadowed local file.
103
63
  const byName = new Map();
104
64
  for (const e of entries) {
105
65
  if (byName.has(e.name)) {
@@ -109,13 +69,10 @@ for (const e of entries) {
109
69
  byName.set(e.name, e);
110
70
  }
111
71
 
112
- // sourceSet drives the orphan-reap: any existing agent def not in this set is
113
- // removed.
72
+ // Any existing agent def not in this set is reaped.
114
73
  const sourceSet = new Set(byName.keys());
115
74
 
116
75
  /**
117
- * List the `.md` agent defs currently on disk in the destination.
118
- *
119
76
  * @returns {string[]}
120
77
  */
121
78
  function listExistingAgents() {
@@ -133,9 +90,7 @@ for (const name of listExistingAgents()) {
133
90
  }
134
91
  }
135
92
 
136
- // Copy each role def, injecting the auto-generated header after any leading
137
- // frontmatter (so the `---` block stays on line 1 and Claude Code parses the
138
- // agent's name/description). Use a distinct header comment for local-origin files.
93
+ // The header goes after any frontmatter, so `---` stays on line 1.
139
94
  let synced = 0;
140
95
  const resolvedEntries = Array.from(byName.values());
141
96
  await Promise.all(
@@ -146,7 +101,6 @@ await Promise.all(
146
101
  const dest = path.join(DEST_DIR, name);
147
102
  const target = applyHeader(content, header);
148
103
 
149
- // Skip write if content is already identical (avoid noisy git diffs).
150
104
  try {
151
105
  const existingContent = await fs.promises.readFile(dest, 'utf8');
152
106
  if (existingContent === target) return;
@@ -1,46 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Projects .agents/workflows/ (and .agents/local/workflows/ when present) into
5
- * a flat `.claude/commands/` tree so Claude Code exposes each workflow as a
6
- * bare `/<name>` slash command. Two source directories are enumerated in order:
7
- *
8
- * 1. PAYLOAD_SRC — `.agents/workflows/` (the installed Mandrel payload)
9
- * 2. LOCAL_SRC — `.agents/local/workflows/` (consumer-authored, prune-exempt)
10
- *
11
- * The payload directory wins on basename collision: if both sources supply
12
- * `foo.md`, the payload copy is projected and the local copy is ignored with a
13
- * `shadowed` warning. Because both sources are unioned into `sourceSet`, local
14
- * commands are also protected from the orphan-reap — they survive
15
- * `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
16
- *
17
- * Flat projection (reverts the #3576 plugin cutover): the plugin command tree
18
- * (`.claude/plugins/mandrel/`) and the repo-local marketplace
19
- * (`.claude/.claude-plugin/marketplace.json`) are NOT written, because the
20
- * plugin system is unavailable in some Claude Code environments (`/plugin` not
21
- * present), which left the namespaced `/mandrel:<name>` commands unreachable.
22
- * Flat `.claude/commands/*.md` is the surface that loads across every
23
- * environment (CLI, IDE, GUI, web, SDK). On a machine that previously synced
24
- * the plugin tree, this script reaps it on the next run (see reapPluginTree).
25
- *
26
- * Top-level .md files project flat (`/<name>`). The
27
- * `.agents/workflows/helpers/` subdirectory holds path-included modules
28
- * (e.g. epic-code-review, epic-retro) that parent workflows read by
29
- * relative path — they are intentionally **not** exposed as commands, so
30
- * helpers/ is skipped.
31
- *
32
- * The `.agents/workflows/loops/` subdirectory is the **one** exception to
33
- * the skip-subdirectories rule (Story #4289, Epic #4284). Each loop unit
34
- * there projects to `.claude/commands/loops/<name>.md`, preserving the
35
- * subpath so Claude Code namespaces it as `/loops:<name>` (matching Claude
36
- * Code's subdirectory-command namespacing). Hosts that flatten
37
- * subdirectory commands surface the same file as the flat fallback
38
- * `/loops-<name>` (i.e. `loops-<name>` in the command tree) — the
39
- * projection writes the namespaced path; the flat form is the documented
40
- * host-side fallback, not a second on-disk copy. No subdirectory other
41
- * than `loops/` is recursed.
42
- *
43
- * Usage: node .agents/scripts/sync-claude-commands.js
4
+ * Project `.agents/workflows/` and `.agents/local/workflows/` into a flat
5
+ * `.claude/commands/` tree (one `/<name>` per top-level workflow). The payload
6
+ * wins a name collision; both sources feed the orphan-reap set, so local
7
+ * commands survive re-syncs. Flat commands, not a plugin tree, because the
8
+ * plugin system is unavailable in some Claude Code hosts. `helpers/` is not
9
+ * projected; `loops/` is the one recursed subdirectory (`/loops:<name>`).
44
10
  */
45
11
 
46
12
  // cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
@@ -50,27 +16,11 @@ import path from 'node:path';
50
16
  import { applyHeader, isCommandExcluded } from './lib/command-header.js';
51
17
  import { Logger } from './lib/Logger.js';
52
18
 
53
- // Resolve the project root from the invocation cwd — the consumer project where
54
- // `.agents/` is materialized and where Claude Code loads `.claude/commands/`.
55
- // It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
56
- // runs from `node_modules/mandrel/.agents/scripts/`, so that climb
57
- // lands on the package dir and the commands would be written *inside
58
- // node_modules* rather than the consumer — leaving `/<name>` commands
59
- // unloadable and the `commands-in-sync` doctor check (which resolves the same
60
- // consumer root via cwd — Story #3588) reporting "N not synced". Every real
61
- // invocation runs with cwd at the project root: `npm run sync:commands`, the
62
- // UserPromptSubmit hook, and `mandrel sync-commands` (which inherits the
63
- // caller's cwd). Tests drive fixture trees via the SYNC_CLAUDE_COMMANDS_SRC/DEST
64
- // overrides below.
19
+ // The root is cwd, never `__dirname/../..`: installed under node_modules that
20
+ // climb lands on the package dir and would write commands inside it.
65
21
  const PROJECT_ROOT = process.cwd();
66
22
 
67
- // Env-var overrides exist so the sync logic can be exercised against a
68
- // fixture workflow tree in isolation (regression test for the Epic #1185
69
- // frontmatter pass-through contract). When unset, behaviour is unchanged
70
- // — the script defaults to the real workflows / commands directories.
71
- // SYNC_CLAUDE_COMMANDS_SRC overrides the PAYLOAD source only; the LOCAL_SRC
72
- // is always derived from the project root so fixture tests can isolate the
73
- // payload source while still allowing LOCAL_SRC to be present if needed.
23
+ // Test overrides; SYNC_CLAUDE_COMMANDS_SRC replaces the payload source only.
74
24
  const PAYLOAD_SRC =
75
25
  process.env.SYNC_CLAUDE_COMMANDS_SRC ??
76
26
  path.join(PROJECT_ROOT, '.agents', 'workflows');
@@ -87,8 +37,6 @@ export const LOCAL_HEADER =
87
37
  '<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/workflows/ -->\n<!-- Re-run: npm run sync:commands -->\n\n';
88
38
 
89
39
  /**
90
- * Return true when the given directory path exists and is accessible.
91
- *
92
40
  * @param {string} dir
93
41
  * @returns {boolean}
94
42
  */
@@ -101,14 +49,8 @@ function dirExists(dir) {
101
49
  }
102
50
 
103
51
  /**
104
- * Reap the generated plugin projection (the #3576 surface) so the namespaced
105
- * `/mandrel:<name>` commands and the repo-local marketplace stop shadowing the
106
- * flat `/<name>` commands. This is the cutover-back step on existing machines:
107
- * the plugin tree is no longer written, but a developer who synced under #3576
108
- * still has it on disk. Removing `.claude/plugins/mandrel/` and the marketplace
109
- * listing is idempotent and never blocks the flat sync.
110
- *
111
- * Skipped when SYNC_CLAUDE_COMMANDS_DEST is set (fixture runs own their tree).
52
+ * Remove any on-disk plugin projection and marketplace listing, which would
53
+ * shadow the flat commands. Idempotent; skipped for fixture runs.
112
54
  *
113
55
  * @returns {void}
114
56
  */
@@ -128,7 +70,6 @@ function reapPluginTree() {
128
70
  Logger.warn(` skip reap ${target}: ${err.message}`);
129
71
  }
130
72
  }
131
- // Remove the now-empty .claude-plugin/ dir (ignore if absent or non-empty).
132
73
  try {
133
74
  fs.rmdirSync(path.join(PROJECT_ROOT, '.claude', '.claude-plugin'));
134
75
  } catch {
@@ -139,22 +80,14 @@ function reapPluginTree() {
139
80
  reapPluginTree();
140
81
  fs.mkdirSync(DEST_DIR, { recursive: true });
141
82
 
142
- // The only namespaced subdirectory we recurse. Every other subdirectory
143
- // (notably helpers/) is skipped — those hold path-included modules, not
144
- // slash commands. Loop units under workflows/loops/ project into
145
- // .claude/commands/loops/ so Claude Code namespaces them as /loops:<name>
146
- // (Story #4289).
83
+ // The only recursed subdirectory; helpers/ holds path-included modules.
147
84
  const LOOPS_NS = 'loops';
148
85
 
149
- // Top-level .md files project flat. Subdirectories are skipped here and the
150
- // only one re-introduced is loops/ (handled by enumerateLoopUnits below).
151
86
  const isTopLevelWorkflow = (entry) =>
152
87
  entry.isFile() && entry.name.endsWith('.md');
153
88
 
154
89
  /**
155
- * `README.md` (any case) under `loops/` is namespace documentation, not a
156
- * loop unit — it carries no `loop:` frontmatter and must not project as a
157
- * `/loops:README` command. Exclude it from the loop-unit enumeration.
90
+ * `loops/README.md` is documentation, not a command.
158
91
  *
159
92
  * @param {import('node:fs').Dirent} entry
160
93
  * @returns {boolean}
@@ -163,13 +96,9 @@ const isLoopUnit = (entry) =>
163
96
  isTopLevelWorkflow(entry) && entry.name.toLowerCase() !== 'readme.md';
164
97
 
165
98
  /**
166
- * Enumerate the loop units under a source dir's `loops/` subdirectory.
167
- * Returns entries keyed by the namespaced relative path
168
- * (`loops/<name>.md`) so they never collide with a flat top-level command
169
- * of the same basename and so the reap can track them distinctly. The
170
- * directory's `README.md` is skipped — it is documentation, not a command.
99
+ * Keyed by `loops/<name>.md` so a unit never collides with a flat command.
171
100
  *
172
- * @param {string} dir — a workflows source root (payload or local).
101
+ * @param {string} dir A workflows source root.
173
102
  * @returns {Array<{dir: string, name: string, rel: string}>}
174
103
  */
175
104
  function enumerateLoopUnits(dir) {
@@ -185,10 +114,7 @@ function enumerateLoopUnits(dir) {
185
114
  }));
186
115
  }
187
116
 
188
- // Enumerate sources: payload first, then local (if it exists). Payload wins
189
- // on relative-path collision — a consumer must not silently shadow a core
190
- // command. Each entry carries its destination-relative path (`rel`): a bare
191
- // basename for flat top-level commands, `loops/<name>.md` for loop units.
117
+ // Payload first, so it wins a collision.
192
118
  const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
193
119
 
194
120
  /** @type {Array<{dir: string, name: string, rel: string}>} */
@@ -200,12 +126,7 @@ const entries = SRC_DIRS.flatMap((dir) => [
200
126
  ...enumerateLoopUnits(dir),
201
127
  ]);
202
128
 
203
- // Collision policy: payload wins, warn on a shadowed local file. Keyed by the
204
- // destination-relative path so a flat `foo.md` and a `loops/foo.md` are
205
- // distinct entries. A workflow whose frontmatter carries `command: false`
206
- // (#4482 — dual-use audit lens files with a host-native standalone
207
- // equivalent) is excluded from projection entirely: it never enters
208
- // `sourceSet`, so any previously projected copy is reaped below.
129
+ // A `command: false` workflow never enters `sourceSet`, so a stale copy is reaped.
209
130
  const byRel = new Map();
210
131
  for (const e of entries) {
211
132
  if (byRel.has(e.rel)) {
@@ -219,15 +140,10 @@ for (const e of entries) {
219
140
  byRel.set(e.rel, e);
220
141
  }
221
142
 
222
- // sourceSet drives the orphan-reap: any existing command not in this set is
223
- // removed. Keyed by destination-relative path so loop units are reaped from
224
- // the loops/ namespace and flat commands from the root.
143
+ // Any existing command not in this set is reaped.
225
144
  const sourceSet = new Set(byRel.keys());
226
145
 
227
146
  /**
228
- * List the destination-relative paths of every projected command currently
229
- * on disk: flat `*.md` at the root plus `loops/*.md` in the namespace.
230
- *
231
147
  * @returns {string[]}
232
148
  */
233
149
  function listExistingCommands() {
@@ -252,11 +168,7 @@ for (const rel of listExistingCommands()) {
252
168
  }
253
169
  }
254
170
 
255
- // Copy each workflow, injecting the auto-generated header after any leading
256
- // frontmatter (so the `---` block stays on line 1 and Claude Code parses the
257
- // command description). Use a distinct header comment for local-origin files.
258
- // Parallelised so the ~30-file sync doesn't serialise on per-file fs latency
259
- // (noticeable on Windows where each syscall pays a larger fixed cost).
171
+ // The header goes after any frontmatter, so `---` stays on line 1.
260
172
  let synced = 0;
261
173
  const resolvedEntries = Array.from(byRel.values());
262
174
  await Promise.all(
@@ -267,11 +179,9 @@ await Promise.all(
267
179
  const dest = path.join(DEST_DIR, rel);
268
180
  const target = applyHeader(content, header);
269
181
 
270
- // Ensure the namespace subdirectory exists before writing a loop unit.
271
182
  await fs.promises.mkdir(path.dirname(dest), { recursive: true });
272
183
 
273
- // Skip write if content is already identical (avoid noisy git diffs).
274
- // Use try/catch over existsSync+readFile so we only pay one syscall.
184
+ // Skip identical content to avoid noisy git diffs.
275
185
  try {
276
186
  const existingContent = await fs.promises.readFile(dest, 'utf8');
277
187
  if (existingContent === target) return;
@@ -2,35 +2,9 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * test-wrapper.js — npm-test preflight gate.
6
- *
7
- * Story #1289 wires the self-healing checks registry in front of
8
- * `npm test` so the suite refuses to start in a known-bad state (e.g.
9
- * core.bare flipped on the main checkout, missing `.env` / `.mcp.json`
10
- * bootstrap files, etc.). The wrapper runs
11
- * `runChecks({ scope: 'npm-test', autoFix: true })` against the assembled
12
- * state probe; on any surviving blocker it prints a `id · summary ·
13
- * fixCommand` table and exits with code 2 (the project-wide "preflight
14
- * refused" reservation).
15
- *
16
- * On a clean preflight npm continues to `.agents/scripts/run-tests.js`, which
17
- * execs the underlying Node test runner and cleans test-reserved temp
18
- * artefacts afterward. This wrapper itself adds no top-level npm dependencies.
19
- *
20
- * Wiring: `package.json` points `pretest` at this script. The `test`
21
- * script remains the node --test invocation so `npm test` still picks up
22
- * `pretest` automatically per npm lifecycle rules. A failed pretest aborts
23
- * the lifecycle without invoking the test runner — exit code 2 propagates
24
- * out through npm.
25
- *
26
- * Bypass: set `SKIP_PREFLIGHT=1` to skip the gate entirely (used by the
27
- * `coverage` script which manages its own preflight separately, and by
28
- * any debugging session that needs the suite to run despite a known
29
- * blocker the operator is iterating on).
30
- *
31
- * Usage:
32
- * node .agents/scripts/test-wrapper.js # full preflight + test
33
- * SKIP_PREFLIGHT=1 node .agents/scripts/test-wrapper.js # skip gate
5
+ * `pretest` preflight: runs the self-healing checks (scope `npm-test`) so the
6
+ * suite refuses to start in a known-bad state; a surviving blocker exits 2,
7
+ * which aborts the npm lifecycle. `SKIP_PREFLIGHT=1` bypasses it.
34
8
  */
35
9
 
36
10
  import { runAsCli } from './lib/cli-utils.js';
@@ -40,7 +14,6 @@ import {
40
14
  runPreflight,
41
15
  } from './lib/preflight-runner.js';
42
16
 
43
- /** Default Logger adapter — same shape preflight-runner uses. */
44
17
  const DEFAULT_LOGGER = {
45
18
  info: (msg) => Logger.info(msg),
46
19
  warn: (msg) => Logger.warn(msg),
@@ -48,17 +21,11 @@ const DEFAULT_LOGGER = {
48
21
  };
49
22
 
50
23
  /**
51
- * Run the npm-test preflight gate. Exported so unit tests can drive it
52
- * directly with an inline registry, without actually spawning the test
53
- * runner. Returns `{ status: 'ok' | 'blocked' }` plus the findings/fixed
54
- * arrays from the runner.
55
- *
56
24
  * @param {object} [opts]
57
25
  * @param {string} [opts.cwd=process.cwd()]
58
- * @param {object} [opts.probes] Test-only probe injection.
59
- * @param {object} [opts.registry] Test-only inline registry — bypasses
60
- * `loadRegistry()`.
61
- * @param {string} [opts.dir] Test-only fixture directory.
26
+ * @param {object} [opts.probes] Test-only.
27
+ * @param {object} [opts.registry] Test-only.
28
+ * @param {string} [opts.dir] Test-only.
62
29
  * @param {{ info?: Function, warn?: Function, error?: Function }} [opts.logger]
63
30
  * @returns {Promise<{ status: 'ok' | 'blocked', findings: Array, fixed: Array }>}
64
31
  */
@@ -89,7 +56,6 @@ export async function runTestWrapperPreflight({
89
56
  runAsCli(
90
57
  import.meta.url,
91
58
  async () => {
92
- // Operator bypass for iterative debugging — see the file header.
93
59
  if (process.env.SKIP_PREFLIGHT === '1') {
94
60
  Logger.warn(
95
61
  '[npm-test] SKIP_PREFLIGHT=1 — bypassing preflight checks (debugging mode).',
@@ -98,9 +64,6 @@ runAsCli(
98
64
  }
99
65
  const result = await runTestWrapperPreflight();
100
66
  if (result.status === 'blocked') {
101
- // The wrapper never spawns the test runner on a blocked preflight.
102
- // Exit code 2 propagates out through `npm run pretest` and short-
103
- // circuits the `npm test` lifecycle before the test command runs.
104
67
  process.exit(PREFLIGHT_REFUSED_EXIT_CODE);
105
68
  }
106
69
  },
@@ -1,20 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Refresh `baselines/coverage.json` from the most recent
4
- * `coverage/coverage-final.json`. Run this when you intentionally add,
5
- * remove, or change scope of `.agents/scripts/**` files and the
6
- * resulting per-file coverage shifts are expected.
7
- *
8
- * Story #3658 (Epic #2173): this CLI is now a thin wrapper around
9
- * `refreshBaseline({ kind: 'coverage' })` from
10
- * `.agents/scripts/lib/baselines/refresh-service.js`. All scoring, scope
11
- * resolution, envelope assembly, and persistence flows through the unified
12
- * service.
13
- *
14
- * The script does NOT run the test suite itself — invoke
15
- * `npm run test:coverage` first (or rely on its prior run-on-disk
16
- * artifact). This keeps the refresh idempotent and lets operators
17
- * inspect coverage output before locking it in.
3
+ * Refresh the coverage baseline from the `coverage-final.json` on disk via
4
+ * `refreshBaseline({ kind: 'coverage' })`. Never runs the suite, so the
5
+ * refresh is idempotent and the output can be inspected first.
18
6
  */
19
7
 
20
8
  import { createRequire } from 'node:module';
@@ -34,12 +22,7 @@ import {
34
22
  } from './lib/coverage-baseline.js';
35
23
  import { Logger } from './lib/Logger.js';
36
24
 
37
- /**
38
- * Usage block for `--help`. This CLI *writes* on invocation, so the help
39
- * branch must short-circuit before `main` runs rather than inside it —
40
- * `runAsCli` answers help first, which makes "a usage probe never mutates a
41
- * baseline" structural instead of a check `main` has to remember.
42
- */
25
+ /** `runAsCli` answers `--help` before `main`, so a usage probe never writes. */
43
26
  const USAGE = {
44
27
  invocation:
45
28
  'node .agents/scripts/update-coverage-baseline.js [--full-scope | --diff-scope <ref>]',
@@ -84,7 +67,7 @@ function main() {
84
67
  const refreshOpts = {
85
68
  kind: 'coverage',
86
69
  writePath: absBaselinePath,
87
- epsilon: getBaselineEpsilon('coverage', null),
70
+ epsilon: getBaselineEpsilon('coverage'),
88
71
  scorer: buildCoverageUpdaterScorer(cwd, {
89
72
  readCoverage: readCoverageFinal,
90
73
  loadScope: loadC8Scope,
@@ -1,6 +1,4 @@
1
- // Fail-fast if the framework's runtime deps are not installed — must be the
2
- // first import so the check runs before any third-party-importing sibling
3
- // module is evaluated (Story #3432).
1
+ // Must be the first import: fails fast before any third-party import loads.
4
2
  import './lib/runtime-deps/ensure-installed.js';
5
3
  import {
6
4
  buildCrapUpdaterScorer,
@@ -24,34 +22,13 @@ import {
24
22
  import { Logger } from './lib/Logger.js';
25
23
 
26
24
  /**
27
- * CLI: scan → score → save the CRAP baseline.
28
- *
29
- * Story #3658 (Epic #2173): this CLI is now a thin wrapper around
30
- * `refreshBaseline({ kind: 'crap' })` from
31
- * `.agents/scripts/lib/baselines/refresh-service.js`. All scoring, scope
32
- * resolution, envelope assembly, and persistence flows through the unified
33
- * service.
34
- *
35
- * Writes the canonical CRAP baseline at the path resolved from
36
- * `delivery.quality.baselines.crap.path` (default `baselines/crap.json`),
37
- * or the path supplied via `--baseline <path>`. Output is a deterministic,
38
- * kernel-stamped envelope. Files without coverage entries are skipped (not
39
- * scored as 0%) when `requireCoverage: true` — their count and names are
40
- * logged so the operator can tell the difference between "unscorable" and
41
- * "safe zero".
42
- *
43
- * Exits non-zero only when the scanner itself crashes. An empty result (no
44
- * coverage at all, no scored methods) still writes an envelope with `rows: []`
45
- * so downstream `check-crap` can tell "intentional empty baseline" apart from
46
- * "no baseline yet".
25
+ * Refresh the CRAP baseline via `refreshBaseline({ kind: 'crap' })`. Under
26
+ * `requireCoverage` an uncovered file is skipped and logged, never scored as
27
+ * 0%. An empty result still writes `rows: []`, so an intentional empty
28
+ * baseline differs from a missing one.
47
29
  */
48
30
 
49
- /**
50
- * Usage block for `--help` (Story #4872). This CLI *writes* on invocation, so
51
- * the help branch must short-circuit before `main` runs rather than inside it —
52
- * `runAsCli` answers help first, which makes "a usage probe never mutates a
53
- * baseline" structural instead of a check `main` has to remember.
54
- */
31
+ /** `runAsCli` answers `--help` before `main`, so a usage probe never writes. */
55
32
  const USAGE = {
56
33
  invocation:
57
34
  'node .agents/scripts/update-crap-baseline.js [--baseline <path>] [--coverage <path>] [--full-scope | --diff-scope <ref>]',
@@ -96,7 +73,7 @@ async function main() {
96
73
  const refreshOpts = {
97
74
  kind: 'crap',
98
75
  writePath: options.absBaselinePath,
99
- epsilon: getBaselineEpsilon('crap', config),
76
+ epsilon: getBaselineEpsilon('crap'),
100
77
  scorer: buildCrapUpdaterScorer(options, { loadCoverage }),
101
78
  };
102
79
  // No flag -> scopeFiles=null + fullScope=false -> the service derives the