mandrel 2.59.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 +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- 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 +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- 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 +20 -82
- 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 +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,45 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Pure 3-way merge of baseline envelopes by row identity. A line-based git
|
|
3
|
+
* merge either conflicts on disjoint work (the `generatedAt` line) or splices
|
|
4
|
+
* both sides into a row set no scorer produced.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* differ on that line, even when they moved completely disjoint rows — so
|
|
10
|
-
* git's LINE-based merge has to reconcile it. Whether it can separate that
|
|
11
|
-
* hunk from the moved rows is an accident of proximity, and both outcomes
|
|
12
|
-
* are bad:
|
|
13
|
-
*
|
|
14
|
-
* - it cannot → a conflict on work that never actually overlapped;
|
|
15
|
-
* - it can → it splices both sides' row lines together into a row set
|
|
16
|
-
* NEITHER side ever scored. That silent one is the worse failure: the
|
|
17
|
-
* ratchet then guards a number no scorer produced.
|
|
18
|
-
*
|
|
19
|
-
* A baseline is not a text file. It is a set of rows keyed by identity plus
|
|
20
|
-
* a rollup DERIVED from those rows, so merging it as text is a category
|
|
21
|
-
* error. This module merges it as what it is.
|
|
22
|
-
*
|
|
23
|
-
* ## Contract
|
|
24
|
-
*
|
|
25
|
-
* Pure: no filesystem, no process, no clock. `assertEnvelope` is deliberately
|
|
26
|
-
* NOT called here (it compiles schemas off disk on first use) — the driver
|
|
27
|
-
* validates what this returns.
|
|
28
|
-
*
|
|
29
|
-
* Per row identity, the standard 3-way rule: the side that differs from base
|
|
30
|
-
* wins; when both sides differ from base AND from each other, that identity
|
|
31
|
-
* is a conflict. Absence is a value, so a row deleted on one side and
|
|
32
|
-
* untouched on the other merges to deleted.
|
|
33
|
-
*
|
|
34
|
-
* Two invariants are load-bearing:
|
|
35
|
-
*
|
|
36
|
-
* 1. **The rollup is recomputed, never merged.** Merging two rollups is
|
|
37
|
-
* the same splice hazard compressed into a single number, and unlike a
|
|
38
|
-
* spliced row set it leaves no evidence. It is always derived from the
|
|
39
|
-
* merged rows via the kind's own `rollup()`.
|
|
40
|
-
* 2. **Identity comes from the kind module** (`rowIdentity`), never from
|
|
41
|
-
* `keyField`. CRAP groups by file and identifies by method; keying on
|
|
42
|
-
* `keyField` would drop every method in a file but one.
|
|
6
|
+
* Per identity the side that differs from base wins; both differing is a
|
|
7
|
+
* conflict; absence is a value. The rollup is always recomputed from the
|
|
8
|
+
* merged rows, never merged. Identity comes from the kind's `rowIdentity`,
|
|
9
|
+
* never `keyField`. No I/O: the driver validates the result.
|
|
43
10
|
*
|
|
44
11
|
* @module lib/baselines/merge-envelopes
|
|
45
12
|
*/
|
|
@@ -48,22 +15,11 @@ import { deepEqual } from '../json-utils.js';
|
|
|
48
15
|
import { KNOWN_KINDS } from './envelope.js';
|
|
49
16
|
import { getKindModule } from './kernel.js';
|
|
50
17
|
|
|
51
|
-
/**
|
|
52
|
-
* Envelope keys that are NOT merged side-by-side: `rows` merge by identity,
|
|
53
|
-
* `rollup` is recomputed from them, and `generatedAt` resolves to the later
|
|
54
|
-
* of the two stamps rather than conflicting (it is metadata about when a
|
|
55
|
-
* scorer ran, not a scored value — treating it as content is the whole bug).
|
|
56
|
-
*/
|
|
18
|
+
/** Keys not merged 3-way: rows by identity, rollup derived, stamp = later. */
|
|
57
19
|
const DERIVED_KEYS = Object.freeze(['rows', 'rollup', 'generatedAt']);
|
|
58
20
|
|
|
59
21
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* Derived from `KNOWN_KINDS` rather than pattern-matched, so a file that is
|
|
63
|
-
* not a known per-kind envelope answers `null` — which is how the driver
|
|
64
|
-
* knows to hand it back to git's text merge instead of guessing at a shape
|
|
65
|
-
* it does not understand. `baselines/*.json` also matches several
|
|
66
|
-
* non-envelope baselines (arch-cycles, cyclomatic, dead-exports, …).
|
|
22
|
+
* Kind from `$schema`, or `null` for anything not a known per-kind envelope.
|
|
67
23
|
*
|
|
68
24
|
* @param {unknown} envelope
|
|
69
25
|
* @returns {string|null}
|
|
@@ -79,8 +35,7 @@ export function kindFromEnvelope(envelope) {
|
|
|
79
35
|
}
|
|
80
36
|
|
|
81
37
|
/**
|
|
82
|
-
*
|
|
83
|
-
* which makes deletion just another value rather than a special case.
|
|
38
|
+
* `undefined` = absent on that side, so deletion is just another value.
|
|
84
39
|
*
|
|
85
40
|
* @param {unknown} base
|
|
86
41
|
* @param {unknown} ours
|
|
@@ -95,10 +50,7 @@ function choose(base, ours, theirs) {
|
|
|
95
50
|
}
|
|
96
51
|
|
|
97
52
|
/**
|
|
98
|
-
*
|
|
99
|
-
* side is fatal rather than last-write-wins: it means the incoming file
|
|
100
|
-
* already violates the identity contract, and merging it would silently
|
|
101
|
-
* drop a row.
|
|
53
|
+
* A duplicate identity on one side throws; last-write-wins would drop a row.
|
|
102
54
|
*
|
|
103
55
|
* @param {Array<object>} rows
|
|
104
56
|
* @param {(row: object) => string} rowIdentity
|
|
@@ -125,10 +77,6 @@ function indexRows(rows, rowIdentity, side) {
|
|
|
125
77
|
}
|
|
126
78
|
|
|
127
79
|
/**
|
|
128
|
-
* Resolve `generatedAt` to the later of the two sides. A stamp is metadata,
|
|
129
|
-
* so it never conflicts: the merged file describes a tree scored as recently
|
|
130
|
-
* as the newer of its inputs.
|
|
131
|
-
*
|
|
132
80
|
* @param {string|undefined} ours
|
|
133
81
|
* @param {string|undefined} theirs
|
|
134
82
|
* @returns {string|undefined}
|
|
@@ -143,10 +91,8 @@ function laterStamp(ours, theirs) {
|
|
|
143
91
|
}
|
|
144
92
|
|
|
145
93
|
/**
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* bump to different values is a genuine conflict — two branches disagreeing
|
|
149
|
-
* about which scorer produced the file.
|
|
94
|
+
* 3-way merge of envelope stamps; a double bump to different values is a
|
|
95
|
+
* real conflict (two scorers).
|
|
150
96
|
*
|
|
151
97
|
* @param {object} base
|
|
152
98
|
* @param {object} ours
|
|
@@ -180,11 +126,6 @@ function mergeStamps(base, ours, theirs) {
|
|
|
180
126
|
}
|
|
181
127
|
|
|
182
128
|
/**
|
|
183
|
-
* The row half of a 3-way merge, shared by the envelope path and the plain
|
|
184
|
-
* row-baseline path below. Both merge a set of rows keyed by identity against
|
|
185
|
-
* a common ancestor; they differ only in where the identity comes from and in
|
|
186
|
-
* what they assemble around the result.
|
|
187
|
-
*
|
|
188
129
|
* @param {{
|
|
189
130
|
* baseEnv: object,
|
|
190
131
|
* ours: object|null|undefined,
|
|
@@ -218,8 +159,7 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
|
|
|
218
159
|
ours: o,
|
|
219
160
|
theirs: t,
|
|
220
161
|
});
|
|
221
|
-
// Keep
|
|
222
|
-
// driver renders the conflict markers around it from this record.
|
|
162
|
+
// Keep ours so the row set stays well-formed; the driver adds markers.
|
|
223
163
|
if (o !== undefined) rows.push(o);
|
|
224
164
|
else if (t !== undefined) rows.push(t);
|
|
225
165
|
continue;
|
|
@@ -230,7 +170,8 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
|
|
|
230
170
|
}
|
|
231
171
|
|
|
232
172
|
/**
|
|
233
|
-
*
|
|
173
|
+
* `base` is `null` when the file was added on both sides. `components`
|
|
174
|
+
* defaults to `[]`, matching what a refresh writes.
|
|
234
175
|
*
|
|
235
176
|
* @param {{
|
|
236
177
|
* base: object|null,
|
|
@@ -239,11 +180,6 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
|
|
|
239
180
|
* kind?: string,
|
|
240
181
|
* components?: Array<object>,
|
|
241
182
|
* }} params
|
|
242
|
-
* - `base` — the merge ancestor; `null` (or a rowless object) when the
|
|
243
|
-
* file was added on both sides.
|
|
244
|
-
* - `components` — passed straight to the kind's `rollup()`. Defaults to
|
|
245
|
-
* `[]`, which is what `refreshBaseline` effectively uses, so a merged
|
|
246
|
-
* envelope carries the same `{'*': …}` rollup shape a refresh writes.
|
|
247
183
|
* @returns {{
|
|
248
184
|
* kind: string,
|
|
249
185
|
* envelope: object,
|
|
@@ -296,14 +232,8 @@ export function mergeEnvelopes({
|
|
|
296
232
|
}
|
|
297
233
|
|
|
298
234
|
/**
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
* The invariant this serves is "a clean driver merge stays byte-identical to
|
|
302
|
-
* a regeneration": both generators below write
|
|
303
|
-
* `JSON.stringify(envelope, null, 2)`, which preserves insertion order, so a
|
|
304
|
-
* merged file whose keys are in a different order than the generator's is a
|
|
305
|
-
* spurious diff on every subsequent refresh. Unknown keys are appended rather
|
|
306
|
-
* than dropped — a merge is never the place to lose a field.
|
|
235
|
+
* Declared key order, then leftovers (never dropped), so a clean merge stays
|
|
236
|
+
* byte-identical to the generator's insertion-ordered output.
|
|
307
237
|
*
|
|
308
238
|
* @param {object} obj
|
|
309
239
|
* @param {string[]} order
|
|
@@ -321,15 +251,9 @@ function orderKeys(obj, order) {
|
|
|
321
251
|
}
|
|
322
252
|
|
|
323
253
|
/**
|
|
324
|
-
*
|
|
325
|
-
* `
|
|
326
|
-
*
|
|
327
|
-
* Deriving rather than merging matters more here than anywhere: the rollup is
|
|
328
|
-
* three counts over the whole row set, so two branches that each add one row
|
|
329
|
-
* BOTH write `filesAboveCeiling: n + 1`. A 3-way merge sees two identical
|
|
330
|
-
* values and resolves them clean — to a number that is wrong by one, with no
|
|
331
|
-
* conflict and no evidence. That is the silent splice this module exists to
|
|
332
|
-
* refuse, compressed into a single field.
|
|
254
|
+
* Same arithmetic as `buildCyclomaticEnvelope`. Must be derived: two branches
|
|
255
|
+
* each adding a row both write `n + 1`, which a 3-way merge resolves cleanly
|
|
256
|
+
* and wrongly.
|
|
333
257
|
*
|
|
334
258
|
* @param {Array<object>} rows
|
|
335
259
|
* @returns {{ '*': { filesAboveCeiling: number, methodsAboveCeiling: number, maxCyclomatic: number } }}
|
|
@@ -352,23 +276,8 @@ function cyclomaticRollup(rows) {
|
|
|
352
276
|
}
|
|
353
277
|
|
|
354
278
|
/**
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* `baselines/*.json` matches more than the eight kernel kinds. Three of the
|
|
358
|
-
* extras are row sets with a real identity, and before this registry the
|
|
359
|
-
* driver handed all three straight back to `git merge-file` — so `.gitattributes`
|
|
360
|
-
* declared them driver-merged while they were still text-merged, with exactly
|
|
361
|
-
* the two failure modes the driver replaces. `dead-exports*.json` in particular
|
|
362
|
-
* is a long, uniform list of two-key objects: the shape git splices most
|
|
363
|
-
* happily and least visibly.
|
|
364
|
-
*
|
|
365
|
-
* `rollup: null` is a genuine absence, not an omission — the dead-export
|
|
366
|
-
* generator writes no rollup key at all, so deriving one would invent a field
|
|
367
|
-
* the checker never reads and the generator would strip on the next refresh.
|
|
368
|
-
* `cyclomatic` does carry one, and derives it (see {@link cyclomaticRollup}).
|
|
369
|
-
*
|
|
370
|
-
* `keyOrder` mirrors each generator's own insertion order; see
|
|
371
|
-
* {@link orderKeys}.
|
|
279
|
+
* Row-set baselines that are not per-kind envelopes. `rollup: null` is real:
|
|
280
|
+
* the dead-export generator writes none. `keyOrder` mirrors each generator.
|
|
372
281
|
*/
|
|
373
282
|
const PLAIN_BASELINE_KINDS = Object.freeze({
|
|
374
283
|
cyclomatic: Object.freeze({
|
|
@@ -398,11 +307,8 @@ const PLAIN_SCHEMA_KINDS = Object.freeze({
|
|
|
398
307
|
});
|
|
399
308
|
|
|
400
309
|
/**
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
* The production dead-export pass reports as its own kind so the regenerate
|
|
404
|
-
* remedy can name the right command, even though the two share a schema and
|
|
405
|
-
* merge identically.
|
|
310
|
+
* The production dead-export pass reports as its own kind so the remedy
|
|
311
|
+
* names the right command.
|
|
406
312
|
*
|
|
407
313
|
* @param {unknown} envelope
|
|
408
314
|
* @returns {string|null}
|
|
@@ -417,7 +323,6 @@ export function plainKindFromEnvelope(envelope) {
|
|
|
417
323
|
return kind;
|
|
418
324
|
}
|
|
419
325
|
|
|
420
|
-
/** The merge spec for a plain kind, collapsing the two dead-export passes. */
|
|
421
326
|
function plainSpec(kind) {
|
|
422
327
|
return PLAIN_BASELINE_KINDS[
|
|
423
328
|
kind === 'dead-exports-production' ? 'dead-exports' : kind
|
|
@@ -425,11 +330,7 @@ function plainSpec(kind) {
|
|
|
425
330
|
}
|
|
426
331
|
|
|
427
332
|
/**
|
|
428
|
-
*
|
|
429
|
-
*
|
|
430
|
-
* Same contract as {@link mergeEnvelopes} — rows merge by identity, stamps
|
|
431
|
-
* merge 3-way, `generatedAt` resolves to the later of the two — minus the
|
|
432
|
-
* kernel protocol these kinds do not participate in.
|
|
333
|
+
* Same contract as {@link mergeEnvelopes}, without the kernel protocol.
|
|
433
334
|
*
|
|
434
335
|
* @param {{ base: object|null, ours: object, theirs: object, kind?: string }} params
|
|
435
336
|
* @returns {{ kind: string, envelope: object, conflicts: Array<object> }}
|
|
@@ -472,7 +373,6 @@ export function mergePlainBaseline({ base, ours, theirs, kind } = {}) {
|
|
|
472
373
|
};
|
|
473
374
|
}
|
|
474
375
|
|
|
475
|
-
/** Per-kind regeneration commands; anything unlisted follows the convention. */
|
|
476
376
|
const REGENERATE_COMMANDS = Object.freeze({
|
|
477
377
|
'dead-exports': 'npm run dead-exports:update',
|
|
478
378
|
'dead-exports-production': 'npm run dead-exports:update',
|
|
@@ -480,14 +380,8 @@ const REGENERATE_COMMANDS = Object.freeze({
|
|
|
480
380
|
});
|
|
481
381
|
|
|
482
382
|
/**
|
|
483
|
-
*
|
|
484
|
-
*
|
|
485
|
-
* A conflicted merge leaves the rollup describing a row set nobody scored:
|
|
486
|
-
* the driver derives it from rows that still carry conflict markers around
|
|
487
|
-
* them, and no hand-resolution of those markers updates it. Resolving the
|
|
488
|
-
* rows is therefore only half the job, and the half operators skip — so the
|
|
489
|
-
* driver says the other half out loud rather than leaving a plausible-looking
|
|
490
|
-
* number behind.
|
|
383
|
+
* After a conflicted merge, hand-resolving rows never updates the rollup, so
|
|
384
|
+
* the driver must name the regeneration command.
|
|
491
385
|
*
|
|
492
386
|
* @param {string} kind
|
|
493
387
|
* @returns {string}
|
|
@@ -497,18 +391,8 @@ export function baselineRegenerateRemedy(kind) {
|
|
|
497
391
|
}
|
|
498
392
|
|
|
499
393
|
/**
|
|
500
|
-
* Wrap each conflicted
|
|
501
|
-
*
|
|
502
|
-
* Envelope conflicts used to be reported on stderr alone, and the file was
|
|
503
|
-
* left holding the ours-side value with no marker in it. Git reads the
|
|
504
|
-
* driver's non-zero exit as "conflicted" and leaves the path unmerged, so the
|
|
505
|
-
* operator opens a file that looks cleanly merged and has to reconstruct from
|
|
506
|
-
* a scrollback line which stamp disagreed. A `kernelVersion` double-bump is
|
|
507
|
-
* exactly the case where the two sides mean different scorers and picking one
|
|
508
|
-
* silently is wrong.
|
|
509
|
-
*
|
|
510
|
-
* Operates on the canonical text the merged projection already produced, so
|
|
511
|
-
* every unconflicted line stays byte-identical to a clean merge.
|
|
394
|
+
* Wrap each conflicted stamp in git conflict markers so the unmerged file
|
|
395
|
+
* shows which stamp disagreed. Unconflicted lines stay byte-identical.
|
|
512
396
|
*
|
|
513
397
|
* @param {string} text Canonical serialization of the merged envelope.
|
|
514
398
|
* @param {Array<{ identity: string, ours?: unknown, theirs?: unknown }>} conflicts
|
|
@@ -1,49 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* formerly separate `canonicalize-path.js` permissive coercer in here so
|
|
8
|
-
* there is a single import surface):
|
|
9
|
-
*
|
|
10
|
-
* - `canonicalise(p)` — the **strict** repo-relative canonicaliser. It
|
|
11
|
-
* rejects input it considers unsafe to key a baseline by, then
|
|
12
|
-
* normalises what it accepts.
|
|
13
|
-
* - `assertCanonical(p)` — the **throw-on-reject** writer-boundary check.
|
|
14
|
-
* It runs the same rejection checks as `canonicalise` but never
|
|
15
|
-
* transforms the input.
|
|
16
|
-
* - `canonicalizeBaselinePath(p)` — the **permissive coercer** used by the
|
|
17
|
-
* refresh service. It never throws on absolute / drive-letter / UNC
|
|
18
|
-
* input; instead it transforms those shapes into a repo-relative key,
|
|
19
|
-
* because its caller funnels raw `git diff` and tool output through a
|
|
20
|
-
* single point that must always yield a canonical key.
|
|
21
|
-
*
|
|
22
|
-
* `canonicalise` enforces, in order:
|
|
23
|
-
*
|
|
24
|
-
* 1. Rejects absolute paths (Windows `C:\...` or POSIX `/...`) — baselines
|
|
25
|
-
* that key by absolute paths break the moment they're checked out on a
|
|
26
|
-
* different machine, in a worktree, or in CI.
|
|
27
|
-
* 2. Rejects `..` segments — baselines must not name files outside the
|
|
28
|
-
* repo root, and the loader's signed-int comparison can otherwise be
|
|
29
|
-
* fooled by a traversal-shaped key.
|
|
30
|
-
* 3. Strips a leading `.worktrees/<workspace>/` prefix so a refresh run
|
|
31
|
-
* from inside `.worktrees/story-1891/...` produces the same key as a
|
|
32
|
-
* refresh from the main checkout. This is the defensive policy that
|
|
33
|
-
* stops a future worktree-based refresh from reintroducing the
|
|
34
|
-
* maintainability worktree-prefix regression that prompted Story #1891.
|
|
35
|
-
* 4. Normalises Windows backslashes to forward slashes.
|
|
36
|
-
* 5. Strips a leading `./` for cosmetic stability — `./src/a.js` and
|
|
37
|
-
* `src/a.js` are the same path and should serialise to the same key.
|
|
38
|
-
*
|
|
39
|
-
* Both `canonicalise` and `canonicalizeBaselinePath` are **idempotent**:
|
|
40
|
-
* feeding either function's output back in produces the same string. Tests
|
|
41
|
-
* pin this property explicitly.
|
|
42
|
-
*
|
|
43
|
-
* `assertCanonical` is the throw-on-reject variant. It runs the same checks
|
|
44
|
-
* but does not transform the input — used at the writer boundary to assert
|
|
45
|
-
* a row's `path` has already been canonicalised by the caller (so the writer
|
|
46
|
-
* never silently rewrites a row's identity).
|
|
2
|
+
* The single authority for baseline path keys: `canonicalise` (strict,
|
|
3
|
+
* rejects absolute and `..` paths), `assertCanonical` (writer-boundary check,
|
|
4
|
+
* never transforms), and `canonicalizeBaselinePath` (permissive, coerces raw
|
|
5
|
+
* tool output). All strip a leading `.worktrees/<workspace>/` so worktree and
|
|
6
|
+
* main-checkout refreshes key identically. Both transformers are idempotent.
|
|
47
7
|
*
|
|
48
8
|
* @module lib/baselines/path-canon
|
|
49
9
|
*/
|
|
@@ -51,9 +11,7 @@
|
|
|
51
11
|
const WORKTREE_PREFIX = /^\.worktrees\/[^/\\]+[/\\]/;
|
|
52
12
|
|
|
53
13
|
/**
|
|
54
|
-
*
|
|
55
|
-
* paths have a drive letter (`C:`) or start with a backslash-separator
|
|
56
|
-
* (`\\server\share`). POSIX absolute paths start with a forward slash.
|
|
14
|
+
* Windows or POSIX absolute (including drive-relative `C:foo`).
|
|
57
15
|
*
|
|
58
16
|
* @param {string} value
|
|
59
17
|
* @returns {boolean}
|
|
@@ -61,16 +19,12 @@ const WORKTREE_PREFIX = /^\.worktrees\/[^/\\]+[/\\]/;
|
|
|
61
19
|
function isAbsolute(value) {
|
|
62
20
|
if (value.startsWith('/')) return true;
|
|
63
21
|
if (value.startsWith('\\')) return true;
|
|
64
|
-
// Drive-letter form: `C:\...` or `C:/...` or even bare `C:foo` (rare but
|
|
65
|
-
// still absolute in Windows semantics — refuse it).
|
|
66
22
|
if (/^[A-Za-z]:[\\/]?/.test(value)) return true;
|
|
67
23
|
return false;
|
|
68
24
|
}
|
|
69
25
|
|
|
70
26
|
/**
|
|
71
|
-
*
|
|
72
|
-
* `\` so a Windows-shaped path like `src\..\evil.js` is caught before
|
|
73
|
-
* normalisation rewrites the separators.
|
|
27
|
+
* Splits on both separators so `src\..\x` is caught before normalisation.
|
|
74
28
|
*
|
|
75
29
|
* @param {string} value
|
|
76
30
|
* @returns {boolean}
|
|
@@ -81,12 +35,8 @@ function hasTraversal(value) {
|
|
|
81
35
|
}
|
|
82
36
|
|
|
83
37
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* @param {string} input A repo-relative path. May use `\` or `/` separators
|
|
87
|
-
* and may carry a leading `./` or
|
|
88
|
-
* `.worktrees/<workspace>/` prefix.
|
|
89
|
-
* @returns {string} The canonical, forward-slash, repo-relative form.
|
|
38
|
+
* @param {string} input A repo-relative path.
|
|
39
|
+
* @returns {string}
|
|
90
40
|
* @throws {TypeError} When `input` is not a string.
|
|
91
41
|
* @throws {Error} When `input` is absolute or contains a `..` segment.
|
|
92
42
|
*/
|
|
@@ -110,22 +60,12 @@ export function canonicalise(input) {
|
|
|
110
60
|
);
|
|
111
61
|
}
|
|
112
62
|
|
|
113
|
-
// 1. Normalise separators first so the worktree-prefix regex sees a
|
|
114
|
-
// forward-slash form regardless of platform.
|
|
115
63
|
let working = input.replace(/\\/g, '/');
|
|
116
64
|
|
|
117
|
-
// 2. Strip `.worktrees/<workspace>/` prefix (defensive policy — see
|
|
118
|
-
// module preamble).
|
|
119
65
|
working = working.replace(WORKTREE_PREFIX, '');
|
|
120
66
|
|
|
121
|
-
// 3. Strip a leading `./` after worktree-prefix removal so
|
|
122
|
-
// `./.worktrees/story-1/src/a.js` and `.worktrees/story-1/src/a.js`
|
|
123
|
-
// converge.
|
|
124
67
|
if (working.startsWith('./')) working = working.slice(2);
|
|
125
68
|
|
|
126
|
-
// 4. Collapse any accidental double-slashes introduced by upstream
|
|
127
|
-
// string concat — leaves leading `/` alone since we've already
|
|
128
|
-
// rejected absolute paths.
|
|
129
69
|
working = working.replace(/\/{2,}/g, '/');
|
|
130
70
|
|
|
131
71
|
if (working.length === 0) {
|
|
@@ -138,10 +78,8 @@ export function canonicalise(input) {
|
|
|
138
78
|
}
|
|
139
79
|
|
|
140
80
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* check that callers have funnelled their rows through `canonicalise` before
|
|
144
|
-
* handing them to `write()`.
|
|
81
|
+
* Throw unless `input` is already canonical, so the writer never silently
|
|
82
|
+
* rewrites a row's identity.
|
|
145
83
|
*
|
|
146
84
|
* @param {string} input
|
|
147
85
|
* @returns {void}
|
|
@@ -189,46 +127,12 @@ export function assertCanonical(input) {
|
|
|
189
127
|
}
|
|
190
128
|
|
|
191
129
|
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
* drive-letter, or UNC input — it transforms those shapes into a
|
|
196
|
-
* repo-relative key because its caller (the refresh service) receives raw
|
|
197
|
-
* paths from `git diff` and tool output and needs a single funnel that
|
|
198
|
-
* always produces a canonical key.
|
|
199
|
-
*
|
|
200
|
-
* Rules, in order:
|
|
201
|
-
* 1. Reject non-string input with `TypeError`.
|
|
202
|
-
* 2. Swap every `\` for `/` so the rest of the pipeline sees a single
|
|
203
|
-
* separator style regardless of platform.
|
|
204
|
-
* 3. Strip a UNC prefix (`//server/share/`) so paths surfaced by tools
|
|
205
|
-
* that resolved a network share collapse to a repo-relative key.
|
|
206
|
-
* 4. Strip a Windows drive-letter prefix (`C:` / `C:/`) so paths
|
|
207
|
-
* surfaced by Windows tools collapse to the same key as the
|
|
208
|
-
* equivalent Linux path.
|
|
209
|
-
* 5. Strip a single leading `/` so a path that was absolute after
|
|
210
|
-
* drive-letter stripping becomes repo-relative.
|
|
211
|
-
* 6. Strip a leading `.worktrees/<workspace>/` prefix so a refresh run
|
|
212
|
-
* from inside a worktree produces the same key as a refresh from the
|
|
213
|
-
* main checkout. This MUST match the equivalent step in
|
|
214
|
-
* `canonicalise()` (Story #3695): the strict canonicaliser used by the
|
|
215
|
-
* per-kind `projectRow` strips this prefix, so the permissive coercer
|
|
216
|
-
* that builds the diff-scope `scope.files` set MUST strip it too —
|
|
217
|
-
* otherwise a scored row's path (`src/new.js`) never matches its
|
|
218
|
-
* worktree-prefixed scope entry (`.worktrees/story-1/src/new.js`) and
|
|
219
|
-
* a brand-new file's row is silently dropped from the scoped baseline.
|
|
220
|
-
* 7. Strip a leading `./` for cosmetic stability.
|
|
221
|
-
* 8. Collapse any `/{2,}` run to a single `/`.
|
|
222
|
-
*
|
|
223
|
-
* The function is **idempotent**: feeding its own output back in produces
|
|
224
|
-
* the same string. Downstream consumers (the refresh service and the gate
|
|
225
|
-
* reader) rely on this property so a row written on Windows compares equal
|
|
226
|
-
* to the same row written on Linux.
|
|
130
|
+
* Coerce raw `git diff` / tool output into a repo-relative key; never throws
|
|
131
|
+
* on absolute, drive-letter or UNC input. Idempotent, so Windows and Linux
|
|
132
|
+
* rows compare equal.
|
|
227
133
|
*
|
|
228
|
-
* @param {string} input A raw filesystem path.
|
|
229
|
-
*
|
|
230
|
-
* be absolute or relative.
|
|
231
|
-
* @returns {string} The canonical, forward-slash, repo-relative key.
|
|
134
|
+
* @param {string} input A raw filesystem path.
|
|
135
|
+
* @returns {string}
|
|
232
136
|
* @throws {TypeError} When `input` is not a string.
|
|
233
137
|
*/
|
|
234
138
|
export function canonicalizeBaselinePath(input) {
|
|
@@ -238,41 +142,28 @@ export function canonicalizeBaselinePath(input) {
|
|
|
238
142
|
);
|
|
239
143
|
}
|
|
240
144
|
|
|
241
|
-
// 1. Normalize separators first.
|
|
242
145
|
let working = input.replace(/\\/g, '/');
|
|
243
146
|
|
|
244
|
-
//
|
|
245
|
-
// double-slash collapse so the share name is preserved as a regular
|
|
246
|
-
// path segment, not eaten.
|
|
147
|
+
// Before the double-slash collapse, which would eat the UNC prefix.
|
|
247
148
|
const uncMatch = working.match(/^\/\/([^/]+)\/([^/]+)(\/|$)/);
|
|
248
149
|
if (uncMatch) {
|
|
249
150
|
working = working.slice(uncMatch[0].length);
|
|
250
151
|
}
|
|
251
152
|
|
|
252
|
-
// 3. Strip Windows drive-letter prefix (`C:` or `C:/`).
|
|
253
153
|
working = working.replace(/^[A-Za-z]:\/?/, '');
|
|
254
154
|
|
|
255
|
-
// 4. Strip a single leading `/` so an absolute path becomes
|
|
256
|
-
// repo-relative.
|
|
257
155
|
if (working.startsWith('/')) {
|
|
258
156
|
working = working.replace(/^\/+/, '');
|
|
259
157
|
}
|
|
260
158
|
|
|
261
|
-
//
|
|
262
|
-
//
|
|
263
|
-
// strict `canonicalise()` produces. Without this, a scored row path and
|
|
264
|
-
// its diff-scope `scope.files` entry diverge inside a worktree and the
|
|
265
|
-
// scope-aware merge drops brand-new files. Only a single leading
|
|
266
|
-
// segment is stripped — a legitimate inner `.worktrees/` directory the
|
|
267
|
-
// user named themselves is preserved (mirrors `canonicalise`).
|
|
159
|
+
// Must match `canonicalise`, or scope entries miss their rows inside a
|
|
160
|
+
// worktree and the scoped merge drops brand-new files.
|
|
268
161
|
working = working.replace(WORKTREE_PREFIX, '');
|
|
269
162
|
|
|
270
|
-
// 6. Strip a leading `./`.
|
|
271
163
|
if (working.startsWith('./')) {
|
|
272
164
|
working = working.slice(2);
|
|
273
165
|
}
|
|
274
166
|
|
|
275
|
-
// 7. Collapse redundant separators.
|
|
276
167
|
working = working.replace(/\/{2,}/g, '/');
|
|
277
168
|
|
|
278
169
|
return working;
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* quality-preview surface no longer depends on the to-be-deleted
|
|
6
|
-
* `check-maintainability.js` and `check-crap.js` CLI scripts. Each
|
|
7
|
-
* exported runner takes a parsed scope ref + an optional `--staged`
|
|
8
|
-
* flag, runs the same scan → compare → report-builder pipeline the CLIs
|
|
9
|
-
* used internally, and returns:
|
|
10
|
-
*
|
|
11
|
-
* {
|
|
12
|
-
* exitCode, // 0 = pass, 1 = regression / floor break
|
|
13
|
-
* envelope, // the same `--json` envelope the CLI emitted
|
|
14
|
-
* }
|
|
15
|
-
*
|
|
16
|
-
* No I/O beyond the scan itself; no friction signals (preview is a
|
|
17
|
-
* developer-facing tool, not a gate); no `process.exit`.
|
|
2
|
+
* `quality-preview` / `quality-watch` per-kind runners: scan, compare, and
|
|
3
|
+
* return `{ exitCode, envelope }` (1 = regression or floor break). No
|
|
4
|
+
* friction signals and no `process.exit`.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import path from 'node:path';
|
|
@@ -36,21 +23,11 @@ import {
|
|
|
36
23
|
MAINTAINABILITY_EXCLUSIONS,
|
|
37
24
|
} from './kinds/maintainability.js';
|
|
38
25
|
|
|
39
|
-
/**
|
|
40
|
-
* Framework default MI preview tolerance, used only when neither an explicit
|
|
41
|
-
* override nor a configured `quality.maintainability.tolerance` is present.
|
|
42
|
-
* Mirrors the historical preview default.
|
|
43
|
-
*/
|
|
44
26
|
export const MI_PREVIEW_DEFAULT_TOLERANCE = 0.5;
|
|
45
27
|
|
|
46
28
|
/**
|
|
47
|
-
*
|
|
48
|
-
* agrees with
|
|
49
|
-
* caller override → the configured `quality.maintainability.tolerance` (already
|
|
50
|
-
* resolved to a scalar by `getQuality`) → the framework default. Previously the
|
|
51
|
-
* preview hardcoded the default and ignored the configured value, so a project
|
|
52
|
-
* that raised its tolerance (e.g. to 12) still saw the local pre-commit/pre-push
|
|
53
|
-
* gate flag sub-tolerance drops that `check-baselines` accepted.
|
|
29
|
+
* Explicit override, then configured tolerance, then the default — so the
|
|
30
|
+
* preview agrees with `check-baselines`.
|
|
54
31
|
*
|
|
55
32
|
* @param {{ explicit?: number | null, configured?: number, fallback?: number }} opts
|
|
56
33
|
* @returns {number}
|
|
@@ -193,8 +170,7 @@ export async function runMaintainabilityPreview({
|
|
|
193
170
|
});
|
|
194
171
|
|
|
195
172
|
const rawScores = await calculateAll(scopedFiles);
|
|
196
|
-
//
|
|
197
|
-
// surface as phantom MI=0 regressions in the preview envelope.
|
|
173
|
+
// Excluded files would surface as phantom MI=0 regressions.
|
|
198
174
|
const scores = {};
|
|
199
175
|
for (const [key, mi] of Object.entries(rawScores)) {
|
|
200
176
|
const rel = path.isAbsolute(key) ? path.relative(cwd, key) : key;
|
|
@@ -237,13 +213,8 @@ export async function runCrapPreview({
|
|
|
237
213
|
return { exitCode: 0, envelope: emptyCrapEnvelope({ scope, diffRef }) };
|
|
238
214
|
}
|
|
239
215
|
|
|
240
|
-
//
|
|
241
|
-
//
|
|
242
|
-
// predate the running scorer cannot yield a meaningful per-method verdict,
|
|
243
|
-
// and emitting regressions from it asks the operator to fix code that is
|
|
244
|
-
// not broken. Fail open — the authoritative `check-baselines` gate still
|
|
245
|
-
// gates the merge, so a permissive pre-commit hook costs no real coverage
|
|
246
|
-
// while a blocking one costs a provably defect-free commit.
|
|
216
|
+
// An incompatible baseline yields no meaningful verdict. Fail open:
|
|
217
|
+
// `check-baselines` still gates the merge.
|
|
247
218
|
const incompatible = assertBaselineCompatible(baseline);
|
|
248
219
|
if (incompatible) {
|
|
249
220
|
return {
|