mandrel 1.94.0 → 2.1.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 +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- 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 +328 -28
- 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 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- 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/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- 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 +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- 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/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- 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 +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -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 +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
- 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/error-journal.js +0 -139
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
- 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/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- 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-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* phases/code-review.js — Story-scope code-review phase
|
|
3
3
|
* (Story #2840, Epic #2815 — Pluggable Code Review + Story-Level Review).
|
|
4
4
|
*
|
|
5
|
-
* Sits between the close-validation gate chain and the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
5
|
+
* Sits between the close-validation gate chain and merge in the deleted
|
|
6
|
+
* pre-v2 Epic close path (`runStoryCloseLocked` / `locked-pipeline.js`,
|
|
7
|
+
* merge target `epic/<id>`). The v2 `/deliver` path
|
|
8
|
+
* (`single-story-close.js`) reviews `main`…`story-<id>` instead. The
|
|
9
|
+
* configured ReviewProvider runs against the supplied base…head diff. The
|
|
10
|
+
* unified `verification-results`
|
|
9
11
|
* structured comment is posted to the Story issue (default
|
|
10
12
|
* `commentTargetId === ticketId` inside `runCodeReview`). Outcomes:
|
|
11
13
|
*
|
|
@@ -39,7 +41,7 @@ import {
|
|
|
39
41
|
import { gitSpawn } from '../../../git-utils.js';
|
|
40
42
|
import { Logger } from '../../../Logger.js';
|
|
41
43
|
import { runCodeReview } from '../../code-review.js';
|
|
42
|
-
import { emitBlockedCloseResult } from '../
|
|
44
|
+
import { emitBlockedCloseResult } from '../emit-blocked.js';
|
|
43
45
|
|
|
44
46
|
/**
|
|
45
47
|
* The review depth the Story-scope local-lens pass runs at. Shift-left
|
|
@@ -203,15 +205,12 @@ function buildCodeReviewBlockedExtra({ storyId, reviewResult }) {
|
|
|
203
205
|
* `refresh.js`).
|
|
204
206
|
* - Standalone close: propagates throws (a review failure stops the close).
|
|
205
207
|
*
|
|
206
|
-
*
|
|
207
|
-
* `
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
* envelope or the posted structured-comment body. Absent (`null` / `undefined`,
|
|
213
|
-
* the standalone close path) → `runCodeReview` resolves the neutral depth from
|
|
214
|
-
* diff width alone, byte-identical to the pre-#3940 behaviour.
|
|
208
|
+
* Review depth is not passed in: `runCodeReview` derives it entirely from the
|
|
209
|
+
* `baseRef...headRef` diff it enumerates itself — the changed files' sensitive-
|
|
210
|
+
* path intersection plus their count (Story #4542, which retired the
|
|
211
|
+
* planner-authored risk envelope this spine used to forward). Depth remains an
|
|
212
|
+
* **input-only** signal: it tells the provider how thorough to be and never
|
|
213
|
+
* alters the review's output envelope or the posted structured-comment body.
|
|
215
214
|
*
|
|
216
215
|
* @param {{
|
|
217
216
|
* storyId: number|string,
|
|
@@ -221,7 +220,6 @@ function buildCodeReviewBlockedExtra({ storyId, reviewResult }) {
|
|
|
221
220
|
* provider: object,
|
|
222
221
|
* progress: (tag: string, msg: string) => void,
|
|
223
222
|
* progressTag?: string,
|
|
224
|
-
* planningRisk?: { overallLevel?: ('low'|'medium'|'high'), axes?: Array<{ axis?: string, level?: string }> }|null,
|
|
225
223
|
* runCodeReviewFn?: typeof runCodeReview,
|
|
226
224
|
* runLocalLensReviewFn?: typeof runLocalLensReview,
|
|
227
225
|
* }} args
|
|
@@ -239,7 +237,6 @@ export async function runStoryReviewCore({
|
|
|
239
237
|
provider,
|
|
240
238
|
progress,
|
|
241
239
|
progressTag = 'CODE-REVIEW',
|
|
242
|
-
planningRisk = null,
|
|
243
240
|
runCodeReviewFn = runCodeReview,
|
|
244
241
|
runLocalLensReviewFn = runLocalLensReview,
|
|
245
242
|
}) {
|
|
@@ -258,12 +255,6 @@ export async function runStoryReviewCore({
|
|
|
258
255
|
if (commentTargetId != null) {
|
|
259
256
|
opts.commentTargetId = commentTargetId;
|
|
260
257
|
}
|
|
261
|
-
// Forward the parent Epic's judged risk only on the Epic-attached path; the
|
|
262
|
-
// standalone caller leaves this null so `runCodeReview` resolves depth from
|
|
263
|
-
// diff width alone (no plan checkpoint exists for a standalone Story).
|
|
264
|
-
if (planningRisk != null) {
|
|
265
|
-
opts.planningRisk = planningRisk;
|
|
266
|
-
}
|
|
267
258
|
|
|
268
259
|
// Shift-left local-lens pass (Epic #4405). Runs matched local lenses at
|
|
269
260
|
// `light` depth against the actual Story diff, inside this close-subprocess
|
|
@@ -282,29 +273,26 @@ export async function runStoryReviewCore({
|
|
|
282
273
|
}
|
|
283
274
|
|
|
284
275
|
/**
|
|
285
|
-
* Run a Story-scope code review against the
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
276
|
+
* Run a Story-scope code review against the supplied base…head diff
|
|
277
|
+
* (v2: `main`…`story-<id>` via `single-story-close.js`; pre-v2 Epic
|
|
278
|
+
* close: `epic/<id>`…`story-<id>`) and post the structured
|
|
279
|
+
* `code-review` comment to the Story issue. Returns `{ blocked }` where
|
|
280
|
+
* `blocked` is either `null` (caller proceeds to open/merge the PR) or the
|
|
281
|
+
* blocked-envelope (caller returns it verbatim and the CLI exits 1).
|
|
290
282
|
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
* high-risk Epic still earns `deep`, a small Story under a low-risk Epic gets
|
|
297
|
-
* `light`, and an absent envelope resolves `standard` (today's behaviour).
|
|
298
|
-
* Depth is input-only: it never changes `{ blocked }` or the posted comment.
|
|
283
|
+
* Review depth is derived inside `runCodeReview` from this Story's own base…head
|
|
284
|
+
* diff — a narrow change touching a registered sensitive path earns `deep`, a
|
|
285
|
+
* small change touching none gets `light`, a wide diff earns `deep` on size, and
|
|
286
|
+
* an unenumerable diff resolves `standard` (Story #4542). Depth is input-only:
|
|
287
|
+
* it never changes `{ blocked }` or the posted comment.
|
|
299
288
|
*
|
|
300
289
|
* @param {{
|
|
301
290
|
* storyId: number|string,
|
|
302
|
-
*
|
|
291
|
+
* baseBranch: string,
|
|
303
292
|
* storyBranch: string,
|
|
304
293
|
* provider: object,
|
|
305
294
|
* bus: { emit: Function }|null,
|
|
306
295
|
* progress: (tag: string, msg: string) => void,
|
|
307
|
-
* planningRisk?: { overallLevel?: ('low'|'medium'|'high'), axes?: Array<{ axis?: string, level?: string }> }|null,
|
|
308
296
|
* runCodeReviewFn?: typeof runCodeReview,
|
|
309
297
|
* runLocalLensReviewFn?: typeof runLocalLensReview,
|
|
310
298
|
* }} args
|
|
@@ -316,12 +304,11 @@ export async function runStoryReviewCore({
|
|
|
316
304
|
export async function runStoryCodeReview(args) {
|
|
317
305
|
const {
|
|
318
306
|
storyId,
|
|
319
|
-
|
|
307
|
+
baseBranch,
|
|
320
308
|
storyBranch,
|
|
321
309
|
provider,
|
|
322
310
|
bus,
|
|
323
311
|
progress,
|
|
324
|
-
planningRisk = null,
|
|
325
312
|
runCodeReviewFn = runCodeReview,
|
|
326
313
|
runLocalLensReviewFn = runLocalLensReview,
|
|
327
314
|
} = args;
|
|
@@ -329,18 +316,17 @@ export async function runStoryCodeReview(args) {
|
|
|
329
316
|
const storyIdNum = Number(storyId);
|
|
330
317
|
progress(
|
|
331
318
|
'CODE-REVIEW',
|
|
332
|
-
`Running Story-scope review (${
|
|
319
|
+
`Running Story-scope review (${baseBranch}…${storyBranch})...`,
|
|
333
320
|
);
|
|
334
321
|
|
|
335
322
|
let reviewResult;
|
|
336
323
|
try {
|
|
337
324
|
reviewResult = await runStoryReviewCore({
|
|
338
325
|
storyId: storyIdNum,
|
|
339
|
-
baseRef:
|
|
326
|
+
baseRef: baseBranch,
|
|
340
327
|
headRef: storyBranch,
|
|
341
328
|
provider,
|
|
342
329
|
progress,
|
|
343
|
-
planningRisk,
|
|
344
330
|
runCodeReviewFn,
|
|
345
331
|
runLocalLensReviewFn,
|
|
346
332
|
});
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* story-deliver-terminal.js — the one terminal envelope every Story
|
|
3
|
+
* close-and-land invocation emits, and the shared next-command vocabulary
|
|
4
|
+
* (Story #4543).
|
|
5
|
+
*
|
|
6
|
+
* Before this module the delivery tail had **two** divergent return
|
|
7
|
+
* contracts, both prose and neither validated:
|
|
8
|
+
* `.agents/workflows/helpers/deliver-story.md` defined one shape and
|
|
9
|
+
* `.agents/agents/story-worker.md` a different one, so a caller could not
|
|
10
|
+
* distinguish a landed Story from a parked one without re-probing GitHub.
|
|
11
|
+
* `story-deliver-terminal.schema.json` is now the SSOT both docs reference
|
|
12
|
+
* rather than restate, and this module is its only writer.
|
|
13
|
+
*
|
|
14
|
+
* Two exports carry the contract:
|
|
15
|
+
*
|
|
16
|
+
* - {@link buildTerminalEnvelope} assembles and **validates** the envelope.
|
|
17
|
+
* It throws on a schema violation rather than emitting a malformed
|
|
18
|
+
* terminal: a silently-wrong terminal is exactly the failure this Story
|
|
19
|
+
* exists to eliminate, so failing loudly at the writer is the point.
|
|
20
|
+
* - {@link NEXT_COMMANDS} is the next-command vocabulary shared with
|
|
21
|
+
* `deliver-recover.js`, so a `pending` envelope and a recovery probe
|
|
22
|
+
* name the same command for the same state instead of inventing two
|
|
23
|
+
* dialects for one condition.
|
|
24
|
+
*
|
|
25
|
+
* `TERMINAL_EXIT_CODES` maps status → process exit code. `pending` gets its
|
|
26
|
+
* **own** code (3) precisely so a caller can tell "slow CI, resume me" from
|
|
27
|
+
* "hard block, come look" without parsing stdout — the distinction the
|
|
28
|
+
* pre-#4543 pipeline collapsed by treating budget exhaustion as a block.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { readFileSync } from 'node:fs';
|
|
32
|
+
import path from 'node:path';
|
|
33
|
+
import { fileURLToPath } from 'node:url';
|
|
34
|
+
|
|
35
|
+
import Ajv2020 from 'ajv/dist/2020.js';
|
|
36
|
+
import addFormats from 'ajv-formats';
|
|
37
|
+
|
|
38
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const SCHEMA_PATH = path.resolve(
|
|
40
|
+
__dirname,
|
|
41
|
+
'..',
|
|
42
|
+
'..',
|
|
43
|
+
'..',
|
|
44
|
+
'schemas',
|
|
45
|
+
'story-deliver-terminal.schema.json',
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export const TERMINAL_ENVELOPE_KIND = 'story-deliver-terminal';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* status → process exit code.
|
|
52
|
+
*
|
|
53
|
+
* `pending` is **3**, not 0 and not 1. Zero would tell a headless caller the
|
|
54
|
+
* Story landed when it did not; one would conflate a resumable slow-CI wait
|
|
55
|
+
* with a hard block and send the operator to diagnose branch protection that
|
|
56
|
+
* is working fine. A distinct code is what lets `/deliver` resume without
|
|
57
|
+
* classifying.
|
|
58
|
+
*/
|
|
59
|
+
export const TERMINAL_EXIT_CODES = Object.freeze({
|
|
60
|
+
landed: 0,
|
|
61
|
+
pending: 3,
|
|
62
|
+
blocked: 1,
|
|
63
|
+
failed: 1,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const TERMINAL_STATUSES = Object.freeze([
|
|
67
|
+
'landed',
|
|
68
|
+
'pending',
|
|
69
|
+
'blocked',
|
|
70
|
+
'failed',
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The shared next-command vocabulary. Every producer of a "what now?"
|
|
75
|
+
* answer — the `pending` terminal envelope and `deliver-recover.js` —
|
|
76
|
+
* builds its command from here, so the two surfaces never drift into
|
|
77
|
+
* naming different commands for the same observed state.
|
|
78
|
+
*/
|
|
79
|
+
export const NEXT_COMMANDS = Object.freeze({
|
|
80
|
+
/**
|
|
81
|
+
* Resume a bounded merge wait that expired with the PR still in flight.
|
|
82
|
+
*
|
|
83
|
+
* `--wait` is load-bearing: without it the confirm CLI probes once and
|
|
84
|
+
* answers `pending` again, so the cumulative-budget give-up never fires and
|
|
85
|
+
* a wedged PR is never escalated to anyone.
|
|
86
|
+
*/
|
|
87
|
+
resumeLand: (storyId) =>
|
|
88
|
+
`node .agents/scripts/single-story-confirm-merge.js --story ${storyId} --wait`,
|
|
89
|
+
/** Confirm a merged-but-mislabelled Story (the idempotent flip + tail). */
|
|
90
|
+
confirmMerge: (storyId) =>
|
|
91
|
+
`node .agents/scripts/single-story-confirm-merge.js --story ${storyId}`,
|
|
92
|
+
/** Enter the red-CI fix loop against the failing PR. */
|
|
93
|
+
watchCi: (storyId, prNumber) =>
|
|
94
|
+
`node .agents/scripts/pr-watch-with-update.js --pr ${prNumber} --story ${storyId}`,
|
|
95
|
+
/** Re-run close for a Story whose PR was never opened. */
|
|
96
|
+
close: (storyId) =>
|
|
97
|
+
`node .agents/scripts/single-story-close.js --story ${storyId}`,
|
|
98
|
+
/** Resume implementation in the Story worktree. */
|
|
99
|
+
implement: (storyId) =>
|
|
100
|
+
`node .agents/scripts/single-story-init.js --story ${storyId}`,
|
|
101
|
+
/** Re-assert a drifted Projects v2 Status column. */
|
|
102
|
+
resync: (storyId) =>
|
|
103
|
+
`node .agents/scripts/resync-status-column.js --story ${storyId}`,
|
|
104
|
+
/** Probe a stranded Story and print its single next command. */
|
|
105
|
+
recover: (storyId) =>
|
|
106
|
+
`node .agents/scripts/deliver-recover.js --story ${storyId}`,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
/** @type {Function|null} */
|
|
110
|
+
let _validator = null;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Compile (once) and return the terminal-envelope validator.
|
|
114
|
+
*
|
|
115
|
+
* @returns {Function}
|
|
116
|
+
*/
|
|
117
|
+
function getValidator() {
|
|
118
|
+
if (_validator) return _validator;
|
|
119
|
+
const schema = JSON.parse(readFileSync(SCHEMA_PATH, 'utf8'));
|
|
120
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
121
|
+
addFormats(ajv);
|
|
122
|
+
_validator = ajv.compile(schema);
|
|
123
|
+
return _validator;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Validate a candidate envelope against the shipped schema.
|
|
128
|
+
*
|
|
129
|
+
* @param {object} envelope
|
|
130
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
131
|
+
*/
|
|
132
|
+
export function validateTerminalEnvelope(envelope) {
|
|
133
|
+
const validate = getValidator();
|
|
134
|
+
const valid = validate(envelope);
|
|
135
|
+
if (valid) return { valid: true, errors: [] };
|
|
136
|
+
const errors = (validate.errors ?? []).map(
|
|
137
|
+
(e) => `${e.instancePath || '/'} ${e.message}`,
|
|
138
|
+
);
|
|
139
|
+
return { valid: false, errors };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Drop `undefined`-valued keys so the schema's `additionalProperties: false`
|
|
144
|
+
* and its nullable unions both stay satisfiable from one optional-argument
|
|
145
|
+
* builder signature.
|
|
146
|
+
*
|
|
147
|
+
* @param {object} obj
|
|
148
|
+
* @returns {object}
|
|
149
|
+
*/
|
|
150
|
+
function compact(obj) {
|
|
151
|
+
const out = {};
|
|
152
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
153
|
+
if (v !== undefined) out[k] = v;
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Assemble the terminal envelope and validate it before returning.
|
|
160
|
+
*
|
|
161
|
+
* Throws a `TypeError` naming the schema violations when the assembled
|
|
162
|
+
* object does not validate. That is deliberate: the whole point of the
|
|
163
|
+
* envelope is that a caller can trust its status without re-probing
|
|
164
|
+
* GitHub, so emitting an unvalidated one would reintroduce the ambiguity
|
|
165
|
+
* this replaces.
|
|
166
|
+
*
|
|
167
|
+
* @param {object} args
|
|
168
|
+
* @param {number} args.storyId
|
|
169
|
+
* @param {'landed'|'pending'|'blocked'|'failed'} args.status
|
|
170
|
+
* @param {string} args.phase
|
|
171
|
+
* @param {string} [args.storyBranch]
|
|
172
|
+
* @param {string} [args.baseBranch]
|
|
173
|
+
* @param {object|null} [args.pr]
|
|
174
|
+
* @param {object} [args.gates]
|
|
175
|
+
* @param {object|null} [args.tail]
|
|
176
|
+
* @param {object|null} [args.blocked]
|
|
177
|
+
* @param {object|null} [args.failure]
|
|
178
|
+
* @param {string|null} [args.nextCommand]
|
|
179
|
+
* @param {number} args.elapsedSeconds
|
|
180
|
+
* @param {object|null} [args.waitBudget]
|
|
181
|
+
* @param {string} [args.timestamp]
|
|
182
|
+
* @returns {object} The validated envelope.
|
|
183
|
+
*/
|
|
184
|
+
export function buildTerminalEnvelope({
|
|
185
|
+
storyId,
|
|
186
|
+
status,
|
|
187
|
+
phase,
|
|
188
|
+
storyBranch,
|
|
189
|
+
baseBranch,
|
|
190
|
+
pr,
|
|
191
|
+
gates,
|
|
192
|
+
tail,
|
|
193
|
+
blocked,
|
|
194
|
+
failure,
|
|
195
|
+
nextCommand,
|
|
196
|
+
elapsedSeconds = 0,
|
|
197
|
+
waitBudget,
|
|
198
|
+
timestamp = new Date().toISOString(),
|
|
199
|
+
}) {
|
|
200
|
+
const envelope = compact({
|
|
201
|
+
kind: TERMINAL_ENVELOPE_KIND,
|
|
202
|
+
storyId: Number(storyId),
|
|
203
|
+
status,
|
|
204
|
+
phase,
|
|
205
|
+
storyBranch: storyBranch ?? null,
|
|
206
|
+
baseBranch: baseBranch ?? null,
|
|
207
|
+
pr: pr ?? null,
|
|
208
|
+
gates,
|
|
209
|
+
tail: tail ?? null,
|
|
210
|
+
blocked: blocked ?? null,
|
|
211
|
+
failure: failure ?? null,
|
|
212
|
+
nextCommand: nextCommand ?? null,
|
|
213
|
+
elapsedSeconds: Math.max(0, Number(elapsedSeconds) || 0),
|
|
214
|
+
waitBudget: waitBudget ?? null,
|
|
215
|
+
timestamp,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const { valid, errors } = validateTerminalEnvelope(envelope);
|
|
219
|
+
if (!valid) {
|
|
220
|
+
throw new TypeError(
|
|
221
|
+
`buildTerminalEnvelope: assembled envelope violates story-deliver-terminal.schema.json:\n` +
|
|
222
|
+
errors.map((e) => ` - ${e}`).join('\n'),
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return envelope;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Resolve the process exit code for a terminal envelope.
|
|
230
|
+
*
|
|
231
|
+
* @param {object} envelope
|
|
232
|
+
* @returns {number}
|
|
233
|
+
*/
|
|
234
|
+
export function exitCodeForTerminal(envelope) {
|
|
235
|
+
return TERMINAL_EXIT_CODES[envelope?.status] ?? 1;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** The markers a caller scans stdout for to recover the envelope. */
|
|
239
|
+
export const TERMINAL_BEGIN_MARKER = '--- STORY DELIVER TERMINAL ---';
|
|
240
|
+
export const TERMINAL_END_MARKER = '--- END TERMINAL ---';
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Write a terminal envelope to stdout, between its markers.
|
|
244
|
+
*
|
|
245
|
+
* **Deliberately not `Logger.info`.** The envelope is this CLI's
|
|
246
|
+
* machine-readable contract — every invocation emits exactly ONE, and a
|
|
247
|
+
* headless caller parses it out of stdout to decide what happened.
|
|
248
|
+
* `Logger.info` is level-gated, so under the documented
|
|
249
|
+
* `AGENT_LOG_LEVEL=silent` (§ 1.H) the envelope silently vanished and the
|
|
250
|
+
* caller got a bare exit code: precisely the "no envelope at all" outcome
|
|
251
|
+
* Story #4543 exists to remove. A contract payload must not be suppressible
|
|
252
|
+
* by a verbosity knob.
|
|
253
|
+
*
|
|
254
|
+
* Single home for the marker format so the four emit sites (the runner's
|
|
255
|
+
* terminal, the close CLI's failed-terminal catch, and both confirm-CLI
|
|
256
|
+
* paths) cannot drift apart.
|
|
257
|
+
*
|
|
258
|
+
* @param {object} envelope
|
|
259
|
+
* @param {{ write?: (s: string) => void }} [opts] `write` is a test seam.
|
|
260
|
+
* @returns {void}
|
|
261
|
+
*/
|
|
262
|
+
export function emitTerminalEnvelope(
|
|
263
|
+
envelope,
|
|
264
|
+
{ write = (s) => process.stdout.write(s) } = {},
|
|
265
|
+
) {
|
|
266
|
+
write(
|
|
267
|
+
`\n${TERMINAL_BEGIN_MARKER}\n${JSON.stringify(envelope, null, 2)}\n${TERMINAL_END_MARKER}\n`,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Map a `runConfirmMergePhase` outcome onto the schema-validated terminal
|
|
273
|
+
* envelope (Story #4543). One writer, one shape — the two prose contracts
|
|
274
|
+
* this replaces disagreed with each other precisely because each surface
|
|
275
|
+
* assembled its own.
|
|
276
|
+
*
|
|
277
|
+
* @returns {object} A validated `story-deliver-terminal` envelope.
|
|
278
|
+
*/
|
|
279
|
+
export function terminalFromWaitOutcome({
|
|
280
|
+
waitOutcome,
|
|
281
|
+
storyId,
|
|
282
|
+
storyBranch,
|
|
283
|
+
baseBranch,
|
|
284
|
+
prNumber,
|
|
285
|
+
prUrl,
|
|
286
|
+
autoMergeEnabled,
|
|
287
|
+
gates,
|
|
288
|
+
elapsedSeconds,
|
|
289
|
+
}) {
|
|
290
|
+
const prBase = {
|
|
291
|
+
number: prNumber,
|
|
292
|
+
url: prUrl ?? null,
|
|
293
|
+
autoMergeEnabled: Boolean(autoMergeEnabled),
|
|
294
|
+
};
|
|
295
|
+
const common = {
|
|
296
|
+
storyId,
|
|
297
|
+
storyBranch,
|
|
298
|
+
baseBranch,
|
|
299
|
+
gates,
|
|
300
|
+
elapsedSeconds,
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
if (waitOutcome.terminal === 'landed') {
|
|
304
|
+
return buildTerminalEnvelope({
|
|
305
|
+
...common,
|
|
306
|
+
status: 'landed',
|
|
307
|
+
phase: 'post-land',
|
|
308
|
+
pr: {
|
|
309
|
+
...prBase,
|
|
310
|
+
state: 'MERGED',
|
|
311
|
+
// The observed rollup, not an assumed 'success' — a merge can land by
|
|
312
|
+
// admin override or with non-required checks red.
|
|
313
|
+
checksStatus: waitOutcome.prProbe?.checksStatus ?? null,
|
|
314
|
+
},
|
|
315
|
+
tail: waitOutcome.tail,
|
|
316
|
+
nextCommand: null,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (waitOutcome.terminal === 'pending') {
|
|
321
|
+
return buildTerminalEnvelope({
|
|
322
|
+
...common,
|
|
323
|
+
status: 'pending',
|
|
324
|
+
phase: 'confirm-merge',
|
|
325
|
+
pr: {
|
|
326
|
+
...prBase,
|
|
327
|
+
state: waitOutcome.prProbe?.state ?? 'OPEN',
|
|
328
|
+
checksStatus: waitOutcome.prProbe?.checksStatus ?? null,
|
|
329
|
+
},
|
|
330
|
+
waitBudget: waitOutcome.waitBudget,
|
|
331
|
+
nextCommand: NEXT_COMMANDS.resumeLand(storyId),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// blocked — the classifier already named the class and the friction
|
|
336
|
+
// comment already carries the class-specific remediation, so the next
|
|
337
|
+
// command mirrors it rather than inventing a second opinion.
|
|
338
|
+
const nextCommand =
|
|
339
|
+
waitOutcome.blockClass === 'checks-failed'
|
|
340
|
+
? NEXT_COMMANDS.watchCi(storyId, prNumber)
|
|
341
|
+
: waitOutcome.blockClass === 'merged-flip-failed'
|
|
342
|
+
? NEXT_COMMANDS.confirmMerge(storyId)
|
|
343
|
+
: NEXT_COMMANDS.recover(storyId);
|
|
344
|
+
return buildTerminalEnvelope({
|
|
345
|
+
...common,
|
|
346
|
+
status: 'blocked',
|
|
347
|
+
phase: 'confirm-merge',
|
|
348
|
+
pr: {
|
|
349
|
+
...prBase,
|
|
350
|
+
state: waitOutcome.prProbe?.state ?? null,
|
|
351
|
+
checksStatus: waitOutcome.prProbe?.checksStatus ?? null,
|
|
352
|
+
},
|
|
353
|
+
blocked: {
|
|
354
|
+
blockClass: waitOutcome.blockClass,
|
|
355
|
+
reason: waitOutcome.reason,
|
|
356
|
+
frictionCommentId: waitOutcome.frictionCommentId ?? null,
|
|
357
|
+
},
|
|
358
|
+
nextCommand,
|
|
359
|
+
});
|
|
360
|
+
}
|