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
|
@@ -2,14 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import picomatch from 'picomatch';
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
* Globs for slow / integration-style suites excluded from `test:quick`.
|
|
7
|
-
*
|
|
8
|
-
* Curated from `npm run test:profile` (Stories #2742 / #2744). Real-git
|
|
9
|
-
* harnesses, binary-spawn CLI contracts, and other suites whose setup
|
|
10
|
-
* dominates quick-tier feedback stay here; unit-guard / mock paths remain
|
|
11
|
-
* in quick.
|
|
12
|
-
*/
|
|
5
|
+
/** Slow suites (real git, binary spawns) excluded from `test:quick`. */
|
|
13
6
|
export const INTEGRATION_INCLUDE = [
|
|
14
7
|
'tests/**/*.integration.test.js',
|
|
15
8
|
'tests/hook-chain-reflog-invariant.test.js',
|
|
@@ -24,85 +17,29 @@ export const INTEGRATION_INCLUDE = [
|
|
|
24
17
|
const matchesIntegration = picomatch(INTEGRATION_INCLUDE, { dot: true });
|
|
25
18
|
|
|
26
19
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* `
|
|
30
|
-
*
|
|
31
|
-
* They are the most expensive files the repository owns by an order of
|
|
32
|
-
* magnitude: one `npm pack` plus real `npm install` spawns per file, measured
|
|
33
|
-
* (Story #5111) at ~7 s of system time and ~17 s of summed install wall clock
|
|
34
|
-
* for `update-chain.integration.test.js` alone. Every one of those seconds was
|
|
35
|
-
* charged to `npm test` — i.e. to every pre-push hook and every local
|
|
36
|
-
* iteration — for a signal that only changes when the release-shaped install
|
|
37
|
-
* path changes.
|
|
38
|
-
*
|
|
39
|
-
* So they get their own tier and leave every other one: `full` (`npm test`),
|
|
40
|
-
* `quick` and `integration` all exclude them, and `npm run test:e2e` is how
|
|
41
|
-
* they run. CI runs that tier as its own job on every PR, so the
|
|
42
|
-
* release-shaped path keeps its per-PR signal.
|
|
43
|
-
*
|
|
44
|
-
* Deliberately not exported: a second reader of this list is a second place
|
|
45
|
-
* for the tier definition to drift. `listTestFilesForTier('e2e', root)` is the
|
|
46
|
-
* public answer to "which files are e2e", and the tests assert through it.
|
|
20
|
+
* Pack-and-install suites driving the shipped binary — too expensive for
|
|
21
|
+
* every pre-push, so only `test:e2e` (its own CI job) runs them. Not exported:
|
|
22
|
+
* `listTestFilesForTier('e2e', root)` is the one reader.
|
|
47
23
|
*/
|
|
48
24
|
const E2E_INCLUDE = ['tests/e2e/**/*.test.js'];
|
|
49
25
|
|
|
50
26
|
const matchesE2E = picomatch(E2E_INCLUDE, { dot: true });
|
|
51
27
|
|
|
52
|
-
/** Tier names `parseTierArgv` accepts, in the order `--help` lists them. */
|
|
53
28
|
const TIERS = ['full', 'quick', 'integration', 'e2e'];
|
|
54
29
|
|
|
55
30
|
/**
|
|
56
|
-
* `node --test
|
|
57
|
-
*
|
|
58
|
-
* Everything else that looks like a flag is a mistake — a typo, a retired
|
|
59
|
-
* option, or a flag meant for `npm` that landed after the `--` separator —
|
|
60
|
-
* and `parseTierArgv` rejects it rather than passing it to `node --test`,
|
|
61
|
-
* which reads an unknown `--flag` as a *file pattern* and silently runs a
|
|
62
|
-
* suite that matches nothing while exiting 0.
|
|
31
|
+
* The only flags forwarded to `node --test`; any other `--flag` is rejected,
|
|
32
|
+
* since `node --test` reads it as a file pattern and exits 0 having run nothing.
|
|
63
33
|
*/
|
|
64
34
|
const PASSTHROUGH_FLAGS = ['--test-name-pattern', '--test-only'];
|
|
65
35
|
|
|
66
|
-
/**
|
|
67
|
-
* Repo-relative roots the tier walker scans for test files (names ending in
|
|
68
|
-
* `.test.js`).
|
|
69
|
-
*
|
|
70
|
-
* `tests` holds the framework's suite tree; `lib` holds the published CLI
|
|
71
|
-
* (under `lib/cli` and `lib/migrations`) whose tests are colocated in
|
|
72
|
-
* `__tests__` directories per the unit-tier convention in
|
|
73
|
-
* `rules/testing-standards.md`. `.agents/scripts` holds the orchestration
|
|
74
|
-
* engine; some of its modules colocate tests in `__tests__` directories the
|
|
75
|
-
* same way (Story #4195). Without each root here, both the quick /
|
|
76
|
-
* integration walk and the full-tier glob set miss the colocated tests,
|
|
77
|
-
* leaving that coverage dark in `npm test`. The matching full-tier globs
|
|
78
|
-
* live in the exported `FULL_TIER_GLOBS` — every full-tier runner
|
|
79
|
-
* (`run-tests.js`, `run-coverage.js`) MUST consume that constant rather than
|
|
80
|
-
* restate a glob literal, or a runner silently walks a narrower surface.
|
|
81
|
-
*/
|
|
36
|
+
/** Roots scanned for `*.test.js`, including colocated `__tests__` trees. */
|
|
82
37
|
const TEST_WALK_ROOTS = ['tests', 'lib', '.agents/scripts'];
|
|
83
38
|
|
|
84
39
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* tests, never the shipped source modules themselves.
|
|
89
|
-
*
|
|
90
|
-
* Exported because it is the **measured surface**: `run-coverage.js` — the
|
|
91
|
-
* required CI job, and the run every coverage / CRAP baseline is scored from —
|
|
92
|
-
* consumes it directly. Story #4922: the coverage runner used to restate
|
|
93
|
-
* `tests/**` on its own, so the 47 colocated `__tests__` files ran under
|
|
94
|
-
* `npm test` but were absent from the measured surface, leaving the coverage
|
|
95
|
-
* and CRAP numbers computed over code the measuring run never executed.
|
|
96
|
-
* Consume this constant; never restate a glob.
|
|
97
|
-
*
|
|
98
|
-
* Story #5111 made this a strict **superset** of the `full` runner tier: the
|
|
99
|
-
* measured surface still includes `tests/e2e/**`, while `npm test` no longer
|
|
100
|
-
* runs it. That asymmetry is deliberate and load-bearing. The e2e suites drive
|
|
101
|
-
* the shipped binary through `bin/mandrel.js` and `lib/cli/update.js` in real
|
|
102
|
-
* child processes, and c8's `NODE_V8_COVERAGE` is inherited by those children —
|
|
103
|
-
* so dropping them from the measured run would deflate exactly the CLI files
|
|
104
|
-
* they exist to exercise and red the coverage ratchet on code nobody touched.
|
|
105
|
-
* Cheapening the pre-push loop must not cost the measurement its subject.
|
|
40
|
+
* The measured surface for coverage/CRAP; consume it, never restate a glob.
|
|
41
|
+
* A superset of the `full` tier: e2e children inherit `NODE_V8_COVERAGE` and
|
|
42
|
+
* are the only coverage of the CLI entry files.
|
|
106
43
|
*/
|
|
107
44
|
export const FULL_TIER_GLOBS = [
|
|
108
45
|
'tests/**/*.test.js',
|
|
@@ -132,10 +69,6 @@ function walkTestFiles(dir, prefix, fsLike) {
|
|
|
132
69
|
}
|
|
133
70
|
|
|
134
71
|
/**
|
|
135
|
-
* Split the walked set into the `e2e` tier and the remainder every other tier
|
|
136
|
-
* is drawn from, so an e2e file belongs to exactly one tier and `npm test`
|
|
137
|
-
* never pays for it.
|
|
138
|
-
*
|
|
139
72
|
* @param {string[]} all
|
|
140
73
|
* @returns {{ e2e: string[], rest: string[] }}
|
|
141
74
|
*/
|
|
@@ -146,9 +79,6 @@ function partitionE2E(all) {
|
|
|
146
79
|
}
|
|
147
80
|
|
|
148
81
|
/**
|
|
149
|
-
* Split the non-e2e remainder into the slow `integration` tier and the `quick`
|
|
150
|
-
* complement — the historical partition, unchanged.
|
|
151
|
-
*
|
|
152
82
|
* @param {string[]} rest
|
|
153
83
|
* @param {'quick' | 'integration'} tier
|
|
154
84
|
* @returns {string[]}
|
|
@@ -163,13 +93,8 @@ function splitBySpeed(rest, tier) {
|
|
|
163
93
|
}
|
|
164
94
|
|
|
165
95
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
* `full` used to return {@link FULL_TIER_GLOBS} verbatim and let `node --test`
|
|
169
|
-
* expand them. It enumerates files instead since Story #5111, because the one
|
|
170
|
-
* thing a glob list cannot express is an exclusion: `node --test` has no
|
|
171
|
-
* negative pattern, so "everything except `tests/e2e/**`" is only sayable as
|
|
172
|
-
* a file set. The measured surface keeps the globs (see `FULL_TIER_GLOBS`).
|
|
96
|
+
* Repo-relative test files for a tier. Enumerated, not globbed: `node --test`
|
|
97
|
+
* has no negative pattern to exclude `tests/e2e/**`.
|
|
173
98
|
*
|
|
174
99
|
* @param {'full' | 'quick' | 'integration' | 'e2e'} tier
|
|
175
100
|
* @param {string} repoRoot
|
|
@@ -191,15 +116,6 @@ export function listTestFilesForTier(tier, repoRoot, fsLike = fs) {
|
|
|
191
116
|
}
|
|
192
117
|
|
|
193
118
|
/**
|
|
194
|
-
* Reject argv tokens that look like flags but are neither `--tier` (already
|
|
195
|
-
* consumed) nor a sanctioned `node --test` pass-through.
|
|
196
|
-
*
|
|
197
|
-
* Silence was the old behaviour and the reason this exists: the runner
|
|
198
|
-
* forwarded every unrecognized token verbatim, and `node --test` treats an
|
|
199
|
-
* unknown `--flag` as another **file pattern**. A typo therefore produced a
|
|
200
|
-
* run that matched nothing, printed a plausible-looking summary and exited 0 —
|
|
201
|
-
* a green that proved nothing.
|
|
202
|
-
*
|
|
203
119
|
* @param {string[]} rest
|
|
204
120
|
* @throws {Error} naming both the accepted tiers and the accepted flags.
|
|
205
121
|
*/
|
|
@@ -1,35 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* The Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
|
|
8
|
-
* Acceptance Spec's AC-ID table (`## Acceptance Table`) land as **managed
|
|
9
|
-
* sections**, delimited by invisible HTML comment markers so each writer
|
|
10
|
-
* can update *only its own region* without rewriting the rest of the body.
|
|
11
|
-
*
|
|
12
|
-
* Section-scoped writes are the load-bearing contract (extending the
|
|
13
|
-
* single-writer discipline #4303 established for the body trailer):
|
|
14
|
-
*
|
|
15
|
-
* - The `/mandrel-plan` persist path upserts the `techSpec` and `acceptanceTable`
|
|
16
|
-
* regions.
|
|
17
|
-
* - The close-time acceptance reconciler
|
|
18
|
-
* (`acceptance-spec-reconciler.js`) reads and rewrites the
|
|
19
|
-
* `acceptanceTable` region only (verification dispositions).
|
|
20
|
-
*
|
|
21
|
-
* Everything outside a managed region is byte-preserved by every helper in
|
|
22
|
-
* this module. Markers are chosen so GitHub renders nothing for them; the
|
|
23
|
-
* human-visible headings (`## Delivery Slicing`, `## Acceptance Table`)
|
|
24
|
-
* live INSIDE the regions as ordinary content.
|
|
25
|
-
*
|
|
26
|
-
* Pure ESM, no I/O.
|
|
2
|
+
* Marker-delimited managed sections of a planning ticket body. Each writer
|
|
3
|
+
* updates only its own region (persist: `techSpec` + `acceptanceTable`; the
|
|
4
|
+
* close reconciler: `acceptanceTable` only); every byte outside a region is
|
|
5
|
+
* preserved. Markers render as nothing on GitHub; visible headings live
|
|
6
|
+
* inside the regions. Pure, no I/O.
|
|
27
7
|
*/
|
|
28
8
|
|
|
29
9
|
/**
|
|
30
|
-
* Managed-region descriptors. `start`/`end` are the literal marker lines;
|
|
31
|
-
* `label` is the human name used in log lines and error messages.
|
|
32
|
-
*
|
|
33
10
|
* @type {Readonly<Record<'techSpec'|'acceptanceTable', { start: string, end: string, label: string }>>}
|
|
34
11
|
*/
|
|
35
12
|
export const TICKET_BODY_SECTIONS = Object.freeze({
|
|
@@ -45,19 +22,10 @@ export const TICKET_BODY_SECTIONS = Object.freeze({
|
|
|
45
22
|
}),
|
|
46
23
|
});
|
|
47
24
|
|
|
48
|
-
/**
|
|
49
|
-
* Canonical heading the acceptance-table region opens with. Distinct from
|
|
50
|
-
* the ticket's ideation `## Acceptance Criteria` bullets (which remain the
|
|
51
|
-
* SSOT for *what* the table verifies — the table anchors to those bullets).
|
|
52
|
-
*/
|
|
25
|
+
/** Distinct from `## Acceptance Criteria`, which stays the SSOT it anchors to. */
|
|
53
26
|
export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
|
|
54
27
|
|
|
55
|
-
/**
|
|
56
|
-
* Regex matching the Tech Spec's `## Delivery Slicing` heading, tolerating
|
|
57
|
-
* the `Delivery ` qualifier and casing variants. Exported so it is the single
|
|
58
|
-
* source of truth for this pattern — `consolidation-precondition.js` imports
|
|
59
|
-
* it rather than carrying its own copy.
|
|
60
|
-
*/
|
|
28
|
+
/** SSOT for the `## (Delivery) Slicing` heading, case-insensitive. */
|
|
61
29
|
export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
|
|
62
30
|
|
|
63
31
|
/**
|
|
@@ -75,10 +43,8 @@ function descriptor(kind) {
|
|
|
75
43
|
}
|
|
76
44
|
|
|
77
45
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* absent so a writer re-appends a well-formed region rather than
|
|
81
|
-
* corrupting the body further).
|
|
46
|
+
* `null` when a marker is missing or out of order: treated as absent so a
|
|
47
|
+
* writer re-appends a well-formed region instead of corrupting further.
|
|
82
48
|
*
|
|
83
49
|
* @param {string} body
|
|
84
50
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
@@ -96,8 +62,6 @@ function locate(body, kind) {
|
|
|
96
62
|
}
|
|
97
63
|
|
|
98
64
|
/**
|
|
99
|
-
* True when the body carries a well-formed managed region of `kind`.
|
|
100
|
-
*
|
|
101
65
|
* @param {string} body
|
|
102
66
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
103
67
|
* @returns {boolean}
|
|
@@ -107,14 +71,8 @@ export function hasTicketSection(body, kind) {
|
|
|
107
71
|
}
|
|
108
72
|
|
|
109
73
|
/**
|
|
110
|
-
* Insert or replace a managed region
|
|
111
|
-
*
|
|
112
|
-
* When the region exists, only the content between the markers is
|
|
113
|
-
* replaced. When absent, the region is appended at the end of the body
|
|
114
|
-
* (trailing whitespace normalised to a single blank-line separator). The
|
|
115
|
-
* `techSpec` region is appended before an existing `acceptanceTable`
|
|
116
|
-
* region so the rendered document keeps its canonical order
|
|
117
|
-
* (ideation sections → Tech Spec → Acceptance Table).
|
|
74
|
+
* Insert or replace a managed region. An absent region is appended, except
|
|
75
|
+
* `techSpec`, which goes before an existing `acceptanceTable` to keep order.
|
|
118
76
|
*
|
|
119
77
|
* @param {string} body
|
|
120
78
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
@@ -136,8 +94,6 @@ export function upsertTicketSection(body, kind, content) {
|
|
|
136
94
|
);
|
|
137
95
|
}
|
|
138
96
|
|
|
139
|
-
// Keep canonical order when appending: the Tech Spec region goes before
|
|
140
|
-
// an already-present acceptance-table region.
|
|
141
97
|
if (kind === 'techSpec') {
|
|
142
98
|
const acceptanceLoc = locate(safeBody, 'acceptanceTable');
|
|
143
99
|
if (acceptanceLoc) {
|
|
@@ -156,9 +112,7 @@ export function upsertTicketSection(body, kind, content) {
|
|
|
156
112
|
}
|
|
157
113
|
|
|
158
114
|
/**
|
|
159
|
-
* Remove a
|
|
160
|
-
* the region; collapses the surrounding blank lines the writer added.
|
|
161
|
-
* No-op when the region is absent.
|
|
115
|
+
* Remove a region and the blank lines the writer added around it.
|
|
162
116
|
*
|
|
163
117
|
* @param {string} body
|
|
164
118
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
@@ -174,9 +128,7 @@ export function stripTicketSection(body, kind) {
|
|
|
174
128
|
}
|
|
175
129
|
|
|
176
130
|
/**
|
|
177
|
-
*
|
|
178
|
-
* Tech Spec content — the managed region, or (defence in depth for a
|
|
179
|
-
* hand-authored body) a bare `## Delivery Slicing` heading.
|
|
131
|
+
* Folded Tech Spec present: the region, or a hand-authored slicing heading.
|
|
180
132
|
*
|
|
181
133
|
* @param {string} body
|
|
182
134
|
* @returns {boolean}
|
|
@@ -187,11 +139,7 @@ export function hasTechSpecContent(body) {
|
|
|
187
139
|
}
|
|
188
140
|
|
|
189
141
|
/**
|
|
190
|
-
*
|
|
191
|
-
* ideation / authoring / close-machinery sections a story agent never acts
|
|
192
|
-
* on: keeping them out of the per-Story prompt trims token cost without
|
|
193
|
-
* losing any binding context (the Story carries its own inline
|
|
194
|
-
* acceptance[] / verify[]).
|
|
142
|
+
* Ideation sections a delivering agent never acts on.
|
|
195
143
|
*
|
|
196
144
|
* @type {ReadonlySet<string>}
|
|
197
145
|
*/
|
|
@@ -202,21 +150,9 @@ const DELIVERY_DROP_HEADINGS = new Set([
|
|
|
202
150
|
]);
|
|
203
151
|
|
|
204
152
|
/**
|
|
205
|
-
* Slice a planning
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* `## Non-Goals`, `## User Stories`, the `techSpec` managed region, and —
|
|
209
|
-
* fail-open — any unknown / operator-authored `##` section not in the drop
|
|
210
|
-
* list. DROP: `## Context`, `## Scope`, `## Acceptance Criteria`, and the
|
|
211
|
-
* `acceptanceTable` managed region.
|
|
212
|
-
*
|
|
213
|
-
* The `techSpec` region is located by its markers (not by heading
|
|
214
|
-
* boundaries) so its inner `## Delivery Slicing` heading is preserved
|
|
215
|
-
* verbatim and never mistaken for a plain droppable section. Plain `##`
|
|
216
|
-
* sections outside the managed regions are sliced by heading boundaries.
|
|
217
|
-
*
|
|
218
|
-
* Fail-open is load-bearing: any heading not explicitly in the drop set is
|
|
219
|
-
* kept, so operator-authored content is never silently lost.
|
|
153
|
+
* Slice a planning body to what a delivering agent acts on: drops the
|
|
154
|
+
* `acceptanceTable` region and the {@link DELIVERY_DROP_HEADINGS} sections.
|
|
155
|
+
* Fail-open — any other heading is kept so operator content is never lost.
|
|
220
156
|
*
|
|
221
157
|
* @param {string} body
|
|
222
158
|
* @returns {string}
|
|
@@ -224,14 +160,10 @@ const DELIVERY_DROP_HEADINGS = new Set([
|
|
|
224
160
|
export function sliceTicketBodyForDelivery(body) {
|
|
225
161
|
if (typeof body !== 'string' || body.length === 0) return '';
|
|
226
162
|
|
|
227
|
-
// 1. Drop the acceptance-table managed region outright (authoring/close
|
|
228
|
-
// machinery, never delivery context).
|
|
229
163
|
let working = stripTicketSection(body, 'acceptanceTable');
|
|
230
164
|
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
// the plain-section pass. Its inner `## Delivery Slicing` heading must
|
|
234
|
-
// survive verbatim.
|
|
165
|
+
// Lift the techSpec region out behind a placeholder so heading slicing
|
|
166
|
+
// cannot touch its inner `##` headings.
|
|
235
167
|
const techLoc = locate(working, 'techSpec');
|
|
236
168
|
let techRegion = null;
|
|
237
169
|
const PLACEHOLDER = '\u0000MANDREL_TECH_SPEC_PLACEHOLDER\u0000';
|
|
@@ -244,9 +176,6 @@ export function sliceTicketBodyForDelivery(body) {
|
|
|
244
176
|
working.slice(techLoc.endIdx + end.length);
|
|
245
177
|
}
|
|
246
178
|
|
|
247
|
-
// 3. Slice plain `##` sections by heading boundaries, dropping only the
|
|
248
|
-
// known ideation/authoring headings. The preamble before the first
|
|
249
|
-
// `##` (ticket title / lede) is always kept.
|
|
250
179
|
const kept = [];
|
|
251
180
|
let dropping = false;
|
|
252
181
|
for (const line of working.split('\n')) {
|
|
@@ -262,12 +191,10 @@ export function sliceTicketBodyForDelivery(body) {
|
|
|
262
191
|
}
|
|
263
192
|
working = kept.join('\n');
|
|
264
193
|
|
|
265
|
-
// 4. Restore the techSpec region in place.
|
|
266
194
|
if (techRegion !== null) {
|
|
267
195
|
working = working.replace(PLACEHOLDER, () => techRegion);
|
|
268
196
|
}
|
|
269
197
|
|
|
270
|
-
// 5. Normalise the blank-line runs left by the drops.
|
|
271
198
|
return working
|
|
272
199
|
.replace(/\n{3,}/g, '\n\n')
|
|
273
200
|
.replace(/^\n+/, '')
|
|
@@ -275,10 +202,8 @@ export function sliceTicketBodyForDelivery(body) {
|
|
|
275
202
|
}
|
|
276
203
|
|
|
277
204
|
/**
|
|
278
|
-
* Strip
|
|
279
|
-
*
|
|
280
|
-
* The slice ends at the next `## ` heading, a managed-region marker, or
|
|
281
|
-
* EOF. Historical bodies without the section pass through untouched.
|
|
205
|
+
* Strip a `## Planning Artifacts` section, up to the next `## `, managed
|
|
206
|
+
* marker, or EOF.
|
|
282
207
|
*
|
|
283
208
|
* @param {string} body
|
|
284
209
|
* @returns {string}
|
|
@@ -26,19 +26,8 @@ function loadTypeScript() {
|
|
|
26
26
|
let _tsVersion = null;
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* dependency is unresolvable — callers treat that sentinel as "unknown
|
|
32
|
-
* environment" and may refuse to persist a baseline that includes TS rows.
|
|
33
|
-
*
|
|
34
|
-
* **The version is read from the package manifest, never by evaluating the
|
|
35
|
-
* compiler** (Story #5109) — see
|
|
36
|
-
* [`dependency-version.js`](dependency-version.js) for how, and for what it
|
|
37
|
-
* cost to do it the other way. The manifest returns the identical string, so
|
|
38
|
-
* the stamp (and therefore every committed baseline envelope) is
|
|
39
|
-
* byte-identical either way. The compiler itself is still loaded — lazily, by
|
|
40
|
-
* `transpileIfNeeded` — the first time a `.ts`/`.tsx` input is actually
|
|
41
|
-
* transpiled.
|
|
29
|
+
* `typescript` version for baseline stamps, read from the manifest (never by
|
|
30
|
+
* loading the compiler). `'0.0.0'` means unknown environment.
|
|
42
31
|
*
|
|
43
32
|
* @returns {string}
|
|
44
33
|
*/
|
|
@@ -54,32 +43,18 @@ function isTypeScriptPath(filePath) {
|
|
|
54
43
|
}
|
|
55
44
|
|
|
56
45
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* byte-identical to the `sourceMap: false` emit, which is what keeps the
|
|
60
|
-
* maintainability path — and every MI score in the committed baseline —
|
|
61
|
-
* untouched by the CRAP path opting into a map.
|
|
46
|
+
* Stripped so a `sourceMap: true` emit is byte-identical to the plain one,
|
|
47
|
+
* keeping MI scores unaffected by the CRAP path's map.
|
|
62
48
|
*/
|
|
63
49
|
const SOURCE_MAPPING_URL_RE = /\n?\/\/# sourceMappingURL=[^\n]*\n?$/;
|
|
64
50
|
|
|
65
51
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* `SourceMap#findEntry(line, column)` is 0-based and returns the mapping at
|
|
71
|
-
* or before the requested position, so a bare `findEntry(line, 0)` can
|
|
72
|
-
* silently answer with a *previous* line's mapping when the requested line
|
|
73
|
-
* carries no mapping at column 0. The resolver therefore walks the columns
|
|
74
|
-
* of the generated line and accepts only an entry that actually originates
|
|
75
|
-
* on that generated line; a line with no mapping at all resolves to `null`
|
|
76
|
-
* and the caller falls back to the un-remapped coordinate.
|
|
52
|
+
* Memoised `transpiledLine → originalLine` resolver. `findEntry` returns the
|
|
53
|
+
* mapping at or *before* a position, so columns are walked and only an entry
|
|
54
|
+
* on the same generated line is accepted; an unmapped line yields `null`.
|
|
77
55
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* @param {string} sourceMapText Raw JSON source map emitted by TypeScript.
|
|
82
|
-
* @param {string} code The generated (transpiled) code the map describes.
|
|
56
|
+
* @param {string} sourceMapText
|
|
57
|
+
* @param {string} code
|
|
83
58
|
* @returns {((line: number) => number|null)|null}
|
|
84
59
|
*/
|
|
85
60
|
function buildLineMapper(sourceMapText, code) {
|
|
@@ -119,36 +94,9 @@ function buildLineMapper(sourceMapText, code) {
|
|
|
119
94
|
}
|
|
120
95
|
|
|
121
96
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* Type annotations introduce no control flow, so the transpiled output
|
|
127
|
-
* scores identically to the original TS for cyclomatic complexity,
|
|
128
|
-
* Halstead volume, and the maintainability index. `.tsx` uses the
|
|
129
|
-
* `react-jsx` emit so JSX expressions become function calls escomplex
|
|
130
|
-
* can read; `.preserve` would leave JSX in the output and Esprima would
|
|
131
|
-
* choke on it.
|
|
132
|
-
*
|
|
133
|
-
* On transpile failure the helper returns `null` — callers treat that
|
|
134
|
-
* as "skip this file" rather than crashing the scan.
|
|
135
|
-
*
|
|
136
|
-
* **Line coordinates (Story #4775).** The transpile does not preserve line
|
|
137
|
-
* numbers: interface elision and the injected JSX-runtime import shift the
|
|
138
|
-
* emitted code relative to the original source. escomplex then reports each
|
|
139
|
-
* method's `lineStart` in *transpiled* coordinates while istanbul's `fnMap`
|
|
140
|
-
* is in *original source* coordinates — so a per-method coverage join keyed
|
|
141
|
-
* on the raw `lineStart` cannot match. Callers that need to join against
|
|
142
|
-
* coverage pass `{ withLineMap: true }` and receive
|
|
143
|
-
* `{ code, mapLine }`, where `mapLine(transpiledLine)` returns the original
|
|
144
|
-
* source line (or `null` when the line has no mapping).
|
|
145
|
-
*
|
|
146
|
-
* `withLineMap` is opt-in precisely so the maintainability path — which is
|
|
147
|
-
* module-level and never joins coverage — keeps paying nothing for a map it
|
|
148
|
-
* would not read, and keeps emitting byte-identical scores. A JavaScript
|
|
149
|
-
* input is a passthrough in both modes: `mapLine` is `null` because the
|
|
150
|
-
* coordinates already *are* original-source coordinates, so no remap is
|
|
151
|
-
* needed and none is computed.
|
|
97
|
+
* TS/TSX → JS escomplex can parse (types add no control flow); JS passes
|
|
98
|
+
* through; `null` means skip. Transpiling shifts lines, so a coverage join
|
|
99
|
+
* opts into `{ withLineMap: true }` → `{ code, mapLine }` (`null` for JS).
|
|
152
100
|
*
|
|
153
101
|
* @param {string} filePath
|
|
154
102
|
* @param {string} source
|
|
@@ -199,17 +147,10 @@ export function transpileIfNeeded(filePath, source, opts = {}) {
|
|
|
199
147
|
}
|
|
200
148
|
|
|
201
149
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
* transpiled → original-source line resolver the coverage join needs
|
|
205
|
-
* (Story #4775).
|
|
206
|
-
*
|
|
207
|
-
* Failure is reported as `{error: 'read'}` or `{error: 'transpile'}` rather
|
|
208
|
-
* than a bare null: CRAP drops the file either way, but the combined MI path
|
|
209
|
-
* distinguishes them (a read failure drops the MI score, a transpile failure
|
|
210
|
-
* scores it 0 — matching `calculateForFile`).
|
|
150
|
+
* Read + transpile with a line map. Read and transpile failures stay
|
|
151
|
+
* distinct: the MI path drops the score on `read` but scores 0 on `transpile`.
|
|
211
152
|
*
|
|
212
|
-
* @param {string} abs
|
|
153
|
+
* @param {string} abs
|
|
213
154
|
* @param {{readFile?: (p: string) => string, transpile?: Function}} [deps]
|
|
214
155
|
* @returns {{code: string, mapLine: ((line: number) => number|null)|null}
|
|
215
156
|
* | {error: 'read'|'transpile'}}
|
|
@@ -1,32 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* concurrentMap — bounded-concurrency async map.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - Preserves input order in the returned array (result[i] == mapper(items[i])).
|
|
6
|
-
* - Cap of at most `concurrency` `mapper` invocations in flight at a time.
|
|
7
|
-
* - First rejection wins: the returned promise rejects with the first thrown
|
|
8
|
-
* error. Later rejections from drain-through work are swallowed so the
|
|
9
|
-
* caller observes a single deterministic failure.
|
|
10
|
-
* - Drain-on-rejection: workers that are already mid-await finish naturally
|
|
11
|
-
* (we do not cancel). Only dispatch of *new* items stops after the first
|
|
12
|
-
* error. This matches fetch-style callers that have no cancellation token
|
|
13
|
-
* and would leak otherwise.
|
|
2
|
+
* concurrentMap — bounded-concurrency async map. Preserves input order; the
|
|
3
|
+
* first rejection wins and stops new dispatch, while in-flight work drains
|
|
4
|
+
* (no cancellation) and later rejections are swallowed.
|
|
14
5
|
*/
|
|
15
6
|
|
|
16
7
|
/**
|
|
17
|
-
* The
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* the persist checkpoint fan-out, the `agent::ready` flips and the supersede
|
|
21
|
-
* close loop, so re-tuning the policy is one edit rather than six.
|
|
22
|
-
*
|
|
23
|
-
* **Why bounded and not unbounded.** Every unit in those fan-outs is its own
|
|
24
|
-
* API round-trip, so an unbounded map over an N-Story plan dispatches N writes
|
|
25
|
-
* at once — and GitHub answers a burst with a secondary rate limit rather than
|
|
26
|
-
* with throughput. The goal is overlapping unrelated waits, not saturating the
|
|
27
|
-
* API, and four is enough to collapse the latency the serial loops paid while
|
|
28
|
-
* staying well under the burst threshold. Callers whose ordering is
|
|
29
|
-
* load-bearing (`createStoryIssues`) stay serial instead of importing this.
|
|
8
|
+
* The shared bound for independent GitHub-write fan-outs. Unbounded bursts
|
|
9
|
+
* earn a secondary rate limit, not throughput; four overlaps the waits while
|
|
10
|
+
* staying under it. Order-sensitive callers stay serial instead.
|
|
30
11
|
*/
|
|
31
12
|
export const FANOUT_CONCURRENCY = 4;
|
|
32
13
|
|
|
@@ -1,51 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* parse-id-list — expand a Story-id list that may contain dash ranges
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* transcription step that silently drops or invents an id, so the range is a
|
|
7
|
-
* first-class shape of every delivery id list rather than something the host
|
|
8
|
-
* expands from prose.
|
|
9
|
-
*
|
|
10
|
-
* Accepted tokens, comma-separated:
|
|
11
|
-
* - a single id, with an optional `#` — `4922`, `#4922`
|
|
12
|
-
* - an inclusive range — `4922-4926`, `4922 - 4926`, `#4922-#4926`
|
|
13
|
-
* (hyphen-minus, en dash, or em dash; whitespace around it is fine)
|
|
14
|
-
*
|
|
15
|
-
* Everything else is a hard error, never a silent drop: a wrong id list
|
|
16
|
-
* co-dispatches against the wrong graph, so it must fail where it is typed.
|
|
17
|
-
* Two range-specific guards exist for the same reason — a backwards range is
|
|
18
|
-
* refused rather than expanded to nothing, and a span above `MAX_RANGE_SPAN`
|
|
19
|
-
* is refused rather than resolving thousands of issues off a typo.
|
|
2
|
+
* parse-id-list — expand a Story-id list that may contain dash ranges
|
|
3
|
+
* (an id with optional `#` prefix, or `A - B`, en/em dash accepted). Anything else is a
|
|
4
|
+
* hard error, never a silent drop: a wrong list dispatches against the wrong
|
|
5
|
+
* graph. Backwards ranges and spans above the cap are refused too.
|
|
20
6
|
*/
|
|
21
7
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* plan run (a handful of Stories) and tight enough that `1-4926` is caught as
|
|
25
|
-
* the typo it is rather than fanning out into a live resolution sweep.
|
|
26
|
-
*
|
|
27
|
-
* Deliberately module-private: the cap is a published contract
|
|
28
|
-
* (`helpers/deliver-reference.md` § Ranges), so a test that imported it could
|
|
29
|
-
* not notice the number silently moving out from under the doc.
|
|
30
|
-
*/
|
|
8
|
+
// Catches `1-4926` as the typo it is. Module-private because the number is a
|
|
9
|
+
// published contract (`helpers/deliver-reference.md` § Ranges).
|
|
31
10
|
const MAX_RANGE_SPAN = 50;
|
|
32
11
|
|
|
33
|
-
/** Hyphen-minus, en dash, em dash — whichever the operator's keyboard emits. */
|
|
34
12
|
const DASH = '[-–—]';
|
|
35
13
|
const SINGLE_RE = /^#?(\d+)$/;
|
|
36
14
|
const RANGE_RE = new RegExp(`^#?(\\d+)\\s*${DASH}\\s*#?(\\d+)$`);
|
|
37
15
|
|
|
38
16
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Absent or empty input is not an error here — it yields an empty list, and
|
|
42
|
-
* the caller decides whether that is a usage error (`--ids`) or a legitimate
|
|
43
|
-
* empty set (`--done`).
|
|
17
|
+
* Empty input yields `[]`; the caller decides whether that is an error.
|
|
44
18
|
*
|
|
45
19
|
* @param {string|undefined|null} raw
|
|
46
20
|
* @param {object} [options]
|
|
47
21
|
* @param {string} [options.flag] Flag name, for the error message.
|
|
48
|
-
* @param {string} [options.prefix] Message prefix
|
|
22
|
+
* @param {string} [options.prefix] Message prefix.
|
|
49
23
|
* @param {number} [options.maxSpan] Inclusive-span ceiling per range token.
|
|
50
24
|
* @returns {{ ids: number[]|null, error: string|null }}
|
|
51
25
|
*/
|
|
@@ -1,25 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* pollUntil — run `fn`
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Errors thrown by `fn` are logged via `logger.warn` (if provided) and
|
|
9
|
-
* treated as a non-match — the loop continues until predicate, abort, or
|
|
10
|
-
* timeout. This mirrors the hand-rolled wait loops we replaced, where a
|
|
11
|
-
* single transient fetch error should not terminate the poll.
|
|
12
|
-
*
|
|
13
|
-
* `sleep` is exported as the cancellable delay primitive used internally;
|
|
14
|
-
* callers that already have their own cadence (e.g. a continuous ticker)
|
|
15
|
-
* can import it directly.
|
|
16
|
-
*
|
|
17
|
-
* `sleepFn` is the inter-tick delay seam (Story #4873). A caller that already
|
|
18
|
-
* owns a delay seam of its own — the close-and-land merge wait, whose suite
|
|
19
|
-
* must never actually sleep out a 30s poll interval — passes it here so
|
|
20
|
-
* adopting this primitive does not cost it that seam. It is called as
|
|
21
|
-
* `sleepFn(intervalMs, signal)`; a one-argument stub simply ignores the
|
|
22
|
-
* signal, and the default is the cancellable {@link sleep} below.
|
|
2
|
+
* pollUntil — run `fn` every `intervalMs` until `predicate(result)` holds
|
|
3
|
+
* (returns it), `signal` aborts (`undefined`), or `timeoutMs` elapses
|
|
4
|
+
* (throws). A throwing `fn` is logged and treated as a non-match, so one
|
|
5
|
+
* transient error never ends the poll. `sleepFn(ms, signal)` lets a caller
|
|
6
|
+
* keep its own delay seam.
|
|
23
7
|
*/
|
|
24
8
|
|
|
25
9
|
/**
|
|
@@ -74,13 +58,9 @@ export async function pollUntil(opts) {
|
|
|
74
58
|
}
|
|
75
59
|
|
|
76
60
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* test runner to cancel subtests that awaited `sleep` with `cancelledByParent`
|
|
81
|
-
* / "Promise resolution is still pending but the event loop has already
|
|
82
|
-
* resolved". Callers that need a clean shutdown should abort the `signal`
|
|
83
|
-
* instead of relying on unref.
|
|
61
|
+
* Resolves after `ms` or on abort. Deliberately not `unref`'d: Node 22's test
|
|
62
|
+
* runner cancels subtests awaiting an unref'd timer. Abort the signal for a
|
|
63
|
+
* clean shutdown instead.
|
|
84
64
|
*
|
|
85
65
|
* @param {number} ms
|
|
86
66
|
* @param {AbortSignal} [signal]
|