mandrel 2.60.0 → 2.62.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/merge-queue.js +158 -0
- 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 +190 -280
- 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 +183 -485
- 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 +32 -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,46 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* directly by `lib/qa/resolve-selection.js`, which needs the full set. The
|
|
8
|
-
* cap belongs at the envelope boundary instead, in its own module: on a
|
|
9
|
-
* consumer with a mature Gherkin corpus, `bddScenarios` grew to 118 KB —
|
|
10
|
-
* larger than `docsContext` and `systemPrompts` combined — consuming
|
|
11
|
-
* nearly the entire `PLAN_CONTEXT_ENVELOPE_BYTE_CEILING` headroom on its
|
|
12
|
-
* own and blocking `/audit-to-stories`' single-plan path entirely.
|
|
13
|
-
*
|
|
14
|
-
* Deliberately a fixed framework constant rather than an `.agentrc.json`
|
|
15
|
-
* knob: Story #4541 retired the one operator-tunable planner-context budget
|
|
16
|
-
* (`planning.context.maxBytes`) because a cap the operator can raise past
|
|
17
|
-
* what the model can read fails silently again, and the same reasoning
|
|
18
|
-
* applies here.
|
|
2
|
+
* Byte cap for the `bddScenarios` plan-envelope field. The scanner stays
|
|
3
|
+
* uncapped (other callers need the full set); the cap lives at the envelope
|
|
4
|
+
* boundary, since a mature corpus can crowd out the whole envelope. A fixed
|
|
5
|
+
* constant, not a config knob: a cap an operator can raise past what the
|
|
6
|
+
* model reads fails silently.
|
|
19
7
|
*/
|
|
20
8
|
|
|
21
9
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* several envelope fields, not the whole budget. At the measured ~337
|
|
25
|
-
* bytes/scenario average (Story #4977 evidence, a mature Gherkin corpus),
|
|
26
|
-
* 24 KB holds roughly 70 scenarios before truncating.
|
|
27
|
-
*
|
|
28
|
-
* Deliberately module-private: the only production consumer is
|
|
29
|
-
* {@link capBddScenarios} below via the `opts.byteBudget` default. Tests
|
|
30
|
-
* assert the resulting behavior (truncation, order, fit) rather than
|
|
31
|
-
* importing this value directly, so it carries no public export the
|
|
32
|
-
* `--production` dead-exports ratchet would otherwise flag as test-only.
|
|
10
|
+
* One field's share of the 256 KB envelope ceiling: about 70 scenarios.
|
|
11
|
+
* Module-private so it is not a test-only export.
|
|
33
12
|
*/
|
|
34
13
|
const BDD_SCENARIOS_BYTE_BUDGET = 24_000;
|
|
35
14
|
|
|
36
15
|
/**
|
|
37
|
-
* Truncate
|
|
38
|
-
* order — file walk order, then in-file order — never re-sorted), and
|
|
39
|
-
* report what was dropped rather than truncating silently: `truncated` is
|
|
40
|
-
* `null` when everything fit, else a note naming how many scenarios were
|
|
41
|
-
* cut (Story #5312).
|
|
16
|
+
* Truncate in scan order (never re-sorted) and report what was dropped.
|
|
42
17
|
*
|
|
43
|
-
* @param {Array<object>} scenarios
|
|
18
|
+
* @param {Array<object>} scenarios
|
|
44
19
|
* @param {{ byteBudget?: number }} [opts]
|
|
45
20
|
* @returns {{
|
|
46
21
|
* scenarios: Array<object>,
|
|
@@ -70,8 +45,6 @@ export function capBddScenarios(scenarios, opts = {}) {
|
|
|
70
45
|
}
|
|
71
46
|
|
|
72
47
|
/**
|
|
73
|
-
* The `truncated` note: `null` when everything fit, else what was cut.
|
|
74
|
-
*
|
|
75
48
|
* @param {Array<object>} list
|
|
76
49
|
* @param {number} cut
|
|
77
50
|
* @param {number} byteBudget
|
|
@@ -1,28 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* planner-grounding siblings were retired in Story #4811). The Acceptance
|
|
6
|
-
* Engineer step of
|
|
7
|
-
* `epic-plan-spec-author` currently writes ACs from Epic/Tech Spec narrative
|
|
8
|
-
* alone — it never inspects the consumer project's existing `.feature`
|
|
9
|
-
* files. Planned ACs frequently duplicate scenarios that already exist or
|
|
10
|
-
* re-specify behaviour the codebase already proves; the duplication is
|
|
11
|
-
* only discovered (at best) during `/mandrel-deliver` or (at worst) after
|
|
12
|
-
* a redundant PR ships.
|
|
13
|
-
*
|
|
14
|
-
* `scanBddScenarios` walks every configured feature root, parses each
|
|
15
|
-
* `.feature` file with a Gherkin-aware regex pass (deliberately not a
|
|
16
|
-
* full Gherkin AST — keep the scanner cheap and dependency-free), and
|
|
17
|
-
* returns one entry per scenario with its file path, line number,
|
|
18
|
-
* scenario title, tag list, and an extracted set of outcome keywords
|
|
19
|
-
* (action verb + objects from the "Then" clauses). The keyword set is
|
|
20
|
-
* the fuzzy-match surface the planner uses to spot ACs that already
|
|
21
|
-
* have a matching scenario.
|
|
22
|
-
*
|
|
23
|
-
* Determinism is load-bearing: the matcher is keyword-based, not
|
|
24
|
-
* embedding-based, so re-running `/mandrel-plan` against the same
|
|
25
|
-
* acceptance spec produces the same disposition annotations.
|
|
2
|
+
* Gherkin scenario index for `/mandrel-plan`, so planned ACs can be matched
|
|
3
|
+
* against existing scenarios. A cheap regex pass, not a full AST; matching is
|
|
4
|
+
* keyword-based (not embeddings) so re-planning is deterministic.
|
|
26
5
|
*/
|
|
27
6
|
|
|
28
7
|
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
@@ -31,9 +10,7 @@ import path from 'node:path';
|
|
|
31
10
|
import { Logger } from './Logger.js';
|
|
32
11
|
|
|
33
12
|
/**
|
|
34
|
-
*
|
|
35
|
-
* the given roots. Returns absolute paths; never throws on permission
|
|
36
|
-
* errors — unreadable directories are simply skipped.
|
|
13
|
+
* Unreadable directories are skipped, never thrown.
|
|
37
14
|
*
|
|
38
15
|
* @param {string[]} roots
|
|
39
16
|
* @param {{ logger?: { debug: Function } }} [opts]
|
|
@@ -79,14 +56,7 @@ function walk(dir, acc, logger) {
|
|
|
79
56
|
}
|
|
80
57
|
}
|
|
81
58
|
|
|
82
|
-
/**
|
|
83
|
-
* English stop words that carry no outcome semantics. Stripped from
|
|
84
|
-
* extracted keywords so "the invoice appears in the outbox" reduces to
|
|
85
|
-
* `{invoice, appears, outbox}` rather than including `{the, in}`.
|
|
86
|
-
*
|
|
87
|
-
* Kept short on purpose — false-negative pruning here is preferable to
|
|
88
|
-
* over-pruning a verb the matcher needs.
|
|
89
|
-
*/
|
|
59
|
+
/** Kept short: under-pruning beats pruning a verb the matcher needs. */
|
|
90
60
|
const STOP_WORDS = new Set([
|
|
91
61
|
'a',
|
|
92
62
|
'an',
|
|
@@ -121,13 +91,6 @@ const STOP_WORDS = new Set([
|
|
|
121
91
|
]);
|
|
122
92
|
|
|
123
93
|
/**
|
|
124
|
-
* Reduce a free-text outcome ("the invoice appears in the outbox") to a
|
|
125
|
-
* deterministic, lower-case keyword set ("invoice", "appears", "outbox").
|
|
126
|
-
* Words of length 1 are dropped; common stop words are filtered.
|
|
127
|
-
*
|
|
128
|
-
* Exported so the matcher and downstream tests can share the exact
|
|
129
|
-
* tokenisation contract.
|
|
130
|
-
*
|
|
131
94
|
* @param {string} text
|
|
132
95
|
* @returns {string[]}
|
|
133
96
|
*/
|
|
@@ -147,16 +110,8 @@ const THEN_LINE_RE = /^\s*(?:Then|And|But)\s+(.+?)\s*$/i;
|
|
|
147
110
|
const STEP_KEYWORD_RE = /^\s*(?:Given|When|Then|And|But|\*)\s+/i;
|
|
148
111
|
|
|
149
112
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* - `@tag` lines preceding a `Scenario:` are attached to that scenario.
|
|
154
|
-
* - `Scenario:` and `Scenario Outline:` both produce a row.
|
|
155
|
-
* - `Then` / `And` / `But` lines following the scenario (until the
|
|
156
|
-
* next scenario or EOF) feed the `outcomeKeywords` set.
|
|
157
|
-
*
|
|
158
|
-
* The Background block is recognised but its steps are NOT folded into
|
|
159
|
-
* outcomeKeywords — Background carries setup, not outcomes.
|
|
113
|
+
* Only `Then`/`And`/`But` lines feed `outcomeKeywords`; Background steps are
|
|
114
|
+
* setup, not outcomes, and are excluded.
|
|
160
115
|
*
|
|
161
116
|
* @param {string} body
|
|
162
117
|
* @returns {Array<{ scenarioTitle: string, line: number, tags: string[], outcomeKeywords: string[] }>}
|
|
@@ -199,8 +154,7 @@ export function parseFeatureBody(body) {
|
|
|
199
154
|
const thenMatch = raw.match(THEN_LINE_RE);
|
|
200
155
|
if (thenMatch) current.thenLines.push(thenMatch[1]);
|
|
201
156
|
}
|
|
202
|
-
//
|
|
203
|
-
// scenario yet — stray tags before a Feature: header don't bind.
|
|
157
|
+
// Stray tags before any scenario don't bind.
|
|
204
158
|
if (current === null && STEP_KEYWORD_RE.test(raw)) {
|
|
205
159
|
pendingTags = [];
|
|
206
160
|
}
|
|
@@ -223,14 +177,6 @@ function finalize(scenario) {
|
|
|
223
177
|
}
|
|
224
178
|
|
|
225
179
|
/**
|
|
226
|
-
* Scan every `.feature` file under the configured feature roots and
|
|
227
|
-
* return the full scenario index. Each row carries the absolute path,
|
|
228
|
-
* the 1-based line number of the `Scenario:` keyword, the title, the
|
|
229
|
-
* tag list, and the deterministic outcome-keyword set. Returns an
|
|
230
|
-
* empty array when no roots exist or no scenarios are found — the
|
|
231
|
-
* caller (the spec-author skill) uses emptiness to know the project
|
|
232
|
-
* hasn't adopted BDD, no warning required.
|
|
233
|
-
*
|
|
234
180
|
* @param {{ featureRoots: string[] }} opts
|
|
235
181
|
* @returns {Array<{ file: string, line: number, scenarioTitle: string, tags: string[], outcomeKeywords: string[] }>}
|
|
236
182
|
*/
|
|
@@ -264,11 +210,8 @@ export function scanBddScenarios(opts = {}) {
|
|
|
264
210
|
}
|
|
265
211
|
|
|
266
212
|
/**
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
* keywords the AC outcome shares with the scenario, normalised by the
|
|
270
|
-
* smaller of the two sets so single-word ACs aren't penalised against
|
|
271
|
-
* verbose scenarios (and vice versa).
|
|
213
|
+
* Shared keywords over the smaller set's size, so terse ACs are not
|
|
214
|
+
* penalised against verbose scenarios.
|
|
272
215
|
*
|
|
273
216
|
* @param {string} acOutcome
|
|
274
217
|
* @param {{ outcomeKeywords: string[] }} scenario
|
|
@@ -286,12 +229,7 @@ export function scoreMatch(acOutcome, scenario) {
|
|
|
286
229
|
}
|
|
287
230
|
|
|
288
231
|
/**
|
|
289
|
-
*
|
|
290
|
-
* Returns `null` when no scenario scores above `minScore` (default
|
|
291
|
-
* `0.5`). The matcher is intentionally conservative — false positives
|
|
292
|
-
* cost the planner more (rewriting the spec to "refine" a scenario
|
|
293
|
-
* that doesn't actually exist) than false negatives (writing a new
|
|
294
|
-
* scenario the operator can later dedupe).
|
|
232
|
+
* Conservative: a false match costs more than a duplicate scenario.
|
|
295
233
|
*
|
|
296
234
|
* @param {string} acOutcome
|
|
297
235
|
* @param {Array<{ outcomeKeywords: string[] }>} scenarios
|
|
@@ -1,38 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* definitions, and which `.feature` files sit under its `featureRoots`.
|
|
11
|
-
* Feature discovery is delegated to `listFeatureFiles` in
|
|
12
|
-
* `bdd-scenario-scanner.js` rather than copied: /mandrel-plan's scenario index and
|
|
13
|
-
* this gate must agree on what counts as a feature file, and two walkers
|
|
14
|
-
* would eventually disagree.
|
|
15
|
-
* 2. **Matching** — turn each definition's Cucumber expression or regular
|
|
16
|
-
* expression into one `RegExp`, and test a step's text against the index.
|
|
17
|
-
*
|
|
18
|
-
* ## Heuristic index, exact parser
|
|
19
|
-
*
|
|
20
|
-
* The parser half of the gate is exact: `@cucumber/gherkin` decides what
|
|
21
|
-
* compiles. This half is deliberately **not**. Reading step definitions
|
|
22
|
-
* without executing them means a regex scan over source text, and a scan
|
|
23
|
-
* cannot see a definition assembled at runtime, registered through a wrapper,
|
|
24
|
-
* or parameterised by a custom `defineParameterType`. That asymmetry is why
|
|
25
|
-
* the gate ships a step-waiver list: a false "unbound" must always have an
|
|
26
|
-
* escape that does not require switching the whole gate off.
|
|
27
|
-
*
|
|
28
|
-
* Supported Cucumber-expression constructs are the ones the built-in parameter
|
|
29
|
-
* types and the optional/alternation syntax cover — `{int}`, `{float}`,
|
|
30
|
-
* `{word}`, `{string}`, an anonymous `{}`, `text(s)` optionals, and `a/an`
|
|
31
|
-
* word alternation. An unrecognised `{custom}` degrades to `(.*)` rather than
|
|
32
|
-
* failing to match, because over-matching produces a missed finding while
|
|
33
|
-
* under-matching produces a false one, and a false one blocks a delivery.
|
|
34
|
-
*
|
|
35
|
-
* Nothing here reads configuration or exits a process; the CLI owns both.
|
|
2
|
+
* Scoped discovery and matching of BDD step definitions for
|
|
3
|
+
* `check-gherkin-corpus.js`. Feature discovery reuses the scenario scanner's
|
|
4
|
+
* `listFeatureFiles` so both agree on what a feature file is.
|
|
5
|
+
*
|
|
6
|
+
* The index is a heuristic source scan (it cannot see runtime-built or
|
|
7
|
+
* wrapped definitions), hence the gate's step-waiver list. An unknown
|
|
8
|
+
* `{custom}` parameter degrades to `(.*)`: over-matching misses a finding,
|
|
9
|
+
* under-matching blocks a delivery with a false one.
|
|
36
10
|
*/
|
|
37
11
|
|
|
38
12
|
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
@@ -42,7 +16,6 @@ import { listFeatureFiles } from './bdd-scenario-scanner.js';
|
|
|
42
16
|
|
|
43
17
|
export { listFeatureFiles };
|
|
44
18
|
|
|
45
|
-
/** Extensions a step-definition module may carry. */
|
|
46
19
|
const STEP_FILE_EXTENSIONS = Object.freeze([
|
|
47
20
|
'.js',
|
|
48
21
|
'.mjs',
|
|
@@ -53,15 +26,12 @@ const STEP_FILE_EXTENSIONS = Object.freeze([
|
|
|
53
26
|
'.tsx',
|
|
54
27
|
]);
|
|
55
28
|
|
|
56
|
-
/** Directory names never walked when looking for step definitions. */
|
|
57
29
|
const SKIPPED_DIRECTORIES = Object.freeze(
|
|
58
30
|
new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage']),
|
|
59
31
|
);
|
|
60
32
|
|
|
61
33
|
/**
|
|
62
|
-
*
|
|
63
|
-
* name inside the braces. The empty key is the anonymous `{}` parameter and
|
|
64
|
-
* doubles as the fallback for a custom type this scan cannot resolve.
|
|
34
|
+
* Built-in parameter types; `''` is `{}` and the fallback for custom types.
|
|
65
35
|
*
|
|
66
36
|
* @type {Readonly<Record<string, string>>}
|
|
67
37
|
*/
|
|
@@ -73,27 +43,16 @@ const PARAMETER_PATTERNS = Object.freeze({
|
|
|
73
43
|
string: '("[^"]*"|\'[^\']*\')',
|
|
74
44
|
});
|
|
75
45
|
|
|
76
|
-
/**
|
|
77
|
-
* Step-registration call sites this scan recognises. `Step` and `defineStep`
|
|
78
|
-
* cover the generic registrars playwright-bdd and cucumber-js both expose.
|
|
79
|
-
*
|
|
80
|
-
* Group 2/3 capture a quoted expression, group 4/5 a regular-expression
|
|
81
|
-
* literal with its flags.
|
|
82
|
-
*/
|
|
46
|
+
/** Groups 2/3: quoted expression; 4/5: regex literal and flags. */
|
|
83
47
|
const STEP_CALL_PATTERN =
|
|
84
48
|
/\b(Given|When|Then|And|But|Step|defineStep)\s*\(\s*(?:(['"`])((?:\\.|(?!\2)[^\\])*)\2|\/((?:\\.|\[(?:\\.|[^\]\\])*\]|[^/\\[])+)\/([dgimsuvy]*))/g;
|
|
85
49
|
|
|
86
|
-
/** Escape one character for literal use inside a regular expression. */
|
|
87
50
|
function escapeRegExp(text) {
|
|
88
51
|
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
89
52
|
}
|
|
90
53
|
|
|
91
54
|
/**
|
|
92
|
-
*
|
|
93
|
-
* placeholders become capture groups, `(optional)` runs become optional
|
|
94
|
-
* groups, and everything else is escaped literal text.
|
|
95
|
-
*
|
|
96
|
-
* @param {string} segment
|
|
55
|
+
* @param {string} segment An alternation-free piece of an expression.
|
|
97
56
|
* @returns {string}
|
|
98
57
|
*/
|
|
99
58
|
function renderSegment(segment) {
|
|
@@ -130,10 +89,7 @@ function renderSegment(segment) {
|
|
|
130
89
|
}
|
|
131
90
|
|
|
132
91
|
/**
|
|
133
|
-
*
|
|
134
|
-
* `\/` stays literal.
|
|
135
|
-
*
|
|
136
|
-
* @param {string} word
|
|
92
|
+
* @param {string} word Split on unescaped `/`.
|
|
137
93
|
* @returns {string[]}
|
|
138
94
|
*/
|
|
139
95
|
function splitAlternation(word) {
|
|
@@ -158,12 +114,8 @@ function splitAlternation(word) {
|
|
|
158
114
|
}
|
|
159
115
|
|
|
160
116
|
/**
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* Alternation is resolved per whitespace-separated word, which is what the
|
|
164
|
-
* real expression grammar does. Resolving it across the whole string instead
|
|
165
|
-
* would turn `I have a/an apple` into `^I have a|an apple$` — two anchored
|
|
166
|
-
* alternatives, neither of them the intended step.
|
|
117
|
+
* Alternation is per word, as in the real grammar; whole-string alternation
|
|
118
|
+
* would anchor the wrong alternatives.
|
|
167
119
|
*
|
|
168
120
|
* @param {string} expression
|
|
169
121
|
* @returns {RegExp}
|
|
@@ -183,18 +135,11 @@ function expressionToRegExp(expression) {
|
|
|
183
135
|
}
|
|
184
136
|
|
|
185
137
|
/**
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
* shared walker for the lint surfaces. That one matches a single extension and
|
|
190
|
-
* walks everything below the root, so reusing it here would mean seven passes
|
|
191
|
-
* — one per accepted extension — each of them descending into a `node_modules`
|
|
192
|
-
* a consumer's step root may well contain. It also rethrows every non-ENOENT
|
|
193
|
-
* `readdir` failure, where this walker must skip an unreadable directory: an
|
|
194
|
-
* unreadable *scope* has to surface as "zero step definitions", the gate's
|
|
195
|
-
* fail-closed path, which names the scope and its step roots.
|
|
138
|
+
* Not `fs-walk.js`: that walker takes one extension, descends into
|
|
139
|
+
* `node_modules`, and rethrows readdir failures, whereas an unreadable scope
|
|
140
|
+
* here must surface as "zero step definitions" (the gate's fail-closed path).
|
|
196
141
|
*
|
|
197
|
-
* @param {string[]} roots
|
|
142
|
+
* @param {string[]} roots
|
|
198
143
|
* @returns {string[]} absolute paths, sorted
|
|
199
144
|
*/
|
|
200
145
|
export function listStepFiles(roots) {
|
|
@@ -214,8 +159,7 @@ function walkStepDir(dir, acc) {
|
|
|
214
159
|
}
|
|
215
160
|
for (const entry of entries) {
|
|
216
161
|
const full = path.join(dir, entry.name);
|
|
217
|
-
//
|
|
218
|
-
// fall back to a stat for those rather than dropping them silently.
|
|
162
|
+
// A symlink is neither file nor directory to `withFileTypes`; stat it.
|
|
219
163
|
const isDir =
|
|
220
164
|
entry.isDirectory() || (entry.isSymbolicLink() && isDirAt(full));
|
|
221
165
|
if (isDir) {
|
|
@@ -235,10 +179,8 @@ function isDirAt(target) {
|
|
|
235
179
|
}
|
|
236
180
|
|
|
237
181
|
/**
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
* @param {string} source file contents
|
|
241
|
-
* @param {string} file absolute path, recorded on each entry
|
|
182
|
+
* @param {string} source
|
|
183
|
+
* @param {string} file
|
|
242
184
|
* @returns {Array<{ file: string, line: number, source: string, regex: RegExp }>}
|
|
243
185
|
*/
|
|
244
186
|
function parseStepDefinitions(source, file) {
|
|
@@ -255,12 +197,7 @@ function parseStepDefinitions(source, file) {
|
|
|
255
197
|
return entries;
|
|
256
198
|
}
|
|
257
199
|
|
|
258
|
-
/**
|
|
259
|
-
* Build one matcher from a captured registration. A malformed regular
|
|
260
|
-
* expression yields `null` — the definition is skipped rather than crashing
|
|
261
|
-
* the scan, and the steps it would have claimed surface as unbound, which is
|
|
262
|
-
* the safe direction.
|
|
263
|
-
*/
|
|
200
|
+
/** A malformed pattern yields `null`: its steps surface as unbound, the safe direction. */
|
|
264
201
|
function compileMatcher({ quoted, pattern, flags }) {
|
|
265
202
|
if (typeof quoted === 'string') {
|
|
266
203
|
try {
|
|
@@ -270,8 +207,7 @@ function compileMatcher({ quoted, pattern, flags }) {
|
|
|
270
207
|
}
|
|
271
208
|
}
|
|
272
209
|
try {
|
|
273
|
-
// `g
|
|
274
|
-
// cannot depend on how many times it has been consulted.
|
|
210
|
+
// `g`/`y` make `.test()` stateful.
|
|
275
211
|
return new RegExp(pattern, (flags ?? '').replace(/[gy]/g, ''));
|
|
276
212
|
} catch {
|
|
277
213
|
return null;
|
|
@@ -279,8 +215,6 @@ function compileMatcher({ quoted, pattern, flags }) {
|
|
|
279
215
|
}
|
|
280
216
|
|
|
281
217
|
/**
|
|
282
|
-
* Build the step index for one scope.
|
|
283
|
-
*
|
|
284
218
|
* @param {{ files: string[], readFile?: (p: string) => string }} params
|
|
285
219
|
* @returns {{ entries: Array<{ file: string, line: number, source: string, regex: RegExp }>, files: string[] }}
|
|
286
220
|
*/
|
|
@@ -300,11 +234,9 @@ export function buildStepIndex({ files, readFile }) {
|
|
|
300
234
|
}
|
|
301
235
|
|
|
302
236
|
/**
|
|
303
|
-
* Find the first definition in the index claiming `text`.
|
|
304
|
-
*
|
|
305
237
|
* @param {{ entries: Array<{ regex: RegExp }> }} index
|
|
306
|
-
* @param {string} text
|
|
307
|
-
* @returns {object | null}
|
|
238
|
+
* @param {string} text Step text without its keyword.
|
|
239
|
+
* @returns {object | null}
|
|
308
240
|
*/
|
|
309
241
|
export function matchStep(index, text) {
|
|
310
242
|
for (const entry of index?.entries ?? []) {
|
|
@@ -313,13 +245,7 @@ export function matchStep(index, text) {
|
|
|
313
245
|
return null;
|
|
314
246
|
}
|
|
315
247
|
|
|
316
|
-
/**
|
|
317
|
-
* Module-private helpers the suite drives directly. Bundled rather than
|
|
318
|
-
* exported individually — the same seam `knip-entry-sync.js` and
|
|
319
|
-
* `source-classifier.js` use — so test-only symbols cost one production
|
|
320
|
-
* dead-export row instead of one each, and so private helpers do not read as
|
|
321
|
-
* API.
|
|
322
|
-
*/
|
|
248
|
+
/** Test-only helpers, bundled so they cost one dead-export row. */
|
|
323
249
|
export const __testing = Object.freeze({
|
|
324
250
|
expressionToRegExp,
|
|
325
251
|
parseStepDefinitions,
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* driver
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* them is why this needs a doctor check rather than just an installer:
|
|
7
|
-
*
|
|
8
|
-
* 1. **`.gitattributes`** says which files use the driver. It is a tracked
|
|
9
|
-
* file, so installing the line once ships it to everyone.
|
|
10
|
-
* 2. **`git config merge.mandrel-baseline.driver`** says what the driver
|
|
11
|
-
* actually is. Git deliberately keeps this out of tracked config —
|
|
12
|
-
* otherwise a clone would execute a command chosen by whoever wrote the
|
|
13
|
-
* repo — so it is **per clone**, and a fresh clone silently falls back
|
|
14
|
-
* to git's text merge with no error at all.
|
|
15
|
-
*
|
|
16
|
-
* That silence is the whole reason `mandrel doctor` carries a check: an
|
|
17
|
-
* unregistered clone is not broken in any way it can report on its own, it
|
|
18
|
-
* just quietly goes back to conflicting (or worse, splicing) baselines.
|
|
19
|
-
*
|
|
20
|
-
* This module owns both halves plus the strings they share, so the installer
|
|
21
|
-
* and the doctor check cannot drift apart on the exact command.
|
|
2
|
+
* Register the `baselines/*.json` merge driver. The `.gitattributes` line is
|
|
3
|
+
* tracked; the `git config` driver command is per clone, so a fresh clone
|
|
4
|
+
* silently falls back to text merge — hence the doctor check. Owning both
|
|
5
|
+
* halves here keeps installer and doctor agreeing on the command.
|
|
22
6
|
*
|
|
23
7
|
* @module lib/bootstrap/baseline-merge-driver
|
|
24
8
|
*/
|
|
@@ -27,38 +11,22 @@ import fs from 'node:fs';
|
|
|
27
11
|
import path from 'node:path';
|
|
28
12
|
import { spawnCapture } from '../child-exec.js';
|
|
29
13
|
|
|
30
|
-
/** Driver name, as it appears on both sides of the registration. */
|
|
31
14
|
const BASELINE_MERGE_DRIVER_NAME = 'mandrel-baseline';
|
|
32
15
|
|
|
33
|
-
/** The `.gitattributes` line that routes baselines through the driver. */
|
|
34
16
|
const BASELINE_MERGE_ATTRIBUTE = `baselines/*.json merge=${BASELINE_MERGE_DRIVER_NAME}`;
|
|
35
17
|
|
|
36
|
-
/** Git config key holding the driver command. */
|
|
37
18
|
export const BASELINE_MERGE_DRIVER_CONFIG_KEY = `merge.${BASELINE_MERGE_DRIVER_NAME}.driver`;
|
|
38
19
|
|
|
39
|
-
/**
|
|
20
|
+
/** Relative: git runs the driver from the worktree root, in every worktree. */
|
|
40
21
|
const DRIVER_SCRIPT = '.agents/scripts/merge-baseline.js';
|
|
41
22
|
|
|
42
|
-
/**
|
|
23
|
+
/** In the order the driver's argv expects. */
|
|
43
24
|
const DRIVER_PLACEHOLDERS = '%O %A %B %P';
|
|
44
25
|
|
|
45
26
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* bare word `node`, and it is quoted. Git runs a merge driver through the
|
|
50
|
-
* shell, and that shell's `PATH` is whatever launched git — a GUI client, a
|
|
51
|
-
* Finder-launched editor, a `launchd` job — none of which necessarily carry
|
|
52
|
-
* the nvm/volta shim that puts `node` on an interactive shell's `PATH`. A
|
|
53
|
-
* driver that cannot start is not a loud failure: git reports the driver
|
|
54
|
-
* exited non-zero and falls back to leaving the file conflicted, which reads
|
|
55
|
-
* as "baselines conflict again" — the exact symptom the driver exists to
|
|
56
|
-
* remove. Quoting covers the installation whose node lives under a path with
|
|
57
|
-
* a space (`/Users/a b/.nvm/...`).
|
|
58
|
-
*
|
|
59
|
-
* The script path stays RELATIVE: git runs the driver from the worktree root,
|
|
60
|
-
* and that is also where `mandrel sync` materializes `.agents/`, so one
|
|
61
|
-
* command is correct in the main checkout and in every linked worktree.
|
|
27
|
+
* The node path is absolute and quoted: git's shell may lack the nvm/volta
|
|
28
|
+
* `PATH` shim (GUI clients, launchd), and a driver that cannot start just
|
|
29
|
+
* leaves the file conflicted. Quoting covers paths with spaces.
|
|
62
30
|
*
|
|
63
31
|
* @param {string} [execPath] Absolute path to the node binary.
|
|
64
32
|
* @returns {string}
|
|
@@ -67,31 +35,16 @@ function buildBaselineMergeDriverCommand(execPath = process.execPath) {
|
|
|
67
35
|
return `"${execPath}" ${DRIVER_SCRIPT} ${DRIVER_PLACEHOLDERS}`;
|
|
68
36
|
}
|
|
69
37
|
|
|
70
|
-
/** The driver command this process would install. */
|
|
71
38
|
const BASELINE_MERGE_DRIVER_COMMAND = buildBaselineMergeDriverCommand();
|
|
72
39
|
|
|
73
|
-
/**
|
|
74
|
-
* The exact command an operator runs to complete registration. Single-quoted
|
|
75
|
-
* because the command itself carries the double quotes around the node path.
|
|
76
|
-
*/
|
|
40
|
+
/** Single-quoted: the command carries double quotes around the node path. */
|
|
77
41
|
export const BASELINE_MERGE_DRIVER_REMEDY = `git config ${BASELINE_MERGE_DRIVER_CONFIG_KEY} '${BASELINE_MERGE_DRIVER_COMMAND}'`;
|
|
78
42
|
|
|
79
43
|
/**
|
|
80
|
-
* Split a
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* (with `--help`) rather than only assert the config key is non-empty. A key
|
|
85
|
-
* pointing at a node that no longer exists — the ordinary outcome of an nvm
|
|
86
|
-
* version bump after the driver was installed — is set, non-empty, and
|
|
87
|
-
* completely broken, and the pre-Story-#5277 check called that healthy.
|
|
88
|
-
*
|
|
89
|
-
* Tokenising here rather than handing the string to a shell is deliberate:
|
|
90
|
-
* the value is per-clone git config, and executing it through `shell: true`
|
|
91
|
-
* would turn any write to that key into arbitrary command execution
|
|
92
|
-
* (`security-baseline.md` § Output & Rendering — never concatenate into a
|
|
93
|
-
* shell command). Only double quotes are honoured, which is exactly the
|
|
94
|
-
* quoting {@link buildBaselineMergeDriverCommand} emits.
|
|
44
|
+
* Split a driver command into file + argv, dropping git placeholders, so the
|
|
45
|
+
* doctor can actually run it (an nvm bump leaves a set-but-broken key).
|
|
46
|
+
* Tokenised rather than shelled: executing per-clone config through a shell
|
|
47
|
+
* would be arbitrary command execution. Only double quotes are honoured.
|
|
95
48
|
*
|
|
96
49
|
* @param {string|null|undefined} command
|
|
97
50
|
* @returns {{ file: string, args: string[] }|null} null when there is no
|
|
@@ -112,8 +65,7 @@ export function parseBaselineMergeDriverCommand(command) {
|
|
|
112
65
|
}
|
|
113
66
|
|
|
114
67
|
/**
|
|
115
|
-
*
|
|
116
|
-
* Comment lines do not count — a commented-out registration is not one.
|
|
68
|
+
* Comment lines do not count.
|
|
117
69
|
*
|
|
118
70
|
* @param {string|null|undefined} gitattributes
|
|
119
71
|
* @returns {boolean}
|
|
@@ -129,23 +81,10 @@ function declaresBaselineMergeDriver(gitattributes) {
|
|
|
129
81
|
}
|
|
130
82
|
|
|
131
83
|
/**
|
|
132
|
-
* Is the driver
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* the same two-part answer, because the two halves fail differently:
|
|
137
|
-
*
|
|
138
|
-
* - **Not declared** → the project never opted in. Both callers stay
|
|
139
|
-
* silent; telling a consumer to register a driver for files they do not
|
|
140
|
-
* route through it is noise. An unreadable `.gitattributes` reads the
|
|
141
|
-
* same way, deliberately.
|
|
142
|
-
* - **Declared, empty command** → the silent case. Git reports nothing at
|
|
143
|
-
* all: it falls back to its own line-based merge, which on a generated
|
|
144
|
-
* baseline either conflicts on the `generatedAt` stamp or splices both
|
|
145
|
-
* sides' rows into a set neither side scored.
|
|
146
|
-
*
|
|
147
|
-
* The `runGit` seam takes argv tokens and returns `{ status, stdout }`, which
|
|
148
|
-
* is the shape both callers' own git surfaces already produce.
|
|
84
|
+
* Is the driver declared by the project and registered in this clone? Not
|
|
85
|
+
* declared (or unreadable `.gitattributes`) means the project never opted in
|
|
86
|
+
* and callers stay silent; declared with an empty command is the silent
|
|
87
|
+
* text-merge fallback callers must flag.
|
|
149
88
|
*
|
|
150
89
|
* @param {{
|
|
151
90
|
* projectRoot: string,
|
|
@@ -206,8 +145,6 @@ function ensureGitattributesLine(projectRoot, fsImpl = fs) {
|
|
|
206
145
|
}
|
|
207
146
|
|
|
208
147
|
/**
|
|
209
|
-
* Point `merge.mandrel-baseline.driver` at the driver in THIS clone.
|
|
210
|
-
*
|
|
211
148
|
* @param {string} projectRoot
|
|
212
149
|
* @param {typeof spawnCapture} [spawnImpl]
|
|
213
150
|
* @returns {{ action: 'set'|'already-present'|'not-a-repo'|'failed' }}
|
|
@@ -258,9 +195,6 @@ function ensureDriverGitConfig(projectRoot, spawnImpl = spawnCapture) {
|
|
|
258
195
|
}
|
|
259
196
|
|
|
260
197
|
/**
|
|
261
|
-
* Read `.gitattributes` without writing it — the `configOnly` half of
|
|
262
|
-
* {@link ensureBaselineMergeDriver}.
|
|
263
|
-
*
|
|
264
198
|
* @param {string} projectRoot
|
|
265
199
|
* @param {typeof fs} fsImpl
|
|
266
200
|
* @returns {{ action: 'already-present'|'absent', path: string }}
|
|
@@ -282,24 +216,10 @@ function probeGitattributesLine(projectRoot, fsImpl) {
|
|
|
282
216
|
}
|
|
283
217
|
|
|
284
218
|
/**
|
|
285
|
-
*
|
|
286
|
-
* `
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* - **Full (default)** — `mandrel init --with-quality` and this repo's own
|
|
291
|
-
* `prepare`. Writes the `.gitattributes` line as well as the config key:
|
|
292
|
-
* the caller has opted the repository into the quality surface, so
|
|
293
|
-
* declaring the attribute is part of what it asked for.
|
|
294
|
-
* - **`configOnly: true`** — consumer `mandrel sync`. Writes ONLY the
|
|
295
|
-
* per-clone config key, and only when `.gitattributes` already declares the
|
|
296
|
-
* attribute. `sync` materializes `.agents/`; it is not an opt-in to the
|
|
297
|
-
* quality surface, and creating a `.gitattributes` in a project that never
|
|
298
|
-
* asked for one would be `sync` changing git's behaviour on files it has no
|
|
299
|
-
* business touching. What it DOES fix is the real gap: the attribute is
|
|
300
|
-
* tracked and therefore ships with the repo, while the config key is
|
|
301
|
-
* per-clone and silently absent in every fresh clone — so the half that
|
|
302
|
-
* cannot travel is installed on the one command every consumer runs.
|
|
219
|
+
* Idempotent install. Full mode (init/prepare) writes the attribute and the
|
|
220
|
+
* config key. `configOnly` (consumer `sync`) writes only the per-clone key,
|
|
221
|
+
* and only when the project already declares the attribute — `sync` is not
|
|
222
|
+
* an opt-in to the quality surface.
|
|
303
223
|
*
|
|
304
224
|
* @param {object} ctx
|
|
305
225
|
* @param {string} ctx.projectRoot
|
|
@@ -141,11 +141,8 @@ export async function applyBranchProtection({
|
|
|
141
141
|
return { status: 'skipped', reason: 'no-checks' };
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
// a confusing transport error. Probe for existence first so operators
|
|
147
|
-
// get a clear "no-base-branch" skip rather than discovering the
|
|
148
|
-
// `enforce: false` opt-out by reading the failure message.
|
|
144
|
+
// On an empty repo the protection PUT 404s confusingly; probe first so the
|
|
145
|
+
// skip reads "no base branch".
|
|
149
146
|
if (typeof provider.branchExists === 'function') {
|
|
150
147
|
let exists = true;
|
|
151
148
|
try {
|