mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,52 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* conventional-subject.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here each closed a defect observed live on `main`:
|
|
8
|
-
*
|
|
9
|
-
* 1. **Type precedence follows release impact.** A multi-commit Story used
|
|
10
|
-
* to resolve its type off a hand-ordered list in which `docs` outranked
|
|
11
|
-
* `chore` for no stated reason. Story #5004 (`chore(gates)`, `docs(ci)`,
|
|
12
|
-
* `chore(baselines)`) therefore landed as
|
|
13
|
-
* `docs: check/CI gate sweep …` — a change that deleted five
|
|
14
|
-
* `lib/checks` modules, two CLIs and a dependency, filed under
|
|
15
|
-
* documentation. `TYPE_RANK` now mirrors `changelog-sections` in
|
|
16
|
-
* `release-please-config.json`: rank IS how visible the type is in the
|
|
17
|
-
* release notes. Types that render identically (the six `hidden: true`
|
|
18
|
-
* ones) share a rank, because there is no honest ordering between them —
|
|
19
|
-
* those ties break on how much of the branch carries the type, then on
|
|
20
|
-
* the Story's primary (oldest) commit.
|
|
21
|
-
*
|
|
22
|
-
* 2. **Casing leaves acronyms alone.** The old synthesizer lowercased the
|
|
23
|
-
* first character unconditionally to satisfy commitlint's `subject-case`
|
|
24
|
-
* rule, which turned Story #5002's "CRAP surface diet" into
|
|
25
|
-
* `refactor: cRAP surface diet`. `shapeDescription` lowercases only when
|
|
26
|
-
* the leading word is not an all-caps token, so CRAP / CI / QA / API
|
|
27
|
-
* survive. That is a deliberate, narrow trade: commitlint's
|
|
28
|
-
* `subject-case` treats ANY leading capital as sentence-case and would
|
|
29
|
-
* flag `CRAP surface diet` — but commitlint never runs on a PR title or
|
|
30
|
-
* a GitHub squash subject (see `rules/git-conventions.md` §
|
|
31
|
-
* Conventional Commits), so the rule it would fail is not a gate this
|
|
32
|
-
* subject passes through, while a mangled acronym is permanent in the
|
|
33
|
-
* changelog.
|
|
34
|
-
*
|
|
35
|
-
* 3. **A breaking change survives the squash.** release-please only sees a
|
|
36
|
-
* breaking change through a `!` in the subject or a `BREAKING CHANGE:`
|
|
37
|
-
* footer. Story #5004 removed `project.commands.lintBaseline` from a
|
|
38
|
-
* schema block that is `additionalProperties: false` — a hard consumer
|
|
39
|
-
* break — described in prose in the commit body and therefore invisible
|
|
40
|
-
* to the parser. `collectBreakingNotes` reads the footer out of any
|
|
41
|
-
* constituent commit (or a Story-body declaration) and `markBreaking`
|
|
42
|
-
* puts the `!` where the parser looks.
|
|
2
|
+
* conventional-subject.js — pure Conventional-Commit rules for the squash
|
|
3
|
+
* subject a Story lands on `main`: type precedence by release impact,
|
|
4
|
+
* acronym-safe casing (commitlint never sees a squash subject, but a mangled
|
|
5
|
+
* acronym is permanent in the changelog), and a breaking change that
|
|
6
|
+
* survives the squash as a `!`.
|
|
43
7
|
*/
|
|
44
8
|
|
|
45
9
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* `changelog-sections`. Kept in sync by hand (single hard-cutover, no
|
|
49
|
-
* shim) — adding a type means touching all three.
|
|
10
|
+
* Mirrors commitlint `type-enum` and release-please `changelog-sections`;
|
|
11
|
+
* kept in sync by hand.
|
|
50
12
|
*/
|
|
51
13
|
const CONVENTIONAL_TYPES = Object.freeze([
|
|
52
14
|
'feat',
|
|
@@ -63,11 +25,8 @@ const CONVENTIONAL_TYPES = Object.freeze([
|
|
|
63
25
|
]);
|
|
64
26
|
|
|
65
27
|
/**
|
|
66
|
-
* Release-impact rank
|
|
67
|
-
*
|
|
68
|
-
* render a visible section are ordered by how much a reader needs to see
|
|
69
|
-
* them, and the six `hidden: true` types share the bottom rank because the
|
|
70
|
-
* release notes draw no distinction between them.
|
|
28
|
+
* Release-impact rank, LOWER wins, from `changelog-sections`; the hidden
|
|
29
|
+
* types tie because the release notes don't distinguish them.
|
|
71
30
|
*
|
|
72
31
|
* @type {Readonly<Record<string, number>>}
|
|
73
32
|
*/
|
|
@@ -85,48 +44,28 @@ const TYPE_RANK = Object.freeze({
|
|
|
85
44
|
ci: 5, // hidden
|
|
86
45
|
});
|
|
87
46
|
|
|
88
|
-
/** Rank for a type absent from `TYPE_RANK` — always loses. */
|
|
89
47
|
const UNRANKED = Number.MAX_SAFE_INTEGER;
|
|
90
48
|
|
|
91
49
|
const TYPE_GROUP = CONVENTIONAL_TYPES.join('|');
|
|
92
50
|
|
|
93
|
-
//
|
|
94
|
-
// <type>(<optional scope>)<optional !>: <non-empty description>
|
|
95
|
-
// Mirrors the shape `@commitlint/config-conventional` enforces (a known
|
|
96
|
-
// type, an optional parenthesised scope, an optional breaking `!`, a
|
|
97
|
-
// colon-space separator, and a non-empty subject). Used for the pure
|
|
98
|
-
// "is this already conventional?" check and to pull the type off a branch
|
|
99
|
-
// commit subject without spawning commitlint per call.
|
|
51
|
+
// <type>(<scope>)?!?: <description> — the shape config-conventional enforces.
|
|
100
52
|
const CONVENTIONAL_HEADER_RE = new RegExp(
|
|
101
53
|
`^(?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?!?: \\S.*$`,
|
|
102
54
|
);
|
|
103
55
|
const LEADING_TYPE_RE = new RegExp(
|
|
104
56
|
`^(${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?(!?):`,
|
|
105
57
|
);
|
|
106
|
-
// Splits a conventional header into `<type><scope?>`, `<!?>`, `<description>`
|
|
107
|
-
// so the breaking marker can be inserted at the one position the parser reads.
|
|
108
58
|
const HEADER_PARTS_RE = new RegExp(
|
|
109
59
|
`^((?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?)(!?): (.*)$`,
|
|
110
60
|
);
|
|
111
61
|
|
|
112
|
-
/**
|
|
113
|
-
* The Conventional-Commits breaking footer, in both spellings the spec
|
|
114
|
-
* defines (`BREAKING CHANGE:` and the hyphenated `BREAKING-CHANGE:`). Case is
|
|
115
|
-
* significant — the spec requires uppercase, and so does
|
|
116
|
-
* `conventional-commits-parser`'s default `noteKeywords`, so matching
|
|
117
|
-
* case-insensitively here would announce breaks release-please will not.
|
|
118
|
-
*/
|
|
62
|
+
/** Case-sensitive, as the parser's `noteKeywords` are. */
|
|
119
63
|
const BREAKING_FOOTER_RE = /^BREAKING[ -]CHANGE:[ \t]*(.*)$/;
|
|
120
64
|
|
|
121
|
-
/** A git-trailer-shaped line (`Some-Token: value`) — ends a footer's text. */
|
|
122
65
|
const TRAILER_RE = /^[A-Za-z][A-Za-z-]*:[ \t]/;
|
|
123
|
-
/** An opening or closing markdown code fence: ``` or ~~~, optionally indented. */
|
|
124
66
|
const FENCE_RE = /^\s{0,3}(`{3,}|~{3,})/;
|
|
125
67
|
|
|
126
68
|
/**
|
|
127
|
-
* True iff `subject` is a parseable Conventional Commit subject under the
|
|
128
|
-
* repo's type vocabulary. Pure.
|
|
129
|
-
*
|
|
130
69
|
* @param {string} subject
|
|
131
70
|
* @returns {boolean}
|
|
132
71
|
*/
|
|
@@ -136,9 +75,6 @@ export function isConventionalSubject(subject) {
|
|
|
136
75
|
}
|
|
137
76
|
|
|
138
77
|
/**
|
|
139
|
-
* Extract the Conventional-Commit `type` from a single commit subject, or
|
|
140
|
-
* `null` when the subject is not conventional. Pure.
|
|
141
|
-
*
|
|
142
78
|
* @param {string} subject
|
|
143
79
|
* @returns {string|null}
|
|
144
80
|
*/
|
|
@@ -149,10 +85,8 @@ function parseConventionalType(subject) {
|
|
|
149
85
|
}
|
|
150
86
|
|
|
151
87
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* and third keys only ever decide a tie inside the hidden tier — every
|
|
155
|
-
* visible type holds its rank alone.
|
|
88
|
+
* Rank, then commit count, then earliest use (the tie-breaks only matter in
|
|
89
|
+
* the hidden tier).
|
|
156
90
|
*
|
|
157
91
|
* @param {{rank: number, count: number, firstIndex: number}} a
|
|
158
92
|
* @param {{rank: number, count: number, firstIndex: number}} b
|
|
@@ -165,12 +99,8 @@ function compareTypeCandidates(a, b) {
|
|
|
165
99
|
}
|
|
166
100
|
|
|
167
101
|
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* `subjects` MUST be oldest-first: the final tie-break reads index 0 as the
|
|
172
|
-
* Story's primary commit, the one whose type the operator chose before any
|
|
173
|
-
* fixup or baseline-refresh commit piled on.
|
|
102
|
+
* `subjects` MUST be oldest-first: the last tie-break treats index 0 as the
|
|
103
|
+
* Story's primary commit.
|
|
174
104
|
*
|
|
175
105
|
* @param {string[]} subjects Commit subjects, oldest first.
|
|
176
106
|
* @returns {string|null}
|
|
@@ -199,11 +129,8 @@ export function pickDominantType(subjects) {
|
|
|
199
129
|
}
|
|
200
130
|
|
|
201
131
|
/**
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
* "A" or "I" still lowercases; punctuation and digits are ignored so
|
|
205
|
-
* `CRAP:`, `CI/CD` and `API-surface` all read as acronyms while `A11y` does
|
|
206
|
-
* not.
|
|
132
|
+
* Leading all-caps word of 2+ letters (non-letters ignored), so `CI/CD` is an
|
|
133
|
+
* acronym but a lone "A" or `A11y` is not.
|
|
207
134
|
*
|
|
208
135
|
* @param {string} text
|
|
209
136
|
* @returns {boolean}
|
|
@@ -215,10 +142,7 @@ function leadsWithAcronym(text) {
|
|
|
215
142
|
}
|
|
216
143
|
|
|
217
144
|
/**
|
|
218
|
-
*
|
|
219
|
-
* Conventional-Commit subject: lowercase the first character so the subject
|
|
220
|
-
* reads as a sentence fragment, EXCEPT when the leading word is an acronym.
|
|
221
|
-
* Pure.
|
|
145
|
+
* Lowercase the first character unless the leading word is an acronym.
|
|
222
146
|
*
|
|
223
147
|
* @param {string} text
|
|
224
148
|
* @returns {string}
|
|
@@ -231,10 +155,7 @@ export function shapeDescription(text) {
|
|
|
231
155
|
}
|
|
232
156
|
|
|
233
157
|
/**
|
|
234
|
-
* Insert
|
|
235
|
-
* position `conventional-commits-parser` reads it: immediately before the
|
|
236
|
-
* colon, after any scope. A subject that already carries `!`, or that is not
|
|
237
|
-
* conventional, is returned unchanged. Pure.
|
|
158
|
+
* Insert `!` before the colon (after any scope); otherwise unchanged.
|
|
238
159
|
*
|
|
239
160
|
* @param {string} subject
|
|
240
161
|
* @returns {string}
|
|
@@ -248,9 +169,7 @@ export function markBreaking(subject) {
|
|
|
248
169
|
}
|
|
249
170
|
|
|
250
171
|
/**
|
|
251
|
-
*
|
|
252
|
-
* the footer line itself. The note runs to the end of its paragraph: a blank
|
|
253
|
-
* line, another trailer, or the end of the message closes it.
|
|
172
|
+
* A footer note runs until a blank line, another trailer, or the end.
|
|
254
173
|
*
|
|
255
174
|
* @param {string[]} lines
|
|
256
175
|
* @param {number} start Index of the matched footer line.
|
|
@@ -271,22 +190,8 @@ function readFooterNote(lines, start, head) {
|
|
|
271
190
|
}
|
|
272
191
|
|
|
273
192
|
/**
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
* @param {string} text
|
|
277
|
-
* @param {boolean} readHeaderBang Whether line 0 is a commit header whose `!`
|
|
278
|
-
* counts. False for the Story body, which has no header.
|
|
279
|
-
* @returns {{ breaking: boolean, notes: string[], subject: string|null }}
|
|
280
|
-
*/
|
|
281
|
-
/**
|
|
282
|
-
* Blank every line inside a markdown code fence, keeping line indices intact.
|
|
283
|
-
*
|
|
284
|
-
* A Story `## Spec` that documents this very contract quotes the footer in a
|
|
285
|
-
* fence; reading that as a declaration ships a `<type>!:` subject and a release
|
|
286
|
-
* note for a break nobody made. Fenced spans are the only place the anchored
|
|
287
|
-
* footer regex can fire on non-footer text — an indented block or a blockquote
|
|
288
|
-
* already fails the `^` anchor. Blanking rather than dropping means a fence
|
|
289
|
-
* also closes an open footer note, which is what a paragraph break would do.
|
|
193
|
+
* Blank lines inside code fences, so a quoted footer is not a declaration;
|
|
194
|
+
* blanking (not dropping) keeps indices and closes an open note.
|
|
290
195
|
*
|
|
291
196
|
* @param {string[]} lines
|
|
292
197
|
* @returns {string[]}
|
|
@@ -302,6 +207,11 @@ function blankFencedLines(lines) {
|
|
|
302
207
|
});
|
|
303
208
|
}
|
|
304
209
|
|
|
210
|
+
/**
|
|
211
|
+
* @param {string} text
|
|
212
|
+
* @param {boolean} readHeaderBang False for the Story body, which has no header.
|
|
213
|
+
* @returns {{ breaking: boolean, notes: string[], subject: string|null }}
|
|
214
|
+
*/
|
|
305
215
|
function scanForBreaking(text, readHeaderBang) {
|
|
306
216
|
const lines = blankFencedLines(String(text ?? '').split('\n'));
|
|
307
217
|
const notes = [];
|
|
@@ -334,23 +244,9 @@ function scanForBreaking(text, readHeaderBang) {
|
|
|
334
244
|
}
|
|
335
245
|
|
|
336
246
|
/**
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
* - **Any constituent commit** — a `BREAKING CHANGE:` / `BREAKING-CHANGE:`
|
|
342
|
-
* footer, or a `!` in the header. This is the path a maker takes while
|
|
343
|
-
* writing the commit that does the breaking.
|
|
344
|
-
* - **The Story body** — the same footer, written as its own line anywhere
|
|
345
|
-
* in the Story issue (the `## Spec` block is the natural home). This is
|
|
346
|
-
* the declarative path: `/mandrel-plan` can state the break up front and close
|
|
347
|
-
* propagates it even when no individual commit remembered the footer.
|
|
348
|
-
* Only the footer form counts; prose describing a break does not, because
|
|
349
|
-
* a keyword-free sentence is exactly what release-please cannot parse.
|
|
350
|
-
*
|
|
351
|
-
* When something is breaking but no footer supplied text, the `!` commit's
|
|
352
|
-
* own description becomes the note — the fallback Conventional Commits
|
|
353
|
-
* itself prescribes for a `!` header with no footer.
|
|
247
|
+
* Breaking declarations from any commit (footer or header `!`) or a footer
|
|
248
|
+
* line in the Story body; prose never counts. With no footer text, the `!`
|
|
249
|
+
* commit's description is the note, per the spec.
|
|
354
250
|
*
|
|
355
251
|
* @param {{ commitMessages?: string[], storyBody?: string }} args
|
|
356
252
|
* @returns {{ breaking: boolean, notes: string[] }}
|
|
@@ -1,28 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/graphql-preflight.js — the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* close-validation gate chain, synced from the base branch and pushed, then
|
|
7
|
-
* died in the `pull-request` phase on `gh pr create` with a raw HTTP 403:
|
|
8
|
-
* GitHub's GraphQL API is unreachable from that session, and `gh` routes the
|
|
9
|
-
* whole `gh pr` surface through it. That 403 was a fact about the session,
|
|
10
|
-
* knowable before the first gate ran, that the operator paid roughly five
|
|
11
|
-
* minutes of gates to learn.
|
|
12
|
-
*
|
|
13
|
-
* ## Why this is not a pre-gate step
|
|
14
|
-
*
|
|
15
|
-
* It sits beside `pre-gate-steps.js` and inverts every clause of that
|
|
16
|
-
* module's contract, which is why it does not live inside it. Those steps
|
|
17
|
-
* commit to `story-<id>`, run from the gate phase, and may **never** fail the
|
|
18
|
-
* close, because each is the refresh half of a loop whose enforcement half
|
|
19
|
-
* runs immediately afterwards. This one commits nothing, runs from the runner
|
|
20
|
-
* during `init`, and exists precisely to fail the close — before a single
|
|
21
|
-
* gate is spawned and before anything is pushed. One module, one contract.
|
|
22
|
-
*
|
|
23
|
-
* What it must never do is fail a *healthy* close, which is why an ambiguous
|
|
24
|
-
* probe is fail-open at its source (`probeGraphqlAvailability`) and a
|
|
25
|
-
* throwing probe is fail-open here.
|
|
2
|
+
* phases/graphql-preflight.js — refuse the close during `init` when GitHub
|
|
3
|
+
* GraphQL (which all of `gh pr` needs) is unreachable, before any gate runs
|
|
4
|
+
* or anything is pushed. It must never fail a healthy close: ambiguous or
|
|
5
|
+
* throwing probes are fail-open.
|
|
26
6
|
*/
|
|
27
7
|
|
|
28
8
|
import {
|
|
@@ -37,16 +17,8 @@ import {
|
|
|
37
17
|
} from '../../ticketing.js';
|
|
38
18
|
|
|
39
19
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* terminal envelope's `blocked` status promises the operator.
|
|
43
|
-
*
|
|
44
|
-
* Both writes are best-effort and warn rather than throw, for the reason
|
|
45
|
-
* `handleSyncFailure` gives: a notification-side failure must not replace the
|
|
46
|
-
* real blocker with a secondary one — and here the notification travels the
|
|
47
|
-
* very API surface that is already suspect. Both go through the canonical
|
|
48
|
-
* mutators; a bare `updateTicket` would skip the Projects v2 column sync and
|
|
49
|
-
* strand the board on the Story's prior status.
|
|
20
|
+
* Best-effort: a notification failure must not replace the real blocker.
|
|
21
|
+
* Canonical mutators only, so the Projects v2 column syncs.
|
|
50
22
|
*
|
|
51
23
|
* @param {{ provider: object, storyId: number, reason: string,
|
|
52
24
|
* progress: (tag: string, msg: string) => void }} args
|
|
@@ -85,16 +57,7 @@ async function announcePreflightBlock({ provider, storyId, reason, progress }) {
|
|
|
85
57
|
}
|
|
86
58
|
|
|
87
59
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* One cheap API read decides it. An `available` verdict returns null and the
|
|
91
|
-
* close proceeds exactly as a run with no preflight would; a refusing verdict
|
|
92
|
-
* announces the block on the Story and returns the descriptor the runner
|
|
93
|
-
* turns into a `blocked` terminal envelope at phase `init`.
|
|
94
|
-
*
|
|
95
|
-
* The probe cannot throw, but a caller-injected one can, and a preflight that
|
|
96
|
-
* takes down a close it was meant to protect is the one outcome worse than
|
|
97
|
-
* the late 403 — so a throwing probe is logged and treated as available.
|
|
60
|
+
* A throwing (injected) probe is treated as available.
|
|
98
61
|
*
|
|
99
62
|
* @param {{
|
|
100
63
|
* storyId: number,
|
|
@@ -102,12 +65,8 @@ async function announcePreflightBlock({ provider, storyId, reason, progress }) {
|
|
|
102
65
|
* progress: (tag: string, msg: string) => void,
|
|
103
66
|
* ghFacade?: { api: Function },
|
|
104
67
|
* probe?: typeof probeGraphqlAvailability,
|
|
105
|
-
* }} args
|
|
106
|
-
*
|
|
107
|
-
* boundary the pull-request phase will later ask rather than a second one
|
|
108
|
-
* that could answer differently.
|
|
109
|
-
* @returns {Promise<{ verdict: string, reason: string }|null>} null when the
|
|
110
|
-
* close may proceed.
|
|
68
|
+
* }} args `ghFacade` is the run's own, so it asks the same boundary the PR phase will.
|
|
69
|
+
* @returns {Promise<{ verdict: string, reason: string }|null>} null to proceed.
|
|
111
70
|
*/
|
|
112
71
|
export async function runGraphqlPreflight({
|
|
113
72
|
storyId,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/lock-wait-pending.js — a close whose full-suite lock wait expired
|
|
3
|
+
* ends `pending`, not `failed`: nothing was spawned, pushed or labelled, so
|
|
4
|
+
* the next command is the same close.
|
|
5
|
+
*/
|
|
6
|
+
import {
|
|
7
|
+
buildTerminalEnvelope,
|
|
8
|
+
NEXT_COMMANDS,
|
|
9
|
+
} from '../../story-deliver-terminal.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {{
|
|
13
|
+
* storyId: number,
|
|
14
|
+
* storyBranch: string,
|
|
15
|
+
* baseBranch: string,
|
|
16
|
+
* lockWait: { waitedSeconds: number, expired: boolean }|null,
|
|
17
|
+
* elapsedSeconds: number,
|
|
18
|
+
* }} args
|
|
19
|
+
* @returns {{ result: object, terminal: object, note: string }} The close
|
|
20
|
+
* result, the validated `pending` envelope, and the operator line.
|
|
21
|
+
*/
|
|
22
|
+
export function lockWaitPending({
|
|
23
|
+
storyId,
|
|
24
|
+
storyBranch,
|
|
25
|
+
baseBranch,
|
|
26
|
+
lockWait,
|
|
27
|
+
elapsedSeconds,
|
|
28
|
+
}) {
|
|
29
|
+
const nextCommand = NEXT_COMMANDS.close(storyId);
|
|
30
|
+
return {
|
|
31
|
+
result: {
|
|
32
|
+
storyId,
|
|
33
|
+
standalone: true,
|
|
34
|
+
action: 'deferred',
|
|
35
|
+
reason: 'full-suite-lock-wait-expired',
|
|
36
|
+
},
|
|
37
|
+
terminal: buildTerminalEnvelope({
|
|
38
|
+
storyId,
|
|
39
|
+
status: 'pending',
|
|
40
|
+
phase: 'close-validation',
|
|
41
|
+
storyBranch,
|
|
42
|
+
baseBranch,
|
|
43
|
+
lockWait,
|
|
44
|
+
nextCommand,
|
|
45
|
+
elapsedSeconds,
|
|
46
|
+
}),
|
|
47
|
+
note: `⏸ Story #${storyId}: another full suite held the host lock past the wait budget — resume with: ${nextCommand}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* normalize-pr-title.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Story #3969 (framework gap). The repo squash-merges, and GitHub uses the
|
|
7
|
-
* PR title as the squash-commit subject. `buildPullRequest` previously
|
|
8
|
-
* emitted the raw human issue title (`<storyTitle> (#<id>)`), which is a
|
|
9
|
-
* plain description ("Rename the published npm package…") that
|
|
10
|
-
* release-please's Conventional-Commit parser rejects:
|
|
11
|
-
*
|
|
12
|
-
* ❯ commit could not be parsed: … Rename the published npm package …
|
|
13
|
-
* ❯ error: unexpected token ' ' at 1:7, valid tokens [(, !, :]
|
|
14
|
-
* ❯ commits: 0 → no release cut
|
|
15
|
-
*
|
|
16
|
-
* The `commit-msg` commitlint Husky hook only validates *local* commits and
|
|
17
|
-
* never runs on a GitHub-UI squash-merge title, so nothing mechanized the
|
|
18
|
-
* documented "author the PR title in conventional form" contract. This
|
|
19
|
-
* module mechanizes it.
|
|
20
|
-
*
|
|
21
|
-
* Contract (pure where possible — the only side effect is an injectable
|
|
22
|
-
* `git log` read):
|
|
23
|
-
*
|
|
24
|
-
* - If `storyTitle` is **already** a parseable Conventional Commit
|
|
25
|
-
* subject, it is preserved verbatim and suffixed with `(#<storyId>)`.
|
|
26
|
-
* No re-prefixing, no double type.
|
|
27
|
-
* - Otherwise the title is **synthesized** into conventional form:
|
|
28
|
-
* `<type>: <descriptive text> (#<storyId>)`. The `type` is derived
|
|
29
|
-
* from the branch's own (already-conventional) commit subjects when
|
|
30
|
-
* available, falling back to a safe configured default (`chore`).
|
|
31
|
-
* - Either way, a branch (or Story) that declares a breaking change gets
|
|
32
|
-
* the `!` marker and a `BREAKING CHANGE:` footer on the PR body.
|
|
33
|
-
*
|
|
34
|
-
* The rules that decide *what* the subject says now live in
|
|
35
|
-
* `conventional-subject.js` — type precedence, acronym-safe casing, and
|
|
36
|
-
* breaking-change collection are pure and unit-tested there. What is left
|
|
37
|
-
* here is the git read those rules consume and the assembly of the two
|
|
38
|
-
* strings `gh pr create` needs.
|
|
2
|
+
* normalize-pr-title.js — make the PR title (GitHub's squash subject) a
|
|
3
|
+
* Conventional Commit so release-please can parse it; commitlint never sees
|
|
4
|
+
* a squash title. The subject rules live in `conventional-subject.js`; this
|
|
5
|
+
* module does the git read and assembles the `gh pr create` strings.
|
|
39
6
|
*/
|
|
40
7
|
|
|
41
8
|
import { gitSpawn as defaultGitSpawn } from '../../../git-utils.js';
|
|
@@ -48,28 +15,14 @@ import {
|
|
|
48
15
|
shapeDescription,
|
|
49
16
|
} from './conventional-subject.js';
|
|
50
17
|
|
|
51
|
-
/** Safe default Conventional-Commit type when none can be derived. */
|
|
52
18
|
const DEFAULT_CONVENTIONAL_TYPE = 'chore';
|
|
53
19
|
|
|
54
|
-
/**
|
|
55
|
-
* Record separator between whole commit messages in the `git log` read. A NUL
|
|
56
|
-
* cannot occur inside a commit message, so splitting on it is unambiguous —
|
|
57
|
-
* unlike a blank-line or subject-prefix heuristic, which a commit body can
|
|
58
|
-
* forge.
|
|
59
|
-
*/
|
|
20
|
+
/** NUL cannot occur in a commit message, so a body cannot forge a split. */
|
|
60
21
|
const RECORD_SEP = '\u0000';
|
|
61
22
|
|
|
62
23
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* where a `BREAKING CHANGE:` footer lives.
|
|
66
|
-
*
|
|
67
|
-
* Returns `[]` when the read fails, which degrades every downstream rule to
|
|
68
|
-
* its safe default (type `chore`, no breaking marker) rather than throwing a
|
|
69
|
-
* close that is otherwise healthy.
|
|
70
|
-
*
|
|
71
|
-
* Oldest-first (`--reverse`) is load-bearing: `pickDominantType` breaks a tie
|
|
72
|
-
* on the Story's primary commit, which is the first one authored.
|
|
24
|
+
* Whole messages (bodies carry the breaking footer), oldest-first for the
|
|
25
|
+
* type tie-break. A failed read returns `[]`, degrading to safe defaults.
|
|
73
26
|
*
|
|
74
27
|
* @param {{
|
|
75
28
|
* storyBranch: string,
|
|
@@ -119,16 +72,8 @@ function readBranchCommits({
|
|
|
119
72
|
}
|
|
120
73
|
|
|
121
74
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* - Already-conventional `storyTitle` → preserved verbatim + `(#<id>)`.
|
|
125
|
-
* - Otherwise → `<derivedType>: <shaped storyTitle> (#<id>)`.
|
|
126
|
-
* - Empty / missing `storyTitle` → `<derivedType>: story #<id>`.
|
|
127
|
-
* - Breaking → `!` inserted before the colon in either shape.
|
|
128
|
-
*
|
|
129
|
-
* `commitMessages` is the branch read (`readBranchCommits`); passing `[]`
|
|
130
|
-
* yields the safe default type and no breaking marker. `storyBody` is the
|
|
131
|
-
* Story issue's body, scanned for a declared `BREAKING CHANGE:` footer.
|
|
75
|
+
* A conventional title is kept verbatim; prose is synthesized as
|
|
76
|
+
* `<derivedType>: <shaped title>`. Either gets `(#<id>)` and, if breaking, `!`.
|
|
132
77
|
*
|
|
133
78
|
* @param {{
|
|
134
79
|
* storyTitle: string,
|
|
@@ -151,9 +96,6 @@ function normalizePrTitle({
|
|
|
151
96
|
storyBody,
|
|
152
97
|
});
|
|
153
98
|
|
|
154
|
-
// Already conventional → preserve verbatim (the maker's own casing and
|
|
155
|
-
// scope survive), append the id reference. Only the breaking marker may be
|
|
156
|
-
// added, and only when it is not already there.
|
|
157
99
|
const subject = isConventionalSubject(trimmed)
|
|
158
100
|
? trimmed
|
|
159
101
|
: synthesizeSubject({ description: trimmed, storyId, commitMessages });
|
|
@@ -163,8 +105,6 @@ function normalizePrTitle({
|
|
|
163
105
|
}
|
|
164
106
|
|
|
165
107
|
/**
|
|
166
|
-
* Build a conventional subject for a Story whose title is plain prose.
|
|
167
|
-
*
|
|
168
108
|
* @param {{ description: string, storyId: number|string, commitMessages: string[] }} args
|
|
169
109
|
* @returns {string}
|
|
170
110
|
*/
|
|
@@ -176,16 +116,8 @@ function synthesizeSubject({ description, storyId, commitMessages }) {
|
|
|
176
116
|
}
|
|
177
117
|
|
|
178
118
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* The `Closes #<id>` footer is what auto-closes the Story on merge. A
|
|
182
|
-
* `BREAKING CHANGE:` footer goes LAST, as the spec requires, so that a repo
|
|
183
|
-
* configured to use the PR body as the squash-commit message hands
|
|
184
|
-
* release-please a parseable note rather than prose. When the squash body is
|
|
185
|
-
* built from the constituent commit messages instead (GitHub's default, and
|
|
186
|
-
* this repo's setting), the note still reaches `main` through whichever
|
|
187
|
-
* commit carried the footer — and the `!` in the subject carries the signal
|
|
188
|
-
* either way.
|
|
119
|
+
* `Closes #<id>` auto-closes the Story; a breaking footer goes LAST, per the
|
|
120
|
+
* spec, for repos that squash with the PR body.
|
|
189
121
|
*
|
|
190
122
|
* @param {{ storyId: number|string, breakingNotes?: string[] }} args
|
|
191
123
|
* @returns {string}
|
|
@@ -203,13 +135,8 @@ function buildPrBody({ storyId, breakingNotes }) {
|
|
|
203
135
|
}
|
|
204
136
|
|
|
205
137
|
/**
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* the Story body — decide whether this is a breaking change.
|
|
209
|
-
*
|
|
210
|
-
* A declared break is announced on the progress channel, because a `!` the
|
|
211
|
-
* operator did not expect in the squash subject should be visible while the
|
|
212
|
-
* close is running rather than discovered in the release notes.
|
|
138
|
+
* A declared break is announced on progress so an unexpected `!` is seen
|
|
139
|
+
* during the close, not in the release notes.
|
|
213
140
|
*
|
|
214
141
|
* @param {{ storyTitle: string, storyId: number|string, storyBody?: string,
|
|
215
142
|
* storyBranch: string, baseBranch: string, cwd?: string,
|