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,77 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* refresh
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
* regeneration (maintainability, crap, coverage, duplication) must flow.
|
|
7
|
-
* Callers that previously assembled their own envelopes and called
|
|
8
|
-
* `fs.writeFileSync` MUST migrate to this entry point — Stories 3/4/5 of
|
|
9
|
-
* Epic #2173 do that migration; Story #2197 only lands the service surface
|
|
10
|
-
* and tests. Story #4944 migrated the last holdout, `duplication`.
|
|
11
|
-
*
|
|
12
|
-
* The service is **scoring-agnostic**: it does not itself walk the
|
|
13
|
-
* filesystem to compute MI / CRAP / coverage / duplication scores. Scoring
|
|
14
|
-
* is provided by the per-kind default scorers resolved lazily via
|
|
15
|
-
* `resolveDefaultScorer`
|
|
16
|
-
* (built with the project config resolved against `cwd`) and, in tests or
|
|
17
|
-
* production wiring, injected via the `scorer` option for hermetic
|
|
18
|
-
* determinism. The service is the policy layer:
|
|
19
|
-
*
|
|
20
|
-
* 1. Validate the input contract.
|
|
21
|
-
* 2. Resolve the scope (explicit list / diff-derived / full).
|
|
22
|
-
* 3. Read the prior envelope from `writePath` (if present).
|
|
23
|
-
* 4. Run the kind's scorer over the in-scope file list.
|
|
24
|
-
* 5. Canonicalize every persisted row path via `canonicalizeBaselinePath()`
|
|
25
|
-
* (Story #2192) before handing off to the shared `writer.write()`.
|
|
26
|
-
* 6. Pass `prior` + `scope` to `writer.write()` so out-of-scope rows are
|
|
27
|
-
* preserved byte-for-byte (Task #2209) and structural-equality
|
|
28
|
-
* short-circuits return the prior envelope unchanged.
|
|
29
|
-
* 7. Atomically serialise the resulting envelope to `writePath`.
|
|
30
|
-
*
|
|
31
|
-
* Public API (Task #2203, AC-1 / AC-2 / AC-7):
|
|
32
|
-
*
|
|
33
|
-
* refreshBaseline({
|
|
34
|
-
* kind, // 'maintainability' | 'crap' | 'coverage'
|
|
35
|
-
* // | 'duplication' REQUIRED
|
|
36
|
-
* baseRef, // git ref to diff against; default 'origin/main'
|
|
37
|
-
* headRef, // git ref under inspection; default 'HEAD'
|
|
38
|
-
* scopeFiles, // Array<string> | null
|
|
39
|
-
* // - Array: use verbatim as the in-scope file set.
|
|
40
|
-
* // - null + !fullScope: derive via `git diff
|
|
41
|
-
* // --name-only baseRef..headRef` filtered by kind
|
|
42
|
-
* // predicate (Task #2207).
|
|
43
|
-
* // - null + fullScope=true: ignore scope, regenerate
|
|
44
|
-
* // every row.
|
|
45
|
-
* epsilon, // per-kind stabilization tolerance (number | undefined)
|
|
46
|
-
* fullScope, // boolean; default false. When true, scopeFiles MUST
|
|
47
|
-
* // be null and the whole baseline is regenerated.
|
|
48
|
-
* writePath, // absolute path to baselines/<kind>.json REQUIRED
|
|
49
|
-
* scorer, // INTERNAL/TESTING: override the kind's scorer.
|
|
50
|
-
* // Signature: (files: string[], opts) =>
|
|
51
|
-
* // Promise<Array<row>> | Array<row>
|
|
52
|
-
* fs, // INTERNAL/TESTING: inject fs impl for read/write.
|
|
53
|
-
* gitDiff, // INTERNAL/TESTING: inject diff-derivation impl with
|
|
54
|
-
* // signature ({ baseRef, headRef, cwd }) =>
|
|
55
|
-
* // Iterable<string>
|
|
56
|
-
* cwd, // working directory for git diff; default process.cwd()
|
|
57
|
-
* generatedAt, // optional pinned timestamp (test determinism); falls
|
|
58
|
-
* // back to MANDREL_BASELINE_GENERATED_AT, then now().
|
|
59
|
-
* requireRowsForScopeFiles, // optional fail-loud guard for Story-close
|
|
60
|
-
* requiredScopeFilePredicate, // optional predicate to narrow guarded files
|
|
61
|
-
* }) -> Promise<{
|
|
62
|
-
* kind, writePath, scope: { mode, ref?, files: string[] },
|
|
63
|
-
* envelope, wrote: boolean
|
|
64
|
-
* }>
|
|
65
|
-
*
|
|
66
|
-
* Acceptance contract:
|
|
67
|
-
*
|
|
68
|
-
* AC-1: All callers that produce a maintainability/crap/coverage/
|
|
69
|
-
* duplication baseline go through refreshBaseline(). Enforced by
|
|
70
|
-
* the Task #2208 invariant.
|
|
71
|
-
* AC-2: scopeFiles=null && !fullScope -> diff-derived scope (Task #2207).
|
|
72
|
-
* AC-4: Out-of-scope rows + their updatedAt fields are preserved byte-
|
|
73
|
-
* for-byte (Task #2209).
|
|
74
|
-
* AC-7: All persisted paths go through canonicalizeBaselinePath().
|
|
2
|
+
* Baseline refresh service: `refreshBaseline()` is the single funnel for
|
|
3
|
+
* every baseline regeneration. It is scoring-agnostic policy — resolve scope,
|
|
4
|
+
* score via the kind's (default or injected) scorer, canonicalize paths, and
|
|
5
|
+
* write through `writer.write()` so out-of-scope rows survive byte-for-byte.
|
|
75
6
|
*
|
|
76
7
|
* @module .agents/scripts/lib/baselines/refresh-service
|
|
77
8
|
*/
|
|
@@ -106,10 +37,6 @@ import {
|
|
|
106
37
|
|
|
107
38
|
const nodeRequire = createRequire(import.meta.url);
|
|
108
39
|
|
|
109
|
-
/**
|
|
110
|
-
* Kinds the refresh service knows how to dispatch. Stays in lockstep with
|
|
111
|
-
* the per-kind modules under `.agents/scripts/lib/baselines/kinds/`.
|
|
112
|
-
*/
|
|
113
40
|
const SUPPORTED_KINDS = Object.freeze([
|
|
114
41
|
'maintainability',
|
|
115
42
|
'crap',
|
|
@@ -118,13 +45,7 @@ const SUPPORTED_KINDS = Object.freeze([
|
|
|
118
45
|
]);
|
|
119
46
|
|
|
120
47
|
/**
|
|
121
|
-
* Per-kind
|
|
122
|
-
* Only files whose extension matches the kind's scorer surface are admitted
|
|
123
|
-
* into the diff-derived scope; this prevents unrelated diffs (docs, JSON
|
|
124
|
-
* fixtures, schema files) from triggering a no-op rescore.
|
|
125
|
-
*
|
|
126
|
-
* The predicates intentionally accept canonical, forward-slash POSIX paths
|
|
127
|
-
* only — every caller funnels through `canonicalizeBaselinePath()` first.
|
|
48
|
+
* Per-kind extension filter for diff-derived scope, over canonical POSIX paths.
|
|
128
49
|
*
|
|
129
50
|
* @type {Record<string, (p: string) => boolean>}
|
|
130
51
|
*/
|
|
@@ -132,25 +53,14 @@ const KIND_FILE_PREDICATES = Object.freeze({
|
|
|
132
53
|
maintainability: (p) => /\.(?:m?[jt]sx?)$/i.test(p),
|
|
133
54
|
crap: (p) => /\.(?:m?[jt]sx?)$/i.test(p),
|
|
134
55
|
coverage: (p) => /\.(?:m?[jt]sx?)$/i.test(p),
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
// admitted here simply yields no row on either side of the merge —
|
|
138
|
-
// over-inclusive is inert, under-inclusive would silently pin a changed
|
|
139
|
-
// file's prior row. Erring wide is the safe direction.
|
|
56
|
+
// Over-inclusive is inert for JS-only jscpd; under-inclusive would pin a
|
|
57
|
+
// changed file's prior row.
|
|
140
58
|
duplication: (p) => /\.(?:m?[jt]sx?)$/i.test(p),
|
|
141
59
|
});
|
|
142
60
|
|
|
143
61
|
/**
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* defaulted shape that the production scorers (`refresh-commit.js#buildKindScorer`,
|
|
147
|
-
* `update-crap-baseline.js`) consume — i.e. the `getQuality(config)` output,
|
|
148
|
-
* not the raw `config.delivery.quality.gates.<kind>` path. The raw path is
|
|
149
|
-
* un-defaulted (e.g. it lacks `requireCoverage` / `coveragePath`), so reading
|
|
150
|
-
* it directly is exactly the construction inconsistency Story #3694 fixes.
|
|
151
|
-
*
|
|
152
|
-
* Precedence: an explicitly supplied `quality` block wins; otherwise derive
|
|
153
|
-
* it from `config` via `getQuality`; otherwise fall back to `{}`.
|
|
62
|
+
* The defaulted `getQuality(config)` shape the production scorers read — never
|
|
63
|
+
* the raw, un-defaulted gates path. Explicit `quality` wins over `config`.
|
|
154
64
|
*
|
|
155
65
|
* @param {{ quality?: object, config?: object }} opts
|
|
156
66
|
* @returns {object}
|
|
@@ -162,23 +72,10 @@ function resolveQualityBlock({ quality, config } = {}) {
|
|
|
162
72
|
}
|
|
163
73
|
|
|
164
74
|
/**
|
|
165
|
-
* Build the default CRAP scorer. Scans configured target directories
|
|
166
|
-
* (full-scope) or the diff-derived file list, loads coverage-final.json,
|
|
167
|
-
* and runs `scanAndScore` to produce row-shape objects ready for the writer.
|
|
168
|
-
*
|
|
169
|
-
* Reads its `targetDirs` / `ignoreGlobs` / `requireCoverage` / `coveragePath`
|
|
170
|
-
* from the normalized quality block (Story #3694). The lazy default resolver
|
|
171
|
-
* (`resolveDefaultScorer`) passes the resolved project quality block so the
|
|
172
|
-
* config-less default no longer silently drops rows.
|
|
173
|
-
*
|
|
174
|
-
* Exposed for unit tests that need to inspect the built scorer shape; the
|
|
175
|
-
* production caller is the internal `resolveDefaultScorer` resolver below.
|
|
176
|
-
*
|
|
177
75
|
* @param {{ cwd: string, config?: object, quality?: object }} opts
|
|
178
76
|
* @returns {(files: string[], opts: object) => Promise<object[]>}
|
|
179
77
|
*/
|
|
180
78
|
function buildDefaultCrapScorer({ cwd, config, quality } = {}) {
|
|
181
|
-
// Config is optional: callers that don't pass it get reasonable defaults.
|
|
182
79
|
const crapCfg = resolveQualityBlock({ quality, config })?.crap ?? {};
|
|
183
80
|
const targetDirs = Array.isArray(crapCfg.targetDirs)
|
|
184
81
|
? crapCfg.targetDirs
|
|
@@ -205,8 +102,6 @@ function buildDefaultCrapScorer({ cwd, config, quality } = {}) {
|
|
|
205
102
|
ignoreGlobs,
|
|
206
103
|
scopeFiles,
|
|
207
104
|
});
|
|
208
|
-
// Stamp version probes (satisfies coverage even when caller doesn't need
|
|
209
|
-
// the values — the writer stamps kernelVersion from the crap kind module).
|
|
210
105
|
resolveEscomplexVersion(effectiveCwd);
|
|
211
106
|
resolveTsTranspilerVersion();
|
|
212
107
|
return (rows ?? []).filter(
|
|
@@ -216,12 +111,7 @@ function buildDefaultCrapScorer({ cwd, config, quality } = {}) {
|
|
|
216
111
|
}
|
|
217
112
|
|
|
218
113
|
/**
|
|
219
|
-
*
|
|
220
|
-
* the c8 scope predicate from `.c8rc.cjs`, and converts the per-file
|
|
221
|
-
* coverage percentages into rows in the `{ path, lines, branches,
|
|
222
|
-
* functions }` shape the writer expects.
|
|
223
|
-
*
|
|
224
|
-
* `.c8rc.cjs` is optional: when absent the scorer admits all files.
|
|
114
|
+
* Coverage rows from coverage-final.json, scoped by the optional `.c8rc.cjs`.
|
|
225
115
|
*
|
|
226
116
|
* @param {{ cwd: string }} opts
|
|
227
117
|
* @returns {(files: string[], opts: object) => object[]}
|
|
@@ -255,8 +145,6 @@ function buildDefaultCoverageScorer({ cwd } = {}) {
|
|
|
255
145
|
cwd: effectiveCwd,
|
|
256
146
|
scope: c8Scope,
|
|
257
147
|
});
|
|
258
|
-
// In diff mode, further narrow to the in-scope file list so only changed
|
|
259
|
-
// files are re-scored (out-of-scope rows are preserved by the service).
|
|
260
148
|
const inScope =
|
|
261
149
|
!opts?.fullScope && Array.isArray(files) && files.length > 0
|
|
262
150
|
? new Set(files)
|
|
@@ -273,13 +161,6 @@ function buildDefaultCoverageScorer({ cwd } = {}) {
|
|
|
273
161
|
}
|
|
274
162
|
|
|
275
163
|
/**
|
|
276
|
-
* Build the default maintainability scorer. Full-scope walks all configured
|
|
277
|
-
* target directories; diff-scope resolves just the in-scope files.
|
|
278
|
-
*
|
|
279
|
-
* Reads its `targetDirs` / `ignoreGlobs` from the normalized quality block
|
|
280
|
-
* (Story #3694), mirroring `buildDefaultCrapScorer` and the production
|
|
281
|
-
* `refresh-commit.js#buildKindScorer`.
|
|
282
|
-
*
|
|
283
164
|
* @param {{ cwd: string, config?: object, quality?: object }} opts
|
|
284
165
|
* @returns {(files: string[], opts: object) => Promise<object[]>}
|
|
285
166
|
*/
|
|
@@ -305,12 +186,8 @@ function buildDefaultMaintainabilityScorer({ cwd, config, quality } = {}) {
|
|
|
305
186
|
const underTarget = targetAbsDirs.some(
|
|
306
187
|
(root) => abs === root || abs.startsWith(`${root}${path.sep}`),
|
|
307
188
|
);
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
// must do the same or an ignored-but-changed file (e.g. one matched by
|
|
311
|
-
// `config-settings-schema*.js`) enters `rows` and drags the
|
|
312
|
-
// `rollup["*"].min` below the maintainability floor. Reuse the same
|
|
313
|
-
// matcher `scanDirectoryMi` uses so behaviour is identical.
|
|
189
|
+
// Same ignore matcher as the full-scope walk, or an ignored-but-changed
|
|
190
|
+
// file enters `rows` and drags the rollup min below the floor.
|
|
314
191
|
if (
|
|
315
192
|
underTarget &&
|
|
316
193
|
!isIgnoredByGlobsMi(abs, ignoreGlobs, effectiveCwd)
|
|
@@ -330,20 +207,8 @@ function buildDefaultMaintainabilityScorer({ cwd, config, quality } = {}) {
|
|
|
330
207
|
}
|
|
331
208
|
|
|
332
209
|
/**
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
* is self-contained: callers may still inject a `scorer` via the options bag
|
|
336
|
-
* (used by auto-refresh-runner and tests), but no scorer injection is required
|
|
337
|
-
* for production invocations.
|
|
338
|
-
*
|
|
339
|
-
* Story #3694: the builders are invoked **lazily** by `resolveDefaultScorer`
|
|
340
|
-
* with the project config resolved against the call's `cwd`, rather than being
|
|
341
|
-
* frozen once at module-load with `{ cwd: process.cwd() }` and no `config`.
|
|
342
|
-
* The previous eager table built every scorer with no config, so the crap and
|
|
343
|
-
* maintainability scorers ran with empty `targetDirs`/`ignoreGlobs` and
|
|
344
|
-
* silently dropped valid rows. Lazy resolution honours both the call's `cwd`
|
|
345
|
-
* and the resolved `crap.targetDirs`/`ignoreGlobs`/`requireCoverage` (and the
|
|
346
|
-
* maintainability equivalents).
|
|
210
|
+
* Built lazily per call so each scorer sees the config resolved against the
|
|
211
|
+
* call's `cwd`; an unconfigured scorer silently drops valid rows.
|
|
347
212
|
*
|
|
348
213
|
* @type {Record<string, (input: { cwd: string, config?: object, quality?: object }) => ((files: string[], opts: object) => Promise<object[]> | object[])>}
|
|
349
214
|
*/
|
|
@@ -355,25 +220,10 @@ const KIND_SCORER_BUILDERS = Object.freeze({
|
|
|
355
220
|
});
|
|
356
221
|
|
|
357
222
|
/**
|
|
358
|
-
*
|
|
359
|
-
*
|
|
360
|
-
*
|
|
361
|
-
*
|
|
362
|
-
* `targetDirs`/`ignoreGlobs`/`requireCoverage`, so a config-less
|
|
363
|
-
* `refreshBaseline({ kind: 'crap', ... })` call produces the same rows as the
|
|
364
|
-
* `update-crap-baseline.js` CLI rather than silently dropping them.
|
|
365
|
-
*
|
|
366
|
-
* Config resolution is best-effort: if `resolveConfig` throws (e.g. a
|
|
367
|
-
* malformed `.agentrc.json` under a tmp `cwd` in tests), we fall back to a
|
|
368
|
-
* config-less builder so the service still produces a valid (empty) envelope
|
|
369
|
-
* rather than crashing the refresh. The production crap/maintainability paths
|
|
370
|
-
* never rely on this fallback — they inject an explicit, configured scorer.
|
|
371
|
-
*
|
|
372
|
-
* Exported since Story #4776 so the full-scope drift detector
|
|
373
|
-
* (`check-baseline-drift.js`) re-scores through the *same* scorer that
|
|
374
|
-
* writes the baseline. A drift check scoring by a second, parallel
|
|
375
|
-
* implementation would report the two implementations' disagreement as
|
|
376
|
-
* drift, which is exactly the false signal it exists to rule out.
|
|
223
|
+
* Default scorer for `kind`, configured from `cwd`. Config resolution is
|
|
224
|
+
* best-effort (a throw yields a config-less scorer). Exported so the drift
|
|
225
|
+
* detector re-scores through the same scorer that writes the baseline; a
|
|
226
|
+
* parallel implementation would report its own disagreement as drift.
|
|
377
227
|
*
|
|
378
228
|
* @param {string} kind
|
|
379
229
|
* @param {{ cwd: string }} opts
|
|
@@ -393,9 +243,10 @@ export function resolveDefaultScorer(kind, { cwd } = {}) {
|
|
|
393
243
|
}
|
|
394
244
|
|
|
395
245
|
/**
|
|
396
|
-
* Refresh the on-disk baseline for `kind`.
|
|
397
|
-
*
|
|
398
|
-
*
|
|
246
|
+
* Refresh the on-disk baseline for `kind`. `scopeFiles: null` without
|
|
247
|
+
* `fullScope` derives scope from `git diff baseRef..headRef`; `fullScope`
|
|
248
|
+
* requires `scopeFiles: null`. `requireRowsForScopeFiles` fails loud when a
|
|
249
|
+
* scoped file produced no row.
|
|
399
250
|
*
|
|
400
251
|
* @param {{
|
|
401
252
|
* kind: 'maintainability' | 'crap' | 'coverage' | 'duplication',
|
|
@@ -441,10 +292,6 @@ export async function refreshBaseline(opts = {}) {
|
|
|
441
292
|
|
|
442
293
|
validateOptions({ kind, scopeFiles, fullScope, writePath });
|
|
443
294
|
|
|
444
|
-
// Resolve the kind's scorer. Tests / production wiring inject via
|
|
445
|
-
// `opts.scorer`; otherwise build the default scorer lazily with the project
|
|
446
|
-
// config resolved against `cwd` (Story #3694) so the crap/maintainability
|
|
447
|
-
// defaults honour the configured targetDirs/ignoreGlobs.
|
|
448
295
|
const resolvedScorer = scorer ?? resolveDefaultScorer(kind, { cwd });
|
|
449
296
|
if (typeof resolvedScorer !== 'function') {
|
|
450
297
|
throw new Error(
|
|
@@ -452,7 +299,6 @@ export async function refreshBaseline(opts = {}) {
|
|
|
452
299
|
);
|
|
453
300
|
}
|
|
454
301
|
|
|
455
|
-
// Resolve the in-scope file set.
|
|
456
302
|
const scope = await resolveScope({
|
|
457
303
|
kind,
|
|
458
304
|
scopeFiles,
|
|
@@ -463,10 +309,7 @@ export async function refreshBaseline(opts = {}) {
|
|
|
463
309
|
cwd,
|
|
464
310
|
});
|
|
465
311
|
|
|
466
|
-
//
|
|
467
|
-
// receives an empty `files` list and is expected to scan the whole
|
|
468
|
-
// target tree itself (the scorer owns the directory walk — the service
|
|
469
|
-
// does not, by design).
|
|
312
|
+
// On full scope `files` is empty: the scorer owns the directory walk.
|
|
470
313
|
const scoredRows = await resolvedScorer(scope.files, {
|
|
471
314
|
kind,
|
|
472
315
|
fullScope: scope.mode === 'full',
|
|
@@ -480,12 +323,7 @@ export async function refreshBaseline(opts = {}) {
|
|
|
480
323
|
);
|
|
481
324
|
}
|
|
482
325
|
|
|
483
|
-
//
|
|
484
|
-
// `writer.write()` already runs each row through the per-kind
|
|
485
|
-
// `projectRow` which calls `canonicalise()` internally, but funnelling
|
|
486
|
-
// through `canonicalizeBaselinePath()` here is the explicit
|
|
487
|
-
// service-level contract: rows leave the service with canonical keys,
|
|
488
|
-
// regardless of which scorer produced them.
|
|
326
|
+
// Rows leave the service canonical whatever scorer produced them.
|
|
489
327
|
const canonicalRows = scoredRows.map((row) => ({
|
|
490
328
|
...row,
|
|
491
329
|
path: canonicalizeBaselinePath(row.path ?? row.file),
|
|
@@ -499,12 +337,8 @@ export async function refreshBaseline(opts = {}) {
|
|
|
499
337
|
requiredScopeFilePredicate,
|
|
500
338
|
});
|
|
501
339
|
|
|
502
|
-
// Read the prior envelope so out-of-scope rows survive (Task #2209) and
|
|
503
|
-
// the structural-equality short-circuit can fire.
|
|
504
340
|
const priorEnvelope = readPriorEnvelope(writePath, fs);
|
|
505
341
|
|
|
506
|
-
// Hand off to the shared writer. It applies `mergeRows` (scope), then
|
|
507
|
-
// `applyEpsilon` (stability), then sort + rollup + envelope stamping.
|
|
508
342
|
const envelope = writeEnvelope({
|
|
509
343
|
kind,
|
|
510
344
|
rows: canonicalRows,
|
|
@@ -518,10 +352,8 @@ export async function refreshBaseline(opts = {}) {
|
|
|
518
352
|
generatedAt: generatedAt ?? process.env.MANDREL_BASELINE_GENERATED_AT,
|
|
519
353
|
});
|
|
520
354
|
|
|
521
|
-
//
|
|
522
|
-
//
|
|
523
|
-
// nothing changed; in that case we skip the disk write so the on-disk
|
|
524
|
-
// bytes (including `generatedAt`) are preserved verbatim.
|
|
355
|
+
// The writer returns the prior object itself when nothing changed; skip the
|
|
356
|
+
// write so on-disk bytes (including `generatedAt`) stay verbatim.
|
|
525
357
|
let wrote = false;
|
|
526
358
|
if (priorEnvelope === null || envelope !== priorEnvelope) {
|
|
527
359
|
writeEnvelopeFile(writePath, envelope, { fsImpl: fs });
|
|
@@ -571,11 +403,8 @@ function assertRequiredScopeRows({
|
|
|
571
403
|
}
|
|
572
404
|
|
|
573
405
|
/**
|
|
574
|
-
*
|
|
575
|
-
*
|
|
576
|
-
* never a shell — and only the canonical two-dot range `baseRef..headRef`:
|
|
577
|
-
* triple-dot is intentionally avoided so the result reflects exactly the
|
|
578
|
-
* files that differ between the two refs at the time of the call.
|
|
406
|
+
* Two-dot range (not triple-dot): exactly the files that differ between the
|
|
407
|
+
* two refs now. `execFile`, never a shell.
|
|
579
408
|
*
|
|
580
409
|
* @param {{ baseRef: string, headRef: string, cwd: string }} args
|
|
581
410
|
* @returns {Promise<string[]>}
|
|
@@ -593,8 +422,6 @@ async function defaultGitDiff({ baseRef, headRef, cwd }) {
|
|
|
593
422
|
.map((line) => line.trim())
|
|
594
423
|
.filter((line) => line.length > 0);
|
|
595
424
|
} catch (err) {
|
|
596
|
-
// A missing ref or corrupt repo is the operator's signal to inspect
|
|
597
|
-
// the working tree. Best-effort: emit a friction-friendly error.
|
|
598
425
|
throw new Error(
|
|
599
426
|
`refreshBaseline: git diff --name-only ${range} failed in ${cwd}: ${err.message}`,
|
|
600
427
|
);
|
|
@@ -602,15 +429,7 @@ async function defaultGitDiff({ baseRef, headRef, cwd }) {
|
|
|
602
429
|
}
|
|
603
430
|
|
|
604
431
|
/**
|
|
605
|
-
*
|
|
606
|
-
* filtered by `predicate` (Story #2197, Task #2207). Exposed as a named
|
|
607
|
-
* export so the diff-scope behaviour can be exercised in isolation. Every
|
|
608
|
-
* file returned is canonicalized via `canonicalizeBaselinePath()` before
|
|
609
|
-
* the predicate runs, so the predicate may assume POSIX, repo-relative
|
|
610
|
-
* input regardless of what shape `git diff` printed on the host platform.
|
|
611
|
-
*
|
|
612
|
-
* Pure-by-design: `gitDiff` is injected by the caller (defaults to
|
|
613
|
-
* `defaultGitDiff` which uses `execFile`, never a shell).
|
|
432
|
+
* Diff-derived scope; paths are canonicalized before `predicate` sees them.
|
|
614
433
|
*
|
|
615
434
|
* @param {{
|
|
616
435
|
* baseRef: string,
|
|
@@ -642,10 +461,6 @@ export async function deriveScopeFromDiff({
|
|
|
642
461
|
}
|
|
643
462
|
|
|
644
463
|
/**
|
|
645
|
-
* Look up the file predicate for `kind`. Exposed so external tests can
|
|
646
|
-
* verify the per-kind extension filter without depending on the private
|
|
647
|
-
* `KIND_FILE_PREDICATES` table.
|
|
648
|
-
*
|
|
649
464
|
* @param {string} kind
|
|
650
465
|
* @returns {(p: string) => boolean}
|
|
651
466
|
*/
|
|
@@ -659,18 +474,7 @@ export function fileFilterFor(kind) {
|
|
|
659
474
|
return pred;
|
|
660
475
|
}
|
|
661
476
|
|
|
662
|
-
/**
|
|
663
|
-
* Resolve the in-scope file set for this refresh call. Returns a flat
|
|
664
|
-
* `{ mode, ref?, files }` record so callers can branch on the resolution
|
|
665
|
-
* mode without re-deriving it from the input shape.
|
|
666
|
-
*
|
|
667
|
-
* Resolution order:
|
|
668
|
-
*
|
|
669
|
-
* 1. `fullScope === true` -> `{ mode: 'full', files: [] }`.
|
|
670
|
-
* 2. `scopeFiles` is an array -> `{ mode: 'explicit', files }`.
|
|
671
|
-
* 3. `scopeFiles === null` -> derive via `gitDiff` filtered by the kind's
|
|
672
|
-
* predicate -> `{ mode: 'diff', ref: baseRef..headRef, files }`.
|
|
673
|
-
*/
|
|
477
|
+
/** Full, then explicit list, then diff-derived. */
|
|
674
478
|
async function resolveScope({
|
|
675
479
|
kind,
|
|
676
480
|
scopeFiles,
|
|
@@ -689,7 +493,6 @@ async function resolveScope({
|
|
|
689
493
|
files: scopeFiles.map((p) => canonicalizeBaselinePath(p)),
|
|
690
494
|
};
|
|
691
495
|
}
|
|
692
|
-
// Diff-derived (Task #2207).
|
|
693
496
|
const files = await deriveScopeFromDiff({
|
|
694
497
|
baseRef,
|
|
695
498
|
headRef,
|
|
@@ -701,9 +504,7 @@ async function resolveScope({
|
|
|
701
504
|
}
|
|
702
505
|
|
|
703
506
|
/**
|
|
704
|
-
*
|
|
705
|
-
* any I/O or parse failure — the caller treats "no prior" as "fresh
|
|
706
|
-
* write" (regression-fail-safe).
|
|
507
|
+
* `null` on any read/parse/shape failure, which the caller treats as a fresh write.
|
|
707
508
|
*
|
|
708
509
|
* @param {string} writePath
|
|
709
510
|
* @param {typeof nodeFs} fs
|
|
@@ -734,10 +535,6 @@ function readPriorEnvelope(writePath, fs) {
|
|
|
734
535
|
}
|
|
735
536
|
}
|
|
736
537
|
|
|
737
|
-
/**
|
|
738
|
-
* Validate the option bag up-front. Throws on any contract violation so a
|
|
739
|
-
* misuse never silently produces an empty / wrong baseline.
|
|
740
|
-
*/
|
|
741
538
|
function validateOptions({ kind, scopeFiles, fullScope, writePath }) {
|
|
742
539
|
if (typeof kind !== 'string' || !SUPPORTED_KINDS.includes(kind)) {
|
|
743
540
|
throw new Error(
|
|
@@ -762,24 +559,10 @@ function validateOptions({ kind, scopeFiles, fullScope, writePath }) {
|
|
|
762
559
|
}
|
|
763
560
|
|
|
764
561
|
/**
|
|
765
|
-
*
|
|
766
|
-
*
|
|
767
|
-
*
|
|
768
|
-
*
|
|
769
|
-
* is *pairwise*: a clone is a relationship between two files, and jscpd can
|
|
770
|
-
* only report it if both sides are in the corpus it was handed. Narrowing the
|
|
771
|
-
* scan to the diff would drop every clone between a changed file and an
|
|
772
|
-
* unchanged one, i.e. exactly the duplication a refactor is most likely to
|
|
773
|
-
* introduce. So the `files` argument is intentionally unused: scope narrowing
|
|
774
|
-
* for this kind is a **write-side** concern, applied by the service handing
|
|
775
|
-
* `scope` to `writer.write()`, where `mergeRowsByScope` keeps the freshly
|
|
776
|
-
* scanned rows for in-scope files and preserves the prior rows verbatim for
|
|
777
|
-
* everything else.
|
|
778
|
-
*
|
|
779
|
-
* Reads `targetDirs` / `ignoreGlobs` off `gates.duplication`, not off a
|
|
780
|
-
* flattened accessor: `resolveQuality` never lifted duplication into the
|
|
781
|
-
* legacy bag (the kind post-dates it), so `quality.duplication` is always
|
|
782
|
-
* `undefined` and reading it would silently scan nothing.
|
|
562
|
+
* Always scans the whole tree: duplication is pairwise, so a diff-narrowed
|
|
563
|
+
* scan would miss clones between changed and unchanged files. Scope applies
|
|
564
|
+
* write-side only. Config comes from `gates.duplication`; `quality.duplication`
|
|
565
|
+
* is always undefined.
|
|
783
566
|
*
|
|
784
567
|
* @param {{ cwd: string, config?: object, quality?: object, detect?: (opts: object) => Promise<object[]> }} opts
|
|
785
568
|
* @returns {(files: string[], opts: object) => Promise<object[]>}
|