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,599 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* story-init.js — Story Execution Initialization
|
|
6
|
-
*
|
|
7
|
-
* Deterministic script that replaces Steps 0-2 of the epic-execute
|
|
8
|
-
* Mode B workflow. Performs all pre-implementation setup by composing six
|
|
9
|
-
* pipeline stages from `lib/story-init/`:
|
|
10
|
-
*
|
|
11
|
-
* 1. context-resolver — fetch the Story + optionally mark as recut.
|
|
12
|
-
* 3. blocker-validator — refuse to proceed while dependencies are open.
|
|
13
|
-
* 4. task-graph-builder — fetch + topologically sort child Tasks.
|
|
14
|
-
* 5. branch-initializer — materialise the story branch (single-tree
|
|
15
|
-
* checkout or isolated worktree).
|
|
16
|
-
* 6. state-transitioner — flip the Story to `agent::executing`. Under
|
|
17
|
-
* the 2-tier hierarchy the Story has inline
|
|
18
|
-
* acceptance and no child Task lifecycle.
|
|
19
|
-
*
|
|
20
|
-
* Usage:
|
|
21
|
-
* node story-init.js --story <STORY_ID> [--dry-run]
|
|
22
|
-
*
|
|
23
|
-
* Exit codes:
|
|
24
|
-
* 0 — Initialization complete. Agent can start implementation.
|
|
25
|
-
* 1 — Blocked or error (details in stderr).
|
|
26
|
-
*
|
|
27
|
-
* @see .agents/workflows/helpers/deliver-stories.md
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
import path from 'node:path';
|
|
31
|
-
import { parseSprintArgs } from './lib/cli-args.js';
|
|
32
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
33
|
-
import {
|
|
34
|
-
PROJECT_ROOT,
|
|
35
|
-
resolveConfig,
|
|
36
|
-
resolveRuntime,
|
|
37
|
-
} from './lib/config-resolver.js';
|
|
38
|
-
import { parseBlockedBy } from './lib/dependency-parser.js';
|
|
39
|
-
import { getEpicBranch, getStoryBranch } from './lib/git-utils.js';
|
|
40
|
-
import { Logger } from './lib/Logger.js';
|
|
41
|
-
import { setActiveStoryEnv } from './lib/observability/active-story-env.js';
|
|
42
|
-
import {
|
|
43
|
-
defaultStoryPhases,
|
|
44
|
-
upsertStoryRunProgress,
|
|
45
|
-
} from './lib/orchestration/epic-runner/story-run-progress-writer.js';
|
|
46
|
-
import { upsertStructuredComment } from './lib/orchestration/ticketing.js';
|
|
47
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
48
|
-
import { validateBlockers } from './lib/story-init/blocker-validator.js';
|
|
49
|
-
import {
|
|
50
|
-
ensureStoryBranchSeed,
|
|
51
|
-
initializeBranch,
|
|
52
|
-
planStoryBranchSeed,
|
|
53
|
-
} from './lib/story-init/branch-initializer.js';
|
|
54
|
-
import { resolveContext } from './lib/story-init/context-resolver.js';
|
|
55
|
-
import { transitionStoryToExecuting } from './lib/story-init/state-transitioner.js';
|
|
56
|
-
import { buildTaskGraph } from './lib/story-init/task-graph-builder.js';
|
|
57
|
-
import { createPhaseTimer } from './lib/util/phase-timer.js';
|
|
58
|
-
import { savePhaseTimerState } from './lib/util/phase-timer-state.js';
|
|
59
|
-
import { forceClear as clearValidationEvidence } from './lib/validation-evidence.js';
|
|
60
|
-
import { notify } from './notify.js';
|
|
61
|
-
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// Progress logger — shared stage-logger passed to every pipeline stage.
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
|
|
66
|
-
const progress = Logger.createProgress('story-init', { stderr: true });
|
|
67
|
-
|
|
68
|
-
const stageLogger = {
|
|
69
|
-
progress,
|
|
70
|
-
warn: (msg) => Logger.error(msg),
|
|
71
|
-
error: (msg) => Logger.error(`[story-init] ${msg}`),
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
// CLI Execution
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Orchestrate the Story initialization as a thin sequential pipeline over
|
|
80
|
-
* the six stage modules in `lib/story-init/`.
|
|
81
|
-
*
|
|
82
|
-
* Exported for testing.
|
|
83
|
-
*/
|
|
84
|
-
export async function runStoryInit({
|
|
85
|
-
storyId: storyIdParam,
|
|
86
|
-
dryRun: dryRunParam,
|
|
87
|
-
cwd: cwdParam,
|
|
88
|
-
recutOf: recutOfParam,
|
|
89
|
-
injectedProvider,
|
|
90
|
-
injectedConfig,
|
|
91
|
-
} = {}) {
|
|
92
|
-
const parsed =
|
|
93
|
-
storyIdParam !== undefined
|
|
94
|
-
? {
|
|
95
|
-
storyId: storyIdParam,
|
|
96
|
-
dryRun: !!dryRunParam,
|
|
97
|
-
cwd: cwdParam ?? null,
|
|
98
|
-
recutOf: recutOfParam ?? null,
|
|
99
|
-
}
|
|
100
|
-
: parseSprintArgs();
|
|
101
|
-
const { storyId, dryRun } = parsed;
|
|
102
|
-
const recutOf = recutOfParam ?? parsed.recutOf ?? null;
|
|
103
|
-
// Worktree-aware cwd resolution: explicit param > --cwd flag > env > PROJECT_ROOT.
|
|
104
|
-
const cwd = path.resolve(cwdParam ?? parsed.cwd ?? PROJECT_ROOT);
|
|
105
|
-
|
|
106
|
-
if (!storyId) {
|
|
107
|
-
throw new Error('Usage: node story-init.js --story <STORY_ID> [--dry-run]');
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const config = injectedConfig || resolveConfig({ cwd });
|
|
111
|
-
const provider = injectedProvider || createProvider(config);
|
|
112
|
-
const _notifyFn = (ticketId, payload, opts = {}) =>
|
|
113
|
-
notify(ticketId, payload, { config, provider, ...opts });
|
|
114
|
-
// Per-Task transition hook: GitHub-comment surface suppressed (the
|
|
115
|
-
// Story-level summary below replaces the N per-Task comments with a
|
|
116
|
-
// single message). The webhook channel is now gated by the
|
|
117
|
-
// `notifications.webhookEvents` allowlist, so per-Task transitions
|
|
118
|
-
// reach Slack only when the operator opts the `task-transition` event
|
|
119
|
-
// into the allowlist — the default curated vocabulary (`epic-*` events)
|
|
120
|
-
// excludes them.
|
|
121
|
-
const notifyWebhookOnly = (ticketId, payload) =>
|
|
122
|
-
notify(ticketId, payload, {
|
|
123
|
-
config,
|
|
124
|
-
provider,
|
|
125
|
-
skipComment: true,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const runtime = resolveRuntime({ config });
|
|
129
|
-
progress(
|
|
130
|
-
'ENV',
|
|
131
|
-
`worktreeIsolation=${runtime.worktreeEnabled ? 'on' : 'off'} (${runtime.worktreeEnabledSource})`,
|
|
132
|
-
);
|
|
133
|
-
progress(
|
|
134
|
-
'ENV',
|
|
135
|
-
`sessionId=${runtime.sessionId} (${runtime.sessionIdSource})`,
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
progress('INIT', `Initializing Story #${storyId}...`);
|
|
139
|
-
|
|
140
|
-
// Stage 1 — context.
|
|
141
|
-
const { story, body, epicId, parentId } = await resolveContext({
|
|
142
|
-
provider,
|
|
143
|
-
logger: stageLogger,
|
|
144
|
-
input: { storyId, recutOf, dryRun },
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
progress('CONTEXT', `Epic: #${epicId}, Parent: #${parentId ?? 'none'}`);
|
|
148
|
-
|
|
149
|
-
// Stage 3 — blockers.
|
|
150
|
-
const { openBlockers } = await validateBlockers({
|
|
151
|
-
provider,
|
|
152
|
-
logger: stageLogger,
|
|
153
|
-
input: { body },
|
|
154
|
-
});
|
|
155
|
-
if (openBlockers.length > 0) {
|
|
156
|
-
if (dryRun) {
|
|
157
|
-
progress(
|
|
158
|
-
'BLOCKERS',
|
|
159
|
-
`⚠️ ${openBlockers.length} open blocker(s) detected (dry-run — not blocking):`,
|
|
160
|
-
);
|
|
161
|
-
for (const b of openBlockers) {
|
|
162
|
-
progress('BLOCKERS', ` - #${b.id} "${b.title}" (${b.state})`);
|
|
163
|
-
}
|
|
164
|
-
} else {
|
|
165
|
-
Logger.error(
|
|
166
|
-
`\n❌ BLOCKED: Story #${storyId} is blocked by ${openBlockers.length} incomplete prerequisite(s):`,
|
|
167
|
-
);
|
|
168
|
-
for (const b of openBlockers) {
|
|
169
|
-
Logger.error(` - #${b.id} "${b.title}" (${b.state})`);
|
|
170
|
-
}
|
|
171
|
-
return { success: false, blocked: true, openBlockers };
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
if (parseBlockedBy(body).length > 0)
|
|
175
|
-
progress('BLOCKERS', '✅ All blockers resolved');
|
|
176
|
-
|
|
177
|
-
// Stage 4 — task graph. Pass the Story body so buildTaskGraph can detect
|
|
178
|
-
// the inline-acceptance 2-tier shape. After Task #3154 collapsed the
|
|
179
|
-
// hierarchy flag, 2-tier is the only supported shape.
|
|
180
|
-
const { sortedTasks, mode: hierarchyMode } = await buildTaskGraph({
|
|
181
|
-
provider,
|
|
182
|
-
logger: stageLogger,
|
|
183
|
-
input: {
|
|
184
|
-
storyId,
|
|
185
|
-
storyBody: body,
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
// Stage 5 + 6 — branch and task-state transitions. Skipped under --dry-run.
|
|
190
|
-
const epicBranch = getEpicBranch(epicId);
|
|
191
|
-
const storyBranch = getStoryBranch(epicId, storyId);
|
|
192
|
-
|
|
193
|
-
let workCwd = cwd;
|
|
194
|
-
let worktreeCreated = false;
|
|
195
|
-
let installStatus = { status: 'skipped', reason: 'dry-run' };
|
|
196
|
-
const wtConfig = config.delivery?.worktreeIsolation;
|
|
197
|
-
const { worktreeEnabled } = runtime;
|
|
198
|
-
|
|
199
|
-
// Per-phase timer. The init-side emits worktree-create / bootstrap /
|
|
200
|
-
// install via the WorktreeManager `onPhase` callback, opens `implement`
|
|
201
|
-
// at the end, and snapshots to `.git/` so story-close can restore
|
|
202
|
-
// the open phase, append lint / test / close / api-sync, and upsert the
|
|
203
|
-
// `phase-timings` structured comment.
|
|
204
|
-
const phaseTimer = !dryRun ? createPhaseTimer(storyId) : null;
|
|
205
|
-
|
|
206
|
-
if (!dryRun) {
|
|
207
|
-
const branchResult = await initializeBranch({
|
|
208
|
-
logger: stageLogger,
|
|
209
|
-
input: {
|
|
210
|
-
storyId,
|
|
211
|
-
epicId,
|
|
212
|
-
epicBranch,
|
|
213
|
-
storyBranch,
|
|
214
|
-
baseBranch: config.project?.baseBranch ?? 'main',
|
|
215
|
-
cwd,
|
|
216
|
-
worktreeEnabled,
|
|
217
|
-
wtConfig,
|
|
218
|
-
onPhase: (name) => phaseTimer.mark(name),
|
|
219
|
-
},
|
|
220
|
-
});
|
|
221
|
-
workCwd = branchResult.workCwd;
|
|
222
|
-
worktreeCreated = branchResult.worktreeCreated;
|
|
223
|
-
installStatus = branchResult.installStatus ?? installStatus;
|
|
224
|
-
|
|
225
|
-
// Propagate Epic + Story ids to the trace hook (Story #1043). The
|
|
226
|
-
// hook in `lib/observability/tool-trace-hook.js` is a no-op when
|
|
227
|
-
// these env vars are unset, so setting them here is what activates
|
|
228
|
-
// the per-tool-call trace stream. We also export to `.env.local`
|
|
229
|
-
// inside the worktree so the harness picks the values up on its
|
|
230
|
-
// next agent spawn.
|
|
231
|
-
try {
|
|
232
|
-
setActiveStoryEnv({
|
|
233
|
-
epicId,
|
|
234
|
-
storyId,
|
|
235
|
-
workCwd,
|
|
236
|
-
logger: stageLogger,
|
|
237
|
-
});
|
|
238
|
-
} catch (err) {
|
|
239
|
-
// Non-fatal: the trace hook degrades to a no-op without these
|
|
240
|
-
// vars, which only loses observability. Warn and continue.
|
|
241
|
-
stageLogger.warn(
|
|
242
|
-
`[story-init] ⚠️ Failed to set active-Story env: ${err?.message ?? err}`,
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Clear any stale validation-evidence file in the worktree so a re-run
|
|
247
|
-
// of this Story (recut, branch-recreate, manual restart) always starts
|
|
248
|
-
// with an empty evidence ledger. Story 7 / #830.
|
|
249
|
-
try {
|
|
250
|
-
const cleared = clearValidationEvidence(storyId, {
|
|
251
|
-
cwd: workCwd,
|
|
252
|
-
epicId,
|
|
253
|
-
});
|
|
254
|
-
if (cleared.cleared) {
|
|
255
|
-
progress(
|
|
256
|
-
'EVIDENCE',
|
|
257
|
-
`🧹 Cleared stale validation-evidence at ${cleared.path}`,
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
} catch (err) {
|
|
261
|
-
// Non-fatal: a stale evidence file at worst forces a redundant gate
|
|
262
|
-
// run. The skip predicate also re-validates SHA + config hash, so
|
|
263
|
-
// staleness cannot mis-skip a real change.
|
|
264
|
-
stageLogger.warn(
|
|
265
|
-
`[story-init] ⚠️ Failed to clear validation evidence: ${err?.message ?? err}`,
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
try {
|
|
270
|
-
await transitionStoryToExecuting({
|
|
271
|
-
provider,
|
|
272
|
-
logger: stageLogger,
|
|
273
|
-
input: { storyId, story, notify: notifyWebhookOnly },
|
|
274
|
-
});
|
|
275
|
-
progress('LABELS', `🏷️ Story #${storyId} → agent::executing`);
|
|
276
|
-
} catch (err) {
|
|
277
|
-
Logger.error(
|
|
278
|
-
`\n❌ Story #${storyId} failed to transition to agent::executing: ${err?.message ?? err}`,
|
|
279
|
-
);
|
|
280
|
-
return {
|
|
281
|
-
success: false,
|
|
282
|
-
reason: 'story-transition-failure',
|
|
283
|
-
error: err?.message ?? String(err),
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Open the `implement` phase last so everything between now and the
|
|
288
|
-
// first close-side mark attributes to agent coding time. Snapshot to
|
|
289
|
-
// disk so close can pick up the open phase across the process gap.
|
|
290
|
-
phaseTimer.mark('implement');
|
|
291
|
-
try {
|
|
292
|
-
savePhaseTimerState(phaseTimer, { mainCwd: cwd, storyId });
|
|
293
|
-
} catch (err) {
|
|
294
|
-
// Non-fatal: losing the snapshot only degrades observability, it
|
|
295
|
-
// does not affect merge correctness. Warn and continue.
|
|
296
|
-
Logger.error(
|
|
297
|
-
`[story-init] ⚠️ Failed to persist phase-timer state: ${err.message}`,
|
|
298
|
-
);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const result = buildStoryInitResult({
|
|
303
|
-
storyId,
|
|
304
|
-
epicId,
|
|
305
|
-
storyBranch,
|
|
306
|
-
epicBranch,
|
|
307
|
-
story,
|
|
308
|
-
worktreeEnabled,
|
|
309
|
-
workCwd,
|
|
310
|
-
worktreeCreated,
|
|
311
|
-
installStatus,
|
|
312
|
-
sortedTasks,
|
|
313
|
-
parentId,
|
|
314
|
-
dryRun,
|
|
315
|
-
recutOf,
|
|
316
|
-
hierarchy: hierarchyMode,
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
if (!dryRun) {
|
|
320
|
-
await postStoryInitComment({
|
|
321
|
-
provider,
|
|
322
|
-
storyId,
|
|
323
|
-
result,
|
|
324
|
-
logger: stageLogger,
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
// Story #4017 — the formerly standalone prepare CLI (which
|
|
328
|
-
// re-read the story-init structured comment seconds after this process
|
|
329
|
-
// wrote it) is inlined here: apply the install tri-state and render the
|
|
330
|
-
// initial Story-phase snapshot in-process, off the result we already
|
|
331
|
-
// hold.
|
|
332
|
-
result.prepare = await runStoryInitPrepare({
|
|
333
|
-
provider,
|
|
334
|
-
storyId,
|
|
335
|
-
result,
|
|
336
|
-
notify: _notifyFn,
|
|
337
|
-
logger: stageLogger,
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
emitStoryInitResult(result, {
|
|
342
|
-
storyId,
|
|
343
|
-
dryRun,
|
|
344
|
-
});
|
|
345
|
-
|
|
346
|
-
return { success: true, result };
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
const VALID_INSTALLED_STATES = new Set(['true', 'false', 'skipped']);
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Apply the dependenciesInstalled tri-state to derive the next install
|
|
353
|
-
* action. Pure helper — exposes the install truth table as data so tests
|
|
354
|
-
* can pin each branch without spinning up a child process.
|
|
355
|
-
*
|
|
356
|
-
* Story #4249: this is no longer wired into a post-init re-install. The
|
|
357
|
-
* in-`ensure` install (with its PM-aware retry budget) is the single install
|
|
358
|
-
* owner; the formerly-hardcoded `npm ci` retry inside `runStoryInitPrepare`
|
|
359
|
-
* was deleted. The tri-state still flows onto the `story-init` structured
|
|
360
|
-
* comment (`dependenciesInstalled`) as the workflow-facing signal, and this
|
|
361
|
-
* helper remains its canonical classifier.
|
|
362
|
-
*
|
|
363
|
-
* @param {'true' | 'false' | 'skipped'} dependenciesInstalled
|
|
364
|
-
* @param {{ skipInstall?: boolean }} [options]
|
|
365
|
-
* @returns {'skip' | 'install'}
|
|
366
|
-
*/
|
|
367
|
-
export function deriveInstallAction(dependenciesInstalled, options = {}) {
|
|
368
|
-
if (!VALID_INSTALLED_STATES.has(dependenciesInstalled)) {
|
|
369
|
-
throw new RangeError(
|
|
370
|
-
`deriveInstallAction: dependenciesInstalled "${dependenciesInstalled}" must be one of: ${[...VALID_INSTALLED_STATES].join(', ')}`,
|
|
371
|
-
);
|
|
372
|
-
}
|
|
373
|
-
if (options.skipInstall) return 'skip';
|
|
374
|
-
return dependenciesInstalled === 'false' ? 'install' : 'skip';
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Post-init prepare step (Story #4017 — formerly a standalone prepare CLI,
|
|
379
|
-
* now consuming the in-process init result instead of re-reading the
|
|
380
|
-
* `story-init` structured comment).
|
|
381
|
-
*
|
|
382
|
-
* Story #4249: the install branch was deleted. The worktree install is owned
|
|
383
|
-
* entirely by `WorktreeManager.ensure` (via `installDependencies`), which now
|
|
384
|
-
* carries a PM-aware retry budget (`installRetryPolicy`) — so a transient
|
|
385
|
-
* first-attempt failure retries there with the correct package-manager
|
|
386
|
-
* command, never an unconditional `npm ci` re-run after init. This step is now
|
|
387
|
-
* purely the snapshot-render half:
|
|
388
|
-
*
|
|
389
|
-
* - Render the initial Story-phase snapshot with every phase pinned to
|
|
390
|
-
* `pending` and `phase: 'init'` via `upsertStoryRunProgress` (render-only
|
|
391
|
-
* since Story #3909 — no comment is posted). The `renderedBody` markdown is
|
|
392
|
-
* relayed to chat by the delivery workflows so operators see the initial
|
|
393
|
-
* progress block before the first commit lands.
|
|
394
|
-
*
|
|
395
|
-
* A snapshot-render failure is non-fatal observability loss and only warns.
|
|
396
|
-
*
|
|
397
|
-
* @param {{
|
|
398
|
-
* provider: object,
|
|
399
|
-
* storyId: number,
|
|
400
|
-
* result: { storyBranch?: string },
|
|
401
|
-
* notify?: Function | null,
|
|
402
|
-
* logger?: object,
|
|
403
|
-
* }} args
|
|
404
|
-
* @returns {Promise<{
|
|
405
|
-
* snapshot: object | null,
|
|
406
|
-
* renderedBody: string | null,
|
|
407
|
-
* }>}
|
|
408
|
-
*/
|
|
409
|
-
export async function runStoryInitPrepare({
|
|
410
|
-
provider,
|
|
411
|
-
storyId,
|
|
412
|
-
result,
|
|
413
|
-
notify: notifyFn = null,
|
|
414
|
-
logger = stageLogger,
|
|
415
|
-
}) {
|
|
416
|
-
let snapshot = null;
|
|
417
|
-
let renderedBody = null;
|
|
418
|
-
try {
|
|
419
|
-
const { body, payload } = await upsertStoryRunProgress({
|
|
420
|
-
provider,
|
|
421
|
-
storyId,
|
|
422
|
-
branch: result?.storyBranch ?? `story-${storyId}`,
|
|
423
|
-
phase: 'init',
|
|
424
|
-
phases: defaultStoryPhases(),
|
|
425
|
-
notify: notifyFn,
|
|
426
|
-
});
|
|
427
|
-
snapshot = payload;
|
|
428
|
-
renderedBody = body;
|
|
429
|
-
} catch (err) {
|
|
430
|
-
logger?.warn?.(
|
|
431
|
-
`[story-init] ⚠️ Failed to render initial story-run-progress snapshot: ${err?.message ?? err}`,
|
|
432
|
-
);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
return { snapshot, renderedBody };
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
function buildStoryInitResult({
|
|
439
|
-
storyId,
|
|
440
|
-
epicId,
|
|
441
|
-
storyBranch,
|
|
442
|
-
epicBranch,
|
|
443
|
-
story,
|
|
444
|
-
worktreeEnabled,
|
|
445
|
-
workCwd,
|
|
446
|
-
worktreeCreated,
|
|
447
|
-
installStatus,
|
|
448
|
-
sortedTasks,
|
|
449
|
-
parentId,
|
|
450
|
-
dryRun,
|
|
451
|
-
recutOf,
|
|
452
|
-
hierarchy,
|
|
453
|
-
}) {
|
|
454
|
-
const dependenciesInstalled = mapDependenciesInstalled(installStatus);
|
|
455
|
-
return {
|
|
456
|
-
storyId,
|
|
457
|
-
epicId,
|
|
458
|
-
storyBranch,
|
|
459
|
-
epicBranch,
|
|
460
|
-
storyTitle: story.title,
|
|
461
|
-
// Hierarchy mode resolved by buildTaskGraph. 2-tier is the only
|
|
462
|
-
// supported shape after Task #3154 deleted the `planning.hierarchy`
|
|
463
|
-
// flag; this is retained as a constant marker for downstream
|
|
464
|
-
// consumers and persisted artefacts.
|
|
465
|
-
hierarchy: hierarchy ?? '2-tier',
|
|
466
|
-
worktreeEnabled,
|
|
467
|
-
workCwd,
|
|
468
|
-
worktreeCreated,
|
|
469
|
-
installStatus,
|
|
470
|
-
dependenciesInstalled,
|
|
471
|
-
// Retained for back-compat with `temp/` artefacts and operator log
|
|
472
|
-
// scrapers — derived from `installStatus.status === 'failed'`.
|
|
473
|
-
installFailed: installStatus?.status === 'failed',
|
|
474
|
-
recutOf: recutOf ?? null,
|
|
475
|
-
tasks: sortedTasks.map((t) => ({
|
|
476
|
-
id: t.id,
|
|
477
|
-
title: t.title,
|
|
478
|
-
labels: t.labels,
|
|
479
|
-
dependencies: t.dependsOn ?? parseBlockedBy(t.body ?? ''),
|
|
480
|
-
})),
|
|
481
|
-
context: { parentId },
|
|
482
|
-
dryRun,
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
/**
|
|
487
|
-
* Map the structured install status to the workflow-facing tri-state string.
|
|
488
|
-
* Workflow consumers (`story-deliver.md` Step 0.5) read this exact value
|
|
489
|
-
* out of the `story-init` structured comment via
|
|
490
|
-
* `gh issue view --json comments`.
|
|
491
|
-
*
|
|
492
|
-
* @param {{ status?: string }} installStatus
|
|
493
|
-
* @returns {'true' | 'false' | 'skipped'}
|
|
494
|
-
*/
|
|
495
|
-
function mapDependenciesInstalled(installStatus) {
|
|
496
|
-
switch (installStatus?.status) {
|
|
497
|
-
case 'installed':
|
|
498
|
-
return 'true';
|
|
499
|
-
case 'failed':
|
|
500
|
-
return 'false';
|
|
501
|
-
default:
|
|
502
|
-
return 'skipped';
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
async function postStoryInitComment({ provider, storyId, result, logger }) {
|
|
507
|
-
const body = renderStoryInitCommentBody(result);
|
|
508
|
-
try {
|
|
509
|
-
await upsertStructuredComment(provider, storyId, 'story-init', body);
|
|
510
|
-
logger?.progress?.(
|
|
511
|
-
'COMMENT',
|
|
512
|
-
`📝 Upserted story-init structured comment on #${storyId} (dependenciesInstalled=${result.dependenciesInstalled})`,
|
|
513
|
-
);
|
|
514
|
-
} catch (err) {
|
|
515
|
-
// Non-fatal: the structured comment is observability for downstream
|
|
516
|
-
// workflow steps. Failing to post it must not block the agent's
|
|
517
|
-
// implementation work — it can fall back to `installStatus` from the
|
|
518
|
-
// stdout JSON. Surface the error so operators can investigate.
|
|
519
|
-
logger?.warn?.(
|
|
520
|
-
`[story-init] ⚠️ Failed to upsert story-init structured comment: ${err?.message ?? err}`,
|
|
521
|
-
);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
/**
|
|
526
|
-
* Render the markdown body for the `story-init` structured comment. Pure so
|
|
527
|
-
* tests can assert the shape without a provider stub.
|
|
528
|
-
*
|
|
529
|
-
* @param {object} result Output of `buildStoryInitResult`.
|
|
530
|
-
* @returns {string}
|
|
531
|
-
*/
|
|
532
|
-
export function renderStoryInitCommentBody(result) {
|
|
533
|
-
const payload = {
|
|
534
|
-
storyId: result.storyId,
|
|
535
|
-
epicId: result.epicId,
|
|
536
|
-
storyBranch: result.storyBranch,
|
|
537
|
-
epicBranch: result.epicBranch,
|
|
538
|
-
// Hierarchy mode is always `'2-tier'` after Task #3154 deleted the
|
|
539
|
-
// `planning.hierarchy` flag. Persisted so resumed runs can read it
|
|
540
|
-
// without re-resolving anything in the worker.
|
|
541
|
-
hierarchy: result.hierarchy ?? '2-tier',
|
|
542
|
-
worktreeEnabled: result.worktreeEnabled,
|
|
543
|
-
workCwd: result.workCwd,
|
|
544
|
-
worktreeCreated: result.worktreeCreated,
|
|
545
|
-
dependenciesInstalled: result.dependenciesInstalled,
|
|
546
|
-
installStatus: result.installStatus,
|
|
547
|
-
// Embed the canonical task list so downstream snapshot consumers can
|
|
548
|
-
// seed phase-writer calls without re-fetching the task graph.
|
|
549
|
-
tasks: Array.isArray(result.tasks)
|
|
550
|
-
? result.tasks.map((t) => ({ id: t.id, title: t.title }))
|
|
551
|
-
: [],
|
|
552
|
-
};
|
|
553
|
-
return [
|
|
554
|
-
'## Story init',
|
|
555
|
-
'',
|
|
556
|
-
`- **dependenciesInstalled:** \`${result.dependenciesInstalled}\``,
|
|
557
|
-
`- **installStatus.status:** \`${result.installStatus?.status ?? 'unknown'}\``,
|
|
558
|
-
`- **installStatus.reason:** \`${result.installStatus?.reason ?? 'n/a'}\``,
|
|
559
|
-
`- **worktreeEnabled:** \`${result.worktreeEnabled}\``,
|
|
560
|
-
`- **worktreeCreated:** \`${result.worktreeCreated}\``,
|
|
561
|
-
'',
|
|
562
|
-
'```json',
|
|
563
|
-
JSON.stringify(payload, null, 2),
|
|
564
|
-
'```',
|
|
565
|
-
'',
|
|
566
|
-
].join('\n');
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
function emitStoryInitResult(result, { storyId, dryRun }) {
|
|
570
|
-
Logger.info('\n--- STORY INIT RESULT ---');
|
|
571
|
-
Logger.info(JSON.stringify(result, null, 2));
|
|
572
|
-
Logger.info('--- END RESULT ---\n');
|
|
573
|
-
|
|
574
|
-
progress(
|
|
575
|
-
'DONE',
|
|
576
|
-
dryRun
|
|
577
|
-
? '✅ Dry-run complete. No git or ticket changes made.'
|
|
578
|
-
: `✅ Story #${storyId} initialized. Ready for implementation.`,
|
|
579
|
-
);
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
// ---------------------------------------------------------------------------
|
|
583
|
-
// Story-branch reuse surface (Story #3482)
|
|
584
|
-
// ---------------------------------------------------------------------------
|
|
585
|
-
//
|
|
586
|
-
// story-init treats a pre-existing `story-<id>` ref as **reuse**, never an
|
|
587
|
-
// error: the branch-seed stage classifies the (local, remote) state via
|
|
588
|
-
// `planStoryBranchSeed` and short-circuits to a no-op when the ref already
|
|
589
|
-
// exists, and swallows the "already exists" race when a concurrent dispatch
|
|
590
|
-
// creates the ref between the probe and the `git branch` call. Both helpers
|
|
591
|
-
// live in the branch-initializer stage; re-exported here so the reuse contract
|
|
592
|
-
// is reachable (and testable) from the story-init entry point.
|
|
593
|
-
export { ensureStoryBranchSeed, planStoryBranchSeed };
|
|
594
|
-
|
|
595
|
-
// ---------------------------------------------------------------------------
|
|
596
|
-
// Main guard
|
|
597
|
-
// ---------------------------------------------------------------------------
|
|
598
|
-
|
|
599
|
-
runAsCli(import.meta.url, runStoryInit, { source: 'story-init' });
|