mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +83 -239
- 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 +136 -486
- 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 +25 -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,211 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// .agents/scripts/check-baseline-drift.js — scheduled full-scope baseline
|
|
4
|
-
// drift check (Story #4776).
|
|
5
|
-
//
|
|
6
|
-
// The three per-PR enforcement sites (close-validation, pre-push, CI) are all
|
|
7
|
-
// diff-scoped: they compare the files a branch touched against their committed
|
|
8
|
-
// baseline rows. A file nobody touches after its row is written is therefore
|
|
9
|
-
// never re-scored, so drift introduced indirectly — a dependency getting more
|
|
10
|
-
// complex, coverage moving underneath a method — stays invisible indefinitely.
|
|
11
|
-
//
|
|
12
|
-
// This CLI is the periodic full-scope counterpart. It re-scores every target
|
|
13
|
-
// directory through the same scorer that writes the baseline, prints a per-row
|
|
14
|
-
// before/after table for everything that moved beyond the gate's tolerance,
|
|
15
|
-
// and exits non-zero when it finds any — so a consumer can wire it as a
|
|
16
|
-
// scheduled CI job without wrapping it in verdict-parsing glue. This repo
|
|
17
|
-
// schedules the maintainability kind in `.github/workflows/baseline-drift.yml`;
|
|
18
|
-
// a consumer materializing `.agents/` still owns its own schedule.
|
|
19
|
-
//
|
|
20
|
-
// `--require-scored` exists because the default skip-is-green contract below
|
|
21
|
-
// is a fail-open trap for exactly that scheduled use. Measured on this repo:
|
|
22
|
-
// `check-baseline-drift.js --gate crap` with no `coverage/coverage-final.json`
|
|
23
|
-
// present prints "✅ No baseline drift detected" and exits 0 — a nightly job
|
|
24
|
-
// wired that way reports green while having measured nothing. The flag turns
|
|
25
|
-
// every skip into exit 2, so a job that asked for a kind and did not get it
|
|
26
|
-
// reds instead.
|
|
27
|
-
//
|
|
28
|
-
// Exit codes:
|
|
29
|
-
// 0 — no drift (or every kind skipped: disabled gate, no baseline, no scorer)
|
|
30
|
-
// 1 — drift detected in at least one kind
|
|
31
|
-
// 2 — the check itself could not run (including: a requested kind was
|
|
32
|
-
// skipped and `--require-scored` was passed)
|
|
33
|
-
|
|
34
|
-
// Fail-fast if the framework's runtime deps are not installed — must be the
|
|
35
|
-
// first import so the check runs before any third-party-importing sibling
|
|
36
|
-
// module is evaluated (Story #3432).
|
|
37
|
-
import './lib/runtime-deps/ensure-installed.js';
|
|
38
|
-
import {
|
|
39
|
-
DRIFT_KINDS,
|
|
40
|
-
detectBaselineDrift,
|
|
41
|
-
formatDriftReport,
|
|
42
|
-
} from './lib/baselines/drift-detector.js';
|
|
43
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
44
|
-
|
|
45
|
-
export const HELP_TEXT = `Usage: node .agents/scripts/check-baseline-drift.js [options]
|
|
46
|
-
|
|
47
|
-
Re-score the configured baselines FULL-SCOPE and report every row whose
|
|
48
|
-
current score has drifted from its committed baseline by more than the
|
|
49
|
-
gate's tolerance — including files untouched by any recent diff, which the
|
|
50
|
-
diff-scoped gates structurally cannot see.
|
|
51
|
-
|
|
52
|
-
Options:
|
|
53
|
-
--gate <kind> Restrict to one kind (repeatable). Default: ${DRIFT_KINDS.join(', ')}.
|
|
54
|
-
--tolerance <n> Override the per-gate absolute tolerance.
|
|
55
|
-
--require-scored Treat a skipped kind (gate disabled, no baseline, no
|
|
56
|
-
scorer, nothing scored) as a failure rather than a pass.
|
|
57
|
-
Use this in scheduled jobs: without it a kind that could
|
|
58
|
-
not be scored at all reports green.
|
|
59
|
-
--json Emit the machine-readable report instead of the table.
|
|
60
|
-
-h, --help Show this help.
|
|
61
|
-
|
|
62
|
-
Exit codes: 0 no drift · 1 drift detected · 2 the check could not run.
|
|
63
|
-
|
|
64
|
-
On drift, refresh with the printed \`*:update -- --full-scope\` command and
|
|
65
|
-
commit the result with a \`baseline-refresh:\` tagged subject (non-empty body).`;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Parse the CLI surface. Unknown flags are rejected so a typo'd `--gate`
|
|
69
|
-
* cannot silently widen a scheduled job's scope.
|
|
70
|
-
*
|
|
71
|
-
* @param {string[]} argv
|
|
72
|
-
* @returns {{ kinds: string[], tolerance: number|null, json: boolean, requireScored: boolean }}
|
|
73
|
-
*/
|
|
74
|
-
export function parseArgs(argv = []) {
|
|
75
|
-
const kinds = [];
|
|
76
|
-
let tolerance = null;
|
|
77
|
-
let json = false;
|
|
78
|
-
// Lifted out of the loop rather than added to its else-if chain: the chain
|
|
79
|
-
// is the file's most complex method already, and a valueless boolean flag
|
|
80
|
-
// needs no positional handling to be recognised.
|
|
81
|
-
const requireScored = argv.includes('--require-scored');
|
|
82
|
-
const rest = argv.filter((a) => a !== '--require-scored');
|
|
83
|
-
for (let i = 0; i < rest.length; i += 1) {
|
|
84
|
-
const arg = rest[i];
|
|
85
|
-
if (arg === '--gate' && rest[i + 1]) {
|
|
86
|
-
const kind = rest[i + 1];
|
|
87
|
-
if (!DRIFT_KINDS.includes(kind)) {
|
|
88
|
-
throw new Error(
|
|
89
|
-
`[drift] unknown --gate "${kind}"; expected one of ${DRIFT_KINDS.join(', ')}`,
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
kinds.push(kind);
|
|
93
|
-
i += 1;
|
|
94
|
-
} else if (arg === '--tolerance' && rest[i + 1]) {
|
|
95
|
-
const value = Number(rest[i + 1]);
|
|
96
|
-
if (!Number.isFinite(value)) {
|
|
97
|
-
throw new Error(
|
|
98
|
-
`[drift] --tolerance must be a number (got ${rest[i + 1]})`,
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
tolerance = value;
|
|
102
|
-
i += 1;
|
|
103
|
-
} else if (arg === '--json') {
|
|
104
|
-
json = true;
|
|
105
|
-
} else {
|
|
106
|
-
throw new Error(`[drift] unrecognised argument "${arg}"`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return {
|
|
110
|
-
kinds: kinds.length > 0 ? kinds : [...DRIFT_KINDS],
|
|
111
|
-
tolerance,
|
|
112
|
-
json,
|
|
113
|
-
requireScored,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Render the `--require-scored` verdict for a completed run.
|
|
119
|
-
*
|
|
120
|
-
* A skip is the detector's honest answer to "I could not score this kind" —
|
|
121
|
-
* `{ ok: true, skipped: '<reason>' }` — and the default contract maps that to
|
|
122
|
-
* a pass so an ad-hoc run does not red because coverage happened to be absent.
|
|
123
|
-
* Under `--require-scored` the same answer is a failure: the caller named the
|
|
124
|
-
* kinds it wanted measured, and a kind that was not measured is a gap, not a
|
|
125
|
-
* clean bill of health.
|
|
126
|
-
*
|
|
127
|
-
* Returns `null` when the flag is off or nothing was skipped, so the caller
|
|
128
|
-
* keeps the run's own 0/1 verdict untouched. Both "off" and "nothing skipped"
|
|
129
|
-
* are answered here rather than at the call site: the caller is the file's
|
|
130
|
-
* ratcheted entry point, and this is the branch's natural home anyway.
|
|
131
|
-
*
|
|
132
|
-
* @param {{ results?: Array<{ kind: string, skipped?: string }> }} run
|
|
133
|
-
* @param {boolean} requireScored Whether `--require-scored` was passed.
|
|
134
|
-
* @returns {string|null} the operator-facing failure note, or null.
|
|
135
|
-
*/
|
|
136
|
-
function requireScoredFailure(run, requireScored) {
|
|
137
|
-
if (!requireScored) return null;
|
|
138
|
-
const skipped = (run?.results ?? []).filter((r) => r?.skipped);
|
|
139
|
-
if (skipped.length === 0) return null;
|
|
140
|
-
const detail = skipped.map((r) => `${r.kind} (${r.skipped})`).join(', ');
|
|
141
|
-
return (
|
|
142
|
-
`[drift] ❌ --require-scored: ${skipped.length} requested kind(s) were ` +
|
|
143
|
-
`not scored — ${detail}. The verdict above covers only the kinds that ` +
|
|
144
|
-
'DID score, which is why it can read clean. A scheduled run that cannot ' +
|
|
145
|
-
'measure a kind is not a clean run; fix the cause (a missing coverage ' +
|
|
146
|
-
'artifact, a missing baseline, a disabled gate) or drop the kind from ' +
|
|
147
|
-
'the invocation.'
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Run the drift check and render it. Returns the process exit code rather
|
|
153
|
-
* than exiting, so the whole path is unit-testable.
|
|
154
|
-
*
|
|
155
|
-
* @param {{ argv?: string[], cwd?: string, detect?: typeof detectBaselineDrift }} opts
|
|
156
|
-
* @returns {Promise<{ exitCode: number, output: string }>}
|
|
157
|
-
*/
|
|
158
|
-
export async function runCheckBaselineDrift({
|
|
159
|
-
argv = [],
|
|
160
|
-
cwd = process.cwd(),
|
|
161
|
-
detect = detectBaselineDrift,
|
|
162
|
-
} = {}) {
|
|
163
|
-
const args = parseArgs(argv);
|
|
164
|
-
const run = await detect({
|
|
165
|
-
kinds: args.kinds,
|
|
166
|
-
cwd,
|
|
167
|
-
tolerance: args.tolerance,
|
|
168
|
-
});
|
|
169
|
-
const base = args.json
|
|
170
|
-
? JSON.stringify({ schemaVersion: '1', ...run }, null, 2)
|
|
171
|
-
: formatDriftReport(run);
|
|
172
|
-
// The note is appended rather than substituted: the drift table is still the
|
|
173
|
-
// useful half of the report for whichever kinds DID score. A note present at
|
|
174
|
-
// all means a requested kind went unmeasured, which is exit 2 regardless of
|
|
175
|
-
// what the measured kinds reported.
|
|
176
|
-
const unscored = requireScoredFailure(run, args.requireScored);
|
|
177
|
-
if (unscored) return { exitCode: 2, output: `${base}\n${unscored}` };
|
|
178
|
-
return { exitCode: run.ok ? 0 : 1, output: base };
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Run the drift check and *return* its exit code rather than calling
|
|
183
|
-
* `process.exit()` — this CLI prints one row per drifted baseline entry
|
|
184
|
-
* full-scope, so its report is exactly the kind of payload that outgrows the
|
|
185
|
-
* 64 KiB pipe buffer under a `| tee`. `process.exit()` terminates before a
|
|
186
|
-
* queued async pipe write drains, silently truncating it (Story #4783, the
|
|
187
|
-
* same defect `check-baselines.js` carried). Handing the code back lets
|
|
188
|
-
* `runAsCli`'s `propagateExitCode` path settle it through
|
|
189
|
-
* `settleCli`/`flushStdio` instead. The 0/1/2 contract documented at the top
|
|
190
|
-
* of this file is unchanged — only *when* the process leaves is.
|
|
191
|
-
*
|
|
192
|
-
* @returns {Promise<number>} 0 no drift, 1 drift detected, 2 could not run.
|
|
193
|
-
*/
|
|
194
|
-
async function main() {
|
|
195
|
-
let result;
|
|
196
|
-
try {
|
|
197
|
-
result = await runCheckBaselineDrift({ argv: process.argv.slice(2) });
|
|
198
|
-
} catch (err) {
|
|
199
|
-
process.stdout.write(`${err?.message ?? String(err)}\n`);
|
|
200
|
-
return 2;
|
|
201
|
-
}
|
|
202
|
-
process.stdout.write(`${result.output}\n`);
|
|
203
|
-
return result.exitCode;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
runAsCli(import.meta.url, main, {
|
|
207
|
-
source: 'check-baseline-drift',
|
|
208
|
-
usage: HELP_TEXT,
|
|
209
|
-
exitCode: 2,
|
|
210
|
-
propagateExitCode: true,
|
|
211
|
-
});
|
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// .agents/scripts/check-baseline-scope.js — Story #5012.
|
|
4
|
-
//
|
|
5
|
-
// Assert that every committed baseline's ROW SET still describes the tree.
|
|
6
|
-
//
|
|
7
|
-
// `check-baselines.js` answers "did a measured value regress?" and answers it
|
|
8
|
-
// well. Nothing answered the prior question: does this baseline still measure
|
|
9
|
-
// the right files? A row can point at a file deleted months ago, and an
|
|
10
|
-
// in-scope file can carry no row at all, while every gate stays green — a
|
|
11
|
-
// ratchet is perfectly capable of being green over almost nothing.
|
|
12
|
-
//
|
|
13
|
-
// This gate is measurement-free by construction. It runs no scorer, needs no
|
|
14
|
-
// coverage artifact and no test run: it walks the directories the gate's own
|
|
15
|
-
// config names (`lib/baselines/scope-inventory.js`) and compares that set
|
|
16
|
-
// against the committed rows in both directions
|
|
17
|
-
// (`lib/baselines/scope-assert.js`). That is what makes it cheap enough to be
|
|
18
|
-
// a required check, and what makes its companion —
|
|
19
|
-
// `prune-baseline-orphans.js` — a one-command remedy rather than a full
|
|
20
|
-
// re-score.
|
|
21
|
-
//
|
|
22
|
-
// Exit codes:
|
|
23
|
-
// 0 no fatal divergence (inherited divergence may still be warned about)
|
|
24
|
-
// 1 fatal divergence — attributable to this change set, or strict mode
|
|
25
|
-
// 2 the check could not run (unreadable config, unusable repository)
|
|
26
|
-
|
|
27
|
-
// Fail-fast if the framework's runtime deps are not installed — must be the
|
|
28
|
-
// first import so the check runs before any third-party-importing sibling
|
|
29
|
-
// module is evaluated (Story #3432).
|
|
30
|
-
import './lib/runtime-deps/ensure-installed.js';
|
|
31
|
-
import fs from 'node:fs';
|
|
32
|
-
import path from 'node:path';
|
|
33
|
-
import { _internals as readerInternals } from './lib/baselines/reader.js';
|
|
34
|
-
import {
|
|
35
|
-
assertScope,
|
|
36
|
-
attributeDivergence,
|
|
37
|
-
resolveStrictness,
|
|
38
|
-
} from './lib/baselines/scope-assert.js';
|
|
39
|
-
import {
|
|
40
|
-
buildScopeInventory,
|
|
41
|
-
SCOPE_KINDS,
|
|
42
|
-
} from './lib/baselines/scope-inventory.js';
|
|
43
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
44
|
-
import { getQuality } from './lib/config/quality.js';
|
|
45
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
46
|
-
import { gitSpawn } from './lib/git-utils.js';
|
|
47
|
-
|
|
48
|
-
const EXIT_PASS = 0;
|
|
49
|
-
const EXIT_DIVERGED = 1;
|
|
50
|
-
const EXIT_CANNOT_RUN = 2;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Files whose edit makes merge-base attribution untrustworthy: once a branch
|
|
54
|
-
* has rewritten the scope rules themselves, "which side of the merge-base
|
|
55
|
-
* introduced this row" is no longer a question the diff can answer.
|
|
56
|
-
*/
|
|
57
|
-
const SCOPE_CONFIG_PATHS = Object.freeze([
|
|
58
|
-
'.c8rc.cjs',
|
|
59
|
-
'.agentrc.json',
|
|
60
|
-
'.agentrc.local.json',
|
|
61
|
-
]);
|
|
62
|
-
|
|
63
|
-
const HELP = {
|
|
64
|
-
invocation:
|
|
65
|
-
'node .agents/scripts/check-baseline-scope.js [--kind <kind>] [--base <ref>] [--strict] [--json]',
|
|
66
|
-
summary:
|
|
67
|
-
"Assert each committed baseline's row set still describes the tree — in-scope files with no row, and rows whose file is gone or out of scope.",
|
|
68
|
-
flags: [
|
|
69
|
-
['--kind <kind>', 'Check one kind only (repeatable). Default: all.'],
|
|
70
|
-
['--base <ref>', 'Attribution base ref. Default: origin/<baseBranch>.'],
|
|
71
|
-
['--strict', 'Treat every divergence as fatal, skipping attribution.'],
|
|
72
|
-
['--json', 'Emit the report as JSON instead of text.'],
|
|
73
|
-
['--cwd <dir>', 'Repository root to check. Default: process.cwd().'],
|
|
74
|
-
],
|
|
75
|
-
notes: [
|
|
76
|
-
'Exit codes:\n 0 no fatal divergence\n 1 fatal divergence\n 2 the check could not run',
|
|
77
|
-
'Remedy for a stale row: node .agents/scripts/prune-baseline-orphans.js',
|
|
78
|
-
],
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Parse argv into an options bag. Unknown flags are a config error rather than
|
|
83
|
-
* a silent no-op — a typo'd `--kinds` must not read as "check everything".
|
|
84
|
-
*
|
|
85
|
-
* @param {string[]} argv
|
|
86
|
-
* @returns {{ kinds: string[], base: string | null, strict: boolean, json: boolean, cwd: string }}
|
|
87
|
-
*/
|
|
88
|
-
export function parseArgs(argv = []) {
|
|
89
|
-
const out = { kinds: [], base: null, strict: false, json: false, cwd: null };
|
|
90
|
-
let i = 0;
|
|
91
|
-
while (i < argv.length) {
|
|
92
|
-
const arg = argv[i];
|
|
93
|
-
const value = argv[i + 1];
|
|
94
|
-
i += 1;
|
|
95
|
-
if (arg === '--strict') out.strict = true;
|
|
96
|
-
else if (arg === '--json') out.json = true;
|
|
97
|
-
else if (arg === '--kind') {
|
|
98
|
-
out.kinds.push(value);
|
|
99
|
-
i += 1;
|
|
100
|
-
} else if (arg === '--base') {
|
|
101
|
-
out.base = value;
|
|
102
|
-
i += 1;
|
|
103
|
-
} else if (arg === '--cwd') {
|
|
104
|
-
out.cwd = value;
|
|
105
|
-
i += 1;
|
|
106
|
-
} else throw new Error(`unknown flag "${arg}" (try --help)`);
|
|
107
|
-
}
|
|
108
|
-
const unknown = out.kinds.filter((k) => !SCOPE_KINDS.includes(k));
|
|
109
|
-
if (unknown.length > 0) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
`unknown --kind ${unknown.join(', ')}; expected one of ${SCOPE_KINDS.join(', ')}`,
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
if (out.kinds.length === 0) out.kinds = [...SCOPE_KINDS];
|
|
115
|
-
out.cwd = out.cwd ?? process.cwd();
|
|
116
|
-
return out;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Resolve the merge base between HEAD and the requested base ref, preferring
|
|
121
|
-
* the remote-tracking ref so a stale local `main` cannot widen attribution.
|
|
122
|
-
*
|
|
123
|
-
* Returns `{ base: null }` when no candidate resolves — the strictness
|
|
124
|
-
* resolver treats that as a reason to fail towards strict, never as a licence
|
|
125
|
-
* to skip.
|
|
126
|
-
*
|
|
127
|
-
* @param {{ cwd: string, baseRef: string }} params
|
|
128
|
-
* @returns {{ base: string | null, aheadOfBase: boolean }}
|
|
129
|
-
*/
|
|
130
|
-
function resolveMergeBase({ cwd, baseRef }) {
|
|
131
|
-
for (const candidate of [`origin/${baseRef}`, baseRef]) {
|
|
132
|
-
const merged = gitSpawn(cwd, 'merge-base', candidate, 'HEAD');
|
|
133
|
-
if (merged.status !== 0 || merged.stdout.length === 0) continue;
|
|
134
|
-
const head = gitSpawn(cwd, 'rev-parse', 'HEAD');
|
|
135
|
-
return {
|
|
136
|
-
base: merged.stdout,
|
|
137
|
-
aheadOfBase: head.status === 0 && head.stdout !== merged.stdout,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
return { base: null, aheadOfBase: false };
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Enumerate what `<base>..HEAD` did to the tree, split into the two sets
|
|
145
|
-
* attribution needs. A rename contributes its old path to `removed` and its
|
|
146
|
-
* new path to `added`, which is exactly how a rename strands a row.
|
|
147
|
-
*
|
|
148
|
-
* @param {{ cwd: string, base: string | null }} params
|
|
149
|
-
* @returns {{ added: string[], removed: string[], changed: string[] }}
|
|
150
|
-
*/
|
|
151
|
-
function readChangeSet({ cwd, base }) {
|
|
152
|
-
const empty = { added: [], removed: [], changed: [] };
|
|
153
|
-
if (base === null) return empty;
|
|
154
|
-
const diff = gitSpawn(cwd, 'diff', '--name-status', '-M', `${base}..HEAD`);
|
|
155
|
-
if (diff.status !== 0) return empty;
|
|
156
|
-
const added = [];
|
|
157
|
-
const removed = [];
|
|
158
|
-
const changed = [];
|
|
159
|
-
for (const line of diff.stdout.split('\n').filter(Boolean)) {
|
|
160
|
-
const [code, first, second] = line.split('\t');
|
|
161
|
-
const letter = code[0];
|
|
162
|
-
if (letter === 'R' || letter === 'C') {
|
|
163
|
-
removed.push(first);
|
|
164
|
-
added.push(second);
|
|
165
|
-
changed.push(first, second);
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
if (letter === 'A') added.push(first);
|
|
169
|
-
if (letter === 'D') removed.push(first);
|
|
170
|
-
changed.push(first);
|
|
171
|
-
}
|
|
172
|
-
return { added, removed, changed };
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Repo-relative paths of every baseline file in play — the "did this change
|
|
177
|
-
* set edit a baseline?" input to the strictness resolver.
|
|
178
|
-
*
|
|
179
|
-
* @param {{ cwd: string, kinds: string[] }} params
|
|
180
|
-
* @returns {string[]}
|
|
181
|
-
*/
|
|
182
|
-
function baselinePathsFor({ cwd, kinds }) {
|
|
183
|
-
return kinds.map((kind) =>
|
|
184
|
-
path
|
|
185
|
-
.relative(cwd, readerInternals.resolveBaselinePath(kind, { cwd }))
|
|
186
|
-
.split(path.sep)
|
|
187
|
-
.join('/'),
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Read a baseline's rows, or `null` when the kind ships no baseline in this
|
|
193
|
-
* repository. Deliberately does NOT go through `reader.load`: an envelope too
|
|
194
|
-
* stale to satisfy its schema is exactly the state this gate exists to report,
|
|
195
|
-
* and refusing to read it would turn the report into a crash.
|
|
196
|
-
*
|
|
197
|
-
* @param {{ cwd: string, kind: string }} params
|
|
198
|
-
* @returns {Array<object> | null}
|
|
199
|
-
*/
|
|
200
|
-
function readRows({ cwd, kind }) {
|
|
201
|
-
const abs = readerInternals.resolveBaselinePath(kind, { cwd });
|
|
202
|
-
try {
|
|
203
|
-
const parsed = JSON.parse(fs.readFileSync(abs, 'utf8'));
|
|
204
|
-
return Array.isArray(parsed?.rows) ? parsed.rows : [];
|
|
205
|
-
} catch {
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Assess one kind: inventory → both-directions assertion → attribution.
|
|
212
|
-
*
|
|
213
|
-
* @param {object} params
|
|
214
|
-
* @returns {object} One entry of the report's `kinds` array.
|
|
215
|
-
*/
|
|
216
|
-
function assessKind({ kind, cwd, quality, strict, changeSet }) {
|
|
217
|
-
const rows = readRows({ cwd, kind });
|
|
218
|
-
if (rows === null) {
|
|
219
|
-
return { kind, present: false, skipped: true, reason: 'no baseline file' };
|
|
220
|
-
}
|
|
221
|
-
const inventory = buildScopeInventory({ kind, cwd, quality });
|
|
222
|
-
const found = assertScope({
|
|
223
|
-
inventory,
|
|
224
|
-
rows,
|
|
225
|
-
existsOnDisk: (rel) => fs.existsSync(path.resolve(cwd, rel)),
|
|
226
|
-
});
|
|
227
|
-
if (found.skipped) return { kind, present: true, ...found };
|
|
228
|
-
const attributed = attributeDivergence({
|
|
229
|
-
missing: found.missing,
|
|
230
|
-
extra: found.extra,
|
|
231
|
-
added: changeSet.added,
|
|
232
|
-
removed: changeSet.removed,
|
|
233
|
-
strict,
|
|
234
|
-
});
|
|
235
|
-
return {
|
|
236
|
-
kind,
|
|
237
|
-
present: true,
|
|
238
|
-
skipped: false,
|
|
239
|
-
reason: null,
|
|
240
|
-
inScopeCount: inventory.files.length,
|
|
241
|
-
rowCount: rows.length,
|
|
242
|
-
...attributed,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Run the whole assessment and return a report plus its exit code.
|
|
248
|
-
*
|
|
249
|
-
* @param {{ argv?: string[] }} [params]
|
|
250
|
-
* @returns {{ report: object, exitCode: number }}
|
|
251
|
-
*/
|
|
252
|
-
export function runScopeCheck({ argv = [] } = {}) {
|
|
253
|
-
const opts = parseArgs(argv);
|
|
254
|
-
const cwd = opts.cwd;
|
|
255
|
-
const config = resolveConfig({ cwd });
|
|
256
|
-
const quality = getQuality(config) ?? { gates: {} };
|
|
257
|
-
const baseRef = opts.base ?? config?.project?.baseBranch ?? 'main';
|
|
258
|
-
const { base, aheadOfBase } = resolveMergeBase({ cwd, baseRef });
|
|
259
|
-
const changeSet = readChangeSet({ cwd, base });
|
|
260
|
-
const strictness = opts.strict
|
|
261
|
-
? { strict: true, reason: 'operator requested --strict' }
|
|
262
|
-
: resolveStrictness({
|
|
263
|
-
base,
|
|
264
|
-
aheadOfBase,
|
|
265
|
-
changedFiles: changeSet.changed,
|
|
266
|
-
baselinePaths: baselinePathsFor({ cwd, kinds: opts.kinds }),
|
|
267
|
-
scopeConfigPaths: SCOPE_CONFIG_PATHS,
|
|
268
|
-
});
|
|
269
|
-
const kinds = opts.kinds.map((kind) =>
|
|
270
|
-
assessKind({ kind, cwd, quality, strict: strictness.strict, changeSet }),
|
|
271
|
-
);
|
|
272
|
-
const fatalCount = kinds.reduce((sum, k) => sum + (k.fatalCount ?? 0), 0);
|
|
273
|
-
const report = {
|
|
274
|
-
schemaVersion: '1',
|
|
275
|
-
base,
|
|
276
|
-
strict: strictness.strict,
|
|
277
|
-
strictReason: strictness.reason,
|
|
278
|
-
fatalCount,
|
|
279
|
-
warningCount: kinds.reduce((sum, k) => sum + (k.warningCount ?? 0), 0),
|
|
280
|
-
kinds,
|
|
281
|
-
};
|
|
282
|
-
return { report, exitCode: fatalCount > 0 ? EXIT_DIVERGED : EXIT_PASS };
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Render one kind's findings as indented text lines.
|
|
287
|
-
*
|
|
288
|
-
* @param {object} entry
|
|
289
|
-
* @returns {string[]}
|
|
290
|
-
*/
|
|
291
|
-
function renderKind(entry) {
|
|
292
|
-
if (entry.skipped) return [` - ${entry.kind}: skipped (${entry.reason})`];
|
|
293
|
-
const head =
|
|
294
|
-
` - ${entry.kind}: ${entry.rowCount} row(s) over ${entry.inScopeCount} ` +
|
|
295
|
-
`in-scope file(s) — ${entry.fatalCount} fatal, ${entry.warningCount} inherited`;
|
|
296
|
-
const lines = [head];
|
|
297
|
-
for (const file of entry.fatal.missing) {
|
|
298
|
-
lines.push(` ✗ missing row: ${file}`);
|
|
299
|
-
}
|
|
300
|
-
for (const row of entry.fatal.extra) {
|
|
301
|
-
lines.push(` ✗ stale row (${row.reason}): ${row.path}`);
|
|
302
|
-
}
|
|
303
|
-
return lines;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Render the whole report as text.
|
|
308
|
-
*
|
|
309
|
-
* @param {object} report
|
|
310
|
-
* @returns {string}
|
|
311
|
-
*/
|
|
312
|
-
export function formatReport(report) {
|
|
313
|
-
const mode = report.strict ? 'strict' : 'attributed';
|
|
314
|
-
const lines = [
|
|
315
|
-
`[check-baseline-scope] ${report.fatalCount} fatal, ${report.warningCount} inherited ` +
|
|
316
|
-
`(${mode}: ${report.strictReason})`,
|
|
317
|
-
...report.kinds.flatMap(renderKind),
|
|
318
|
-
];
|
|
319
|
-
if (report.fatalCount > 0) {
|
|
320
|
-
lines.push(
|
|
321
|
-
'',
|
|
322
|
-
'A baseline no longer describes the tree. Prune provably-inert rows with:',
|
|
323
|
-
' node .agents/scripts/prune-baseline-orphans.js',
|
|
324
|
-
'A missing row means a file was added without being measured — run that',
|
|
325
|
-
"kind's producer (npm run coverage:update / maintainability:update).",
|
|
326
|
-
);
|
|
327
|
-
}
|
|
328
|
-
return lines.join('\n');
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* CLI entry point. Returns its exit code rather than calling `process.exit()`,
|
|
333
|
-
* so `runAsCli`'s `propagateExitCode` path settles it through `flushStdio` and
|
|
334
|
-
* an unbounded report is not truncated at a pipe boundary (Story #4783).
|
|
335
|
-
*
|
|
336
|
-
* @returns {Promise<number>}
|
|
337
|
-
*/
|
|
338
|
-
async function main() {
|
|
339
|
-
let result;
|
|
340
|
-
try {
|
|
341
|
-
result = runScopeCheck({ argv: process.argv.slice(2) });
|
|
342
|
-
} catch (err) {
|
|
343
|
-
const message = err?.message ?? String(err);
|
|
344
|
-
process.stdout.write(
|
|
345
|
-
`${JSON.stringify({ schemaVersion: '1', error: message }, null, 2)}\n`,
|
|
346
|
-
);
|
|
347
|
-
return EXIT_CANNOT_RUN;
|
|
348
|
-
}
|
|
349
|
-
const opts = { json: process.argv.includes('--json') };
|
|
350
|
-
process.stdout.write(
|
|
351
|
-
opts.json
|
|
352
|
-
? `${JSON.stringify(result.report, null, 2)}\n`
|
|
353
|
-
: `${formatReport(result.report)}\n`,
|
|
354
|
-
);
|
|
355
|
-
return result.exitCode;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
runAsCli(import.meta.url, main, {
|
|
359
|
-
source: 'check-baseline-scope',
|
|
360
|
-
usage: HELP,
|
|
361
|
-
propagateExitCode: true,
|
|
362
|
-
});
|