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
|
@@ -2,35 +2,11 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* single-story-init.js —
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Epic parent, epic branch, or dispatch-manifest gate.
|
|
11
|
-
*
|
|
12
|
-
* What this script does:
|
|
13
|
-
* 1. Validate the Story (type::story, not closed).
|
|
14
|
-
* 2. Acquire the assignee lease, then refuse a Story already labelled
|
|
15
|
-
* `agent::executing` this run does not hold (unless `--steal`).
|
|
16
|
-
* 3. Flip the Story to `agent::executing` — BEFORE provisioning, so the
|
|
17
|
-
* claim is label-visible to concurrent operators' probes during the
|
|
18
|
-
* multi-minute install window (Story #4620). A provisioning failure after
|
|
19
|
-
* this reverts the label and releases the lease.
|
|
20
|
-
* 4. Fetch origin.
|
|
21
|
-
* 5. Create the Story branch from `project.baseBranch` (default
|
|
22
|
-
* `main`) — local-only, no remote push at this stage.
|
|
23
|
-
* 6. Materialise a worktree at `.worktrees/story-<id>/` when worktree
|
|
24
|
-
* isolation is enabled; otherwise check out the branch in-place.
|
|
25
|
-
* 7. Upsert a `story-init` structured comment carrying
|
|
26
|
-
* `standalone: true`.
|
|
27
|
-
*
|
|
28
|
-
* What this script does NOT do:
|
|
29
|
-
* - Child-Task transitions — a Story is atomic (one branch, one
|
|
30
|
-
* commit-set, one PR to `main`).
|
|
31
|
-
*
|
|
32
|
-
* Usage: `node single-story-init.js --story <STORY_ID> [--dry-run]`
|
|
33
|
-
* Exit codes: 0 ok, 1 error.
|
|
5
|
+
* single-story-init.js — initialize a Story for `/mandrel-deliver`: validate,
|
|
6
|
+
* take the lease, flip to `agent::executing` (before provisioning, so the
|
|
7
|
+
* claim is visible during the install window; a later failure rolls it back),
|
|
8
|
+
* seed `story-<id>` from the base branch locally, and materialise the
|
|
9
|
+
* worktree when isolation is on.
|
|
34
10
|
*
|
|
35
11
|
* @see .agents/workflows/helpers/deliver-story.md
|
|
36
12
|
*/
|
|
@@ -70,32 +46,20 @@ import { handleRemoteVerificationFailure } from './lib/orchestration/story-init-
|
|
|
70
46
|
import {
|
|
71
47
|
STATE_LABELS,
|
|
72
48
|
transitionTicketState,
|
|
73
|
-
upsertStructuredComment,
|
|
74
49
|
} from './lib/orchestration/ticketing.js';
|
|
75
50
|
import { createProvider } from './lib/provider-factory.js';
|
|
76
51
|
import { buildProtectionCtx } from './lib/single-story-sweep/protection-ctx.js';
|
|
77
52
|
import { resolveSweepLockPath } from './lib/single-story-sweep/sweep-lock.js';
|
|
78
|
-
// `sweepMergedStoryBranches` is imported dynamically
|
|
79
|
-
//
|
|
80
|
-
// would crash module resolution before `assertDepsInstalled()` can emit a
|
|
81
|
-
// friendly "run npm install" message.
|
|
53
|
+
// `sweepMergedStoryBranches` is imported dynamically: its graph reaches
|
|
54
|
+
// `picomatch`, which would crash before `assertDepsInstalled()` can report.
|
|
82
55
|
import { WorktreeManager } from './lib/worktree-manager.js';
|
|
83
56
|
|
|
84
57
|
export { handleRemoteVerificationFailure } from './lib/orchestration/story-init-remote.js';
|
|
85
|
-
// `makeGhRunner` moved to the shared `single-story-sweep/protection-ctx.js`
|
|
86
|
-
// module (Story #4373) so the three boot callers build an identical
|
|
87
|
-
// protection ctx. Re-exported here to preserve its existing import path.
|
|
88
58
|
export { makeGhRunner } from './lib/single-story-sweep/protection-ctx.js';
|
|
89
59
|
|
|
90
60
|
/**
|
|
91
|
-
* Fail fast with
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* Why: a wiped `node_modules/` previously surfaced as
|
|
95
|
-
* `ERR_MODULE_NOT_FOUND: Cannot find package 'picomatch'` from deep inside
|
|
96
|
-
* the sweep graph — opaque for operators. This guard probes a representative
|
|
97
|
-
* runtime dep (declared in `.agents/runtime-deps.json`) and tells the operator
|
|
98
|
-
* exactly what to run.
|
|
61
|
+
* Fail fast with an actionable message when deps are missing, instead of an
|
|
62
|
+
* opaque `ERR_MODULE_NOT_FOUND` from deep in the sweep graph. Builtins only.
|
|
99
63
|
*/
|
|
100
64
|
function assertDepsInstalled(projectRoot) {
|
|
101
65
|
const probe = path.join(projectRoot, 'node_modules', 'picomatch');
|
|
@@ -112,12 +76,8 @@ function assertDepsInstalled(projectRoot) {
|
|
|
112
76
|
const progress = Logger.createProgress('single-story-init', { stderr: true });
|
|
113
77
|
|
|
114
78
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* Exported for testing.
|
|
118
|
-
*
|
|
119
|
-
* @param {{ labels: string[], state: string }} story Fetched ticket.
|
|
120
|
-
* @param {number} storyId Story number (for error messages).
|
|
79
|
+
* @param {{ labels: string[], state: string }} story
|
|
80
|
+
* @param {number} storyId
|
|
121
81
|
*/
|
|
122
82
|
export function assertDeliverableStory(story, storyId) {
|
|
123
83
|
if (!story.labels.includes(TYPE_LABELS.STORY)) {
|
|
@@ -139,26 +99,14 @@ export function assertDeliverableStory(story, storyId) {
|
|
|
139
99
|
}
|
|
140
100
|
|
|
141
101
|
/**
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* assignee can drift apart: a prior run that crashed *after* the early
|
|
147
|
-
* `agent::executing` flip but *before* (or without) taking/holding the lease
|
|
148
|
-
* leaves the Story labelled executing with no live foreign lease to trip the
|
|
149
|
-
* lease preflight. Left unchecked, a fresh run would seed the branch and
|
|
150
|
-
* worktree straight over that drift. Refuse unless the caller already holds the
|
|
151
|
-
* lease (`reason === 'already-held'`, i.e. a legitimate idempotent re-init) or
|
|
152
|
-
* passed `--steal`.
|
|
153
|
-
*
|
|
154
|
-
* Runs *after* the lease acquire (so it can read the acquire's reason) but
|
|
155
|
-
* *before* any git mutation. On refusal it releases the lease this run just
|
|
156
|
-
* took so the ticket is left exactly as found — a clean state for the operator
|
|
157
|
-
* to inspect before re-running with `--steal`.
|
|
102
|
+
* Refuse a Story labelled `agent::executing` that this run does not hold:
|
|
103
|
+
* label and assignee can drift (a run that crashed after the flip), so the
|
|
104
|
+
* lease alone misses it. Runs after the acquire, before any git mutation, and
|
|
105
|
+
* releases the just-taken lease on refusal so the ticket is left as found.
|
|
158
106
|
*
|
|
159
107
|
* @param {object} args
|
|
160
|
-
* @param {{ labels?: string[] }} args.story
|
|
161
|
-
* @param {{ reason: string, previousOwner: string|null }} args.lease
|
|
108
|
+
* @param {{ labels?: string[] }} args.story
|
|
109
|
+
* @param {{ reason: string, previousOwner: string|null }} args.lease
|
|
162
110
|
* @param {boolean} args.stealRequested
|
|
163
111
|
* @param {number} args.storyId
|
|
164
112
|
* @param {object} args.provider
|
|
@@ -177,7 +125,6 @@ export async function assertNotForeignExecuting({
|
|
|
177
125
|
story.labels.includes(STATE_LABELS.EXECUTING);
|
|
178
126
|
if (!labelled || stealRequested || lease.reason === 'already-held') return;
|
|
179
127
|
|
|
180
|
-
// Back out the lease we just took so the refusal leaves the ticket unchanged.
|
|
181
128
|
try {
|
|
182
129
|
await releaseStoryLease({ provider, storyId, config });
|
|
183
130
|
} catch (err) {
|
|
@@ -196,18 +143,11 @@ export async function assertNotForeignExecuting({
|
|
|
196
143
|
}
|
|
197
144
|
|
|
198
145
|
/**
|
|
199
|
-
*
|
|
200
|
-
* multi-minute worktree install, so a concurrent operator's probe sees the
|
|
201
|
-
* claim during the install window instead of reading `agent::ready` and
|
|
202
|
-
* dispatching the Story a second time.
|
|
203
|
-
*
|
|
204
|
-
* Best-effort: the assignee lease is the real guard, so a failed flip logs and
|
|
205
|
-
* proceeds rather than aborting init. Routes through `transitionTicketState`
|
|
206
|
-
* so the Projects v2 Status column follows the label (Story #2548).
|
|
146
|
+
* Best-effort: the lease is the real guard, so a failed flip only logs.
|
|
207
147
|
*
|
|
208
148
|
* @param {object} provider
|
|
209
149
|
* @param {number} storyId
|
|
210
|
-
* @param {object} story
|
|
150
|
+
* @param {object} story Prefetched snapshot.
|
|
211
151
|
* @returns {Promise<void>}
|
|
212
152
|
*/
|
|
213
153
|
async function flipStoryToExecuting(provider, storyId, story) {
|
|
@@ -225,15 +165,8 @@ async function flipStoryToExecuting(provider, storyId, story) {
|
|
|
225
165
|
}
|
|
226
166
|
|
|
227
167
|
/**
|
|
228
|
-
* Roll
|
|
229
|
-
*
|
|
230
|
-
* A container carries no `agent::*` label, so the Status sync that follows
|
|
231
|
-
* the flip above cannot reach it — its column is derived from its children
|
|
232
|
-
* instead. This is the edge where the first child of an Epic starts moving,
|
|
233
|
-
* which is what puts the Epic on the board as In Progress with an owner.
|
|
234
|
-
*
|
|
235
|
-
* Best-effort by construction: the rollup never throws, and a container left
|
|
236
|
-
* at a stale column must never cost the Story its init.
|
|
168
|
+
* Roll a container Epic's status up from its children (it carries no
|
|
169
|
+
* `agent::*` label of its own). Never throws.
|
|
237
170
|
*
|
|
238
171
|
* @param {object} provider
|
|
239
172
|
* @param {number} storyId
|
|
@@ -253,11 +186,8 @@ async function rollUpContainerEpic(provider, storyId, config) {
|
|
|
253
186
|
}
|
|
254
187
|
|
|
255
188
|
/**
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* lease, both best-effort. Without this a crashed init would strand the Story
|
|
259
|
-
* as phantom-executing — claimed and labelled in-flight but with no live run —
|
|
260
|
-
* which every other operator's probe would then withhold indefinitely.
|
|
189
|
+
* Best-effort revert of label and lease after a provisioning failure, so the
|
|
190
|
+
* Story is not stranded as phantom-executing (withheld by every probe).
|
|
261
191
|
*
|
|
262
192
|
* @param {object} provider
|
|
263
193
|
* @param {number} storyId
|
|
@@ -288,22 +218,10 @@ async function rollbackClaimOnInitFailure(provider, storyId, config) {
|
|
|
288
218
|
}
|
|
289
219
|
|
|
290
220
|
/**
|
|
291
|
-
*
|
|
292
|
-
* exported for testing (Story #3483 AC3: an existing `story-<id>` branch must
|
|
293
|
-
* be **reused**, never re-created — re-creating throws `branch already exists`).
|
|
294
|
-
*
|
|
295
|
-
* Delegates the (local, remote) decision to the shared `classifyBranchSeed`
|
|
296
|
-
* classifier (Story #3513) so this path and the Epic-attached
|
|
297
|
-
* `branch-initializer.js#planStoryBranchSeed` share one decision tree. The
|
|
298
|
-
* shared classifier returns `'local'` for the local-present case; this path
|
|
299
|
-
* names that outcome `'reuse'`.
|
|
221
|
+
* An existing local ref must be reused, never re-created (`git branch` throws).
|
|
300
222
|
*
|
|
301
223
|
* @param {{ localHas: boolean, remoteHas: boolean }} presence
|
|
302
224
|
* @returns {'reuse'|'fetch'|'create'}
|
|
303
|
-
* - `reuse` — a local ref already exists; the caller must not run
|
|
304
|
-
* `git branch` (which would throw on the existing ref).
|
|
305
|
-
* - `fetch` — only the remote ref exists; materialise the local ref.
|
|
306
|
-
* - `create` — neither exists; branch from baseBranch.
|
|
307
225
|
*/
|
|
308
226
|
export function decideStoryBranchSeed({ localHas, remoteHas }) {
|
|
309
227
|
const action = classifyBranchSeed({ localHas, remoteHas });
|
|
@@ -311,22 +229,10 @@ export function decideStoryBranchSeed({ localHas, remoteHas }) {
|
|
|
311
229
|
}
|
|
312
230
|
|
|
313
231
|
/**
|
|
314
|
-
* Reap
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
* Story #2011 hardens this surface in two ways:
|
|
320
|
-
* - Per-candidate protection: branches with unpushed work, dirty
|
|
321
|
-
* worktrees, or still-open Story tickets are skipped (and listed
|
|
322
|
-
* in `sweep.protected` for the operator).
|
|
323
|
-
* - Cross-session lock: a single lockfile under `tempRoot` prevents
|
|
324
|
-
* two concurrent `/single-story-deliver` invocations from racing.
|
|
325
|
-
* Story #5112 made that lockfile shared with `boot-sweep.js` — the
|
|
326
|
-
* other entry point into the same merged-branch reap — by routing
|
|
327
|
-
* both through `resolveSweepLockPath`.
|
|
328
|
-
*
|
|
329
|
-
* Exported for testing.
|
|
232
|
+
* Reap merged `story-*` branches (excluding the current one). Never blocks
|
|
233
|
+
* init. Protected candidates (unpushed work, dirty worktree, open Story) are
|
|
234
|
+
* skipped; the lockfile is shared with `boot-sweep.js` via
|
|
235
|
+
* `resolveSweepLockPath` so concurrent reaps cannot race.
|
|
330
236
|
*/
|
|
331
237
|
export async function reapMergedStoryBranches({
|
|
332
238
|
cwd,
|
|
@@ -384,13 +290,8 @@ export async function reapMergedStoryBranches({
|
|
|
384
290
|
}
|
|
385
291
|
|
|
386
292
|
/**
|
|
387
|
-
* Fetch
|
|
388
|
-
*
|
|
389
|
-
* testing (owns the fast-forward cascade).
|
|
390
|
-
*
|
|
391
|
-
* Routes the `origin` fetch through `cachedGitFetch` so concurrent Story
|
|
392
|
-
* waves share a per-process fetch-coalescing window. Pass `fetchFn` to
|
|
393
|
-
* inject a stub in tests without touching real git.
|
|
293
|
+
* Fetch, reap, and fast-forward the local base branch so new Story branches
|
|
294
|
+
* seed from origin's tip.
|
|
394
295
|
*
|
|
395
296
|
* @param {object} opts
|
|
396
297
|
* @param {string} opts.cwd
|
|
@@ -401,9 +302,7 @@ export async function reapMergedStoryBranches({
|
|
|
401
302
|
* @param {Function|undefined} opts.injectedSweep
|
|
402
303
|
* @param {Function} opts.progress
|
|
403
304
|
* @param {import('./lib/git/cached-fetch.js').FetchCache} [opts.fetchCache]
|
|
404
|
-
*
|
|
405
|
-
* cache. Production callers omit this so all Stories in a wave share the
|
|
406
|
-
* module singleton.
|
|
305
|
+
* Test override; production shares the module singleton.
|
|
407
306
|
*/
|
|
408
307
|
export async function materializeBaseBranch({
|
|
409
308
|
cwd,
|
|
@@ -436,8 +335,6 @@ export async function materializeBaseBranch({
|
|
|
436
335
|
injectedSweep,
|
|
437
336
|
});
|
|
438
337
|
|
|
439
|
-
// Ensure baseBranch exists locally so we can branch from it. If only
|
|
440
|
-
// remote-tracking is present, materialize the local ref.
|
|
441
338
|
if (!branchExistsLocally(baseBranch, cwd)) {
|
|
442
339
|
const r = gitSpawn(cwd, 'fetch', 'origin', `${baseBranch}:${baseBranch}`);
|
|
443
340
|
if (r.status !== 0) {
|
|
@@ -448,11 +345,7 @@ export async function materializeBaseBranch({
|
|
|
448
345
|
return;
|
|
449
346
|
}
|
|
450
347
|
|
|
451
|
-
// `git fetch
|
|
452
|
-
// at the pre-merge tip until fast-forwarded. Use the same helper as
|
|
453
|
-
// `/git-cleanup --fast-forward-main` (checkout base + `merge --ff-only`) so
|
|
454
|
-
// new `story-*` branches seed from origin's tip when the main checkout is
|
|
455
|
-
// clean (Story #2744).
|
|
348
|
+
// `git fetch` leaves local base at the old tip until fast-forwarded.
|
|
456
349
|
const ffPlan = planFastForward({ cwd, baseBranch });
|
|
457
350
|
const ff = executeFastForward({
|
|
458
351
|
cwd,
|
|
@@ -482,15 +375,8 @@ export async function materializeBaseBranch({
|
|
|
482
375
|
}
|
|
483
376
|
|
|
484
377
|
/**
|
|
485
|
-
*
|
|
486
|
-
*
|
|
487
|
-
* - remote only → fetch
|
|
488
|
-
* - neither → create from baseBranch
|
|
489
|
-
*
|
|
490
|
-
* `cachedGitFetch(cwd, 'origin')` is assumed to have run before this call
|
|
491
|
-
* (via `materializeBaseBranch`), so remote-tracking refs are authoritative.
|
|
492
|
-
* Uses a local tracking-ref check rather than a network `ls-remote` round-trip.
|
|
493
|
-
* Exported for testing (owns the seedAction switch + throws).
|
|
378
|
+
* Idempotent seed. Assumes `materializeBaseBranch` already fetched, so
|
|
379
|
+
* tracking refs are authoritative (no `ls-remote`).
|
|
494
380
|
*
|
|
495
381
|
* @param {object} opts
|
|
496
382
|
* @param {string} opts.cwd
|
|
@@ -499,11 +385,7 @@ export async function materializeBaseBranch({
|
|
|
499
385
|
* @param {Function} opts.progress
|
|
500
386
|
*/
|
|
501
387
|
export function seedStoryBranch({ cwd, storyBranch, baseBranch, progress }) {
|
|
502
|
-
//
|
|
503
|
-
// fatal (`swallowCreateRace: false`) and a failed fetch throws. The
|
|
504
|
-
// seed-action switch shell is single-homed in `seedStoryBranchRef`
|
|
505
|
-
// (Story #4255); this caller only supplies its `baseRef`, its git seams
|
|
506
|
-
// bound to `cwd`, and its own log/error vocabulary.
|
|
388
|
+
// No concurrent creator to race here, so create failures are fatal.
|
|
507
389
|
seedStoryBranchRef({
|
|
508
390
|
storyBranch,
|
|
509
391
|
baseRef: baseBranch,
|
|
@@ -524,9 +406,7 @@ export function seedStoryBranch({ cwd, storyBranch, baseBranch, progress }) {
|
|
|
524
406
|
}
|
|
525
407
|
|
|
526
408
|
/**
|
|
527
|
-
* Provision a worktree
|
|
528
|
-
* Returns the resolved `workCwd`, `worktreeCreated`, and `installStatus`.
|
|
529
|
-
* Exported for testing (owns the worktree/single-tree routing).
|
|
409
|
+
* Provision a worktree, or check out the branch in single-tree mode.
|
|
530
410
|
*
|
|
531
411
|
* @param {object} opts
|
|
532
412
|
* @param {object} opts.runtime
|
|
@@ -568,16 +448,12 @@ export async function provisionWorktree({
|
|
|
568
448
|
`${ensured.created ? '✨ Created' : '♻️ Reusing'} worktree: ${ensured.path}`,
|
|
569
449
|
);
|
|
570
450
|
} else {
|
|
571
|
-
// Single-tree mode: check out the branch on the main checkout.
|
|
572
451
|
gitSync(cwd, 'checkout', storyBranch);
|
|
573
452
|
}
|
|
574
453
|
|
|
575
454
|
return { workCwd, worktreeCreated, installStatus };
|
|
576
455
|
}
|
|
577
456
|
|
|
578
|
-
/**
|
|
579
|
-
* Initialize a standalone Story. Exported for testing.
|
|
580
|
-
*/
|
|
581
457
|
export async function runSingleStoryInit({
|
|
582
458
|
storyId: storyIdParam,
|
|
583
459
|
dryRun: dryRunParam,
|
|
@@ -585,15 +461,9 @@ export async function runSingleStoryInit({
|
|
|
585
461
|
injectedProvider,
|
|
586
462
|
injectedConfig,
|
|
587
463
|
injectedSweep,
|
|
588
|
-
// Story #3483: lets tests drive the lease preflight deterministically.
|
|
589
|
-
// `injectedAcquireLease` swaps the guard. `steal` forcibly transfers a
|
|
590
|
-
// foreign claim — the lease fails closed (audit #3513), so a foreign
|
|
591
|
-
// assignee blocks unless stolen.
|
|
592
464
|
injectedAcquireLease,
|
|
593
465
|
steal = false,
|
|
594
466
|
injectedVerifyRemote,
|
|
595
|
-
// Story #4620: swap the git-touching provisioning steps so the
|
|
596
|
-
// early-flip-then-rollback ordering is unit-testable without a real worktree.
|
|
597
467
|
injectedMaterialize = materializeBaseBranch,
|
|
598
468
|
injectedSeedBranch = seedStoryBranch,
|
|
599
469
|
injectedProvisionWorktree = provisionWorktree,
|
|
@@ -608,10 +478,8 @@ export async function runSingleStoryInit({
|
|
|
608
478
|
: parseSprintArgs();
|
|
609
479
|
const { storyId, dryRun } = parsed;
|
|
610
480
|
const cwd = path.resolve(cwdParam ?? parsed.cwd ?? PROJECT_ROOT);
|
|
611
|
-
// `--steal` is
|
|
612
|
-
//
|
|
613
|
-
// test callers). The standalone lease fails closed on a foreign assignee
|
|
614
|
-
// (audit #3513), so `--steal` is the operator's forcible-transfer override.
|
|
481
|
+
// `--steal` is outside parseSprintArgs; the lease fails closed on a foreign
|
|
482
|
+
// assignee, so this is the operator's forcible-transfer override.
|
|
615
483
|
const stealRequested =
|
|
616
484
|
steal || (storyIdParam === undefined && process.argv.includes('--steal'));
|
|
617
485
|
|
|
@@ -636,12 +504,9 @@ export async function runSingleStoryInit({
|
|
|
636
504
|
);
|
|
637
505
|
progress('INIT', `Initializing standalone Story #${storyId}...`);
|
|
638
506
|
|
|
639
|
-
//
|
|
640
|
-
//
|
|
641
|
-
//
|
|
642
|
-
// the fact; the workflow owns the `agent::blocked` transition on
|
|
643
|
-
// `remoteVerified: false` — inline delivery to local `main` is never a
|
|
644
|
-
// sanctioned fallback.
|
|
507
|
+
// Read-only, so it runs under --dry-run too. The workflow owns the
|
|
508
|
+
// `agent::blocked` transition on `remoteVerified: false`; inline delivery to
|
|
509
|
+
// local `main` is never a fallback.
|
|
645
510
|
const remote = (injectedVerifyRemote ?? verifyRemote)({ cwd });
|
|
646
511
|
progress(
|
|
647
512
|
'REMOTE',
|
|
@@ -664,12 +529,7 @@ export async function runSingleStoryInit({
|
|
|
664
529
|
`Standalone Story: "${story.title}" → branch ${storyBranch} from ${baseBranch}.`,
|
|
665
530
|
);
|
|
666
531
|
|
|
667
|
-
//
|
|
668
|
-
// ticket before any git mutation so two concurrent standalone runs cannot
|
|
669
|
-
// both drive the same Story. The guard fails closed (audit #3513): a
|
|
670
|
-
// foreign assignee aborts init (naming the current owner) unless --steal
|
|
671
|
-
// forcibly transfers it. Unclaimed / self-held claims proceed. Skipped
|
|
672
|
-
// under --dry-run (no assignee mutation).
|
|
532
|
+
// Lease before any git mutation so two runs cannot drive one Story.
|
|
673
533
|
let workCwd = cwd;
|
|
674
534
|
let worktreeCreated = false;
|
|
675
535
|
let installStatus = { status: 'skipped', reason: 'dry-run' };
|
|
@@ -687,9 +547,6 @@ export async function runSingleStoryInit({
|
|
|
687
547
|
`🔒 Story #${storyId} lease ${lease.reason} (owner=@${lease.owner}).`,
|
|
688
548
|
);
|
|
689
549
|
|
|
690
|
-
// Defense in depth: refuse a Story already labelled agent::executing that
|
|
691
|
-
// this run does not hold (label/assignee drift the lease alone misses).
|
|
692
|
-
// Runs before any git mutation; releases the just-taken lease on refusal.
|
|
693
550
|
await assertNotForeignExecuting({
|
|
694
551
|
story,
|
|
695
552
|
lease,
|
|
@@ -699,20 +556,12 @@ export async function runSingleStoryInit({
|
|
|
699
556
|
config,
|
|
700
557
|
});
|
|
701
558
|
|
|
702
|
-
//
|
|
703
|
-
// install (not after), so a concurrent operator's probe sees it during the
|
|
704
|
-
// install window instead of reading agent::ready and double-dispatching.
|
|
559
|
+
// Before the install, so a concurrent probe cannot double-dispatch.
|
|
705
560
|
await flipStoryToExecuting(provider, storyId, story);
|
|
706
561
|
|
|
707
|
-
//
|
|
708
|
-
// it is too. Fired here rather than after provisioning so the board shows
|
|
709
|
-
// In Progress for the whole install window, and after the flip so the
|
|
710
|
-
// rollup reads the state it derives from.
|
|
562
|
+
// After the flip (the rollup reads it), before the install window.
|
|
711
563
|
await rollUpContainerEpic(provider, storyId, config);
|
|
712
564
|
|
|
713
|
-
// Any failure from here on leaves a claimed, executing-labelled Story with
|
|
714
|
-
// no live run behind it — revert the label and release the lease so the
|
|
715
|
-
// Story is not stranded as phantom-executing.
|
|
716
565
|
try {
|
|
717
566
|
await injectedMaterialize({
|
|
718
567
|
cwd,
|
|
@@ -752,10 +601,7 @@ export async function runSingleStoryInit({
|
|
|
752
601
|
standalone: true,
|
|
753
602
|
storyBranch,
|
|
754
603
|
baseBranch,
|
|
755
|
-
//
|
|
756
|
-
// legacy field close still reads as a fallback; this block is the
|
|
757
|
-
// registry-driven form a second run-scoped key joins without a second
|
|
758
|
-
// mechanism (`lib/orchestration/run-scoped-config.js`).
|
|
604
|
+
// Write half of the run-scoped config pin; `baseBranch` is close's fallback.
|
|
759
605
|
runScopedConfig: pinRunScopedConfig(config),
|
|
760
606
|
storyTitle: story.title,
|
|
761
607
|
worktreeEnabled: runtime.worktreeEnabled,
|
|
@@ -765,36 +611,12 @@ export async function runSingleStoryInit({
|
|
|
765
611
|
dependenciesInstalled,
|
|
766
612
|
installFailed: installStatus.status === 'failed',
|
|
767
613
|
dryRun,
|
|
768
|
-
// Issue #4483 — verified remote evidence for the orchestrating agent.
|
|
769
614
|
remoteVerified: remote.remoteVerified,
|
|
770
615
|
remoteProbe: { remoteUrl: remote.remoteUrl, detail: remote.detail },
|
|
771
616
|
};
|
|
772
617
|
|
|
773
|
-
//
|
|
774
|
-
//
|
|
775
|
-
// claim is label-visible during the install window (see `flipStoryToExecuting`).
|
|
776
|
-
if (!dryRun) {
|
|
777
|
-
try {
|
|
778
|
-
await upsertStructuredComment(
|
|
779
|
-
provider,
|
|
780
|
-
storyId,
|
|
781
|
-
'story-init',
|
|
782
|
-
renderSingleStoryInitComment(result),
|
|
783
|
-
);
|
|
784
|
-
progress(
|
|
785
|
-
'COMMENT',
|
|
786
|
-
`📝 Upserted story-init structured comment on #${storyId}.`,
|
|
787
|
-
);
|
|
788
|
-
} catch (err) {
|
|
789
|
-
Logger.error(
|
|
790
|
-
`[single-story-init] ⚠️ Failed to upsert story-init structured comment: ${err?.message ?? err}`,
|
|
791
|
-
);
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
// Story #4685 — route the full result to a temp log and emit a single-line
|
|
796
|
-
// summary carrying the fields the orchestrating agent acts on (workCwd,
|
|
797
|
-
// remoteVerified). The `## Spec` names this the hot-path stdout to quiet.
|
|
618
|
+
// The envelope (stdout + disk) is the only record; no ticket comment. Full
|
|
619
|
+
// result goes to a temp log, stdout gets the fields the caller acts on.
|
|
798
620
|
emitTerseResult({
|
|
799
621
|
label: 'STORY INIT RESULT',
|
|
800
622
|
result,
|
|
@@ -820,40 +642,6 @@ export async function runSingleStoryInit({
|
|
|
820
642
|
return { success: true, result };
|
|
821
643
|
}
|
|
822
644
|
|
|
823
|
-
export function renderSingleStoryInitComment(result) {
|
|
824
|
-
const payload = {
|
|
825
|
-
storyId: result.storyId,
|
|
826
|
-
epicId: null,
|
|
827
|
-
standalone: true,
|
|
828
|
-
storyBranch: result.storyBranch,
|
|
829
|
-
baseBranch: result.baseBranch,
|
|
830
|
-
runScopedConfig: result.runScopedConfig,
|
|
831
|
-
worktreeEnabled: result.worktreeEnabled,
|
|
832
|
-
workCwd: result.workCwd,
|
|
833
|
-
worktreeCreated: result.worktreeCreated,
|
|
834
|
-
dependenciesInstalled: result.dependenciesInstalled,
|
|
835
|
-
installStatus: result.installStatus,
|
|
836
|
-
remoteVerified: result.remoteVerified,
|
|
837
|
-
remoteProbe: result.remoteProbe,
|
|
838
|
-
};
|
|
839
|
-
return [
|
|
840
|
-
'## Story init (standalone)',
|
|
841
|
-
'',
|
|
842
|
-
`- **standalone:** \`true\``,
|
|
843
|
-
`- **storyBranch:** \`${result.storyBranch}\``,
|
|
844
|
-
`- **baseBranch:** \`${result.baseBranch}\``,
|
|
845
|
-
`- **workCwd:** \`${result.workCwd}\``,
|
|
846
|
-
`- **worktreeEnabled:** \`${result.worktreeEnabled}\``,
|
|
847
|
-
`- **remoteVerified:** \`${result.remoteVerified}\``,
|
|
848
|
-
`- **dependenciesInstalled:** \`${result.dependenciesInstalled}\``,
|
|
849
|
-
'',
|
|
850
|
-
'```json',
|
|
851
|
-
JSON.stringify(payload, null, 2),
|
|
852
|
-
'```',
|
|
853
|
-
'',
|
|
854
|
-
].join('\n');
|
|
855
|
-
}
|
|
856
|
-
|
|
857
645
|
runAsCli(import.meta.url, runSingleStoryInit, {
|
|
858
646
|
source: 'single-story-init',
|
|
859
647
|
usage: {
|