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,12 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The engine's job is to *report on* the baseline surface, including the
|
|
6
|
-
* parts of it that are missing or malformed. So no read here throws: a
|
|
7
|
-
* missing file, an unreadable directory, or a JSON parse error is evidence
|
|
8
|
-
* the envelope carries, not a crash. Nothing in this module opens a file for
|
|
9
|
-
* writing — the read-only invariant over `baselines/` starts here.
|
|
2
|
+
* Tolerant, strictly read-only fs access: a missing or malformed file is
|
|
3
|
+
* evidence for the envelope, never a throw.
|
|
10
4
|
*
|
|
11
5
|
* @module lib/audit-baselines/read
|
|
12
6
|
*/
|
|
@@ -15,8 +9,6 @@ import fs from 'node:fs';
|
|
|
15
9
|
import path from 'node:path';
|
|
16
10
|
|
|
17
11
|
/**
|
|
18
|
-
* Read and parse a JSON file without throwing.
|
|
19
|
-
*
|
|
20
12
|
* @param {string} absolutePath
|
|
21
13
|
* @returns {{ exists: boolean, parsed: object | null, parseError: string | null }}
|
|
22
14
|
*/
|
|
@@ -39,10 +31,6 @@ export function readJsonFile(absolutePath) {
|
|
|
39
31
|
}
|
|
40
32
|
|
|
41
33
|
/**
|
|
42
|
-
* List every file under `rootDir` as a posix repo-relative path, skipping
|
|
43
|
-
* `node_modules`, `.git`, and `.worktrees`. Returns `[]` for an absent or
|
|
44
|
-
* unreadable root rather than throwing.
|
|
45
|
-
*
|
|
46
34
|
* @param {string} repoRoot
|
|
47
35
|
* @param {string} rootDir repo-relative directory to walk
|
|
48
36
|
* @returns {string[]} sorted repo-relative posix paths
|
|
@@ -72,8 +60,7 @@ export function listFilesUnder(repoRoot, rootDir) {
|
|
|
72
60
|
}
|
|
73
61
|
|
|
74
62
|
/**
|
|
75
|
-
*
|
|
76
|
-
* absent or unparseable — the engine reports "unknown", never a fabricated 0.
|
|
63
|
+
* Whole days; `null` (unknown) rather than a fabricated 0.
|
|
77
64
|
*
|
|
78
65
|
* @param {unknown} generatedAt
|
|
79
66
|
* @param {Date} now
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* staleness
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `coverage.json` and `maintainability.json` both read `staleDays: 0` while
|
|
6
|
-
* already predating merges that had rescored files they still carry rows for:
|
|
7
|
-
* refreshed an hour ago, and behind already. The second clock is the one that
|
|
8
|
-
* matters — how many commits have touched the **measured surface** since the
|
|
9
|
-
* baseline was last committed. A baseline older than the surface it scores is
|
|
10
|
-
* stale at zero wall-clock days.
|
|
11
|
-
*
|
|
12
|
-
* Read-only and degrading, like the rest of this engine: a shallow clone, an
|
|
13
|
-
* untracked baseline, or a surface that is not path-keyed all report `null`.
|
|
14
|
-
* Unknown is never rounded down to a reassuring 0.
|
|
2
|
+
* Baseline staleness on two clocks: wall-clock age, and commits touching the
|
|
3
|
+
* measured surface since the baseline was committed — a baseline behind its
|
|
4
|
+
* surface is stale at zero days. Unknown reports `null`, never a reassuring 0.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/staleness
|
|
17
7
|
*/
|
|
@@ -21,9 +11,7 @@ import { KIND_SPECS } from './kinds.js';
|
|
|
21
11
|
import { ageInDays } from './read.js';
|
|
22
12
|
|
|
23
13
|
/**
|
|
24
|
-
*
|
|
25
|
-
* failure or empty result. Buffer and shell policy come from the shared
|
|
26
|
-
* child-process surface ([`child-exec.js`](../child-exec.js)).
|
|
14
|
+
* Trimmed stdout, or `null` on failure or empty output.
|
|
27
15
|
*
|
|
28
16
|
* @param {string[]} args
|
|
29
17
|
* @param {{ cwd: string, run?: Function }} io
|
|
@@ -45,11 +33,8 @@ function git(args, { cwd, run }) {
|
|
|
45
33
|
}
|
|
46
34
|
|
|
47
35
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* ids — which are file paths for every kind but `lighthouse` (routes) and
|
|
51
|
-
* `bundle-size` (bundle names). Those two get an empty surface rather than a
|
|
52
|
-
* route name handed to git as a pathspec.
|
|
36
|
+
* `targetDirs`, else path-keyed row ids; non-path kinds get an empty surface
|
|
37
|
+
* rather than a bundle name as a git pathspec.
|
|
53
38
|
*
|
|
54
39
|
* @param {{ kind: string, gateBlock: object | null, rows: Array<{id: string}> }} args
|
|
55
40
|
* @returns {string[]}
|
|
@@ -64,9 +49,7 @@ function measuredSurfaceOf({ kind, gateBlock, rows }) {
|
|
|
64
49
|
}
|
|
65
50
|
|
|
66
51
|
/**
|
|
67
|
-
*
|
|
68
|
-
* empty surface yields `null` too: nothing was checked, so nothing can be
|
|
69
|
-
* claimed.
|
|
52
|
+
* Empty surface → `null`: nothing checked, nothing claimed.
|
|
70
53
|
*
|
|
71
54
|
* @param {{ relPath: string, surfacePaths: string[], io: object }} args
|
|
72
55
|
* @returns {number | null}
|
|
@@ -84,8 +67,6 @@ function commitsSinceBaseline({ relPath, surfacePaths, io }) {
|
|
|
84
67
|
}
|
|
85
68
|
|
|
86
69
|
/**
|
|
87
|
-
* The four staleness fields of one `gateSurface[]` entry, on both clocks.
|
|
88
|
-
*
|
|
89
70
|
* @param {{
|
|
90
71
|
* kind: string, gateBlock: object | null, rows: Array<{id: string}>,
|
|
91
72
|
* relPath: string, baseline: object | null, now: Date,
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* A baseline review that only reads the numbers cannot see the failure mode
|
|
6
|
-
* that matters most: an instrument that is not measuring anything. A gate can
|
|
7
|
-
* be unconfigured, its baseline file can be missing, it can be a **stub**
|
|
8
|
-
* (committed with no rows and an all-zero rollup, so it passes every run
|
|
9
|
-
* vacuously), it can be stale on either clock, and its `ignoreGlobs` can name
|
|
10
|
-
* paths that no longer exist — each of which reads as "green" from the gate's
|
|
11
|
-
* exit code. This module turns all of that into declarative fields for one
|
|
12
|
-
* kind; [`gate-surface.js`](gate-surface.js) walks the kinds and
|
|
13
|
-
* [`staleness.js`](staleness.js) owns the two clocks.
|
|
2
|
+
* Health of one measuring instrument: unconfigured, missing, stub, stale, or
|
|
3
|
+
* dead `ignoreGlobs` — each of which reads green from the gate's exit code.
|
|
14
4
|
*
|
|
15
5
|
* @module lib/audit-baselines/surface-entry
|
|
16
6
|
*/
|
|
@@ -20,9 +10,7 @@ import { GATE_KINDS, KIND_SPECS, measuredTotalOf, rollupOf } from './kinds.js';
|
|
|
20
10
|
import { stalenessOf } from './staleness.js';
|
|
21
11
|
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
24
|
-
* numeric leaves at all is not all-zero — it carries no measurement to call
|
|
25
|
-
* zero, and treating it as such would flag shapes this engine cannot read.
|
|
13
|
+
* A rollup with no numeric leaves is not all-zero.
|
|
26
14
|
*
|
|
27
15
|
* @param {object | null} rollup
|
|
28
16
|
* @returns {boolean}
|
|
@@ -34,10 +22,8 @@ function isAllZeroRollup(rollup) {
|
|
|
34
22
|
}
|
|
35
23
|
|
|
36
24
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* allowlist — genuinely zero cycles, the success state — is never mistaken
|
|
40
|
-
* for a dead instrument.
|
|
25
|
+
* Zero rows AND an all-zero rollup, so a clean ratchet (no rollup) is never
|
|
26
|
+
* called a stub.
|
|
41
27
|
*
|
|
42
28
|
* @param {{ rowCount: number, rollup: object | null }} args
|
|
43
29
|
* @returns {boolean}
|
|
@@ -47,11 +33,9 @@ function isStubInstrument({ rowCount, rollup }) {
|
|
|
47
33
|
}
|
|
48
34
|
|
|
49
35
|
/**
|
|
50
|
-
* Which of a gate's configured `ignoreGlobs` match zero files on disk.
|
|
51
|
-
*
|
|
52
36
|
* @param {string[]} ignoreGlobs
|
|
53
37
|
* @param {string[]} files repo-relative posix paths
|
|
54
|
-
* @returns {string[]}
|
|
38
|
+
* @returns {string[]} globs matching zero files
|
|
55
39
|
*/
|
|
56
40
|
function findDeadIgnoreGlobs(ignoreGlobs, files) {
|
|
57
41
|
const dead = [];
|
|
@@ -64,12 +48,7 @@ function findDeadIgnoreGlobs(ignoreGlobs, files) {
|
|
|
64
48
|
}
|
|
65
49
|
|
|
66
50
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* `rowCount` and `measured` both appear because they legitimately disagree:
|
|
70
|
-
* rows are counted after the kind's per-file aggregation, while `measured` is
|
|
71
|
-
* the quantity the instrument reports in its own unit — 589 dead-export
|
|
72
|
-
* symbols sit in 187 files.
|
|
51
|
+
* `rowCount` (per-file) and `measured` (own unit) legitimately differ.
|
|
73
52
|
*
|
|
74
53
|
* @param {{
|
|
75
54
|
* kind: string, quality: object, read: object, relPath: string,
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* history
|
|
4
|
-
*
|
|
5
|
-
* A ratchet only tells you whether today is worse than yesterday. The
|
|
6
|
-
* question a baseline review asks is the other one: which direction has this
|
|
7
|
-
* number been moving, and is the ratchet actually ratcheting? That answer is
|
|
8
|
-
* already committed — every baseline refresh is a commit against the same
|
|
9
|
-
* path — so it is read with `git log` + `git show`, never recomputed by
|
|
10
|
-
* re-running an instrument.
|
|
11
|
-
*
|
|
12
|
-
* Degradation: any git failure (shallow clone, no history for the path, not
|
|
13
|
-
* a work tree) yields an empty `trend[]` and exit 0. A missing history is
|
|
14
|
-
* missing evidence, not an error.
|
|
2
|
+
* Per-kind rollup direction of travel, read from each baseline's own git
|
|
3
|
+
* history — never recomputed. Any git failure yields no trend entry: missing
|
|
4
|
+
* history is missing evidence, not an error.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/trend
|
|
17
7
|
*/
|
|
@@ -20,7 +10,7 @@ import { execFileCapture } from '../child-exec.js';
|
|
|
20
10
|
import { trendRollupOf } from './kinds.js';
|
|
21
11
|
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
13
|
+
* Newest first.
|
|
24
14
|
*
|
|
25
15
|
* @param {{ cwd: string, relPath: string, limit: number, run?: Function }} args
|
|
26
16
|
* @returns {Array<{ sha: string, committedAt: string }>}
|
|
@@ -47,8 +37,6 @@ function listCommits({ cwd, relPath, limit, run }) {
|
|
|
47
37
|
}
|
|
48
38
|
|
|
49
39
|
/**
|
|
50
|
-
* Read the comparable rollup of a baseline as it existed at `sha`.
|
|
51
|
-
*
|
|
52
40
|
* @param {{ cwd: string, kind: string, sha: string, relPath: string, run?: Function }} args
|
|
53
41
|
* @returns {object | null}
|
|
54
42
|
*/
|
|
@@ -71,9 +59,8 @@ function rollupAt({ cwd, kind, sha, relPath, run }) {
|
|
|
71
59
|
}
|
|
72
60
|
|
|
73
61
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* delta on it, and inventing one would read as a regression.
|
|
62
|
+
* `to - from` per axis; an axis missing on either side is omitted, since an
|
|
63
|
+
* invented delta would read as a regression.
|
|
77
64
|
*
|
|
78
65
|
* @param {object} from
|
|
79
66
|
* @param {object} to
|
|
@@ -91,7 +78,7 @@ function rollupDelta(from, to) {
|
|
|
91
78
|
}
|
|
92
79
|
|
|
93
80
|
/**
|
|
94
|
-
*
|
|
81
|
+
* Newest-vs-previous rollup deltas per kind.
|
|
95
82
|
*
|
|
96
83
|
* @param {{
|
|
97
84
|
* cwd: string, kinds: string[], pathFor: (kind: string) => string,
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (
|
|
4
|
-
*
|
|
5
|
-
* A hotspot's severity says how bad the code measures. These three say how
|
|
6
|
-
* much that badness costs: how often the file changes (churn), how much of
|
|
7
|
-
* the repository depends on it (import in-degree), and how often agents have
|
|
8
|
-
* actually tripped over it (friction signals).
|
|
9
|
-
*
|
|
10
|
-
* All three are **optional inputs**. A shallow clone has no git history, a
|
|
11
|
-
* fresh checkout has no friction ledger, and a consumer whose sources live
|
|
12
|
-
* outside the scanned roots has no resolvable import graph. Each degrades to
|
|
13
|
-
* a neutral multiplier of exactly 1.0 — never 0 (which would erase the
|
|
14
|
-
* hotspot) and never a guess. The engine exits 0 in every degraded case.
|
|
2
|
+
* Hotspot ranking multipliers — churn, import in-degree, friction signals.
|
|
3
|
+
* Each input is optional and degrades to exactly 1.0: never 0 (which would
|
|
4
|
+
* erase the hotspot), never a guess.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/weights
|
|
17
7
|
*/
|
|
@@ -21,14 +11,11 @@ import path from 'node:path';
|
|
|
21
11
|
import { execFileCapture } from '../child-exec.js';
|
|
22
12
|
import { computeInDegree, resolveRepoGraph } from '../import-graph.js';
|
|
23
13
|
|
|
24
|
-
/** Neutral multiplier every degraded weight collapses to. */
|
|
25
14
|
const NEUTRAL_WEIGHT = 1.0;
|
|
26
15
|
|
|
27
16
|
/**
|
|
28
|
-
* Saturating count →
|
|
29
|
-
*
|
|
30
|
-
* same number — the degradation is indistinguishable from an honest zero,
|
|
31
|
-
* which is the point: neither should move the ranking.
|
|
17
|
+
* Saturating count → `[1, 2)`; zero equals the degraded weight, so neither
|
|
18
|
+
* moves the ranking.
|
|
32
19
|
*
|
|
33
20
|
* @param {number} count
|
|
34
21
|
* @param {number} half count at which the multiplier reaches 1.5
|
|
@@ -40,12 +27,10 @@ function saturate(count, half) {
|
|
|
40
27
|
}
|
|
41
28
|
|
|
42
29
|
/**
|
|
43
|
-
*
|
|
30
|
+
* Commits per file in the window; `degraded` when git cannot answer at all.
|
|
44
31
|
*
|
|
45
32
|
* @param {{ cwd: string, windowDays?: number, run?: Function }} args
|
|
46
33
|
* @returns {{ counts: Map<string, number>, degraded: boolean }}
|
|
47
|
-
* `degraded` is true when git could not answer at all — not a git work
|
|
48
|
-
* tree, no commits yet, or the binary is unavailable.
|
|
49
34
|
*/
|
|
50
35
|
export function readChurn({ cwd, windowDays = 180, run }) {
|
|
51
36
|
let stdout;
|
|
@@ -62,8 +47,7 @@ export function readChurn({ cwd, windowDays = 180, run }) {
|
|
|
62
47
|
{
|
|
63
48
|
run,
|
|
64
49
|
cwd,
|
|
65
|
-
//
|
|
66
|
-
// reported in the envelope, not shouted at the operator.
|
|
50
|
+
// Degradation is reported in the envelope, not on stderr.
|
|
67
51
|
stdio: ['ignore', 'pipe', 'ignore'],
|
|
68
52
|
},
|
|
69
53
|
);
|
|
@@ -80,8 +64,6 @@ export function readChurn({ cwd, windowDays = 180, run }) {
|
|
|
80
64
|
}
|
|
81
65
|
|
|
82
66
|
/**
|
|
83
|
-
* Import in-degree per module, keyed by repo-relative posix path.
|
|
84
|
-
*
|
|
85
67
|
* @param {{ cwd: string, graph?: Map<string, string[]> | null }} args
|
|
86
68
|
* @returns {{ degrees: Map<string, number>, degraded: boolean }}
|
|
87
69
|
*/
|
|
@@ -91,12 +73,9 @@ export function readCentrality({ cwd, graph }) {
|
|
|
91
73
|
return { degrees: computeInDegree(resolved), degraded: false };
|
|
92
74
|
}
|
|
93
75
|
|
|
94
|
-
/** Path tokens that look like repository files, harvested from signal text. */
|
|
95
76
|
const PATH_TOKEN_RE = /[\w@][\w./@-]*\.(?:js|mjs|cjs|ts|tsx|json|md)\b/g;
|
|
96
77
|
|
|
97
78
|
/**
|
|
98
|
-
* Collect every `signals.ndjson` under `tempRoot`. Absent tree → empty list.
|
|
99
|
-
*
|
|
100
79
|
* @param {string} tempRootAbs
|
|
101
80
|
* @returns {string[]} absolute paths
|
|
102
81
|
*/
|
|
@@ -121,12 +100,8 @@ function findSignalStreams(tempRootAbs) {
|
|
|
121
100
|
}
|
|
122
101
|
|
|
123
102
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* Signal records carry no dedicated path field — the blamed file surfaces
|
|
127
|
-
* inside free-form `details` / `emitter.command` text — so paths are
|
|
128
|
-
* harvested by token scan over each record's serialized form. A malformed
|
|
129
|
-
* line is skipped, never fatal.
|
|
103
|
+
* Friction signals per blamed file. Records have no path field, so paths are
|
|
104
|
+
* token-scanned from `details` / `emitter.command`; bad lines are skipped.
|
|
130
105
|
*
|
|
131
106
|
* @param {{ tempRootAbs: string, kinds?: Set<string> }} args
|
|
132
107
|
* @returns {{ counts: Map<string, number>, degraded: boolean, streams: number }}
|
|
@@ -167,9 +142,6 @@ export function readFriction({
|
|
|
167
142
|
}
|
|
168
143
|
|
|
169
144
|
/**
|
|
170
|
-
* Bundle the three weight lookups into one resolver the hotspot builder can
|
|
171
|
-
* call per cluster id, plus the degradation flags the envelope reports.
|
|
172
|
-
*
|
|
173
145
|
* @param {{
|
|
174
146
|
* churn: { counts: Map<string, number>, degraded: boolean },
|
|
175
147
|
* centrality: { degrees: Map<string, number>, degraded: boolean },
|
|
@@ -1,31 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The manifest is shipped framework configuration resolved from one fixed
|
|
6
|
-
* path per process, and the shape-derivation path reads it once per Story at
|
|
7
|
-
* resolve AND persist — an un-memoized read is pure repeated I/O (measured
|
|
8
|
-
* 221 µs/op raw vs 5.5 µs seamed on the run adhoc-4722-4723 audit). Only a
|
|
9
|
-
* successful parse is cached: a read failure stays a per-call throw so a
|
|
10
|
-
* caller can observe a manifest that becomes readable later. Tests never
|
|
11
|
-
* reach this read — they inject fixture rules through the callers'
|
|
12
|
-
* `injectedRules` seam.
|
|
2
|
+
* The one synchronous `audit-rules.json` reader, memoized per process. Only a
|
|
3
|
+
* successful parse is cached, so a failure stays a per-call throw and a
|
|
4
|
+
* manifest that later becomes readable is seen.
|
|
13
5
|
*/
|
|
14
6
|
|
|
15
7
|
import { readFileSync } from 'node:fs';
|
|
16
8
|
import path from 'node:path';
|
|
17
9
|
import { getPaths, PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
18
10
|
|
|
19
|
-
/** Process-lifetime memo of the parsed manifest (successful parses only). */
|
|
20
11
|
let auditRulesCache = null;
|
|
21
12
|
|
|
22
13
|
/**
|
|
23
|
-
* Read and parse the `audit-rules.json` manifest synchronously from the
|
|
24
|
-
* project's configured `schemasRoot`. Shared by the synchronous, ticket-free
|
|
25
|
-
* readers (`resolveLensTier`, `selectLocalLenses`,
|
|
26
|
-
* `selectSensitivePathClasses`) so the path resolution and read-failure
|
|
27
|
-
* handling live in one place rather than being duplicated per reader.
|
|
28
|
-
*
|
|
29
14
|
* @returns {{ audits?: Record<string, object> }} Parsed manifest.
|
|
30
15
|
* @throws {Error} When the manifest cannot be read or parsed.
|
|
31
16
|
*/
|
|
@@ -1,39 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Given a Story's predicted footprint (its `changes[]` / `references[]` path
|
|
6
|
-
* list), select the distilled authoring checklists for the **footprint-matched
|
|
7
|
-
* LOCAL lenses only** and assemble them into one payload the dispatch/hydrator
|
|
8
|
-
* seam threads into the Story maker prompt. This moves each local-lens concern
|
|
9
|
-
* to the innermost, write-time tier so makers author against it on fresh
|
|
10
|
-
* context instead of paying an Epic-close remediation loop on stale context.
|
|
11
|
-
*
|
|
12
|
-
* Matching is the **light** path, deliberately NOT `selectAudits`:
|
|
13
|
-
* - tier gate — a lens is in scope only when `resolveLensTier(lens) ===
|
|
14
|
-
* 'local'` (the pure `scope`-field read; cumulative/global
|
|
15
|
-
* lenses are owned by the Epic-close tier, never threaded
|
|
16
|
-
* here).
|
|
17
|
-
* - file gate — the pure `matchesAnyFilePattern` matcher runs the lens's
|
|
18
|
-
* own `triggers.filePatterns` (from `audit-rules.json`)
|
|
19
|
-
* against the predicted footprint.
|
|
20
|
-
*
|
|
21
|
-
* `selectAudits` is the wrong tool here: it is gate-aware and provider-backed
|
|
22
|
-
* (it reads the ticket through an `ITicketingProvider` and diffs the working
|
|
23
|
-
* tree via `git`). The write-time path has a *predicted* footprint, not a git
|
|
24
|
-
* diff, and no ticket to fetch — so this module reaches for the two pure
|
|
25
|
-
* primitives directly and never touches a provider or `git`. That purity is
|
|
26
|
-
* load-bearing (asserted by the test): the threading path must be a pure
|
|
27
|
-
* function of the footprint and the on-disk manifest/checklists.
|
|
28
|
-
*
|
|
29
|
-
* A hard token budget caps the assembled payload. When the matched lenses'
|
|
30
|
-
* checklists together exceed the budget, the payload is truncated
|
|
31
|
-
* deterministically (a stable prefix in {@link AUDIT_LENSES} order is kept;
|
|
32
|
-
* the overflowing tail is dropped) and every dropped lens is logged so the
|
|
33
|
-
* elision is never silent.
|
|
34
|
-
*
|
|
35
|
-
* Pure (modulo the default disk reads for `audit-rules.json` and the checklist
|
|
36
|
-
* artifacts, both injectable seams). No git, no provider, no network.
|
|
2
|
+
* Write-time checklists for LOCAL lenses matching a predicted footprint,
|
|
3
|
+
* under a token budget. Not `selectAudits`: this must stay a pure function of
|
|
4
|
+
* footprint + on-disk files — no git, provider, or network (tested).
|
|
37
5
|
*/
|
|
38
6
|
|
|
39
7
|
import fs from 'node:fs';
|
|
@@ -48,11 +16,7 @@ import {
|
|
|
48
16
|
} from './selector.js';
|
|
49
17
|
|
|
50
18
|
/**
|
|
51
|
-
*
|
|
52
|
-
* deterministic — this budget is the one surviving ceiling that speaks in
|
|
53
|
-
* tokens (Story #5312 deleted the plan-time sizing ceilings that shared the
|
|
54
|
-
* estimator), so the approximation matters far less than the payload and
|
|
55
|
-
* the cap agreeing on one number.
|
|
19
|
+
* ~4 chars per token; what matters is that payload and cap agree on one number.
|
|
56
20
|
*
|
|
57
21
|
* @param {string} text
|
|
58
22
|
* @returns {number}
|
|
@@ -62,24 +26,14 @@ function estimateTokens(text) {
|
|
|
62
26
|
}
|
|
63
27
|
|
|
64
28
|
/**
|
|
65
|
-
*
|
|
66
|
-
* above ({@link estimateTokens}). Generous
|
|
67
|
-
* relative to the real checklist sizes (each distilled lens checklist is
|
|
68
|
-
* ~130–190 tokens, and at most the seven local lenses can match), so a normal
|
|
69
|
-
* Story is never truncated — the cap is a safety ceiling against a pathological
|
|
70
|
-
* footprint that matches every local lens, not a routine squeeze. Callers may
|
|
71
|
-
* override per-invocation via `tokenBudget`.
|
|
29
|
+
* Safety ceiling, not a routine squeeze: all seven local lenses together fit.
|
|
72
30
|
*/
|
|
73
31
|
export const DEFAULT_CHECKLIST_TOKEN_BUDGET = 4000;
|
|
74
32
|
|
|
75
|
-
/** Separator between concatenated per-lens checklist sections. */
|
|
76
33
|
const SECTION_SEPARATOR = '\n\n';
|
|
77
34
|
|
|
78
35
|
/**
|
|
79
|
-
*
|
|
80
|
-
* name. The taxonomy in {@link AUDIT_LENSES} carries bare names (`clean-code`);
|
|
81
|
-
* the manifest and the tier resolver key off the `audit-`-prefixed form
|
|
82
|
-
* (`audit-clean-code`).
|
|
36
|
+
* Manifest key for a bare taxonomy lens name (`clean-code` → `audit-clean-code`).
|
|
83
37
|
*
|
|
84
38
|
* @param {string} lens
|
|
85
39
|
* @returns {string}
|
|
@@ -89,13 +43,9 @@ function lensKeyFor(lens) {
|
|
|
89
43
|
}
|
|
90
44
|
|
|
91
45
|
/**
|
|
92
|
-
*
|
|
93
|
-
* SSOT the generator writes to (`generate-lens-checklists.js` →
|
|
94
|
-
* `<agentRoot>/audit-checklists/<lens>.md`), resolved through the same
|
|
95
|
-
* `agentRoot` the rest of the config surface uses so a consumer that relocates
|
|
96
|
-
* `.agents` reads its checklists from the relocated tree.
|
|
46
|
+
* `<agentRoot>/audit-checklists`, honouring a relocated agent root.
|
|
97
47
|
*
|
|
98
|
-
* @param {object} [config]
|
|
48
|
+
* @param {object} [config]
|
|
99
49
|
* @returns {string}
|
|
100
50
|
*/
|
|
101
51
|
function checklistsDir(config = resolveConfig()) {
|
|
@@ -107,12 +57,9 @@ function checklistsDir(config = resolveConfig()) {
|
|
|
107
57
|
}
|
|
108
58
|
|
|
109
59
|
/**
|
|
110
|
-
*
|
|
111
|
-
* and {@link resolveLensTier} consume), resolved through the configured
|
|
112
|
-
* `schemasRoot`. Synchronous — this is a pure-ish read with no git and no
|
|
113
|
-
* provider.
|
|
60
|
+
* Parse `audit-rules.json` from the configured `schemasRoot`.
|
|
114
61
|
*
|
|
115
|
-
* @param {object} [config]
|
|
62
|
+
* @param {object} [config]
|
|
116
63
|
* @returns {{ audits?: Record<string, { triggers?: { filePatterns?: string[] } }> }}
|
|
117
64
|
*/
|
|
118
65
|
export function readAuditRules(config = resolveConfig()) {
|
|
@@ -125,12 +72,6 @@ export function readAuditRules(config = resolveConfig()) {
|
|
|
125
72
|
}
|
|
126
73
|
|
|
127
74
|
/**
|
|
128
|
-
* The `triggers.filePatterns` a lens declares in the manifest, or `[]` when
|
|
129
|
-
* the lens declares none. (`audit-clean-code` carries the universal
|
|
130
|
-
* match-everything glob, so it footprint-matches every non-empty change
|
|
131
|
-
* set — the selector.js twin comment documents the same post-#4405
|
|
132
|
-
* follow-up fix.)
|
|
133
|
-
*
|
|
134
75
|
* @param {object} rules parsed `audit-rules.json`.
|
|
135
76
|
* @param {string} lens canonical lens name.
|
|
136
77
|
* @returns {string[]}
|
|
@@ -140,9 +81,6 @@ function filePatternsFor(rules, lens) {
|
|
|
140
81
|
}
|
|
141
82
|
|
|
142
83
|
/**
|
|
143
|
-
* The full `triggers` block a lens declares in the manifest (or `undefined`).
|
|
144
|
-
* Used to read non-glob trigger fields (e.g. `sourceWithoutSiblingTest`).
|
|
145
|
-
*
|
|
146
84
|
* @param {object} rules parsed `audit-rules.json`.
|
|
147
85
|
* @param {string} lens canonical lens name.
|
|
148
86
|
* @returns {object|undefined}
|
|
@@ -152,10 +90,6 @@ function triggerFor(rules, lens) {
|
|
|
152
90
|
}
|
|
153
91
|
|
|
154
92
|
/**
|
|
155
|
-
* Normalize a predicted footprint into a clean path list. Accepts a plain
|
|
156
|
-
* `string[]` (the shape the caller derives from a Story's `changes[]` /
|
|
157
|
-
* `references[]` entries); drops empty and non-string entries.
|
|
158
|
-
*
|
|
159
93
|
* @param {unknown} footprint
|
|
160
94
|
* @returns {string[]}
|
|
161
95
|
*/
|
|
@@ -168,21 +102,13 @@ function normalizeFootprint(footprint) {
|
|
|
168
102
|
}
|
|
169
103
|
|
|
170
104
|
/**
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* contract — `resolveLensTier(lens) === 'local'` for the tier gate plus the
|
|
174
|
-
* pure `matchesAnyFilePattern` matcher for the file gate — with no provider and
|
|
175
|
-
* no git diff.
|
|
176
|
-
*
|
|
177
|
-
* A lens whose tier cannot be resolved (not registered / malformed scope) is
|
|
178
|
-
* skipped rather than allowed to throw the whole selection; the generator and
|
|
179
|
-
* schema keep the manifest well-formed, so this only guards against drift.
|
|
105
|
+
* LOCAL lenses matching the footprint, in {@link AUDIT_LENSES} order. A lens
|
|
106
|
+
* whose tier cannot be resolved is skipped rather than failing the selection.
|
|
180
107
|
*
|
|
181
108
|
* @param {object} params
|
|
182
109
|
* @param {string[]} params.footprint predicted footprint path list.
|
|
183
|
-
* @param {object} [params.rules] parsed `audit-rules.json
|
|
184
|
-
* @param {(lens: string) => string} [params.resolveTier]
|
|
185
|
-
* (injectable seam; defaults to {@link resolveLensTier}).
|
|
110
|
+
* @param {object} [params.rules] parsed `audit-rules.json`.
|
|
111
|
+
* @param {(lens: string) => string} [params.resolveTier]
|
|
186
112
|
* @returns {string[]} matched local lens names, in taxonomy order.
|
|
187
113
|
*/
|
|
188
114
|
export function matchLocalLenses({
|
|
@@ -206,9 +132,8 @@ export function matchLocalLenses({
|
|
|
206
132
|
const patterns = filePatternsFor(rules, lens);
|
|
207
133
|
const fileMatch =
|
|
208
134
|
patterns.length > 0 && matchesAnyFilePattern(patterns, paths);
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
// that ships without a test is reminded of the quality lens up front.
|
|
135
|
+
// Same sibling-test predicate as the selector: a source change without a
|
|
136
|
+
// test gets the quality checklist up front.
|
|
212
137
|
const siblingMatch =
|
|
213
138
|
triggerFor(rules, lens)?.sourceWithoutSiblingTest === true &&
|
|
214
139
|
changeSetLacksSiblingTest(paths);
|
|
@@ -218,13 +143,9 @@ export function matchLocalLenses({
|
|
|
218
143
|
}
|
|
219
144
|
|
|
220
145
|
/**
|
|
221
|
-
* Default checklist reader: read `<agentRoot>/audit-checklists/<lens>.md`.
|
|
222
|
-
* Returns `null` when the artifact is absent (a matched lens with no committed
|
|
223
|
-
* checklist), so the caller skips it rather than crashing.
|
|
224
|
-
*
|
|
225
146
|
* @param {string} lens
|
|
226
147
|
* @param {object} [config]
|
|
227
|
-
* @returns {string|null}
|
|
148
|
+
* @returns {string|null} `null` when the checklist artifact is absent
|
|
228
149
|
*/
|
|
229
150
|
function readChecklistFile(lens, config = resolveConfig()) {
|
|
230
151
|
const file = path.join(checklistsDir(config), `${lens}.md`);
|
|
@@ -236,31 +157,16 @@ function readChecklistFile(lens, config = resolveConfig()) {
|
|
|
236
157
|
}
|
|
237
158
|
|
|
238
159
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* Returns the assembled payload string plus the accounting the caller (and the
|
|
242
|
-
* test) asserts against: which lenses were included, which were dropped by the
|
|
243
|
-
* budget, the full matched set, and the payload's estimated token count.
|
|
244
|
-
*
|
|
245
|
-
* Truncation is deterministic prefix truncation: lenses are considered in
|
|
246
|
-
* stable {@link AUDIT_LENSES} order and appended while the running payload
|
|
247
|
-
* estimate stays within `tokenBudget`; the first lens that would overflow — and
|
|
248
|
-
* every remaining matched lens — is dropped, and the drop is logged. The
|
|
249
|
-
* returned `payload` therefore always satisfies
|
|
250
|
-
* `estimateTokens(payload) <= tokenBudget`.
|
|
160
|
+
* Prefix truncation: the first overflowing lens and all later ones are
|
|
161
|
+
* dropped and logged.
|
|
251
162
|
*
|
|
252
163
|
* @param {object} params
|
|
253
|
-
* @param {string[]} params.footprint predicted footprint
|
|
254
|
-
*
|
|
255
|
-
* @param {
|
|
256
|
-
*
|
|
257
|
-
* @param {
|
|
258
|
-
* @param {(
|
|
259
|
-
* (injectable seam).
|
|
260
|
-
* @param {(lens: string) => (string|null)} [params.readChecklist] checklist
|
|
261
|
-
* reader (injectable seam; defaults to the on-disk reader).
|
|
262
|
-
* @param {{ warn?: (msg: string) => void }} [params.logger] logger for the drop
|
|
263
|
-
* record (defaults to {@link Logger}).
|
|
164
|
+
* @param {string[]} params.footprint predicted footprint path list.
|
|
165
|
+
* @param {number} [params.tokenBudget]
|
|
166
|
+
* @param {object} [params.rules] parsed `audit-rules.json`.
|
|
167
|
+
* @param {(lens: string) => string} [params.resolveTier]
|
|
168
|
+
* @param {(lens: string) => (string|null)} [params.readChecklist]
|
|
169
|
+
* @param {{ warn?: (msg: string) => void }} [params.logger]
|
|
264
170
|
* @returns {{
|
|
265
171
|
* payload: string,
|
|
266
172
|
* includedLenses: string[],
|
|
@@ -294,9 +200,7 @@ export function buildChecklistPayload({
|
|
|
294
200
|
const lens = matchedLenses[i];
|
|
295
201
|
const content = readChecklist(lens);
|
|
296
202
|
if (content == null) {
|
|
297
|
-
//
|
|
298
|
-
// budget drop). The generator keeps every lens's checklist in tree, so
|
|
299
|
-
// this only trips on drift, which we surface rather than swallow.
|
|
203
|
+
// Missing artifact is drift, not a budget drop: surface and skip.
|
|
300
204
|
logger?.warn?.(
|
|
301
205
|
`[checklist-threading] no checklist artifact for matched local lens '${lens}' — skipping`,
|
|
302
206
|
);
|
|
@@ -306,8 +210,6 @@ export function buildChecklistPayload({
|
|
|
306
210
|
const trimmed = content.trim();
|
|
307
211
|
const candidate = [...sections, trimmed].join(SECTION_SEPARATOR);
|
|
308
212
|
if (estimateTokens(candidate) > tokenBudget) {
|
|
309
|
-
// Deterministic prefix truncation: this lens and every remaining matched
|
|
310
|
-
// lens are dropped, keeping the payload within budget.
|
|
311
213
|
droppedLenses.push(...matchedLenses.slice(i));
|
|
312
214
|
break;
|
|
313
215
|
}
|