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,76 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// offline, in the same `npm run lint` that already guards every other
|
|
11
|
-
// framework-owned surface.
|
|
12
|
-
//
|
|
13
|
-
// Two contracts make the findings trustworthy rather than merely loud:
|
|
14
|
-
//
|
|
15
|
-
// must-compile parses with the REAL `@cucumber/gherkin` parser. A gate that
|
|
16
|
-
// re-implements acceptance is the defect it is trying to prevent: a
|
|
17
|
-
// hand-rolled line reader silently skips what it does not recognise, so a
|
|
18
|
-
// corpus that cannot generate reads clean. Whatever bddgen accepts is what
|
|
19
|
-
// this gate must accept, and the only way to guarantee that is to run the
|
|
20
|
-
// same parser.
|
|
21
|
-
//
|
|
22
|
-
// A file failing must-compile is EXCLUDED from must-bind. A broken file
|
|
23
|
-
// parses as an arbitrary subset of itself, so linting its surviving steps
|
|
24
|
-
// invents unbound findings that bury the one actionable line — the syntax
|
|
25
|
-
// error — under noise.
|
|
26
|
-
//
|
|
27
|
-
// The parser is an optional peer dependency (plus a framework devDependency),
|
|
28
|
-
// resolved through a require path rooted at the consumer project rather than
|
|
29
|
-
// imported by bare specifier. `.agents/` reaches a consumer by plain file
|
|
30
|
-
// copy, so a bare specifier here would resolve against the consumer's own
|
|
31
|
-
// module chain, which under a non-hoisting linker need not hold it at all.
|
|
32
|
-
// This mirrors the `typescript` optional-peer precedent and keeps a consumer
|
|
33
|
-
// with no BDD tier from gaining a runtime dependency.
|
|
34
|
-
//
|
|
35
|
-
// Exit codes:
|
|
36
|
-
// 0 clean, or `qa.gherkinLint` is not configured
|
|
37
|
-
// 1 a parse error, an unbound step, or a fail-closed condition
|
|
38
|
-
|
|
39
|
-
// .agents/scripts/check-gherkin-corpus.js — static gate over a project's
|
|
40
|
-
// Gherkin corpus: must-compile, then must-bind, scoped per step root.
|
|
41
|
-
//
|
|
42
|
-
// The framework ships the bddgen harness but nothing that inspects the corpus
|
|
43
|
-
// it generates from. Two corpus-wide failures are invisible until generation
|
|
44
|
-
// time, and both take the whole acceptance suite dark at once: a `.feature`
|
|
45
|
-
// the parser rejects, and a step no definition claims. This gate catches both
|
|
46
|
-
// offline, in the same `npm run lint` that already guards every other
|
|
47
|
-
// framework-owned surface.
|
|
48
|
-
//
|
|
49
|
-
// Two contracts make the findings trustworthy rather than merely loud:
|
|
50
|
-
//
|
|
51
|
-
// must-compile parses with the REAL `@cucumber/gherkin` parser. A gate that
|
|
52
|
-
// re-implements acceptance is the defect it is trying to prevent: a
|
|
53
|
-
// hand-rolled line reader silently skips what it does not recognise, so a
|
|
54
|
-
// corpus that cannot generate reads clean. Whatever bddgen accepts is what
|
|
55
|
-
// this gate must accept, and the only way to guarantee that is to run the
|
|
56
|
-
// same parser.
|
|
57
|
-
//
|
|
58
|
-
// A file failing must-compile is EXCLUDED from must-bind. A broken file
|
|
59
|
-
// parses as an arbitrary subset of itself, so linting its surviving steps
|
|
60
|
-
// invents unbound findings that bury the one actionable line — the syntax
|
|
61
|
-
// error — under noise.
|
|
62
|
-
//
|
|
63
|
-
// The parser is an optional peer dependency (plus a framework devDependency),
|
|
64
|
-
// resolved through a require path rooted at the consumer project rather than
|
|
65
|
-
// imported by bare specifier. `.agents/` reaches a consumer by plain file
|
|
66
|
-
// copy, so a bare specifier here would resolve against the consumer's own
|
|
67
|
-
// module chain, which under a non-hoisting linker need not hold it at all.
|
|
68
|
-
// This mirrors the `typescript` optional-peer precedent and keeps a consumer
|
|
69
|
-
// with no BDD tier from gaining a runtime dependency.
|
|
70
|
-
//
|
|
71
|
-
// Exit codes:
|
|
72
|
-
// 0 clean, or `qa.gherkinLint` is not configured
|
|
73
|
-
// 1 a parse error, an unbound step, or a fail-closed condition
|
|
3
|
+
// Static gate over a Gherkin corpus: every in-scope `.feature` must compile
|
|
4
|
+
// with the REAL `@cucumber/gherkin` parser (a hand-rolled reader skips what it
|
|
5
|
+
// cannot parse and reads clean), then every active step must bind under its own
|
|
6
|
+
// scope. A file failing to compile is excluded from must-bind: it parses as an
|
|
7
|
+
// arbitrary subset and would bury the syntax error under invented findings.
|
|
8
|
+
// The parser is an optional peer resolved from the consumer root, since
|
|
9
|
+
// `.agents/` is a plain file copy and a bare specifier need not resolve there.
|
|
74
10
|
|
|
75
11
|
import fs, { readFileSync } from 'node:fs';
|
|
76
12
|
import { createRequire } from 'node:module';
|
|
@@ -104,8 +40,6 @@ const HELP = {
|
|
|
104
40
|
};
|
|
105
41
|
|
|
106
42
|
/**
|
|
107
|
-
* Parse argv into an options bag.
|
|
108
|
-
*
|
|
109
43
|
* @param {string[]} argv
|
|
110
44
|
* @returns {{ cwd: string | null }}
|
|
111
45
|
*/
|
|
@@ -124,12 +58,10 @@ export function parseArgs(argv = []) {
|
|
|
124
58
|
}
|
|
125
59
|
|
|
126
60
|
/**
|
|
127
|
-
*
|
|
128
|
-
* being checked, falling back to the framework's own installation.
|
|
129
|
-
*
|
|
61
|
+
* Resolves from the checked project first, then the framework's own install.
|
|
130
62
|
* @param {{ cwd: string }} params
|
|
131
63
|
* @returns {Promise<{ parse: (source: string) => object }>}
|
|
132
|
-
* @throws {Error}
|
|
64
|
+
* @throws {Error}
|
|
133
65
|
*/
|
|
134
66
|
export async function loadGherkinParser({ cwd }) {
|
|
135
67
|
const anchors = [
|
|
@@ -142,7 +74,7 @@ export async function loadGherkinParser({ cwd }) {
|
|
|
142
74
|
resolved = anchor.resolve(PARSER_PACKAGE);
|
|
143
75
|
break;
|
|
144
76
|
} catch {
|
|
145
|
-
//
|
|
77
|
+
// Next anchor; the caller reports the aggregate failure.
|
|
146
78
|
}
|
|
147
79
|
}
|
|
148
80
|
if (!resolved) {
|
|
@@ -155,8 +87,7 @@ export async function loadGherkinParser({ cwd }) {
|
|
|
155
87
|
);
|
|
156
88
|
return {
|
|
157
89
|
parse(source) {
|
|
158
|
-
//
|
|
159
|
-
// (`IdGenerator.uuid`) is not a second import to resolve.
|
|
90
|
+
// Local id counter, so `@cucumber/messages` is not a second import.
|
|
160
91
|
let seq = 0;
|
|
161
92
|
const nextId = () => {
|
|
162
93
|
seq += 1;
|
|
@@ -172,10 +103,8 @@ export async function loadGherkinParser({ cwd }) {
|
|
|
172
103
|
}
|
|
173
104
|
|
|
174
105
|
/**
|
|
175
|
-
* Normalize a parser exception into one finding per reported position.
|
|
176
|
-
*
|
|
177
106
|
* @param {unknown} error
|
|
178
|
-
* @param {string} file
|
|
107
|
+
* @param {string} file
|
|
179
108
|
* @returns {Array<{ kind: 'parse-error', file: string, line: number, column: number, message: string }>}
|
|
180
109
|
*/
|
|
181
110
|
export function toParseFindings(error, file) {
|
|
@@ -189,15 +118,11 @@ export function toParseFindings(error, file) {
|
|
|
189
118
|
}));
|
|
190
119
|
}
|
|
191
120
|
|
|
192
|
-
/** Tag names carried by an AST node, as a plain string array. */
|
|
193
121
|
function tagNames(node) {
|
|
194
122
|
return (node?.tags ?? []).map((tag) => tag.name);
|
|
195
123
|
}
|
|
196
124
|
|
|
197
125
|
/**
|
|
198
|
-
* Expand one step's text against an Examples table. A step with no `<param>`
|
|
199
|
-
* placeholder yields itself; an outline step yields one variant per row.
|
|
200
|
-
*
|
|
201
126
|
* @param {string} text
|
|
202
127
|
* @param {Array<{ tableHeader?: object, tableBody?: object[] }>} examples
|
|
203
128
|
* @returns {string[]}
|
|
@@ -220,14 +145,9 @@ export function expandStepText(text, examples) {
|
|
|
220
145
|
}
|
|
221
146
|
|
|
222
147
|
/**
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* checked once — but only when the container still holds a non-exempt
|
|
227
|
-
* scenario, otherwise exempting every scenario in a file would leave its
|
|
228
|
-
* background as the sole remaining source of findings.
|
|
229
|
-
*
|
|
230
|
-
* @param {object} feature the `document.feature` node
|
|
148
|
+
* Background steps are checked once, and only while their container still
|
|
149
|
+
* holds a non-exempt scenario.
|
|
150
|
+
* @param {object} feature
|
|
231
151
|
* @param {string[]} exemptionTags
|
|
232
152
|
* @returns {Array<{ line: number, text: string, examples: object[] }>}
|
|
233
153
|
*/
|
|
@@ -236,9 +156,7 @@ export function collectActiveSteps(feature, exemptionTags) {
|
|
|
236
156
|
const featureTags = tagNames(feature);
|
|
237
157
|
const steps = [];
|
|
238
158
|
|
|
239
|
-
//
|
|
240
|
-
// in play, so emitting is keyed on the step's own line to check it exactly
|
|
241
|
-
// once per feature rather than once per container that inherits it.
|
|
159
|
+
// Keyed by line: under Rules one background is inherited by many containers.
|
|
242
160
|
const emittedBackgroundLines = new Set();
|
|
243
161
|
const pushBackgroundSteps = (backgrounds) => {
|
|
244
162
|
for (const background of backgrounds) {
|
|
@@ -257,11 +175,8 @@ export function collectActiveSteps(feature, exemptionTags) {
|
|
|
257
175
|
if (child.background) backgrounds.push(child.background);
|
|
258
176
|
if (child.scenario) scenarios.push(child.scenario);
|
|
259
177
|
}
|
|
260
|
-
//
|
|
261
|
-
//
|
|
262
|
-
// backgrounds collected above. Recursing before the no-active-scenarios
|
|
263
|
-
// return is what lets a feature whose scenarios all live under Rules still
|
|
264
|
-
// have its Background checked.
|
|
178
|
+
// Recurse before the no-active-scenarios return, so a feature whose
|
|
179
|
+
// scenarios all live under Rules still has its Background checked.
|
|
265
180
|
for (const child of container?.children ?? []) {
|
|
266
181
|
if (!child.rule) continue;
|
|
267
182
|
walkContainer(
|
|
@@ -294,13 +209,8 @@ export function collectActiveSteps(feature, exemptionTags) {
|
|
|
294
209
|
}
|
|
295
210
|
|
|
296
211
|
/**
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
* A step counts as bound when **any** of its Examples expansions matches. The
|
|
300
|
-
* conservative direction is deliberate: a partially-binding outline step is
|
|
301
|
-
* almost always a parameter-type mismatch in the index, and reporting it would
|
|
302
|
-
* spend the operator's attention on the heuristic rather than on the corpus.
|
|
303
|
-
*
|
|
212
|
+
* Bound when ANY Examples expansion matches: a partial bind is almost always
|
|
213
|
+
* an index parameter-type mismatch, not a corpus defect.
|
|
304
214
|
* @returns {Array<{ kind: 'unbound', file: string, line: number, text: string, scope: string }>}
|
|
305
215
|
*/
|
|
306
216
|
function bindFindings({ feature, file, scope, index, exemptionTags, waivers }) {
|
|
@@ -325,8 +235,6 @@ function bindFindings({ feature, file, scope, index, exemptionTags, waivers }) {
|
|
|
325
235
|
}
|
|
326
236
|
|
|
327
237
|
/**
|
|
328
|
-
* Run must-compile then must-bind across one scope.
|
|
329
|
-
*
|
|
330
238
|
* @returns {{ findings: object[], featureCount: number, stepDefinitionCount: number }}
|
|
331
239
|
*/
|
|
332
240
|
export function scanScope({
|
|
@@ -354,8 +262,6 @@ export function scanScope({
|
|
|
354
262
|
readFile ? readFile(absolute) : readFileSync(absolute, 'utf8'),
|
|
355
263
|
);
|
|
356
264
|
} catch (error) {
|
|
357
|
-
// Excluded from must-bind: a broken file parses as an arbitrary subset
|
|
358
|
-
// of itself, and its invented findings would bury this one.
|
|
359
265
|
findings.push(...toParseFindings(error, file));
|
|
360
266
|
continue;
|
|
361
267
|
}
|
|
@@ -380,16 +286,11 @@ export function scanScope({
|
|
|
380
286
|
}
|
|
381
287
|
|
|
382
288
|
/**
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
* features, and "nothing to check" would then report green over a corpus
|
|
386
|
-
* nobody is checking. A root that exists but holds no `.feature` file yet is
|
|
387
|
-
* the legitimate not-written-them-yet case and stays passing — absence of the
|
|
388
|
-
* directory is what separates misconfiguration from an empty corpus.
|
|
389
|
-
*
|
|
289
|
+
* A missing featureRoot is a blackout (green over an unchecked corpus); an
|
|
290
|
+
* existing but empty one is a legitimate not-yet-written corpus.
|
|
390
291
|
* @param {Array<{ name: string, featureRoots: string[] }>} scopes
|
|
391
292
|
* @param {string} root
|
|
392
|
-
* @returns {string | null}
|
|
293
|
+
* @returns {string | null}
|
|
393
294
|
*/
|
|
394
295
|
function findMissingFeatureRoots(scopes, root) {
|
|
395
296
|
for (const scope of scopes) {
|
|
@@ -406,7 +307,6 @@ function findMissingFeatureRoots(scopes, root) {
|
|
|
406
307
|
return null;
|
|
407
308
|
}
|
|
408
309
|
|
|
409
|
-
/** Render one finding as a single operator-readable line. */
|
|
410
310
|
export function renderFinding(finding) {
|
|
411
311
|
if (finding.kind === 'parse-error') {
|
|
412
312
|
return `${TAG} parse-error ${finding.file}:${finding.line}:${finding.column} ${finding.message}`;
|
|
@@ -415,10 +315,7 @@ export function renderFinding(finding) {
|
|
|
415
315
|
}
|
|
416
316
|
|
|
417
317
|
/**
|
|
418
|
-
*
|
|
419
|
-
* projects, including the unresolvable-parser path via `loadParser`.
|
|
420
|
-
*
|
|
421
|
-
* @returns {Promise<number>} process exit code
|
|
318
|
+
* @returns {Promise<number>}
|
|
422
319
|
*/
|
|
423
320
|
export async function runCli({
|
|
424
321
|
argv = process.argv.slice(2),
|
|
@@ -1,68 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Test-temp hygiene guard
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* noise: at the time this guard shipped, 99% of friction records were
|
|
11
|
-
* test-fixture pollution.
|
|
12
|
-
*
|
|
13
|
-
* The writer-layer fix (`lib/config/temp-paths.js` scratch seam +
|
|
14
|
-
* `lib/test-env.js` bootstrap) redirects stray test writes into an absolute
|
|
15
|
-
* per-process scratch dir. This script is the regression guard that keeps
|
|
16
|
-
* the fix honest, plus a local cleanup mode for the accumulated noise:
|
|
17
|
-
*
|
|
18
|
-
* The guard covers two distinct temp roots, and conflating them is how the
|
|
19
|
-
* second one went unmeasured for so long:
|
|
20
|
-
*
|
|
21
|
-
* 1. The repo's own `temp/` telemetry tree — the original dimension above.
|
|
22
|
-
* 2. The **OS temp root** (Story #4808). The redirect in (1) sends stray
|
|
23
|
-
* writes into `os.tmpdir()` scratch dirs, and nothing ever reaped them:
|
|
24
|
-
* the remedy for (1) became the largest single leaker into (2). Since
|
|
25
|
-
* the damaging axis there is entry *count*, the suite now nests every
|
|
26
|
-
* managed dir inside one per-process `mandrel-suite-*` root
|
|
27
|
-
* (`lib/test-temp.js`) and reaps it, and this guard asserts that no
|
|
28
|
-
* such root survives a run.
|
|
29
|
-
*
|
|
30
|
-
* --snapshot Record a fingerprint (size + sha256) of every stream
|
|
31
|
-
* file under `temp/`, plus the `mandrel-suite-*` roots
|
|
32
|
-
* already present in the OS temp root, to the snapshot
|
|
33
|
-
* baseline. Run this before the suite.
|
|
34
|
-
* --assert Re-scan and fail if any stream file was added or grew
|
|
35
|
-
* relative to the snapshot, or if a suite root appeared
|
|
36
|
-
* and survived. Run this after the suite. A missing
|
|
37
|
-
* snapshot is a hard failure ("snapshot missing
|
|
38
|
-
* — guard cannot attest"), never a silent re-baseline:
|
|
39
|
-
* the baseline lives *outside* the protected `temp/`
|
|
40
|
-
* tree (Story #4711), so a test wiping `temp/` can no
|
|
41
|
-
* longer destroy the baseline and fail the guard open.
|
|
42
|
-
* Recording pre-existing suite roots (rather than
|
|
43
|
-
* asserting an empty set) is what keeps a concurrent
|
|
44
|
-
* suite in another checkout from failing this one.
|
|
45
|
-
* --lint-globs <g> Comma-separated repo-relative globs to scan for test
|
|
46
|
-
* files that call `mkdtemp` against `os.tmpdir()`
|
|
47
|
-
* directly instead of going through `makeTempDir`.
|
|
48
|
-
* **Off unless passed**: this script ships in the
|
|
49
|
-
* materialized `.agents/` payload and a consumer's
|
|
50
|
-
* tests are none of this rule's business. A line (or
|
|
51
|
-
* the line above it) carrying `test-temp-allow` opts
|
|
52
|
-
* out.
|
|
53
|
-
* --baseline <path> Explicit snapshot-baseline path (CI sets this to a
|
|
54
|
-
* runner-temp path). Defaults to an OS scratch location
|
|
55
|
-
* keyed by the resolved repo root. Refused when it
|
|
56
|
-
* resolves inside the protected `temp/` tree.
|
|
57
|
-
* --clean List stream directories whose Epic/Story id matches a
|
|
58
|
-
* known fixture id (report-only; nothing is deleted).
|
|
59
|
-
* --clean --yes Delete those directories.
|
|
60
|
-
* --ids 1,2,3 Override the fixture-id list for --clean.
|
|
61
|
-
* --root <dir> Operate against <dir> instead of the repo root
|
|
62
|
-
* (its `temp/` subtree). Used by tests.
|
|
63
|
-
*
|
|
64
|
-
* Exit codes: 1 on an --assert failure (a new / grown stream file, or a
|
|
65
|
-
* missing snapshot baseline); 0 otherwise.
|
|
4
|
+
* Test-temp hygiene guard: fails when the suite pollutes the repo `temp/`
|
|
5
|
+
* telemetry streams (which every retro reads) or leaves a `mandrel-suite-*`
|
|
6
|
+
* root behind in the OS temp root. Pre-existing suite roots are recorded at
|
|
7
|
+
* snapshot time so a concurrent suite in another checkout cannot fail this
|
|
8
|
+
* one. `--lint-globs` is off by default because this script ships in the
|
|
9
|
+
* consumer payload and a consumer's tests are not its business.
|
|
66
10
|
*/
|
|
67
11
|
|
|
68
12
|
import { createHash } from 'node:crypto';
|
|
@@ -93,17 +37,12 @@ import {
|
|
|
93
37
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
94
38
|
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
95
39
|
|
|
96
|
-
/**
|
|
97
|
-
* Known fixture Epic/Story ids observed polluting the real `temp/` tree
|
|
98
|
-
* (Story #4696). `--clean` targets only these by default so real scratch
|
|
99
|
-
* (a genuine `run-<id>` from a live delivery) is never swept.
|
|
100
|
-
*/
|
|
40
|
+
/** Fixture ids `--clean` targets by default, so real `run-<id>` scratch is never swept. */
|
|
101
41
|
export const KNOWN_FIXTURE_STORY_IDS = Object.freeze([
|
|
102
42
|
4428, 10, 4242, 5, 42, 100, 555, 2839, 4257, 4258, 4259,
|
|
103
43
|
]);
|
|
104
44
|
|
|
105
45
|
/**
|
|
106
|
-
* Resolve the `temp/` directory for a given repo root.
|
|
107
46
|
* @param {string} repoRoot
|
|
108
47
|
* @returns {string}
|
|
109
48
|
*/
|
|
@@ -112,14 +51,9 @@ export function tempDirFor(repoRoot) {
|
|
|
112
51
|
}
|
|
113
52
|
|
|
114
53
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* protects: a test (or cleanup) that wiped `temp/` destroyed the baseline
|
|
119
|
-
* and the post-test `--assert` silently re-baselined the pollution. The
|
|
120
|
-
* default now lives under the OS scratch dir, keyed by the resolved repo
|
|
121
|
-
* root so parallel checkouts / worktrees never collide.
|
|
122
|
-
*
|
|
54
|
+
* Snapshot path outside the protected `temp/` tree (a test wiping `temp/`
|
|
55
|
+
* must not destroy the attestation), keyed by repo root so worktrees never
|
|
56
|
+
* collide.
|
|
123
57
|
* @param {string} repoRoot
|
|
124
58
|
* @returns {string}
|
|
125
59
|
*/
|
|
@@ -136,10 +70,7 @@ export function defaultBaselinePath(repoRoot) {
|
|
|
136
70
|
}
|
|
137
71
|
|
|
138
72
|
/**
|
|
139
|
-
* Refuse a baseline
|
|
140
|
-
* storing the attestation inside the tree it attests recreates the
|
|
141
|
-
* fail-open gap this Story closes.
|
|
142
|
-
*
|
|
73
|
+
* Refuse a baseline inside `temp/`: attesting from inside the tree fails open.
|
|
143
74
|
* @param {string} repoRoot
|
|
144
75
|
* @param {string} baselinePath
|
|
145
76
|
* @returns {string} the resolved baseline path
|
|
@@ -156,10 +87,7 @@ function checkedBaselinePath(repoRoot, baselinePath) {
|
|
|
156
87
|
}
|
|
157
88
|
|
|
158
89
|
/**
|
|
159
|
-
*
|
|
160
|
-
* file we guard? Stream files are `*.ndjson` living under a `run-<id>/`
|
|
161
|
-
* subtree or the `standalone/stories/` subtree.
|
|
162
|
-
*
|
|
90
|
+
* Stream files are `*.ndjson` under `run-<id>/` or `standalone/stories/`.
|
|
163
91
|
* @param {string} rel
|
|
164
92
|
* @returns {boolean}
|
|
165
93
|
*/
|
|
@@ -171,9 +99,6 @@ export function isStreamFile(rel) {
|
|
|
171
99
|
}
|
|
172
100
|
|
|
173
101
|
/**
|
|
174
|
-
* Recursively list every stream file under `tempDir`, returned as
|
|
175
|
-
* POSIX-normalised paths relative to `tempDir`, sorted for determinism.
|
|
176
|
-
*
|
|
177
102
|
* @param {string} tempDir
|
|
178
103
|
* @returns {string[]}
|
|
179
104
|
*/
|
|
@@ -197,7 +122,6 @@ export function listStreamFiles(tempDir) {
|
|
|
197
122
|
}
|
|
198
123
|
|
|
199
124
|
/**
|
|
200
|
-
* Fingerprint a single file by byte length + sha256 of its contents.
|
|
201
125
|
* @param {string} absPath
|
|
202
126
|
* @returns {{ size: number, sha256: string }}
|
|
203
127
|
*/
|
|
@@ -210,8 +134,6 @@ export function fingerprintFile(absPath) {
|
|
|
210
134
|
}
|
|
211
135
|
|
|
212
136
|
/**
|
|
213
|
-
* Build a `{ [relPath]: fingerprint }` manifest of every stream file under
|
|
214
|
-
* `tempDir`.
|
|
215
137
|
* @param {string} tempDir
|
|
216
138
|
* @returns {Record<string, { size: number, sha256: string }>}
|
|
217
139
|
*/
|
|
@@ -225,11 +147,9 @@ export function buildManifest(tempDir) {
|
|
|
225
147
|
}
|
|
226
148
|
|
|
227
149
|
/**
|
|
228
|
-
* Persist the current manifest to the baseline path (default: the external
|
|
229
|
-
* `defaultBaselinePath` — never inside `temp/`).
|
|
230
150
|
* @param {string} repoRoot
|
|
231
151
|
* @param {string} [baselinePath]
|
|
232
|
-
* @param {{ tmpDir?: string }} [deps]
|
|
152
|
+
* @param {{ tmpDir?: string }} [deps]
|
|
233
153
|
* @returns {{ snapshotPath: string, count: number, suiteRoots: number }}
|
|
234
154
|
*/
|
|
235
155
|
export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
|
|
@@ -239,9 +159,7 @@ export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
|
|
|
239
159
|
);
|
|
240
160
|
const manifest = buildManifest(tempDirFor(repoRoot));
|
|
241
161
|
const count = Object.keys(manifest).length;
|
|
242
|
-
//
|
|
243
|
-
// this cannot shadow one, and `diffAgainstSnapshot` only ever looks up
|
|
244
|
-
// keys derived from the tree it just walked.
|
|
162
|
+
// Cannot shadow a stream entry: those are always `*.ndjson` paths.
|
|
245
163
|
manifest[SUITE_ROOTS_KEY] = listSuiteTempRoots(tmpDir ?? os.tmpdir());
|
|
246
164
|
mkdirSync(path.dirname(snapshotPath), { recursive: true });
|
|
247
165
|
writeFileSync(snapshotPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
|
|
@@ -253,7 +171,6 @@ export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
|
|
|
253
171
|
}
|
|
254
172
|
|
|
255
173
|
/**
|
|
256
|
-
* Load the persisted manifest, or `null` when no snapshot exists.
|
|
257
174
|
* @param {string} repoRoot
|
|
258
175
|
* @param {string} [baselinePath]
|
|
259
176
|
* @returns {Record<string, { size: number, sha256: string }> | null}
|
|
@@ -268,14 +185,7 @@ export function readSnapshot(repoRoot, baselinePath) {
|
|
|
268
185
|
}
|
|
269
186
|
|
|
270
187
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* `added` — stream files present now but absent from the snapshot.
|
|
274
|
-
* `changed` — stream files whose size or sha256 differs from the snapshot
|
|
275
|
-
* (i.e. a test grew or rewrote an existing stream).
|
|
276
|
-
*
|
|
277
|
-
* A file that shrank or vanished is not a pollution signal, so it is ignored.
|
|
278
|
-
*
|
|
188
|
+
* A stream that vanished is not a pollution signal, so it is ignored.
|
|
279
189
|
* @param {string} tempDir
|
|
280
190
|
* @param {Record<string, { size: number, sha256: string }>} snapshot
|
|
281
191
|
* @returns {{ added: string[], changed: string[] }}
|
|
@@ -296,12 +206,6 @@ export function diffAgainstSnapshot(tempDir, snapshot) {
|
|
|
296
206
|
}
|
|
297
207
|
|
|
298
208
|
/**
|
|
299
|
-
* Extract the fixture-matching id from a top-level `temp/` entry name, or
|
|
300
|
-
* `null` when the entry is not an id-keyed stream directory.
|
|
301
|
-
*
|
|
302
|
-
* `run-<id>` maps to `<id>`; the `standalone/stories/story-<id>` shape is
|
|
303
|
-
* handled by the caller (it recurses one level deeper).
|
|
304
|
-
*
|
|
305
209
|
* @param {string} name
|
|
306
210
|
* @returns {number|null}
|
|
307
211
|
*/
|
|
@@ -311,11 +215,6 @@ function runDirId(name) {
|
|
|
311
215
|
}
|
|
312
216
|
|
|
313
217
|
/**
|
|
314
|
-
* Locate stream directories whose Epic/Story id is in `ids`.
|
|
315
|
-
*
|
|
316
|
-
* Two shapes are swept: `temp/run-<id>/` (Epic-scoped) and
|
|
317
|
-
* `temp/standalone/stories/story-<id>/` (standalone Story-scoped).
|
|
318
|
-
*
|
|
319
218
|
* @param {string} tempDir
|
|
320
219
|
* @param {ReadonlySet<number>} ids
|
|
321
220
|
* @returns {{ id: number, kind: 'run' | 'standalone-story', rel: string }[]}
|
|
@@ -349,12 +248,10 @@ export function findFixtureDirs(tempDir, ids) {
|
|
|
349
248
|
}
|
|
350
249
|
|
|
351
250
|
/**
|
|
352
|
-
* Report (and optionally delete) fixture-id stream directories.
|
|
353
|
-
*
|
|
354
251
|
* @param {object} opts
|
|
355
252
|
* @param {string} opts.repoRoot
|
|
356
253
|
* @param {Iterable<number>} [opts.ids]
|
|
357
|
-
* @param {boolean} [opts.apply=false]
|
|
254
|
+
* @param {boolean} [opts.apply=false]
|
|
358
255
|
* @returns {{ candidates: { id: number, kind: string, rel: string }[], removed: string[] }}
|
|
359
256
|
*/
|
|
360
257
|
export function cleanFixtureDirs({
|
|
@@ -375,14 +272,9 @@ export function cleanFixtureDirs({
|
|
|
375
272
|
}
|
|
376
273
|
|
|
377
274
|
/**
|
|
378
|
-
*
|
|
379
|
-
*
|
|
380
|
-
*
|
|
381
|
-
* both ids (`run-<eid>/stories/story-<sid>/…`): either half being a fixture id
|
|
382
|
-
* makes the stream fixture-owned, and taking only the outer one is how a
|
|
383
|
-
* fixture Story under a real run would slip past.
|
|
384
|
-
*
|
|
385
|
-
* @param {string} rel POSIX-normalised path relative to `temp/`.
|
|
275
|
+
* A nested `run-<eid>/…/story-<sid>/` stream yields both ids, so a fixture
|
|
276
|
+
* Story under a real run cannot slip past.
|
|
277
|
+
* @param {string} rel
|
|
386
278
|
* @returns {number[]}
|
|
387
279
|
*/
|
|
388
280
|
function streamOwnerIds(rel) {
|
|
@@ -395,21 +287,10 @@ function streamOwnerIds(rel) {
|
|
|
395
287
|
}
|
|
396
288
|
|
|
397
289
|
/**
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* This is the residual-pollution dimension the snapshot/assert bracket cannot
|
|
402
|
-
* cover: the bracket only runs in CI, where `temp/` starts empty, so a local
|
|
403
|
-
* run that appends fixture telemetry to the operator's live ledger was only
|
|
404
|
-
* ever discovered from the ticket the retro graduator filed off it (issue
|
|
405
|
-
* #4870 cited `#999999`, a `--story 999999` CLI spawn from the suite).
|
|
406
|
-
*
|
|
407
|
-
* Unlike the snapshot diff this needs no baseline and is immune to a
|
|
408
|
-
* concurrent delivery in another checkout: a reserved id is reserved *from*
|
|
409
|
-
* real work, so nothing but a test can own one of these files.
|
|
410
|
-
*
|
|
290
|
+
* Streams owned by a reserved test-fixture id. Covers local runs the CI-only
|
|
291
|
+
* snapshot bracket cannot, and needs no baseline: only a test can own one.
|
|
411
292
|
* @param {string} tempDir
|
|
412
|
-
* @returns {string[]}
|
|
293
|
+
* @returns {string[]}
|
|
413
294
|
*/
|
|
414
295
|
export function findReservedIdStreamFiles(tempDir) {
|
|
415
296
|
return listStreamFiles(tempDir).filter((rel) =>
|
|
@@ -418,20 +299,13 @@ export function findReservedIdStreamFiles(tempDir) {
|
|
|
418
299
|
}
|
|
419
300
|
|
|
420
301
|
/**
|
|
421
|
-
*
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
* Resolution matters more than it looks: every writer anchors a relative
|
|
425
|
-
* `tempRoot` to the *main checkout* (so a Story worktree and its `/mandrel-deliver`
|
|
426
|
-
* host converge on one ledger), so a guard that scanned `cwd` would scan an
|
|
427
|
-
* empty worktree tree and pass vacuously on the very tree it is meant to
|
|
428
|
-
* protect. `resolveRoot` is the injection seam for tests.
|
|
429
|
-
*
|
|
302
|
+
* Scans the main checkout's temp tree, not `cwd`: writers anchor relative
|
|
303
|
+
* `tempRoot` there, so scanning a worktree would pass vacuously.
|
|
430
304
|
* @param {object} [opts]
|
|
431
305
|
* @param {string} [opts.cwd=process.cwd()]
|
|
432
306
|
* @param {(line: string) => void} [opts.log]
|
|
433
307
|
* @param {(cwd: string) => string|null} [opts.resolveRoot]
|
|
434
|
-
* @returns {number}
|
|
308
|
+
* @returns {number}
|
|
435
309
|
*/
|
|
436
310
|
export function assertNoReservedIdStreams({
|
|
437
311
|
cwd = process.cwd(),
|
|
@@ -453,7 +327,6 @@ export function assertNoReservedIdStreams({
|
|
|
453
327
|
}
|
|
454
328
|
|
|
455
329
|
/**
|
|
456
|
-
* Parse the CLI argv into a normalised options object.
|
|
457
330
|
* @param {string[]} argv
|
|
458
331
|
* @returns {{ mode: 'snapshot'|'assert'|'clean', apply: boolean, ids: number[]|null, repoRoot: string, baseline: string|null, lintGlobs: string[] }}
|
|
459
332
|
*/
|
|
@@ -494,13 +367,9 @@ export function parseArgv(argv) {
|
|
|
494
367
|
}
|
|
495
368
|
|
|
496
369
|
/**
|
|
497
|
-
* Execute the guard for a parsed options object. Returns the process exit
|
|
498
|
-
* code (0 = clean / snapshot recorded; 1 = pollution detected under
|
|
499
|
-
* --assert). Printing is done via the injectable `log`.
|
|
500
|
-
*
|
|
501
370
|
* @param {ReturnType<typeof parseArgv>} opts
|
|
502
371
|
* @param {(line: string) => void} [log]
|
|
503
|
-
* @param {{ tmpDir?: string }} [deps]
|
|
372
|
+
* @param {{ tmpDir?: string }} [deps]
|
|
504
373
|
* @returns {number}
|
|
505
374
|
*/
|
|
506
375
|
export function runHygiene(
|
|
@@ -549,9 +418,7 @@ export function runHygiene(
|
|
|
549
418
|
);
|
|
550
419
|
return 1;
|
|
551
420
|
}
|
|
552
|
-
//
|
|
553
|
-
// failure in another, so the exit code is the max rather than an
|
|
554
|
-
// early return.
|
|
421
|
+
// Run every dimension so one failure cannot hide another.
|
|
555
422
|
const codes = [
|
|
556
423
|
assertStreamTree(repoRoot, snapshot, log),
|
|
557
424
|
assertNoSurvivingSuiteRoots(snapshot, log, tmpDir),
|
|
@@ -561,8 +428,6 @@ export function runHygiene(
|
|
|
561
428
|
}
|
|
562
429
|
|
|
563
430
|
/**
|
|
564
|
-
* Dimension 1 — the repo's own `temp/` telemetry tree (Story #4696).
|
|
565
|
-
*
|
|
566
431
|
* @param {string} repoRoot
|
|
567
432
|
* @param {Record<string, unknown>} snapshot
|
|
568
433
|
* @param {(line: string) => void} log
|
|
@@ -589,10 +454,7 @@ function assertStreamTree(repoRoot, snapshot, log) {
|
|
|
589
454
|
}
|
|
590
455
|
|
|
591
456
|
/**
|
|
592
|
-
*
|
|
593
|
-
* appeared since the snapshot and is still on disk, which means the run
|
|
594
|
-
* created it and never reaped it.
|
|
595
|
-
*
|
|
457
|
+
* A suite root that appeared since the snapshot and survived was never reaped.
|
|
596
458
|
* @param {Record<string, unknown>} snapshot
|
|
597
459
|
* @param {(line: string) => void} log
|
|
598
460
|
* @param {string} tmpDir
|
|
@@ -618,9 +480,6 @@ function assertNoSurvivingSuiteRoots(snapshot, log, tmpDir) {
|
|
|
618
480
|
}
|
|
619
481
|
|
|
620
482
|
/**
|
|
621
|
-
* Dimension 3 — the static backstop (Story #4808). Skipped, and reported
|
|
622
|
-
* as skipped, unless the caller passed `--lint-globs`.
|
|
623
|
-
*
|
|
624
483
|
* @param {string} repoRoot
|
|
625
484
|
* @param {string[]} globs
|
|
626
485
|
* @param {(line: string) => void} log
|