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,20 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The gate replaces c8's global `lines/branches/functions` thresholds
|
|
5
|
-
* with per-file floors recorded in `baselines/coverage.json`, mirroring
|
|
6
|
-
* how `baselines/maintainability.json` tracks per-file MI scores.
|
|
7
|
-
*
|
|
8
|
-
* Scoring inputs:
|
|
9
|
-
* - `coverage/coverage-final.json` written by `c8 report` (every file
|
|
10
|
-
* c8 instrumented during the run, regardless of include/exclude).
|
|
11
|
-
* - `.c8rc.cjs` `include` / `exclude` globs — applied here so the
|
|
12
|
-
* baseline only records the same scope `c8 report --include=…` prints.
|
|
13
|
-
*
|
|
14
|
-
* Imported by `update-coverage-baseline.js` (writes the baseline) and
|
|
15
|
-
* `check-coverage-baseline.js` (compares current → baseline). Kept pure
|
|
16
|
-
* so the regression-comparison logic is unit-testable without spawning
|
|
17
|
-
* the full coverage pipeline.
|
|
2
|
+
* Per-file coverage floors in `baselines/coverage.json`, scoped by the c8
|
|
3
|
+
* `include`/`exclude` globs (coverage-final.json holds every instrumented file).
|
|
18
4
|
*/
|
|
19
5
|
|
|
20
6
|
import fs from 'node:fs';
|
|
@@ -24,26 +10,17 @@ import { write, writeFile } from './baselines/writer.js';
|
|
|
24
10
|
|
|
25
11
|
const COVERAGE_FINAL_PATH = 'coverage/coverage-final.json';
|
|
26
12
|
export const COVERAGE_BASELINE_PATH = 'baselines/coverage.json';
|
|
27
|
-
//
|
|
28
|
-
// baseline are stored to two decimals, so anything below 0.01 is noise.
|
|
13
|
+
// Percentage points; baselines store two decimals.
|
|
29
14
|
export const COVERAGE_TOLERANCE = 0.01;
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// branch flipping covered↔uncovered between runs is the natural noise floor
|
|
33
|
-
// under non-deterministic Windows/Node 22 V8 instrumentation. We absorb up
|
|
34
|
-
// to one event of slack per axis. Anything beyond one event is real signal.
|
|
15
|
+
// One instrumentation event of slack per axis: V8 coverage flaps by a single
|
|
16
|
+
// event between runs (notably Windows/Node 22).
|
|
35
17
|
const NOISE_EVENT_HEADROOM = 1.0;
|
|
36
18
|
|
|
37
19
|
function toForwardSlash(p) {
|
|
38
20
|
return p.replace(/\\/g, '/');
|
|
39
21
|
}
|
|
40
22
|
|
|
41
|
-
/**
|
|
42
|
-
* Build a (file → bool) predicate from c8 `include` / `exclude` glob
|
|
43
|
-
* arrays. Mirrors c8's own scope rule: a file is in scope when at least
|
|
44
|
-
* one `include` matches AND no `exclude` matches. Uses picomatch with
|
|
45
|
-
* c8's defaults (`dot: true` so dotfiles like `.agents/...` match).
|
|
46
|
-
*/
|
|
23
|
+
/** c8's scope rule: some `include` matches and no `exclude` does. */
|
|
47
24
|
export function buildScopePredicate({ include = [], exclude = [] } = {}) {
|
|
48
25
|
const inc =
|
|
49
26
|
include.length === 0 ? () => true : picomatch(include, { dot: true });
|
|
@@ -56,17 +33,8 @@ export function buildScopePredicate({ include = [], exclude = [] } = {}) {
|
|
|
56
33
|
}
|
|
57
34
|
|
|
58
35
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* Definitions match what `c8 check-coverage` enforces:
|
|
63
|
-
* - lines: covered statements / total statements
|
|
64
|
-
* - branches: covered branch arms / total branch arms (b is a map of arrays)
|
|
65
|
-
* - functions: covered functions / total functions
|
|
66
|
-
*
|
|
67
|
-
* Returns `null` for any axis that has no denominators (a file with
|
|
68
|
-
* zero functions has no defined function-coverage). The caller should
|
|
69
|
-
* treat `null` axes as a no-op when comparing.
|
|
36
|
+
* Percentages as `c8 check-coverage` defines them; an axis with no
|
|
37
|
+
* denominator is `null` (a no-op when comparing).
|
|
70
38
|
*/
|
|
71
39
|
export function scoreEntry(entry) {
|
|
72
40
|
const sMap = entry?.s ?? {};
|
|
@@ -103,13 +71,7 @@ export function scoreEntry(entry) {
|
|
|
103
71
|
};
|
|
104
72
|
}
|
|
105
73
|
|
|
106
|
-
/**
|
|
107
|
-
* Convert the raw `coverage-final.json` payload into a `{ relPath →
|
|
108
|
-
* {lines, branches, functions} }` map, dropping any entry that fails
|
|
109
|
-
* the c8 scope predicate. `cwd` is the repo root; entry keys in
|
|
110
|
-
* coverage-final.json are absolute paths and need relativising to
|
|
111
|
-
* match the baseline file's stable, repo-relative keys.
|
|
112
|
-
*/
|
|
74
|
+
/** In-scope entries keyed by repo-relative path (raw keys are absolute). */
|
|
113
75
|
export function scoreCoverageFinal({ raw, cwd, scope }) {
|
|
114
76
|
const inScope = scope ?? buildScopePredicate({});
|
|
115
77
|
const out = {};
|
|
@@ -121,17 +83,7 @@ export function scoreCoverageFinal({ raw, cwd, scope }) {
|
|
|
121
83
|
return out;
|
|
122
84
|
}
|
|
123
85
|
|
|
124
|
-
/**
|
|
125
|
-
* Read + parse `coverage-final.json`. Throws a helpful error when the
|
|
126
|
-
* file is missing — that's the operator-facing signal that they need
|
|
127
|
-
* to run `npm run test:coverage` first.
|
|
128
|
-
*
|
|
129
|
-
* Story #1737: the per-file gate now reads `coveragePath` from
|
|
130
|
-
* `delivery.quality.gates.coverage` instead of the hardcoded
|
|
131
|
-
* `coverage/coverage-final.json`. Callers pass the resolved path via
|
|
132
|
-
* `opts.coveragePath`; the legacy default is preserved for tests that
|
|
133
|
-
* still spin up a tmp tree without a config.
|
|
134
|
-
*/
|
|
86
|
+
/** Throws, naming the capture command, when the artifact is missing. */
|
|
135
87
|
export function readCoverageFinal(cwd, opts = {}, fsImpl) {
|
|
136
88
|
const resolvedFs = fsImpl ?? fs;
|
|
137
89
|
const coveragePath =
|
|
@@ -149,12 +101,6 @@ export function readCoverageFinal(cwd, opts = {}, fsImpl) {
|
|
|
149
101
|
return JSON.parse(resolvedFs.readFileSync(abs, 'utf8'));
|
|
150
102
|
}
|
|
151
103
|
|
|
152
|
-
/**
|
|
153
|
-
* Read the baseline. Returns `null` (not `{}`) when the file is
|
|
154
|
-
* missing so the checker can distinguish "no baseline yet" (warn +
|
|
155
|
-
* pass) from "baseline exists but is empty" (treat every in-scope
|
|
156
|
-
* file as new = fail).
|
|
157
|
-
*/
|
|
158
104
|
function isEnvelopeShape(parsed) {
|
|
159
105
|
return (
|
|
160
106
|
parsed &&
|
|
@@ -179,15 +125,14 @@ function projectEnvelopeToFlat(envelope) {
|
|
|
179
125
|
}
|
|
180
126
|
|
|
181
127
|
function normaliseParsedBaseline(parsed) {
|
|
182
|
-
//
|
|
183
|
-
// (`$schema`, `kernelVersion`, `generatedAt`, `rollup`, `rows`). The
|
|
184
|
-
// legacy reader contract returns a flat `{ file: { lines, branches,
|
|
185
|
-
// functions } }` map, so we project rows back to that shape for
|
|
186
|
-
// backwards-compatible consumers (Story #1892 migrates them off the
|
|
187
|
-
// flat shape).
|
|
128
|
+
// Readers expect the flat `{ file: scores }` map, not the envelope.
|
|
188
129
|
return isEnvelopeShape(parsed) ? projectEnvelopeToFlat(parsed) : parsed;
|
|
189
130
|
}
|
|
190
131
|
|
|
132
|
+
/**
|
|
133
|
+
* `null` (not `{}`) when missing: "no baseline yet" passes with a warning,
|
|
134
|
+
* while an empty baseline fails every in-scope file as new.
|
|
135
|
+
*/
|
|
191
136
|
export function readBaseline(cwd, fsImpl = fs) {
|
|
192
137
|
const abs = path.resolve(cwd, COVERAGE_BASELINE_PATH);
|
|
193
138
|
if (!fsImpl.existsSync(abs)) return null;
|
|
@@ -219,15 +164,12 @@ function writeEnvelopeViaFsImpl(abs, envelope, fsImpl) {
|
|
|
219
164
|
}
|
|
220
165
|
|
|
221
166
|
function dispatchEnvelopeWrite(abs, envelope, fsImpl) {
|
|
222
|
-
// Honour the injected fsImpl seam for tests that pass `memfs` or a spy —
|
|
223
|
-
// fall through to the writer's atomic write when `fsImpl === fs`.
|
|
224
167
|
return fsImpl === fs
|
|
225
168
|
? writeFile(abs, envelope)
|
|
226
169
|
: writeEnvelopeViaFsImpl(abs, envelope, fsImpl);
|
|
227
170
|
}
|
|
228
171
|
|
|
229
|
-
//
|
|
230
|
-
// Returns `null` on read or parse failure (regression-fail-safe).
|
|
172
|
+
// Prior rows for the epsilon/scope merge; `null` on any read failure.
|
|
231
173
|
function readPriorRows(abs, fsImpl) {
|
|
232
174
|
try {
|
|
233
175
|
const parsed = JSON.parse(fsImpl.readFileSync(abs, 'utf8'));
|
|
@@ -239,10 +181,6 @@ function readPriorRows(abs, fsImpl) {
|
|
|
239
181
|
|
|
240
182
|
export function writeBaseline(cwd, baseline, fsImpl = fs, opts = {}) {
|
|
241
183
|
const abs = path.resolve(cwd, COVERAGE_BASELINE_PATH);
|
|
242
|
-
// Story #1891: route through the shared baseline writer (envelope shape).
|
|
243
|
-
// Story #1974: optional `opts.scope` / `opts.epsilon` thread through so
|
|
244
|
-
// manual refreshes can opt in to diff-scoped writes + epsilon
|
|
245
|
-
// stabilization; absent both, behaviour is identical to pre-#1974.
|
|
246
184
|
const prior =
|
|
247
185
|
opts.prior !== undefined ? opts.prior : readPriorRows(abs, fsImpl);
|
|
248
186
|
const envelope = write({
|
|
@@ -256,19 +194,7 @@ export function writeBaseline(cwd, baseline, fsImpl = fs, opts = {}) {
|
|
|
256
194
|
return abs;
|
|
257
195
|
}
|
|
258
196
|
|
|
259
|
-
/**
|
|
260
|
-
* Compute the per-axis tolerance (in percentage points) for a file.
|
|
261
|
-
*
|
|
262
|
-
* Small-denominator files (a handful of branches, statements, or functions)
|
|
263
|
-
* are dominated by single-instrumentation-event noise: one branch flipping
|
|
264
|
-
* covered↔uncovered between Windows/Node 22 CI runs is worth `100/N`
|
|
265
|
-
* percentage points. We absorb up to `NOISE_EVENT_HEADROOM` events of slack
|
|
266
|
-
* — anything beyond that is real signal. Large files retain the strict
|
|
267
|
-
* `COVERAGE_TOLERANCE` floor (essentially zero) because their per-event
|
|
268
|
-
* resolution is already sub-percent.
|
|
269
|
-
*
|
|
270
|
-
* Exported for tests.
|
|
271
|
-
*/
|
|
197
|
+
/** Per-axis tolerance: at least one event's worth (`100/N` points). */
|
|
272
198
|
export function axisToleranceFor(
|
|
273
199
|
denominator,
|
|
274
200
|
baseTolerance = COVERAGE_TOLERANCE,
|
|
@@ -279,25 +205,9 @@ export function axisToleranceFor(
|
|
|
279
205
|
}
|
|
280
206
|
|
|
281
207
|
/**
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
*
|
|
286
|
-
* regressions — file in both, any axis dropped > per-axis tolerance.
|
|
287
|
-
* Per-axis tolerance is denominator-aware: a file with
|
|
288
|
-
* N branches gets up to 100/N percentage points of slack
|
|
289
|
-
* (one instrumentation event), so single-event Node 22
|
|
290
|
-
* CI flap on tiny files no longer trips the gate.
|
|
291
|
-
* newFiles — file in current, missing from baseline. The CLI
|
|
292
|
-
* treats this as a hard failure ("run coverage:update")
|
|
293
|
-
* because a brand-new untested CLI shell would
|
|
294
|
-
* otherwise sail through with 0% coverage.
|
|
295
|
-
* removedFiles — file in baseline, missing from current. Usually
|
|
296
|
-
* benign (file deleted or renamed); the CLI reports
|
|
297
|
-
* but does not fail on these.
|
|
298
|
-
* improvements — file in both, every axis ≥ baseline + tolerance on
|
|
299
|
-
* the axes both records have. Reported for visibility
|
|
300
|
-
* so operators know when to ratchet.
|
|
208
|
+
* Classify files: `regressions` (an axis dropped beyond tolerance) and
|
|
209
|
+
* `newFiles` (else untested code lands at 0%) fail the CLI; `removedFiles`
|
|
210
|
+
* and `improvements` are reported only.
|
|
301
211
|
*/
|
|
302
212
|
export function compareScores(
|
|
303
213
|
current,
|
|
@@ -1,28 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* coverage-capture-fullscope.js — the full-scope (pre-#4981, and still the
|
|
3
|
-
* default) capture path for `coverage-capture.js`.
|
|
4
|
-
*
|
|
5
|
-
* Hoisted out of the CLI shell's `runCoverageCapture` verbatim (Story
|
|
6
|
-
* #4981) so that function's cyclomatic complexity does not grow with the
|
|
7
|
-
* incremental-mode branch alongside it — this is a relocation, not new
|
|
8
|
-
* logic; behaviour is byte-for-byte the pre-#4981 body.
|
|
9
|
-
*/
|
|
1
|
+
/** Full-scope (default) capture path for `coverage-capture.js`. */
|
|
10
2
|
import path from 'node:path';
|
|
11
3
|
import { resolveChangedFilesRef } from './changed-files.js';
|
|
12
4
|
import {
|
|
13
5
|
anyChangedUnderTargets,
|
|
14
6
|
describeFreshness,
|
|
7
|
+
reportCaptureFailure,
|
|
15
8
|
stampCapturedTree,
|
|
16
9
|
} from './coverage-capture.js';
|
|
17
10
|
|
|
18
11
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* The skip check scores the ref `resolveChangedFilesRef` resolves — the rule,
|
|
24
|
-
* and the same answer, incremental mode applies, so a fall-through from it
|
|
25
|
-
* cannot change scope mid-run (Story #5365).
|
|
12
|
+
* Optional no-CRAP-files skip, freshness probe, then capture and stamp. The
|
|
13
|
+
* skip uses the same ref incremental mode resolves, so a fall-through from
|
|
14
|
+
* it cannot change scope mid-run.
|
|
26
15
|
*
|
|
27
16
|
* @param {{
|
|
28
17
|
* crap: object,
|
|
@@ -35,9 +24,9 @@ import {
|
|
|
35
24
|
* writeCaptureStampImpl: Function,
|
|
36
25
|
* logger: { info: Function, warn: Function, error: Function },
|
|
37
26
|
* }} opts
|
|
38
|
-
* @returns {number} process exit code
|
|
27
|
+
* @returns {Promise<number>} process exit code
|
|
39
28
|
*/
|
|
40
|
-
export function runFullScopeCapture({
|
|
29
|
+
export async function runFullScopeCapture({
|
|
41
30
|
crap,
|
|
42
31
|
coverage,
|
|
43
32
|
args,
|
|
@@ -56,8 +45,7 @@ export function runFullScopeCapture({
|
|
|
56
45
|
cwd: args.cwd,
|
|
57
46
|
});
|
|
58
47
|
} catch (err) {
|
|
59
|
-
// A bad ref must not
|
|
60
|
-
// freshness check so coverage still gets captured if needed.
|
|
48
|
+
// A bad ref must not relax the gate; fall through to freshness.
|
|
61
49
|
logger.warn(
|
|
62
50
|
`[coverage-capture] ⚠ ${err?.message ?? err} — falling back to freshness check.`,
|
|
63
51
|
);
|
|
@@ -86,17 +74,13 @@ export function runFullScopeCapture({
|
|
|
86
74
|
logger.info(
|
|
87
75
|
`[coverage-capture] Coverage at ${crap.coveragePath} is ${describeFreshness(freshness, crap.targetDirs)}; running npm run test:coverage…`,
|
|
88
76
|
);
|
|
89
|
-
//
|
|
90
|
-
// BEFORE the spawn. That is the value the stamp claims; see
|
|
91
|
-
// `stampCapturedTree`.
|
|
77
|
+
// Pre-spawn digest; see `stampCapturedTree`.
|
|
92
78
|
const preDigest = computeContentDigestImpl(args.cwd, crap.targetDirs);
|
|
93
|
-
const code = runCaptureImpl({
|
|
79
|
+
const code = await runCaptureImpl({
|
|
94
80
|
cwd: args.cwd,
|
|
95
81
|
timeoutMs: coverage?.timeoutMs,
|
|
96
82
|
log: (m) => logger.info(m),
|
|
97
|
-
//
|
|
98
|
-
// another full suite on this host. Whoever we waited for may have just
|
|
99
|
-
// stamped this exact tree.
|
|
83
|
+
// After queueing behind another suite, which may have stamped this tree.
|
|
100
84
|
recheckFresh: () =>
|
|
101
85
|
isCoverageFreshImpl({
|
|
102
86
|
coveragePath: crap.coveragePath,
|
|
@@ -104,17 +88,8 @@ export function runFullScopeCapture({
|
|
|
104
88
|
cwd: args.cwd,
|
|
105
89
|
}).fresh === true,
|
|
106
90
|
});
|
|
107
|
-
if (code !== 0)
|
|
108
|
-
logger.error(
|
|
109
|
-
`[coverage-capture] ✖ npm run test:coverage exited ${code}. Fix failing tests or coverage-threshold breaches before re-running the CRAP gate.`,
|
|
110
|
-
);
|
|
111
|
-
return code;
|
|
112
|
-
}
|
|
91
|
+
if (code !== 0) return reportCaptureFailure(code, logger);
|
|
113
92
|
|
|
114
|
-
// Persist the content digest next to the fresh artifact so subsequent
|
|
115
|
-
// freshness checks are content-aware (mtime churn from branch switches no
|
|
116
|
-
// longer invalidates). Best-effort — a missing stamp just means the next
|
|
117
|
-
// check falls back to the mtime heuristic.
|
|
118
93
|
stampCapturedTree({
|
|
119
94
|
preDigest,
|
|
120
95
|
cwd: args.cwd,
|
|
@@ -1,40 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* coverage-capture-incremental.js — the incremental-mode capture path for
|
|
3
|
-
* `coverage-capture.js` (Story #4981).
|
|
4
|
-
*
|
|
5
|
-
* Split into its own module (rather than added inline to the CLI shell) so
|
|
6
|
-
* the Story's opt-in branch lands as new code, not a same-file expansion of
|
|
7
|
-
* `runCoverageCapture`. Every collaborator is injected — no seam differs
|
|
8
|
-
* from the ones `coverage-capture.js` already exposes on its `deps`
|
|
9
|
-
* parameter (`.agents/rules/test-seams.md` rules 1-2, 4).
|
|
10
|
-
*/
|
|
1
|
+
/** Incremental-mode capture path for `coverage-capture.js`. */
|
|
11
2
|
import path from 'node:path';
|
|
12
3
|
import { resolveChangedFilesRef } from './changed-files.js';
|
|
13
|
-
import { stampCapturedTree } from './coverage-capture.js';
|
|
4
|
+
import { reportCaptureFailure, stampCapturedTree } from './coverage-capture.js';
|
|
14
5
|
|
|
15
6
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* *whether* to capture, never *what* the capture executes: when nothing under
|
|
22
|
-
* `crap.targetDirs` changed there is no capture at all, and otherwise the
|
|
23
|
-
* ordinary full `npm run test:coverage` runs. The saving that makes the mode
|
|
24
|
-
* worth having is the skip.
|
|
25
|
-
*
|
|
26
|
-
* Gated by `skipWhenUnchanged` alone (Story #5173). It MUST NOT consult
|
|
27
|
-
* `baselineJoin`: that switch governs the CRAP join
|
|
28
|
-
* (`crap-baseline-join.js`), which resolves methods in untouched files from
|
|
29
|
-
* the committed baseline row instead of demanding fresh coverage for them —
|
|
30
|
-
* a gate loosening, where the skip is a pure saving. The two are defaulted
|
|
31
|
-
* differently for exactly that reason, so neither may read the other.
|
|
32
|
-
*
|
|
33
|
-
* Returns the process exit code when incremental mode handled the run
|
|
34
|
-
* (skip, capture, or a capture failure), or `null` when the caller should
|
|
35
|
-
* fall through to the full-scope path — either incremental mode is
|
|
36
|
-
* disabled, or the changed-files ref could not be resolved (a
|
|
37
|
-
* misconfiguration must not silently relax the gate).
|
|
7
|
+
* Under `skipWhenUnchanged`: the changed-file set decides whether to capture,
|
|
8
|
+
* never what runs (a capture is always the full suite). Must not read
|
|
9
|
+
* `baselineJoin` — that loosens the gate, while the skip is a pure saving.
|
|
10
|
+
* Returns `null` to fall through to full scope, including when the ref
|
|
11
|
+
* cannot be resolved (never silently relax the gate).
|
|
38
12
|
*
|
|
39
13
|
* @param {{
|
|
40
14
|
* crap: object,
|
|
@@ -48,9 +22,9 @@ import { stampCapturedTree } from './coverage-capture.js';
|
|
|
48
22
|
* writeCaptureStampImpl: Function,
|
|
49
23
|
* logger: { info: Function, warn: Function, error: Function },
|
|
50
24
|
* }} opts
|
|
51
|
-
* @returns {number | null}
|
|
25
|
+
* @returns {Promise<number | null>}
|
|
52
26
|
*/
|
|
53
|
-
export function tryIncrementalCapture({
|
|
27
|
+
export async function tryIncrementalCapture({
|
|
54
28
|
crap,
|
|
55
29
|
coverage,
|
|
56
30
|
args,
|
|
@@ -99,9 +73,9 @@ export function tryIncrementalCapture({
|
|
|
99
73
|
logger.info(
|
|
100
74
|
`[coverage-capture] Incremental mode: ${scopedFiles.length} changed file(s) under [${crap.targetDirs.join(', ')}] — capturing…`,
|
|
101
75
|
);
|
|
102
|
-
//
|
|
76
|
+
// Pre-spawn digest; see `stampCapturedTree`.
|
|
103
77
|
const preDigest = computeContentDigestImpl(args.cwd, crap.targetDirs);
|
|
104
|
-
const code = runCaptureImpl({
|
|
78
|
+
const code = await runCaptureImpl({
|
|
105
79
|
cwd: args.cwd,
|
|
106
80
|
timeoutMs: coverage?.timeoutMs,
|
|
107
81
|
log: (m) => logger.info(m),
|
|
@@ -113,12 +87,7 @@ export function tryIncrementalCapture({
|
|
|
113
87
|
requireScope: 'incremental',
|
|
114
88
|
}).fresh === true,
|
|
115
89
|
});
|
|
116
|
-
if (code !== 0)
|
|
117
|
-
logger.error(
|
|
118
|
-
`[coverage-capture] ✖ npm run test:coverage exited ${code}. Fix failing tests or coverage-threshold breaches before re-running the CRAP gate.`,
|
|
119
|
-
);
|
|
120
|
-
return code;
|
|
121
|
-
}
|
|
90
|
+
if (code !== 0) return reportCaptureFailure(code, logger);
|
|
122
91
|
|
|
123
92
|
stampCapturedTree({
|
|
124
93
|
preDigest,
|
|
@@ -1,27 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The delivery workflow invokes `coverage-capture.js` by name
|
|
6
|
-
* (`helpers/deliver-story-reference.md` § Step 1), which brings it under the
|
|
7
|
-
* workflow-invoked self-description contract enforced by
|
|
8
|
-
* `tests/enforcement/workflow-script-help.test.js`. It failed that contract:
|
|
9
|
-
* `--help` fell through to the capture path and spawned the whole coverage
|
|
10
|
-
* suite instead of describing the script.
|
|
11
|
-
*
|
|
12
|
-
* The spec lives here rather than inline for the same reason
|
|
13
|
-
* `coverage-capture-incremental.js` does — a same-file expansion of the CLI
|
|
14
|
-
* shell costs maintainability index on a file already near its floor, and a
|
|
15
|
-
* usage table is data, not decision logic.
|
|
2
|
+
* `--help` spec for `coverage-capture.js`, which must answer `--help` without
|
|
3
|
+
* spawning the suite.
|
|
16
4
|
*/
|
|
17
5
|
|
|
18
6
|
import { respondToHelp } from './cli-usage.js';
|
|
19
7
|
|
|
20
8
|
/**
|
|
21
|
-
*
|
|
22
|
-
* does not route through `runAsCli` (its synchronous main returns an exit
|
|
23
|
-
* code that `process.exit` forwards), so the help short-circuit is wired by
|
|
24
|
-
* hand rather than declared on a `runAsCli` call.
|
|
9
|
+
* Wired by hand: `coverage-capture.js` does not route through `runAsCli`.
|
|
25
10
|
*
|
|
26
11
|
* @type {{ invocation: string, summary: string, flags: Array<[string, string]> }}
|
|
27
12
|
*/
|
|
@@ -37,7 +22,7 @@ const COVERAGE_CAPTURE_USAGE = {
|
|
|
37
22
|
],
|
|
38
23
|
[
|
|
39
24
|
'--require-credited',
|
|
40
|
-
'Refuse (exit 1) instead of spawning when no credited capture stamp covers this tree.
|
|
25
|
+
'Refuse (exit 1) instead of spawning when no credited capture stamp covers this tree. An operator opt-in for one invocation; a bare invocation always runs, so the deposit path stays open.',
|
|
41
26
|
],
|
|
42
27
|
[
|
|
43
28
|
'--ref <git-ref>',
|
|
@@ -48,11 +33,6 @@ const COVERAGE_CAPTURE_USAGE = {
|
|
|
48
33
|
};
|
|
49
34
|
|
|
50
35
|
/**
|
|
51
|
-
* Answer `--help` / `-h` on stdout, returning whether the caller should stop.
|
|
52
|
-
* Takes the full `process.argv`-shaped array so the CLI shell hands over its
|
|
53
|
-
* own argv unchanged and the index arithmetic lives here rather than at the
|
|
54
|
-
* call site.
|
|
55
|
-
*
|
|
56
36
|
* @param {string[]} argv Full `process.argv`-shaped array.
|
|
57
37
|
* @param {{ write: (s: string) => void }} [out] Defaults to `process.stdout`.
|
|
58
38
|
* @returns {boolean} `true` when help was printed and the run must not proceed.
|