mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One beat of a multi-Story `/mandrel-deliver` run: tick from live state with
|
|
5
|
+
* the run ledger as the dispatched list, write a dispatch prompt per ready
|
|
6
|
+
* Story, and render each hand-off's close command. Scheduling is entirely the
|
|
7
|
+
* tick's, and so is the exit-code contract — the loop's stopping rules must
|
|
8
|
+
* not get a second dialect.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { parseArgs } from 'node:util';
|
|
15
|
+
import { buildDispatchChecklist } from './lib/audit-suite/index.js';
|
|
16
|
+
import { runAsCli } from './lib/cli-utils.js';
|
|
17
|
+
import { getPaths, resolveConfig } from './lib/config-resolver.js';
|
|
18
|
+
import { Logger } from './lib/Logger.js';
|
|
19
|
+
import { ensureDocsDigest } from './lib/orchestration/docs-digest.js';
|
|
20
|
+
import { parse as parseStoryBody } from './lib/story-body/story-body.js';
|
|
21
|
+
import { expandIdList } from './lib/util/parse-id-list.js';
|
|
22
|
+
import { runProbedStoriesWaveTick } from './stories-wave-tick.js';
|
|
23
|
+
|
|
24
|
+
const INPUT_ERROR_EXIT_CODE = 1;
|
|
25
|
+
|
|
26
|
+
const USAGE = {
|
|
27
|
+
invocation:
|
|
28
|
+
'node .agents/scripts/deliver-run.js --stories <ids> [--handoff <id>]... [--concurrency <n>] [--run-id <id>] [--cwd <path>]',
|
|
29
|
+
summary:
|
|
30
|
+
'Run one beat of a multi-Story delivery: tick from live state, write a dispatch prompt per ready Story, and render the close command for each hand-off. Prints one JSON envelope.',
|
|
31
|
+
flags: [
|
|
32
|
+
[
|
|
33
|
+
'--stories <ids>',
|
|
34
|
+
'Story ids in the run. Singles, commas and inclusive A-B ranges (5340,5342-5345).',
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
'--handoff <id>',
|
|
38
|
+
'A Story whose worker has pushed its branch. Repeatable. Each one gets a close[] entry carrying the exact single-story-close.js command.',
|
|
39
|
+
],
|
|
40
|
+
[
|
|
41
|
+
'--concurrency <n>',
|
|
42
|
+
'Per-beat concurrency override, forwarded to the tick. Omit it so delivery.deliverRunner.concurrencyCap (and any .agentrc.local.json override) wins.',
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
'--run-id <id>',
|
|
46
|
+
'Pin the run directory under <tempRoot>. Default: a stable digest of the Story id set, so every beat of the same run finds the same ledger.',
|
|
47
|
+
],
|
|
48
|
+
['--cwd <path>', 'Main checkout. Default: the current directory.'],
|
|
49
|
+
],
|
|
50
|
+
notes: [
|
|
51
|
+
'The run ledger (<tempRoot>/run-<id>/ledger.json) records every id handed out\nas ready, so a repeat beat withholds it with no --dispatched bookkeeping from\nthe caller. It is additive: the tick still filters it against live state, so a\nledgered id that has since gone agent::done is dropped for you.',
|
|
52
|
+
'A ledgered id that live state still reports as agent::ready is named in\nstalledDispatch[], with stalledDispatchReason carrying the recovery. It is a\nreport, never a release: a slow init and a dead spawn read alike here, so the\noperator edits the ledger and re-beats with --run-id.',
|
|
53
|
+
'--merge-watch-mode async is added to every close command when the run holds\nmore than one Story, and omitted for a run of one. Close sees a single Story\nand cannot make that call for itself.',
|
|
54
|
+
'Exit codes:\n 0 beat emitted\n 1 input error\n 2 dependency cycle (cycleError)\n 3 wedged\n 4 blocked — the HITL pause; stop the loop, do not poll',
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Stable across beats of one run, distinct across concurrent runs — only the
|
|
60
|
+
* sorted id set satisfies both.
|
|
61
|
+
* @param {number[]} ids
|
|
62
|
+
* @returns {string}
|
|
63
|
+
*/
|
|
64
|
+
export function deriveRunId(ids) {
|
|
65
|
+
const key = [...new Set(ids)].sort((a, b) => a - b).join(',');
|
|
66
|
+
return createHash('sha1').update(key).digest('hex').slice(0, 8);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* An unreadable ledger is empty, not fatal: refusing the beat would strand a
|
|
71
|
+
* live run on a bookkeeping artifact.
|
|
72
|
+
* @param {string} ledgerPath
|
|
73
|
+
* @param {{ readFileFn?: (p: string, enc: string) => string }} [deps]
|
|
74
|
+
* @returns {number[]}
|
|
75
|
+
*/
|
|
76
|
+
export function readLedgerDispatched(
|
|
77
|
+
ledgerPath,
|
|
78
|
+
{ readFileFn = fs.readFileSync } = {},
|
|
79
|
+
) {
|
|
80
|
+
let raw;
|
|
81
|
+
try {
|
|
82
|
+
raw = readFileFn(ledgerPath, 'utf8');
|
|
83
|
+
} catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(raw);
|
|
88
|
+
const ids = Array.isArray(parsed?.dispatched) ? parsed.dispatched : [];
|
|
89
|
+
return ids.filter((id) => Number.isInteger(id) && id > 0);
|
|
90
|
+
} catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Append-only: nothing removes an id, so none can be forgotten.
|
|
97
|
+
* @param {object} args
|
|
98
|
+
* @param {string} args.ledgerPath
|
|
99
|
+
* @param {string} args.runId
|
|
100
|
+
* @param {number[]} args.stories
|
|
101
|
+
* @param {number[]} args.dispatched
|
|
102
|
+
* @param {number[]} args.ready
|
|
103
|
+
* @param {{ writeFileFn?: (p: string, c: string, enc: string) => void }} [deps]
|
|
104
|
+
* @returns {number[]}
|
|
105
|
+
*/
|
|
106
|
+
function writeLedger(
|
|
107
|
+
{ ledgerPath, runId, stories, dispatched, ready },
|
|
108
|
+
{ writeFileFn = fs.writeFileSync } = {},
|
|
109
|
+
) {
|
|
110
|
+
const merged = [...new Set([...dispatched, ...ready])].sort((a, b) => a - b);
|
|
111
|
+
const payload = {
|
|
112
|
+
kind: 'deliver-run-ledger',
|
|
113
|
+
runId,
|
|
114
|
+
stories,
|
|
115
|
+
dispatched: merged,
|
|
116
|
+
updatedAt: new Date().toISOString(),
|
|
117
|
+
};
|
|
118
|
+
writeFileFn(ledgerPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
119
|
+
return merged;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* `--merge-watch-mode async` is a run-topology call close cannot make: with
|
|
124
|
+
* siblings, sync closes serialize every merge wait; alone, sync lands fastest.
|
|
125
|
+
* @param {{ storyId: number, mainRepo: string, storyCount: number }} args
|
|
126
|
+
* @returns {string}
|
|
127
|
+
*/
|
|
128
|
+
export function renderCloseCommand({ storyId, mainRepo, storyCount }) {
|
|
129
|
+
const parts = [
|
|
130
|
+
'node',
|
|
131
|
+
path.join(mainRepo, '.agents', 'scripts', 'single-story-close.js'),
|
|
132
|
+
`--story ${storyId}`,
|
|
133
|
+
`--cwd ${mainRepo}`,
|
|
134
|
+
];
|
|
135
|
+
if (storyCount > 1) parts.push('--merge-watch-mode async');
|
|
136
|
+
return parts.join(' ');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The whole spawn payload for one ready Story.
|
|
141
|
+
* @param {object} args
|
|
142
|
+
* @param {number} args.storyId
|
|
143
|
+
* @param {string} args.mainRepo
|
|
144
|
+
* @param {string|null} args.docsDigestPath
|
|
145
|
+
* @param {string|null} args.checklistPath
|
|
146
|
+
* @returns {string}
|
|
147
|
+
*/
|
|
148
|
+
export function renderDispatchPrompt({
|
|
149
|
+
storyId,
|
|
150
|
+
mainRepo,
|
|
151
|
+
docsDigestPath,
|
|
152
|
+
checklistPath,
|
|
153
|
+
}) {
|
|
154
|
+
const lines = [
|
|
155
|
+
`# Deliver Story #${storyId}`,
|
|
156
|
+
'',
|
|
157
|
+
`Main checkout: \`${mainRepo}\`.`,
|
|
158
|
+
'',
|
|
159
|
+
`You own Steps 0 through 2.5 of \`.agents/workflows/helpers/deliver-story.md\`.`,
|
|
160
|
+
'The orchestrator owns Step 3 (close): do not open a PR, do not run',
|
|
161
|
+
'`single-story-close.js`, and do not compose a terminal envelope.',
|
|
162
|
+
'',
|
|
163
|
+
'## Reads',
|
|
164
|
+
'',
|
|
165
|
+
'1. `.agents/workflows/helpers/deliver-digest.md` — once, first.',
|
|
166
|
+
'2. `.agents/workflows/helpers/deliver-story.md` — the steps.',
|
|
167
|
+
`3. The Story body (\`gh issue view ${storyId}\`) — its \`## Spec\`,`,
|
|
168
|
+
' `acceptance[]` and `verify[]` are the contract.',
|
|
169
|
+
'',
|
|
170
|
+
`- Docs digest: ${docsDigestPath ? `\`${docsDigestPath}\`` : 'none (project.docsContextFiles is unset) — no mandatory docs read'}`,
|
|
171
|
+
`- Write-time checklist: ${checklistPath ? `\`${checklistPath}\`` : 'none matched this footprint — the maker-blind close-scope pass still covers it'}`,
|
|
172
|
+
'',
|
|
173
|
+
'## Worktree',
|
|
174
|
+
'',
|
|
175
|
+
'Initialize from the main checkout, synchronously, at the maximum Bash',
|
|
176
|
+
'timeout — never in the background:',
|
|
177
|
+
'',
|
|
178
|
+
'```bash',
|
|
179
|
+
`node ${path.join(mainRepo, '.agents', 'scripts', 'single-story-init.js')} --story ${storyId}`,
|
|
180
|
+
'```',
|
|
181
|
+
'',
|
|
182
|
+
'Capture `workCwd` from its envelope and prefix **every** path-based',
|
|
183
|
+
'Read/Edit/Write with that absolute worktree root — `cd` alone does not',
|
|
184
|
+
'scope those tools. `remoteVerified: false` → flip `agent::blocked` quoting',
|
|
185
|
+
'`remoteProbe.detail` and stop.',
|
|
186
|
+
'',
|
|
187
|
+
'## Change-set discipline',
|
|
188
|
+
'',
|
|
189
|
+
'Derive the change set, the level and the ceremony with **one** call, and',
|
|
190
|
+
'hand that one list to the verdict owner — never let a critic re-run its',
|
|
191
|
+
'own `git diff`:',
|
|
192
|
+
'',
|
|
193
|
+
'```bash',
|
|
194
|
+
`node ${path.join(mainRepo, '.agents', 'scripts', 'ceremony-derive.js')} --story ${storyId} --cwd <workCwd>`,
|
|
195
|
+
'```',
|
|
196
|
+
'',
|
|
197
|
+
'## Hand-off',
|
|
198
|
+
'',
|
|
199
|
+
'Run the bounded acceptance self-eval (digest § 4), the one credited suite',
|
|
200
|
+
'run (digest § 5), then push `story-' + storyId + '` to `origin` and',
|
|
201
|
+
'confirm the remote ref moved. Return: Story id, `workCwd`, branch, pushed',
|
|
202
|
+
'head SHA, the self-eval verdict, and the `verify[]` evidence. Say the',
|
|
203
|
+
'branch is pushed and unclosed.',
|
|
204
|
+
'',
|
|
205
|
+
];
|
|
206
|
+
return lines.join('\n');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @param {object} args
|
|
211
|
+
* @param {number} args.storyId
|
|
212
|
+
* @param {string} args.body
|
|
213
|
+
* @param {string} args.runTempDir
|
|
214
|
+
* @param {string} args.mainRepo
|
|
215
|
+
* @param {string|null} args.docsDigestPath
|
|
216
|
+
* @param {object} [deps]
|
|
217
|
+
* @returns {{ id: number, promptPath: string }}
|
|
218
|
+
*/
|
|
219
|
+
function buildDispatchEntry(
|
|
220
|
+
{ storyId, body, runTempDir, mainRepo, docsDigestPath },
|
|
221
|
+
{
|
|
222
|
+
buildChecklistFn = buildDispatchChecklist,
|
|
223
|
+
writeFileFn = fs.writeFileSync,
|
|
224
|
+
} = {},
|
|
225
|
+
) {
|
|
226
|
+
let changes = [];
|
|
227
|
+
let references = [];
|
|
228
|
+
try {
|
|
229
|
+
// Path entries live on `.body`, not at the top level of the parse result.
|
|
230
|
+
const { body: parsed } = parseStoryBody(body ?? '');
|
|
231
|
+
changes = parsed?.changes ?? [];
|
|
232
|
+
references = parsed?.references ?? [];
|
|
233
|
+
} catch {
|
|
234
|
+
// Costs the checklist, never the dispatch: the worker reads the body itself.
|
|
235
|
+
changes = [];
|
|
236
|
+
references = [];
|
|
237
|
+
}
|
|
238
|
+
const { checklistPath } = buildChecklistFn({
|
|
239
|
+
storyId,
|
|
240
|
+
changes,
|
|
241
|
+
references,
|
|
242
|
+
runTempDir,
|
|
243
|
+
});
|
|
244
|
+
const promptPath = path.join(runTempDir, `dispatch-${storyId}.md`);
|
|
245
|
+
writeFileFn(
|
|
246
|
+
promptPath,
|
|
247
|
+
renderDispatchPrompt({
|
|
248
|
+
storyId,
|
|
249
|
+
mainRepo,
|
|
250
|
+
docsDigestPath,
|
|
251
|
+
checklistPath,
|
|
252
|
+
}),
|
|
253
|
+
'utf8',
|
|
254
|
+
);
|
|
255
|
+
return { id: storyId, promptPath };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* @param {object} envelope
|
|
260
|
+
* @returns {Array<{id: number, blockedBy: number, reason: string, paths: string[]}>}
|
|
261
|
+
*/
|
|
262
|
+
function collectWithheld(envelope) {
|
|
263
|
+
const reservation = envelope?.inFlightReservation?.withheld ?? [];
|
|
264
|
+
const guard = envelope?.footprintGuard?.withheld ?? [];
|
|
265
|
+
return [
|
|
266
|
+
...reservation.map((w) => ({
|
|
267
|
+
id: w.id,
|
|
268
|
+
blockedBy: w.blockedBy,
|
|
269
|
+
reason: w.reason ?? 'in-flight-earlier-beat',
|
|
270
|
+
paths: w.paths ?? [],
|
|
271
|
+
})),
|
|
272
|
+
...guard.map((w) => ({
|
|
273
|
+
id: w.id,
|
|
274
|
+
blockedBy: w.blockedBy,
|
|
275
|
+
reason: 'beat-peer',
|
|
276
|
+
paths: w.paths ?? [],
|
|
277
|
+
})),
|
|
278
|
+
];
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Report, never release: a slow init and a dead spawn look identical here,
|
|
283
|
+
* and releasing the first re-dispatches a live Story onto its own branch.
|
|
284
|
+
* @param {number[]} ids
|
|
285
|
+
* @param {{ ledgerPath: string, runId: string }} run
|
|
286
|
+
* @returns {string|null}
|
|
287
|
+
*/
|
|
288
|
+
export function renderStalledDispatchReason(ids, { ledgerPath, runId }) {
|
|
289
|
+
if (!Array.isArray(ids) || ids.length === 0) return null;
|
|
290
|
+
const list = ids.map((id) => `#${id}`).join(', ');
|
|
291
|
+
const subject = ids.length === 1 ? 'it' : 'they';
|
|
292
|
+
return (
|
|
293
|
+
`${list}: handed out as ready on an earlier beat, but live state still ` +
|
|
294
|
+
`reports ${subject} as agent::ready. Either single-story-init.js is still ` +
|
|
295
|
+
'running, or the spawn never reached it and the id is pinned in flight ' +
|
|
296
|
+
'for every later beat. This beat does not release it — re-dispatching a ' +
|
|
297
|
+
'live Story onto its own branch is the failure the ledger prevents. ' +
|
|
298
|
+
'Confirm no worker is running, then remove the id from "dispatched" in ' +
|
|
299
|
+
`${ledgerPath} and beat again with --run-id ${runId} so the same run ` +
|
|
300
|
+
'directory is reused.'
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Shaped like a beat envelope so callers branching on `kind` need no special case.
|
|
306
|
+
* @param {string} message
|
|
307
|
+
* @returns {{ envelope: object, exitCode: 1 }}
|
|
308
|
+
*/
|
|
309
|
+
function inputError(message) {
|
|
310
|
+
return {
|
|
311
|
+
envelope: { kind: 'deliver-run-beat', inputError: message },
|
|
312
|
+
exitCode: INPUT_ERROR_EXIT_CODE,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @param {{ stories?: string, handoff?: string[] }} args
|
|
318
|
+
* @returns {{ ids: number[]|null, handoffIds: number[], error: string|null }}
|
|
319
|
+
*/
|
|
320
|
+
export function resolveRunIds({ stories, handoff }) {
|
|
321
|
+
const { ids, error } = expandIdList(stories, {
|
|
322
|
+
flag: '--stories',
|
|
323
|
+
prefix: '[deliver-run] ',
|
|
324
|
+
});
|
|
325
|
+
if (error) return { ids: null, handoffIds: [], error };
|
|
326
|
+
if (ids.length === 0) {
|
|
327
|
+
return {
|
|
328
|
+
ids: null,
|
|
329
|
+
handoffIds: [],
|
|
330
|
+
error:
|
|
331
|
+
'[deliver-run] --stories is required: node .agents/scripts/deliver-run.js --stories 5340,5341',
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
const raw = (Array.isArray(handoff) ? handoff : [handoff]).filter(
|
|
335
|
+
(v) => v != null && v !== '',
|
|
336
|
+
);
|
|
337
|
+
const handoffIds = [];
|
|
338
|
+
for (const token of raw) {
|
|
339
|
+
const expanded = expandIdList(String(token), {
|
|
340
|
+
flag: '--handoff',
|
|
341
|
+
prefix: '[deliver-run] ',
|
|
342
|
+
});
|
|
343
|
+
if (expanded.error)
|
|
344
|
+
return { ids: null, handoffIds: [], error: expanded.error };
|
|
345
|
+
handoffIds.push(...expanded.ids);
|
|
346
|
+
}
|
|
347
|
+
return { ids, handoffIds: [...new Set(handoffIds)], error: null };
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @param {object} args
|
|
352
|
+
* @param {string} args.stories
|
|
353
|
+
* @param {string[]} [args.handoff]
|
|
354
|
+
* @param {string} [args.concurrency]
|
|
355
|
+
* @param {string} [args.runId]
|
|
356
|
+
* @param {string} [args.cwd]
|
|
357
|
+
* @param {object} [args.config]
|
|
358
|
+
* @param {Function} [args.probe]
|
|
359
|
+
* @param {Function} [args.context]
|
|
360
|
+
* @param {object} [deps]
|
|
361
|
+
* @returns {Promise<{ envelope: object, exitCode: number }>}
|
|
362
|
+
*/
|
|
363
|
+
export async function runDeliverRunBeat(
|
|
364
|
+
{
|
|
365
|
+
stories,
|
|
366
|
+
handoff = [],
|
|
367
|
+
concurrency,
|
|
368
|
+
runId: runIdOverride,
|
|
369
|
+
cwd,
|
|
370
|
+
config,
|
|
371
|
+
probe,
|
|
372
|
+
context,
|
|
373
|
+
} = {},
|
|
374
|
+
deps = {},
|
|
375
|
+
) {
|
|
376
|
+
const {
|
|
377
|
+
tickFn = runProbedStoriesWaveTick,
|
|
378
|
+
resolveConfigFn = resolveConfig,
|
|
379
|
+
ensureDocsDigestFn = ensureDocsDigest,
|
|
380
|
+
mkdirFn = fs.mkdirSync,
|
|
381
|
+
...entryDeps
|
|
382
|
+
} = deps;
|
|
383
|
+
|
|
384
|
+
const { ids, handoffIds, error } = resolveRunIds({ stories, handoff });
|
|
385
|
+
if (error) return inputError(error);
|
|
386
|
+
|
|
387
|
+
const mainRepo = path.resolve(cwd ?? process.cwd());
|
|
388
|
+
const resolved = config ?? resolveConfigFn({ cwd: mainRepo });
|
|
389
|
+
const runId = runIdOverride ?? deriveRunId(ids);
|
|
390
|
+
const runTempDir = path.resolve(
|
|
391
|
+
mainRepo,
|
|
392
|
+
getPaths(resolved).tempRoot,
|
|
393
|
+
`run-${runId}`,
|
|
394
|
+
);
|
|
395
|
+
mkdirFn(runTempDir, { recursive: true });
|
|
396
|
+
const ledgerPath = path.join(runTempDir, 'ledger.json');
|
|
397
|
+
const ledgered = readLedgerDispatched(ledgerPath, entryDeps);
|
|
398
|
+
|
|
399
|
+
const {
|
|
400
|
+
envelope: tick,
|
|
401
|
+
exitCode,
|
|
402
|
+
records = [],
|
|
403
|
+
} = await tickFn({
|
|
404
|
+
stories,
|
|
405
|
+
concurrency,
|
|
406
|
+
// Additive, never authoritative: the probe filters it against live state.
|
|
407
|
+
dispatched: ledgered.join(','),
|
|
408
|
+
cwd: mainRepo,
|
|
409
|
+
...(config ? { config } : {}),
|
|
410
|
+
...(probe ? { probe } : {}),
|
|
411
|
+
...(context ? { context } : {}),
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
if (tick?.inputError) return inputError(tick.inputError);
|
|
415
|
+
|
|
416
|
+
const stalledDispatch = Array.isArray(tick.stalledDispatch)
|
|
417
|
+
? tick.stalledDispatch
|
|
418
|
+
: [];
|
|
419
|
+
|
|
420
|
+
const readyIds = Array.isArray(tick.ready) ? tick.ready : [];
|
|
421
|
+
const digest = await ensureDocsDigestFn({
|
|
422
|
+
docsContextFiles: resolved?.project?.docsContextFiles,
|
|
423
|
+
docsRoot: getPaths(resolved).docsRoot,
|
|
424
|
+
outputPath: path.join(runTempDir, 'docs-digest.md'),
|
|
425
|
+
});
|
|
426
|
+
const docsDigestPath = digest?.outputPath ?? null;
|
|
427
|
+
|
|
428
|
+
const bodyById = new Map(
|
|
429
|
+
records.map((record) => [record.id, record.body ?? '']),
|
|
430
|
+
);
|
|
431
|
+
const ready = readyIds.map((storyId) =>
|
|
432
|
+
buildDispatchEntry(
|
|
433
|
+
{
|
|
434
|
+
storyId,
|
|
435
|
+
body: bodyById.get(storyId) ?? '',
|
|
436
|
+
runTempDir,
|
|
437
|
+
mainRepo,
|
|
438
|
+
docsDigestPath,
|
|
439
|
+
},
|
|
440
|
+
entryDeps,
|
|
441
|
+
),
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
writeLedger(
|
|
445
|
+
{ ledgerPath, runId, stories: ids, dispatched: ledgered, ready: readyIds },
|
|
446
|
+
entryDeps,
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
return {
|
|
450
|
+
envelope: {
|
|
451
|
+
kind: 'deliver-run-beat',
|
|
452
|
+
runId,
|
|
453
|
+
runTempDir,
|
|
454
|
+
stories: ids,
|
|
455
|
+
ready,
|
|
456
|
+
close: handoffIds.map((storyId) => ({
|
|
457
|
+
id: storyId,
|
|
458
|
+
command: renderCloseCommand({
|
|
459
|
+
storyId,
|
|
460
|
+
mainRepo,
|
|
461
|
+
storyCount: ids.length,
|
|
462
|
+
}),
|
|
463
|
+
})),
|
|
464
|
+
done: tick.epilogueDue === true,
|
|
465
|
+
doneStories: tick.done ?? [],
|
|
466
|
+
inFlight: tick.inFlight ?? 0,
|
|
467
|
+
concurrencyCap: tick.concurrencyCap ?? null,
|
|
468
|
+
docsDigestPath,
|
|
469
|
+
cycleError: tick.cycleError ?? null,
|
|
470
|
+
wedged: tick.wedged ?? null,
|
|
471
|
+
blocked: tick.blocked ?? [],
|
|
472
|
+
blockedReason: tick.blockedReason ?? null,
|
|
473
|
+
foreignHeld: tick.foreignHeld ?? [],
|
|
474
|
+
// Not in `withheld[]`: it has no blocking peer, only an operator recovery.
|
|
475
|
+
stalledDispatch,
|
|
476
|
+
stalledDispatchReason: renderStalledDispatchReason(stalledDispatch, {
|
|
477
|
+
ledgerPath,
|
|
478
|
+
runId,
|
|
479
|
+
}),
|
|
480
|
+
withheld: collectWithheld(tick),
|
|
481
|
+
},
|
|
482
|
+
exitCode,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* @param {string[]} argv
|
|
488
|
+
* @returns {{ stories?: string, handoff: string[], concurrency?: string, runId?: string, cwd?: string }}
|
|
489
|
+
*/
|
|
490
|
+
function parseArgv(argv) {
|
|
491
|
+
const { values } = parseArgs({
|
|
492
|
+
args: argv,
|
|
493
|
+
options: {
|
|
494
|
+
stories: { type: 'string' },
|
|
495
|
+
handoff: { type: 'string', multiple: true },
|
|
496
|
+
concurrency: { type: 'string' },
|
|
497
|
+
'run-id': { type: 'string' },
|
|
498
|
+
cwd: { type: 'string' },
|
|
499
|
+
},
|
|
500
|
+
strict: false,
|
|
501
|
+
allowPositionals: false,
|
|
502
|
+
});
|
|
503
|
+
return {
|
|
504
|
+
stories: values.stories,
|
|
505
|
+
handoff: values.handoff ?? [],
|
|
506
|
+
concurrency: values.concurrency,
|
|
507
|
+
runId: values['run-id'],
|
|
508
|
+
cwd: values.cwd,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
async function main(argv) {
|
|
513
|
+
const { envelope, exitCode } = await runDeliverRunBeat(parseArgv(argv));
|
|
514
|
+
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
515
|
+
if (exitCode !== 0) {
|
|
516
|
+
Logger.error(
|
|
517
|
+
`deliver-run: ${
|
|
518
|
+
envelope.inputError ??
|
|
519
|
+
envelope.cycleError ??
|
|
520
|
+
envelope.blockedReason ??
|
|
521
|
+
envelope.wedged?.reason ??
|
|
522
|
+
'error'
|
|
523
|
+
}`,
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
return exitCode;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
runAsCli(import.meta.url, () => main(process.argv.slice(2)), {
|
|
530
|
+
source: 'deliver-run',
|
|
531
|
+
propagateExitCode: true,
|
|
532
|
+
errorPrefix: '[deliver-run] ❌ Fatal error',
|
|
533
|
+
usage: USAGE,
|
|
534
|
+
});
|