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
@@ -1,197 +0,0 @@
1
- #!/usr/bin/env node
2
- // cli-opt-out: top-level CLI driver invoked via npm run test:coverage; spawns child processes rather than parsing argv, so runAsCli() does not apply.
3
- /**
4
- * Cross-platform driver for `npm run test:coverage`.
5
- *
6
- * Why this exists: setting `NODE_V8_COVERAGE` directly in a package.json
7
- * script string (`NODE_V8_COVERAGE=... node ...`) is bash-only — Windows
8
- * cmd.exe (npm's default script-shell on Windows) treats it as a literal
9
- * argument and node never sees the env var. Wrapping the run in this
10
- * Node script keeps the env injection portable.
11
- *
12
- * Pipeline:
13
- * 0. Run the full tier's preflight (`runTierPreflight`). Story #4936: this
14
- * used to be a `pretest:coverage` npm script that CI had to name
15
- * explicitly, because `.npmrc`'s `ignore-scripts=true` (CWE-1357
16
- * defence, which stays) suppresses every `pre*` hook. The runner
17
- * invokes it now, so it executes however the coverage run is started.
18
- * 1. Run the test suite under `NODE_V8_COVERAGE` so each worker writes
19
- * raw V8 dumps under `coverage/tmp/`. The suite targets are the
20
- * shared `FULL_TIER_GLOBS` from `lib/test-tiers.js` — the same set
21
- * `run-tests.js` walks — so the measured surface and `npm test`'s
22
- * surface are the same set by construction.
23
- * 2. `c8 report` post-processes the dumps into `coverage/coverage-final.json`
24
- * plus the printed text table. Include/exclude scope from `.c8rc.cjs`
25
- * is passed explicitly because `c8 report` does not auto-load the
26
- * config file.
27
- * 3. `check-baselines.js --gate coverage` compares the per-file
28
- * lines/branches/functions percentages in `coverage-final.json`
29
- * against the recorded floors in `baselines/coverage.json` and
30
- * fails on any regression. Update the baseline with
31
- * `npm run coverage:update` when you intentionally change scope.
32
- *
33
- * The previous shape of this script wrapped tests in `c8 <cmd>`. A
34
- * one-off A/B benchmark (now retired) showed the NODE_V8_COVERAGE +
35
- * `c8 report` path is ~19% faster end-to-end on a Windows dev host
36
- * while producing an identical `coverage-final.json` artifact for the
37
- * CRAP gate.
38
- *
39
- * Test-runner flags: the suite spawn reuses `TEST_RUNNER_FLAGS` from
40
- * `lib/test-runner-contract.js` — the single source of truth for the
41
- * `node --test` flag set, including the host-derived
42
- * `--test-concurrency` value clamped to `[TEST_CONCURRENCY_MIN,
43
- * TEST_CONCURRENCY_MAX]`. Story #4936: sharing the whole flag set (not
44
- * just the concurrency number) is what stops this runner and
45
- * `run-tests.js` disagreeing about whether a test can execute at all —
46
- * `--experimental-test-module-mocks` decides whether `t.mock.module`
47
- * works, and this is the *required* CI job.
48
- */
49
-
50
- import { spawnSync } from 'node:child_process';
51
- import { mkdirSync, rmSync } from 'node:fs';
52
- import { createRequire } from 'node:module';
53
- import path from 'node:path';
54
- import { fileURLToPath } from 'node:url';
55
-
56
- import { cleanupRepoTestTempArtifacts } from './cleanup-repo-test-temp.js';
57
- import { C8_CLI } from './lib/c8-cli-path.js';
58
- import { buildWebhookSafeTestEnv } from './lib/test-env.js';
59
- import {
60
- runTierPreflight,
61
- TEST_RUNNER_FLAGS,
62
- } from './lib/test-runner-contract.js';
63
- import { FULL_TIER_GLOBS } from './lib/test-tiers.js';
64
-
65
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
66
- const ROOT = path.resolve(__dirname, '..', '..');
67
- const require = createRequire(import.meta.url);
68
- const C8_CONFIG = require('../../.c8rc.cjs');
69
-
70
- /**
71
- * Build the `node --test` argv for the coverage suite spawn.
72
- *
73
- * Reuses two shared constants so the coverage path cannot drift from
74
- * `run-tests.js`:
75
- *
76
- * - `TEST_RUNNER_FLAGS` — the single source of truth for the host-aware,
77
- * clamped `--test-concurrency` value.
78
- * - `FULL_TIER_GLOBS` — the single source of truth for *which files the
79
- * full tier runs*. Story #4922: this script used to restate
80
- * `tests/**\/*.test.js` on its own, so the 47 colocated `__tests__`
81
- * suites under `lib/` and `.agents/scripts/` executed under `npm test`
82
- * but never under the measuring run — the coverage and CRAP numbers
83
- * were computed over code the coverage run had not executed.
84
- *
85
- * Both parameters are injected in tests so the argv can be asserted without
86
- * touching the OS.
87
- *
88
- * @param {object} [opts]
89
- * @param {readonly string[]} [opts.runnerFlags]
90
- * @param {readonly string[]} [opts.testGlobs]
91
- * @returns {string[]}
92
- */
93
- export function buildCoverageTestArgs({
94
- runnerFlags = TEST_RUNNER_FLAGS,
95
- testGlobs = FULL_TIER_GLOBS,
96
- } = {}) {
97
- return [...runnerFlags, ...testGlobs];
98
- }
99
-
100
- /**
101
- * Execute the coverage pipeline: run the full tier's preflight, run the
102
- * suite under `NODE_V8_COVERAGE`, post-process the dumps with `c8 report`,
103
- * then gate on the coverage baseline. Returns the first non-zero exit code
104
- * across the stages (or the baseline check's status when the prior stages
105
- * pass); a refused preflight short-circuits before anything is spawned or
106
- * removed.
107
- *
108
- * Every collaborator is injected so the pipeline's wiring — above all
109
- * *that the preflight actually runs, and runs first* — is assertable
110
- * without spawning the real suite.
111
- *
112
- * @param {object} [opts]
113
- * @param {typeof spawnSync} [opts.spawn]
114
- * @param {(opts: { tier: string, repoRoot: string }) => number} [opts.preflight]
115
- * @param {(opts: { repoRoot: string }) => unknown} [opts.cleanup]
116
- * @param {string} [opts.repoRoot]
117
- * @returns {number}
118
- */
119
- export function runCoveragePipeline({
120
- spawn = spawnSync,
121
- preflight = runTierPreflight,
122
- cleanup = cleanupRepoTestTempArtifacts,
123
- repoRoot = ROOT,
124
- } = {}) {
125
- const coverageDir = path.join(repoRoot, 'coverage');
126
- const v8Tmp = path.join(coverageDir, 'tmp');
127
-
128
- const preflightStatus = preflight({ tier: 'full', repoRoot });
129
- if (preflightStatus !== 0) return preflightStatus;
130
-
131
- rmSync(coverageDir, { recursive: true, force: true });
132
- mkdirSync(v8Tmp, { recursive: true });
133
-
134
- const testRun = spawn(process.execPath, buildCoverageTestArgs(), {
135
- cwd: repoRoot,
136
- stdio: 'inherit',
137
- // GIT_*-scrubbed: under a husky pre-push from a linked worktree the
138
- // inherited GIT_DIR poisons fixture `git init` runs (#4580).
139
- env: { ...buildWebhookSafeTestEnv(process.env), NODE_V8_COVERAGE: v8Tmp },
140
- });
141
-
142
- cleanup({ repoRoot });
143
-
144
- const includeArgs = (C8_CONFIG.include ?? []).flatMap((p) => [
145
- '--include',
146
- p,
147
- ]);
148
- const excludeArgs = (C8_CONFIG.exclude ?? []).flatMap((p) => [
149
- '--exclude',
150
- p,
151
- ]);
152
-
153
- // `c8 report` does not auto-load `.c8rc.cjs`, so every scope knob it needs
154
- // is forwarded explicitly from the config object — including `all`, which
155
- // is what puts a 0 % row on a source file no test ever loaded (Story
156
- // #4922). Reading it off the config keeps `.c8rc.cjs` the one declaration.
157
- const allArgs = C8_CONFIG.all ? ['--all'] : [];
158
-
159
- const reportRun = spawn(
160
- process.execPath,
161
- [
162
- C8_CLI,
163
- 'report',
164
- '--reporter=json',
165
- '--reporter=text',
166
- ...allArgs,
167
- '--temp-directory',
168
- v8Tmp,
169
- ...includeArgs,
170
- ...excludeArgs,
171
- ],
172
- { cwd: repoRoot, stdio: 'inherit', shell: false },
173
- );
174
-
175
- const checkRun = spawn(
176
- process.execPath,
177
- [
178
- path.join(repoRoot, '.agents', 'scripts', 'check-baselines.js'),
179
- '--gate',
180
- 'coverage',
181
- ],
182
- { cwd: repoRoot, stdio: 'inherit' },
183
- );
184
-
185
- return testRun.status !== 0
186
- ? (testRun.status ?? 1)
187
- : reportRun.status !== 0
188
- ? (reportRun.status ?? 1)
189
- : (checkRun.status ?? 1);
190
- }
191
-
192
- // Run the pipeline only when invoked directly as a CLI; importing the
193
- // module (e.g. from a test asserting the spawn argv) must not spawn the
194
- // real suite.
195
- if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
196
- process.exit(runCoveragePipeline());
197
- }
@@ -1,133 +0,0 @@
1
- #!/usr/bin/env node
2
- // cli-opt-out: top-level-await driver with no main() function — runAsCli wraps an async main, which doesn't apply here.
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * Cross-platform parallel driver for `npm run lint`.
7
- *
8
- * Spawns `biome ci .` and `markdownlint-cli2` concurrently. They share
9
- * no state, so running them in series (the prior `&&` form) wasted
10
- * wall-clock time on every developer save and pre-push. Stdout/stderr
11
- * stream through unchanged so error context survives. Exit code is
12
- * non-zero if either tool fails.
13
- */
14
-
15
- import { spawn } from 'node:child_process';
16
- import process from 'node:process';
17
-
18
- // On Windows, npm/npx shims are `.cmd` batch files. Since Node 20,
19
- // these can only be spawned through a shell (CWE-78 mitigation closing
20
- // CVE-2024-27980), so `shell: true` is mandatory there. POSIX hosts
21
- // can spawn directly.
22
- const useShell = process.platform === 'win32';
23
-
24
- /**
25
- * A Node gate spelled `node .agents/scripts/<script>` — the shape six of the
26
- * eight tasks share. Spelling it once keeps this list readable as what it
27
- * actually is (a fan-out roster) instead of a wall of spawn tuples, and keeps
28
- * adding a gate from costing the module a maintainability regression for the
29
- * boilerplate rather than the behaviour. Mirrors `run-verify.js`'s `gate()`.
30
- *
31
- * Use bare `node` (PATH-resolved) rather than `process.execPath`:
32
- * `process.execPath` on Windows often expands to `C:\Program
33
- * Files\nodejs\node.exe`, and spawn(..., { shell: true }) does not quote the
34
- * executable, so the space breaks invocation.
35
- *
36
- * The path is passed WHOLE rather than assembled from a basename. Composing
37
- * it (`` `.agents/scripts/${script}` ``) reads better and is wrong:
38
- * `check-knip-entries.js` derives which CLIs something actually invokes by
39
- * scanning this file's source text for literal script paths, and four of the
40
- * gates below are invoked from nowhere else. Interpolating the path made them
41
- * invisible to that derivation, so knip called them dead and the ratchet
42
- * offered to record live gates as expected-dead — the Story #5012 trap.
43
- *
44
- * @param {string} name reported in this driver's own error prefix
45
- * @param {string} script repo-relative path, spelled as one literal
46
- * @returns {{ name: string, cmd: string, args: string[] }}
47
- */
48
- const nodeGate = (name, script) => ({ name, cmd: 'node', args: [script] });
49
-
50
- const tasks = [
51
- {
52
- name: 'biome',
53
- cmd: 'npx',
54
- args: ['biome', 'ci', '.'],
55
- },
56
- {
57
- // `docs/**/*.md` sat outside these globs until PR #4970's follow-up,
58
- // so `npm run lint` reported "0 error(s)" while the close-time
59
- // code-review lens — which lints the whole changed surface, not just
60
- // what this driver globs — raised pre-existing `docs/` violations
61
- // against whichever Story happened to touch the file. Keep `docs/`
62
- // here so the two surfaces agree. `docs/CHANGELOG.md` is linted too;
63
- // the generator-owned rules it can never satisfy are exempted by a
64
- // `markdownlint-disable-file` directive in its own header.
65
- name: 'markdownlint',
66
- cmd: 'npx',
67
- args: [
68
- 'markdownlint-cli2',
69
- '.agents/**/*.md',
70
- 'docs/**/*.md',
71
- '*.md',
72
- '!node_modules/**',
73
- '!.worktrees/**',
74
- ],
75
- },
76
- // Lifecycle surface (Story #2227). Enforces (1) no `Promise.all` under
77
- // `.agents/scripts/lib/orchestration/lifecycle/**` — the ledger is
78
- // append-only and a parallel write interleaves records; and (2) the
79
- // auto-merge lockout: the `gh pr merge` literal appears only in
80
- // `single-story-close/phases/auto-merge.js`. Neither has a biome
81
- // equivalent. Story #5024 dropped the third rule (the wildcard-observer
82
- // firewall) with the bus and the `listeners/` directory its predicate
83
- // required.
84
- nodeGate('lifecycle-lint', '.agents/scripts/check-lifecycle-lint.js'),
85
- // Workflow prose surface (Epic #4474 PR5). No workflow may instruct calling
86
- // an exported library function that has no CLI entrypoint — the measured
87
- // shim-writing failure mode the /mandrel-plan collapse killed. See
88
- // check-workflow-cli-lint.js for the paragraph-level heuristic.
89
- nodeGate('workflow-cli-lint', '.agents/scripts/check-workflow-cli-lint.js'),
90
- // Label-vocabulary citations in `.agents/docs/SDLC.md` and
91
- // `.agents/workflows/**/*.md` (Story #2892). Greps inline backtick code
92
- // spans for axis-shaped tokens (`type/epic`, etc.) and asserts only the
93
- // canonical `<axis>::<value>` separator from `lib/label-constants.js`
94
- // appears. Closes the drift gap that let the original `type/epic` typo land.
95
- nodeGate('label-vocabulary', '.agents/scripts/lint-label-vocabulary.js'),
96
- // GitHub Actions job-timeout gate (Story #4936). Fails a `jobs.<id>` that
97
- // sets no `timeout-minutes` (inheriting GitHub's 360-minute default) or sets
98
- // one above the ceiling. A deadlocked Windows job burned 44 minutes of a
99
- // runner and withheld the failing required check's logs for the whole time.
100
- nodeGate('workflow-timeouts', '.agents/scripts/check-workflow-timeouts.js'),
101
- // Architecture cycle ratchet (Story #3991). Detects directed import cycles
102
- // under `.agents/scripts/` and fails on any cycle not in the committed
103
- // allowlist (`baselines/arch-cycles.json`).
104
- nodeGate('arch-cycles', '.agents/scripts/check-arch-cycles.js'),
105
- // Static Gherkin corpus gate (Story #5013): must-compile with the real
106
- // parser, then must-bind scoped per step root. Opt-in behind
107
- // `qa.gherkinLint`, so it exits 0 as "not configured" in this repo. Here
108
- // rather than in run-verify.js so it reaches CI through the same `lint`
109
- // required check as arch-cycles; listing it in both would double-pay it.
110
- nodeGate('gherkin-corpus', '.agents/scripts/check-gherkin-corpus.js'),
111
- ];
112
-
113
- function runTask({ name, cmd, args }) {
114
- return new Promise((resolve) => {
115
- const child = spawn(cmd, args, { stdio: 'inherit', shell: useShell });
116
- child.on('error', (err) => {
117
- process.stderr.write(`[run-lint:${name}] spawn error: ${err.message}\n`);
118
- resolve(1);
119
- });
120
- child.on('exit', (code, signal) => {
121
- if (signal) {
122
- process.stderr.write(`[run-lint:${name}] killed by ${signal}\n`);
123
- resolve(1);
124
- return;
125
- }
126
- resolve(code ?? 1);
127
- });
128
- });
129
- }
130
-
131
- const results = await Promise.all(tasks.map(runTask));
132
- const failed = results.findIndex((code) => code !== 0);
133
- process.exit(failed === -1 ? 0 : results[failed]);
@@ -1,129 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /* node:coverage ignore file */
4
-
5
- /**
6
- * Capture TAP timing from the full test suite and write a human summary under
7
- * `temp/` (gitignored). Skips npm-test preflight so timings reflect the
8
- * runner only — set SKIP_PREFLIGHT=0 to include preflight if desired.
9
- */
10
-
11
- import fs from 'node:fs';
12
- import path from 'node:path';
13
- import { fileURLToPath } from 'node:url';
14
- import { spawnChild } from './lib/child-exec.js';
15
- import { runAsCli } from './lib/cli-utils.js';
16
- import { buildWebhookSafeTestEnv } from './lib/test-env.js';
17
- import { parseTapOutput } from './lib/test-profile/parse-tap.js';
18
- import { renderProfileReport } from './lib/test-profile/render-report.js';
19
- import { buildNodeTestArgs } from './run-tests.js';
20
-
21
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
22
- const ROOT = path.resolve(__dirname, '..', '..');
23
- const DEFAULT_OUT_DIR = path.join(ROOT, 'temp');
24
- const TAP_FILE = 'test-profile.tap';
25
- const SUMMARY_FILE = 'test-profile.summary.txt';
26
-
27
- /**
28
- * @param {string[]} argv
29
- * @returns {{ outDir: string, topN: number, testArgv: string[] }}
30
- */
31
- export function parseProfileArgv(argv) {
32
- let outDir = DEFAULT_OUT_DIR;
33
- let topN = 20;
34
- const testArgv = [];
35
- for (let i = 0; i < argv.length; i += 1) {
36
- const arg = argv[i];
37
- if (arg === '--out-dir' && argv[i + 1]) {
38
- outDir = path.resolve(argv[i + 1]);
39
- i += 1;
40
- continue;
41
- }
42
- if (arg === '--top' && argv[i + 1]) {
43
- topN = Number(argv[i + 1]);
44
- i += 1;
45
- continue;
46
- }
47
- testArgv.push(arg);
48
- }
49
- if (!Number.isFinite(topN) || topN < 1) {
50
- throw new Error('[test-profile] --top must be a positive number');
51
- }
52
- return { outDir, topN, testArgv };
53
- }
54
-
55
- /**
56
- * @param {object} [opts]
57
- * @param {string[]} [opts.argv]
58
- * @param {string} [opts.cwd]
59
- * @param {Function} [opts.spawn] - Injected child runner; defaults to the
60
- * shared surface's real `spawnSync`.
61
- * @param {typeof fs} [opts.fs]
62
- */
63
- export function runTestProfile({
64
- argv = process.argv.slice(2),
65
- cwd = ROOT,
66
- spawn,
67
- fs: fsLike = fs,
68
- } = {}) {
69
- const { outDir, topN, testArgv } = parseProfileArgv(argv);
70
- fsLike.mkdirSync(outDir, { recursive: true });
71
-
72
- // The reporter is a *builder option*, not a suffix. Appended after the
73
- // file targets it was two more positionals to Node, the default reporter
74
- // ran, and every profile parsed `Timed entries parsed: 0` off a full
75
- // suite run. `buildNodeTestArgs` places it in flag position.
76
- const nodeArgs = buildNodeTestArgs({
77
- extraArgs: testArgv,
78
- reporter: 'tap',
79
- });
80
-
81
- const started = Date.now();
82
- const result = spawnChild(process.execPath, nodeArgs, {
83
- run: spawn,
84
- cwd,
85
- encoding: 'utf8',
86
- env: {
87
- ...buildWebhookSafeTestEnv(process.env),
88
- SKIP_PREFLIGHT: process.env.SKIP_PREFLIGHT ?? '1',
89
- FORCE_COLOR: '0',
90
- NO_COLOR: '1',
91
- },
92
- });
93
- const wallDurationMs = Date.now() - started;
94
-
95
- if (result.error) {
96
- throw result.error;
97
- }
98
-
99
- const tapText = `${result.stdout ?? ''}${result.stderr ?? ''}`;
100
- const tapPath = path.join(outDir, TAP_FILE);
101
- const summaryPath = path.join(outDir, SUMMARY_FILE);
102
- fsLike.writeFileSync(tapPath, tapText, { encoding: 'utf8' });
103
-
104
- const profile = parseTapOutput(tapText);
105
- const summary = renderProfileReport(profile, { topN, wallDurationMs });
106
- fsLike.writeFileSync(summaryPath, summary, { encoding: 'utf8' });
107
-
108
- process.stdout.write(summary);
109
- process.stdout.write(`\nWrote ${tapPath}\nWrote ${summaryPath}\n`);
110
-
111
- return {
112
- exitCode: result.status ?? 1,
113
- tapPath,
114
- summaryPath,
115
- profile,
116
- wallDurationMs,
117
- };
118
- }
119
-
120
- runAsCli(
121
- import.meta.url,
122
- async () => {
123
- const outcome = runTestProfile();
124
- if (outcome.exitCode !== 0) {
125
- process.exit(outcome.exitCode);
126
- }
127
- },
128
- { source: 'run-test-profile' },
129
- );
@@ -1,125 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * Local full verification — a true CI mirror for the gates that CAN be proven
6
- * locally, without epic-scoped MI projection or push semantics.
7
- *
8
- * Order: audit (SCA) → lint (includes docs:check + the arch-cycles ratchet) →
9
- * full test suite → unified baselines → the standalone ratchets
10
- * (dead-exports ×2, context-budget, workflow-citations, cyclomatic,
11
- * schema-references).
12
- *
13
- * The `audit` step runs `npm audit --audit-level=high`, matching CI's
14
- * "Dependency Vulnerability Audit (SCA)" gate so a local green no longer hides
15
- * a high-severity advisory that CI would fail on. It is independent of the
16
- * pre-push `PREPUSH_AUDIT` opt-in, which stays unchanged.
17
- *
18
- * The trailing ratchets complete the mirror of CI's "Architecture Cycle Check"
19
- * step in the `baselines` job (Story #4549). That step runs three checks;
20
- * `check-arch-cycles.js` is deliberately absent from STEPS because the `lint`
21
- * step above already runs it (see run-lint.js) — re-running it here would
22
- * double-pay a gate verify already covers. `check-dead-exports.js` and
23
- * `check-context-budget.js` had no such cover: they were reachable locally only
24
- * via the diff-scoped `npm run quality:preview` or a direct invocation, so a
25
- * clean `verify` could still hide a CI-red — the failure Story #4531 / PR #4548
26
- * paid for with a full push → CI → fix → push round-trip. Both are pure-Node
27
- * and baseline-aware, adding ~15s on a cold cache (dominated by knip's
28
- * full-tree scan in check-dead-exports.js) to a command that already carries
29
- * the full test suite.
30
- *
31
- * Story #5004 closed the last two mirror gaps that were pure omission.
32
- * `check-cyclomatic.js` (#4923) and `check-schema-references.js` (#4938) were
33
- * each added to the `baselines` job's standalone-ratchet slot without ever
34
- * being added here, so a green `verify` still hid both. Like their neighbours
35
- * they are pure-Node and cost milliseconds.
36
- *
37
- * Story #5340 closed the `check-workflow-citations.js` gap the same way, once
38
- * demoting it to a report made it free: it had been exempted here because
39
- * `tests/check-workflow-citations.test.js` re-ran the same ratchet, so a
40
- * `verify` step would have double-paid it. That test now asserts the report,
41
- * not a ceiling, so the step is the only local surface that prints the count.
42
- *
43
- * Still NOT mirrored: `check-baseline-scope.js` runs in CI's `baselines` job
44
- * only — `.agents/rules/known-tooling-behavior.md` entry 2 carries the current
45
- * coverage table. (`prune-baseline-orphans.js --check` used to sit in that
46
- * list; it no longer runs in CI at all — the un-attributed duplicate of the
47
- * scope gate's `extra` direction reds every open PR on inherited rows.) Nor are the CI gates this command structurally cannot
48
- * reproduce (action pinning, TruffleHog secret scan) — those are catalogued
49
- * in docs/ci-contract.md. The nightly full-scope re-score
50
- * (.github/workflows/baseline-drift.yml) is deliberately outside this
51
- * mirror too: it re-scores the whole tree, which is the cost `verify` exists
52
- * to avoid paying on every run.
53
- */
54
-
55
- import { spawnSync } from 'node:child_process';
56
- import { runAsCli } from './lib/cli-utils.js';
57
-
58
- /**
59
- * A gate step: `node .agents/scripts/<script>` plus any extra args. Eight of
60
- * the eleven steps share exactly that shape, so spelling it once leaves the list
61
- * below readable as what it actually is — a gate *order* — instead of a wall
62
- * of spawn tuples.
63
- *
64
- * @param {string} label reported as `failedStep` when the gate exits non-zero
65
- * @param {string} script basename under `.agents/scripts/`
66
- * @param {...string} args extra CLI args
67
- * @returns {{ label: string, cmd: string, args: string[] }}
68
- */
69
- const gate = (label, script, ...args) => ({
70
- label,
71
- cmd: 'node',
72
- args: [`.agents/scripts/${script}`, ...args],
73
- });
74
-
75
- const STEPS = [
76
- { label: 'audit', cmd: 'npm', args: ['audit', '--audit-level=high'] },
77
- { label: 'lint', cmd: 'npm', args: ['run', 'lint'] },
78
- { label: 'test', cmd: 'npm', args: ['test'] },
79
- gate('baselines', 'check-baselines.js'),
80
- // Ordered ahead of the dead-exports pair deliberately. When a new CLI is
81
- // missing from knip.json's entry list, both gates fail — but only this one
82
- // names the cause. Seeing the ratchet's whole-file diff first is what made
83
- // "accept the diff" look like the fix during Story #5012.
84
- gate('knip-entries', 'check-knip-entries.js'),
85
- gate('dead-exports', 'check-dead-exports.js'),
86
- gate('dead-exports-production', 'check-dead-exports.js', '--production'),
87
- gate('context-budget', 'check-context-budget.js'),
88
- gate('workflow-citations', 'check-workflow-citations.js'),
89
- gate('cyclomatic', 'check-cyclomatic.js'),
90
- gate('schema-references', 'check-schema-references.js'),
91
- ];
92
-
93
- export function runVerifySteps({
94
- spawn = spawnSync,
95
- shell = process.platform === 'win32',
96
- } = {}) {
97
- for (const step of STEPS) {
98
- const result = spawn(step.cmd, step.args, {
99
- stdio: 'inherit',
100
- shell,
101
- });
102
- if (result.error) {
103
- throw result.error;
104
- }
105
- if ((result.status ?? 1) !== 0) {
106
- return {
107
- ok: false,
108
- failedStep: step.label,
109
- exitCode: result.status ?? 1,
110
- };
111
- }
112
- }
113
- return { ok: true };
114
- }
115
-
116
- runAsCli(
117
- import.meta.url,
118
- async () => {
119
- const outcome = runVerifySteps();
120
- if (!outcome.ok) {
121
- process.exit(outcome.exitCode);
122
- }
123
- },
124
- { source: 'run-verify' },
125
- );
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * test-isolate — diagnose test-pollution cascades.
6
- *
7
- * Runs the matching test files individually (`--test-concurrency=1`,
8
- * one process per file), then again as a single suite under default
9
- * concurrency. Files that pass alone but fail in the suite are
10
- * **flippers**. For each flipper the script binary-bisects the
11
- * remaining files to surface the smallest reproducing subset (the
12
- * polluter suspect set).
13
- *
14
- * Files whose process exited with leftover `process.env` mutations are
15
- * called out so an operator can spot global-state leaks at a glance —
16
- * even when the failure cascade hasn't yet manifested. See
17
- * `lib/test-isolate/env-snapshot-loader.js`.
18
- *
19
- * Usage:
20
- *
21
- * node .agents/scripts/test-isolate.js # all tests
22
- * node .agents/scripts/test-isolate.js 'tests/lib/**' # glob subset
23
- * node .agents/scripts/test-isolate.js tests/foo.test.js # single file
24
- *
25
- * Output: human-readable text by default; pass `--json` for the raw
26
- * report envelope.
27
- *
28
- * **Shell only (Story #5316).** Nothing imports this file, so nothing here is
29
- * reachable from a test — which is why every function it used to hold scored
30
- * the CRAP formula's untested maximum. Argv parsing, report rendering,
31
- * progress logging and the run orchestration now live under
32
- * `lib/test-isolate/`, beside the `list-files` / `parse-tap` / `runner`
33
- * modules that were always there. Keep this file a shell: anything with a
34
- * branch in it belongs next door, where a test can reach it.
35
- */
36
-
37
- import path from 'node:path';
38
- import { fileURLToPath } from 'node:url';
39
- import { runAsCli } from './lib/cli-utils.js';
40
- import { runTestIsolate } from './lib/test-isolate/run-isolate.js';
41
-
42
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
43
- const ROOT = path.resolve(__dirname, '..', '..');
44
-
45
- runAsCli(
46
- import.meta.url,
47
- async () => {
48
- const { exitCode } = await runTestIsolate({
49
- argv: process.argv.slice(2),
50
- repoRoot: ROOT,
51
- });
52
- if (exitCode !== 0) process.exit(exitCode);
53
- },
54
- { source: 'test-isolate' },
55
- );