mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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
- }