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,58 +1,9 @@
1
1
  /**
2
- * Doc-tier resolver (Story #4438, Epic #4430 — Context Economy).
3
- *
4
- * Pure functions that classify the repository's documentation into the four
5
- * read-tiers Mandrel's context model recognizes, each entry carrying its
6
- * on-disk byte size so a byte budget can ratchet against it:
7
- *
8
- * - `alwaysLoaded` — `CLAUDE.md` plus the transitive closure of its
9
- * `@`-import references (`@AGENTS.md`,
10
- * `@.agents/instructions.md`, the always-on rules, …).
11
- * This is the context every session re-pays
12
- * on every subagent spawn (instructions.md § 4), so it is
13
- * the primary budget the context-budget ratchet gates.
14
- * - `mandatoryRead` — the resolved `project.docsContextFiles` set (prefixed
15
- * by `project.paths.docsRoot`), existing files only. This
16
- * is the `docsContextFiles` half the Epic AC gates; it
17
- * skips silently when the set is unconfigured or its
18
- * files are absent.
19
- * - `digestVisible` — the situational **Conditional Reads** docs from
20
- * instructions.md § 3 (`docs/style-guide.md`,
21
- * `docs/web-routes.md`) — surfaced only when a task
22
- * touches UI/routing, i.e. visible through the docs
23
- * digest rather than always read. Existing files only.
24
- * - `onDemand` — the on-demand `.agents/rules/*.md` set (instructions.md
25
- * § 1.F): every rule file that is **not** part of the
26
- * always-on core already captured in `alwaysLoaded`.
27
- * - `agentBoot` — the role-scoped boot contexts `.agents/agents/*.md`
28
- * (issue #4478). Each is a standalone system prompt a
29
- * converted spawn boots on **instead of** the always-loaded
30
- * closure, so it is measured independently. Its per-file
31
- * 8 KB ceiling was deleted by Story #5340;
32
- * `check-context-budget.js` now reports these sizes and
33
- * gates nothing on them.
34
- * - `workflow` / — the `.agents/workflows/**` read-tier (Story #4752),
35
- * `workflowOnDemand` resolved as each entry point's transitive
36
- * markdown-link closure by
37
- * [`workflow-closure.js`](workflow-closure.js): the files
38
- * an entry point's `mandatoryReads:` frontmatter forces
39
- * you to read (`workflow`, gated) versus the reachable
40
- * remainder (`workflowOnDemand`, recorded only).
41
- *
42
- * A file that could appear in more than one tier is kept in its **highest**
43
- * tier only (alwaysLoaded > mandatoryRead > digestVisible > onDemand), so the
44
- * arrays partition the doc set with no double-counting. `agentBoot` is disjoint
45
- * from the read-tiers (it lives under `.agents/agents/`, not the doc/rules set),
46
- * and so are the workflow tiers (confined to `.agents/workflows/`).
47
- *
48
- * The closure is discovered by parsing `@`-import references and following
49
- * them recursively (cycle-safe via a visited set). A candidate `@`-token only
50
- * counts as an import when it resolves to an existing repo file, which
51
- * naturally filters prose mentions (`@[USERNAME]`, `noreply@example.com`,
52
- * backtick-wrapped `` `@`-imported `` phrasing).
53
- *
54
- * Security (security-baseline § 5 — Data Leakage & Logging): every function
55
- * emits only repo-relative paths and byte counts — never file contents.
2
+ * Doc-tier resolver: partition the repo's docs into read-tiers with byte
3
+ * sizes for the context-budget ratchet (`alwaysLoaded` = CLAUDE.md's
4
+ * `@`-import closure; `agentBoot` and `workflowOnDemand` are recorded, not
5
+ * gated). A path lives only in its highest tier. Emits paths and byte
6
+ * counts, never file contents.
56
7
  */
57
8
 
58
9
  import nodeFs from 'node:fs';
@@ -60,38 +11,24 @@ import path from 'node:path';
60
11
  import { resolveWorkflowClosures } from './workflow-closure.js';
61
12
 
62
13
  /**
63
- * Basename of the always-loaded entry document (the root of the closure).
64
14
  * @type {string}
65
15
  */
66
16
  const ENTRY_DOC = 'CLAUDE.md';
67
17
 
68
18
  /**
69
- * Always-on core rule files (instructions.md § 1.F). These live in the
70
- * `alwaysLoaded` closure (imported by `CLAUDE.md`); every other
71
- * `.agents/rules/*.md` file is `onDemand`.
72
19
  * @type {string[]}
73
20
  */
74
21
  const ALWAYS_ON_RULES = ['security-baseline.md', 'git-conventions.md'];
75
22
 
76
23
  /**
77
- * Conditional-read docs (instructions.md § 3 — "Conditional Reads"), resolved
78
- * against `project.paths.docsRoot`. Present in the `digestVisible` tier when
79
- * they exist.
80
24
  * @type {string[]}
81
25
  */
82
26
  const CONDITIONAL_DOCS = ['style-guide.md', 'web-routes.md'];
83
27
 
84
- /**
85
- * Match `@`-import tokens: an `@` at start-of-line or after whitespace,
86
- * followed by a path token that stops at whitespace or common closing
87
- * punctuation. The resolved-file existence check downstream is the real
88
- * filter; this regex only harvests candidates.
89
- */
28
+ /** Candidates only; the file-existence check filters out prose `@` tokens. */
90
29
  const IMPORT_RE = /(?:^|\s)@([^\s'"`)\]}>,]+)/gm;
91
30
 
92
31
  /**
93
- * Default fs surface — a small subset of `node:fs` so callers can inject a
94
- * fixture double in tests without touching the real filesystem.
95
32
  * @typedef {{
96
33
  * existsSync: (p: string) => boolean,
97
34
  * readFileSync: (p: string, enc: string) => string,
@@ -100,17 +37,15 @@ const IMPORT_RE = /(?:^|\s)@([^\s'"`)\]}>,]+)/gm;
100
37
  */
101
38
 
102
39
  /**
103
- * Parse the raw `@`-import specifiers from a source document. A trailing `.`
104
- * or `:` (sentence punctuation) is trimmed so `@AGENTS.md.` still resolves.
40
+ * Trailing `.`/`:` is trimmed so `@AGENTS.md.` still resolves.
105
41
  *
106
42
  * @param {string} source
107
- * @returns {string[]} raw specifiers in first-seen order
43
+ * @returns {string[]}
108
44
  */
109
45
  export function parseImportSpecifiers(source) {
110
46
  const specs = [];
111
47
  for (const m of String(source ?? '').matchAll(IMPORT_RE)) {
112
48
  let spec = m[1];
113
- // Strip trailing sentence punctuation that the greedy class allowed in.
114
49
  while (spec.length > 0 && (spec.endsWith('.') || spec.endsWith(':'))) {
115
50
  spec = spec.slice(0, -1);
116
51
  }
@@ -120,10 +55,8 @@ export function parseImportSpecifiers(source) {
120
55
  }
121
56
 
122
57
  /**
123
- * Convert an absolute path to a repo-relative, posix-separated id.
124
- *
125
- * @param {string} root absolute repo root
126
- * @param {string} abs absolute path
58
+ * @param {string} root
59
+ * @param {string} abs
127
60
  * @returns {string}
128
61
  */
129
62
  function toRepoRel(root, abs) {
@@ -131,11 +64,8 @@ function toRepoRel(root, abs) {
131
64
  }
132
65
 
133
66
  /**
134
- * Build a `{ path, bytes }` entry for a repo file, or `null` when it does not
135
- * exist. `path` is repo-relative posix; `bytes` is the on-disk byte size.
136
- *
137
- * @param {string} root absolute repo root
138
- * @param {string} rel repo-relative path
67
+ * @param {string} root
68
+ * @param {string} rel
139
69
  * @param {FsLike} fs
140
70
  * @returns {{ path: string, bytes: number } | null}
141
71
  */
@@ -152,16 +82,11 @@ function fileEntry(root, rel, fs) {
152
82
  }
153
83
 
154
84
  /**
155
- * Resolve the always-loaded closure: `CLAUDE.md` plus every file reachable by
156
- * recursively parsing `@`-import references. Cycle-safe (a visited set keyed
157
- * by repo-relative path). Nested imports resolve relative to the importing
158
- * file's directory (Claude Code `@`-import semantics). Non-resolving `@`-tokens
159
- * are ignored, so prose mentions never pollute the closure.
85
+ * Cycle-safe; nested imports resolve relative to the importing file.
160
86
  *
161
- * @param {string} root absolute repo root (where `CLAUDE.md` lives)
87
+ * @param {string} root
162
88
  * @param {{ fs?: FsLike }} [opts]
163
- * @returns {Array<{ path: string, bytes: number }>} sorted by path; empty when
164
- * `CLAUDE.md` is absent
89
+ * @returns {Array<{ path: string, bytes: number }>}
165
90
  */
166
91
  export function resolveAlwaysLoadedClosure(root, { fs = nodeFs } = {}) {
167
92
  const entryAbs = path.resolve(root, ENTRY_DOC);
@@ -202,13 +127,10 @@ export function resolveAlwaysLoadedClosure(root, { fs = nodeFs } = {}) {
202
127
  }
203
128
 
204
129
  /**
205
- * Read the resolved `project.docsContextFiles` list from a config object,
206
- * prefixed by `project.paths.docsRoot`. Resolves new-shape
207
- * `project.docsContextFiles` first and falls back to the legacy top-level
208
- * key, so a config written against either shape yields the same list.
130
+ * Reads `project.*` first, then the legacy top-level keys.
209
131
  *
210
- * @param {object} config resolved config (`resolveConfig()` output)
211
- * @returns {string[]} repo-relative posix doc paths (existence not yet checked)
132
+ * @param {object} config
133
+ * @returns {string[]}
212
134
  */
213
135
  export function docsContextPaths(config) {
214
136
  const project = config?.project ?? config;
@@ -223,13 +145,7 @@ export function docsContextPaths(config) {
223
145
  }
224
146
 
225
147
  /**
226
- * Resolve the documentation read-tiers, each entry `{ path, bytes }`,
227
- * partitioned so no path appears in more than one tier (highest tier wins).
228
- * `workflowClosure` rides alongside the tiers as the per-entry-point workflow
229
- * measurement (Story #4752) — its `reachableTotalBytes` is a recorded drift
230
- * signal, never a gate.
231
- *
232
- * @param {object} config resolved config (`resolveConfig()` output)
148
+ * @param {object} config
233
149
  * @param {{ root?: string, fs?: FsLike }} [opts]
234
150
  * @returns {{
235
151
  * tiers: {
@@ -266,33 +182,22 @@ export function resolveDocTiers(
266
182
  return out.sort((a, b) => a.path.localeCompare(b.path));
267
183
  };
268
184
 
269
- // 1. always-loaded: CLAUDE.md @-import closure. Pre-claim its paths first so
270
- // a lower tier never re-lists a closure member.
185
+ // Pre-claim the closure so a lower tier never re-lists a member.
271
186
  const alwaysLoaded = resolveAlwaysLoadedClosure(root, { fs });
272
187
  for (const e of alwaysLoaded) claimed.add(e.path);
273
188
 
274
- // 2. mandatory-read: resolved docsContextFiles (existing files only).
275
189
  const docsRoot =
276
190
  config?.project?.paths?.docsRoot ?? config?.paths?.docsRoot ?? 'docs';
277
191
  const mandatoryRead = collect(docsContextPaths(config));
278
192
 
279
- // 3. digest-visible: situational Conditional-Read docs.
280
193
  const digestVisible = collect(
281
194
  CONDITIONAL_DOCS.map((f) => path.posix.join(docsRoot, f)),
282
195
  );
283
196
 
284
- // 4. on-demand: every .agents/rules/*.md that is not an always-on core rule
285
- // (the always-on ones already live in the alwaysLoaded closure).
286
197
  const onDemand = collect(listOnDemandRules(root, fs));
287
198
 
288
- // 5. agent-boot: role-scoped boot contexts .agents/agents/*.md (#4478). These
289
- // are standalone system prompts, disjoint from the doc read-tiers.
290
199
  const agentBoot = collect(listAgentDefs(root, fs));
291
200
 
292
- // 6. workflow: each entry point's transitive markdown-link closure (#4752),
293
- // split into the gated mandatory set and the recorded on-demand remainder.
294
- // The walk is confined to `.agents/workflows/**`, and `collect` still
295
- // de-dupes, so no path is counted against two tiers.
296
201
  const closure = resolveWorkflowClosures(root, { fs });
297
202
  const workflow = collect(closure.mandatoryFiles.map((e) => e.path));
298
203
  const workflowOnDemand = collect(closure.onDemandFiles.map((e) => e.path));
@@ -316,10 +221,7 @@ export function resolveDocTiers(
316
221
  }
317
222
 
318
223
  /**
319
- * List the role-scoped agent-boot defs (repo-relative posix): every
320
- * `.agents/agents/*.md`. Returns [] when the directory is absent.
321
- *
322
- * @param {string} root absolute repo root
224
+ * @param {string} root
323
225
  * @param {FsLike} fs
324
226
  * @returns {string[]}
325
227
  */
@@ -338,11 +240,7 @@ function listAgentDefs(root, fs) {
338
240
  }
339
241
 
340
242
  /**
341
- * List the on-demand rule files (repo-relative posix): every `.agents/rules/
342
- * *.md` whose basename is not an always-on core rule. Returns [] when the
343
- * rules directory is absent.
344
- *
345
- * @param {string} root absolute repo root
243
+ * @param {string} root
346
244
  * @param {FsLike} fs
347
245
  * @returns {string[]}
348
246
  */
@@ -361,8 +259,6 @@ function listOnDemandRules(root, fs) {
361
259
  }
362
260
 
363
261
  /**
364
- * Sum the `bytes` of every entry in a tier array.
365
- *
366
262
  * @param {Array<{ bytes: number }>} entries
367
263
  * @returns {number}
368
264
  */
@@ -1,31 +1,7 @@
1
1
  /**
2
- * duplicate-search.js — Cross-Story Duplicate Detection
3
- *
4
- * Used by `/mandrel-plan` to surface open Stories whose scope overlaps with a
5
- * seed / seed-file / tickets corpus before new Stories are created.
6
- * Returns ranked candidates with an overlap score and URL so the host
7
- * LLM can pause for HITL confirmation.
8
- *
9
- * Design notes:
10
- * - Prefer `provider.searchIssues` to narrow open Stories server-side
11
- * (`label:"type::story" state:open` + top seed tokens), capped at
12
- * ~100 hits, then rank that set. Fall back to `listIssuesByLabel`
13
- * when search errors, is unavailable, or returns **nothing** (same
14
- * try/catch pattern as `TicketGateway.getTickets`).
15
- * - The narrowing query is deliberately weak (Story #4541). GitHub ANDs
16
- * free-text terms, so the former 8-token query demanded that a candidate
17
- * contain all eight of a multi-sentence seed's longest words — which no
18
- * real Story does. Gate #1 duplicate triage therefore reported "no
19
- * candidates" on every realistic seed while looking perfectly healthy.
20
- * Search is now a cheap best-case narrowing over a handful of tokens; an
21
- * empty result is treated as "search did not help", not "no duplicates",
22
- * and falls through to the label listing whose Jaccard ranker has real
23
- * recall.
24
- * - Scoring is intentionally simple (token Jaccard over title + body).
25
- * It is a triage signal, not a semantic-search replacement.
26
- * - Provider errors on the list fallback propagate verbatim — the
27
- * caller is responsible for translating them into a friction comment
28
- * or operator-visible failure.
2
+ * duplicate-search.js — rank open Stories overlapping a planning seed (token
3
+ * Jaccard over title + body: a triage signal, not semantic search). List
4
+ * fallback errors propagate verbatim to the caller.
29
5
  */
30
6
 
31
7
  import { Logger } from './Logger.js';
@@ -88,23 +64,11 @@ const STOPWORDS = new Set([
88
64
 
89
65
  const DEFAULT_MIN_SCORE = 0.15;
90
66
  const DEFAULT_MAX_RESULTS = 5;
91
- /**
92
- * How many seed tokens to pass as free-text search terms.
93
- *
94
- * GitHub ANDs these, so the cap is a precision/recall dial pointing the
95
- * wrong way: every extra token shrinks the candidate set. Three is a
96
- * best-case narrowing that can plausibly hit on a focused seed; anything
97
- * beyond that reliably matched nothing on a multi-sentence one (Story
98
- * #4541). Recall does not rest on this number — an empty result falls back
99
- * to label-listing plus client-side ranking.
100
- */
67
+ /** GitHub ANDs terms, so more tokens match nothing; recall is the fallback's. */
101
68
  const DEFAULT_SEARCH_TOKEN_CAP = 3;
102
- /** Hard cap on search hits ranked client-side (~one Search API page). */
103
69
  const SEARCH_RESULT_CAP = 100;
104
70
 
105
71
  /**
106
- * Tokenize freeform text into a deduplicated set of meaningful words.
107
- *
108
72
  * @param {string} text
109
73
  * @returns {Set<string>}
110
74
  */
@@ -119,8 +83,7 @@ export function tokenize(text) {
119
83
  }
120
84
 
121
85
  /**
122
- * Pick the highest-signal seed tokens for a Search API free-text query.
123
- * Longer tokens first (specificity proxy), then alphabetical for stability.
86
+ * Longest first (specificity), then alphabetical.
124
87
  *
125
88
  * @param {string} seed
126
89
  * @param {number} [maxTokens]
@@ -134,9 +97,6 @@ export function pickSearchTokens(seed, maxTokens = DEFAULT_SEARCH_TOKEN_CAP) {
134
97
  }
135
98
 
136
99
  /**
137
- * Build the `/search/issues` query for open Stories overlapping a seed.
138
- * Repo scoping is left to `provider.searchIssues`.
139
- *
140
100
  * @param {string} seed
141
101
  * @returns {string}
142
102
  */
@@ -146,8 +106,6 @@ export function buildOpenStorySearchQuery(seed) {
146
106
  }
147
107
 
148
108
  /**
149
- * Compute the Jaccard overlap between two token sets.
150
- *
151
109
  * @param {Set<string>} a
152
110
  * @param {Set<string>} b
153
111
  * @returns {number} 0..1
@@ -161,9 +119,6 @@ export function overlapScore(a, b) {
161
119
  }
162
120
 
163
121
  /**
164
- * Build the issue URL for an id. The candidate exposes the URL so the
165
- * HITL pause can render clickable links without a second round-trip.
166
- *
167
122
  * @param {number|string} id
168
123
  * @param {{ owner?: string, repo?: string }} [opts]
169
124
  * @returns {string}
@@ -178,8 +133,6 @@ function buildIssueUrl(id, opts = {}) {
178
133
  }
179
134
 
180
135
  /**
181
- * Normalize a provider issue (list or search hit) into the ranking shape.
182
- *
183
136
  * @param {object} issue
184
137
  * @returns {{ id: number, title: string, body: string, url?: string }}
185
138
  */
@@ -193,9 +146,6 @@ function normalizeIssue(issue) {
193
146
  }
194
147
 
195
148
  /**
196
- * Rank a pre-fetched open-Story list against a seed corpus.
197
- * Pure helper shared by the provider-backed search and tests.
198
- *
199
149
  * @param {{
200
150
  * seed: string,
201
151
  * openStories: Array<{ id:number, title?:string, body?:string, url?:string }>,
@@ -253,8 +203,6 @@ function rankOpenStoryDuplicates({
253
203
  }
254
204
 
255
205
  /**
256
- * Server-narrowed open-Story fetch via `/search/issues`.
257
- *
258
206
  * @param {object} provider
259
207
  * @param {string} seed
260
208
  * @returns {Promise<Array<{ id:number, title:string, body:string, url?:string }>>}
@@ -267,8 +215,6 @@ async function fetchOpenStoriesViaSearch(provider, seed) {
267
215
  }
268
216
 
269
217
  /**
270
- * Full open-Story backlog via label listing (fallback path).
271
- *
272
218
  * @param {object} provider
273
219
  * @returns {Promise<Array<{ id:number, title:string, body:string, url?:string }>>}
274
220
  */
@@ -287,16 +233,9 @@ async function fetchOpenStoriesViaList(provider) {
287
233
  }
288
234
 
289
235
  /**
290
- * Fetch open-Story candidates: try Search API narrowing first, fall back to
291
- * `listIssuesByLabel` when search errors, is unavailable, or **returns no
292
- * hits**.
293
- *
294
- * The empty-result fallback is the load-bearing one (Story #4541). The
295
- * narrowing query ANDs seed tokens, so on any real multi-sentence seed it
296
- * matches nothing — and treating that as an authoritative "no duplicates
297
- * exist" is what made Gate #1 triage report a clean bill of health while
298
- * never actually looking. An empty search is evidence about the *query*, not
299
- * about the backlog.
236
+ * Search first; fall back to the label listing when search errors, is
237
+ * unavailable, or returns no hits. An empty search is evidence about the
238
+ * AND-ed query, not about the backlog.
300
239
  *
301
240
  * @param {object} provider
302
241
  * @param {string} seed
@@ -337,9 +276,6 @@ async function fetchOpenStoryCandidates(provider, seed) {
337
276
  }
338
277
 
339
278
  /**
340
- * Find open Stories whose title + body overlap with the supplied seed
341
- * above a configurable threshold.
342
- *
343
279
  * @param {{
344
280
  * seed: string,
345
281
  * provider: import('./ITicketingProvider.js').ITicketingProvider,
@@ -3,21 +3,9 @@ import path from 'node:path';
3
3
  import { Logger } from './Logger.js';
4
4
 
5
5
  /**
6
- * Parse the right-hand side of a `KEY=` line into its value.
7
- *
8
- * Two rules, and the quoting decides which one applies:
9
- *
10
- * - **Quoted** (`"…"` / `'…'`): the contents between the opening quote and
11
- * its matching closing quote are kept **verbatim** — a `#` inside quotes is
12
- * part of the value, not a comment. Anything after the closing quote is
13
- * trailing commentary and is discarded.
14
- * - **Unquoted**: the value ends at the first **unescaped** `#`. A `\#`
15
- * escape emits a literal `#` and keeps the scan going, so a value that
16
- * genuinely contains a hash can still be written without quotes.
17
- *
18
- * An opening quote with no closing partner is not a quoted value — it falls
19
- * through to the unquoted rule so a malformed line still yields something
20
- * rather than swallowing the rest of the file's intent.
6
+ * Quoted values are kept verbatim up to the matching quote (text after it is
7
+ * dropped); unquoted values end at the first unescaped `#` (`\#` is a
8
+ * literal). An unclosed quote falls through to the unquoted rule.
21
9
  *
22
10
  * @param {string} raw — the text after the `=`, unparsed.
23
11
  * @returns {string} The value with any inline comment removed.
@@ -29,7 +17,6 @@ function parseEnvValue(raw) {
29
17
  const quote = trimmed.charAt(0);
30
18
  if (quote === '"' || quote === "'") {
31
19
  const closing = trimmed.indexOf(quote, 1);
32
- // Verbatim contents: no comment stripping, no unescaping.
33
20
  if (closing !== -1) return trimmed.slice(1, closing);
34
21
  }
35
22
 
@@ -47,23 +34,14 @@ function parseEnvValue(raw) {
47
34
  return value.trim();
48
35
  }
49
36
 
50
- /**
51
- * Auto-load .env from the project root if it exists
52
- */
53
37
  export function loadEnv(projectRoot) {
54
38
  const envPath = path.resolve(projectRoot, '.env');
55
39
  let envContent;
56
40
  try {
57
- // Read directly rather than existsSync + readFileSync: the latter is a
58
- // TOCTOU race (the file can vanish between the two calls) and double-stats
59
- // the path. A single read with code-based error handling is both correct
60
- // and cheaper.
41
+ // A single read, not existsSync + read, avoids a TOCTOU race.
61
42
  envContent = fs.readFileSync(envPath, 'utf8');
62
43
  } catch (err) {
63
- // A missing .env is the expected case — environment may be provided via
64
- // other means, so stay silent. Any other failure (permissions, a
65
- // directory in place of the file, I/O error) is worth surfacing so the
66
- // operator gets a one-line hint instead of an opaque silent skip.
44
+ // A missing .env is expected; anything else deserves a one-line hint.
67
45
  if (err.code !== 'ENOENT') {
68
46
  Logger.warn(
69
47
  `env-loader: failed to read ${envPath} (${err.code ?? err.message}); skipping .env load.`,
@@ -1,13 +1,6 @@
1
1
  /**
2
- * Story #1651 (CWE-209): error-envelope redactor for CLI scripts.
3
- *
4
- * Rewrites absolute filesystem paths to repo-relative form, elides
5
- * `$HOME` / `$USERPROFILE` segments outside the repo, and scrubs
6
- * token-shaped substrings before error envelopes hit the public CI log.
7
- *
8
- * Pure and dependency-free so callers (tests, ad-hoc loggers, the
9
- * runAsCli default handler) can reuse it without standing up the rest
10
- * of the cli-utils harness.
2
+ * Error-envelope redactor (CWE-209): repo-relative paths, elided home dir,
3
+ * scrubbed token-shaped strings. Dependency-free.
11
4
  */
12
5
 
13
6
  import path from 'node:path';
@@ -16,10 +9,7 @@ import { fileURLToPath } from 'node:url';
16
9
  const REPO_ROOT_CACHE = { value: null };
17
10
 
18
11
  /**
19
- * Resolve the repository root the redactor rewrites against. The
20
- * heuristic walks up from this file's directory; consumers may override
21
- * via the `repoRoot` option on `redactErrorMessage`. The result is
22
- * memoised because the redactor runs in the hot path of error-printing.
12
+ * Memoised — the redactor runs on the error-printing hot path.
23
13
  *
24
14
  * @returns {string}
25
15
  */
@@ -34,10 +24,7 @@ export function resolveRepoRoot() {
34
24
  const TOKEN_SHAPED = /\b(?:gh[pousr]_[A-Za-z0-9_]{20,}|[A-Fa-f0-9]{32,})\b/g;
35
25
 
36
26
  /**
37
- * Normalise both Windows-style and POSIX-style absolute paths in
38
- * `message` to repo-relative form, elide `$HOME` / `$USERPROFILE`
39
- * outside the repo, and scrub token-shaped substrings (`ghp_*`,
40
- * `gho_*`, `ghs_*`, `ghu_*`, `ghr_*`, 32+ hex chars).
27
+ * Handles both Windows and POSIX path separators.
41
28
  *
42
29
  * @param {string|undefined} message
43
30
  * @param {object} [options]
@@ -80,15 +67,8 @@ function pathVariants(p) {
80
67
  }
81
68
 
82
69
  /**
83
- * Determine whether error-message redaction is enabled for this process.
84
- *
85
- * Precedence (any one is enough to opt in):
86
- * 1. Explicit `--quiet-errors` flag in `argv`.
87
- * 2. `AGENT_CLI_QUIET_ERRORS=1` (or `true`) in `env`.
88
- * 3. `CI=true` (or any other truthy non-empty value) in `env`.
89
- *
90
- * Operator workstations stay verbose by default; CI runs (where logs
91
- * are public on OSS forks) get redaction automatically.
70
+ * On with `--quiet-errors`, `AGENT_CLI_QUIET_ERRORS`, or a truthy `CI` —
71
+ * CI logs are public on OSS forks; workstations stay verbose.
92
72
  *
93
73
  * @param {string[]} [argv] Defaults to `process.argv.slice(2)`.
94
74
  * @param {NodeJS.ProcessEnv} [env] Defaults to `process.env`.
@@ -111,11 +91,6 @@ function isTruthyEnv(value) {
111
91
  }
112
92
 
113
93
  /**
114
- * Format a thrown error for stderr, applying redaction when
115
- * `parseQuietErrorsFlag()` says we should. Extracted from `runAsCli` so
116
- * the cli-utils default error handler stays a single expression and the
117
- * redaction logic lives next to the redactor itself.
118
- *
119
94
  * @param {unknown} err
120
95
  * @returns {string}
121
96
  */
@@ -1,10 +1,4 @@
1
- /**
2
- * lib/errors/ — canonical home for custom Error subclasses used by the
3
- * orchestration SDK.
4
- *
5
- * Consumers import by class so tests can match on `instanceof` rather than
6
- * message substrings.
7
- */
1
+ /** Custom Error subclasses; match on `instanceof`, not message text. */
8
2
 
9
3
  class ConflictingTypeLabelsError extends Error {
10
4
  constructor(message) {
@@ -21,12 +15,6 @@ export class ValidationError extends Error {
21
15
  }
22
16
  }
23
17
 
24
- /**
25
- * Errors raised by the `gh` CLI bridge (currently the bootstrap preflight;
26
- * later the `lib/gh-exec.js` shim outlined in Tech Spec #1350). Tests
27
- * match on `instanceof` rather than message substrings so message text
28
- * can evolve without churning the assertions.
29
- */
30
18
  export class GhNotInstalledError extends Error {
31
19
  constructor(message = 'gh CLI is not installed or not on PATH') {
32
20
  super(message);
@@ -49,15 +37,7 @@ export class GhVersionError extends Error {
49
37
  }
50
38
  }
51
39
 
52
- /**
53
- * Raised when a framework runtime dependency (e.g. `ajv`) cannot be
54
- * resolved from the consumer's `node_modules/`. Surfaces during the
55
- * `agents-bootstrap-github` preflight to redirect operators to the
56
- * correct remediation (`mandrel init` for new projects, or
57
- * `npm install mandrel` for existing ones). `missing` carries the
58
- * package specifiers that failed to resolve so the CLI can render an
59
- * actionable hint.
60
- */
40
+ /** A runtime dep (e.g. `ajv`) did not resolve; `missing` names the specifiers. */
61
41
  export class MissingRuntimeDepsError extends Error {
62
42
  constructor(message, details = {}) {
63
43
  super(message);