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,452 +0,0 @@
1
- /**
2
- * knip-entry-sync.js — derive which top-level `.agents/scripts/*.js` CLIs are
3
- * actually invoked, and diff that set against the `entry` array of whatever
4
- * configuration knip itself would load (Story #5039; #5026 could only read a
5
- * literal `knip.json`).
6
- *
7
- * Why this exists (Story #5001 → the #5012 near-miss):
8
- *
9
- * #5001 replaced the blanket `.agents/scripts/*.js!` entry glob with an
10
- * explicit list, precisely so that a top-level CLI **nothing invokes** stops
11
- * being declared live by the glob and surfaces as dead. It simultaneously
12
- * promoted knip's `files` rule to `error`, so whole-file death now produces
13
- * `{ file, symbol: '*' }` baseline rows.
14
- *
15
- * That pairing has a silent failure mode. A CLI added *after* #5001 is not in
16
- * the hand-written list, so knip reads it as unreachable and emits a whole-file
17
- * row for it — plus transitive rows for every lib module only that CLI imports.
18
- * During #5012's delivery this produced 5 false rows (`check-baseline-scope.js`,
19
- * `prune-baseline-orphans.js`, and their three `lib/baselines/*` modules). The
20
- * natural remedy — accept the ratchet's diff — would have permanently recorded
21
- * live, working operator CLIs as expected-dead, blinding the ratchet to their
22
- * real death later. It was caught only because a base-sync conflict forced a
23
- * manual read of the diff.
24
- *
25
- * The fix is to stop depending on a human remembering to edit the config.
26
- * #5001's own wording already names the derivation rule — entries are derived
27
- * "from what package.json scripts, husky hooks, .github/workflows, and the
28
- * .agents workflow/skill markdown actually invoke". This module mechanizes
29
- * exactly that rule and asserts it in both directions:
30
- *
31
- * missing — invoked by a real caller but absent from `entry`. This is the
32
- * #5012 bug: knip will call it dead and the ratchet will offer to record
33
- * the lie.
34
- * stale — listed in `entry` but invoked by nothing. This is the blind spot
35
- * #5001 closed: a declared entry point is immortal, so its death can never
36
- * surface.
37
- *
38
- * Deliberately NOT a filesystem-derived list. Restoring `.agents/scripts/*.js!`
39
- * — or regenerating the array from `readdirSync` — would make every file live
40
- * by construction and undo #5001's AC-2. Liveness here means *invoked*, not
41
- * *present*.
42
- *
43
- * Deliberately NOT conferred by documentation prose. `.agents/docs/**` and
44
- * `docs/**` describe operator-run commands; a paragraph naming a CLI is not a
45
- * caller. Three CLIs are named only in prose today
46
- * (`check-baseline-drift.js`, `post-structured-comment.js`,
47
- * `provision-git-hooks.js`) and #5001 recorded all of them as whole-file dead
48
- * rows on purpose. Counting prose would silently resurrect them.
49
- *
50
- * A CLI that is only *imported* by another script (`cleanup-repo-test-temp.js`,
51
- * imported by `run-tests.js` and `run-coverage.js`) is correctly neither: it is
52
- * reachable through the module graph from a real entry, so knip already sees it
53
- * and it must not be declared an entry point of its own.
54
- */
55
-
56
- import fs from 'node:fs';
57
- import path from 'node:path';
58
- import {
59
- resolveKnipEntryPatterns,
60
- __testing as resolverTesting,
61
- } from './knip-config-resolver.js';
62
- import { stripJsComments } from './source-text/strip-js-comments.js';
63
-
64
- // Only `resolveEntrySync` and `renderEntrySyncReport` are public — they are
65
- // what `check-knip-entries.js` calls. Everything else is module-private and
66
- // reached by the suite through the `__testing` bundle at the foot of this file,
67
- // the same seam `source-classifier.js` and five sibling modules use. Exporting
68
- // the internals individually would put seven test-only symbols on the
69
- // production dead-export baseline and make private helpers look like API.
70
-
71
- /** Top-level CLI directory, repo-relative. */
72
- const SCRIPTS_DIR = path.join('.agents', 'scripts');
73
-
74
- /**
75
- * Executable surfaces — a mention of a CLI here is an instruction to run it.
76
- *
77
- * `dirs` entries are walked recursively and filtered by `test`. `files` are
78
- * read directly. Documentation trees are absent by design (see module header).
79
- *
80
- * @type {ReadonlyArray<{ kind: 'file' | 'dir', at: string, test?: RegExp }>}
81
- */
82
- const INVOCATION_SURFACES = Object.freeze([
83
- { kind: 'file', at: 'package.json' },
84
- { kind: 'dir', at: '.husky', test: /^(?!.*[/\\]_[/\\]).*$/ },
85
- { kind: 'dir', at: path.join('.github', 'workflows'), test: /\.ya?ml$/ },
86
- { kind: 'dir', at: path.join('.agents', 'workflows'), test: /\.md$/ },
87
- { kind: 'dir', at: path.join('.agents', 'skills'), test: /\.md$/ },
88
- { kind: 'dir', at: path.join('.agents', 'agents'), test: /\.md$/ },
89
- { kind: 'dir', at: path.join('.agents', 'rules'), test: /\.md$/ },
90
- { kind: 'dir', at: SCRIPTS_DIR, test: /\.js$/ },
91
- ]);
92
-
93
- /**
94
- * Recursively list files under `dir`, skipping `node_modules` and `.git`.
95
- *
96
- * @param {string} dir absolute path
97
- * @param {typeof fs} fsImpl
98
- * @param {string[]} [acc]
99
- * @returns {string[]} absolute file paths
100
- */
101
- function walk(dir, fsImpl, acc = []) {
102
- let entries;
103
- try {
104
- entries = fsImpl.readdirSync(dir, { withFileTypes: true });
105
- } catch {
106
- return acc;
107
- }
108
- for (const entry of entries) {
109
- const full = path.join(dir, entry.name);
110
- if (entry.isDirectory()) {
111
- if (entry.name === 'node_modules' || entry.name === '.git') continue;
112
- walk(full, fsImpl, acc);
113
- } else {
114
- acc.push(full);
115
- }
116
- }
117
- return acc;
118
- }
119
-
120
- /**
121
- * Read every executable surface under `repoRoot`.
122
- *
123
- * `.js` surfaces arrive comment-stripped; every other surface arrives verbatim.
124
- * Test files are excluded: a test importing or naming a CLI does not make it
125
- * invoked, which is the same test-only-importer discount `--production` applies
126
- * to the dead-exports ratchet itself.
127
- *
128
- * @param {{ repoRoot: string, fsImpl?: typeof fs }} opts
129
- * @returns {Array<{ path: string, text: string }>} repo-relative path + content
130
- */
131
- function collectInvocationSurfaces({ repoRoot, fsImpl = fs }) {
132
- const surfaces = [];
133
- const push = (absolute) => {
134
- const rel = path.relative(repoRoot, absolute);
135
- if (rel.includes('__tests__') || /\.test\.[cm]?js$/.test(rel)) return;
136
- let text;
137
- try {
138
- text = fsImpl.readFileSync(absolute, 'utf8');
139
- } catch {
140
- return;
141
- }
142
- surfaces.push({
143
- path: rel.split(path.sep).join('/'),
144
- text: rel.endsWith('.js') ? stripJsComments(text) : text,
145
- });
146
- };
147
-
148
- for (const surface of INVOCATION_SURFACES) {
149
- const absolute = path.join(repoRoot, surface.at);
150
- if (surface.kind === 'file') {
151
- push(absolute);
152
- continue;
153
- }
154
- for (const file of walk(absolute, fsImpl)) {
155
- const rel = path.relative(repoRoot, file);
156
- if (surface.test && !surface.test.test(rel)) continue;
157
- push(file);
158
- }
159
- }
160
- return surfaces;
161
- }
162
-
163
- /**
164
- * Build the two recognizers for one CLI basename.
165
- *
166
- * `pathLiteral` — the CLI named by its repo path (`.agents/scripts/foo.js`),
167
- * in either separator style. This is how package.json scripts, husky hooks,
168
- * workflow `run:` blocks and workflow markdown spell an invocation.
169
- *
170
- * `joinedSpawn` — the CLI named by bare basename as the tail of a
171
- * `path.join(…, 'scripts', 'foo.js')` construction, which is how
172
- * `lib/bootstrap/project-bootstrap.js` spawns `check-windows-git-perf.js`
173
- * into a consumer checkout. Requiring the `'scripts'` sibling argument is
174
- * what separates a real spawn from the several *data* inventories that list
175
- * the same basenames as plain array elements (`source-classifier.js`'s
176
- * `FRAMEWORK_SCRIPT_BASENAMES`, `check-lifecycle-lint.js`'s allowlist) —
177
- * those are catalogues of names, not calls.
178
- *
179
- * @param {string} cli basename, e.g. `check-dead-exports.js`
180
- * @returns {{ pathLiteral: RegExp, joinedSpawn: RegExp }}
181
- */
182
- function buildInvocationPatterns(cli) {
183
- const escaped = cli.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
184
- return {
185
- pathLiteral: new RegExp(`\\.agents[/\\\\]scripts[/\\\\]${escaped}`),
186
- joinedSpawn: new RegExp(
187
- `['"\`]scripts['"\`]\\s*,\\s*['"\`]${escaped}['"\`]`,
188
- ),
189
- };
190
- }
191
-
192
- /**
193
- * List the top-level CLI basenames actually present in `.agents/scripts/`.
194
- *
195
- * @param {{ repoRoot: string, fsImpl?: typeof fs }} opts
196
- * @returns {string[]} sorted basenames
197
- */
198
- function listTopLevelClis({ repoRoot, fsImpl = fs }) {
199
- let entries;
200
- try {
201
- entries = fsImpl.readdirSync(path.join(repoRoot, SCRIPTS_DIR), {
202
- withFileTypes: true,
203
- });
204
- } catch {
205
- return [];
206
- }
207
- return entries
208
- .filter((e) => e.isFile() && e.name.endsWith('.js'))
209
- .map((e) => e.name)
210
- .sort();
211
- }
212
-
213
- /**
214
- * Read the `.agents/scripts/*.js` basenames declared as knip entry points.
215
- *
216
- * Resolution goes through knip's own loader — see
217
- * `knip-config-resolver.js` for why, and for the skipped / error / resolved
218
- * contract this forwards. All this adds is the projection onto top-level CLI
219
- * basenames: glob-bearing patterns are dropped, so what remains is the explicit
220
- * enumeration #5001 made authoritative.
221
- *
222
- * The trailing `!` is knip's production-mode marker and is load-bearing, not
223
- * decoration: in a `--production` run knip keeps only the suffixed entries and
224
- * *negates* the rest (`WorkspaceWorker`'s `hasProductionSuffix` /
225
- * `hasNoProductionSuffix` split). So an entry written without it leaves the CLI
226
- * unreachable in exactly the pass that emits whole-file rows — the #5012 shape
227
- * this gate exists to catch. Reading it as satisfied would point the operator
228
- * away from the cause, so unsuffixed entries are reported as their own
229
- * divergence rather than silently normalized. `createOptions` preserves the
230
- * suffix, so the marker survives resolution.
231
- *
232
- * @param {{ repoRoot: string, loadKnipSession?: () => Promise<object> }} opts
233
- * @returns {Promise<{
234
- * entries: string[],
235
- * unsuffixed: string[],
236
- * configFilePath: string | null,
237
- * skipped: string | null,
238
- * error: string | null,
239
- * }>}
240
- */
241
- async function readKnipEntries({ repoRoot, loadKnipSession }) {
242
- const { patterns, configFilePath, skipped, error } =
243
- await resolveKnipEntryPatterns({ repoRoot, loadKnipSession });
244
- if (skipped || error) {
245
- return { entries: [], unsuffixed: [], configFilePath, skipped, error };
246
- }
247
-
248
- const prefix = '.agents/scripts/';
249
- const declared = patterns
250
- .filter((e) => e.startsWith(prefix) && !e.includes('*'))
251
- .map((e) => ({
252
- cli: e.slice(prefix.length).replace(/!$/, ''),
253
- suffixed: e.endsWith('!'),
254
- }))
255
- .filter((e) => !e.cli.includes('/'));
256
-
257
- return {
258
- entries: [...new Set(declared.map((e) => e.cli))].sort(),
259
- unsuffixed: [
260
- ...new Set(declared.filter((e) => !e.suffixed).map((e) => e.cli)),
261
- ].sort(),
262
- configFilePath,
263
- skipped: null,
264
- error: null,
265
- };
266
- }
267
-
268
- /**
269
- * Resolve the full entry-sync report for a repository.
270
- *
271
- * Async because knip's config loader is: a `knip.config.ts` has to be
272
- * *evaluated*, not read. `EntrySync` names entry-list synchronization, not
273
- * synchronous I/O, so the name still describes what this returns.
274
- *
275
- * @param {{
276
- * repoRoot: string,
277
- * fsImpl?: typeof fs,
278
- * loadKnipSession?: () => Promise<object>,
279
- * }} opts
280
- * @returns {Promise<{
281
- * error: string | null,
282
- * skipped: string | null,
283
- * configFilePath: string | null,
284
- * clis: string[],
285
- * declared: string[],
286
- * missing: Array<{ cli: string, invokers: string[] }>,
287
- * stale: string[],
288
- * phantom: string[],
289
- * unsuffixed: string[],
290
- * }>}
291
- * `skipped` — nothing to check; the caller passes rather than failing.
292
- * `missing` — invoked but not declared (the #5012 bug).
293
- * `stale` — declared but invoked by nothing.
294
- * `phantom` — declared but no such file on disk (a rename left the list behind).
295
- * `unsuffixed` — declared without the `!` production marker, which knip's
296
- * production pass negates rather than honours (the #5012 bug wearing a
297
- * declared entry).
298
- */
299
- export async function resolveEntrySync({
300
- repoRoot,
301
- fsImpl = fs,
302
- loadKnipSession,
303
- }) {
304
- const {
305
- entries: declared,
306
- unsuffixed,
307
- configFilePath,
308
- skipped,
309
- error,
310
- } = await readKnipEntries({ repoRoot, loadKnipSession });
311
- const empty = {
312
- skipped: null,
313
- configFilePath,
314
- clis: [],
315
- declared,
316
- missing: [],
317
- stale: [],
318
- phantom: [],
319
- unsuffixed: [],
320
- };
321
- if (skipped) return { error: null, ...empty, skipped };
322
- if (error) return { error, ...empty };
323
-
324
- const clis = listTopLevelClis({ repoRoot, fsImpl });
325
- if (clis.length === 0) {
326
- return { error: `no CLIs found under ${SCRIPTS_DIR}`, ...empty };
327
- }
328
- const surfaces = collectInvocationSurfaces({ repoRoot, fsImpl });
329
- const declaredSet = new Set(declared);
330
-
331
- const missing = [];
332
- const stale = [];
333
- for (const cli of clis) {
334
- const self = `${SCRIPTS_DIR.split(path.sep).join('/')}/${cli}`;
335
- const { pathLiteral, joinedSpawn } = buildInvocationPatterns(cli);
336
- const invokers = surfaces
337
- .filter(
338
- (s) =>
339
- s.path !== self &&
340
- (pathLiteral.test(s.text) ||
341
- (s.path.endsWith('.js') && joinedSpawn.test(s.text))),
342
- )
343
- .map((s) => s.path);
344
- const isDeclared = declaredSet.has(cli);
345
- if (invokers.length > 0 && !isDeclared) missing.push({ cli, invokers });
346
- if (invokers.length === 0 && isDeclared) stale.push(cli);
347
- }
348
-
349
- const onDisk = new Set(clis);
350
- const phantom = declared.filter((cli) => !onDisk.has(cli));
351
-
352
- return {
353
- error: null,
354
- skipped: null,
355
- configFilePath,
356
- clis,
357
- declared,
358
- missing,
359
- stale,
360
- phantom,
361
- unsuffixed,
362
- };
363
- }
364
-
365
- /**
366
- * Total divergences across every direction. Single source of the gate's
367
- * pass/fail arithmetic so a newly added direction cannot be counted in the
368
- * report but missed by the exit code.
369
- *
370
- * @param {ReturnType<typeof resolveEntrySync>} report
371
- * @returns {number}
372
- */
373
- export function countDivergences(report) {
374
- return (
375
- report.missing.length +
376
- report.stale.length +
377
- report.phantom.length +
378
- report.unsuffixed.length
379
- );
380
- }
381
-
382
- /**
383
- * Render the human-readable report. Each divergence names its own remedy —
384
- * the whole point of the gate is that the *wrong* remedy (accepting the
385
- * dead-exports ratchet's diff) is the tempting one.
386
- *
387
- * @param {ReturnType<typeof resolveEntrySync>} report
388
- * @returns {string}
389
- */
390
- export function renderEntrySyncReport(report) {
391
- const lines = [];
392
- for (const { cli, invokers } of report.missing) {
393
- lines.push(
394
- `+ ${cli} — invoked by ${invokers.slice(0, 3).join(', ')}${
395
- invokers.length > 3 ? ` (+${invokers.length - 3} more)` : ''
396
- }`,
397
- );
398
- lines.push(
399
- ` add ".agents/scripts/${cli}!" to knip.json "entry" — until you do, knip`,
400
- );
401
- lines.push(
402
- ' reads it as unreachable and check-dead-exports will offer a false whole-file row.',
403
- );
404
- }
405
- for (const cli of report.stale) {
406
- lines.push(
407
- `- ${cli} — declared in knip.json "entry" but nothing invokes it`,
408
- );
409
- lines.push(
410
- ' remove the entry so its death can surface, or wire up the caller.',
411
- );
412
- }
413
- for (const cli of report.phantom) {
414
- lines.push(`? ${cli} — declared in knip.json "entry" but not on disk`);
415
- lines.push(' drop the stale path (the file was renamed or removed).');
416
- }
417
- for (const cli of report.unsuffixed) {
418
- lines.push(`! ${cli} — declared in knip.json "entry" without a "!" suffix`);
419
- lines.push(
420
- ` write it as ".agents/scripts/${cli}!" — the production pass negates an`,
421
- );
422
- lines.push(
423
- ' unsuffixed entry, so knip still reads the CLI as unreachable.',
424
- );
425
- }
426
- const total = countDivergences(report);
427
- lines.push(
428
- `[knip-entries] clis=${report.clis.length} declared=${report.declared.length} ` +
429
- `missing=${report.missing.length} stale=${report.stale.length} ` +
430
- `phantom=${report.phantom.length} unsuffixed=${report.unsuffixed.length} ` +
431
- `${total > 0 ? '(gate fail)' : '(ok)'}`,
432
- );
433
- return lines.join('\n');
434
- }
435
-
436
- /**
437
- * Test-only seam. Not API: these helpers are exercised directly by
438
- * `tests/check-knip-entries.test.js` so the recognizers can be pinned
439
- * independently of a full fixture tree.
440
- */
441
- export const __testing = Object.freeze({
442
- buildInvocationPatterns,
443
- // Re-exported from `knip-config-resolver.js` so the suite reaches the whole
444
- // gate through one seam rather than importing two modules to test one gate.
445
- collectEntryPatterns: resolverTesting.collectEntryPatterns,
446
- collectInvocationSurfaces,
447
- INVOCATION_SURFACES,
448
- listTopLevelClis,
449
- readKnipEntries,
450
- SCRIPTS_DIR,
451
- stripJsComments,
452
- });
@@ -1,88 +0,0 @@
1
- /**
2
- * pinned-override-notes.js — keep a load-bearing dependency note honest.
3
- *
4
- * `package.json` carries a `"//"` block of prose notes keyed by dotted config
5
- * path. Two of them are safety notes about a pinned `overrides` entry: they
6
- * record WHY the pin exists, which advisories removing it reintroduces, and
7
- * that the `overrides` range and the direct `dependencies` range MUST move in
8
- * lockstep because npm has no way to reference one from the other.
9
- *
10
- * A note like that is consulted precisely when someone is deciding whether a
11
- * bump is safe — so a stale version inside it hands out wrong premises about
12
- * a coupling the note itself calls a trap. Nothing enforced either claim, and
13
- * both had drifted: the note described `^4.2.0` while the pin had moved twice.
14
- *
15
- * This module derives the checks from the `"//"` keys themselves rather than
16
- * naming any package, so a second pinned override gets the same guarantee by
17
- * writing its note.
18
- */
19
-
20
- /** A `"//"` key that documents a pinned override, e.g. `overrides.js-yaml`. */
21
- const OVERRIDE_NOTE_KEY = /^overrides\.(.+)$/;
22
-
23
- import { resolvePin, scoreNote } from './pinned-override-resolve.js';
24
-
25
- /**
26
- * Audit one package document's pinned-override notes.
27
- *
28
- * Findings per documented override, each naming the drift rather than just
29
- * asserting a mismatch:
30
- * - `lockstep` — `overrides.<name>` and `dependencies.<name>` disagree. The
31
- * companion note declares they must not; a split silently gives the
32
- * direct and transitive resolutions different floors.
33
- * - `stale-note` — the note quotes at least one range but not the one in
34
- * force, so its stated version is behind the pin it describes. A note
35
- * quoting no range at all is not scored: prose that names no version
36
- * cannot go stale.
37
- * - `unsupported-shape` — the note's key resolves to something that is not a
38
- * range (a nested override object, or a `$name` reference to a dependency
39
- * that does not exist). Distinct from `orphan-note`: the pin is *there*,
40
- * the note just does not name it, and telling an author to "delete the note
41
- * or restore the pin" would be wrong advice.
42
- *
43
- * @param {{ '//'?: Record<string,string>, overrides?: Record<string,string>, dependencies?: Record<string,string> }} pkg
44
- * @returns {{ findings: Array<{ kind: string, name: string, detail: string }>, checked: string[] }}
45
- */
46
- export function auditPinnedOverrideNotes(pkg) {
47
- const overrides = pkg?.overrides ?? {};
48
- const dependencies = pkg?.dependencies ?? {};
49
- const findings = [];
50
- const checked = [];
51
-
52
- for (const { key, name, text } of documentedOverrides(pkg)) {
53
- const resolved = resolvePin({ overrides, dependencies, name });
54
- if (isCheckable(resolved)) checked.push(name);
55
- findings.push(
56
- ...scoreNote({ key, name, text, resolved, direct: dependencies[name] }),
57
- );
58
- }
59
-
60
- return { findings, checked };
61
- }
62
-
63
- /**
64
- * The `"//"` entries that document an override, as `{ key, name, text }`.
65
- * Every other note in the block — a peer-dependency rationale, say — is not
66
- * this gate's business and is skipped rather than scored.
67
- *
68
- * @param {object} pkg
69
- * @returns {Array<{ key: string, name: string, text: unknown }>}
70
- */
71
- function documentedOverrides(pkg) {
72
- return Object.entries(pkg?.['//'] ?? {})
73
- .map(([key, text]) => ({ key, text, match: OVERRIDE_NOTE_KEY.exec(key) }))
74
- .filter((entry) => entry.match !== null)
75
- .map(({ key, text, match }) => ({ key, text, name: match[1] }));
76
- }
77
-
78
- /**
79
- * Was the note's override resolved to a range at all? Only then does the name
80
- * belong in `checked` — the list is what tells a caller which pins this gate
81
- * actually stands behind.
82
- *
83
- * @param {{ kind: string }} resolved
84
- * @returns {boolean}
85
- */
86
- function isCheckable(resolved) {
87
- return resolved.kind !== 'missing' && resolved.kind !== 'unsupported';
88
- }