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,23 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* spec-author-prompts.js —
|
|
3
|
-
* Spec authoring system prompts (Epic #4474, M3 PR2).
|
|
2
|
+
* spec-author-prompts.js — Story-scoped Spec / Acceptance authoring prompts.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* into `systemPrompts.spec` / `systemPrompts.acceptance` so the envelope
|
|
11
|
-
* is authoritative from day one, and M8 (#4479) then deletes the
|
|
12
|
-
* skill-side copies. This mirrors the Story #4162 pattern established by
|
|
13
|
-
* `decomposer-prompts.js` for the decompose prompt: one rendered carrier,
|
|
14
|
-
* no second verbatim copy to drift.
|
|
4
|
+
* v2 keeps a single executable document per Story. These prompts used to
|
|
5
|
+
* author a separate Epic Tech Spec + Acceptance Spec that were folded into
|
|
6
|
+
* the Epic body and then restated on Stories — a duplication source. They
|
|
7
|
+
* now author only Story `## Spec` approach prose and remind authors that
|
|
8
|
+
* acceptance lives once on the Story (`acceptance[]` / `## Acceptance`).
|
|
15
9
|
*/
|
|
16
10
|
|
|
17
11
|
/**
|
|
18
|
-
* The Tech Spec authoring system prompt (verbatim from the
|
|
19
|
-
* `epic-plan-spec-author` SKILL's authoritative block).
|
|
20
|
-
*
|
|
21
12
|
* @returns {string}
|
|
22
13
|
*/
|
|
23
14
|
export function renderTechSpecSystemPrompt() {
|
|
@@ -25,9 +16,6 @@ export function renderTechSpecSystemPrompt() {
|
|
|
25
16
|
}
|
|
26
17
|
|
|
27
18
|
/**
|
|
28
|
-
* The Acceptance Spec authoring system prompt (verbatim from the
|
|
29
|
-
* `epic-plan-spec-author` SKILL's authoritative block).
|
|
30
|
-
*
|
|
31
19
|
* @returns {string}
|
|
32
20
|
*/
|
|
33
21
|
export function renderAcceptanceSpecSystemPrompt() {
|
|
@@ -35,40 +23,54 @@ export function renderAcceptanceSpecSystemPrompt() {
|
|
|
35
23
|
}
|
|
36
24
|
|
|
37
25
|
const TECH_SPEC_SYSTEM_PROMPT = `You are an expert Engineering Architect.
|
|
38
|
-
Your job is to
|
|
26
|
+
Your job is to author the Story's \`## Spec\` approach section — the technical
|
|
27
|
+
how for one cohesive, executable Story. There is no separate Epic Tech Spec
|
|
28
|
+
document and no spill-to-docs path.
|
|
39
29
|
|
|
40
|
-
The
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
30
|
+
The Spec should outline only what an implementing agent needs beyond Goal /
|
|
31
|
+
Changes / Acceptance:
|
|
32
|
+
1. Architecture & Design (approach, seams, reuse)
|
|
33
|
+
2. Data Models (if any)
|
|
34
|
+
3. API Changes (if any)
|
|
35
|
+
4. Core Components
|
|
36
|
+
5. Security & Privacy Considerations
|
|
47
37
|
|
|
48
38
|
CRITICAL REQUIREMENTS:
|
|
49
|
-
- Respond ONLY with valid Markdown
|
|
50
|
-
- Do not use top-level <h1> (# ) tags.
|
|
51
|
-
- Do NOT restate the
|
|
39
|
+
- Respond ONLY with valid Markdown suitable to paste into a Story \`## Spec\`.
|
|
40
|
+
- Do not use top-level <h1> (# ) tags. Prefer \`##\` / \`###\` under Spec.
|
|
41
|
+
- Do NOT restate the Story's Goal, Acceptance, Verify, Changes, or Non-Goals —
|
|
42
|
+
those sections already live on the same Story body. Restatement is
|
|
43
|
+
duplication and a drift risk. If a brief orientation helps, keep a
|
|
44
|
+
\`## Technical Overview\` to 2–3 sentences naming the technical approach only.
|
|
45
|
+
- Do NOT author a Delivery Slicing / fan-out table. If the work needs multiple
|
|
46
|
+
independent Stories, say so in one short note and stop — oversized Specs
|
|
47
|
+
mean the Story should be split, not documented elsewhere.
|
|
52
48
|
- Format architectural decisions clearly with bullet points.
|
|
53
|
-
-
|
|
49
|
+
- Keep the Spec lean enough to stay inline on the Story (persist rejects
|
|
50
|
+
over-budget Specs; they are never written under docs/).`;
|
|
54
51
|
|
|
55
52
|
const ACCEPTANCE_SPEC_SYSTEM_PROMPT = `You are an expert Acceptance Engineer.
|
|
56
|
-
Your job is to
|
|
53
|
+
Your job is to help author the Story's binding acceptance contract — not a
|
|
54
|
+
separate Acceptance Spec document.
|
|
57
55
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
v2 rule: acceptance lives **once**, on the Story:
|
|
57
|
+
- Machine contract: top-level \`acceptance[]\` (and \`verify[]\`) on the ticket JSON
|
|
58
|
+
- Human document: the same items rendered under \`## Acceptance\` / \`## Verify\`
|
|
59
|
+
on the Story body (persist syncs top-level into the body)
|
|
62
60
|
|
|
63
|
-
|
|
61
|
+
Do **not** author an Epic Acceptance Table, PRD restatement, or a second
|
|
62
|
+
criteria list inside \`## Spec\`.
|
|
64
63
|
|
|
65
64
|
CRITICAL REQUIREMENTS:
|
|
66
|
-
- Respond ONLY with
|
|
67
|
-
|
|
68
|
-
- Every
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
|
|
65
|
+
- Respond ONLY with guidance or a draft \`acceptance[]\` / \`verify[]\` list for
|
|
66
|
+
one Story — never a parallel "Acceptance Spec" markdown artifact.
|
|
67
|
+
- Every acceptance item MUST be observable from outside the agent (command
|
|
68
|
+
exits 0, file exists, selector resolves, fixture count matches). Reject
|
|
69
|
+
vague "matches the spec" / "looks good" items.
|
|
70
|
+
- Every verify entry MUST name a tier in parentheses: unit | contract | e2e |
|
|
71
|
+
validate (or \`manual:<reason>\` when genuinely unverifiable in isolation).
|
|
72
|
+
- Do NOT re-elaborate Goal or Spec prose inside acceptance items — bind the
|
|
73
|
+
outcome, not the approach.
|
|
74
|
+
- Acceptance Outcomes MUST NOT prescribe a commit subject that begins with a
|
|
75
|
+
non-Conventional-Commits prefix (allowed leading types: feat|fix|chore|
|
|
76
|
+
refactor|perf|docs|style|test|build|ci|revert).`;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ticket-body-sections.js — marker-delimited managed sections of a
|
|
3
|
+
* planning ticket body.
|
|
3
4
|
*
|
|
4
5
|
* Story #4324 retired the `context::tech-spec` / `context::acceptance-spec`
|
|
5
|
-
* ticket classes: the
|
|
6
|
-
* Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
|
|
7
|
-
* Acceptance Spec's AC-ID table (`## Acceptance Table
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* *only its own region* without rewriting the rest of the body.
|
|
6
|
+
* ticket classes: the planning ticket body is the single planning document.
|
|
7
|
+
* The Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
|
|
8
|
+
* Acceptance Spec's AC-ID table (`## Acceptance Table`) land as **managed
|
|
9
|
+
* sections**, delimited by invisible HTML comment markers so each writer
|
|
10
|
+
* can update *only its own region* without rewriting the rest of the body.
|
|
11
11
|
*
|
|
12
12
|
* Section-scoped writes are the load-bearing contract (extending the
|
|
13
13
|
* single-writer discipline #4303 established for the body trailer):
|
|
14
14
|
*
|
|
15
|
-
* - The
|
|
16
|
-
*
|
|
15
|
+
* - The `/plan` persist path upserts the `techSpec` and `acceptanceTable`
|
|
16
|
+
* regions.
|
|
17
17
|
* - The close-time acceptance reconciler
|
|
18
18
|
* (`acceptance-spec-reconciler.js`) reads and rewrites the
|
|
19
19
|
* `acceptanceTable` region only (verification dispositions).
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
*
|
|
33
33
|
* @type {Readonly<Record<'techSpec'|'acceptanceTable', { start: string, end: string, label: string }>>}
|
|
34
34
|
*/
|
|
35
|
-
export const
|
|
35
|
+
export const TICKET_BODY_SECTIONS = Object.freeze({
|
|
36
36
|
techSpec: Object.freeze({
|
|
37
37
|
start: '<!-- mandrel:tech-spec:start -->',
|
|
38
38
|
end: '<!-- mandrel:tech-spec:end -->',
|
|
@@ -47,7 +47,7 @@ export const EPIC_BODY_SECTIONS = Object.freeze({
|
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* Canonical heading the acceptance-table region opens with. Distinct from
|
|
50
|
-
* the
|
|
50
|
+
* the ticket's ideation `## Acceptance Criteria` bullets (which remain the
|
|
51
51
|
* SSOT for *what* the table verifies — the table anchors to those bullets).
|
|
52
52
|
*/
|
|
53
53
|
export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
|
|
@@ -56,7 +56,7 @@ export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
|
|
|
56
56
|
* Regex matching the Tech Spec's required opening heading (same variants
|
|
57
57
|
* `spec-section-validator.js` accepts). Exported so it is the single
|
|
58
58
|
* source of truth for this pattern — `spec-section-validator.js`,
|
|
59
|
-
* `
|
|
59
|
+
* `consolidation-precondition.js` all import
|
|
60
60
|
* it rather than each carrying their own copy.
|
|
61
61
|
*/
|
|
62
62
|
export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
|
|
@@ -66,10 +66,10 @@ export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
|
|
|
66
66
|
* @returns {{ start: string, end: string, label: string }}
|
|
67
67
|
*/
|
|
68
68
|
function descriptor(kind) {
|
|
69
|
-
const d =
|
|
69
|
+
const d = TICKET_BODY_SECTIONS[kind];
|
|
70
70
|
if (!d) {
|
|
71
71
|
throw new TypeError(
|
|
72
|
-
`
|
|
72
|
+
`ticket-body-sections: unknown section kind "${kind}" (expected ${Object.keys(TICKET_BODY_SECTIONS).join(' | ')})`,
|
|
73
73
|
);
|
|
74
74
|
}
|
|
75
75
|
return d;
|
|
@@ -103,7 +103,7 @@ function locate(body, kind) {
|
|
|
103
103
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
104
104
|
* @returns {boolean}
|
|
105
105
|
*/
|
|
106
|
-
export function
|
|
106
|
+
export function hasTicketSection(body, kind) {
|
|
107
107
|
return locate(body, kind) !== null;
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -115,7 +115,7 @@ export function hasEpicSection(body, kind) {
|
|
|
115
115
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
116
116
|
* @returns {string|null}
|
|
117
117
|
*/
|
|
118
|
-
export function
|
|
118
|
+
export function extractTicketSection(body, kind) {
|
|
119
119
|
const loc = locate(body, kind);
|
|
120
120
|
if (!loc) return null;
|
|
121
121
|
return body.slice(loc.contentStart, loc.contentEnd).trim();
|
|
@@ -136,7 +136,7 @@ export function extractEpicSection(body, kind) {
|
|
|
136
136
|
* @param {string} content Section content (headings included).
|
|
137
137
|
* @returns {string}
|
|
138
138
|
*/
|
|
139
|
-
export function
|
|
139
|
+
export function upsertTicketSection(body, kind, content) {
|
|
140
140
|
const { start, end } = descriptor(kind);
|
|
141
141
|
const safeBody = typeof body === 'string' ? body : '';
|
|
142
142
|
const trimmedContent = typeof content === 'string' ? content.trim() : '';
|
|
@@ -179,7 +179,7 @@ export function upsertEpicSection(body, kind, content) {
|
|
|
179
179
|
* @param {'techSpec'|'acceptanceTable'} kind
|
|
180
180
|
* @returns {string}
|
|
181
181
|
*/
|
|
182
|
-
export function
|
|
182
|
+
export function stripTicketSection(body, kind) {
|
|
183
183
|
const { end } = descriptor(kind);
|
|
184
184
|
const loc = locate(body, kind);
|
|
185
185
|
if (!loc) return typeof body === 'string' ? body : '';
|
|
@@ -189,7 +189,7 @@ export function stripEpicSection(body, kind) {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
/**
|
|
192
|
-
* Re-plan / decompose detection: true when the
|
|
192
|
+
* Re-plan / decompose detection: true when the ticket body carries folded
|
|
193
193
|
* Tech Spec content — the managed region, or (defence in depth for a
|
|
194
194
|
* hand-authored body) a bare `## Delivery Slicing` heading.
|
|
195
195
|
*
|
|
@@ -197,7 +197,7 @@ export function stripEpicSection(body, kind) {
|
|
|
197
197
|
* @returns {boolean}
|
|
198
198
|
*/
|
|
199
199
|
export function hasTechSpecContent(body) {
|
|
200
|
-
if (
|
|
200
|
+
if (hasTicketSection(body, 'techSpec')) return true;
|
|
201
201
|
return typeof body === 'string' && DELIVERY_SLICING_RE.test(body);
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -217,9 +217,9 @@ const DELIVERY_DROP_HEADINGS = new Set([
|
|
|
217
217
|
]);
|
|
218
218
|
|
|
219
219
|
/**
|
|
220
|
-
* Slice
|
|
220
|
+
* Slice a planning ticket body down to the sections a delivery story agent acts on.
|
|
221
221
|
*
|
|
222
|
-
* KEEP: the
|
|
222
|
+
* KEEP: the ticket title / preamble before the first `##`, `## Goal`,
|
|
223
223
|
* `## Non-Goals`, `## User Stories`, the `techSpec` managed region, and —
|
|
224
224
|
* fail-open — any unknown / operator-authored `##` section not in the drop
|
|
225
225
|
* list. DROP: `## Context`, `## Scope`, `## Acceptance Criteria`, and the
|
|
@@ -236,12 +236,12 @@ const DELIVERY_DROP_HEADINGS = new Set([
|
|
|
236
236
|
* @param {string} body
|
|
237
237
|
* @returns {string}
|
|
238
238
|
*/
|
|
239
|
-
export function
|
|
239
|
+
export function sliceTicketBodyForDelivery(body) {
|
|
240
240
|
if (typeof body !== 'string' || body.length === 0) return '';
|
|
241
241
|
|
|
242
242
|
// 1. Drop the acceptance-table managed region outright (authoring/close
|
|
243
243
|
// machinery, never delivery context).
|
|
244
|
-
let working =
|
|
244
|
+
let working = stripTicketSection(body, 'acceptanceTable');
|
|
245
245
|
|
|
246
246
|
// 2. Protect the techSpec managed region from heading-boundary slicing by
|
|
247
247
|
// lifting it out behind an opaque placeholder, then restoring it after
|
|
@@ -261,7 +261,7 @@ export function sliceEpicBodyForDelivery(body) {
|
|
|
261
261
|
|
|
262
262
|
// 3. Slice plain `##` sections by heading boundaries, dropping only the
|
|
263
263
|
// known ideation/authoring headings. The preamble before the first
|
|
264
|
-
// `##` (
|
|
264
|
+
// `##` (ticket title / lede) is always kept.
|
|
265
265
|
const kept = [];
|
|
266
266
|
let dropping = false;
|
|
267
267
|
for (const line of working.split('\n')) {
|
|
@@ -291,7 +291,7 @@ export function sliceEpicBodyForDelivery(body) {
|
|
|
291
291
|
|
|
292
292
|
/**
|
|
293
293
|
* Strip the retired machine-managed `## Planning Artifacts` checklist from
|
|
294
|
-
*
|
|
294
|
+
* a planning ticket body (the section that linked the now-retired context tickets).
|
|
295
295
|
* The slice ends at the next `## ` heading, a managed-region marker, or
|
|
296
296
|
* EOF. Historical bodies without the section pass through untouched.
|
|
297
297
|
*
|
|
@@ -336,7 +336,7 @@ export function shouldSkip(
|
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
/**
|
|
339
|
-
* Delete the evidence file for `scopeId`. Called by `story-init.js` at the
|
|
339
|
+
* Delete the evidence file for `scopeId`. Called by `single-story-init.js` at the
|
|
340
340
|
* start of each Story so a re-run always starts clean. Idempotent —
|
|
341
341
|
* absent file is not an error.
|
|
342
342
|
*
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* lib/wave-runner/ready-set.js — the path-agnostic ready-set scheduling
|
|
3
3
|
* core.
|
|
4
4
|
*
|
|
5
|
-
* This module is the scheduling kernel
|
|
6
|
-
*
|
|
5
|
+
* This module is the scheduling kernel the v2 `/deliver` multi-Story path
|
|
6
|
+
* dispatches through (`stories-wave-tick.js`). It replaces wave-*batch* selection
|
|
7
7
|
* (group N must fully drain before group N+1 opens) with *continuous*,
|
|
8
8
|
* dependency-driven selection: a Story becomes dispatchable the instant
|
|
9
9
|
* **its own** dependencies are satisfied, regardless of whether unrelated
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
* reads GitHub, the lifecycle ledger, nor a checkpoint, and it dispatches
|
|
16
16
|
* nothing. Callers supply the live Story records (already fetched), the
|
|
17
17
|
* resolved `inFlight` count, and the `globalCap`, and receive back the set
|
|
18
|
-
* of Stories that are safe to dispatch on this beat.
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* of Stories that are safe to dispatch on this beat. The
|
|
19
|
+
* `stories-wave-tick.js` adapter wires this core; this module does not
|
|
20
|
+
* modify that CLI surface.
|
|
21
21
|
*
|
|
22
22
|
* Three exports:
|
|
23
23
|
* - `classifyStory(story)` — live-label classifier mapping a Story
|
|
24
24
|
* record's labels + issue state to one of `done | blocked | executing |
|
|
25
|
-
* ready`. Mirrors the done-predicate
|
|
25
|
+
* ready`. Mirrors the done-predicate this module uses
|
|
26
26
|
* (`agent::done` OR closed issue) so a Story closed manually through
|
|
27
27
|
* the GitHub UI is recognised as done.
|
|
28
28
|
* - `storiesOverlap(a, b)` — the file-overlap co-dispatch guard: true
|
|
@@ -145,7 +145,7 @@ export function provision({
|
|
|
145
145
|
/**
|
|
146
146
|
* Throw if any required workspace file is missing from `worktree`. Used as a
|
|
147
147
|
* runtime guard (called right after every worktree create in
|
|
148
|
-
* `story-init.js`) and as a test oracle.
|
|
148
|
+
* `single-story-init.js`) and as a test oracle.
|
|
149
149
|
*
|
|
150
150
|
* When `sourceRoot` is supplied, the thrown error carries the missing target
|
|
151
151
|
* path and an exact `cp`/`copy` command the operator can paste to remediate.
|
|
@@ -52,14 +52,12 @@ const WINDOWS_CWD_RE =
|
|
|
52
52
|
* proves the Story branch was integrated even though the current HEAD
|
|
53
53
|
* has diverged, so the worktree is still safe to reap.
|
|
54
54
|
*
|
|
55
|
-
* `opts.
|
|
56
|
-
*
|
|
57
|
-
* sites that thread `{ epicBranch }` through `reap()` keep working until
|
|
58
|
-
* they migrate.
|
|
55
|
+
* `opts.epicBranch` is the integration / base ref the Story must already
|
|
56
|
+
* be merged into (e.g. `main` or a plan-run branch).
|
|
59
57
|
*
|
|
60
58
|
* @param {object} ctx
|
|
61
59
|
* @param {string} wtPath
|
|
62
|
-
* @param {{
|
|
60
|
+
* @param {{ epicBranch?: string|null }} [opts]
|
|
63
61
|
* @returns {Promise<{ safe: boolean, reason?: string }>}
|
|
64
62
|
*/
|
|
65
63
|
export async function isSafeToRemove(ctx, wtPath, opts = {}) {
|
|
@@ -67,7 +65,7 @@ export async function isSafeToRemove(ctx, wtPath, opts = {}) {
|
|
|
67
65
|
if (!local.safe) return local;
|
|
68
66
|
if (local.reason === 'path-missing') return local;
|
|
69
67
|
|
|
70
|
-
const epicRef = opts.
|
|
68
|
+
const epicRef = opts.epicBranch ?? opts.epicRef ?? null;
|
|
71
69
|
if (!epicRef) return { safe: true };
|
|
72
70
|
|
|
73
71
|
return checkMergeReachability(ctx, wtPath, local.branch, epicRef);
|
|
@@ -483,7 +481,7 @@ function checkReapPreconditions(ctx, _storyId, opts, wtPath) {
|
|
|
483
481
|
|
|
484
482
|
async function ensureSafeOrForceDiscard(ctx, storyId, wtPath, opts) {
|
|
485
483
|
const safety = await isSafeToRemove(ctx, wtPath, {
|
|
486
|
-
|
|
484
|
+
epicBranch: opts.epicBranch ?? null,
|
|
487
485
|
});
|
|
488
486
|
if (safety.safe) return { ok: true, discardedPaths: null };
|
|
489
487
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Issue-body conformance lint (Story #4227).
|
|
5
5
|
*
|
|
6
6
|
* Runs the canonical `story-body.parse()` against a human-opened
|
|
7
|
-
* `type::story`
|
|
7
|
+
* `type::story` issue body and reports whether the body
|
|
8
8
|
* round-trips. This is the drift guard between the generated GitHub Issue
|
|
9
9
|
* Forms (`lib/bootstrap/issue-forms-template.js`) and the parser: if a
|
|
10
10
|
* human files a ticket whose body `parse()` rejects (or which lacks the
|
|
@@ -114,12 +114,12 @@ export function evaluateIssueBody(body) {
|
|
|
114
114
|
|
|
115
115
|
const problems = [];
|
|
116
116
|
|
|
117
|
-
//
|
|
117
|
+
// An unstructured body parses but carries no structured sections — that
|
|
118
118
|
// is exactly the human-filed shape this lint exists to catch.
|
|
119
|
-
if (result.info.
|
|
119
|
+
if (result.info.isUnstructuredBody) {
|
|
120
120
|
problems.push(
|
|
121
121
|
'The body has no recognised `## Goal` / `## Acceptance` / `## Verify` sections. ' +
|
|
122
|
-
'File via the Story
|
|
122
|
+
'File via the Story issue form so it round-trips through the parser.',
|
|
123
123
|
);
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -162,7 +162,7 @@ export function renderConformanceComment(verdict) {
|
|
|
162
162
|
'',
|
|
163
163
|
...verdict.problems.map((p) => `- ${p}`),
|
|
164
164
|
'',
|
|
165
|
-
'The quickest fix is to refile using the **Story**
|
|
165
|
+
'The quickest fix is to refile using the **Story** issue form ' +
|
|
166
166
|
'(New issue → pick the template), which lays out the required sections.',
|
|
167
167
|
];
|
|
168
168
|
if (verdict.warnings.length > 0) {
|
|
@@ -196,32 +196,40 @@ function gh(args) {
|
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
/**
|
|
199
|
-
*
|
|
200
|
-
* `ISSUE_NUMBER` env), fetches its body + labels, and — when the body is
|
|
201
|
-
* non-conformant — upserts a single marker comment. Always exits 0 (the
|
|
202
|
-
* lint *informs*, it does not block), unless an unexpected I/O error occurs.
|
|
199
|
+
* Stage 5: only `type::story` tickets are in scope (type::epic retired).
|
|
203
200
|
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* --repo <o/r> owner/repo (defaults to env GITHUB_REPOSITORY).
|
|
207
|
-
* --dry-run Evaluate + print the verdict, never touch GitHub.
|
|
201
|
+
* @param {string[]} labelNames
|
|
202
|
+
* @returns {boolean}
|
|
208
203
|
*/
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const i = args.indexOf(flag);
|
|
213
|
-
return i >= 0 ? args[i + 1] : undefined;
|
|
214
|
-
};
|
|
215
|
-
const dryRun = args.includes('--dry-run');
|
|
216
|
-
const issue = get('--issue') ?? process.env.ISSUE_NUMBER;
|
|
217
|
-
const repo = get('--repo') ?? process.env.GITHUB_REPOSITORY;
|
|
218
|
-
|
|
219
|
-
if (!issue) {
|
|
220
|
-
throw new Error('lint-issue-body: --issue <n> or ISSUE_NUMBER is required');
|
|
221
|
-
}
|
|
204
|
+
export function isStoryTicket(labelNames) {
|
|
205
|
+
return Array.isArray(labelNames) && labelNames.includes('type::story');
|
|
206
|
+
}
|
|
222
207
|
|
|
208
|
+
/**
|
|
209
|
+
* Evaluate an issue payload and optionally post a conformance comment.
|
|
210
|
+
* Pure with respect to GitHub when `ghFn` is injected — the CLI `main`
|
|
211
|
+
* is a thin argv wrapper around this helper.
|
|
212
|
+
*
|
|
213
|
+
* @param {{
|
|
214
|
+
* issue: string|number,
|
|
215
|
+
* repo?: string,
|
|
216
|
+
* dryRun?: boolean,
|
|
217
|
+
* ghFn?: (args: string[]) => string,
|
|
218
|
+
* write?: (s: string) => void,
|
|
219
|
+
* }} opts
|
|
220
|
+
* @returns {{ skipped?: string, conformant?: boolean, problems?: string[] }}
|
|
221
|
+
*/
|
|
222
|
+
export function runLintIssueBody({
|
|
223
|
+
issue,
|
|
224
|
+
repo,
|
|
225
|
+
dryRun = false,
|
|
226
|
+
ghFn = gh,
|
|
227
|
+
write = (s) => {
|
|
228
|
+
process.stdout.write(s);
|
|
229
|
+
},
|
|
230
|
+
}) {
|
|
223
231
|
const repoArgs = repo ? ['--repo', repo] : [];
|
|
224
|
-
const raw =
|
|
232
|
+
const raw = ghFn([
|
|
225
233
|
'issue',
|
|
226
234
|
'view',
|
|
227
235
|
String(issue),
|
|
@@ -231,20 +239,14 @@ async function main() {
|
|
|
231
239
|
]);
|
|
232
240
|
const { body, labels } = JSON.parse(raw);
|
|
233
241
|
const labelNames = (labels ?? []).map((l) => l.name);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
// Machine-parsable JSON envelope → process.stdout.write (not console.log),
|
|
239
|
-
// per the .agents/scripts logging contract (tests/enforcement/no-console).
|
|
240
|
-
process.stdout.write(
|
|
241
|
-
`${JSON.stringify({ issue: Number(issue), skipped: 'not-a-ticket' })}\n`,
|
|
242
|
-
);
|
|
243
|
-
return;
|
|
242
|
+
if (!isStoryTicket(labelNames)) {
|
|
243
|
+
const envelope = { issue: Number(issue), skipped: 'not-a-ticket' };
|
|
244
|
+
write(`${JSON.stringify(envelope)}\n`);
|
|
245
|
+
return envelope;
|
|
244
246
|
}
|
|
245
247
|
|
|
246
248
|
const verdict = evaluateIssueBody(body ?? '');
|
|
247
|
-
|
|
249
|
+
write(
|
|
248
250
|
`${JSON.stringify({
|
|
249
251
|
issue: Number(issue),
|
|
250
252
|
conformant: verdict.conformant,
|
|
@@ -252,10 +254,39 @@ async function main() {
|
|
|
252
254
|
})}\n`,
|
|
253
255
|
);
|
|
254
256
|
|
|
255
|
-
if (verdict.conformant || dryRun)
|
|
257
|
+
if (verdict.conformant || dryRun) {
|
|
258
|
+
return {
|
|
259
|
+
conformant: verdict.conformant,
|
|
260
|
+
problems: verdict.problems,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
256
263
|
|
|
257
264
|
const comment = renderConformanceComment(verdict);
|
|
258
|
-
|
|
265
|
+
ghFn(['issue', 'comment', String(issue), ...repoArgs, '--body', comment]);
|
|
266
|
+
return { conformant: false, problems: verdict.problems };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* CLI entry. Reads the target issue (number from `--issue` or the
|
|
271
|
+
* `ISSUE_NUMBER` env), fetches its body + labels, and — when the body is
|
|
272
|
+
* non-conformant — upserts a single marker comment. Always exits 0 (the
|
|
273
|
+
* lint *informs*, it does not block), unless an unexpected I/O error occurs.
|
|
274
|
+
*/
|
|
275
|
+
async function main() {
|
|
276
|
+
const args = process.argv.slice(2);
|
|
277
|
+
const get = (flag) => {
|
|
278
|
+
const i = args.indexOf(flag);
|
|
279
|
+
return i >= 0 ? args[i + 1] : undefined;
|
|
280
|
+
};
|
|
281
|
+
const issue = get('--issue') ?? process.env.ISSUE_NUMBER;
|
|
282
|
+
if (!issue) {
|
|
283
|
+
throw new Error('lint-issue-body: --issue <n> or ISSUE_NUMBER is required');
|
|
284
|
+
}
|
|
285
|
+
runLintIssueBody({
|
|
286
|
+
issue,
|
|
287
|
+
repo: get('--repo') ?? process.env.GITHUB_REPOSITORY,
|
|
288
|
+
dryRun: args.includes('--dry-run'),
|
|
289
|
+
});
|
|
259
290
|
}
|
|
260
291
|
|
|
261
292
|
runAsCli(import.meta.url, main, { source: 'lint-issue-body' });
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* friendlier "you're offline" signal before any version probe.
|
|
26
26
|
*
|
|
27
27
|
* Severity is consistent with framework preflight conventions
|
|
28
|
-
* (cf. `story-close.js` runStoryClosePreflight, `
|
|
28
|
+
* (cf. `single-story-close.js` runStoryClosePreflight, `mandrel-update-preflight.js`):
|
|
29
29
|
* the consumer-shape check is a hard stop (blocker), dirty-index and offline
|
|
30
30
|
* are warn-only and never block the run.
|
|
31
31
|
*
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
* (% progress + blockers), not the firehose of per-story transitions;
|
|
34
34
|
* the default allowlist is the five `epic-*` events. Payload envelope:
|
|
35
35
|
* `{ text, severity, event?, level?, ticketId?, epicId?, phase? }` —
|
|
36
|
-
* `text`
|
|
36
|
+
* `text` is the primary human-readable body (Slack-style incoming
|
|
37
|
+
* webhooks read this field).
|
|
37
38
|
*
|
|
38
39
|
* Each channel filters independently — no fallback chain. Severity is
|
|
39
40
|
* carried as envelope metadata (so Slack consumers can color-code by it
|
|
@@ -93,8 +94,8 @@ function buildWebhookPayload({
|
|
|
93
94
|
: '';
|
|
94
95
|
const text = `${prefix}${ticketPart}: ${cleanMessage}`;
|
|
95
96
|
|
|
96
|
-
// `text`
|
|
97
|
-
//
|
|
97
|
+
// `text` is the primary human-readable body; typed fields follow for
|
|
98
|
+
// routable subscribers.
|
|
98
99
|
const envelope = { text, severity };
|
|
99
100
|
if (Number.isFinite(numericTicketId) && numericTicketId > 0) {
|
|
100
101
|
envelope.ticketId = numericTicketId;
|