mandrel 1.94.0 → 2.1.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 +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +328 -28
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Task #1463).
|
|
6
6
|
*
|
|
7
7
|
* Reads signals via `lib/signals/read`, materialises a span-tree via
|
|
8
|
-
* `lib/signals/buildSpanTree`, and prints a readable
|
|
8
|
+
* `lib/signals/buildSpanTree`, and prints a readable run → Story →
|
|
9
9
|
* events tree to stdout. The output is **plain text via
|
|
10
10
|
* `process.stdout.write`** — no Ink, no blessed, no terminal-control
|
|
11
11
|
* escape sequences — so it works on Windows + bash hosts (see
|
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
* stdout uses `process.stdout.write`, not the console).
|
|
17
17
|
*
|
|
18
18
|
* Usage:
|
|
19
|
-
* node .agents/scripts/signals-view.js <
|
|
19
|
+
* node .agents/scripts/signals-view.js <run-id> [--story <id>]
|
|
20
20
|
*
|
|
21
21
|
* Args:
|
|
22
|
-
* <
|
|
22
|
+
* <run-id> Positive integer run ID. Required.
|
|
23
23
|
* --story <id> Optional positive integer Story ID. When set,
|
|
24
24
|
* narrows the printed tree to a single Story
|
|
25
25
|
* subtree.
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* Exit codes:
|
|
28
28
|
* 0 — happy path, OR missing signals file (friendly message printed,
|
|
29
29
|
* no stack trace).
|
|
30
|
-
* 1 — bad arguments (non-integer
|
|
30
|
+
* 1 — bad arguments (non-integer run, missing positional, etc.).
|
|
31
31
|
*
|
|
32
32
|
* Tempfile contract:
|
|
33
33
|
* The viewer resolves the on-disk signals path via the configured
|
|
@@ -57,7 +57,7 @@ function println(line) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
const USAGE =
|
|
60
|
-
'Usage: node .agents/scripts/signals-view.js <
|
|
60
|
+
'Usage: node .agents/scripts/signals-view.js <run-id> [--story <id>] [--temp-root <path>]';
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
* Parse a token as a strict positive integer (no leading +, no float, no
|
|
@@ -86,7 +86,7 @@ const HELP_FLAGS = new Set(['--help', '-h']);
|
|
|
86
86
|
* print a friendly message and exit 1 without a stack trace.
|
|
87
87
|
*
|
|
88
88
|
* Delegates the flag walking to `parseStandardCliArgs` and post-validates
|
|
89
|
-
* the
|
|
89
|
+
* the signals-view-specific invariants (single positional run-id, strictly
|
|
90
90
|
* positive integers for both ids).
|
|
91
91
|
*
|
|
92
92
|
* @param {string[]} argv
|
|
@@ -94,7 +94,7 @@ const HELP_FLAGS = new Set(['--help', '-h']);
|
|
|
94
94
|
*/
|
|
95
95
|
export function parseArgs(argv) {
|
|
96
96
|
if (!Array.isArray(argv) || argv.length === 0) {
|
|
97
|
-
return err(`missing <
|
|
97
|
+
return err(`missing <run-id>. ${USAGE}`);
|
|
98
98
|
}
|
|
99
99
|
if (argv.some((t) => HELP_FLAGS.has(t))) return err(USAGE);
|
|
100
100
|
|
|
@@ -118,7 +118,7 @@ export function parseArgs(argv) {
|
|
|
118
118
|
// Exactly one positional, which must be a strictly positive integer
|
|
119
119
|
// (no leading `+`, no float, no trailing junk).
|
|
120
120
|
if (positionals.length === 0) {
|
|
121
|
-
return err(`missing <
|
|
121
|
+
return err(`missing <run-id>. ${USAGE}`);
|
|
122
122
|
}
|
|
123
123
|
if (positionals.length > 1) {
|
|
124
124
|
return err(`unexpected token ${JSON.stringify(positionals[1])}. ${USAGE}`);
|
|
@@ -126,7 +126,7 @@ export function parseArgs(argv) {
|
|
|
126
126
|
const epic = parseStrictPositiveInt(positionals[0]);
|
|
127
127
|
if (epic == null) {
|
|
128
128
|
return err(
|
|
129
|
-
`<
|
|
129
|
+
`<run-id> must be a positive integer; got ${JSON.stringify(positionals[0])}. ${USAGE}`,
|
|
130
130
|
);
|
|
131
131
|
}
|
|
132
132
|
|
|
@@ -174,13 +174,13 @@ function describeEvent(evt) {
|
|
|
174
174
|
* `process.stdout.write`). Logger is intentionally not used: the
|
|
175
175
|
* viewer's contract is "dumb terminal compatible, parseable output".
|
|
176
176
|
*
|
|
177
|
-
* @param {{
|
|
177
|
+
* @param {{ run: number | null, stories: Array<object> }} tree
|
|
178
178
|
* @param {{ storyFilter?: number | null }} [opts]
|
|
179
179
|
* @returns {void}
|
|
180
180
|
*/
|
|
181
181
|
export function renderTree(tree, opts = {}) {
|
|
182
182
|
const filter = opts.storyFilter ?? null;
|
|
183
|
-
println(`
|
|
183
|
+
println(`Run #${tree.run ?? '?'}`);
|
|
184
184
|
const stories =
|
|
185
185
|
filter == null ? tree.stories : tree.stories.filter((s) => s.id === filter);
|
|
186
186
|
|
|
@@ -226,12 +226,16 @@ export async function main(argv, deps = {}) {
|
|
|
226
226
|
println(parsed.error);
|
|
227
227
|
return 1;
|
|
228
228
|
}
|
|
229
|
-
const { epic, story, tempRoot } = parsed;
|
|
229
|
+
const { epic: runId, story, tempRoot } = parsed;
|
|
230
230
|
const read = deps.read ?? signals.read;
|
|
231
231
|
const buildSpanTree = deps.buildSpanTree ?? signals.buildSpanTree;
|
|
232
232
|
const config = buildConfig(tempRoot);
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
// The reader resolves the run directory through temp-paths
|
|
235
|
+
// (`temp/run-<id>/`) keyed by the `run` id.
|
|
236
|
+
const iter = read(
|
|
237
|
+
story != null ? { run: runId, story, config } : { run: runId, config },
|
|
238
|
+
);
|
|
235
239
|
|
|
236
240
|
// Eagerly collect to detect the missing-file case before we start
|
|
237
241
|
// printing — when the iterator yields nothing we want a friendly
|
|
@@ -241,7 +245,7 @@ export async function main(argv, deps = {}) {
|
|
|
241
245
|
tree = await buildSpanTree(iter);
|
|
242
246
|
} catch (err) {
|
|
243
247
|
println(
|
|
244
|
-
`signals: failed to read signals for
|
|
248
|
+
`signals: failed to read signals for run #${runId}: ${
|
|
245
249
|
err instanceof Error ? err.message : String(err)
|
|
246
250
|
}`,
|
|
247
251
|
);
|
|
@@ -250,7 +254,7 @@ export async function main(argv, deps = {}) {
|
|
|
250
254
|
|
|
251
255
|
if (tree.stories.length === 0) {
|
|
252
256
|
const scope = story != null ? ` (Story #${story})` : '';
|
|
253
|
-
println(`No signals found for
|
|
257
|
+
println(`No signals found for run #${runId}${scope}.`);
|
|
254
258
|
return 0;
|
|
255
259
|
}
|
|
256
260
|
|
|
@@ -258,15 +262,15 @@ export async function main(argv, deps = {}) {
|
|
|
258
262
|
// `story` is omitted. If the requested Story filter doesn't match any
|
|
259
263
|
// observed Story id, treat that as the missing-file case too.
|
|
260
264
|
if (story != null && !tree.stories.some((s) => s.id === story)) {
|
|
261
|
-
println(`No signals found for
|
|
265
|
+
println(`No signals found for run #${runId} (Story #${story}).`);
|
|
262
266
|
return 0;
|
|
263
267
|
}
|
|
264
268
|
|
|
265
|
-
// Pin the
|
|
266
|
-
//
|
|
267
|
-
// but if every event lacks
|
|
268
|
-
// `null` while we still know what was requested.
|
|
269
|
-
if (tree.
|
|
269
|
+
// Pin the run id on the tree to the requested one — `buildSpanTree`
|
|
270
|
+
// stores it in the `run` field from the first observed event, which is
|
|
271
|
+
// normally the same, but if every event lacks that field the tree's
|
|
272
|
+
// `run` would be `null` while we still know what was requested.
|
|
273
|
+
if (tree.run == null) tree = { ...tree, run: runId };
|
|
270
274
|
|
|
271
275
|
renderTree(tree, { storyFilter: story });
|
|
272
276
|
return 0;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* single-story-close.js — Close a
|
|
4
|
+
* single-story-close.js — Close a Story against `main` (v2 `/deliver` path).
|
|
5
5
|
*
|
|
6
|
-
* Thin CLI entry for
|
|
7
|
-
* `story
|
|
8
|
-
*
|
|
9
|
-
* Story has no parent to cascade to and reaches `main` via a human-approved
|
|
10
|
-
* PR rather than an in-script merge.
|
|
6
|
+
* Thin CLI entry for `/deliver` / `helpers/deliver-story`. Opens a PR from
|
|
7
|
+
* `story-<id>` to `project.baseBranch`, runs Story-scope review, and arms
|
|
8
|
+
* auto-merge. There is no Epic parent, epic-merge-lock, or wave merge.
|
|
11
9
|
*
|
|
12
10
|
* Pipeline (each step is a phase under
|
|
13
11
|
* `./lib/orchestration/single-story-close/phases/`):
|
|
@@ -23,14 +21,17 @@
|
|
|
23
21
|
* the post-merge confirmation step,
|
|
24
22
|
* `single-story-confirm-merge.js`)
|
|
25
23
|
* 8. worktree-reap — drop the per-Story worktree
|
|
26
|
-
* 9. confirm-merge — Story #4428
|
|
24
|
+
* 9. confirm-merge — close-and-land (Story #4428; the DEFAULT for
|
|
25
|
+
* every run since `delivery.routing.closeAndLand`):
|
|
27
26
|
* poll the just-armed PR to merge confirmation
|
|
28
|
-
* (reusing `confirmStoryMerged`)
|
|
29
|
-
* `agent::blocked`
|
|
30
|
-
* `merge.unlanded`
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
27
|
+
* (reusing `confirmStoryMerged`), capture the
|
|
28
|
+
* Story follow-ups, or terminate `agent::blocked`
|
|
29
|
+
* with a classified `merge.unlanded` event — or
|
|
30
|
+
* `merge.flip-failed` when the merge landed and
|
|
31
|
+
* only the label write failed. Skipped when the
|
|
32
|
+
* operator owns the merge (`--no-wait-merge`,
|
|
33
|
+
* `--no-auto-merge`, or `autoMerge: "strict"`),
|
|
34
|
+
* which rests at `agent::closing` for the human.
|
|
34
35
|
*
|
|
35
36
|
* Existing tests import the re-exported helpers
|
|
36
37
|
* (`runSingleStoryClose`, `ensurePullRequest`, `parsePrNumber`,
|
|
@@ -40,25 +41,55 @@
|
|
|
40
41
|
* Usage:
|
|
41
42
|
* node single-story-close.js --story <STORY_ID> [--cwd <main-repo>]
|
|
42
43
|
* [--skip-validation] [--skip-sync]
|
|
43
|
-
* [--no-auto-merge]
|
|
44
|
+
* [--no-auto-merge]
|
|
44
45
|
* [--wait-merge | --no-wait-merge]
|
|
45
46
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* (
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
47
|
+
* Close-and-land is the DEFAULT for every run (Story #4428 introduced it as
|
|
48
|
+
* `--wait-merge`; `delivery.routing.closeAndLand` — default `true` — made it
|
|
49
|
+
* the default, and Story #4539 made that knob actually readable). Resolution
|
|
50
|
+
* order, highest first: `--no-wait-merge` (explicit opt-out, always wins);
|
|
51
|
+
* operator-owns-the-merge (`--no-auto-merge` or `delivery.ci.autoMerge:
|
|
52
|
+
* "strict"` — the PR was deliberately left un-armed, so there is nothing to
|
|
53
|
+
* land and the Story rests at `agent::closing`); explicit `--wait-merge`;
|
|
54
|
+
* then the config. A genuine arm FAILURE is not an opt-out — it still waits
|
|
55
|
+
* and therefore still blocks, which is what keeps the must-land contract
|
|
56
|
+
* intact.
|
|
54
57
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
58
|
+
* Every invocation emits ONE schema-validated terminal envelope
|
|
59
|
+
* (`.agents/schemas/story-deliver-terminal.schema.json`, Story #4543) on
|
|
60
|
+
* stdout between `--- STORY DELIVER TERMINAL ---` markers. Its `status` is
|
|
61
|
+
* the contract; the exit code mirrors it:
|
|
57
62
|
*
|
|
58
|
-
*
|
|
63
|
+
* 0 — `landed`: the PR merged, the Story is `agent::done`, and the
|
|
64
|
+
* post-land tail ran (follow-ups, status resync, local ref
|
|
65
|
+
* cleanup, base fast-forward).
|
|
66
|
+
* 3 — `pending`: RESUMABLE, not a failure. Either the per-invocation merge
|
|
67
|
+
* wait (`delivery.mergeWatch.maxWaitSeconds`, default 300s
|
|
68
|
+
* to fit a single host tool invocation) expired with the PR
|
|
69
|
+
* still healthy and in flight, or the operator owns the
|
|
70
|
+
* merge (`--no-wait-merge` / `--no-auto-merge` /
|
|
71
|
+
* `autoMerge: "strict"`). NO label was mutated and no
|
|
72
|
+
* `merge.unlanded` event was emitted. The envelope's
|
|
73
|
+
* `nextCommand` names the single command that resumes it,
|
|
74
|
+
* and the cumulative budget is anchored at the PR's
|
|
75
|
+
* createdAt so the resume does not restart the clock.
|
|
76
|
+
* 1 — `blocked` or `failed`: a classified hard block (the Story carries
|
|
77
|
+
* `agent::blocked` and a friction comment) or a phase crash.
|
|
78
|
+
*
|
|
79
|
+
* The distinct `pending` code is the point: before it, a close-and-land whose
|
|
80
|
+
* CI outlived the host's tool-invocation ceiling was killed mid-poll with no
|
|
81
|
+
* terminal path taken at all, and merely shrinking the budget instead would
|
|
82
|
+
* have misfiled every slow-CI run as a hard block.
|
|
83
|
+
*
|
|
84
|
+
* @see .agents/workflows/helpers/deliver-story.md
|
|
85
|
+
* @see .agents/schemas/story-deliver-terminal.schema.json
|
|
59
86
|
*/
|
|
60
87
|
|
|
88
|
+
import { parseSprintArgs } from './lib/cli-args.js';
|
|
61
89
|
import { runAsCli } from './lib/cli-utils.js';
|
|
90
|
+
import { formatCliError } from './lib/error-redactor.js';
|
|
91
|
+
import { Logger } from './lib/Logger.js';
|
|
92
|
+
import { emitTerminalFriction } from './lib/observability/runtime-friction.js';
|
|
62
93
|
import { enableAutoMergeWith } from './lib/orchestration/single-story-close/phases/auto-merge.js';
|
|
63
94
|
import {
|
|
64
95
|
buildSyncFailureCommentBody,
|
|
@@ -70,6 +101,12 @@ import {
|
|
|
70
101
|
runStoryScopeReview,
|
|
71
102
|
} from './lib/orchestration/single-story-close/phases/code-review.js';
|
|
72
103
|
import { ensurePullRequestWith } from './lib/orchestration/single-story-close/phases/pull-request.js';
|
|
104
|
+
import {
|
|
105
|
+
buildTerminalEnvelope,
|
|
106
|
+
emitTerminalEnvelope,
|
|
107
|
+
exitCodeForTerminal,
|
|
108
|
+
NEXT_COMMANDS,
|
|
109
|
+
} from './lib/orchestration/story-deliver-terminal.js';
|
|
73
110
|
|
|
74
111
|
// Story #2990 moved the `gh`-spawn boundary into the `lib/gh-exec.js`
|
|
75
112
|
// facade (the same shim the `providers/github/` gateways use). The
|
|
@@ -97,6 +134,121 @@ export async function runSingleStoryClose(opts) {
|
|
|
97
134
|
return mod.runSingleStoryClose(opts);
|
|
98
135
|
}
|
|
99
136
|
|
|
100
|
-
|
|
137
|
+
/**
|
|
138
|
+
* The close pipeline's phase order, as `setPhase` walks it. Only used to
|
|
139
|
+
* decide whether a gate had already run when a later phase died.
|
|
140
|
+
*/
|
|
141
|
+
const PHASE_ORDER = Object.freeze([
|
|
142
|
+
'init',
|
|
143
|
+
'wrong-tree-guard',
|
|
144
|
+
'close-validation',
|
|
145
|
+
'base-sync',
|
|
146
|
+
'push',
|
|
147
|
+
'pull-request',
|
|
148
|
+
'code-review',
|
|
149
|
+
'auto-merge',
|
|
150
|
+
'confirm-merge',
|
|
151
|
+
'post-land',
|
|
152
|
+
'done',
|
|
153
|
+
]);
|
|
154
|
+
|
|
155
|
+
/** Each reported gate and the pipeline phase that decides it. */
|
|
156
|
+
const GATE_PHASES = Object.freeze([
|
|
157
|
+
['validation', 'close-validation'],
|
|
158
|
+
['baseSync', 'base-sync'],
|
|
159
|
+
['codeReview', 'code-review'],
|
|
160
|
+
]);
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Report every gate's outcome for a run that died at `phase`.
|
|
164
|
+
*
|
|
165
|
+
* The schema's contract: "A gate the run skipped … reports `skipped` rather
|
|
166
|
+
* than being omitted, so a missing gate is never mistaken for a passing one."
|
|
167
|
+
* The previous shape named only the gate that died and omitted the rest
|
|
168
|
+
* entirely — exactly the ambiguity the contract forbids.
|
|
169
|
+
*
|
|
170
|
+
* Reconstructed from the phase order, which is sound because the pipeline is
|
|
171
|
+
* strictly sequential: reaching phase N means every gate before it completed.
|
|
172
|
+
* A gate whose phase the run never reached is `skipped`; one the operator
|
|
173
|
+
* turned off via `--skip-validation` / `--skip-sync` is `skipped` too (it did
|
|
174
|
+
* not pass — it never ran).
|
|
175
|
+
*
|
|
176
|
+
* @param {string} phase The phase the run died in.
|
|
177
|
+
* @param {{ skipValidation?: boolean, skipSync?: boolean }} args Parsed CLI args.
|
|
178
|
+
* @returns {Record<string, 'passed'|'failed'|'skipped'>}
|
|
179
|
+
*/
|
|
180
|
+
export function gatesForFailedPhase(phase, args = {}) {
|
|
181
|
+
const skipped = { validation: args.skipValidation, baseSync: args.skipSync };
|
|
182
|
+
const failedAt = PHASE_ORDER.indexOf(phase);
|
|
183
|
+
const gates = {};
|
|
184
|
+
for (const [gate, gatePhase] of GATE_PHASES) {
|
|
185
|
+
const at = PHASE_ORDER.indexOf(gatePhase);
|
|
186
|
+
if (gatePhase === phase) gates[gate] = 'failed';
|
|
187
|
+
else if (failedAt < 0 || at > failedAt) gates[gate] = 'skipped';
|
|
188
|
+
else gates[gate] = skipped[gate] ? 'skipped' : 'passed';
|
|
189
|
+
}
|
|
190
|
+
return gates;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Build the `failed` terminal for a phase that crashed.
|
|
195
|
+
*
|
|
196
|
+
* The runner deliberately throws rather than returning a failure (a red gate
|
|
197
|
+
* must not look like a return value), so without this the most common
|
|
198
|
+
* non-happy ending — a failing close-validation gate — would emit **no
|
|
199
|
+
* envelope at all**, exiting 1 with only a stderr line while the workflow
|
|
200
|
+
* docs promise the agent a `failed` envelope naming the phase. Every close
|
|
201
|
+
* invocation emits exactly one envelope; this is the path that keeps that
|
|
202
|
+
* true when a phase dies.
|
|
203
|
+
*
|
|
204
|
+
* `err.closePhase` is tagged by the runner's phase tracker.
|
|
205
|
+
*
|
|
206
|
+
* @param {unknown} err
|
|
207
|
+
* @returns {object|null} A validated envelope, or null when even the story id
|
|
208
|
+
* is unknown (a usage error — there is nothing to report an envelope about).
|
|
209
|
+
*/
|
|
210
|
+
function failedTerminalFor(err) {
|
|
211
|
+
const phase = err?.closePhase ?? 'init';
|
|
212
|
+
const args = parseSprintArgs();
|
|
213
|
+
const storyId = Number(args.storyId);
|
|
214
|
+
if (!Number.isInteger(storyId) || storyId <= 0) return null;
|
|
215
|
+
return buildTerminalEnvelope({
|
|
216
|
+
storyId,
|
|
217
|
+
status: 'failed',
|
|
218
|
+
phase,
|
|
219
|
+
gates: gatesForFailedPhase(phase, args),
|
|
220
|
+
failure: { reason: String(err?.message ?? err) },
|
|
221
|
+
nextCommand: NEXT_COMMANDS.recover(storyId),
|
|
222
|
+
elapsedSeconds: 0,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* CLI entry — resolves the process exit code from the terminal envelope's
|
|
228
|
+
* status rather than from a thrown/not-thrown distinction, so `pending`
|
|
229
|
+
* (resumable) is distinguishable from `blocked` (come look) without parsing
|
|
230
|
+
* stdout.
|
|
231
|
+
*/
|
|
232
|
+
async function main() {
|
|
233
|
+
try {
|
|
234
|
+
const outcome = await runSingleStoryClose();
|
|
235
|
+
return exitCodeForTerminal(outcome?.terminal ?? { status: 'failed' });
|
|
236
|
+
} catch (err) {
|
|
237
|
+
const terminal = failedTerminalFor(err);
|
|
238
|
+
if (!terminal) throw err;
|
|
239
|
+
// Mirror runAsCli's default error line (which this catch pre-empts) so the
|
|
240
|
+
// human-facing failure text is unchanged, then emit the envelope.
|
|
241
|
+
Logger.error(`[single-story-close] Fatal error: ${formatCliError(err)}`);
|
|
242
|
+
emitTerminalEnvelope(terminal);
|
|
243
|
+
// Story #4578 — a close that died before the runner could report its own
|
|
244
|
+
// terminal is exactly the friction the retro must see, so the crash path
|
|
245
|
+
// gets the same emit the happy path does. Best-effort; cannot throw.
|
|
246
|
+
await emitTerminalFriction({ envelope: terminal });
|
|
247
|
+
return exitCodeForTerminal(terminal);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
runAsCli(import.meta.url, main, {
|
|
101
252
|
source: 'single-story-close',
|
|
253
|
+
propagateExitCode: true,
|
|
102
254
|
});
|