mandrel 1.94.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/story-worker.md +12 -13
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +104 -138
- package/.agents/docs/execution-reference.md +17 -20
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +70 -81
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +6 -7
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +54 -214
- 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/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-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/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/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 +2 -2
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +45 -29
- package/.agents/scripts/lib/config/explain.js +55 -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 +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
- package/.agents/scripts/lib/config-settings-schema-quality.js +8 -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 +2 -2
- 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 +1 -1
- package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
- 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-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 +13 -13
- 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/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 +2 -7
- 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/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/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/update-ticket-state.js +6 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +3 -43
- 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 -174
- 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 +16 -29
- 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/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 +2 -1
- 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 +30 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/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-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/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/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* bookkeeping-reconcile.js — Epic #4476 (M5).
|
|
5
|
-
*
|
|
6
|
-
* Drain the per-Epic bookkeeping outbox (buffered structured-comment upserts
|
|
7
|
-
* and `agent::*` label flips accumulated during an unattended run) to GitHub,
|
|
8
|
-
* once, at finalize. GitHub becomes the source of truth at rest; the outbox is
|
|
9
|
-
* cleared only when the whole batch lands (crash-recovery: a partial drain
|
|
10
|
-
* leaves the remainder for the next reconcile).
|
|
11
|
-
*
|
|
12
|
-
* The `/deliver` Phase 7 finalize step calls this once after the merge tail
|
|
13
|
-
* opens the PR. It is idempotent: an empty / already-drained outbox is a
|
|
14
|
-
* no-op, and both sink operations converge on a re-run.
|
|
15
|
-
*
|
|
16
|
-
* Usage:
|
|
17
|
-
* node .agents/scripts/bookkeeping-reconcile.js --epic <id> [--provider github]
|
|
18
|
-
*
|
|
19
|
-
* Stdout: a single JSON envelope
|
|
20
|
-
* { ok, epicId, drained, comments, labels, errors, cleared }
|
|
21
|
-
*
|
|
22
|
-
* Exit codes:
|
|
23
|
-
* 0 — every buffered op drained (or nothing was buffered)
|
|
24
|
-
* 1 — one or more ops failed (outbox retained for the next reconcile)
|
|
25
|
-
* 2 — usage error
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
import { parseArgs } from 'node:util';
|
|
29
|
-
|
|
30
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
31
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
32
|
-
import { Logger } from './lib/Logger.js';
|
|
33
|
-
import {
|
|
34
|
-
outboxPathFor,
|
|
35
|
-
reconcileOutbox,
|
|
36
|
-
} from './lib/orchestration/bookkeeping-outbox.js';
|
|
37
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
38
|
-
|
|
39
|
-
const HELP = `Usage: node .agents/scripts/bookkeeping-reconcile.js \\
|
|
40
|
-
--epic <id> [--provider github]
|
|
41
|
-
|
|
42
|
-
Drains temp/epic-<id>/bookkeeping-outbox.ndjson (buffered comment upserts +
|
|
43
|
-
label flips from an unattended run) to GitHub once, at finalize. Idempotent.
|
|
44
|
-
|
|
45
|
-
Flags:
|
|
46
|
-
--epic Epic id whose outbox to drain (required).
|
|
47
|
-
--provider Provider name (default: inferred from .agentrc.json github block).
|
|
48
|
-
--help Show this message.
|
|
49
|
-
`;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Core: resolve the outbox path and drain it. Exported so tests can drive it
|
|
53
|
-
* with a fake provider and an injected outbox path.
|
|
54
|
-
*
|
|
55
|
-
* @param {{ epicId: number, provider: object, config?: object,
|
|
56
|
-
* outboxPath?: string, logger?: object }} args
|
|
57
|
-
* @returns {Promise<object>}
|
|
58
|
-
*/
|
|
59
|
-
export async function runBookkeepingReconcile({
|
|
60
|
-
epicId,
|
|
61
|
-
provider,
|
|
62
|
-
config,
|
|
63
|
-
outboxPath,
|
|
64
|
-
logger = Logger,
|
|
65
|
-
}) {
|
|
66
|
-
const resolvedOutbox = outboxPath ?? outboxPathFor(epicId, config);
|
|
67
|
-
const result = await reconcileOutbox({
|
|
68
|
-
outboxPath: resolvedOutbox,
|
|
69
|
-
provider,
|
|
70
|
-
logger,
|
|
71
|
-
});
|
|
72
|
-
return { ok: result.errors.length === 0, epicId, ...result };
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function parseArgv(argv) {
|
|
76
|
-
const { values } = parseArgs({
|
|
77
|
-
args: argv,
|
|
78
|
-
options: {
|
|
79
|
-
epic: { type: 'string' },
|
|
80
|
-
provider: { type: 'string' },
|
|
81
|
-
help: { type: 'boolean' },
|
|
82
|
-
},
|
|
83
|
-
strict: false,
|
|
84
|
-
});
|
|
85
|
-
return values;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
89
|
-
const values = parseArgv(argv);
|
|
90
|
-
if (values.help) {
|
|
91
|
-
process.stdout.write(HELP);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const epicId = Number.parseInt(values.epic ?? '', 10);
|
|
96
|
-
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
97
|
-
process.stderr.write('[bookkeeping-reconcile] --epic <id> is required.\n');
|
|
98
|
-
process.stderr.write(HELP);
|
|
99
|
-
process.exit(2);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const config = resolveConfig();
|
|
103
|
-
const effectiveConfig = values.provider
|
|
104
|
-
? { ...config, provider: values.provider }
|
|
105
|
-
: config;
|
|
106
|
-
const provider = createProvider(effectiveConfig);
|
|
107
|
-
|
|
108
|
-
const envelope = await runBookkeepingReconcile({
|
|
109
|
-
epicId,
|
|
110
|
-
provider,
|
|
111
|
-
config,
|
|
112
|
-
});
|
|
113
|
-
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
114
|
-
if (!envelope.ok) process.exitCode = 1;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
runAsCli(import.meta.url, main, { source: 'bookkeeping-reconcile' });
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* dispatcher.js — CLI Entry Point for the Dispatch Engine
|
|
6
|
-
*
|
|
7
|
-
* Thin wrapper around the dispatcher SDK. Parses CLI arguments,
|
|
8
|
-
* delegates core logic to `lib/orchestration/dispatch-engine.js`, then
|
|
9
|
-
* handles file I/O and console output.
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* node dispatcher.js <ticketId> [--dry-run]
|
|
13
|
-
*
|
|
14
|
-
* The script auto-detects whether the ticket is an Epic or Story
|
|
15
|
-
* and routes to the appropriate execution mode.
|
|
16
|
-
*
|
|
17
|
-
* Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
|
|
18
|
-
*
|
|
19
|
-
* @see .agents/schemas/dispatch-manifest.json
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
23
|
-
import {
|
|
24
|
-
dispatch,
|
|
25
|
-
resolveAndDispatch,
|
|
26
|
-
} from './lib/orchestration/dispatch-engine.js';
|
|
27
|
-
|
|
28
|
-
// Re-export SDK functions so that direct consumers of dispatcher.js
|
|
29
|
-
// (tests, CI scripts) continue to work without modification.
|
|
30
|
-
export { dispatch, resolveAndDispatch };
|
|
31
|
-
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
// Presentation helpers (CLI-only — not part of the SDK)
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
|
|
36
|
-
import { parseSprintArgs } from './lib/cli-args.js';
|
|
37
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
38
|
-
import { Logger } from './lib/Logger.js';
|
|
39
|
-
import {
|
|
40
|
-
fromSpec,
|
|
41
|
-
persistManifest,
|
|
42
|
-
postManifestEpicComment,
|
|
43
|
-
postParkedFollowOnsComment,
|
|
44
|
-
printStoryDispatchTable,
|
|
45
|
-
} from './lib/presentation/manifest-renderer.js';
|
|
46
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
47
|
-
import { loadSpec, loadState } from './lib/spec/index.js';
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Best-effort: load the structural spec + state for `epicId` and render
|
|
51
|
-
* the dispatch manifest Markdown via `fromSpec`. Returns `null` when the
|
|
52
|
-
* spec is absent or any loader step throws (parse/validation/io errors
|
|
53
|
-
* downgrade to fallback so the pre-spec dispatcher path keeps working
|
|
54
|
-
* untouched). Story #1501 — preserves `fromManifest` behaviour for
|
|
55
|
-
* non-spec callers.
|
|
56
|
-
*
|
|
57
|
-
* The loaders are injectable so tests can drive the spec-present /
|
|
58
|
-
* spec-absent branches without writing to the real `.agents/epics/`
|
|
59
|
-
* directory.
|
|
60
|
-
*
|
|
61
|
-
* @param {object} manifest — the dispatch manifest already built by `resolveAndDispatch`.
|
|
62
|
-
* @param {{
|
|
63
|
-
* loadSpec?: typeof loadSpec,
|
|
64
|
-
* loadState?: typeof loadState,
|
|
65
|
-
* fromSpec?: typeof fromSpec,
|
|
66
|
-
* loaderOpts?: object,
|
|
67
|
-
* }} [deps]
|
|
68
|
-
* @returns {string|null} pre-rendered Markdown, or null on any failure.
|
|
69
|
-
*/
|
|
70
|
-
/**
|
|
71
|
-
* Overlay live Story `status` labels from the just-built manifest onto the
|
|
72
|
-
* loaded state mapping. The spec-aware renderer (`buildManifestFromSpec`)
|
|
73
|
-
* looks up each Story's status via `state.mapping[slug].lastObservedAgentState`;
|
|
74
|
-
* that field is only refreshed by the structural reconciler, so during
|
|
75
|
-
* `/deliver` execution it stays `null` and every Story renders as ⬜
|
|
76
|
-
* pending even after the Story merges. The wave-runner replaced the
|
|
77
|
-
* dispatcher-per-wave refresh loop and the local state.json never sees
|
|
78
|
-
* the progress signal.
|
|
79
|
-
*
|
|
80
|
-
* Under the 2-tier hierarchy (Epic #3163) the runtime manifest's wave
|
|
81
|
-
* records carry `stories[]` (each with the live `storyId` + `status` from
|
|
82
|
-
* `fetchEpicContext`'s GH query), not the retired `tasks[]` shape. The
|
|
83
|
-
* overlay walks `manifest.waves[].stories[]` and copies each Story's
|
|
84
|
-
* status onto the slug that matches its `storyId` (issueNumber). Pure;
|
|
85
|
-
* returns the mutated state. Safe on null/undefined.
|
|
86
|
-
*
|
|
87
|
-
* @param {object|null|undefined} state
|
|
88
|
-
* @param {object|null|undefined} manifest
|
|
89
|
-
* @returns {object|null|undefined}
|
|
90
|
-
*/
|
|
91
|
-
export function overlayLiveTaskStateFromManifest(state, manifest) {
|
|
92
|
-
if (!state?.mapping || !manifest?.waves) return state;
|
|
93
|
-
const issueNumberToSlug = new Map();
|
|
94
|
-
for (const [slug, entry] of Object.entries(state.mapping)) {
|
|
95
|
-
if (entry && typeof entry.issueNumber === 'number') {
|
|
96
|
-
issueNumberToSlug.set(entry.issueNumber, slug);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
for (const wave of manifest.waves) {
|
|
100
|
-
if (!Array.isArray(wave?.stories)) continue;
|
|
101
|
-
for (const story of wave.stories) {
|
|
102
|
-
const slug = issueNumberToSlug.get(story?.storyId);
|
|
103
|
-
if (!slug) continue;
|
|
104
|
-
if (
|
|
105
|
-
typeof story.status === 'string' &&
|
|
106
|
-
story.status.startsWith('agent::')
|
|
107
|
-
) {
|
|
108
|
-
state.mapping[slug].lastObservedAgentState = story.status;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return state;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export function tryRenderFromSpec(manifest, deps = {}) {
|
|
116
|
-
const epicId = manifest?.epicId;
|
|
117
|
-
if (!epicId || manifest.type === 'story-execution') return null;
|
|
118
|
-
const loadSpecFn = deps.loadSpec ?? loadSpec;
|
|
119
|
-
const loadStateFn = deps.loadState ?? loadState;
|
|
120
|
-
const fromSpecFn = deps.fromSpec ?? fromSpec;
|
|
121
|
-
const overlayFn =
|
|
122
|
-
deps.overlayLiveTaskState ?? overlayLiveTaskStateFromManifest;
|
|
123
|
-
const loaderOpts = deps.loaderOpts ?? {};
|
|
124
|
-
try {
|
|
125
|
-
const spec = loadSpecFn(epicId, loaderOpts);
|
|
126
|
-
const state = loadStateFn(epicId, loaderOpts);
|
|
127
|
-
const overlayedState = overlayFn(state, manifest);
|
|
128
|
-
return fromSpecFn(spec, {
|
|
129
|
-
state: overlayedState,
|
|
130
|
-
generatedAt: manifest.generatedAt,
|
|
131
|
-
executor: manifest.executor,
|
|
132
|
-
dryRun: manifest.dryRun,
|
|
133
|
-
agentTelemetry: manifest.agentTelemetry,
|
|
134
|
-
});
|
|
135
|
-
} catch (err) {
|
|
136
|
-
/* node:coverage ignore next */
|
|
137
|
-
Logger.debug?.(
|
|
138
|
-
`[Dispatcher] spec-aware render unavailable for Epic #${epicId} (${err?.name ?? 'Error'}: ${err?.message ?? 'unknown'}); falling back to fromManifest`,
|
|
139
|
-
);
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* High-level orchestrator that resolves the execution strategy, generates the manifest,
|
|
145
|
-
* persists the files to temp, and outputs summaries.
|
|
146
|
-
*
|
|
147
|
-
* @param {number} ticketId
|
|
148
|
-
* @param {boolean} [dryRun]
|
|
149
|
-
* @param {{ provider?: object }} [opts] - Optional overrides. `provider`
|
|
150
|
-
* lets callers pass a provider whose per-instance ticket cache is already
|
|
151
|
-
* primed, so dashboard regeneration issues zero extra REST calls.
|
|
152
|
-
*/
|
|
153
|
-
/* node:coverage ignore next 8 */
|
|
154
|
-
function persistAndAnnounceMarkdown(manifest) {
|
|
155
|
-
const specMarkdown = tryRenderFromSpec(manifest);
|
|
156
|
-
if (specMarkdown !== null) {
|
|
157
|
-
Logger.info(
|
|
158
|
-
`[Dispatcher] 📐 Rendering Markdown via fromSpec (spec found for Epic #${manifest.epicId})`,
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
persistManifest(manifest, specMarkdown ? { markdown: specMarkdown } : {});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/* node:coverage ignore next 13 */
|
|
165
|
-
async function postManifestCommentSafely(manifest, provider) {
|
|
166
|
-
try {
|
|
167
|
-
const result = await postManifestEpicComment(manifest, provider);
|
|
168
|
-
if (result.posted) {
|
|
169
|
-
Logger.info(
|
|
170
|
-
`[Dispatcher] 💬 Dispatch manifest comment posted on Epic #${manifest.epicId}`,
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
} catch (err) {
|
|
174
|
-
/* node:coverage ignore next */
|
|
175
|
-
Logger.warn(
|
|
176
|
-
`[Dispatcher] Non-fatal: could not post manifest comment — ${err.message}`,
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/* node:coverage ignore next 16 */
|
|
182
|
-
async function postParkedCommentSafely(manifest, provider) {
|
|
183
|
-
try {
|
|
184
|
-
const parkedResult = await postParkedFollowOnsComment(manifest, provider);
|
|
185
|
-
if (!parkedResult.posted) return;
|
|
186
|
-
const hasExtras = parkedResult.recuts > 0 || parkedResult.parked > 0;
|
|
187
|
-
Logger.info(
|
|
188
|
-
hasExtras
|
|
189
|
-
? `[Dispatcher] 🪝 Parked follow-ons comment posted on Epic #${manifest.epicId} (${parkedResult.recuts} recut, ${parkedResult.parked} parked)`
|
|
190
|
-
: `[Dispatcher] 🪝 No out-of-manifest Stories detected on Epic #${manifest.epicId}`,
|
|
191
|
-
);
|
|
192
|
-
} catch (err) {
|
|
193
|
-
/* node:coverage ignore next */
|
|
194
|
-
Logger.warn(
|
|
195
|
-
`[Dispatcher] Non-fatal: could not post parked-follow-ons comment — ${err.message}`,
|
|
196
|
-
);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/* node:coverage ignore next 6 */
|
|
201
|
-
async function maybePostEpicComments(manifest, resolveProvider) {
|
|
202
|
-
if (manifest.type === 'story-execution' || !manifest.epicId) return;
|
|
203
|
-
const provider = resolveProvider();
|
|
204
|
-
await postManifestCommentSafely(manifest, provider);
|
|
205
|
-
await postParkedCommentSafely(manifest, provider);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/* node:coverage ignore next 18 */
|
|
209
|
-
function logStoryManifestPaths(manifest) {
|
|
210
|
-
const stories = manifest.stories ?? [];
|
|
211
|
-
const eid = stories.find((s) => s?.epicId)?.epicId;
|
|
212
|
-
if (eid && stories.length === 1) {
|
|
213
|
-
const sid = stories[0].storyId;
|
|
214
|
-
Logger.info(
|
|
215
|
-
`\n[Dispatcher] ✅ Story manifest: temp/epic-${eid}/stories/story-${sid}/manifest.json`,
|
|
216
|
-
);
|
|
217
|
-
Logger.info(
|
|
218
|
-
`[Dispatcher] 📄 Markdown: temp/epic-${eid}/stories/story-${sid}/manifest.md\n`,
|
|
219
|
-
);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const key = stories.map((s) => s.storyId).join('-');
|
|
223
|
-
Logger.info(
|
|
224
|
-
`\n[Dispatcher] ✅ Story manifest: temp/story-manifest-${key}.json`,
|
|
225
|
-
);
|
|
226
|
-
Logger.info(`[Dispatcher] 📄 Markdown: temp/story-manifest-${key}.md\n`);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/* node:coverage ignore next 10 */
|
|
230
|
-
function logEpicManifestSummary(manifest) {
|
|
231
|
-
const epicId = manifest.epicId;
|
|
232
|
-
Logger.info(`\n[Dispatcher] ✅ Manifest: temp/epic-${epicId}/manifest.json`);
|
|
233
|
-
Logger.info(`[Dispatcher] 📄 Markdown: temp/epic-${epicId}/manifest.md`);
|
|
234
|
-
Logger.info(
|
|
235
|
-
`[Dispatcher] Progress: ${manifest.summary.doneStories}/${manifest.summary.totalStories} stories done (${manifest.summary.progressPercent}%)`,
|
|
236
|
-
);
|
|
237
|
-
Logger.info(`[Dispatcher] Dispatched: ${manifest.summary.dispatched}`);
|
|
238
|
-
printStoryDispatchTable(manifest.storyManifest);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/* node:coverage ignore next 7 */
|
|
242
|
-
function logManifestSummary(manifest) {
|
|
243
|
-
if (manifest.type === 'story-execution') {
|
|
244
|
-
logStoryManifestPaths(manifest);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
logEpicManifestSummary(manifest);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export async function generateAndSaveManifest(
|
|
251
|
-
ticketId,
|
|
252
|
-
dryRun = false,
|
|
253
|
-
opts = {},
|
|
254
|
-
) {
|
|
255
|
-
const manifest = await resolveAndDispatch({
|
|
256
|
-
ticketId,
|
|
257
|
-
dryRun,
|
|
258
|
-
provider: opts.provider,
|
|
259
|
-
});
|
|
260
|
-
persistAndAnnounceMarkdown(manifest);
|
|
261
|
-
await maybePostEpicComments(
|
|
262
|
-
manifest,
|
|
263
|
-
() => opts.provider ?? createProvider(resolveConfig()),
|
|
264
|
-
);
|
|
265
|
-
logManifestSummary(manifest);
|
|
266
|
-
return manifest;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// ---------------------------------------------------------------------------
|
|
270
|
-
// CLI entry point
|
|
271
|
-
// ---------------------------------------------------------------------------
|
|
272
|
-
|
|
273
|
-
/* node:coverage ignore next */
|
|
274
|
-
/* node:coverage ignore next */
|
|
275
|
-
async function main() {
|
|
276
|
-
const { ticketId, dryRun } = parseSprintArgs();
|
|
277
|
-
|
|
278
|
-
if (!ticketId) {
|
|
279
|
-
Logger.error(
|
|
280
|
-
'[Dispatcher] Error: No valid Issue ID provided.\n' +
|
|
281
|
-
'Usage: node dispatcher.js <ticketId> [--dry-run]',
|
|
282
|
-
);
|
|
283
|
-
process.exit(1);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
await generateAndSaveManifest(ticketId, dryRun);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
runAsCli(import.meta.url, main, {
|
|
290
|
-
source: 'Dispatcher',
|
|
291
|
-
onError: (err) => {
|
|
292
|
-
Logger.error('[Dispatcher] Fatal error:', err.message);
|
|
293
|
-
process.exit(1);
|
|
294
|
-
},
|
|
295
|
-
});
|