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,32 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-context.js — single planner-context envelope build
|
|
3
|
-
* PR2 — `/plan` collapse step 1).
|
|
2
|
+
* plan-context.js — single planner-context envelope build for `/plan`.
|
|
4
3
|
*
|
|
5
|
-
* Folds the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `epic-plan-decompose/phases/context.js`) plus the three currently-no-CLI
|
|
9
|
-
* library calls (`findSimilarOpenEpics`, clarity scoring, re-plan
|
|
10
|
-
* detection) into ONE JSON envelope, so the authoring middle reads a single
|
|
11
|
-
* file instead of shim-scripting library imports (the bench measured
|
|
12
|
-
* ~12–15 turns of shim-writing for the dup search alone).
|
|
4
|
+
* Folds the authoring-context builders plus the cross-Story dup search into
|
|
5
|
+
* ONE JSON envelope, so the authoring middle reads a single file instead of
|
|
6
|
+
* shim-scripting library imports.
|
|
13
7
|
*
|
|
14
|
-
*
|
|
15
|
-
* - `
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* `duplicates[]` (cross-Epic dup search). Clarity is not
|
|
21
|
-
* scored — the ideation path is definitionally clear.
|
|
22
|
-
* - `seed` — headless ideation entry (#4496 fix 1): the one-pager
|
|
23
|
-
* does not exist yet either. The dup search runs off the
|
|
24
|
-
* raw seed text, and the envelope additively carries
|
|
25
|
-
* `seed`, `scopeTriage` (the scope-triage rubric applied
|
|
26
|
-
* CLI-side — no skill Reads on the headless path) and
|
|
27
|
-
* `onePagerSpec` (the canonical one-pager sections, so
|
|
28
|
-
* the authoring pass writes the one-pager in the SAME
|
|
29
|
-
* batched write as the spec artifacts).
|
|
8
|
+
* Two operator modes (v2 Story-only):
|
|
9
|
+
* - `seed` / `seed-file` — freeform text (chat or on-disk). Carries
|
|
10
|
+
* `seed` plus `duplicates[]` (open-Story dup search).
|
|
11
|
+
* - `tickets` — one or more existing issue ids to analyze into proper
|
|
12
|
+
* Stories. Carries `sourceTickets[]` plus `duplicates[]` (excluding
|
|
13
|
+
* the source ids themselves).
|
|
30
14
|
*
|
|
31
15
|
* All fields are JSON-serialisable; the module performs no GitHub writes.
|
|
32
16
|
* The only I/O surfaces are the injected `provider` (reads) and the
|
|
@@ -34,28 +18,28 @@
|
|
|
34
18
|
*/
|
|
35
19
|
|
|
36
20
|
import { readFile } from 'node:fs/promises';
|
|
37
|
-
import { getLimits
|
|
38
|
-
import {
|
|
39
|
-
import { hasEpicSection, hasTechSpecContent } from '../epic-body-sections.js';
|
|
40
|
-
import { scoreEpicBody } from '../epic-plan-clarity.js';
|
|
21
|
+
import { getLimits } from '../config-resolver.js';
|
|
22
|
+
import { findSimilarOpenStories } from '../duplicate-search.js';
|
|
41
23
|
import { Logger } from '../Logger.js';
|
|
42
24
|
import {
|
|
43
25
|
renderAcceptanceSpecSystemPrompt,
|
|
44
26
|
renderTechSpecSystemPrompt,
|
|
45
27
|
} from '../templates/spec-author-prompts.js';
|
|
28
|
+
import { concurrentMap } from '../util/concurrent-map.js';
|
|
46
29
|
import { parseDeliverySlicingTable } from './consolidation-precondition.js';
|
|
47
30
|
import { buildDocsDigest } from './docs-digest.js';
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import { read as readPlanState } from './epic-plan-state-store.js';
|
|
31
|
+
import { buildAuthoringContext } from './planning/authoring-context.js';
|
|
32
|
+
import { buildDecomposerSystemPrompt } from './planning/decomposer-context.js';
|
|
51
33
|
|
|
34
|
+
/** Bounded concurrency for `--tickets` source-ticket hydration. */
|
|
35
|
+
const SOURCE_TICKET_FETCH_CONCURRENCY = 4;
|
|
52
36
|
/**
|
|
53
37
|
* Envelope byte ceiling (regression guard for the design's named PR2 risk:
|
|
54
38
|
* two envelopes → one bigger one). The folded envelope's bounded parts are:
|
|
55
39
|
* the `applyBudget`-capped body (`planningContext.maxBytes` = 50 KB), the
|
|
56
40
|
* tier-capped codebase snapshot (~35 KB skinny on this repo), the three
|
|
57
41
|
* rendered system prompts (~15 KB), and the digest-first `docsContext`
|
|
58
|
-
* (outline-only,
|
|
42
|
+
* (outline-only, or inline digest in one-pager/seed mode). Measured folded envelopes on this
|
|
59
43
|
* repo land at ~42 KB; 256 KB (~64K tokens at the ≈4-chars/token estimate)
|
|
60
44
|
* gives >2× headroom over a worst-case budgeted body + medium-tier snapshot
|
|
61
45
|
* while staying an order of magnitude under the session budget. The test
|
|
@@ -80,44 +64,17 @@ export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
|
|
|
80
64
|
body: 'string — serialized Story-body markdown (never a JSON object)',
|
|
81
65
|
acceptance: 'string[] — top-level testable criteria (not nested in body)',
|
|
82
66
|
verify: 'string[] — top-level exact commands/test paths with (<tier>)',
|
|
83
|
-
labels: "string[] — must include 'type::story'
|
|
67
|
+
labels: "string[] — must include 'type::story' (no persona::* axis)",
|
|
84
68
|
depends_on: 'string[]? — sibling Story slugs that block execution',
|
|
85
69
|
}),
|
|
86
70
|
validatedBy:
|
|
87
71
|
'validateAndNormalizeTickets (lib/orchestration/ticket-validator.js) at persist time',
|
|
88
72
|
});
|
|
89
73
|
|
|
90
|
-
/**
|
|
91
|
-
* Canonical one-pager authoring descriptor for the `seed` envelope
|
|
92
|
-
* (#4496 fix 1). The section names are the ones `plan-epic.md`'s ideation
|
|
93
|
-
* entry has always named, chosen so the authored headings parse against
|
|
94
|
-
* the `SECTION_RE` map in `lib/epic-plan-ideation.js` (which renders the
|
|
95
|
-
* Epic body from the one-pager at persist time via
|
|
96
|
-
* `.agents/templates/epic-from-idea.md`).
|
|
97
|
-
*/
|
|
98
|
-
export const ONE_PAGER_AUTHORING_SPEC = Object.freeze({
|
|
99
|
-
sections: Object.freeze([
|
|
100
|
-
'Problem Statement',
|
|
101
|
-
'Recommended Direction',
|
|
102
|
-
'Key Assumptions',
|
|
103
|
-
'MVP Scope',
|
|
104
|
-
'Not Doing',
|
|
105
|
-
]),
|
|
106
|
-
instruction:
|
|
107
|
-
'Author the one-pager markdown (the canonical sections above, as `## ` ' +
|
|
108
|
-
'headings) in the SAME batched write as the other planning artifacts — ' +
|
|
109
|
-
'no separate ideation pass and no idea-refinement skill activation on ' +
|
|
110
|
-
'this path. Every unresolved unknown lands in Key Assumptions instead ' +
|
|
111
|
-
'of a question.',
|
|
112
|
-
consumedBy:
|
|
113
|
-
'plan-persist.js --one-pager (ideation Epic creation via ' +
|
|
114
|
-
'.agents/templates/epic-from-idea.md)',
|
|
115
|
-
});
|
|
116
|
-
|
|
117
74
|
/**
|
|
118
75
|
* Count top-level enumerated items (`- `, `* `, `1. `) anywhere in a
|
|
119
76
|
* free-form seed text. Unlike {@link countScopeItems} this does not require
|
|
120
|
-
* a scope-shaped heading — a raw `--
|
|
77
|
+
* a scope-shaped heading — a raw `--seed` text rarely has one.
|
|
121
78
|
*
|
|
122
79
|
* @param {string} text
|
|
123
80
|
* @returns {number}
|
|
@@ -138,13 +95,13 @@ const DELTA_VERB_RE =
|
|
|
138
95
|
/\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
|
|
139
96
|
|
|
140
97
|
/**
|
|
141
|
-
* Deterministic, CLI-applied scope-triage verdict over a raw `--
|
|
98
|
+
* Deterministic, CLI-applied scope-triage verdict over a raw `--seed` text
|
|
142
99
|
* (#4496 fix 6). Embedding the verdict in the `--seed` envelope removes the
|
|
143
100
|
* two skill Reads (`core/scope-triage` + the gate fragment's rubric pass)
|
|
144
101
|
* from the headless path; the attended path keeps the skill-based judgment.
|
|
145
102
|
*
|
|
146
103
|
* The heuristics anchor to the same sizing SSOT the skill anchors to —
|
|
147
|
-
* `DELIVERABLE_GRANULARITY_GUIDANCE` / `
|
|
104
|
+
* `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_MODEL_CAPACITY` in
|
|
148
105
|
* `ticket-validator-sizing.js` (one Story = one coherent capability slice;
|
|
149
106
|
* multiple independent capabilities = an Epic) — and to the skill's
|
|
150
107
|
* change-request delta rubric. Like the skill, the verdict is **advisory**:
|
|
@@ -223,7 +180,7 @@ function resolveRiskHeuristics(config = {}) {
|
|
|
223
180
|
if (Array.isArray(config.planning?.riskHeuristics)) {
|
|
224
181
|
return config.planning.riskHeuristics;
|
|
225
182
|
}
|
|
226
|
-
return
|
|
183
|
+
return [];
|
|
227
184
|
}
|
|
228
185
|
|
|
229
186
|
/**
|
|
@@ -331,43 +288,6 @@ export function buildDeliveryShapeSignal({ body } = {}) {
|
|
|
331
288
|
};
|
|
332
289
|
}
|
|
333
290
|
|
|
334
|
-
/**
|
|
335
|
-
* Re-plan detection signals (folds the workflow's Phase 5 into the
|
|
336
|
-
* envelope): the Tech Spec sections alone are the already-planned signal;
|
|
337
|
-
* the open-Story count and section presence let the authoring middle (and
|
|
338
|
-
* the persist half's `--force` prompt) cite concrete numbers.
|
|
339
|
-
*
|
|
340
|
-
* `openStoryCount` is best-effort: a provider listing failure degrades to
|
|
341
|
-
* `null` rather than aborting the envelope build.
|
|
342
|
-
*
|
|
343
|
-
* @param {{ epicBody: string, provider: object, epicId: number }} args
|
|
344
|
-
* @returns {Promise<{
|
|
345
|
-
* alreadyPlanned: boolean,
|
|
346
|
-
* planningSections: { techSpec: boolean, acceptanceTable: boolean },
|
|
347
|
-
* openStoryCount: number|null,
|
|
348
|
-
* }>}
|
|
349
|
-
*/
|
|
350
|
-
export async function buildReplanSignal({ epicBody, provider, epicId }) {
|
|
351
|
-
const body = epicBody ?? '';
|
|
352
|
-
let openStoryCount = null;
|
|
353
|
-
try {
|
|
354
|
-
const tickets = await provider.getTickets(epicId, { state: 'open' });
|
|
355
|
-
if (Array.isArray(tickets)) openStoryCount = tickets.length;
|
|
356
|
-
} catch (err) {
|
|
357
|
-
Logger.warn(
|
|
358
|
-
`[plan-context] open-children listing skipped: ${err?.message ?? err}`,
|
|
359
|
-
);
|
|
360
|
-
}
|
|
361
|
-
return {
|
|
362
|
-
alreadyPlanned: hasTechSpecContent(body),
|
|
363
|
-
planningSections: {
|
|
364
|
-
techSpec: hasEpicSection(body, 'techSpec'),
|
|
365
|
-
acceptanceTable: hasEpicSection(body, 'acceptanceTable'),
|
|
366
|
-
},
|
|
367
|
-
openStoryCount,
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
|
|
371
291
|
/**
|
|
372
292
|
* Render the three authoring system prompts the collapsed pipeline's
|
|
373
293
|
* single authoring pass consumes. The spec/acceptance prompts render from
|
|
@@ -375,89 +295,136 @@ export async function buildReplanSignal({ epicBody, provider, epicId }) {
|
|
|
375
295
|
* authoritative from day one); the decompose prompt reuses the existing
|
|
376
296
|
* Story #4162 carrier including the risk-heuristics suffix.
|
|
377
297
|
*
|
|
378
|
-
* @param {{ heuristics?: string[], maxTickets?: number,
|
|
298
|
+
* @param {{ heuristics?: string[], maxTickets?: number, epicId?: number|null }} args
|
|
379
299
|
* @returns {{ spec: string, acceptance: string, decompose: string }}
|
|
380
300
|
*/
|
|
381
301
|
export function buildSystemPrompts({
|
|
382
302
|
heuristics = [],
|
|
383
303
|
maxTickets,
|
|
384
|
-
maxTokenBudget,
|
|
385
304
|
epicId = null,
|
|
386
305
|
} = {}) {
|
|
306
|
+
const decompose = buildDecomposerSystemPrompt(heuristics, {
|
|
307
|
+
maxTickets,
|
|
308
|
+
epicId,
|
|
309
|
+
});
|
|
387
310
|
return {
|
|
388
311
|
spec: renderTechSpecSystemPrompt(),
|
|
389
312
|
acceptance: renderAcceptanceSpecSystemPrompt(),
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
313
|
+
// v2 Stage 3: default-single author prompt (decompose text + split policy).
|
|
314
|
+
story: `${decompose}
|
|
315
|
+
|
|
316
|
+
#### v2 DEFAULT-SINGLE SPLIT POLICY:
|
|
317
|
+
|
|
318
|
+
Emit **exactly one Story** in \`stories.json\` unless the pieces have
|
|
319
|
+
near-zero overlap or sit across an architectural seam. Coupled work stays
|
|
320
|
+
one Story — put intra-session checkpoints in \`## Slicing\` and fold the
|
|
321
|
+
Tech Spec into \`## Spec\` (inline only; over-budget Specs mean split or
|
|
322
|
+
tighten — never write under \`docs/\`). Do **not** emit \`deliveryShape\`.
|
|
323
|
+
When N>1, every acceptance criterion must belong to exactly one Story,
|
|
324
|
+
and each Story carries its own \`## Spec\` (no shared techspec.md fold).
|
|
325
|
+
`,
|
|
326
|
+
decompose,
|
|
395
327
|
};
|
|
396
328
|
}
|
|
397
329
|
|
|
398
330
|
/**
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* tolerance the decompose context applies).
|
|
331
|
+
* Run the open-Story duplicate search. Failures degrade to [] — triage
|
|
332
|
+
* signal, not a gate.
|
|
402
333
|
*
|
|
403
|
-
* @param {{
|
|
404
|
-
*
|
|
334
|
+
* @param {{
|
|
335
|
+
* seed: string,
|
|
336
|
+
* provider: object,
|
|
337
|
+
* config: object,
|
|
338
|
+
* excludeIds?: Iterable<number|string>,
|
|
339
|
+
* }} args
|
|
340
|
+
* @returns {Promise<Array<object>>}
|
|
405
341
|
*/
|
|
406
|
-
async function
|
|
342
|
+
async function searchStoryDuplicates({
|
|
343
|
+
seed,
|
|
344
|
+
provider,
|
|
345
|
+
config,
|
|
346
|
+
excludeIds = [],
|
|
347
|
+
}) {
|
|
407
348
|
try {
|
|
408
|
-
return await
|
|
409
|
-
|
|
410
|
-
|
|
349
|
+
return await findSimilarOpenStories({
|
|
350
|
+
seed,
|
|
351
|
+
provider,
|
|
352
|
+
owner: config.github?.owner,
|
|
353
|
+
repo: config.github?.repo,
|
|
354
|
+
excludeIds,
|
|
355
|
+
});
|
|
356
|
+
} catch (err) {
|
|
357
|
+
Logger.warn(
|
|
358
|
+
`[plan-context] duplicate search degraded to no candidates: ${err?.message ?? err}`,
|
|
359
|
+
);
|
|
360
|
+
return [];
|
|
411
361
|
}
|
|
412
362
|
}
|
|
413
363
|
|
|
414
364
|
/**
|
|
415
|
-
* Build the
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
365
|
+
* Build the seed-file (ideation) envelope. No parent ticket
|
|
366
|
+
* exists yet — creation moves to the persist half — so the open-Story
|
|
367
|
+
* dup search is the mode's gating input. `docsContext` is inline-digest:
|
|
368
|
+
* there is no plan temp directory to anchor a digest file to yet.
|
|
419
369
|
*/
|
|
420
|
-
async function
|
|
421
|
-
|
|
370
|
+
async function buildSeedFileModeEnvelope({
|
|
371
|
+
seedFilePath,
|
|
372
|
+
seedFileContent,
|
|
422
373
|
provider,
|
|
423
374
|
config,
|
|
424
375
|
settings,
|
|
425
376
|
fullContext,
|
|
426
377
|
cwd,
|
|
378
|
+
modeLabel = 'seed-file',
|
|
427
379
|
}) {
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
380
|
+
const content =
|
|
381
|
+
seedFileContent ?? (await readFile(seedFilePath ?? '', 'utf-8'));
|
|
382
|
+
if (typeof content !== 'string' || content.trim().length === 0) {
|
|
383
|
+
throw new Error(
|
|
384
|
+
`[plan-context] seed-file at ${seedFilePath ?? '(inline)'} is empty — nothing to plan from.`,
|
|
385
|
+
);
|
|
431
386
|
}
|
|
432
|
-
const body = epic.body ?? '';
|
|
433
387
|
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
fullContext,
|
|
437
|
-
github: config.github ?? null,
|
|
438
|
-
};
|
|
439
|
-
if (cwd) authoringOpts.cwd = cwd;
|
|
440
|
-
const authoring = await buildAuthoringContext(
|
|
441
|
-
epicId,
|
|
388
|
+
const duplicates = await searchStoryDuplicates({
|
|
389
|
+
seed: content,
|
|
442
390
|
provider,
|
|
443
|
-
|
|
444
|
-
|
|
391
|
+
config,
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// Fold the authoring-context builders grounded in the seed prose.
|
|
395
|
+
// `docsContextFiles` is emptied for this call: the per-plan digest-file
|
|
396
|
+
// path needs a plan id that does not exist yet — the inline digest
|
|
397
|
+
// below replaces it.
|
|
398
|
+
const authoring = await buildAuthoringContext(
|
|
399
|
+
0,
|
|
400
|
+
/* provider (unused behind the prefetch seam) */ {},
|
|
401
|
+
{ ...settings, docsContextFiles: [] },
|
|
402
|
+
{
|
|
403
|
+
epic: { id: 0, title: seedFilePath ?? 'seed', body: content },
|
|
404
|
+
fullContext,
|
|
405
|
+
github: config.github ?? null,
|
|
406
|
+
cwd,
|
|
407
|
+
},
|
|
445
408
|
);
|
|
446
409
|
|
|
410
|
+
const paths = settings?.paths ?? {};
|
|
411
|
+
const inlineDigest = await buildDocsDigest({
|
|
412
|
+
docsContextFiles: settings?.docsContextFiles,
|
|
413
|
+
docsRoot: paths.docsRoot,
|
|
414
|
+
});
|
|
415
|
+
const docsContext =
|
|
416
|
+
inlineDigest == null
|
|
417
|
+
? null
|
|
418
|
+
: { mode: 'digest-inline', digest: inlineDigest };
|
|
419
|
+
|
|
447
420
|
const limits = getLimits(config);
|
|
448
421
|
const heuristics = resolveRiskHeuristics(config);
|
|
449
|
-
const clarityScore = scoreEpicBody({ body });
|
|
450
|
-
const [replan, planState] = await Promise.all([
|
|
451
|
-
buildReplanSignal({ epicBody: body, provider, epicId }),
|
|
452
|
-
readPlanStateTolerant({ provider, epicId }),
|
|
453
|
-
]);
|
|
454
422
|
|
|
455
423
|
return {
|
|
456
|
-
mode:
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
docsContext: authoring.docsContext,
|
|
424
|
+
mode: modeLabel,
|
|
425
|
+
seed: { path: seedFilePath ?? null, content },
|
|
426
|
+
duplicates,
|
|
427
|
+
docsContext,
|
|
461
428
|
codebaseSnapshot: authoring.codebaseSnapshot,
|
|
462
429
|
bddRunner: authoring.bddRunner,
|
|
463
430
|
bddScenarios: authoring.bddScenarios,
|
|
@@ -465,84 +432,138 @@ async function buildEpicModeEnvelope({
|
|
|
465
432
|
priorFeedback: authoring.priorFeedback,
|
|
466
433
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
467
434
|
maxTickets: limits.maxTickets,
|
|
468
|
-
maxTokenBudget: limits.maxTokenBudget,
|
|
469
|
-
preflightCeilings: resolvePreflightCeilings(config),
|
|
470
435
|
riskHeuristics: heuristics,
|
|
471
436
|
systemPrompts: buildSystemPrompts({
|
|
472
437
|
heuristics,
|
|
473
438
|
maxTickets: limits.maxTickets,
|
|
474
|
-
|
|
475
|
-
epicId,
|
|
439
|
+
epicId: null,
|
|
476
440
|
}),
|
|
477
|
-
|
|
478
|
-
|
|
441
|
+
planState: null,
|
|
442
|
+
// N=1 default: author one Story; skip Epic-scale decompose ceremony.
|
|
443
|
+
planProfile: 'story-default',
|
|
479
444
|
};
|
|
480
445
|
}
|
|
481
446
|
|
|
482
447
|
/**
|
|
483
|
-
* Build the
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
* mode's gating input. `docsContext` is inline-digest (the standalone
|
|
487
|
-
* `story-plan.js --emit-context` convention): there is no per-Epic temp
|
|
488
|
-
* directory to anchor a digest file to yet.
|
|
448
|
+
* Build the seed-mode (chat text) envelope. The seed-file does not exist
|
|
449
|
+
* yet: the dup search and the authoring-context fold both run off the raw
|
|
450
|
+
* seed text (N=1 default — no Epic-scale decompose).
|
|
489
451
|
*/
|
|
490
|
-
async function
|
|
491
|
-
|
|
492
|
-
onePagerContent,
|
|
452
|
+
async function buildSeedModeEnvelope({
|
|
453
|
+
seedText,
|
|
493
454
|
provider,
|
|
494
455
|
config,
|
|
495
456
|
settings,
|
|
496
457
|
fullContext,
|
|
497
458
|
cwd,
|
|
498
459
|
}) {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
460
|
+
if (typeof seedText !== 'string' || seedText.trim().length === 0) {
|
|
461
|
+
throw new Error(
|
|
462
|
+
'[plan-context] --seed requires non-empty seed text — nothing to plan from.',
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
const base = await buildSeedFileModeEnvelope({
|
|
466
|
+
seedFilePath: undefined,
|
|
467
|
+
seedFileContent: seedText,
|
|
468
|
+
provider,
|
|
469
|
+
config,
|
|
470
|
+
settings,
|
|
471
|
+
fullContext,
|
|
472
|
+
cwd,
|
|
473
|
+
modeLabel: 'seed',
|
|
474
|
+
});
|
|
475
|
+
const { seed: _seed, ...rest } = base;
|
|
476
|
+
return {
|
|
477
|
+
...rest,
|
|
478
|
+
mode: 'seed',
|
|
479
|
+
seed: { text: seedText, path: null },
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Fetch source tickets for `--tickets` mode.
|
|
485
|
+
* Hydrates ids concurrently (bounded) while preserving input order.
|
|
486
|
+
*
|
|
487
|
+
* @param {number[]} ticketIds
|
|
488
|
+
* @param {object} provider
|
|
489
|
+
* @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
|
|
490
|
+
*/
|
|
491
|
+
async function fetchSourceTickets(ticketIds, provider) {
|
|
492
|
+
if (!provider || typeof provider.getTicket !== 'function') {
|
|
502
493
|
throw new Error(
|
|
503
|
-
|
|
494
|
+
'[plan-context] tickets mode requires provider.getTicket()',
|
|
504
495
|
);
|
|
505
496
|
}
|
|
497
|
+
return concurrentMap(
|
|
498
|
+
ticketIds,
|
|
499
|
+
async (id) => {
|
|
500
|
+
const ticket = await provider.getTicket(id);
|
|
501
|
+
if (!ticket) {
|
|
502
|
+
throw new Error(`[plan-context] ticket #${id} not found`);
|
|
503
|
+
}
|
|
504
|
+
return {
|
|
505
|
+
id: Number(ticket.id ?? ticket.number ?? id),
|
|
506
|
+
title: ticket.title ?? '',
|
|
507
|
+
body: ticket.body ?? '',
|
|
508
|
+
labels: Array.isArray(ticket.labels)
|
|
509
|
+
? ticket.labels
|
|
510
|
+
.map((l) => (typeof l === 'string' ? l : l?.name))
|
|
511
|
+
.filter(Boolean)
|
|
512
|
+
: [],
|
|
513
|
+
url: ticket.html_url ?? ticket.url ?? undefined,
|
|
514
|
+
state: ticket.state ?? undefined,
|
|
515
|
+
};
|
|
516
|
+
},
|
|
517
|
+
{ concurrency: SOURCE_TICKET_FETCH_CONCURRENCY },
|
|
518
|
+
);
|
|
519
|
+
}
|
|
506
520
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
+
/**
|
|
522
|
+
* Build the tickets-mode envelope — analyze existing issue(s) into proper
|
|
523
|
+
* Stories. Dup search excludes the source ids so a ticket is not reported
|
|
524
|
+
* as a duplicate of itself.
|
|
525
|
+
*/
|
|
526
|
+
async function buildTicketsModeEnvelope({
|
|
527
|
+
ticketIds,
|
|
528
|
+
provider,
|
|
529
|
+
config,
|
|
530
|
+
settings,
|
|
531
|
+
fullContext,
|
|
532
|
+
cwd,
|
|
533
|
+
}) {
|
|
534
|
+
if (!Array.isArray(ticketIds) || ticketIds.length === 0) {
|
|
535
|
+
throw new Error(
|
|
536
|
+
'[plan-context] --tickets requires one or more positive issue ids.',
|
|
521
537
|
);
|
|
522
|
-
duplicates = [];
|
|
523
538
|
}
|
|
539
|
+
const sourceTickets = await fetchSourceTickets(ticketIds, provider);
|
|
540
|
+
const seed = sourceTickets
|
|
541
|
+
.map((t) => `# ${t.title}\n\n${t.body}`)
|
|
542
|
+
.join('\n\n---\n\n');
|
|
543
|
+
|
|
544
|
+
const duplicates = await searchStoryDuplicates({
|
|
545
|
+
seed,
|
|
546
|
+
provider,
|
|
547
|
+
config,
|
|
548
|
+
excludeIds: ticketIds,
|
|
549
|
+
});
|
|
524
550
|
|
|
525
|
-
// Fold the same authoring-context builders the epic path uses, grounded
|
|
526
|
-
// in the one-pager prose instead of an Epic body. Reuse
|
|
527
|
-
// `buildAuthoringContext` via the prefetch seam so the fold has exactly
|
|
528
|
-
// one implementation of the snapshot/BDD/memory/feedback pipeline to
|
|
529
|
-
// drift from. `docsContextFiles` is emptied for this call: the per-Epic
|
|
530
|
-
// digest-file path needs an Epic id (and a temp directory) that does not
|
|
531
|
-
// exist yet — the inline digest below replaces it.
|
|
532
551
|
const authoring = await buildAuthoringContext(
|
|
533
552
|
0,
|
|
534
|
-
|
|
553
|
+
{},
|
|
535
554
|
{ ...settings, docsContextFiles: [] },
|
|
536
555
|
{
|
|
537
|
-
epic: {
|
|
556
|
+
epic: {
|
|
557
|
+
id: 0,
|
|
558
|
+
title: sourceTickets[0]?.title ?? 'tickets',
|
|
559
|
+
body: seed,
|
|
560
|
+
},
|
|
538
561
|
fullContext,
|
|
539
562
|
github: config.github ?? null,
|
|
540
563
|
cwd,
|
|
541
564
|
},
|
|
542
565
|
);
|
|
543
566
|
|
|
544
|
-
// Replace the per-Epic digest-file pointer with an inline digest — the
|
|
545
|
-
// Epic (and its temp directory) does not exist yet.
|
|
546
567
|
const paths = settings?.paths ?? {};
|
|
547
568
|
const inlineDigest = await buildDocsDigest({
|
|
548
569
|
docsContextFiles: settings?.docsContextFiles,
|
|
@@ -557,8 +578,9 @@ async function buildOnePagerModeEnvelope({
|
|
|
557
578
|
const heuristics = resolveRiskHeuristics(config);
|
|
558
579
|
|
|
559
580
|
return {
|
|
560
|
-
mode: '
|
|
561
|
-
|
|
581
|
+
mode: 'tickets',
|
|
582
|
+
sourceTickets,
|
|
583
|
+
seed: { text: seed, path: null },
|
|
562
584
|
duplicates,
|
|
563
585
|
docsContext,
|
|
564
586
|
codebaseSnapshot: authoring.codebaseSnapshot,
|
|
@@ -568,58 +590,20 @@ async function buildOnePagerModeEnvelope({
|
|
|
568
590
|
priorFeedback: authoring.priorFeedback,
|
|
569
591
|
ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
|
|
570
592
|
maxTickets: limits.maxTickets,
|
|
571
|
-
maxTokenBudget: limits.maxTokenBudget,
|
|
572
|
-
preflightCeilings: resolvePreflightCeilings(config),
|
|
573
593
|
riskHeuristics: heuristics,
|
|
574
594
|
systemPrompts: buildSystemPrompts({
|
|
575
595
|
heuristics,
|
|
576
596
|
maxTickets: limits.maxTickets,
|
|
577
|
-
maxTokenBudget: limits.maxTokenBudget,
|
|
578
597
|
epicId: null,
|
|
579
598
|
}),
|
|
580
|
-
deliveryShapeSignal: buildDeliveryShapeSignal({ body: content }),
|
|
581
599
|
planState: null,
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
* uses), and the envelope additively carries `seed`, the CLI-applied
|
|
590
|
-
* `scopeTriage` verdict (fix 6 — no skill Reads on the headless path), and
|
|
591
|
-
* `onePagerSpec` so the one-pager sections are authored in the same batched
|
|
592
|
-
* write as the spec artifacts.
|
|
593
|
-
*/
|
|
594
|
-
async function buildSeedModeEnvelope({
|
|
595
|
-
seedText,
|
|
596
|
-
provider,
|
|
597
|
-
config,
|
|
598
|
-
settings,
|
|
599
|
-
fullContext,
|
|
600
|
-
cwd,
|
|
601
|
-
}) {
|
|
602
|
-
if (typeof seedText !== 'string' || seedText.trim().length === 0) {
|
|
603
|
-
throw new Error(
|
|
604
|
-
'[plan-context] --seed requires non-empty seed text — nothing to plan from.',
|
|
605
|
-
);
|
|
606
|
-
}
|
|
607
|
-
const base = await buildOnePagerModeEnvelope({
|
|
608
|
-
onePagerPath: undefined,
|
|
609
|
-
onePagerContent: seedText,
|
|
610
|
-
provider,
|
|
611
|
-
config,
|
|
612
|
-
settings,
|
|
613
|
-
fullContext,
|
|
614
|
-
cwd,
|
|
615
|
-
});
|
|
616
|
-
const { onePager: _onePager, ...rest } = base;
|
|
617
|
-
return {
|
|
618
|
-
...rest,
|
|
619
|
-
mode: 'seed',
|
|
620
|
-
seed: { text: seedText },
|
|
621
|
-
scopeTriage: buildScopeTriageSignal({ seedText }),
|
|
622
|
-
onePagerSpec: ONE_PAGER_AUTHORING_SPEC,
|
|
600
|
+
planProfile:
|
|
601
|
+
ticketIds.length === 1 ? 'story-default' : 'story-from-tickets',
|
|
602
|
+
instruction:
|
|
603
|
+
'Analyze the source ticket(s) and author proper type::story ' +
|
|
604
|
+
'ticket(s) under the default-single split policy. Prefer rewriting ' +
|
|
605
|
+
'the source into one well-formed Story (N=1) unless the split policy ' +
|
|
606
|
+
'applies. Do not open an Epic.',
|
|
623
607
|
};
|
|
624
608
|
}
|
|
625
609
|
|
|
@@ -627,11 +611,11 @@ async function buildSeedModeEnvelope({
|
|
|
627
611
|
* Build the single planner-context envelope.
|
|
628
612
|
*
|
|
629
613
|
* @param {{
|
|
630
|
-
* mode: '
|
|
631
|
-
*
|
|
632
|
-
*
|
|
633
|
-
* onePagerContent?: string,
|
|
614
|
+
* mode: 'seed-file'|'seed'|'tickets',
|
|
615
|
+
* seedFilePath?: string,
|
|
616
|
+
* seedFileContent?: string,
|
|
634
617
|
* seedText?: string,
|
|
618
|
+
* ticketIds?: number[],
|
|
635
619
|
* provider: object,
|
|
636
620
|
* config: object,
|
|
637
621
|
* settings: object,
|
|
@@ -641,38 +625,36 @@ async function buildSeedModeEnvelope({
|
|
|
641
625
|
*/
|
|
642
626
|
export async function buildPlanContext({
|
|
643
627
|
mode,
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
onePagerContent,
|
|
628
|
+
seedFilePath,
|
|
629
|
+
seedFileContent,
|
|
647
630
|
seedText,
|
|
631
|
+
ticketIds,
|
|
648
632
|
provider,
|
|
649
633
|
config = {},
|
|
650
634
|
settings = {},
|
|
651
635
|
fullContext = false,
|
|
652
636
|
cwd,
|
|
653
637
|
}) {
|
|
654
|
-
if (mode === '
|
|
655
|
-
if (!
|
|
656
|
-
throw new Error(
|
|
638
|
+
if (mode === 'seed-file') {
|
|
639
|
+
if (!seedFilePath && typeof seedFileContent !== 'string') {
|
|
640
|
+
throw new Error(
|
|
641
|
+
'[plan-context] seed-file mode requires --seed-file <path>.',
|
|
642
|
+
);
|
|
657
643
|
}
|
|
658
|
-
return
|
|
659
|
-
|
|
644
|
+
return buildSeedFileModeEnvelope({
|
|
645
|
+
seedFilePath,
|
|
646
|
+
seedFileContent,
|
|
660
647
|
provider,
|
|
661
648
|
config,
|
|
662
649
|
settings,
|
|
663
650
|
fullContext,
|
|
664
651
|
cwd,
|
|
652
|
+
modeLabel: 'seed-file',
|
|
665
653
|
});
|
|
666
654
|
}
|
|
667
|
-
if (mode === '
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
'[plan-context] one-pager mode requires --one-pager <path>.',
|
|
671
|
-
);
|
|
672
|
-
}
|
|
673
|
-
return buildOnePagerModeEnvelope({
|
|
674
|
-
onePagerPath,
|
|
675
|
-
onePagerContent,
|
|
655
|
+
if (mode === 'seed') {
|
|
656
|
+
return buildSeedModeEnvelope({
|
|
657
|
+
seedText,
|
|
676
658
|
provider,
|
|
677
659
|
config,
|
|
678
660
|
settings,
|
|
@@ -680,9 +662,9 @@ export async function buildPlanContext({
|
|
|
680
662
|
cwd,
|
|
681
663
|
});
|
|
682
664
|
}
|
|
683
|
-
if (mode === '
|
|
684
|
-
return
|
|
685
|
-
|
|
665
|
+
if (mode === 'tickets') {
|
|
666
|
+
return buildTicketsModeEnvelope({
|
|
667
|
+
ticketIds,
|
|
686
668
|
provider,
|
|
687
669
|
config,
|
|
688
670
|
settings,
|
|
@@ -691,6 +673,6 @@ export async function buildPlanContext({
|
|
|
691
673
|
});
|
|
692
674
|
}
|
|
693
675
|
throw new Error(
|
|
694
|
-
`[plan-context] unknown mode "${mode}" — expected "
|
|
676
|
+
`[plan-context] unknown mode "${mode}" — expected "seed", "seed-file", or "tickets".`,
|
|
695
677
|
);
|
|
696
678
|
}
|