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,47 +1,20 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// The "components" model lets a gate slice a baseline into named buckets
|
|
6
|
-
// (e.g. `app`, `worker`, `infra`) so per-component floors and tolerances
|
|
7
|
-
// can be evaluated independently. The shape is:
|
|
8
|
-
//
|
|
9
|
-
// components: { [name: string]: string[] } // map of name → glob list
|
|
10
|
-
//
|
|
11
|
-
// The canonical default — used when a gate omits `components` from its
|
|
12
|
-
// agentrc config — is `{ '*': ['**'] }`, meaning "one bucket called `*`
|
|
13
|
-
// matching every row". This keeps backwards compatibility with the
|
|
14
|
-
// pre-components rollup contract: a baseline that ships only `rollup['*']`
|
|
15
|
-
// continues to work without operator intervention.
|
|
16
|
-
//
|
|
17
|
-
// Globs are matched with minimatch. Overlap is allowed by design — a row
|
|
18
|
-
// matched by two components is reported under both. Components keyed by
|
|
19
|
-
// the literal `*` are treated as the whole-repo rollup and always match
|
|
20
|
-
// every row regardless of declared globs.
|
|
1
|
+
// Component resolver and row grouper: slice a baseline into named glob
|
|
2
|
+
// buckets for per-component floors. The `*` component is the whole-repo
|
|
3
|
+
// rollup and matches every row; overlap between components is allowed.
|
|
21
4
|
|
|
22
5
|
import { Minimatch } from 'minimatch';
|
|
23
6
|
|
|
24
|
-
/** The default components map, used when a gate omits `components`. */
|
|
25
7
|
const DEFAULT_COMPONENTS = Object.freeze({ '*': Object.freeze(['**']) });
|
|
26
8
|
|
|
27
9
|
/**
|
|
28
|
-
* Compiled
|
|
29
|
-
*
|
|
30
|
-
* `groupRows` is called once per gate over the whole baseline row set — tens
|
|
31
|
-
* of thousands of rows for `crap.json` — and the functional `minimatch()` it
|
|
32
|
-
* used re-parsed each component glob for every single row. The component
|
|
33
|
-
* globs come from config, so the distinct set is small and immutable; caching
|
|
34
|
-
* the compiled matcher turns an O(rows × globs) parse into an O(globs) one
|
|
35
|
-
* (Story #5109). Matching semantics are unchanged: same patterns, same
|
|
36
|
-
* `{ dot: true }`.
|
|
10
|
+
* Compiled matchers keyed by glob: `groupRows` runs over tens of thousands of
|
|
11
|
+
* rows, and re-parsing each glob per row dominated its cost.
|
|
37
12
|
*
|
|
38
13
|
* @type {Map<string, import('minimatch').Minimatch>}
|
|
39
14
|
*/
|
|
40
15
|
const GLOB_MATCHER_CACHE = new Map();
|
|
41
16
|
|
|
42
17
|
/**
|
|
43
|
-
* Compile (once) the `Minimatch` for one glob.
|
|
44
|
-
*
|
|
45
18
|
* @param {string} glob
|
|
46
19
|
* @returns {import('minimatch').Minimatch}
|
|
47
20
|
*/
|
|
@@ -55,21 +28,10 @@ function matcherFor(glob) {
|
|
|
55
28
|
}
|
|
56
29
|
|
|
57
30
|
/**
|
|
58
|
-
*
|
|
31
|
+
* Absent or empty `components` → `{ '*': ['**'] }`; non-array glob lists
|
|
32
|
+
* coerce to `[]`.
|
|
59
33
|
*
|
|
60
|
-
*
|
|
61
|
-
* - If the gate config has no `components` key (or it's not a plain
|
|
62
|
-
* object), return the default `{ '*': ['**'] }`.
|
|
63
|
-
* - If `components` is present but contains no entries, also return the
|
|
64
|
-
* default — a writer that emitted an empty `components: {}` is
|
|
65
|
-
* functionally equivalent to "no components declared".
|
|
66
|
-
* - Otherwise pass the operator-declared map through unchanged. Each
|
|
67
|
-
* value MUST be an array of glob strings; non-array values are
|
|
68
|
-
* coerced to an empty array so the grouper's caller can't crash on
|
|
69
|
-
* malformed input.
|
|
70
|
-
*
|
|
71
|
-
* @param {object} [gateConfig] A single gate config slice, e.g.
|
|
72
|
-
* `delivery.quality.gates.coverage`.
|
|
34
|
+
* @param {object} [gateConfig]
|
|
73
35
|
* @returns {Record<string, string[]>} Components map, never null.
|
|
74
36
|
*/
|
|
75
37
|
export function resolveComponents(gateConfig) {
|
|
@@ -96,25 +58,12 @@ function cloneDefault() {
|
|
|
96
58
|
}
|
|
97
59
|
|
|
98
60
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* Matching rules:
|
|
102
|
-
* - The component literally named `*` is the whole-repo bucket and
|
|
103
|
-
* captures every row regardless of declared globs.
|
|
104
|
-
* - For every other component, the row's `keyField` value is matched
|
|
105
|
-
* against each declared glob with minimatch (using `dot: true` so
|
|
106
|
-
* leading-dot paths participate). A row joins the bucket on first
|
|
107
|
-
* match — but a row CAN appear in multiple buckets because we evaluate
|
|
108
|
-
* every component (overlap is allowed).
|
|
109
|
-
* - Rows whose `keyField` is not a non-empty string never match
|
|
110
|
-
* any non-`*` bucket; they still land in `*`.
|
|
61
|
+
* A row without a string `keyField` lands only in `*`.
|
|
111
62
|
*
|
|
112
63
|
* @param {Array<Record<string, unknown>>} rows
|
|
113
64
|
* @param {Record<string, string[]>} components
|
|
114
65
|
* @param {string} [keyField='path']
|
|
115
|
-
*
|
|
116
|
-
* lint / coverage / crap / maintainability / mutation). Use `'route'`
|
|
117
|
-
* for lighthouse and `'bundle'` for bundle-size.
|
|
66
|
+
* `route` for lighthouse, `bundle` for bundle-size.
|
|
118
67
|
* @returns {Record<string, Array<Record<string, unknown>>>}
|
|
119
68
|
* Map of component name → matching rows, in input order.
|
|
120
69
|
*/
|
|
@@ -1,33 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* test imports, so `main` scored CRAP 30 and the inlined scorer another 30 —
|
|
7
|
-
* two of the ten methods Story #5311's honest re-anchor made visible, both at
|
|
8
|
-
* 0% coverage.
|
|
9
|
-
*
|
|
10
|
-
* **Why this is NOT the `refresh-service.js` default scorer.** Story #4293's
|
|
11
|
-
* idiom — drop the bespoke scorer, let `refreshBaseline` resolve the canonical
|
|
12
|
-
* default — was the obvious move here, and `buildDefaultCoverageScorer` is
|
|
13
|
-
* behaviour-equivalent line for line. It was rejected for one reason: the
|
|
14
|
-
* default is silent where this one speaks. A missing or unreadable coverage
|
|
15
|
-
* artifact makes any scorer return `[]`, and `refresh-service.js` has no
|
|
16
|
-
* empty-rows guard, so a full-scope refresh then writes an emptied baseline at
|
|
17
|
-
* exit 0. This scorer's `[Coverage] ❌` line is currently the only signal an
|
|
18
|
-
* operator gets that it happened. Converging would have traded a CRAP row for
|
|
19
|
-
* a quieter failure. (The fail-open itself is real and wants its own Story —
|
|
20
|
-
* it changes `refreshBaseline` semantics for every caller.)
|
|
2
|
+
* The `update-coverage-baseline` CLI's testable logic. The scorer stays
|
|
3
|
+
* bespoke (not the refresh-service default) because it logs when the coverage
|
|
4
|
+
* artifact is missing: `refreshBaseline` has no empty-rows guard, so that line
|
|
5
|
+
* is the only signal a full-scope refresh just wrote an empty baseline.
|
|
21
6
|
*/
|
|
22
7
|
|
|
23
8
|
import { Logger } from '../Logger.js';
|
|
24
9
|
import { parseDiffScopeFlag } from './diff-scope-cli.js';
|
|
25
10
|
|
|
26
11
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* Throws when both are present: they describe incompatible scopes, and
|
|
30
|
-
* silently preferring one would write a baseline the operator did not ask for.
|
|
12
|
+
* Throws when both scope flags are present.
|
|
31
13
|
*
|
|
32
14
|
* @param {string[]} [argv]
|
|
33
15
|
* @returns {{fullScope: boolean, diffScopeRef: string|null}}
|
|
@@ -44,16 +26,8 @@ export function resolveCoverageUpdaterScope(argv = []) {
|
|
|
44
26
|
}
|
|
45
27
|
|
|
46
28
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* Reads `coverage-final.json`, narrows to the c8 include/exclude scope so the
|
|
50
|
-
* baseline records exactly the files coverage is measured over, and — in diff
|
|
51
|
-
* mode — narrows again to the service-resolved in-scope list so untouched rows
|
|
52
|
-
* are preserved rather than re-scored.
|
|
53
|
-
*
|
|
54
|
-
* The three collaborators are named seams (`rules/test-seams.md`) so a test
|
|
55
|
-
* drives the whole scorer with no coverage artifact and no `.c8rc.cjs` on
|
|
56
|
-
* disk.
|
|
29
|
+
* Narrows to the c8 include/exclude scope, and in diff mode to the in-scope
|
|
30
|
+
* files so untouched rows are preserved rather than re-scored.
|
|
57
31
|
*
|
|
58
32
|
* @param {string} cwd
|
|
59
33
|
* @param {{readCoverage: Function, loadScope: Function, buildScope: Function,
|
|
@@ -70,8 +44,6 @@ export function buildCoverageUpdaterScorer(
|
|
|
70
44
|
try {
|
|
71
45
|
raw = readCoverage(effectiveCwd);
|
|
72
46
|
} catch (err) {
|
|
73
|
-
// The only operator-facing signal that the refresh is about to record
|
|
74
|
-
// nothing — see this module's header.
|
|
75
47
|
logger.error(`[Coverage] ❌ ${err.message}`);
|
|
76
48
|
return [];
|
|
77
49
|
}
|
|
@@ -86,7 +58,6 @@ export function buildCoverageUpdaterScorer(
|
|
|
86
58
|
}),
|
|
87
59
|
});
|
|
88
60
|
|
|
89
|
-
// In diff mode, further narrow to the service-resolved in-scope file list.
|
|
90
61
|
const inScope =
|
|
91
62
|
!opts?.fullScope && Array.isArray(files) && files.length > 0
|
|
92
63
|
? new Set(files)
|
|
@@ -1,27 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* crap-preview-incremental.js — resolve `runCrapPreview`'s incremental-join
|
|
3
|
-
* `scanAndScore` input (Story #4981).
|
|
4
|
-
*
|
|
5
|
-
* Split into its own file (rather than added inline to `preview-gates.js`)
|
|
6
|
-
* so the Story's opt-in wiring lands as new code, not a same-file expansion
|
|
7
|
-
* of the pre-existing preview runner.
|
|
8
|
-
*/
|
|
9
1
|
import { getChangedFiles, resolveChangedFilesRef } from '../changed-files.js';
|
|
10
2
|
|
|
11
3
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* The join's ref comes from `resolveChangedFilesRef` (Story #5365), the same
|
|
18
|
-
* rule capture applies: the `--changed-since` ref the preview was handed wins
|
|
19
|
-
* over a configured `baseRef`, so one hook invocation cannot resolve two.
|
|
20
|
-
*
|
|
21
|
-
* Gated by `incrementalCoverage.baselineJoin` alone (Story #5173). It MUST
|
|
22
|
-
* NOT consult `skipWhenUnchanged`: the join loosens what the gate demands,
|
|
23
|
-
* while the skip only decides whether a capture runs, so a consumer that took
|
|
24
|
-
* the saving has not thereby asked for the loosening.
|
|
4
|
+
* The `incremental` option for `scanAndScore`, or `null` (full scope) when
|
|
5
|
+
* disabled or the changed-files ref fails — never a silently relaxed gate.
|
|
6
|
+
* The preview's `--changed-since` ref wins over configured `baseRef`, so one
|
|
7
|
+
* hook invocation resolves one ref. Gated by `baselineJoin` alone, never
|
|
8
|
+
* `skipWhenUnchanged`: skipping a capture is not consent to loosen the gate.
|
|
25
9
|
*
|
|
26
10
|
* @param {{
|
|
27
11
|
* crap: { incrementalCoverage?: { baselineJoin?: boolean, baseRef?: string } },
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* compatible.
|
|
5
|
-
*
|
|
6
|
-
* Hoisted out of `runCrapPreview` verbatim (Story #4981) so that function's
|
|
7
|
-
* cyclomatic complexity does not grow with the incremental-mode wiring
|
|
8
|
-
* alongside it — this is a relocation of pre-existing logic, not new
|
|
9
|
-
* behaviour; the incremental resolution itself is the only Story #4981
|
|
10
|
-
* addition (see `resolveCrapPreviewIncremental`).
|
|
2
|
+
* The scan → compare → report tail of `preview-gates.js#runCrapPreview`, once
|
|
3
|
+
* its baseline is loaded and judged compatible.
|
|
11
4
|
*/
|
|
12
5
|
import path from 'node:path';
|
|
13
6
|
import { loadCoverage } from '../coverage-utils.js';
|
|
@@ -28,9 +21,6 @@ import {
|
|
|
28
21
|
} from './kinds/crap.js';
|
|
29
22
|
|
|
30
23
|
/**
|
|
31
|
-
* Narrow a CRAP baseline to the rows whose file path is in `scopeSet`,
|
|
32
|
-
* or return all rows when no diff-scope filter is active.
|
|
33
|
-
*
|
|
34
24
|
* @param {{ rows: object[] }} baseline
|
|
35
25
|
* @param {Set<string>|null|undefined} scopeSet
|
|
36
26
|
* @returns {object[]}
|
|
@@ -42,9 +32,6 @@ function resolveBaselineRows(baseline, scopeSet) {
|
|
|
42
32
|
}
|
|
43
33
|
|
|
44
34
|
/**
|
|
45
|
-
* Return true when the CRAP compare result contains regressions or new
|
|
46
|
-
* violations — i.e. when the preview gate should exit non-zero.
|
|
47
|
-
*
|
|
48
35
|
* @param {{ regressions: number, newViolations: number }} result
|
|
49
36
|
* @returns {boolean}
|
|
50
37
|
*/
|
|
@@ -53,25 +40,8 @@ function hasCrapRegressions(result) {
|
|
|
53
40
|
}
|
|
54
41
|
|
|
55
42
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* `runCrapPreview`, now including the Story #4981 incremental-join opt-in.
|
|
59
|
-
*
|
|
60
|
-
* @param {{
|
|
61
|
-
* crap: object,
|
|
62
|
-
* cwd: string,
|
|
63
|
-
* scopeSet: Set<string>|null,
|
|
64
|
-
* scope: string,
|
|
65
|
-
* diffRef: string|null,
|
|
66
|
-
* baseline: { rows: object[] },
|
|
67
|
-
* }} opts
|
|
68
|
-
* @returns {Promise<{ exitCode: number, envelope: object }>}
|
|
69
|
-
*/
|
|
70
|
-
/**
|
|
71
|
-
* The scanned methods at or over the fixed cyclomatic ceiling (Story #5313),
|
|
72
|
-
* as advisories: `quality-preview.js` lists them and exits 0 on them, so the
|
|
73
|
-
* reading reaches the author without the preview ever refusing a commit on
|
|
74
|
-
* complexity alone. Pure.
|
|
43
|
+
* Methods at or over the cyclomatic ceiling, as advisories only: the preview
|
|
44
|
+
* never refuses a commit on complexity; `check-cyclomatic.js` enforces. Pure.
|
|
75
45
|
*
|
|
76
46
|
* @param {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>} rows
|
|
77
47
|
* @returns {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>}
|
|
@@ -87,6 +57,17 @@ export function listCyclomaticAdvisories(rows) {
|
|
|
87
57
|
}));
|
|
88
58
|
}
|
|
89
59
|
|
|
60
|
+
/**
|
|
61
|
+
* @param {{
|
|
62
|
+
* crap: object,
|
|
63
|
+
* cwd: string,
|
|
64
|
+
* scopeSet: Set<string>|null,
|
|
65
|
+
* scope: string,
|
|
66
|
+
* diffRef: string|null,
|
|
67
|
+
* baseline: { rows: object[] },
|
|
68
|
+
* }} opts
|
|
69
|
+
* @returns {Promise<{ exitCode: number, envelope: object }>}
|
|
70
|
+
*/
|
|
90
71
|
export async function computeCrapPreviewScan({
|
|
91
72
|
crap,
|
|
92
73
|
cwd,
|
|
@@ -102,11 +83,8 @@ export async function computeCrapPreviewScan({
|
|
|
102
83
|
const requireCoverage = crap.requireCoverage !== false;
|
|
103
84
|
const coveragePath = crap.coveragePath ?? 'coverage/coverage-final.json';
|
|
104
85
|
const coverage = loadCoverage(path.resolve(cwd, coveragePath));
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// so `compareCrap` demotes positive deltas at or under tolerance rather than
|
|
108
|
-
// failing on any positive delta; over-tolerance deltas still fail. This keeps
|
|
109
|
-
// the pre-commit/pre-push preview aligned with the authoritative gate.
|
|
86
|
+
// The configured tolerance keeps the preview aligned with the authoritative
|
|
87
|
+
// gate: deltas at or under it are demoted, not failed.
|
|
110
88
|
const { newMethodCeiling, tolerance } = resolveCrapEnvOverrides(
|
|
111
89
|
crap,
|
|
112
90
|
process.env,
|
|
@@ -141,13 +119,9 @@ export async function computeCrapPreviewScan({
|
|
|
141
119
|
newMethodCeiling,
|
|
142
120
|
scopeInfo: { scope, diffRef },
|
|
143
121
|
});
|
|
144
|
-
// Story #5313: a method at or over the cyclomatic ceiling is an ADVISORY
|
|
145
|
-
// on the preview — reported, never a verdict. The ratchet in
|
|
146
|
-
// `check-cyclomatic.js` owns enforcement.
|
|
147
122
|
envelope.cyclomaticAdvisories = listCyclomaticAdvisories(scan.rows);
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// a mis-keyed join. Say so once, by name, and fail open.
|
|
123
|
+
// Above the drifted-row ratio every verdict is an artefact of a mis-keyed
|
|
124
|
+
// join: say so once and fail open.
|
|
151
125
|
const basis = assessComparisonBasis(result);
|
|
152
126
|
if (!basis.sound) {
|
|
153
127
|
return {
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Story #5316: all three lived inside `update-crap-baseline.js#main`, which no
|
|
7
|
-
* test imports. `parseCliArgs` scored CRAP 56, the inlined scorer 72, and
|
|
8
|
-
* `main` itself 90 — three of the ten methods Story #5311's honest re-anchor
|
|
9
|
-
* made visible, every one at 0% coverage. They sit here for the same reason
|
|
10
|
-
* `diff-scope-cli.js` does: a CLI shell is unreachable from a test, and the
|
|
11
|
-
* import from the CLI is what keeps these off the `dead-exports:production`
|
|
12
|
-
* ratchet.
|
|
13
|
-
*
|
|
14
|
-
* **Why this is NOT the `refresh-service.js` default scorer.** The service
|
|
15
|
-
* already resolves a `buildDefaultCrapScorer`, and Story #4293 made
|
|
16
|
-
* `update-maintainability-baseline.js` drop its bespoke scorer in favour of
|
|
17
|
-
* exactly that. This one cannot follow: it carries `checkResolutionFloor`, a
|
|
18
|
-
* fail-closed refusal that throws before anything is written when too few
|
|
19
|
-
* methods resolved a coverage entry — the guard that stops a broken join being
|
|
20
|
-
* persisted as a sparse baseline (Story #4775). Moving that into the shared
|
|
21
|
-
* default would change behaviour for `refresh-commit.js` and close-validation,
|
|
22
|
-
* which resolve the same default. So the scorer stays bespoke, and is tested
|
|
23
|
-
* here instead.
|
|
2
|
+
* The `update-crap-baseline` CLI's testable logic: flags, options and its
|
|
3
|
+
* scorer. The scorer stays bespoke (not the refresh-service default) because
|
|
4
|
+
* its fail-closed resolution floor must not change behaviour for the other
|
|
5
|
+
* callers of that default.
|
|
24
6
|
*/
|
|
25
7
|
|
|
26
8
|
import path from 'node:path';
|
|
@@ -28,18 +10,13 @@ import { checkResolutionFloor, scanAndScore } from '../crap-utils.js';
|
|
|
28
10
|
import { Logger } from '../Logger.js';
|
|
29
11
|
import { parseDiffScopeFlag } from './diff-scope-cli.js';
|
|
30
12
|
|
|
31
|
-
/** Coverage artifact read when neither the flag nor config names one. */
|
|
32
13
|
const DEFAULT_COVERAGE_PATH = 'coverage/coverage-final.json';
|
|
33
14
|
|
|
34
|
-
/** Resolution-rate floor applied when config does not set one. */
|
|
35
15
|
const DEFAULT_MIN_RESOLUTION_RATE = 0.75;
|
|
36
16
|
|
|
37
17
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* `--full-scope` and `--diff-scope <ref>` are read here but deliberately NOT
|
|
41
|
-
* reconciled — {@link resolveCrapUpdaterOptions} owns the refusal, so a caller
|
|
42
|
-
* cannot get a half-validated shape by calling only this.
|
|
18
|
+
* Scope flags are not reconciled here; {@link resolveCrapUpdaterOptions} owns
|
|
19
|
+
* that refusal.
|
|
43
20
|
*
|
|
44
21
|
* @param {string[]} [argv]
|
|
45
22
|
* @returns {{baselinePath: string|undefined, coveragePath: string|undefined,
|
|
@@ -67,22 +44,13 @@ export function parseCrapUpdaterArgs(argv = []) {
|
|
|
67
44
|
}
|
|
68
45
|
|
|
69
46
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* Every flag wins over config, and config over the built-in default — the
|
|
74
|
-
* precedence that used to be a chain of `??` inside `main`, which is most of
|
|
75
|
-
* why `main` was cyclomatic 9.
|
|
76
|
-
*
|
|
77
|
-
* Throws on `--full-scope` together with `--diff-scope`: the two describe
|
|
78
|
-
* incompatible scopes and silently preferring one would write a baseline the
|
|
79
|
-
* operator did not ask for.
|
|
47
|
+
* Flag → config → default. Throws on `--full-scope` with `--diff-scope`:
|
|
48
|
+
* silently preferring one would write a baseline nobody asked for.
|
|
80
49
|
*
|
|
81
50
|
* @param {{baselinePath?: string, coveragePath?: string, fullScope?: boolean,
|
|
82
|
-
* diffScopeRef?: string|null}} args
|
|
83
|
-
* @param {{crap?: object, baselines?: object}} sources
|
|
84
|
-
*
|
|
85
|
-
* @param {string} [cwd] Root the baseline path is resolved against.
|
|
51
|
+
* diffScopeRef?: string|null}} args
|
|
52
|
+
* @param {{crap?: object, baselines?: object}} sources
|
|
53
|
+
* @param {string} [cwd]
|
|
86
54
|
* @returns {{targetDirs: string[], ignoreGlobs: string[],
|
|
87
55
|
* requireCoverage: boolean, minMethodResolutionRate: number,
|
|
88
56
|
* coveragePath: string, baselinePath: string, absBaselinePath: string,
|
|
@@ -118,13 +86,8 @@ export function resolveCrapUpdaterOptions(
|
|
|
118
86
|
}
|
|
119
87
|
|
|
120
88
|
/**
|
|
121
|
-
*
|
|
122
|
-
* clean scan
|
|
123
|
-
*
|
|
124
|
-
* `unscorableFiles` (Story #5311) is the one that must never be silent: a file
|
|
125
|
-
* the scan could not read, transpile or parse contributes no rows, so without
|
|
126
|
-
* a line of its own the run reads as a clean scan of a tree with fewer methods
|
|
127
|
-
* than it has.
|
|
89
|
+
* Non-zero drop counters only. `unscorableFiles` must be reported, or the run
|
|
90
|
+
* reads as a clean scan of a smaller tree.
|
|
128
91
|
*
|
|
129
92
|
* @param {{skippedFilesNoCoverage?: number, skippedMethodsNoCoverage?: number,
|
|
130
93
|
* unscorableFiles?: number, resolution?: object}} summary
|
|
@@ -158,19 +121,9 @@ function reportScanSummary(summary, logger = Logger) {
|
|
|
158
121
|
}
|
|
159
122
|
|
|
160
123
|
/**
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* - **No coverage artifact under `requireCoverage`** — every file would be
|
|
166
|
-
* skipped, so the scan is abandoned with an operator-facing warning rather
|
|
167
|
-
* than returning a confidently empty row set.
|
|
168
|
-
* - **Resolution rate below the floor** — `checkResolutionFloor` throws
|
|
169
|
-
* BEFORE the service writes anything. A baseline built from a broken join
|
|
170
|
-
* is not sparse, it is wrong.
|
|
171
|
-
*
|
|
172
|
-
* `loadCoverage` and the logger are named seams so a test drives the whole
|
|
173
|
-
* scorer without a coverage artifact on disk (`rules/test-seams.md`).
|
|
124
|
+
* Fails closed on a missing coverage artifact under `requireCoverage` (warn,
|
|
125
|
+
* no rows) and on a resolution rate below the floor (throws before anything is
|
|
126
|
+
* written: a broken join is wrong, not sparse).
|
|
174
127
|
*
|
|
175
128
|
* @param {ReturnType<typeof resolveCrapUpdaterOptions>} options
|
|
176
129
|
* @param {{loadCoverage: Function, scan?: Function, logger?: object}} deps
|
|
@@ -208,8 +161,6 @@ export function buildCrapUpdaterScorer(
|
|
|
208
161
|
logger.info(`[CRAP] Scanned ${summary.scannedFiles} file(s).`);
|
|
209
162
|
reportScanSummary(summary, logger);
|
|
210
163
|
|
|
211
|
-
// Fail closed BEFORE the service persists anything — a thin baseline is
|
|
212
|
-
// never written and then apologised for.
|
|
213
164
|
const refusal = checkResolutionFloor(
|
|
214
165
|
summary.resolution,
|
|
215
166
|
options.minMethodResolutionRate,
|
|
@@ -1,40 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `update-coverage-baseline.js`, `update-crap-baseline.js`,
|
|
6
|
-
* `update-maintainability-baseline.js`, and
|
|
7
|
-
* `update-duplication-baseline.js` all accept an opt-in `--diff-scope <ref>`
|
|
8
|
-
* flag. When supplied, the baseline write narrows to files changed since
|
|
9
|
-
* `<ref>`; out-of-scope rows are preserved verbatim from the prior on-disk
|
|
10
|
-
* baseline.
|
|
11
|
-
*
|
|
12
|
-
* The helper is shared to keep the flag's contract identical across the four
|
|
13
|
-
* scripts: one argv parser, one spelling, one error message.
|
|
14
|
-
*
|
|
15
|
-
* **Scope of this module, post-Story #4944.** It parses the flag and nothing
|
|
16
|
-
* else. Everything downstream of the parse — resolving the changed-file set,
|
|
17
|
-
* reading the prior envelope, and assembling the writer call — used to live
|
|
18
|
-
* here too, in `buildWriterScopeArgs` and its helpers. Those were the
|
|
19
|
-
* pre-service path; `lib/baselines/refresh-service.js` owns all of it now
|
|
20
|
-
* (`resolveScope`, `readPriorEnvelope`, and the `writer.write()` handoff),
|
|
21
|
-
* and `refreshBaseline()` derives its own diff via `execFile` rather than
|
|
22
|
-
* `spawnSync`. `update-duplication-baseline.js` was the last caller of the
|
|
23
|
-
* legacy path; when it migrated, the whole write-side half of this module
|
|
24
|
-
* became unreachable and was removed rather than left shipped-but-uncalled.
|
|
25
|
-
*
|
|
26
|
-
* Note for anyone tracing the per-kind prior-row reader that used to live
|
|
27
|
-
* here: it is gone, not relocated. The service reads the prior envelope
|
|
28
|
-
* kind-agnostically (any `{ rows: [], rollup: {} }` document), so the
|
|
29
|
-
* per-kind row-shape filter it needed no longer has a job to do.
|
|
2
|
+
* The shared `--diff-scope <ref>` flag parser for the baseline-update CLIs:
|
|
3
|
+
* one spelling, one error message. Scope resolution lives in
|
|
4
|
+
* `refresh-service.js`.
|
|
30
5
|
*/
|
|
31
6
|
|
|
32
7
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* TypeError when the flag is supplied without a value.
|
|
36
|
-
*
|
|
37
|
-
* Pure; no I/O.
|
|
8
|
+
* Accepts `--diff-scope <ref>` and `--diff-scope=<ref>`; `null` when absent.
|
|
9
|
+
* Throws a TypeError when the value is missing. Pure.
|
|
38
10
|
*
|
|
39
11
|
* @param {string[]} argv
|
|
40
12
|
* @returns {string | null}
|
|
@@ -1,28 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* duplication baseline (Story #3664).
|
|
4
|
-
*
|
|
5
|
-
* Wraps the jscpd clone detector behind two pure-ish seams so the
|
|
6
|
-
* refresh script and its unit tests can exercise the parse→envelope path
|
|
7
|
-
* without spawning a real scan:
|
|
8
|
-
*
|
|
9
|
-
* - `buildDuplicationRows(clones, fileLineCounts, cwd)` — PURE. Folds
|
|
10
|
-
* jscpd's clone-pair output into per-file `{ path, duplicatedLines,
|
|
11
|
-
* totalLines, percentage }` rows. Overlapping clones on the same file
|
|
12
|
-
* are unioned (line-set), so a line duplicated by two different clones
|
|
13
|
-
* counts once. Every file the scan visited gets a row — files with no
|
|
14
|
-
* clones land at `duplicatedLines: 0` so the baseline records the full
|
|
15
|
-
* denominator and a later regression on a previously-clean file is
|
|
16
|
-
* visible.
|
|
17
|
-
*
|
|
18
|
-
* - `scanDuplication({ targetDirs, cwd, minTokens, detect, readLineCount })`
|
|
19
|
-
* — the I/O wrapper. Walks `targetDirs`, runs the injected `detect`
|
|
20
|
-
* (jscpd's `detectClones` by default), reads per-file line counts, and
|
|
21
|
-
* returns the projected rows. The `detect` and `readLineCount` seams
|
|
22
|
-
* are injectable so tests run fully offline.
|
|
23
|
-
*
|
|
24
|
-
* Lower duplication is better — see `kinds/duplication.js` and the gate's
|
|
25
|
-
* `lte` floor direction in `check-baselines/phases/floors.js`.
|
|
2
|
+
* jscpd-backed scanner for the duplication baseline (lower is better).
|
|
26
3
|
*/
|
|
27
4
|
|
|
28
5
|
import { readFileSync } from 'node:fs';
|
|
@@ -35,16 +12,9 @@ const DEFAULT_FORMATS = Object.freeze(['javascript']);
|
|
|
35
12
|
const require = createRequire(import.meta.url);
|
|
36
13
|
|
|
37
14
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* function so the rest of the module stays import-pure and testable — no
|
|
42
|
-
* importer of this file pays the jscpd load unless it actually scans.
|
|
43
|
-
*
|
|
44
|
-
* Lives here rather than in `update-duplication-baseline.js` since Story
|
|
45
|
-
* #4944: the refresh service's default duplication scorer needs the same
|
|
46
|
-
* seam, and a second copy in the CLI would be the classic "two
|
|
47
|
-
* implementations of one probe" divergence.
|
|
15
|
+
* Lazy CJS load: jscpd's ESM entry has a broken transitive `colors/safe`
|
|
16
|
+
* specifier under strict ESM resolution, and importers that never scan should
|
|
17
|
+
* not pay the load.
|
|
48
18
|
*
|
|
49
19
|
* @returns {(opts: object) => Promise<Array<object>>}
|
|
50
20
|
*/
|
|
@@ -59,9 +29,7 @@ export function resolveDetectClones() {
|
|
|
59
29
|
}
|
|
60
30
|
|
|
61
31
|
/**
|
|
62
|
-
*
|
|
63
|
-
* repo-relative path. jscpd already emits cwd-relative paths, but a future
|
|
64
|
-
* jscpd bump (or an absolute `sourceId`) is defended against here.
|
|
32
|
+
* POSIX repo-relative path, defending against an absolute `sourceId`.
|
|
65
33
|
*
|
|
66
34
|
* @param {string} sourceId
|
|
67
35
|
* @param {string} cwd
|
|
@@ -76,9 +44,6 @@ export function relativisePath(sourceId, cwd) {
|
|
|
76
44
|
}
|
|
77
45
|
|
|
78
46
|
/**
|
|
79
|
-
* Count the inclusive line span a clone covers: `end.line - start.line + 1`.
|
|
80
|
-
* jscpd reports 1-based line numbers; a single-line clone spans one line.
|
|
81
|
-
*
|
|
82
47
|
* @param {{ start?: { line?: number }, end?: { line?: number } }} dup
|
|
83
48
|
* @returns {Array<number>} the 1-based line numbers the clone covers
|
|
84
49
|
*/
|
|
@@ -94,16 +59,12 @@ function cloneLineNumbers(dup) {
|
|
|
94
59
|
}
|
|
95
60
|
|
|
96
61
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* `duplicationB`) contribute their covered lines to their respective
|
|
100
|
-
* file's duplicated-line set, so a file that is only ever the "B" side of
|
|
101
|
-
* a clone still accrues duplication.
|
|
62
|
+
* Pure. Both sides of each clone pair accrue lines; overlapping clones are
|
|
63
|
+
* unioned per file so a line counts once. Every counted file gets a row.
|
|
102
64
|
*
|
|
103
65
|
* @param {Array<{duplicationA?: object, duplicationB?: object}>} clones
|
|
104
66
|
* @param {Map<string, number>|Record<string, number>} fileLineCounts
|
|
105
|
-
*
|
|
106
|
-
* @param {string} [cwd] used to relativise absolute sourceIds
|
|
67
|
+
* @param {string} [cwd]
|
|
107
68
|
* @returns {Array<{path: string, duplicatedLines: number, totalLines: number, percentage: number}>}
|
|
108
69
|
*/
|
|
109
70
|
export function buildDuplicationRows(
|
|
@@ -155,10 +116,6 @@ function toLineCountMap(fileLineCounts) {
|
|
|
155
116
|
}
|
|
156
117
|
|
|
157
118
|
/**
|
|
158
|
-
* Default per-file line counter — reads the file off disk and counts
|
|
159
|
-
* newline-delimited lines. Injectable via `scanDuplication`'s
|
|
160
|
-
* `readLineCount` seam so tests never touch the filesystem.
|
|
161
|
-
*
|
|
162
119
|
* @param {string} absPath
|
|
163
120
|
* @returns {number}
|
|
164
121
|
*/
|
|
@@ -166,15 +123,12 @@ export function readLineCount(absPath) {
|
|
|
166
123
|
const text = readFileSync(absPath, 'utf8');
|
|
167
124
|
if (text.length === 0) return 0;
|
|
168
125
|
const lines = text.split(/\r\n|\r|\n/);
|
|
169
|
-
//
|
|
170
|
-
// count matches the editor's line count.
|
|
126
|
+
// Drop the empty element after a trailing newline.
|
|
171
127
|
if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
|
|
172
128
|
return lines.length;
|
|
173
129
|
}
|
|
174
130
|
|
|
175
131
|
/**
|
|
176
|
-
* Run a duplication scan over `targetDirs` and return canonical rows.
|
|
177
|
-
*
|
|
178
132
|
* @param {{
|
|
179
133
|
* targetDirs: string[],
|
|
180
134
|
* cwd?: string,
|
|
@@ -224,11 +178,8 @@ export async function scanDuplication({
|
|
|
224
178
|
}
|
|
225
179
|
|
|
226
180
|
/**
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* one clone, so the scanned-but-clean files are not enumerable from the
|
|
230
|
-
* clone list alone — the baseline therefore records exactly the files
|
|
231
|
-
* with detected duplication. Pure helper, exported for tests.
|
|
181
|
+
* Files on either side of any clone. jscpd reports only participating files,
|
|
182
|
+
* so the baseline records exactly the files with detected duplication.
|
|
232
183
|
*
|
|
233
184
|
* @param {Array<object>} clones
|
|
234
185
|
* @param {string} cwd
|