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,174 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js
|
|
2
|
-
/**
|
|
3
|
-
* NotifyDispatcher — lifecycle listener that fans out the curated
|
|
4
|
-
* webhook event subset (Story #2239 Task #2244).
|
|
5
|
-
*
|
|
6
|
-
* The framework's notification surface is the operator-supplied
|
|
7
|
-
* `notifications.webhookEvents` allowlist (see
|
|
8
|
-
* `.agents/scripts/lib/config/github.js NOTIFICATIONS_DEFAULTS`). Each
|
|
9
|
-
* allowlisted name maps to one lifecycle event the bus emits — this
|
|
10
|
-
* listener subscribes to those events and dispatches via the injected
|
|
11
|
-
* `notify` function.
|
|
12
|
-
*
|
|
13
|
-
* Mapping (Tech Spec § curated webhooks):
|
|
14
|
-
*
|
|
15
|
-
* webhookEvents entry lifecycle event
|
|
16
|
-
* -------------------- ---------------------
|
|
17
|
-
* `epic-started` (emitted at /deliver kickoff;
|
|
18
|
-
* this listener handles `epic.snapshot.start`)
|
|
19
|
-
* `epic-blocked` `epic.blocked`
|
|
20
|
-
* `epic-complete` `epic.complete`
|
|
21
|
-
*
|
|
22
|
-
* The `epic-progress` and `epic-unblocked` webhook events are NOT mapped
|
|
23
|
-
* here: their former dotted lifecycle triggers (`wave.end` /
|
|
24
|
-
* `epic.unblocked`) belonged to the in-process runner stratum deleted in
|
|
25
|
-
* Story #3908. The production wave loop fires those curated webhooks
|
|
26
|
-
* directly through `progress-reporter/transport.js`
|
|
27
|
-
* (`wave-record-notifications.js`), so the webhook names stay valid in
|
|
28
|
-
* `NOTIFICATIONS_DEFAULTS` — only the redundant lifecycle-bus subscription
|
|
29
|
-
* is gone.
|
|
30
|
-
*
|
|
31
|
-
* Why per-event subscriptions instead of a wildcard listener? The
|
|
32
|
-
* wildcard would receive every event the bus carries, forcing the
|
|
33
|
-
* dispatcher to re-check membership on every emit. Per-event
|
|
34
|
-
* subscription gives the bus's mediator the routing decision once at
|
|
35
|
-
* registration time and keeps the side-effect surface auditable.
|
|
36
|
-
*
|
|
37
|
-
* Idempotency: `(event, seqId)` guard short-circuits replays. The
|
|
38
|
-
* `notify` function itself is fire-and-forget per `notify.js`
|
|
39
|
-
* (failures are swallowed); the listener wraps in try/catch defense.
|
|
40
|
-
*
|
|
41
|
-
* Trace emit (Tech Spec § observability): for every event the
|
|
42
|
-
* dispatcher handles, it appends a `notification.emitted` row to the
|
|
43
|
-
* epic-level signals NDJSON via the injected `appendEpicSignal`. This
|
|
44
|
-
* gives operators a single place to confirm that a webhook actually
|
|
45
|
-
* fired (the `notify` function's success is silent). The trace row
|
|
46
|
-
* also carries `seqId` so the resume test can prove
|
|
47
|
-
* notifications survive a crash window without duplicating.
|
|
48
|
-
*/
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Static map: lifecycle event → curated webhook event name. Keys are
|
|
52
|
-
* the bus event names this listener subscribes to.
|
|
53
|
-
*/
|
|
54
|
-
export const LIFECYCLE_TO_WEBHOOK_EVENT = Object.freeze({
|
|
55
|
-
'epic.snapshot.start': 'epic-started',
|
|
56
|
-
'epic.blocked': 'epic-blocked',
|
|
57
|
-
'epic.complete': 'epic-complete',
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Compute the set of webhook event names this listener can emit.
|
|
62
|
-
* Exposed so the listener-notify test can assert subset equality
|
|
63
|
-
* against `notifications.webhookEvents` from `.agentrc.json`.
|
|
64
|
-
*/
|
|
65
|
-
export function webhookEventNames() {
|
|
66
|
-
return new Set(Object.values(LIFECYCLE_TO_WEBHOOK_EVENT));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export class NotifyDispatcher {
|
|
70
|
-
/**
|
|
71
|
-
* @param {object} opts
|
|
72
|
-
* @param {number} opts.epicId
|
|
73
|
-
* @param {(ticketId: number, payload: object, opts?: object) => Promise<unknown>} opts.notify
|
|
74
|
-
* @param {(args: object) => Promise<boolean>} [opts.appendEpicSignal]
|
|
75
|
-
* Optional trace writer; when omitted, trace emits are skipped.
|
|
76
|
-
* @param {object} [opts.config] Resolved framework config (forwarded
|
|
77
|
-
* to `appendEpicSignal`).
|
|
78
|
-
* @param {() => number} [opts.now]
|
|
79
|
-
* @param {{ warn?: Function, debug?: Function }} [opts.logger]
|
|
80
|
-
*/
|
|
81
|
-
constructor(opts = {}) {
|
|
82
|
-
if (!Number.isInteger(opts.epicId) || opts.epicId < 1) {
|
|
83
|
-
throw new TypeError('NotifyDispatcher requires a numeric epicId');
|
|
84
|
-
}
|
|
85
|
-
if (typeof opts.notify !== 'function') {
|
|
86
|
-
throw new TypeError('NotifyDispatcher requires a notify function');
|
|
87
|
-
}
|
|
88
|
-
this.epicId = opts.epicId;
|
|
89
|
-
this._notify = opts.notify;
|
|
90
|
-
this._appendEpicSignal = opts.appendEpicSignal ?? null;
|
|
91
|
-
this._config = opts.config;
|
|
92
|
-
this._now = typeof opts.now === 'function' ? opts.now : Date.now;
|
|
93
|
-
this.logger = opts.logger ?? console;
|
|
94
|
-
this._seen = new Set();
|
|
95
|
-
this.events = Object.freeze(Object.keys(LIFECYCLE_TO_WEBHOOK_EVENT));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
register(bus) {
|
|
99
|
-
if (!bus || typeof bus.on !== 'function') {
|
|
100
|
-
throw new TypeError('NotifyDispatcher.register requires a bus with on()');
|
|
101
|
-
}
|
|
102
|
-
return this.events.map((event) =>
|
|
103
|
-
bus.on(event, async (ctx) => this.handle(ctx)),
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async handle({ event, seqId, payload }) {
|
|
108
|
-
const key = `${event}:${seqId}`;
|
|
109
|
-
if (this._seen.has(key)) {
|
|
110
|
-
this.logger.debug?.(
|
|
111
|
-
`[NotifyDispatcher] skip duplicate ${key} (idempotent)`,
|
|
112
|
-
);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
this._seen.add(key);
|
|
116
|
-
|
|
117
|
-
const webhookEvent = LIFECYCLE_TO_WEBHOOK_EVENT[event];
|
|
118
|
-
if (!webhookEvent) return;
|
|
119
|
-
|
|
120
|
-
// notify() is fire-and-forget by contract; wrap in try/catch as a
|
|
121
|
-
// defense layer so even a thrown notify error never propagates
|
|
122
|
-
// back to the bus.
|
|
123
|
-
try {
|
|
124
|
-
await this._notify(
|
|
125
|
-
this.epicId,
|
|
126
|
-
{
|
|
127
|
-
event: webhookEvent,
|
|
128
|
-
level: 'epic',
|
|
129
|
-
epicId: this.epicId,
|
|
130
|
-
payload: { ...payload },
|
|
131
|
-
},
|
|
132
|
-
{ skipComment: true },
|
|
133
|
-
);
|
|
134
|
-
} catch (err) {
|
|
135
|
-
this.logger.warn?.(
|
|
136
|
-
`[NotifyDispatcher] notify ${webhookEvent} failed: ${err?.message ?? err}`,
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Self-emit `notification.emitted` for trace — but NOT through the
|
|
141
|
-
// bus (the mediator forbids re-entry from inside a listener
|
|
142
|
-
// body). Instead we append a row to the epic-level signals NDJSON
|
|
143
|
-
// so the resume test can prove the dispatch survived a crash
|
|
144
|
-
// window without duplicating.
|
|
145
|
-
if (this._appendEpicSignal) {
|
|
146
|
-
const signal = {
|
|
147
|
-
kind: 'notification.emitted',
|
|
148
|
-
seqId,
|
|
149
|
-
ts: new Date(this._now()).toISOString(),
|
|
150
|
-
// The common signal envelope requires `epicId` on the record
|
|
151
|
-
// itself — `hasCommonEnvelope` (lib/signals/schema.js) rejects
|
|
152
|
-
// rows without it and the read side silently drops them, so
|
|
153
|
-
// without this field the record was write-only (invisible to
|
|
154
|
-
// signals-view.js and every other reader).
|
|
155
|
-
epicId: this.epicId,
|
|
156
|
-
sourceEvent: event,
|
|
157
|
-
webhookEvent,
|
|
158
|
-
};
|
|
159
|
-
try {
|
|
160
|
-
await this._appendEpicSignal({
|
|
161
|
-
epicId: this.epicId,
|
|
162
|
-
signal,
|
|
163
|
-
config: this._config,
|
|
164
|
-
});
|
|
165
|
-
} catch {
|
|
166
|
-
// already best-effort; swallow.
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
resetSeen() {
|
|
172
|
-
this._seen.clear();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/orchestration/manifest-builder.js — Manifest Building Logic
|
|
3
|
-
*
|
|
4
|
-
* 2-tier-only producer. Reads Story tickets from `allTickets` directly,
|
|
5
|
-
* computes Story-scoped waves, and emits the `waves[].stories[]` /
|
|
6
|
-
* Story-only `storyManifest` shape. The pre-Epic-#3163 Task-tier branch
|
|
7
|
-
* has been removed; the framework no longer carries a Task-tier
|
|
8
|
-
* producer path.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { parseBlockedBy } from '../dependency-parser.js';
|
|
12
|
-
import { getStoryBranch, slugify } from '../git-utils.js';
|
|
13
|
-
import { TYPE_LABELS } from '../label-constants.js';
|
|
14
|
-
import { computeStoryWaves } from './dependency-analyzer.js';
|
|
15
|
-
import { STATE_LABELS } from './ticketing.js';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Extract the markdown list items under a `## <heading>` section of a
|
|
19
|
-
* Story body. Returns an empty array when the section is missing or has
|
|
20
|
-
* no list items. Recognises both `- ` (incl. `- [ ]` / `- [x]`) and
|
|
21
|
-
* `* ` bullet markers — the same set the schema expects to round-trip
|
|
22
|
-
* verbatim per the manifest dispatch-manifest contract.
|
|
23
|
-
*
|
|
24
|
-
* @param {string} body
|
|
25
|
-
* @param {string} heading
|
|
26
|
-
* @returns {string[]}
|
|
27
|
-
*/
|
|
28
|
-
function extractSectionList(body, heading) {
|
|
29
|
-
if (typeof body !== 'string' || body.length === 0) return [];
|
|
30
|
-
const pattern = new RegExp(
|
|
31
|
-
`^##\\s+${heading.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\s*$`,
|
|
32
|
-
'mi',
|
|
33
|
-
);
|
|
34
|
-
const startMatch = body.match(pattern);
|
|
35
|
-
if (!startMatch || startMatch.index == null) return [];
|
|
36
|
-
const startIdx = startMatch.index + startMatch[0].length;
|
|
37
|
-
const rest = body.slice(startIdx);
|
|
38
|
-
const nextHeading = rest.search(/^##\s+/m);
|
|
39
|
-
const block = nextHeading === -1 ? rest : rest.slice(0, nextHeading);
|
|
40
|
-
const items = [];
|
|
41
|
-
for (const rawLine of block.split(/\r?\n/)) {
|
|
42
|
-
const line = rawLine.trim();
|
|
43
|
-
const m = line.match(/^[-*]\s+(?:\[[ xX]\]\s+)?(.*)$/);
|
|
44
|
-
if (m && m[1].length > 0) items.push(m[1].trim());
|
|
45
|
-
}
|
|
46
|
-
return items;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Project a Story ticket into the inline-acceptance/verify shape required by
|
|
51
|
-
* the 2-tier waves[].stories[] schema. Reads `## Acceptance` /
|
|
52
|
-
* `## Acceptance Criteria` and `## Verify` sections from the body.
|
|
53
|
-
*
|
|
54
|
-
* @param {object} story
|
|
55
|
-
* @param {number} epicId
|
|
56
|
-
* @returns {object}
|
|
57
|
-
*/
|
|
58
|
-
function projectStoryForWave(story, epicId) {
|
|
59
|
-
const body = story.body ?? '';
|
|
60
|
-
const acceptanceCriteria = extractSectionList(body, 'Acceptance Criteria');
|
|
61
|
-
const acceptanceItems =
|
|
62
|
-
acceptanceCriteria.length > 0
|
|
63
|
-
? acceptanceCriteria
|
|
64
|
-
: extractSectionList(body, 'Acceptance');
|
|
65
|
-
const verifyItems = extractSectionList(body, 'Verify');
|
|
66
|
-
const fromBody = parseBlockedBy(body);
|
|
67
|
-
const fromField = Array.isArray(story.dependencies)
|
|
68
|
-
? story.dependencies.map(Number)
|
|
69
|
-
: [];
|
|
70
|
-
const dependsOn = [...new Set([...fromBody, ...fromField])].filter((id) =>
|
|
71
|
-
Number.isInteger(id),
|
|
72
|
-
);
|
|
73
|
-
const labels = story.labels ?? [];
|
|
74
|
-
const personaLabel = labels.find((l) => l.startsWith('persona::'));
|
|
75
|
-
const persona =
|
|
76
|
-
story.persona ??
|
|
77
|
-
(personaLabel ? personaLabel.replace('persona::', '') : 'engineer');
|
|
78
|
-
const status =
|
|
79
|
-
story.status ??
|
|
80
|
-
labels.find((l) => l.startsWith('agent::')) ??
|
|
81
|
-
'agent::ready';
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
storyId: story.id,
|
|
85
|
-
title: story.title ?? '',
|
|
86
|
-
status,
|
|
87
|
-
branch: getStoryBranch(epicId, story.id),
|
|
88
|
-
persona,
|
|
89
|
-
acceptance: acceptanceItems,
|
|
90
|
-
verify: verifyItems,
|
|
91
|
-
dependsOn,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const AGENT_DONE_LABEL = STATE_LABELS.DONE;
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Build the Story-only manifest array used by the 2-tier hierarchy path.
|
|
99
|
-
* Reads Story tickets directly from `allTickets`; there is no Task tier
|
|
100
|
-
* to walk. Each entry exposes an empty `tasks: []` to keep downstream
|
|
101
|
-
* consumers (renderers, dispatch helpers) on a single per-Story shape
|
|
102
|
-
* until Category 4 of Epic #3163 rewrites them.
|
|
103
|
-
*
|
|
104
|
-
* @param {object[]} stories Story tickets (each with `id`, `title`,
|
|
105
|
-
* `body`, `labels`, optional `dependencies`).
|
|
106
|
-
* @param {number} epicId
|
|
107
|
-
* @returns {object[]}
|
|
108
|
-
*/
|
|
109
|
-
function buildStoryOnlyManifest(stories, epicId) {
|
|
110
|
-
const storyById = new Map(stories.map((s) => [s.id, s]));
|
|
111
|
-
const explicitStoryDeps = new Map();
|
|
112
|
-
for (const story of stories) {
|
|
113
|
-
const fromBody = parseBlockedBy(story.body ?? '');
|
|
114
|
-
const fromField = Array.isArray(story.dependencies)
|
|
115
|
-
? story.dependencies.map(Number)
|
|
116
|
-
: [];
|
|
117
|
-
const merged = [...new Set([...fromBody, ...fromField])].filter(
|
|
118
|
-
(id) => Number.isInteger(id) && id !== story.id && storyById.has(id),
|
|
119
|
-
);
|
|
120
|
-
if (merged.length > 0) explicitStoryDeps.set(story.id, merged);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Reuse `computeStoryWaves` by adapting Stories to its `storyGroups`
|
|
124
|
-
// input shape: a Map keyed by storyId whose values look like grouper
|
|
125
|
-
// output. With no Tasks, every group's `tasks: []` collapses the
|
|
126
|
-
// task-level wave inference to a no-op; only `explicitDeps` drives
|
|
127
|
-
// ordering.
|
|
128
|
-
const storyGroups = new Map(
|
|
129
|
-
stories.map((s) => [s.id, { storyId: s.id, tasks: [] }]),
|
|
130
|
-
);
|
|
131
|
-
const storyWaves = computeStoryWaves(storyGroups, explicitStoryDeps);
|
|
132
|
-
|
|
133
|
-
return stories.map((story) => {
|
|
134
|
-
const earliestWave = storyWaves.get(story.id) ?? -1;
|
|
135
|
-
return {
|
|
136
|
-
storyId: story.id,
|
|
137
|
-
storyTitle: story.title ?? '',
|
|
138
|
-
storySlug: slugify(story.title ?? `story-${story.id}`),
|
|
139
|
-
type: 'story',
|
|
140
|
-
branchName: getStoryBranch(epicId, story.id),
|
|
141
|
-
earliestWave,
|
|
142
|
-
// Carry the resolved cross-Story dependency edges on the entry so the
|
|
143
|
-
// presentation layer can derive grouping depth at render time via
|
|
144
|
-
// `assignLayers` (Story #4157) instead of trusting the persisted
|
|
145
|
-
// `earliestWave`. This is the same `explicitStoryDeps` set the wave
|
|
146
|
-
// computation consumed, already closed over the scheduled Story set.
|
|
147
|
-
dependsOn: explicitStoryDeps.get(story.id) ?? [],
|
|
148
|
-
tasks: [],
|
|
149
|
-
};
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Build the wave records for a 2-tier manifest. Each wave entry exposes a
|
|
155
|
-
* `stories[]` projection (instead of the legacy `tasks[]`) so dispatch
|
|
156
|
-
* consumers can fan Story execution out wave-by-wave without ever seeing
|
|
157
|
-
* a `type::task` ticket.
|
|
158
|
-
*
|
|
159
|
-
* @param {object[][]} waves Story waves (array of Story-ticket arrays).
|
|
160
|
-
* @param {number} epicId
|
|
161
|
-
* @returns {object[]}
|
|
162
|
-
*/
|
|
163
|
-
function buildStoryWaves(waves, epicId) {
|
|
164
|
-
return waves.map((wave, i) => ({
|
|
165
|
-
waveIndex: i,
|
|
166
|
-
stories: wave.map((s) => projectStoryForWave(s, epicId)),
|
|
167
|
-
}));
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Build the full Dispatch Manifest object.
|
|
172
|
-
*
|
|
173
|
-
* Epic #3163, Category 2 deleted the legacy Task-tier
|
|
174
|
-
* `waves[].tasks[]` branch and the Task-grouping import this module
|
|
175
|
-
* used to pull from the removed helper. The producer is now
|
|
176
|
-
* Story-only: it filters `allTickets` to the Story tier, computes
|
|
177
|
-
* Story-scoped waves, and emits `waves[].stories[]` plus a Story-only
|
|
178
|
-
* `storyManifest`.
|
|
179
|
-
*
|
|
180
|
-
* @param {object} params
|
|
181
|
-
* @returns {object}
|
|
182
|
-
*/
|
|
183
|
-
export function buildManifest({
|
|
184
|
-
epicId,
|
|
185
|
-
epic,
|
|
186
|
-
allTickets,
|
|
187
|
-
waves,
|
|
188
|
-
dispatched,
|
|
189
|
-
dryRun,
|
|
190
|
-
agentTelemetry = null,
|
|
191
|
-
}) {
|
|
192
|
-
const stories = (allTickets ?? []).filter((t) =>
|
|
193
|
-
(t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
|
|
194
|
-
);
|
|
195
|
-
const totalStories = stories.length;
|
|
196
|
-
const doneStories = stories.filter((s) =>
|
|
197
|
-
(s.labelSet ?? new Set(s.labels ?? [])).has(AGENT_DONE_LABEL),
|
|
198
|
-
).length;
|
|
199
|
-
const progress =
|
|
200
|
-
totalStories > 0 ? Math.round((doneStories / totalStories) * 100) : 0;
|
|
201
|
-
|
|
202
|
-
return {
|
|
203
|
-
schemaVersion: '1.0.0',
|
|
204
|
-
generatedAt: new Date().toISOString(),
|
|
205
|
-
epicId,
|
|
206
|
-
epicTitle: epic?.title ?? '',
|
|
207
|
-
executor: 'claude-code',
|
|
208
|
-
dryRun,
|
|
209
|
-
hierarchy: '2-tier',
|
|
210
|
-
summary: {
|
|
211
|
-
totalStories,
|
|
212
|
-
doneStories,
|
|
213
|
-
progressPercent: progress,
|
|
214
|
-
totalWaves: waves.length,
|
|
215
|
-
dispatched: dispatched.length,
|
|
216
|
-
},
|
|
217
|
-
waves: buildStoryWaves(waves, epicId),
|
|
218
|
-
storyManifest: buildStoryOnlyManifest(stories, epicId),
|
|
219
|
-
dispatched,
|
|
220
|
-
agentTelemetry,
|
|
221
|
-
};
|
|
222
|
-
}
|