mandrel 1.93.0 → 2.0.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 +59 -73
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/diagnose-friction.js +0 -6
- 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 +5 -5
- 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 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +39 -4
- package/.agents/scripts/lib/duplicate-search.js +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- 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/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- 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 +14 -14
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- 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/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- 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 +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -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 +3 -3
- package/.agents/workflows/deliver.md +122 -131
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +3 -2
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- 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 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- 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/orchestration/context-hydration-engine.js +0 -660
- 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/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 -388
- 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/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/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-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- 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 -278
- 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/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/post-merge-pipeline.js +0 -205
- 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-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- 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 -301
- 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/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- 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 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- 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 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- 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 -351
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* post-merge-close.js — drives everything that happens after the merge
|
|
3
|
-
* commit lands on `epic/<id>`: post-merge pipeline (worktree reap, branch
|
|
4
|
-
* cleanup, ticket cascade, health/manifest refresh, perf-summary via
|
|
5
|
-
* analyze-execution.js), pending-cleanup drain reconciliation, phase-timer
|
|
6
|
-
* state file cleanup, and final result-object assembly.
|
|
7
|
-
*
|
|
8
|
-
* Extracted from story-close.js (Story #956, Theme A finishing touch) so
|
|
9
|
-
* the close orchestrator becomes a thin CLI shell.
|
|
10
|
-
*
|
|
11
|
-
* No retry logic, no merge logic, no validation logic — those live in
|
|
12
|
-
* `merge-runner.js` and `pre-merge-validation.js` respectively. This helper
|
|
13
|
-
* is purely the post-merge pipeline sequencing that previously lived
|
|
14
|
-
* inline at the tail of `runStoryClose`.
|
|
15
|
-
*
|
|
16
|
-
* Epic #1030 Story #1046 — the legacy inline `phase-timings` structured
|
|
17
|
-
* comment post was replaced by a `perf-summary` phase inside
|
|
18
|
-
* post-merge-pipeline.js that shells out to `analyze-execution.js`. The
|
|
19
|
-
* timer summary is written to a per-Story JSON file under
|
|
20
|
-
* `temp/epic-<eid>/stories/story-<sid>/phase-timings.json` so the analyzer can
|
|
21
|
-
* read it; this helper writes the file and hands the path to the pipeline.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
25
|
-
import { emitGhSpawnCount as defaultEmitGhSpawnCount } from '../../close-validation/telemetry.js';
|
|
26
|
-
import { storyArtifactPath, storyTempDir } from '../../config/temp-paths.js';
|
|
27
|
-
import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
|
|
28
|
-
import { clearActiveStoryEnv as defaultClearActiveStoryEnv } from '../../observability/active-story-env.js';
|
|
29
|
-
import {
|
|
30
|
-
checkHeadAncestor,
|
|
31
|
-
hasMergeCommitForStory,
|
|
32
|
-
hasRebasedEquivalents,
|
|
33
|
-
} from '../../worktree/lifecycle/merge-reachability.js';
|
|
34
|
-
import { runPostMergePipeline as defaultRunPostMergePipeline } from '../post-merge-pipeline.js';
|
|
35
|
-
import { resolvesGrepArgs } from '../resolves-token.js';
|
|
36
|
-
import {
|
|
37
|
-
drainPendingCleanupAfterClose as defaultDrainPendingCleanupAfterClose,
|
|
38
|
-
reconcileCleanupState as defaultReconcileCleanupState,
|
|
39
|
-
} from './cleanup-reconciler.js';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Assert that the Story branch was actually merged into the Epic branch
|
|
43
|
-
* before allowing the post-merge pipeline to flip Story / Tasks to
|
|
44
|
-
* `agent::done`. The contract: by the time `runPostMergeClose` is called,
|
|
45
|
-
* `runFinalizeMerge` (or `runResumeMerge`) has already executed the
|
|
46
|
-
* `git merge --no-ff` + push; this is a defensive readback that catches
|
|
47
|
-
* the (rare) case where the merge runner returned but the merge commit is
|
|
48
|
-
* not actually reachable from `epic/<id>` — e.g. a force-push from a
|
|
49
|
-
* sibling process clobbered the tip between our merge and our push, and
|
|
50
|
-
* the push's retry logic logged success while the remote silently dropped
|
|
51
|
-
* us.
|
|
52
|
-
*
|
|
53
|
-
* Three-phase check mirrors `worktree/lifecycle/merge-reachability.js`:
|
|
54
|
-
* 1. `git merge-base --is-ancestor` on the Story branch HEAD.
|
|
55
|
-
* 2. Fallback `git log --grep=resolves #<storyId>` on the Epic branch
|
|
56
|
-
* (the `--no-ff` merge commit's subject is the durable proof).
|
|
57
|
-
* 3. Fallback `git cherry <epicBranch> <storyBranch>` patch-id check
|
|
58
|
-
* (Story #3161) — every commit on the Story branch is patch-
|
|
59
|
-
* equivalent to a commit already on `epicBranch`. Surfaces the
|
|
60
|
-
* manual-recovery case where the operator rebased Story content
|
|
61
|
-
* directly onto the Epic so the diff is present as commits with
|
|
62
|
-
* different SHAs.
|
|
63
|
-
*
|
|
64
|
-
* Throws when no check passes — the caller's `try/finally` keeps the
|
|
65
|
-
* Story at `agent::closing` so a `/story-execute --resume` can re-enter
|
|
66
|
-
* the post-merge phase rather than re-running preflight.
|
|
67
|
-
*
|
|
68
|
-
* Story #2144 / Task #2155; Story #3161 extends with the rebased-
|
|
69
|
-
* equivalents path.
|
|
70
|
-
*
|
|
71
|
-
* @param {object} args
|
|
72
|
-
* @param {string} args.cwd Main-repo working directory.
|
|
73
|
-
* @param {string} args.storyBranch
|
|
74
|
-
* @param {string} args.epicBranch
|
|
75
|
-
* @param {string|number} args.storyId
|
|
76
|
-
* @param {typeof defaultGitSpawn} [args.gitSpawn]
|
|
77
|
-
* @returns {{ reachable: true, reason: string }}
|
|
78
|
-
* @throws {Error} when the merge is not reachable from `epicBranch`.
|
|
79
|
-
*/
|
|
80
|
-
export function assertMergeReachable({
|
|
81
|
-
cwd,
|
|
82
|
-
storyBranch,
|
|
83
|
-
epicBranch,
|
|
84
|
-
storyId,
|
|
85
|
-
gitSpawn = defaultGitSpawn,
|
|
86
|
-
}) {
|
|
87
|
-
const ctx = { repoRoot: cwd, git: { gitSpawn } };
|
|
88
|
-
// Resolve the story branch's tip locally. The Story branch ref still
|
|
89
|
-
// exists at this point — branch-cleanup phase (which deletes it) runs
|
|
90
|
-
// after ticket-closure inside the post-merge pipeline.
|
|
91
|
-
const headRes = gitSpawn(cwd, 'rev-parse', storyBranch);
|
|
92
|
-
if (headRes.status !== 0) {
|
|
93
|
-
// Branch ref already gone (e.g. a prior partial close deleted it) →
|
|
94
|
-
// fall straight to the merge-commit grep, which is the durable proof
|
|
95
|
-
// path. The cherry/patch-id fallback cannot run without the branch
|
|
96
|
-
// ref, so we skip it on this path.
|
|
97
|
-
if (hasMergeCommitForStory(ctx, storyBranch, epicBranch)) {
|
|
98
|
-
return { reachable: true, reason: 'merge-commit-reachable' };
|
|
99
|
-
}
|
|
100
|
-
throw new Error(
|
|
101
|
-
`story-close: merge verification failed for #${storyId} — ` +
|
|
102
|
-
`branch ref \`${storyBranch}\` not resolvable and no \`(resolves #${storyId})\` merge commit on \`${epicBranch}\`. ` +
|
|
103
|
-
`Story remains at \`agent::closing\`; re-run with \`--resume\` once the merge is on \`${epicBranch}\`.`,
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
const headSha = headRes.stdout.trim();
|
|
107
|
-
const ancestor = checkHeadAncestor(ctx, headSha, epicBranch);
|
|
108
|
-
if (ancestor.outcome === 'ancestor') {
|
|
109
|
-
return { reachable: true, reason: 'head-reachable-from-epic' };
|
|
110
|
-
}
|
|
111
|
-
if (hasMergeCommitForStory(ctx, storyBranch, epicBranch)) {
|
|
112
|
-
return { reachable: true, reason: 'merge-commit-reachable' };
|
|
113
|
-
}
|
|
114
|
-
if (hasRebasedEquivalents(ctx, storyBranch, epicBranch)) {
|
|
115
|
-
return { reachable: true, reason: 'rebased-equivalents' };
|
|
116
|
-
}
|
|
117
|
-
const headShort = headSha.slice(0, 7) || 'HEAD';
|
|
118
|
-
throw new Error(
|
|
119
|
-
`story-close: merge verification failed for #${storyId} — ` +
|
|
120
|
-
`\`${storyBranch}\` head=${headShort} is not reachable from \`${epicBranch}\` ` +
|
|
121
|
-
`and no \`(resolves #${storyId})\` merge commit found on \`${epicBranch}\` ` +
|
|
122
|
-
`(ancestor=${ancestor.outcome}); patch-id equivalents not detected. ` +
|
|
123
|
-
`Story remains at \`agent::closing\`; ` +
|
|
124
|
-
`re-run with \`--resume\` once the merge is on \`${epicBranch}\`.`,
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Resolve the actual squash/no-ff merge commit sha that landed on
|
|
130
|
-
* `epicBranch` for the named Story. The story-close path uses
|
|
131
|
-
* `git merge --no-ff` with a `(resolves #<id>)` subject; we grep the
|
|
132
|
-
* Epic branch log for that subject and return the matching short sha.
|
|
133
|
-
*
|
|
134
|
-
* Falls back to the Story branch tip if the grep yields no hits (which
|
|
135
|
-
* shouldn't happen on a successful merge, but the lifecycle emit must
|
|
136
|
-
* never crash the close on a measurement-only failure). Returns `null`
|
|
137
|
-
* if both lookups fail — the caller treats `null` as "skip the emit".
|
|
138
|
-
*
|
|
139
|
-
* Story #2241 / Task #2247.
|
|
140
|
-
*
|
|
141
|
-
* @param {{ cwd: string, epicBranch: string, storyBranch: string, storyId: number|string, gitSpawn?: typeof defaultGitSpawn }} args
|
|
142
|
-
* @returns {string|null}
|
|
143
|
-
*/
|
|
144
|
-
export function resolveMergeSha({
|
|
145
|
-
cwd,
|
|
146
|
-
epicBranch,
|
|
147
|
-
storyBranch,
|
|
148
|
-
storyId,
|
|
149
|
-
gitSpawn = defaultGitSpawn,
|
|
150
|
-
}) {
|
|
151
|
-
// Use the durable `(resolves #N)` marker on the merge-commit subject.
|
|
152
|
-
// `--all-match` is unnecessary because we grep a single literal string.
|
|
153
|
-
const grep = gitSpawn(
|
|
154
|
-
cwd,
|
|
155
|
-
'log',
|
|
156
|
-
'-n',
|
|
157
|
-
'1',
|
|
158
|
-
'--format=%H',
|
|
159
|
-
...resolvesGrepArgs(storyId),
|
|
160
|
-
epicBranch,
|
|
161
|
-
);
|
|
162
|
-
if (grep.status === 0) {
|
|
163
|
-
const sha = (grep.stdout || '').trim();
|
|
164
|
-
if (sha.length >= 7) return sha;
|
|
165
|
-
}
|
|
166
|
-
// Fallback: Story branch tip. The branch ref still exists when we're
|
|
167
|
-
// called from `runPostMergeClose` because branch cleanup is part of the
|
|
168
|
-
// downstream pipeline that hasn't run yet.
|
|
169
|
-
const tip = gitSpawn(cwd, 'rev-parse', storyBranch);
|
|
170
|
-
if (tip.status === 0) {
|
|
171
|
-
const sha = (tip.stdout || '').trim();
|
|
172
|
-
if (sha.length >= 7) return sha;
|
|
173
|
-
}
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* @param {{
|
|
179
|
-
* config: object,
|
|
180
|
-
* storyId: number|string,
|
|
181
|
-
* epicId: number|string,
|
|
182
|
-
* story: object,
|
|
183
|
-
* storyBranch: string,
|
|
184
|
-
* epicBranch: string,
|
|
185
|
-
* cwd: string,
|
|
186
|
-
* projectRoot: string,
|
|
187
|
-
* provider: object,
|
|
188
|
-
* notify: Function,
|
|
189
|
-
* tasks: object[],
|
|
190
|
-
* skipDashboard: boolean,
|
|
191
|
-
* progress: Function,
|
|
192
|
-
* logger: object,
|
|
193
|
-
* phaseTimer: object,
|
|
194
|
-
* clearPhaseTimerState: Function,
|
|
195
|
-
* bus?: object|null,
|
|
196
|
-
* runPostMergePipeline?: typeof defaultRunPostMergePipeline,
|
|
197
|
-
* drainPendingCleanupAfterClose?: typeof defaultDrainPendingCleanupAfterClose,
|
|
198
|
-
* reconcileCleanupState?: typeof defaultReconcileCleanupState,
|
|
199
|
-
* writeFileFn?: typeof writeFile,
|
|
200
|
-
* mkdirFn?: typeof mkdir,
|
|
201
|
-
* }} opts
|
|
202
|
-
* `config`: the resolved config wrapper returned by `resolveConfig()`.
|
|
203
|
-
* Used by downstream temp-paths helpers + signal writers so per-story
|
|
204
|
-
* artifacts honor the configured `tempRoot` instead of leaking under
|
|
205
|
-
* the framework `projectRoot` / `process.cwd()`.
|
|
206
|
-
* `bus`: optional lifecycle bus. When provided, the helper emits
|
|
207
|
-
* `story.merged` after the merge-reachability assertion clears (Story
|
|
208
|
-
* #2241 / Task #2247). Emit failures are swallowed — measurement-only
|
|
209
|
-
* artifacts must not withhold the close result.
|
|
210
|
-
* @returns {Promise<object>} the final close result object.
|
|
211
|
-
*/
|
|
212
|
-
export async function runPostMergeClose({
|
|
213
|
-
config,
|
|
214
|
-
storyId,
|
|
215
|
-
epicId,
|
|
216
|
-
story,
|
|
217
|
-
storyBranch,
|
|
218
|
-
epicBranch,
|
|
219
|
-
cwd,
|
|
220
|
-
projectRoot,
|
|
221
|
-
provider,
|
|
222
|
-
notify,
|
|
223
|
-
tasks,
|
|
224
|
-
skipDashboard,
|
|
225
|
-
progress,
|
|
226
|
-
logger,
|
|
227
|
-
phaseTimer,
|
|
228
|
-
clearPhaseTimerState,
|
|
229
|
-
bus = null,
|
|
230
|
-
runPostMergePipeline = defaultRunPostMergePipeline,
|
|
231
|
-
drainPendingCleanupAfterClose = defaultDrainPendingCleanupAfterClose,
|
|
232
|
-
reconcileCleanupState = defaultReconcileCleanupState,
|
|
233
|
-
writeFileFn = writeFile,
|
|
234
|
-
mkdirFn = mkdir,
|
|
235
|
-
clearActiveStoryEnv = defaultClearActiveStoryEnv,
|
|
236
|
-
emitGhSpawnCount = defaultEmitGhSpawnCount,
|
|
237
|
-
assertMergeReachableFn = assertMergeReachable,
|
|
238
|
-
resolveMergeShaFn = resolveMergeSha,
|
|
239
|
-
}) {
|
|
240
|
-
const deliveryBlock = config?.delivery;
|
|
241
|
-
// Story #2144 / Task #2155 — gate the post-merge pipeline behind a
|
|
242
|
-
// merge-reachability assertion. The Story is at `agent::closing` at
|
|
243
|
-
// this point; the assertion throws (and the Story stays at
|
|
244
|
-
// `agent::closing`) when the merge runner returned without leaving a
|
|
245
|
-
// reachable merge commit on `epic/<id>`. The `ticketClosurePhase` is
|
|
246
|
-
// the single writer for the `agent::done` transition; gating its
|
|
247
|
-
// pipeline entry is the cheapest way to guarantee the label sequence
|
|
248
|
-
// is exactly `executing → closing → done` on a successful close and
|
|
249
|
-
// `executing → closing` (sticky) on a killed close.
|
|
250
|
-
const reachable = assertMergeReachableFn({
|
|
251
|
-
cwd,
|
|
252
|
-
storyBranch,
|
|
253
|
-
epicBranch,
|
|
254
|
-
storyId,
|
|
255
|
-
});
|
|
256
|
-
progress?.(
|
|
257
|
-
'MERGE-CHECK',
|
|
258
|
-
`Story #${storyId} merge verified (${reachable.reason})`,
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
// Story #2241 / Task #2247 — emit `story.merged` once the merge is
|
|
262
|
-
// verified reachable. The bus is optional (legacy in-process callers
|
|
263
|
-
// and unit fixtures pass `null`); when present the LedgerWriter has
|
|
264
|
-
// already been wired by the caller so this emit lands in the same
|
|
265
|
-
// epic-scoped NDJSON ledger the wave loop populates. The emit is
|
|
266
|
-
// best-effort: a measurement-only failure (schema mismatch in a
|
|
267
|
-
// future refactor, ledger I/O blip) must not withhold the merged
|
|
268
|
-
// close result.
|
|
269
|
-
if (bus) {
|
|
270
|
-
try {
|
|
271
|
-
const sha = resolveMergeShaFn({
|
|
272
|
-
cwd,
|
|
273
|
-
epicBranch,
|
|
274
|
-
storyBranch,
|
|
275
|
-
storyId,
|
|
276
|
-
});
|
|
277
|
-
if (sha) {
|
|
278
|
-
await bus.emit('story.merged', {
|
|
279
|
-
storyId: Number(storyId),
|
|
280
|
-
sha,
|
|
281
|
-
});
|
|
282
|
-
} else {
|
|
283
|
-
logger.warn?.(
|
|
284
|
-
`[story-close] ⚠️ Could not resolve merge sha for #${storyId}; skipping story.merged emit.`,
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
} catch (err) {
|
|
288
|
-
logger.warn?.(
|
|
289
|
-
`[story-close] ⚠️ story.merged emit failed for #${storyId} (swallowed): ${err?.message ?? err}`,
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
// Finish the timer up-front so the analyzer phase inside the pipeline
|
|
294
|
-
// can read the summary from disk. None of the pipeline phases
|
|
295
|
-
// (worktree-reap, branch-cleanup, ticket-closure, …) are tracked by
|
|
296
|
-
// phase-timer.js — `mark('api-sync')` is the last marked phase — so
|
|
297
|
-
// closing the timer here does not lose any spans.
|
|
298
|
-
phaseTimer.mark('api-sync');
|
|
299
|
-
const timingSummary = phaseTimer.finish();
|
|
300
|
-
let phaseTimingsPath = null;
|
|
301
|
-
try {
|
|
302
|
-
const eid = Number(epicId);
|
|
303
|
-
const sid = Number(storyId);
|
|
304
|
-
const dir = storyTempDir(eid, sid, config);
|
|
305
|
-
await mkdirFn(dir, { recursive: true });
|
|
306
|
-
phaseTimingsPath = storyArtifactPath(
|
|
307
|
-
eid,
|
|
308
|
-
sid,
|
|
309
|
-
'phase-timings.json',
|
|
310
|
-
config,
|
|
311
|
-
);
|
|
312
|
-
await writeFileFn(phaseTimingsPath, JSON.stringify(timingSummary, null, 2));
|
|
313
|
-
} catch (err) {
|
|
314
|
-
phaseTimingsPath = null;
|
|
315
|
-
logger.warn?.(
|
|
316
|
-
`[story-close] ⚠️ Failed to write phase-timings JSON: ${err.message}`,
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Throw-away gh-spawn-count emitter (Story #1795). Snapshots the
|
|
321
|
-
// in-process gh-exec counter to disk so the analyzer child reads it
|
|
322
|
-
// when authoring the `story-perf-summary` structured comment. Best-
|
|
323
|
-
// effort: a write failure logs and resolves so the merge result is
|
|
324
|
-
// never withheld on a measurement-only artifact.
|
|
325
|
-
await emitGhSpawnCount({
|
|
326
|
-
epicId,
|
|
327
|
-
storyId,
|
|
328
|
-
config,
|
|
329
|
-
logger,
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// Reap must precede branch cleanup: git refuses to delete a branch that
|
|
333
|
-
// is still checked out by a live worktree. The pipeline runs the phases
|
|
334
|
-
// in this order — see post-merge-pipeline.js. The `perf-summary` phase
|
|
335
|
-
// inside the pipeline shells out to analyze-execution.js, which is the
|
|
336
|
-
// single writer of the `<!-- structured:story-perf-summary -->` comment.
|
|
337
|
-
// The pipeline phases take the resolved `delivery` block directly, same
|
|
338
|
-
// as the cleanup-reconciler (Story #3986 — the legacy `orchestration`-keyed
|
|
339
|
-
// input bag is gone).
|
|
340
|
-
const pipelineState = await runPostMergePipeline({
|
|
341
|
-
delivery: deliveryBlock,
|
|
342
|
-
storyId,
|
|
343
|
-
epicId,
|
|
344
|
-
story,
|
|
345
|
-
storyBranch,
|
|
346
|
-
epicBranch,
|
|
347
|
-
repoRoot: cwd,
|
|
348
|
-
projectRoot,
|
|
349
|
-
config,
|
|
350
|
-
provider,
|
|
351
|
-
notify,
|
|
352
|
-
tasks,
|
|
353
|
-
skipDashboard,
|
|
354
|
-
progress,
|
|
355
|
-
logger,
|
|
356
|
-
phaseTimingsPath,
|
|
357
|
-
});
|
|
358
|
-
if (
|
|
359
|
-
deliveryBlock?.worktreeIsolation?.enabled &&
|
|
360
|
-
!pipelineState.worktreeReap
|
|
361
|
-
) {
|
|
362
|
-
throw new Error(
|
|
363
|
-
'story-close invariant violated: worktreeReap state missing while worktree isolation is enabled.',
|
|
364
|
-
);
|
|
365
|
-
}
|
|
366
|
-
const pendingCleanupDrain = await drainPendingCleanupAfterClose({
|
|
367
|
-
repoRoot: cwd,
|
|
368
|
-
delivery: deliveryBlock,
|
|
369
|
-
progress,
|
|
370
|
-
logger,
|
|
371
|
-
});
|
|
372
|
-
const reconciledCleanup = reconcileCleanupState({
|
|
373
|
-
storyId,
|
|
374
|
-
worktreeReap: pipelineState.worktreeReap,
|
|
375
|
-
branchCleanup: pipelineState.branchCleanup,
|
|
376
|
-
pendingCleanupDrain,
|
|
377
|
-
});
|
|
378
|
-
const branchCleanup = reconciledCleanup.branchCleanup;
|
|
379
|
-
const worktreeReap = reconciledCleanup.worktreeReap;
|
|
380
|
-
const { closedTickets, cascadedTo, cascadeFailed } =
|
|
381
|
-
pipelineState.ticketClosure;
|
|
382
|
-
const manifestUpdated = pipelineState.manifestUpdated;
|
|
383
|
-
|
|
384
|
-
try {
|
|
385
|
-
clearPhaseTimerState({ mainCwd: cwd, storyId });
|
|
386
|
-
} catch (err) {
|
|
387
|
-
logger.warn?.(
|
|
388
|
-
`[story-close] ⚠️ Failed to clear phase-timer state file: ${err.message}`,
|
|
389
|
-
);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
// Clear the trace-hook env vars (Story #1043). The worktree was
|
|
393
|
-
// reaped above so the `.env.local` is already gone; this also
|
|
394
|
-
// clears the vars on the parent process so any tooling invoked
|
|
395
|
-
// *after* close — planning, dispatch, ad-hoc CLI — falls back to
|
|
396
|
-
// the hook's no-op branch instead of polluting a stale Story
|
|
397
|
-
// directory.
|
|
398
|
-
try {
|
|
399
|
-
clearActiveStoryEnv({ logger });
|
|
400
|
-
} catch (err) {
|
|
401
|
-
logger.warn?.(
|
|
402
|
-
`[story-close] ⚠️ Failed to clear active-Story env: ${err.message}`,
|
|
403
|
-
);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
return {
|
|
407
|
-
storyId,
|
|
408
|
-
epicId,
|
|
409
|
-
action: 'merged',
|
|
410
|
-
merged: true,
|
|
411
|
-
branchDeleted: branchCleanup.localDeleted && branchCleanup.remoteDeleted,
|
|
412
|
-
branchLocalDeleted: branchCleanup.localDeleted,
|
|
413
|
-
branchRemoteDeleted: branchCleanup.remoteDeleted,
|
|
414
|
-
worktreeReap,
|
|
415
|
-
pendingCleanupDrain,
|
|
416
|
-
ticketsClosed: closedTickets,
|
|
417
|
-
cascadedTo: cascadedTo ?? [],
|
|
418
|
-
cascadeFailed: cascadeFailed ?? [],
|
|
419
|
-
manifestUpdated,
|
|
420
|
-
};
|
|
421
|
-
}
|