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,45 +0,0 @@
1
- import { selectSlowestEntries } from './parse-tap.js';
2
-
3
- /**
4
- * @param {import('./parse-tap.js').TapProfile} profile
5
- * @param {{ topN?: number, wallDurationMs?: number | null }} [opts]
6
- * @returns {string}
7
- */
8
- export function renderProfileReport(profile, opts = {}) {
9
- const topN = opts.topN ?? 20;
10
- const slowest = selectSlowestEntries(profile.entries, topN);
11
- const totalSec = (opts.wallDurationMs ?? profile.totalDurationMs ?? 0) / 1000;
12
- const lines = [
13
- 'Mandrel test profile summary',
14
- '===========================',
15
- '',
16
- `Total duration: ${totalSec.toFixed(3)}s`,
17
- `Tests: ${profile.testCount ?? '—'}`,
18
- `Suites: ${profile.suiteCount ?? '—'}`,
19
- `Timed entries parsed: ${profile.entries.length}`,
20
- '',
21
- `Top ${topN} slowest (tests and suites):`,
22
- '',
23
- ];
24
-
25
- if (slowest.length === 0) {
26
- lines.push(' (no timed entries found in TAP output)');
27
- } else {
28
- for (const [idx, row] of slowest.entries()) {
29
- const kindLabel = row.kind === 'suite' ? 'suite' : 'test';
30
- const seconds = (row.durationMs / 1000).toFixed(3);
31
- lines.push(
32
- `${String(idx + 1).padStart(2)}. [${kindLabel.padEnd(5)}] ${seconds}s ${row.path}`,
33
- );
34
- }
35
- }
36
-
37
- lines.push('');
38
- lines.push(
39
- 'Notes: suite rows are parent describe blocks; test rows are leaf cases.',
40
- );
41
- lines.push(
42
- 'Compare before/after optimizations using the same command on the same machine.',
43
- );
44
- return `${lines.join('\n')}\n`;
45
- }
@@ -1,214 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * lint-label-vocabulary.js — enforce that GitHub label tokens cited in
6
- * `.agents/docs/SDLC.md` and every `*.md` under `.agents/workflows/` use the
7
- * canonical
8
- * `<axis>::<value>` separator established by
9
- * `.agents/scripts/lib/label-constants.js`.
10
- *
11
- * Why this exists (Tech Spec F9, Epic #2880): the framework's label
12
- * vocabulary is the contract between docs and the runtime. A typo such
13
- * as `type/epic` (the original F9 finding at epic-plan.md:49) drifts
14
- * silently because nothing reads doc prose against the constants file.
15
- * This lint closes that gap by failing CI on any inline code span that
16
- * cites a known axis with the wrong separator.
17
- *
18
- * Scope:
19
- * - Files scanned: `.agents/docs/SDLC.md` plus every `*.md` under
20
- * `.agents/workflows/`.
21
- * - Tokens scanned: inline backtick code spans only (e.g. `type/epic`).
22
- * Prose mentions like "planning/audit metadata" are intentionally
23
- * ignored — only fenced citations are treated as label references.
24
- * - Axes recognized: the union of namespaces exported from
25
- * `lib/label-constants.js` (`agent`, `type`, `status`, `context`,
26
- * `acceptance`, `meta`, `planning`) plus the persona prefix.
27
- * - Violation shape: any axis token using a separator other than `::`
28
- * (e.g. `/`, `:`, `-`). False-positive risk is low because the axes
29
- * are project-specific identifiers, not common English words.
30
- *
31
- * Exit codes:
32
- * 0 — clean.
33
- * 1 — at least one violation; offending file + line printed to stderr.
34
- *
35
- * Ships as part of `npm run lint` via `.agents/scripts/run-lint.js`.
36
- */
37
-
38
- import { readdirSync, readFileSync } from 'node:fs';
39
- import path from 'node:path';
40
- import { fileURLToPath } from 'node:url';
41
- import { runAsCli } from './lib/cli-utils.js';
42
- import { walkFilesByExtension } from './lib/fs-walk.js';
43
-
44
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
45
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
46
-
47
- const DEFAULT_SCAN_TARGETS = Object.freeze([
48
- path.join(REPO_ROOT, '.agents', 'docs', 'SDLC.md'),
49
- path.join(REPO_ROOT, '.agents', 'workflows'),
50
- ]);
51
-
52
- /**
53
- * Known label-axis prefixes. Each entry corresponds to a namespace
54
- * exported from `.agents/scripts/lib/label-constants.js`. The list is
55
- * hard-coded rather than introspected so the lint stays a pure file
56
- * walk with no module import side effects.
57
- *
58
- * Maintainers: when a new label axis lands in `label-constants.js`, add
59
- * its prefix here (without trailing colons). Forgetting to add an axis
60
- * makes the lint silently lenient for that namespace — the tests in
61
- * `tests/contract/lint/label-vocabulary.test.js` lock the canonical
62
- * set against drift.
63
- */
64
- export const KNOWN_AXES = Object.freeze([
65
- 'agent',
66
- 'type',
67
- 'status',
68
- 'persona',
69
- 'acceptance',
70
- 'meta',
71
- 'planning',
72
- ]);
73
-
74
- /**
75
- * Resolve a mixed list of file/directory paths into the flat set of
76
- * markdown files to scan. Missing paths are silently skipped (the
77
- * walker handles ENOENT) so the lint is robust under partial trees.
78
- */
79
- function* resolveTargets(targets) {
80
- for (const target of targets) {
81
- let stat;
82
- try {
83
- stat = readdirSync(target, { withFileTypes: true });
84
- } catch (err) {
85
- if (err.code === 'ENOTDIR') {
86
- // it's a file path — yield directly if it's .md
87
- if (target.endsWith('.md')) yield target;
88
- continue;
89
- }
90
- if (err.code === 'ENOENT') continue;
91
- throw err;
92
- }
93
- // directory — walk it
94
- for (const entry of stat) {
95
- const p = path.join(target, entry.name);
96
- if (entry.isDirectory()) {
97
- yield* walkFilesByExtension(p, '.md');
98
- } else if (entry.isFile() && entry.name.endsWith('.md')) {
99
- yield p;
100
- }
101
- }
102
- }
103
- }
104
-
105
- /**
106
- * Scan a single source string for inline backtick code spans containing
107
- * a label-shaped token that uses a non-`::` separator after a known
108
- * axis. Returns an array of `{ line, token, axis, separator }`.
109
- *
110
- * The matcher operates on inline code spans only (single backtick
111
- * delimited). Fenced code blocks (```…```) are not stripped because
112
- * label citations inside them are still drift signals worth flagging.
113
- *
114
- * @param {string} src
115
- * @param {readonly string[]} [axes]
116
- * @returns {Array<{ line: number, token: string, axis: string, separator: string }>}
117
- */
118
- export function findVocabularyViolations(src, axes = KNOWN_AXES) {
119
- const violations = [];
120
- const lines = src.split('\n');
121
- // Match inline code spans: `…` where the content does not include a
122
- // newline or another backtick. Greedy enough for label citations,
123
- // strict enough to avoid swallowing prose.
124
- const codeSpanRe = /`([^`\n]+)`/g;
125
- const axisSet = new Set(axes);
126
- // Anchored axis-drift check. We only flag a code span when its body,
127
- // taken as a whole, has the shape `<axis><sep><value>` where:
128
- // - axis is a known label axis (case-insensitive)
129
- // - sep is one of the non-canonical separators we treat as drift:
130
- // `/` (the original F9 finding) or a single `:` (also wrong).
131
- // Hyphens (`agent-protocol`) are intentionally NOT flagged —
132
- // they collide with legitimate concept slugs and filenames.
133
- // - value is a lowercase identifier (`[a-z][a-z0-9-]*`)
134
- //
135
- // The whole-body anchor avoids false positives on:
136
- // - `acceptance::n-a` — canonical label, value contains a
137
- // hyphen but is not at axis position.
138
- // - `<type>/<slug>` — template placeholders.
139
- // - `delivery.maxTokenBudget` — config-key paths with `.`.
140
- // - `delivery.{maxTickets}` — JS destructure shapes.
141
- // - `agent-protocol.md` — filenames / concept slugs.
142
- //
143
- // Real drift like `type/epic` matches because the WHOLE body is
144
- // `type/epic` (axis 'type', single '/', value 'epic').
145
- const driftRe = new RegExp(
146
- `^(${axes.join('|')})([/:])([a-z][a-z0-9-]*)$`,
147
- 'i',
148
- );
149
- for (let i = 0; i < lines.length; i += 1) {
150
- const line = lines[i];
151
- codeSpanRe.lastIndex = 0;
152
- let span = codeSpanRe.exec(line);
153
- while (span !== null) {
154
- const body = span[1];
155
- const m = driftRe.exec(body);
156
- if (m) {
157
- const axis = m[1].toLowerCase();
158
- const separator = m[2];
159
- if (separator !== '::' && axisSet.has(axis)) {
160
- violations.push({
161
- line: i + 1,
162
- token: body,
163
- axis,
164
- separator,
165
- });
166
- }
167
- }
168
- span = codeSpanRe.exec(line);
169
- }
170
- }
171
- return violations;
172
- }
173
-
174
- /**
175
- * Aggregate violations across all target files.
176
- *
177
- * @param {readonly string[]} targets
178
- * @param {{ read?: typeof readFileSync }} [opts]
179
- * @returns {Array<{ file: string, line: number, token: string, axis: string, separator: string }>}
180
- */
181
- export function lintLabelVocabulary(
182
- targets = DEFAULT_SCAN_TARGETS,
183
- { read = readFileSync } = {},
184
- ) {
185
- const out = [];
186
- for (const file of resolveTargets(targets)) {
187
- const src = read(file, 'utf8');
188
- for (const v of findVocabularyViolations(src)) {
189
- out.push({ file, ...v });
190
- }
191
- }
192
- return out;
193
- }
194
-
195
- async function main() {
196
- const violations = lintLabelVocabulary();
197
- if (violations.length === 0) {
198
- process.stdout.write(
199
- '[label-vocabulary] clean: no drift from canonical `<axis>::<value>` separator in scanned docs.\n',
200
- );
201
- return 0;
202
- }
203
- for (const v of violations) {
204
- process.stderr.write(
205
- `[label-vocabulary] ${v.file}:${v.line}\n token \`${v.token}\` uses '${v.separator}' but axis '${v.axis}' requires canonical '::' separator (see .agents/scripts/lib/label-constants.js).\n`,
206
- );
207
- }
208
- return 1;
209
- }
210
-
211
- await runAsCli(import.meta.url, main, {
212
- source: 'lint-label-vocabulary',
213
- propagateExitCode: true,
214
- });
@@ -1,127 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * post-structured-comment.js — CLI wrapper for structured comment upsert.
6
- *
7
- * Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
8
- *
9
- * Delegates to `upsertStructuredComment` from `lib/orchestration/ticketing.js`
10
- * and emits the `{ success, ticketId, type }` JSON envelope on stdout.
11
- *
12
- * Usage:
13
- * node .agents/scripts/post-structured-comment.js \
14
- * --ticket <id> --marker <type> --body-file <path> [--provider github]
15
- *
16
- * Exit codes:
17
- * 0 — upsert succeeded
18
- * non-zero — validation or provider failure (error on stderr)
19
- */
20
-
21
- import fs from 'node:fs/promises';
22
- import { parseArgs } from 'node:util';
23
- import { runAsCli } from './lib/cli-utils.js';
24
- import { resolveConfig } from './lib/config-resolver.js';
25
- import {
26
- assertValidStructuredCommentType,
27
- upsertStructuredComment,
28
- } from './lib/orchestration/ticketing.js';
29
- import { createProvider } from './lib/provider-factory.js';
30
-
31
- const HELP = `Usage: node .agents/scripts/post-structured-comment.js \\
32
- --ticket <id> --marker <type> --body-file <path> [--provider github]
33
-
34
- Flags:
35
- --ticket GitHub issue number to comment on (required).
36
- --marker Structured-comment type (e.g. progress, friction,
37
- retro, epic-run-state, wave-0-start) (required).
38
- --body-file Path to a file containing the markdown body (required).
39
- --provider Provider name (default: inferred from .agentrc.json github block).
40
- --help Show this message.
41
- `;
42
-
43
- /**
44
- * Core: idempotently upsert the structured comment and return the envelope.
45
- * Exported so tests can pin input/output parity against direct SDK use
46
- * without spawning a subprocess.
47
- */
48
- export async function runPostStructuredComment({
49
- ticketId,
50
- type,
51
- body,
52
- provider,
53
- }) {
54
- assertValidStructuredCommentType(type);
55
- await upsertStructuredComment(provider, ticketId, type, body);
56
- return { success: true, ticketId, type };
57
- }
58
-
59
- export function parseArgv(argv) {
60
- const { values } = parseArgs({
61
- args: argv,
62
- options: {
63
- ticket: { type: 'string' },
64
- marker: { type: 'string' },
65
- 'body-file': { type: 'string' },
66
- provider: { type: 'string' },
67
- help: { type: 'boolean' },
68
- },
69
- strict: false,
70
- });
71
- return values;
72
- }
73
-
74
- /**
75
- * Pure: validate the required CLI inputs for `post-structured-comment`. The
76
- * orchestrator is otherwise too dense to score under the CRAP cap, and these
77
- * rules deserve their own targeted tests.
78
- *
79
- * @param {Record<string, unknown>} values parsed CLI values
80
- * @returns {{ ticketId: number, errors: string[] }} `errors` is empty on success.
81
- */
82
- export function validateRequiredArgs(values) {
83
- const ticketId = Number.parseInt(values.ticket ?? '', 10);
84
- const errors = [];
85
- if (!Number.isFinite(ticketId) || ticketId <= 0) {
86
- errors.push('--ticket <id> is required.');
87
- }
88
- if (!values.marker) errors.push('--marker <type> is required.');
89
- if (!values['body-file']) errors.push('--body-file <path> is required.');
90
- return { ticketId, errors };
91
- }
92
-
93
- export async function main(argv = process.argv.slice(2)) {
94
- const values = parseArgv(argv);
95
-
96
- if (values.help) {
97
- process.stdout.write(HELP);
98
- return;
99
- }
100
-
101
- const { ticketId, errors } = validateRequiredArgs(values);
102
- if (errors.length) {
103
- for (const e of errors) {
104
- process.stderr.write(`[post-structured-comment] ${e}\n`);
105
- }
106
- process.stderr.write(HELP);
107
- process.exit(2);
108
- }
109
-
110
- const body = await fs.readFile(values['body-file'], 'utf8');
111
-
112
- const config = resolveConfig();
113
- const effectiveConfig = values.provider
114
- ? { ...config, provider: values.provider }
115
- : config;
116
- const provider = createProvider(effectiveConfig);
117
-
118
- const envelope = await runPostStructuredComment({
119
- ticketId,
120
- type: values.marker,
121
- body,
122
- provider,
123
- });
124
- process.stdout.write(`${JSON.stringify(envelope)}\n`);
125
- }
126
-
127
- runAsCli(import.meta.url, main, { source: 'post-structured-comment' });
@@ -1,85 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * provision-git-hooks.js
5
- *
6
- * Materialize the repository's git hooks into a linked worktree, so commits
7
- * made there are subject to the same `commit-msg` / `pre-commit` / `pre-push`
8
- * gates as commits made in the main checkout.
9
- *
10
- * Worktrees created by `single-story-init.js` are provisioned automatically as
11
- * part of `worktree.bootstrap`. This entry point exists for the worktrees the
12
- * orchestrator never creates — a harness or hand-made `git worktree add` —
13
- * which are otherwise unreachable. Run it from inside such a worktree with no
14
- * arguments.
15
- */
16
-
17
- import path from 'node:path';
18
- import { runAsCli } from './lib/cli-utils.js';
19
- import {
20
- materializeGitHooks,
21
- resolveCommonCheckout,
22
- } from './lib/worktree/git-hooks.js';
23
-
24
- /**
25
- * @param {object} [opts]
26
- * @param {string[]} [opts.argv]
27
- * @param {string} [opts.cwd]
28
- * @returns {{ action: string, reason?: string, hooksPath: string|null,
29
- * target: string|null, hooks: string[], worktree: string, repoRoot: string }}
30
- */
31
- export function runProvisionGitHooks({
32
- argv = process.argv.slice(2),
33
- cwd = process.cwd(),
34
- } = {}) {
35
- const positional = [];
36
- let repoRootFlag = null;
37
- for (let i = 0; i < argv.length; i += 1) {
38
- if (argv[i] === '--repo-root') {
39
- repoRootFlag = argv[i + 1];
40
- if (!repoRootFlag) {
41
- throw new Error('--repo-root requires a path');
42
- }
43
- i += 1;
44
- continue;
45
- }
46
- positional.push(argv[i]);
47
- }
48
-
49
- const worktree = path.resolve(cwd, positional[0] ?? '.');
50
- const repoRoot = repoRootFlag
51
- ? path.resolve(cwd, repoRootFlag)
52
- : resolveCommonCheckout(worktree);
53
-
54
- const result = materializeGitHooks({ repoRoot, worktree });
55
- return { ...result, worktree, repoRoot };
56
- }
57
-
58
- runAsCli(
59
- import.meta.url,
60
- async () => {
61
- const result = runProvisionGitHooks();
62
- // Compact single-line digest: this is the machine contract, and the
63
- // hook file list is bounded by the hooks directory itself.
64
- process.stdout.write(`${JSON.stringify(result)}\n`);
65
- },
66
- {
67
- source: 'provision-git-hooks',
68
- usage: {
69
- invocation:
70
- 'node .agents/scripts/provision-git-hooks.js [<worktree-path>] [--repo-root <path>]',
71
- summary:
72
- "Materialize the repository's git hooks into a linked worktree so its commits are gated.",
73
- flags: [
74
- [
75
- '<worktree-path>',
76
- 'Worktree to provision (default: the current directory).',
77
- ],
78
- [
79
- '--repo-root <path>',
80
- 'Checkout that owns the hooks (default: derived from --git-common-dir).',
81
- ],
82
- ],
83
- },
84
- },
85
- );
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // .agents/scripts/prune-baseline-orphans.js — Story #5012.
4
- //
5
- // Delete the baseline rows that are provably inert, and nothing else.
6
- //
7
- // This is the cheap remedy that makes `check-baseline-scope.js` fair. A gate
8
- // that hard-fails on a stale row is only defensible while clearing one costs a
9
- // command rather than a full re-score: the honest alternative — re-derive the
10
- // whole baseline — spends a coverage run or a full-tree MI pass to express a
11
- // deletion, which is why stale rows accumulate instead.
12
- //
13
- // Two row classes qualify, both decidable without measuring anything:
14
- //
15
- // - `absent` — the row's file is gone from disk.
16
- // - `out-of-scope` — the file is still there, but the gate's own
17
- // `targetDirs` / `ignoreGlobs` no longer match it.
18
- //
19
- // The pruner never adds a row, never restamps `generatedAt` (a fresh stamp
20
- // over unmeasured rows is the exact failure an age check exists to catch), and
21
- // recomputes `rollup` through the kind's own arithmetic so the pruned envelope
22
- // still validates against its schema. An unreadable scope config degrades to
23
- // orphan-only pruning rather than treating unknown scope as empty scope.
24
- //
25
- // Exit codes:
26
- // 0 nothing to prune (or, without `--check`, the prune was written)
27
- // 1 `--check` found rows that would be pruned
28
- // 2 the pruner could not run
29
-
30
- // Fail-fast if the framework's runtime deps are not installed — must be the
31
- // first import so the check runs before any third-party-importing sibling
32
- // module is evaluated (Story #3432).
33
- import './lib/runtime-deps/ensure-installed.js';
34
- import { PRUNABLE_KINDS, runPrune } from './lib/baselines/orphan-pruner.js';
35
- import { runAsCli } from './lib/cli-utils.js';
36
- import { getQuality } from './lib/config/quality.js';
37
- import { resolveConfig } from './lib/config-resolver.js';
38
-
39
- const EXIT_CLEAN = 0;
40
- const EXIT_WOULD_PRUNE = 1;
41
- const EXIT_CANNOT_RUN = 2;
42
-
43
- const HELP = {
44
- invocation:
45
- 'node .agents/scripts/prune-baseline-orphans.js [--check] [--kind <kind>] [--json]',
46
- summary:
47
- "Remove baseline rows whose file is gone from disk or has left the gate's scope. Never adds a row, never restamps generatedAt, never re-scores.",
48
- flags: [
49
- ['--check', 'Report what would be pruned, write nothing, exit 1 if any.'],
50
- ['--kind <kind>', 'Prune one kind only (repeatable). Default: all.'],
51
- ['--json', 'Emit the report as JSON instead of text.'],
52
- ['--cwd <dir>', 'Repository root to prune. Default: process.cwd().'],
53
- ],
54
- notes: [
55
- 'Exit codes:\n 0 clean, or pruned\n 1 --check found prunable rows\n 2 the pruner could not run',
56
- ],
57
- };
58
-
59
- /**
60
- * Parse argv into an options bag. An unknown flag is an error, never a silent
61
- * no-op — a typo'd `--dry-run` must not read as "write the files".
62
- *
63
- * @param {string[]} argv
64
- * @returns {{ kinds: string[], check: boolean, json: boolean, cwd: string }}
65
- */
66
- export function parseArgs(argv = []) {
67
- const out = { kinds: [], check: false, json: false, cwd: null };
68
- let i = 0;
69
- while (i < argv.length) {
70
- const arg = argv[i];
71
- const value = argv[i + 1];
72
- i += 1;
73
- if (arg === '--check') out.check = true;
74
- else if (arg === '--json') out.json = true;
75
- else if (arg === '--kind') {
76
- out.kinds.push(value);
77
- i += 1;
78
- } else if (arg === '--cwd') {
79
- out.cwd = value;
80
- i += 1;
81
- } else throw new Error(`unknown flag "${arg}" (try --help)`);
82
- }
83
- const unknown = out.kinds.filter((k) => !PRUNABLE_KINDS.includes(k));
84
- if (unknown.length > 0) {
85
- throw new Error(
86
- `unknown --kind ${unknown.join(', ')}; expected one of ${PRUNABLE_KINDS.join(', ')}`,
87
- );
88
- }
89
- if (out.kinds.length === 0) out.kinds = [...PRUNABLE_KINDS];
90
- out.cwd = out.cwd ?? process.cwd();
91
- return out;
92
- }
93
-
94
- /**
95
- * Render one kind's outcome as indented text lines.
96
- *
97
- * @param {object} entry
98
- * @param {boolean} check
99
- * @returns {string[]}
100
- */
101
- function renderKind(entry, check) {
102
- if (!entry.present) return [];
103
- if (entry.skipped)
104
- return [` - ${entry.kind}: skipped (${entry.skipReason})`];
105
- const suffix = entry.degraded
106
- ? ` [orphan-only: ${entry.degradedReason}]`
107
- : '';
108
- if (entry.removed.length === 0) {
109
- return [` - ${entry.kind}: clean${suffix}`];
110
- }
111
- const verb = check ? 'would prune' : 'pruned';
112
- return [
113
- ` - ${entry.kind}: ${verb} ${entry.removed.length} row(s)${suffix}`,
114
- ...entry.removed.map((row) => ` · ${row.reason}: ${row.path}`),
115
- ];
116
- }
117
-
118
- /**
119
- * Render the whole report as text.
120
- *
121
- * @param {object} report
122
- * @returns {string}
123
- */
124
- export function formatReport(report) {
125
- const verb = report.check ? 'would prune' : 'pruned';
126
- const lines = [
127
- `[prune-baseline-orphans] ${verb} ${report.removedCount} row(s) across ` +
128
- `${report.writtenCount} file(s)`,
129
- ...report.kinds.flatMap((entry) => renderKind(entry, report.check)),
130
- ];
131
- if (report.check && report.removedCount > 0) {
132
- lines.push(
133
- '',
134
- 'Run without --check to write the prune:',
135
- ' node .agents/scripts/prune-baseline-orphans.js',
136
- );
137
- }
138
- return lines.join('\n');
139
- }
140
-
141
- /**
142
- * CLI entry point. Returns its exit code rather than calling `process.exit()`,
143
- * so `runAsCli`'s `propagateExitCode` path settles it through `flushStdio` and
144
- * an unbounded report is not truncated at a pipe boundary (Story #4783).
145
- *
146
- * @returns {Promise<number>}
147
- */
148
- async function main() {
149
- let opts;
150
- let report;
151
- try {
152
- opts = parseArgs(process.argv.slice(2));
153
- const config = resolveConfig({ cwd: opts.cwd });
154
- report = runPrune({
155
- cwd: opts.cwd,
156
- kinds: opts.kinds,
157
- check: opts.check,
158
- quality: getQuality(config) ?? { gates: {} },
159
- });
160
- } catch (err) {
161
- const message = err?.message ?? String(err);
162
- process.stdout.write(
163
- `${JSON.stringify({ schemaVersion: '1', error: message }, null, 2)}\n`,
164
- );
165
- return EXIT_CANNOT_RUN;
166
- }
167
- process.stdout.write(
168
- opts.json
169
- ? `${JSON.stringify(report, null, 2)}\n`
170
- : `${formatReport(report)}\n`,
171
- );
172
- return report.check && report.removedCount > 0
173
- ? EXIT_WOULD_PRUNE
174
- : EXIT_CLEAN;
175
- }
176
-
177
- runAsCli(import.meta.url, main, {
178
- source: 'prune-baseline-orphans',
179
- usage: HELP,
180
- propagateExitCode: true,
181
- });