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,18 +1,7 @@
|
|
|
1
1
|
// .agents/scripts/lib/close-validation/projections/maintainability.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Extracted from close-validation.js (Story #1850) and refactored to use
|
|
6
|
-
* the shared `validateProjectionInputs` predicate so the guard cascade
|
|
7
|
-
* lives in exactly one place. Public contract is unchanged — the parent
|
|
8
|
-
* `close-validation.js` re-exports this function and every existing call
|
|
9
|
-
* site continues to import from there.
|
|
10
|
-
*
|
|
11
|
-
* The projection is advisory only: story-close logs it before the merge
|
|
12
|
-
* runs so the operator sees, by name, the files that would breach their
|
|
13
|
-
* per-file MI baseline post-merge and can ship a `baseline-refresh:`
|
|
14
|
-
* commit atomically with the Story PR. The hard MI gate still runs at
|
|
15
|
-
* pre-push time.
|
|
3
|
+
* Advisory pre-merge MI projection: names files that would breach their
|
|
4
|
+
* per-file baseline so a `baseline-refresh:` commit can ship with the PR.
|
|
16
5
|
*/
|
|
17
6
|
|
|
18
7
|
import { getBaseline } from '../../baselines/maintainability-baseline-io.js';
|
|
@@ -22,16 +11,11 @@ import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
|
|
|
22
11
|
import { calculateForSource } from '../../maintainability-engine.js';
|
|
23
12
|
import { MISSING_ARG_REASONS, validateProjectionInputs } from './inputs.js';
|
|
24
13
|
|
|
25
|
-
/**
|
|
26
|
-
* Default tolerance shared with check-maintainability.js: small floating-
|
|
27
|
-
* point variances must not register as a regression.
|
|
28
|
-
*/
|
|
14
|
+
/** Absorbs floating-point noise. */
|
|
29
15
|
export const DEFAULT_MI_TOLERANCE = 0.001;
|
|
30
16
|
|
|
31
17
|
/**
|
|
32
|
-
*
|
|
33
|
-
* `missing-args` skipped-reason so the public contract of
|
|
34
|
-
* `projectMaintainabilityRegressions` is preserved byte-for-byte.
|
|
18
|
+
* Collapse `missing-*` to the public `missing-args` reason.
|
|
35
19
|
*
|
|
36
20
|
* @param {string} reason
|
|
37
21
|
* @returns {string}
|
|
@@ -41,10 +25,8 @@ function normaliseSkipReason(reason) {
|
|
|
41
25
|
}
|
|
42
26
|
|
|
43
27
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* the shared `(cwd, ref, windowMs)` cache so a story-init fetch in the same
|
|
47
|
-
* wave satisfies the projection without re-hitting origin.
|
|
28
|
+
* Close may not have base-synced yet; the fetch cache makes this free when
|
|
29
|
+
* story-init already fetched.
|
|
48
30
|
*
|
|
49
31
|
* @param {string} cwd
|
|
50
32
|
* @param {string} baseBranch
|
|
@@ -65,10 +47,6 @@ function refreshEpicRef(cwd, baseBranch, git) {
|
|
|
65
47
|
}
|
|
66
48
|
|
|
67
49
|
/**
|
|
68
|
-
* Run `git diff --name-only` against the epic-branch fork point and parse
|
|
69
|
-
* the changed-files list. Normalises Windows-style backslash paths to
|
|
70
|
-
* forward slashes so the baseline lookup is platform-agnostic.
|
|
71
|
-
*
|
|
72
50
|
* @param {{ cwd: string, baseBranch: string, storyBranch: string, git: { gitSpawn: typeof defaultGitSpawn } }} opts
|
|
73
51
|
* @returns {{ ok: true, files: string[] } | { ok: false, detail: string }}
|
|
74
52
|
*/
|
|
@@ -86,10 +64,7 @@ function diffChangedFiles({ cwd, baseBranch, storyBranch, git }) {
|
|
|
86
64
|
}
|
|
87
65
|
|
|
88
66
|
/**
|
|
89
|
-
*
|
|
90
|
-
* projected MI breaches `baselineScore - tolerance`. Returns `null` when
|
|
91
|
-
* the file is non-JS, absent from baseline, deleted on the story branch,
|
|
92
|
-
* or within tolerance.
|
|
67
|
+
* `null` when deleted on the story branch or within tolerance.
|
|
93
68
|
*
|
|
94
69
|
* @param {{
|
|
95
70
|
* cwd: string,
|
|
@@ -124,8 +99,6 @@ function scoreFile({
|
|
|
124
99
|
}
|
|
125
100
|
|
|
126
101
|
/**
|
|
127
|
-
* Walk the changed-files list and collect regression records.
|
|
128
|
-
*
|
|
129
102
|
* @param {{
|
|
130
103
|
* cwd: string,
|
|
131
104
|
* storyBranch: string,
|
|
@@ -166,27 +139,9 @@ function collectRegressions({
|
|
|
166
139
|
}
|
|
167
140
|
|
|
168
141
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* Advisory only — the result is rendered as a log line by story-close
|
|
174
|
-
* before the merge runs. The hard MI gate still runs at pre-push time via
|
|
175
|
-
* the husky hook. The point of this projection is to surface the breach
|
|
176
|
-
* **before** the merge so the operator can ship a `baseline-refresh:`
|
|
177
|
-
* commit atomically with the Story PR rather than as a follow-on after the
|
|
178
|
-
* push.
|
|
179
|
-
*
|
|
180
|
-
* The "post-merge body" of each file is approximated by the file content
|
|
181
|
-
* at the tip of the Story branch — a `--no-ff` merge into the Epic branch
|
|
182
|
-
* does not modify file contents, so this is exact when the merge applies
|
|
183
|
-
* cleanly and a close-enough projection when it auto-resolves minor
|
|
184
|
-
* conflicts.
|
|
185
|
-
*
|
|
186
|
-
* The helper never throws and never has side effects beyond running `git`
|
|
187
|
-
* subcommands via the injected interface. Any failure path resolves to
|
|
188
|
-
* `{ ok: true, regressions: [], skipped: '<reason>' }` so the caller
|
|
189
|
-
* treats the advisory as best-effort.
|
|
142
|
+
* Scores each changed file's content at the Story branch tip (exact for a
|
|
143
|
+
* clean merge). Never throws; failures resolve to
|
|
144
|
+
* `{ ok: true, regressions: [], skipped }`.
|
|
190
145
|
*
|
|
191
146
|
* @param {{
|
|
192
147
|
* cwd: string,
|
|
@@ -261,9 +216,7 @@ export function projectMaintainabilityRegressions({
|
|
|
261
216
|
}
|
|
262
217
|
|
|
263
218
|
/**
|
|
264
|
-
*
|
|
265
|
-
* block. Returns `null` when there are no regressions to surface so
|
|
266
|
-
* callers can `if` past the log call without a string-empty check.
|
|
219
|
+
* `null` when there is nothing to surface.
|
|
267
220
|
*
|
|
268
221
|
* @param {ReturnType<typeof projectMaintainabilityRegressions>} result
|
|
269
222
|
* @returns {string | null}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* close
|
|
3
|
-
*
|
|
4
|
-
* Runs typecheck, lint, test, format check, and maintainability/coverage/
|
|
5
|
-
* CRAP regression checks before the story merge so drift is caught in the
|
|
6
|
-
* worktree rather than at pre-push time on the Epic branch. All gates
|
|
7
|
-
* inherit stdio so the operator sees the raw output; the returned summary
|
|
8
|
-
* surfaces actionable hints on failure.
|
|
2
|
+
* Runs the close gates (typecheck, lint, test, format, baselines) in the
|
|
3
|
+
* Story worktree before merge; the summary carries failure hints.
|
|
9
4
|
*/
|
|
10
5
|
|
|
6
|
+
import { getQuality } from '../config/quality.js';
|
|
7
|
+
import { FULL_SUITE_LOCK_EXPIRY_ENV } from '../full-suite-lock.js';
|
|
11
8
|
import { gitSpawn } from '../git-utils.js';
|
|
12
9
|
import {
|
|
13
10
|
recordPass as defaultRecordPass,
|
|
@@ -27,10 +24,7 @@ import { defaultGetHeadSha } from './projections/head-sha.js';
|
|
|
27
24
|
/** @typedef {import('./gates.js').Gate} Gate */
|
|
28
25
|
|
|
29
26
|
function applyChangedFileScope({ gate, spawnCwd, log }) {
|
|
30
|
-
//
|
|
31
|
-
// gate whose incremental skip is known to fire). Honoured before anything
|
|
32
|
-
// else so the gate is recorded as `skipped` with its real reason rather
|
|
33
|
-
// than spawned to discover the same thing minutes later.
|
|
27
|
+
// A skip decided when the gate list was built wins over everything.
|
|
34
28
|
if (gate.skip) {
|
|
35
29
|
log(`[close-validation] ⏭ ${gate.name} skipped (${gate.skip.reason})`);
|
|
36
30
|
return {
|
|
@@ -48,11 +42,7 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
|
|
|
48
42
|
cwd: spawnCwd,
|
|
49
43
|
baseRef: gate.changedFileScope.baseRef,
|
|
50
44
|
});
|
|
51
|
-
//
|
|
52
|
-
// non-empty diff that contains zero formatter-eligible files (e.g. a
|
|
53
|
-
// docs-only Story) must take the skip path, not invoke biome with only
|
|
54
|
-
// ineligible paths — biome reports "No files were processed" and exits 1
|
|
55
|
-
// in that case (Story #3410).
|
|
45
|
+
// Biome exits 1 ("No files were processed") on only-ineligible paths.
|
|
56
46
|
const eligibleFiles = changedFiles.filter(isFormatterEligible);
|
|
57
47
|
if (eligibleFiles.length === 0) {
|
|
58
48
|
log(
|
|
@@ -67,12 +57,8 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
|
|
|
67
57
|
log(
|
|
68
58
|
`[close-validation] ↳ ${gate.name} scoped to ${eligibleFiles.length} formatter-eligible changed file(s) from ${gate.changedFileScope.baseRef}...HEAD`,
|
|
69
59
|
);
|
|
70
|
-
// The extension filter cannot see biome's
|
|
71
|
-
//
|
|
72
|
-
// eligible-by-extension path is also config-ignored, the scoped biome
|
|
73
|
-
// invocation exits 1 with "No files were processed" — a false negative for
|
|
74
|
-
// the gate (Story #4292). Flag the scoped run so the runner downgrades that
|
|
75
|
-
// specific exit to a clean skip instead of a formatting failure.
|
|
60
|
+
// The extension filter cannot see biome's config ignores; if every path is
|
|
61
|
+
// config-ignored biome exits 1 "No files were processed" — downgrade that.
|
|
76
62
|
return {
|
|
77
63
|
gate,
|
|
78
64
|
cmd: gate.cmd,
|
|
@@ -83,38 +69,12 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
|
|
|
83
69
|
}
|
|
84
70
|
|
|
85
71
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* `cwd` (the main checkout) because the temp tree lives under the main
|
|
93
|
-
* `.git/`. Failure messages name the worktree path.
|
|
94
|
-
*
|
|
95
|
-
* Evidence-aware: when `storyId` is provided alongside `standalone: true`,
|
|
96
|
-
* and `useEvidence !== false`, each gate consults
|
|
97
|
-
* `validation-evidence.shouldSkip()` against current HEAD + the gate's
|
|
98
|
-
* command-config hash. A matching record skips the gate; a successful run
|
|
99
|
-
* is recorded so the next caller in the local hot path can skip in turn.
|
|
100
|
-
*
|
|
101
|
-
* Standalone keyspace (Story #4250): `standalone: true` routes the evidence
|
|
102
|
-
* file to the storyId-anchored
|
|
103
|
-
* `<tempRoot>/standalone/stories/story-<id>/validation-evidence.json`
|
|
104
|
-
* keyspace. v2.0.0 removed the Epic tier and its Epic-keyed keyspace.
|
|
105
|
-
*
|
|
106
|
-
* `onGateStart` is invoked immediately before each gate's runner spawn, so a
|
|
107
|
-
* caller can record per-gate wall-clock telemetry. Errors thrown from the
|
|
108
|
-
* hook propagate.
|
|
109
|
-
*
|
|
110
|
-
* Projection advisories (Story #4776): when `baseBranch` and `storyBranch`
|
|
111
|
-
* are both supplied and every gate passed, the maintainability and CRAP
|
|
112
|
-
* pre-merge projections run through `projections/advisories.js` and log
|
|
113
|
-
* their advisories to the same `log` sink the gates use. They are advisory
|
|
114
|
-
* by construction — the returned `ok` is decided entirely by the gates, so
|
|
115
|
-
* a projected breach never fails a close. They are skipped after a gate
|
|
116
|
-
* failure, where the operator needs the failing gate's evidence, not a
|
|
117
|
-
* baseline-refresh nudge.
|
|
72
|
+
* Independent gates run in parallel (first failure aborts the rest), then
|
|
73
|
+
* serial gates in order, stopping at the first failure. Gates spawn in
|
|
74
|
+
* `worktreePath`; evidence is keyed to `cwd` (main checkout). With
|
|
75
|
+
* `storyId` + `standalone`, a matching evidence record skips a gate and a
|
|
76
|
+
* pass is recorded. Projection advisories run only after every gate passes
|
|
77
|
+
* and never affect `ok`. `onGateStart` errors propagate.
|
|
118
78
|
*
|
|
119
79
|
* @param {{
|
|
120
80
|
* cwd: string,
|
|
@@ -135,7 +95,9 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
|
|
|
135
95
|
* getTreeFingerprint?: (cwd: string) => string|null,
|
|
136
96
|
* recordPass?: typeof defaultRecordPass,
|
|
137
97
|
* shouldSkip?: typeof defaultShouldSkip,
|
|
138
|
-
*
|
|
98
|
+
* deferOnLockExpiry?: boolean,
|
|
99
|
+
* }} opts `deferOnLockExpiry`: an expired full-suite lock wait spawns
|
|
100
|
+
* nothing (here or in any gate child) and reports `LOCK_WAIT_EXPIRED_EXIT_CODE`.
|
|
139
101
|
* @returns {{ ok: boolean, failed: Array<{ gate: Gate, status: number, cwd: string }>, skipped: Array<{ gate: Gate, reason: string }> }}
|
|
140
102
|
*/
|
|
141
103
|
export async function runCloseValidation({
|
|
@@ -158,32 +120,20 @@ export async function runCloseValidation({
|
|
|
158
120
|
defaultTreeFingerprint(resolvedCwd, gitSpawn),
|
|
159
121
|
recordPass = defaultRecordPass,
|
|
160
122
|
shouldSkip = defaultShouldSkip,
|
|
123
|
+
deferOnLockExpiry = false,
|
|
161
124
|
} = {}) {
|
|
162
125
|
const failed = [];
|
|
126
|
+
const lockOpts = fullSuiteLockOptions({ config, deferOnLockExpiry });
|
|
163
127
|
const skipped = [];
|
|
164
|
-
// Evidence is active when a Story id is present AND there is a keyspace to
|
|
165
|
-
// anchor on (`standalone: true` — Story #4250's storyId-anchored
|
|
166
|
-
// keyspace, now the only one).
|
|
167
128
|
const evidenceActive = useEvidence && storyId != null && standalone;
|
|
168
129
|
const evidenceStoreOpts = { cwd, standalone };
|
|
169
|
-
// Evidence keys against the main checkout's HEAD because the evidence
|
|
170
|
-
// file lives under the main `.git/`. Gate spawn, in contrast,
|
|
171
|
-
// runs in the worktree when one is supplied — that's the whole point of
|
|
172
|
-
// Story #1120.
|
|
173
130
|
const spawnCwd = worktreePath ?? cwd;
|
|
174
131
|
const headSha = evidenceActive ? getHeadSha(spawnCwd) : null;
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
// identical inputs for all of them; a per-gate scope would be narrower but
|
|
178
|
-
// would have to model each gate's read set, and being wrong about that
|
|
179
|
-
// grants a skip the gate did not earn. A gate that carries its own
|
|
132
|
+
// One whole-tree fingerprint for every gate: a per-gate read set that is
|
|
133
|
+
// modelled wrong would grant a skip the gate did not earn. A gate's own
|
|
180
134
|
// `inputFingerprint` still wins.
|
|
181
135
|
const treeSha = evidenceActive ? getTreeFingerprint(spawnCwd) : null;
|
|
182
136
|
|
|
183
|
-
// Helper closures so the parallel and serial passes share evidence
|
|
184
|
-
// bookkeeping bit-for-bit.
|
|
185
|
-
|
|
186
|
-
/** Returns a `{ skip: true }` verdict when evidence makes the gate redundant. */
|
|
187
137
|
const evidenceVerdict = (gate, configHash) => {
|
|
188
138
|
if (!(evidenceActive && headSha)) return { skip: false };
|
|
189
139
|
const verdict = shouldSkip(
|
|
@@ -230,13 +180,7 @@ export async function runCloseValidation({
|
|
|
230
180
|
};
|
|
231
181
|
|
|
232
182
|
/**
|
|
233
|
-
*
|
|
234
|
-
* **in process** (Story #1973 / Task #1984 — per-kind baseline gates
|
|
235
|
-
* removed their `child_process.spawn(node check-<kind>.js)` arm and
|
|
236
|
-
* call `compare(head, base)` directly). The `run` callable receives
|
|
237
|
-
* the same `(cmd, args, opts)` argv shape as `runner` so it slots into
|
|
238
|
-
* the existing contract without churn at the runner boundary.
|
|
239
|
-
* Otherwise the supplied `runner` is used (default: spawn).
|
|
183
|
+
* A `gate.run` function executes in process with the `runner` signature.
|
|
240
184
|
*
|
|
241
185
|
* @returns {Promise<{ status: number }>}
|
|
242
186
|
*/
|
|
@@ -251,13 +195,9 @@ export async function runCloseValidation({
|
|
|
251
195
|
gateName: gate.name,
|
|
252
196
|
log,
|
|
253
197
|
signal,
|
|
254
|
-
...(gate
|
|
255
|
-
//
|
|
256
|
-
//
|
|
257
|
-
// answer: whoever we queued behind may have deposited this gate's
|
|
258
|
-
// evidence while we sat there. Re-asking the same question the runner
|
|
259
|
-
// asked before the wait is the whole mechanism; a `{ status: 0 }`
|
|
260
|
-
// stands in for the spawn.
|
|
198
|
+
...lockOpts.forGate(gate),
|
|
199
|
+
// Whoever held the full-suite lock may have deposited this gate's
|
|
200
|
+
// evidence meanwhile; re-check after the wait instead of spawning.
|
|
261
201
|
...(gate.fullSuiteLock && configHash
|
|
262
202
|
? {
|
|
263
203
|
skipIfSatisfied: () =>
|
|
@@ -266,10 +206,7 @@ export async function runCloseValidation({
|
|
|
266
206
|
: undefined,
|
|
267
207
|
}
|
|
268
208
|
: {}),
|
|
269
|
-
//
|
|
270
|
-
// like the two below): `defaultGateRunner` already treats a falsy value
|
|
271
|
-
// as "no lock", so a branch here would only add a decision point to the
|
|
272
|
-
// hottest function in this file.
|
|
209
|
+
// Unconditional: the runner treats falsy as "no lock".
|
|
273
210
|
fullSuiteLock: gate.fullSuiteLock,
|
|
274
211
|
...(gate.tolerateNoFilesProcessed
|
|
275
212
|
? { tolerateNoFilesProcessed: true }
|
|
@@ -280,11 +217,8 @@ export async function runCloseValidation({
|
|
|
280
217
|
|
|
281
218
|
const { independent, serial } = partitionGates(gates);
|
|
282
219
|
|
|
283
|
-
//
|
|
284
|
-
//
|
|
285
|
-
// sibling via SIGTERM. Other gates' results are still awaited (so we
|
|
286
|
-
// never leak children) but their non-zero status is intentionally
|
|
287
|
-
// dropped: only one error surfaces.
|
|
220
|
+
// Phase 1. The first failure aborts siblings; they are still awaited (no
|
|
221
|
+
// leaked children) but only one error surfaces.
|
|
288
222
|
const ac = new AbortController();
|
|
289
223
|
let firstIndepFailure = null;
|
|
290
224
|
|
|
@@ -363,7 +297,6 @@ export async function runCloseValidation({
|
|
|
363
297
|
return { ok: false, failed, skipped };
|
|
364
298
|
}
|
|
365
299
|
|
|
366
|
-
// ── Phase 2: serial gates in declared order ─────────────────────────
|
|
367
300
|
await runSerialGates(serial, {
|
|
368
301
|
spawnCwd,
|
|
369
302
|
log,
|
|
@@ -376,10 +309,6 @@ export async function runCloseValidation({
|
|
|
376
309
|
dispatchGate,
|
|
377
310
|
});
|
|
378
311
|
|
|
379
|
-
// ── Phase 3: advisory projections ───────────────────────────────────
|
|
380
|
-
// Story #4776 — the projection layer's live call site. Deliberately
|
|
381
|
-
// outside the `ok` computation: a projected breach informs, it never
|
|
382
|
-
// fails a close.
|
|
383
312
|
if (failed.length === 0) {
|
|
384
313
|
await runAdvisoryProjections({
|
|
385
314
|
runProjections,
|
|
@@ -395,13 +324,31 @@ export async function runCloseValidation({
|
|
|
395
324
|
}
|
|
396
325
|
|
|
397
326
|
/**
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* call the same injected `evidenceVerdict` / `recordIfActive` closures.
|
|
327
|
+
* The `fullSuiteLock` gate shares coverage capture's timeout so a hung suite
|
|
328
|
+
* fails instead of holding the host lock. Under `deferOnLockExpiry` every
|
|
329
|
+
* gate child inherits the defer opt-in via env.
|
|
402
330
|
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
331
|
+
* @param {{ config: object|null, deferOnLockExpiry: boolean }} args
|
|
332
|
+
* @returns {{ forGate: (gate: object) => object }}
|
|
333
|
+
*/
|
|
334
|
+
function fullSuiteLockOptions({ config, deferOnLockExpiry }) {
|
|
335
|
+
const timeoutMs = getQuality(config).coverage?.timeoutMs;
|
|
336
|
+
const deferEnv = deferOnLockExpiry
|
|
337
|
+
? { [FULL_SUITE_LOCK_EXPIRY_ENV]: 'defer' }
|
|
338
|
+
: null;
|
|
339
|
+
return {
|
|
340
|
+
forGate(gate) {
|
|
341
|
+
const env = deferEnv ? { ...gate.env, ...deferEnv } : gate.env;
|
|
342
|
+
return {
|
|
343
|
+
...(env ? { env } : {}),
|
|
344
|
+
...(gate.fullSuiteLock ? { timeoutMs, deferOnLockExpiry } : {}),
|
|
345
|
+
};
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Mutates the caller's `failed` / `skipped` accumulators.
|
|
405
352
|
*
|
|
406
353
|
* @param {Array<object>} serial
|
|
407
354
|
* @param {object} deps
|
|
@@ -484,11 +431,7 @@ async function runSerialGates(
|
|
|
484
431
|
}
|
|
485
432
|
|
|
486
433
|
/**
|
|
487
|
-
*
|
|
488
|
-
*
|
|
489
|
-
* No-ops without a branch pair to diff (resume / legacy callers), and can
|
|
490
|
-
* never influence the close verdict: the caller has already decided `ok`
|
|
491
|
-
* before this runs, and a throw here is logged, not propagated.
|
|
434
|
+
* No-op without a branch pair; a throw is logged, never propagated.
|
|
492
435
|
*
|
|
493
436
|
* @param {{
|
|
494
437
|
* runProjections: typeof defaultRunProjections,
|
|
@@ -1,24 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Pure helper for projecting workflow `.md` files into slash commands:
|
|
4
|
-
* injects the AUTO-GENERATED provenance header without disturbing YAML
|
|
5
|
-
* frontmatter placement.
|
|
6
|
-
*
|
|
7
|
-
* Kept as its own module (rather than inline in `sync-claude-commands.js`,
|
|
8
|
-
* which runs its sync at import time via top-level await) so it can be unit
|
|
9
|
-
* tested directly.
|
|
10
|
-
*/
|
|
1
|
+
/** Helpers for projecting workflow `.md` files into slash commands. */
|
|
11
2
|
|
|
12
3
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* so the frontmatter stays on line 1; sources without frontmatter keep the
|
|
16
|
-
* header prepended verbatim.
|
|
17
|
-
*
|
|
18
|
-
* Claude Code only parses a command's frontmatter (its `description`) when the
|
|
19
|
-
* `---` block is the very first thing in the file. Prepending the HTML comment
|
|
20
|
-
* above it made `claude plugin validate` report "No frontmatter block found"
|
|
21
|
-
* for every command and silently dropped all descriptions.
|
|
4
|
+
* Insert `header` after any YAML frontmatter: Claude Code only parses
|
|
5
|
+
* frontmatter that starts on line 1.
|
|
22
6
|
*
|
|
23
7
|
* @param {string} content - Raw workflow `.md` content.
|
|
24
8
|
* @param {string} header - Provenance header to inject (typically ends `\n\n`).
|
|
@@ -33,15 +17,9 @@ export function applyHeader(content, header) {
|
|
|
33
17
|
}
|
|
34
18
|
|
|
35
19
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* the payload as `/mandrel-deliver` audit-suite prompts but must NOT surface as
|
|
40
|
-
* standalone slash commands because the host ships a native equivalent.
|
|
41
|
-
*
|
|
42
|
-
* Both `sync-claude-commands.js` (projection + orphan-reap) and the
|
|
43
|
-
* `commands-in-sync` doctor check (parity expectation) consult this flag so
|
|
44
|
-
* an excluded workflow never reads as "not synced".
|
|
20
|
+
* `command: false` in frontmatter opts a workflow out of slash-command
|
|
21
|
+
* projection (e.g. a lens the host ships natively). The sync and the doctor
|
|
22
|
+
* parity check both honour it.
|
|
45
23
|
*
|
|
46
24
|
* @param {string} content - Raw workflow `.md` content.
|
|
47
25
|
* @returns {boolean}
|
|
@@ -1,39 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Resolves `.agentrc.json → delivery.acceptanceEval` into the canonical
|
|
5
|
-
* shape the per-Story acceptance self-eval loop consumes. The loop scores
|
|
6
|
-
* the caller-injected change set against each inline `acceptance[]` item,
|
|
7
|
-
* redrafts the unmet items, and re-evaluates — capped at `maxRounds`
|
|
8
|
-
* redraft rounds, then escalates to `agent::blocked` when criteria remain
|
|
9
|
-
* unmet.
|
|
10
|
-
*
|
|
11
|
-
* Story #5313 dropped the hard ceiling (`ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING`)
|
|
12
|
-
* and the floor-of-one clamp: `maxRounds` is any non-negative integer, and
|
|
13
|
-
* `0` means the verdict is scored **once** with no redraft round. The
|
|
14
|
-
* scoring pass itself is always on — there is intentionally no `enabled`
|
|
15
|
-
* flag (hard cutover per `rules/git-conventions.md`); only the redraft
|
|
16
|
-
* budget is tunable.
|
|
2
|
+
* `delivery.acceptanceEval`: redraft rounds before `agent::blocked`. `0`
|
|
3
|
+
* scores once with no redraft; the scoring pass itself cannot be disabled.
|
|
17
4
|
*/
|
|
18
5
|
|
|
19
6
|
/**
|
|
20
|
-
*
|
|
21
|
-
* `delivery.
|
|
22
|
-
* mutate the resolver's defaults across processes.
|
|
23
|
-
*
|
|
24
|
-
* Keep in lockstep with the schema mirror in
|
|
25
|
-
* `agentrc.schema.json → $defs.acceptanceEval` and the AJV schema in
|
|
26
|
-
* `config-settings-schema-delivery.js → ACCEPTANCE_EVAL_SCHEMA`.
|
|
7
|
+
* Keep in lockstep with `agentrc.schema.json` and
|
|
8
|
+
* `config-settings-schema-delivery.js#ACCEPTANCE_EVAL_SCHEMA`.
|
|
27
9
|
*/
|
|
28
10
|
export const ACCEPTANCE_EVAL_DEFAULTS = Object.freeze({
|
|
29
11
|
maxRounds: 2,
|
|
30
12
|
});
|
|
31
13
|
|
|
32
14
|
/**
|
|
33
|
-
* Normalize a candidate round count: a non-negative integer is taken as-is
|
|
34
|
-
* (including `0`); anything else — negative, non-integer, non-finite,
|
|
35
|
-
* missing — falls back to the documented default.
|
|
36
|
-
*
|
|
37
15
|
* @param {unknown} value
|
|
38
16
|
* @param {number} fallback
|
|
39
17
|
* @returns {number}
|
|
@@ -45,10 +23,6 @@ function normalizeRounds(value, fallback) {
|
|
|
45
23
|
}
|
|
46
24
|
|
|
47
25
|
/**
|
|
48
|
-
* Read the merged acceptance-eval block. Returns the canonical shape:
|
|
49
|
-
*
|
|
50
|
-
* { maxRounds: number } // non-negative integer; 0 = scored once
|
|
51
|
-
*
|
|
52
26
|
* @param {object | null | undefined} config
|
|
53
27
|
* @returns {{ maxRounds: number }}
|
|
54
28
|
*/
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `
|
|
3
|
-
*
|
|
4
|
-
* `delivery.quality.gates.<tier>.baselinePath`. This module preserves the
|
|
5
|
-
* historical `{ lint, crap, maintainability }` envelope so existing call
|
|
6
|
-
* sites that read `getBaselines(config).lint.path` keep working.
|
|
7
|
-
* `refreshCommand` is no longer carried per-baseline — it stays in the
|
|
8
|
-
* envelope as `null` for shape stability.
|
|
2
|
+
* Flat `{ crap, maintainability }` view over each gate's `baselinePath`;
|
|
3
|
+
* `refreshCommand` is always `null`, kept for shape stability.
|
|
9
4
|
*/
|
|
10
5
|
|
|
11
6
|
export const BASELINES_DEFAULTS = Object.freeze({
|
|
12
|
-
lint: Object.freeze({ path: 'baselines/lint.json', refreshCommand: null }),
|
|
13
7
|
crap: Object.freeze({ path: 'baselines/crap.json', refreshCommand: null }),
|
|
14
8
|
maintainability: Object.freeze({
|
|
15
9
|
path: 'baselines/maintainability.json',
|
|
@@ -18,12 +12,8 @@ export const BASELINES_DEFAULTS = Object.freeze({
|
|
|
18
12
|
});
|
|
19
13
|
|
|
20
14
|
/**
|
|
21
|
-
* Read the per-gate baseline paths and surface them under the historical
|
|
22
|
-
* flat envelope. Accepts the full resolved config — the canonical
|
|
23
|
-
* `delivery.quality.gates` path is the single supported shape.
|
|
24
|
-
*
|
|
25
15
|
* @param {object | null | undefined} config
|
|
26
|
-
* @returns {{
|
|
16
|
+
* @returns {{ crap: { path: string, refreshCommand: null }, maintainability: { path: string, refreshCommand: null } }}
|
|
27
17
|
*/
|
|
28
18
|
export function getBaselines(config) {
|
|
29
19
|
const gates = config?.delivery?.quality?.gates ?? {};
|
|
@@ -33,7 +23,6 @@ export function getBaselines(config) {
|
|
|
33
23
|
return { path, refreshCommand: null };
|
|
34
24
|
};
|
|
35
25
|
return {
|
|
36
|
-
lint: merge('lint'),
|
|
37
26
|
crap: merge('crap'),
|
|
38
27
|
maintainability: merge('maintainability'),
|
|
39
28
|
};
|
|
@@ -1,27 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `delivery.ci`
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* (
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Story #5096 added `blockOnAdvisoryFailure` (default `true`) and
|
|
9
|
-
* `advisoryAllowlist` (default `[]`). GitHub native auto-merge waits on
|
|
10
|
-
* REQUIRED contexts only, so a red ADVISORY gate would otherwise be merged
|
|
11
|
-
* straight past; these knobs own mandrel's side of that decision. Set
|
|
12
|
-
* `blockOnAdvisoryFailure: false` to restore the pre-#5096 behaviour verbatim,
|
|
13
|
-
* or list a job name in `advisoryAllowlist` to exempt just that one.
|
|
14
|
-
*
|
|
15
|
-
* Story #5266 added `rerunAdvisory`, **default `0`**. It is the number of
|
|
16
|
-
* times close may re-run a failed advisory workflow run before blocking on it.
|
|
17
|
-
* Zero is the deliberate default and not a placeholder: a rerun spends the
|
|
18
|
-
* consumer's CI minutes and mutates GitHub state, and close must never do
|
|
19
|
-
* either unasked. Raise it (or pass `--rerun-advisory <n>`) on a repository
|
|
20
|
-
* whose advisory scans time out transiently.
|
|
21
|
-
*
|
|
22
|
-
* Retired (no production readers on v2 Story-only delivery): `earlyPr`
|
|
23
|
-
* (Epic early-PR warmup) and `requireChecks` (AutomergePredicate escape hatch
|
|
24
|
-
* whose listener was never landed).
|
|
2
|
+
* `delivery.ci`. `autoMerge: 'strict'` also requires a clean review gate.
|
|
3
|
+
* Native auto-merge waits on required checks only, so
|
|
4
|
+
* `blockOnAdvisoryFailure` stops a red advisory gate being merged past
|
|
5
|
+
* (`advisoryAllowlist` exempts named jobs). `rerunAdvisory` defaults to 0
|
|
6
|
+
* deliberately: a rerun spends CI minutes and mutates GitHub state.
|
|
25
7
|
*/
|
|
26
8
|
|
|
27
9
|
export const CI_DELIVERY_DEFAULTS = Object.freeze({
|
|
@@ -31,29 +13,19 @@ export const CI_DELIVERY_DEFAULTS = Object.freeze({
|
|
|
31
13
|
rerunAdvisory: 0,
|
|
32
14
|
});
|
|
33
15
|
|
|
34
|
-
/**
|
|
35
|
-
* Per-knob validators for the scalar `delivery.ci` settings. A value that
|
|
36
|
-
* fails its own test is not an instruction to guess — it degrades to the
|
|
37
|
-
* framework default beside it in {@link CI_DELIVERY_DEFAULTS}, which is why
|
|
38
|
-
* the two objects are keyed alike and read as a pair.
|
|
39
|
-
*/
|
|
16
|
+
/** An invalid value degrades to the same-keyed default. */
|
|
40
17
|
const CI_KNOB_VALIDATORS = Object.freeze({
|
|
41
18
|
autoMerge: (value) => value === 'trust-ci' || value === 'strict',
|
|
42
19
|
blockOnAdvisoryFailure: (value) => typeof value === 'boolean',
|
|
43
|
-
// Story #5266 — a negative or non-integer allowance spends nothing.
|
|
44
20
|
rerunAdvisory: (value) => Number.isInteger(value) && value >= 0,
|
|
45
21
|
});
|
|
46
22
|
|
|
47
23
|
/**
|
|
48
|
-
*
|
|
49
|
-
* field the operator omitted. Accepts the full resolved config, the bare
|
|
50
|
-
* delivery bag, or the bare ci bag. The `watch` sub-block is passed through
|
|
51
|
-
* as-is (undefined when unset) so consumers apply their own poll-loop
|
|
52
|
-
* defaults; only the scalar knobs carry framework defaults here.
|
|
24
|
+
* Accepts the full config, the `delivery` bag, or the `ci` bag.
|
|
53
25
|
*
|
|
54
26
|
* @param {object | null | undefined} config
|
|
55
27
|
* @returns {{ autoMerge: 'trust-ci' | 'strict', blockOnAdvisoryFailure: boolean,
|
|
56
|
-
* advisoryAllowlist: string[], rerunAdvisory: number
|
|
28
|
+
* advisoryAllowlist: string[], rerunAdvisory: number }}
|
|
57
29
|
*/
|
|
58
30
|
export function getCiDelivery(config) {
|
|
59
31
|
const ci = config?.delivery?.ci ?? config?.ci ?? config ?? {};
|
|
@@ -68,7 +40,5 @@ export function getCiDelivery(config) {
|
|
|
68
40
|
(entry) => typeof entry === 'string' && entry,
|
|
69
41
|
)
|
|
70
42
|
: [...CI_DELIVERY_DEFAULTS.advisoryAllowlist],
|
|
71
|
-
watch:
|
|
72
|
-
ci.watch && typeof ci.watch === 'object' ? { ...ci.watch } : undefined,
|
|
73
43
|
};
|
|
74
44
|
}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `project.commands` accessor (Epic #1720 Story #1739 — top-level reshape).
|
|
3
|
-
*
|
|
4
|
-
* The command keys are `test`, `typecheck`, `lint`, `formatCheck`,
|
|
5
|
-
* `formatWrite`.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
1
|
export const COMMANDS_DEFAULTS = Object.freeze({
|
|
9
2
|
test: 'npm test',
|
|
10
3
|
typecheck: null,
|
|
@@ -14,19 +7,12 @@ export const COMMANDS_DEFAULTS = Object.freeze({
|
|
|
14
7
|
});
|
|
15
8
|
|
|
16
9
|
/**
|
|
17
|
-
* Read the grouped `project.commands` block, applying framework defaults
|
|
18
|
-
* for any field the operator omitted. Accepts the full resolved config or
|
|
19
|
-
* a bare `{ project }` bag.
|
|
20
|
-
*
|
|
21
10
|
* @param {object | null | undefined} config
|
|
22
11
|
* @returns {{ test: string, typecheck: string|null, lint: string|null, formatCheck: string, formatWrite: string }}
|
|
23
12
|
*/
|
|
24
13
|
export function getCommands(config) {
|
|
25
14
|
const commands = config?.project?.commands ?? {};
|
|
26
|
-
// `??` is
|
|
27
|
-
// `lint`) default to `null` themselves, so coalescing an explicit `null`
|
|
28
|
-
// onto the default returns that same `null` — the per-key `=== undefined`
|
|
29
|
-
// ladder this replaces drew a distinction that had no observable effect.
|
|
15
|
+
// `??` is safe for the nullable keys: their default is `null` too.
|
|
30
16
|
return Object.fromEntries(
|
|
31
17
|
Object.keys(COMMANDS_DEFAULTS).map((key) => [
|
|
32
18
|
key,
|