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.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- 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
|
-
}
|