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,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/orchestration/dispatch-engine.js — Core Dispatch Engine (SDK coordinator)
|
|
3
|
-
*
|
|
4
|
-
* Thin facade composing:
|
|
5
|
-
* - `dispatch-pipeline.js` — internal resolve/fetch/reconcile/graph helpers
|
|
6
|
-
*
|
|
7
|
-
* Every Epic is 2-tier (Epic → Story); `dispatch()` computes a
|
|
8
|
-
* Story-level wave plan and emits a 2-tier manifest. The legacy Task-tier
|
|
9
|
-
* dispatch runtime (Task fetcher, single-Story executor, the per-Task
|
|
10
|
-
* wave fan-out, and the Epic-completion detector) was removed in Epic
|
|
11
|
-
* #3163.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
15
|
-
import { ConflictingTypeLabelsError } from '../errors/index.js';
|
|
16
|
-
import { ensureLocalBranch } from '../git-branch-lifecycle.js';
|
|
17
|
-
import { Logger } from '../Logger.js';
|
|
18
|
-
import { TYPE_LABELS } from '../label-constants.js';
|
|
19
|
-
import { createProvider } from '../provider-factory.js';
|
|
20
|
-
import {
|
|
21
|
-
buildStoryDispatchGraph,
|
|
22
|
-
fetchEpicContext,
|
|
23
|
-
isTwoTierDispatch,
|
|
24
|
-
resolveDispatchContext,
|
|
25
|
-
} from './dispatch-pipeline.js';
|
|
26
|
-
import { buildManifest } from './manifest-builder.js';
|
|
27
|
-
import { STATE_LABELS } from './ticketing.js';
|
|
28
|
-
|
|
29
|
-
export const AGENT_DONE_LABEL = STATE_LABELS.DONE;
|
|
30
|
-
|
|
31
|
-
/* node:coverage ignore next */
|
|
32
|
-
export function ensureBranch(branchName, baseBranch) {
|
|
33
|
-
ensureLocalBranch(branchName, baseBranch, PROJECT_ROOT, {
|
|
34
|
-
log: (msg) => Logger.info(msg),
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Resolve a single ticket ID, detect its type, and delegate to the
|
|
40
|
-
* appropriate execution pipeline. Single entry point shared by the CLI
|
|
41
|
-
* wrapper and the MCP `dispatch_wave` tool.
|
|
42
|
-
*/
|
|
43
|
-
export async function resolveAndDispatch(options) {
|
|
44
|
-
const { ticketId, dryRun = false } = options;
|
|
45
|
-
const config = resolveConfig();
|
|
46
|
-
const provider = options.provider ?? createProvider(config);
|
|
47
|
-
|
|
48
|
-
const ticket = await provider.getTicket(ticketId);
|
|
49
|
-
const labels = ticket.labels || [];
|
|
50
|
-
|
|
51
|
-
const typeLabels = labels.filter((l) => l.startsWith('type::'));
|
|
52
|
-
if (typeLabels.length > 1) {
|
|
53
|
-
throw new ConflictingTypeLabelsError(
|
|
54
|
-
`Ticket #${ticketId} has conflicting type labels: ${typeLabels.join(', ')}. Exactly one type::* label is required.`,
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const isStory = labels.includes(TYPE_LABELS.STORY);
|
|
59
|
-
const isEpic = labels.includes(TYPE_LABELS.EPIC);
|
|
60
|
-
|
|
61
|
-
if (isStory) {
|
|
62
|
-
throw new Error(
|
|
63
|
-
`[Dispatcher] Ticket #${ticketId} is a **Story**. Stories are dispatched ` +
|
|
64
|
-
'through the Story delivery path, not directly via the dispatcher. ' +
|
|
65
|
-
`Run \`/deliver ${ticketId}\` to execute this Story, ` +
|
|
66
|
-
`or dispatch its parent Epic with \`/deliver #<epicId>\`.`,
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (isEpic) {
|
|
71
|
-
return dispatch({ epicId: ticketId, dryRun, provider });
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const typeLabel = labels.find((l) => l.startsWith('type::')) || 'unknown';
|
|
75
|
-
throw new Error(
|
|
76
|
-
`[Dispatcher] Ticket #${ticketId} has type "${typeLabel.replace('type::', '')}". ` +
|
|
77
|
-
`Only "epic" or "story" tickets can be dispatched. ` +
|
|
78
|
-
`Please ensure the ticket is correctly categorized before execution.`,
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Main dispatcher. Orchestrates one dispatch cycle for an Epic.
|
|
84
|
-
* Primary public export of the orchestration SDK.
|
|
85
|
-
*/
|
|
86
|
-
export async function dispatch(options) {
|
|
87
|
-
const ctx = resolveDispatchContext(options, ensureBranch);
|
|
88
|
-
const { epicId, dryRun } = ctx;
|
|
89
|
-
|
|
90
|
-
const fetched = await fetchEpicContext(ctx);
|
|
91
|
-
|
|
92
|
-
// Every Epic is 2-tier (Epic → Story). Compute Story-level
|
|
93
|
-
// waves directly from the Story tickets and emit a 2-tier-shaped
|
|
94
|
-
// manifest with `waves[].stories[]` so downstream consumers (manifest
|
|
95
|
-
// renderer, /deliver wave planner) see the correct execution plan.
|
|
96
|
-
// Per-Story execution is owned by `/deliver` (story-init →
|
|
97
|
-
// story-close), not by this dispatcher.
|
|
98
|
-
if (isTwoTierDispatch(fetched.allTickets)) {
|
|
99
|
-
Logger.info(
|
|
100
|
-
'Detected 2-tier hierarchy — computing Story-level execution waves.',
|
|
101
|
-
);
|
|
102
|
-
const { allWaves: storyWaves } = buildStoryDispatchGraph(
|
|
103
|
-
fetched.allTickets,
|
|
104
|
-
);
|
|
105
|
-
return buildManifest({
|
|
106
|
-
epicId,
|
|
107
|
-
epic: fetched.epic,
|
|
108
|
-
tasks: [],
|
|
109
|
-
allTickets: fetched.allTickets,
|
|
110
|
-
waves: storyWaves,
|
|
111
|
-
dispatched: [],
|
|
112
|
-
dryRun,
|
|
113
|
-
hierarchy: '2-tier',
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// No Story tickets under the Epic — throw loudly rather than emit an
|
|
118
|
-
// empty manifest, matching the wave-loop's behavior (build-wave-dag.js
|
|
119
|
-
// throws the same message shape on this input). A silently-empty
|
|
120
|
-
// manifest masks a pre-cutover Epic whose children are legacy Features.
|
|
121
|
-
const typedChildren = (fetched.allTickets ?? [])
|
|
122
|
-
.map((t) => (t.labels ?? []).find((l) => l.startsWith('type::')))
|
|
123
|
-
.filter(Boolean);
|
|
124
|
-
const legacyHint =
|
|
125
|
-
typedChildren.length > 0
|
|
126
|
-
? ` Found ${typedChildren.length} non-Story child ticket(s) ` +
|
|
127
|
-
`(${[...new Set(typedChildren)].join(', ')}) — this Epic looks ` +
|
|
128
|
-
`pre-cutover (legacy Feature children) and needs migration to the ` +
|
|
129
|
-
`2-tier (Epic → Story) hierarchy before dispatch.`
|
|
130
|
-
: '';
|
|
131
|
-
throw new Error(
|
|
132
|
-
`Epic #${epicId} has no child stories to dispatch.${legacyHint}`,
|
|
133
|
-
);
|
|
134
|
-
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* dispatch-pipeline.js
|
|
3
|
-
*
|
|
4
|
-
* Internal pipeline helpers composed by `dispatch-engine.js::dispatch()`.
|
|
5
|
-
* Keeping these out of the coordinator keeps the public entry point compact
|
|
6
|
-
* and focused on the 2-tier flow: resolve → fetch → Story-graph.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
10
|
-
import { getEpicBranch } from '../git-utils.js';
|
|
11
|
-
import { Logger } from '../Logger.js';
|
|
12
|
-
import { TYPE_LABELS } from '../label-constants.js';
|
|
13
|
-
import { createProvider } from '../provider-factory.js';
|
|
14
|
-
import { buildStoryAdjacency } from '../story-adjacency.js';
|
|
15
|
-
import { WorktreeManager } from '../worktree-manager.js';
|
|
16
|
-
import { computeStoryWaves } from './dependency-analyzer.js';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Runtime context for a single dispatch cycle.
|
|
20
|
-
*
|
|
21
|
-
* Produced by {@link resolveDispatchContext} and consumed by every pipeline
|
|
22
|
-
* stage (fetch → graph → scaffold → GC → dispatch). All fields
|
|
23
|
-
* are resolved once up-front so downstream helpers can stay free of
|
|
24
|
-
* configuration look-ups.
|
|
25
|
-
*
|
|
26
|
-
* @typedef {object} DispatchContext
|
|
27
|
-
* @property {number} epicId Epic ticket number under dispatch.
|
|
28
|
-
* @property {boolean} dryRun When true, mutating side-effects are skipped.
|
|
29
|
-
* @property {object} config Resolved canonical `.agentrc.json` (with `project`, `github`, `planning`, `delivery` blocks).
|
|
30
|
-
* @property {import('../ITicketingProvider.js').ITicketingProvider} provider Ticketing provider (may come from cache).
|
|
31
|
-
* @property {import('../worktree-manager.js').WorktreeManager | undefined} worktreeManager Optional worktree manager (only when isolation is enabled and not dry-run).
|
|
32
|
-
* @property {string} baseBranch Trunk branch the Epic branches from (default `main`).
|
|
33
|
-
* @property {string} epicBranch Epic branch name (`epic/<epicId>`).
|
|
34
|
-
* @property {(branchName: string, baseBranch: string) => void} ensureBranch Caller-supplied branch-creation helper.
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* The output of {@link fetchEpicContext}.
|
|
39
|
-
*
|
|
40
|
-
* @typedef {object} FetchedEpic
|
|
41
|
-
* @property {object} epic The Epic ticket record.
|
|
42
|
-
* @property {object[]} allTickets Every ticket under the Epic (stories + health).
|
|
43
|
-
* @property {Map<number, object>} allTicketsById Index of `allTickets` by ticket id.
|
|
44
|
-
*/
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Resolve the runtime context for a dispatch: canonical config, provider, adapter,
|
|
48
|
-
* worktree manager, base/epic branch names, and the `ensureBranch` bound
|
|
49
|
-
* helper supplied by the caller.
|
|
50
|
-
*
|
|
51
|
-
* @param {object} options Dispatch entry options.
|
|
52
|
-
* @param {number} options.epicId Epic ticket number.
|
|
53
|
-
* @param {boolean} [options.dryRun=false] When true, skip branch creation and worktree setup.
|
|
54
|
-
* @param {import('../ITicketingProvider.js').ITicketingProvider} [options.provider] Pre-constructed provider (overrides factory).
|
|
55
|
-
* @param {import('../worktree-manager.js').WorktreeManager} [options.worktreeManager] Pre-constructed worktree manager.
|
|
56
|
-
* @param {(branchName: string, baseBranch: string) => void} ensureBranch Branch-creation helper bound by caller (keeps engine ↔ git-lifecycle coupling at the edge).
|
|
57
|
-
* @returns {DispatchContext} Fully resolved dispatch context.
|
|
58
|
-
*/
|
|
59
|
-
export function resolveDispatchContext(options, ensureBranch) {
|
|
60
|
-
const { epicId, dryRun = false } = options;
|
|
61
|
-
|
|
62
|
-
const config = resolveConfig();
|
|
63
|
-
const provider = options.provider ?? createProvider(config);
|
|
64
|
-
|
|
65
|
-
const wtConfig = config?.delivery?.worktreeIsolation;
|
|
66
|
-
let worktreeManager = options.worktreeManager;
|
|
67
|
-
if (!worktreeManager && wtConfig?.enabled && !dryRun) {
|
|
68
|
-
worktreeManager = new WorktreeManager({
|
|
69
|
-
repoRoot: PROJECT_ROOT,
|
|
70
|
-
config: wtConfig,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
epicId,
|
|
76
|
-
dryRun,
|
|
77
|
-
config,
|
|
78
|
-
provider,
|
|
79
|
-
worktreeManager,
|
|
80
|
-
baseBranch: config?.project?.baseBranch ?? 'main',
|
|
81
|
-
epicBranch: getEpicBranch(epicId),
|
|
82
|
-
ensureBranch,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Fetch Epic + all tickets and prime the provider cache.
|
|
88
|
-
*
|
|
89
|
-
* @param {DispatchContext} ctx Dispatch context.
|
|
90
|
-
* @returns {Promise<FetchedEpic>} Epic + ticket graph.
|
|
91
|
-
*/
|
|
92
|
-
export async function fetchEpicContext(ctx) {
|
|
93
|
-
const { provider, epicId } = ctx;
|
|
94
|
-
|
|
95
|
-
Logger.info(`\nFetching Epic #${epicId}...`);
|
|
96
|
-
const epic = await provider.getEpic(epicId);
|
|
97
|
-
|
|
98
|
-
Logger.info(`Fetching all tickets under Epic #${epicId}...`);
|
|
99
|
-
const allTickets = await provider.getTickets(epicId);
|
|
100
|
-
const allTicketsById = new Map(allTickets.map((t) => [t.id, t]));
|
|
101
|
-
|
|
102
|
-
provider.primeTicketCache(allTickets);
|
|
103
|
-
|
|
104
|
-
return { epic, allTickets, allTicketsById };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Detect 2-tier hierarchy from the fetched ticket graph. After Epic #3163's
|
|
109
|
-
* hard cutover deleted the `type::task` ticket layer, shape selection is
|
|
110
|
-
* purely structural: any Epic carrying at least one `type::story` ticket
|
|
111
|
-
* resolves to 2-tier.
|
|
112
|
-
*
|
|
113
|
-
* @param {object[]} allTickets
|
|
114
|
-
* @returns {boolean}
|
|
115
|
-
*/
|
|
116
|
-
export function isTwoTierDispatch(allTickets) {
|
|
117
|
-
if (!Array.isArray(allTickets) || allTickets.length === 0) return false;
|
|
118
|
-
return allTickets.some((t) =>
|
|
119
|
-
(t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Build the Story-level dispatch graph for a 2-tier Epic. Reads story
|
|
125
|
-
* tickets from `allTickets`, parses cross-Story `blocked by` references
|
|
126
|
-
* from each Story body (also honoring an optional `dependencies[]`
|
|
127
|
-
* field set by fixture providers), and computes wave indices via
|
|
128
|
-
* {@link computeStoryWaves}.
|
|
129
|
-
*
|
|
130
|
-
* The returned `allWaves` is an array of Story-ticket arrays, ordered by
|
|
131
|
-
* wave index. `storyMap` indexes the same Story tickets by id for downstream
|
|
132
|
-
* lookups (mirrors the `taskMap` returned by {@link buildDispatchGraph}).
|
|
133
|
-
*
|
|
134
|
-
* Stories with no resolvable wave (cycle pre-filter, missing in groups)
|
|
135
|
-
* are placed in their own trailing wave so they remain visible in the
|
|
136
|
-
* manifest output.
|
|
137
|
-
*
|
|
138
|
-
* @param {object[]} allTickets Fetched ticket graph (Epic + Stories).
|
|
139
|
-
* @returns {{ allWaves: object[][], storyMap: Map<number, object> }}
|
|
140
|
-
* @throws {Error} When the Story dependency graph contains a cycle.
|
|
141
|
-
*/
|
|
142
|
-
export function buildStoryDispatchGraph(allTickets) {
|
|
143
|
-
const stories = (allTickets ?? []).filter((t) =>
|
|
144
|
-
(t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
|
|
145
|
-
);
|
|
146
|
-
const storyMap = new Map(stories.map((s) => [s.id, s]));
|
|
147
|
-
|
|
148
|
-
// Shared story-level adjacency builder (lib/story-adjacency.js) owns the
|
|
149
|
-
// dependency-source ordering contract: body `blocked by` references via
|
|
150
|
-
// `parseBlockedBy`, then explicit `dependencies[]`, foreign edges dropped.
|
|
151
|
-
const explicitDeps = buildStoryAdjacency(stories);
|
|
152
|
-
|
|
153
|
-
// computeStoryWaves expects a Map<storyId, { tasks: [] }>; with no Tasks
|
|
154
|
-
// present, only explicitDeps + focus-area rollup (no-op for empty
|
|
155
|
-
// task lists) drive wave assignment.
|
|
156
|
-
const storyGroups = new Map(
|
|
157
|
-
stories.map((s) => [s.id, { storyId: s.id, tasks: [] }]),
|
|
158
|
-
);
|
|
159
|
-
const waveAssignment = computeStoryWaves(storyGroups, explicitDeps);
|
|
160
|
-
|
|
161
|
-
// Bucket stories by wave index. `computeStoryWaves` returns -1 for any
|
|
162
|
-
// story it could not place; route those into a trailing bucket so they
|
|
163
|
-
// still surface in the manifest.
|
|
164
|
-
const byWave = new Map();
|
|
165
|
-
let maxWave = -1;
|
|
166
|
-
for (const story of stories) {
|
|
167
|
-
const wave = waveAssignment.get(story.id) ?? -1;
|
|
168
|
-
if (wave > maxWave) maxWave = wave;
|
|
169
|
-
if (!byWave.has(wave)) byWave.set(wave, []);
|
|
170
|
-
byWave.get(wave).push(story);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const allWaves = [];
|
|
174
|
-
for (let i = 0; i <= maxWave; i++) {
|
|
175
|
-
if (byWave.has(i)) allWaves.push(byWave.get(i));
|
|
176
|
-
}
|
|
177
|
-
if (byWave.has(-1)) allWaves.push(byWave.get(-1));
|
|
178
|
-
|
|
179
|
-
Logger.info(
|
|
180
|
-
`Computed ${allWaves.length} Story-level execution wave(s) (2-tier).`,
|
|
181
|
-
);
|
|
182
|
-
return { allWaves, storyMap };
|
|
183
|
-
}
|