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,497 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* epic-audit-prepare.js — Phase 4 prepare CLI for `/deliver`.
|
|
6
|
-
*
|
|
7
|
-
* Thin glue around the audit-suite `selectAudits` SDK. Reads the Epic
|
|
8
|
-
* ticket, runs the change-set selector against the Epic branch diff
|
|
9
|
-
* (`main..epic/<id>`), and emits a JSON envelope on stdout that the
|
|
10
|
-
* inline `helpers/epic-audit.md` consumes.
|
|
11
|
-
*
|
|
12
|
-
* The CLI carries no business logic beyond:
|
|
13
|
-
* 1. validating `--epic <id>`,
|
|
14
|
-
* 2. resolving the Epic branch name (`epic/<id>`),
|
|
15
|
-
* 3. running `selectAudits` at the close-gate (`gate3`),
|
|
16
|
-
* 4. routing the model-judged risk envelope's high-risk axes onto their
|
|
17
|
-
* mapped audit lenses (Story #3889 — `resolveAuditLenses`) and unioning
|
|
18
|
-
* them into the change-set selection,
|
|
19
|
-
* 5. resolving the run's audit depth (`light` / `standard` / `deep`) from
|
|
20
|
-
* the same risk envelope + the change-set's changed-file count via the
|
|
21
|
-
* shared `resolveDepth` resolver (Story #3939), and
|
|
22
|
-
* 6. shaping the result into the helper-consumable envelope.
|
|
23
|
-
*
|
|
24
|
-
* Story #3939 — depth-aware lenses. The `depth` field tells the audit
|
|
25
|
-
* executor (`helpers/epic-audit.md`) how thorough each selected lens should
|
|
26
|
-
* be on this Epic without ever skipping a selected lens:
|
|
27
|
-
* `light` shrinks a lens's sweep to the changed surface + Critical/High
|
|
28
|
-
* findings, `standard` is today's behavior, and `deep` widens the sweep to
|
|
29
|
-
* the directly-touched modules. Depth never changes which lenses fire, the
|
|
30
|
-
* severity taxonomy, the findings shape, or the Phase 4 halting rule — it is
|
|
31
|
-
* an orthogonal "how deep" signal alongside the "which lenses" selection.
|
|
32
|
-
* Depth is resolved from the SAME best-effort `planningRisk` checkpoint read
|
|
33
|
-
* the risk-routed lenses use (a missing/unparseable checkpoint degrades to
|
|
34
|
-
* `standard`, never an abort) folded with the changed-file count the
|
|
35
|
-
* change-set diff already produces.
|
|
36
|
-
*
|
|
37
|
-
* Story #3889 — risk-routed lenses. Epic #3865 added `resolveAuditLenses`
|
|
38
|
-
* (axis → audit-lens mapping for the model-judged risk verdict) to
|
|
39
|
-
* `lib/orchestration/code-review.js` but nothing invoked it in the live
|
|
40
|
-
* delivery path. This CLI now reads the `planningRisk` envelope off the
|
|
41
|
-
* Epic's `epic-plan-state` checkpoint and unions the routed lenses into
|
|
42
|
-
* `selectedAudits`, so a high-risk Epic auto-runs its mapped lenses
|
|
43
|
-
* (e.g. a `security`-axis Epic runs `audit-security`) at Phase 4 through the
|
|
44
|
-
* SAME `runAuditSuite` / `selectAuditStrategy` engine the helper already
|
|
45
|
-
* dispatches — no new audit machinery. A low-risk Epic routes no extra
|
|
46
|
-
* lenses. Reading the checkpoint is best-effort: a missing/unparseable
|
|
47
|
-
* checkpoint degrades to the change-set selection alone (never an abort).
|
|
48
|
-
*
|
|
49
|
-
* Envelope shape (Tech Spec #2588 — API Changes § New CLI):
|
|
50
|
-
*
|
|
51
|
-
* {
|
|
52
|
-
* "epicId": 2586,
|
|
53
|
-
* "epicBranch": "epic/2586",
|
|
54
|
-
* "depth": "deep",
|
|
55
|
-
* "selectedAudits": ["audit-security", "audit-privacy"],
|
|
56
|
-
* "epicCloseLenses": ["audit-security"],
|
|
57
|
-
* "changeSetAudits": ["audit-privacy"],
|
|
58
|
-
* "riskRoutedAudits": ["audit-security"],
|
|
59
|
-
* "globalLenses": [],
|
|
60
|
-
* "changedFiles": ["src/api/admin/users.ts", "..."],
|
|
61
|
-
* "changedFilesCount": 47,
|
|
62
|
-
* "substitutionsPayload": "src/api/admin/users.ts\n..."
|
|
63
|
-
* }
|
|
64
|
-
*
|
|
65
|
-
* `selectedAudits` is the union the helper dispatches: the change-set
|
|
66
|
-
* selection (`changeSetAudits`) plus the risk-routed lenses
|
|
67
|
-
* (`riskRoutedAudits`), de-duplicated. The two source-of-truth arrays are
|
|
68
|
-
* surfaced for observability so the operator can see why each lens fired.
|
|
69
|
-
* `depth` (`light` / `standard` / `deep`) is the orthogonal "how deep each
|
|
70
|
-
* selected lens runs" signal (Story #3939).
|
|
71
|
-
*
|
|
72
|
-
* Epic #4131 (F2/F3) — `globalLenses` is the subset of `selectedAudits` on the
|
|
73
|
-
* global-lens allowlist (`GLOBAL_LENS_ALLOWLIST`, e.g. `audit-navigability`):
|
|
74
|
-
* lenses the helper runs against the WHOLE route tree, exempt from the
|
|
75
|
-
* cross-epic-leak guard's change-set narrowing (`#3362`). The exemption is
|
|
76
|
-
* scoped to these lenses only — every other selected lens stays scoped to
|
|
77
|
-
* `changedFiles`, and the guard is not weakened for them. The navigability lens
|
|
78
|
-
* is also auto-selected here when a changed file matches a consumer-configured
|
|
79
|
-
* route glob (`delivery.quality.navigability.routeGlobs`), routed through the
|
|
80
|
-
* SAME risk-routed-lens union; with no route globs configured it routes
|
|
81
|
-
* nothing (silent no-op).
|
|
82
|
-
*
|
|
83
|
-
* Usage:
|
|
84
|
-
* node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
|
|
85
|
-
*
|
|
86
|
-
* Exit codes:
|
|
87
|
-
* 0 — envelope written to stdout
|
|
88
|
-
* 2 — validation error (missing/invalid --epic)
|
|
89
|
-
* 1 — provider / git failure
|
|
90
|
-
*/
|
|
91
|
-
|
|
92
|
-
import {
|
|
93
|
-
GLOBAL_LENS_ALLOWLIST,
|
|
94
|
-
isGlobalLens,
|
|
95
|
-
routesNavigabilityLens,
|
|
96
|
-
selectAudits,
|
|
97
|
-
} from './lib/audit-suite/index.js';
|
|
98
|
-
import { defineFlags } from './lib/cli-args.js';
|
|
99
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
100
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
101
|
-
import {
|
|
102
|
-
resolveAuditLenses,
|
|
103
|
-
selectEpicCloseLenses,
|
|
104
|
-
} from './lib/orchestration/code-review.js';
|
|
105
|
-
import { read as readPlanState } from './lib/orchestration/epic-plan-state-store.js';
|
|
106
|
-
import { resolveDepth } from './lib/orchestration/review-depth.js';
|
|
107
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
108
|
-
|
|
109
|
-
const HELP = `Usage: node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
|
|
110
|
-
|
|
111
|
-
Flags:
|
|
112
|
-
--epic Epic ticket ID to prepare audit selection for (required).
|
|
113
|
-
--base-branch Branch to diff against for the selector's change-set
|
|
114
|
-
input (default: main).
|
|
115
|
-
--gate Audit gate label (default: gate3 — Epic close gate).
|
|
116
|
-
--help Show this message.
|
|
117
|
-
|
|
118
|
-
Output (JSON envelope on stdout):
|
|
119
|
-
epicId, epicBranch
|
|
120
|
-
depth Audit depth for this run — one of light | standard | deep
|
|
121
|
-
(Story #3939). Resolved from the model-judged risk
|
|
122
|
-
envelope + the change-set's changed-file count via the
|
|
123
|
-
shared resolveDepth resolver; an absent checkpoint
|
|
124
|
-
degrades to standard. Tells the audit executor how deep
|
|
125
|
-
each SELECTED lens runs; it never changes which lenses
|
|
126
|
-
fire, the severity taxonomy, or the Phase 4 halting rule.
|
|
127
|
-
selectedAudits De-duplicated union of changeSetAudits + riskRoutedAudits.
|
|
128
|
-
epicCloseLenses The SLIM Epic-close roster (Story #4412): selectedAudits
|
|
129
|
-
with every local-tier change-set lens excluded, keeping
|
|
130
|
-
only cumulative + global change-set lenses plus every
|
|
131
|
-
risk-routed lens. This is the roster the Phase 5
|
|
132
|
-
code-review pass walks over the cumulative Epic diff —
|
|
133
|
-
local-tier concerns are already verified shift-left
|
|
134
|
-
(write-time checklists + the Story-scope local-lens pass),
|
|
135
|
-
so they are not re-run at Epic close.
|
|
136
|
-
changeSetAudits Lenses the change-set selector chose.
|
|
137
|
-
riskRoutedAudits Lenses routed from the model-judged high-risk axes plus the
|
|
138
|
-
navigability lens when a changed file matches a configured
|
|
139
|
-
route glob (Epic #4131, F3).
|
|
140
|
-
globalLenses Subset of selectedAudits on the global-lens allowlist
|
|
141
|
-
(e.g. audit-navigability) — run against the WHOLE route
|
|
142
|
-
tree, exempt from the cross-epic-leak guard (Epic #4131,
|
|
143
|
-
F2). Empty unless a global lens was selected.
|
|
144
|
-
changedFiles, changedFilesCount, substitutionsPayload
|
|
145
|
-
`;
|
|
146
|
-
|
|
147
|
-
const DEFAULT_GATE = 'gate3';
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Parse argv into the values bag this CLI understands.
|
|
151
|
-
*
|
|
152
|
-
* @param {string[]} argv
|
|
153
|
-
* @returns {{ epic: number|null, 'base-branch': string, gate: string, help: boolean }}
|
|
154
|
-
*/
|
|
155
|
-
export function parseArgv(argv) {
|
|
156
|
-
const { values } = defineFlags(
|
|
157
|
-
{
|
|
158
|
-
epic: { type: 'ticket', alias: 'epicId' },
|
|
159
|
-
'base-branch': { type: 'string', default: 'main', alias: 'baseBranch' },
|
|
160
|
-
gate: { type: 'string', default: DEFAULT_GATE },
|
|
161
|
-
help: { type: 'boolean' },
|
|
162
|
-
},
|
|
163
|
-
argv,
|
|
164
|
-
);
|
|
165
|
-
return values;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Resolve the risk-routed audit lenses for an Epic by reading the model-judged
|
|
170
|
-
* `planningRisk` envelope off the Epic's `epic-plan-state` checkpoint and
|
|
171
|
-
* mapping its high-risk axes onto audit lenses via `resolveAuditLenses`
|
|
172
|
-
* (Story #3889). Best-effort: a missing/unparseable checkpoint, an absent
|
|
173
|
-
* `planningRisk` field, or a provider read failure resolves to an empty array
|
|
174
|
-
* so the change-set selection is never aborted by a risk-read failure.
|
|
175
|
-
*
|
|
176
|
-
* @param {{
|
|
177
|
-
* epicId: number,
|
|
178
|
-
* provider: object,
|
|
179
|
-
* readPlanState?: typeof readPlanState,
|
|
180
|
-
* resolveAuditLenses?: typeof resolveAuditLenses,
|
|
181
|
-
* }} params
|
|
182
|
-
* @returns {Promise<string[]>} Ordered, de-duplicated risk-routed lens names.
|
|
183
|
-
*/
|
|
184
|
-
export async function resolveRiskRoutedLenses({
|
|
185
|
-
epicId,
|
|
186
|
-
provider,
|
|
187
|
-
readPlanState: readPlanStateFn = readPlanState,
|
|
188
|
-
resolveAuditLenses: resolveAuditLensesFn = resolveAuditLenses,
|
|
189
|
-
}) {
|
|
190
|
-
let state = null;
|
|
191
|
-
try {
|
|
192
|
-
state = await readPlanStateFn({ provider, epicId });
|
|
193
|
-
} catch {
|
|
194
|
-
// A read failure (provider error, malformed comment) must not abort the
|
|
195
|
-
// change-set audit. Degrade to "no risk-routed lenses".
|
|
196
|
-
return [];
|
|
197
|
-
}
|
|
198
|
-
const planningRisk = state?.planningRisk;
|
|
199
|
-
if (!planningRisk || !Array.isArray(planningRisk.axes)) return [];
|
|
200
|
-
return resolveAuditLensesFn(planningRisk);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Resolve the operator's `planning.taskSizing` override the same way the
|
|
205
|
-
* ticket validator and the code-review depth resolver do, so retuning sizing
|
|
206
|
-
* retunes the audit-depth thresholds in lockstep. Reads `config.planning`
|
|
207
|
-
* first, then the legacy `config.agentSettings.planning` nest; absent →
|
|
208
|
-
* `undefined` so {@link resolveDepth} falls back to `DEFAULT_TASK_SIZING`.
|
|
209
|
-
*
|
|
210
|
-
* @param {object|null|undefined} config
|
|
211
|
-
* @returns {object|undefined}
|
|
212
|
-
*/
|
|
213
|
-
function resolveTaskSizing(config) {
|
|
214
|
-
return (
|
|
215
|
-
config?.planning?.taskSizing ??
|
|
216
|
-
config?.agentSettings?.planning?.taskSizing ??
|
|
217
|
-
undefined
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Resolve the run's audit depth (`light` / `standard` / `deep`) for an Epic
|
|
223
|
-
* via the shared {@link resolveDepth} resolver (Story #3939), folding the
|
|
224
|
-
* model-judged risk envelope's `overallLevel` (read off the Epic's
|
|
225
|
-
* `epic-plan-state` checkpoint) with the mechanical changed-file count of the
|
|
226
|
-
* change set the prepare CLI already enumerated.
|
|
227
|
-
*
|
|
228
|
-
* Best-effort and total, mirroring `resolveRiskRoutedLenses`: a
|
|
229
|
-
* missing/unparseable checkpoint, an absent `planningRisk` field, or a
|
|
230
|
-
* provider read failure all degrade to `standard` — the neutral default that
|
|
231
|
-
* preserves today's behavior — so an Epic that skipped `/plan` (no
|
|
232
|
-
* checkpoint) still gets a passing `standard` pass with no new failure mode.
|
|
233
|
-
* The changed-file count can only escalate a low-risk Epic to `deep` (a wide
|
|
234
|
-
* diff) and never downgrades a high-risk one; an unknown/absent count is the
|
|
235
|
-
* neutral "width unknown" signal {@link resolveDepth} tolerates.
|
|
236
|
-
*
|
|
237
|
-
* @param {{
|
|
238
|
-
* epicId: number,
|
|
239
|
-
* provider: object,
|
|
240
|
-
* changedFileCount: number|null,
|
|
241
|
-
* sizing?: object|undefined,
|
|
242
|
-
* readPlanState?: typeof readPlanState,
|
|
243
|
-
* }} params
|
|
244
|
-
* @returns {Promise<import('./lib/orchestration/review-depth.js').ReviewDepth>}
|
|
245
|
-
*/
|
|
246
|
-
export async function resolveRunDepth({
|
|
247
|
-
epicId,
|
|
248
|
-
provider,
|
|
249
|
-
changedFileCount,
|
|
250
|
-
sizing,
|
|
251
|
-
readPlanState: readPlanStateFn = readPlanState,
|
|
252
|
-
}) {
|
|
253
|
-
let state = null;
|
|
254
|
-
try {
|
|
255
|
-
state = await readPlanStateFn({ provider, epicId });
|
|
256
|
-
} catch {
|
|
257
|
-
// A read failure must not abort the audit. Resolve from the diff width
|
|
258
|
-
// alone (width can still escalate to `deep`); an unknown width with no
|
|
259
|
-
// risk signal lands on `standard`.
|
|
260
|
-
return resolveDepth({ changedFileCount, sizing });
|
|
261
|
-
}
|
|
262
|
-
return resolveDepth({
|
|
263
|
-
overallLevel: state?.planningRisk?.overallLevel,
|
|
264
|
-
changedFileCount,
|
|
265
|
-
sizing,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Union two ordered lens lists, de-duplicating while preserving the order of
|
|
271
|
-
* first appearance (change-set selection first, then risk-routed extras).
|
|
272
|
-
*
|
|
273
|
-
* @param {string[]} changeSetAudits
|
|
274
|
-
* @param {string[]} riskRoutedAudits
|
|
275
|
-
* @returns {string[]}
|
|
276
|
-
*/
|
|
277
|
-
function unionAudits(changeSetAudits, riskRoutedAudits) {
|
|
278
|
-
const seen = new Set();
|
|
279
|
-
const merged = [];
|
|
280
|
-
for (const lens of [...changeSetAudits, ...riskRoutedAudits]) {
|
|
281
|
-
if (typeof lens !== 'string' || lens.length === 0 || seen.has(lens)) {
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
284
|
-
seen.add(lens);
|
|
285
|
-
merged.push(lens);
|
|
286
|
-
}
|
|
287
|
-
return merged;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Orchestration body. Exported as a sibling so tests can drive it
|
|
292
|
-
* without spawning a child process. CLI surface unchanged.
|
|
293
|
-
*
|
|
294
|
-
* @param {{ epicId: number, baseBranch?: string, gate?: string, help?: boolean }} values
|
|
295
|
-
* @param {{
|
|
296
|
-
* resolveConfig?: () => object,
|
|
297
|
-
* createProvider?: (config: object) => object,
|
|
298
|
-
* selectAudits?: typeof selectAudits,
|
|
299
|
-
* readPlanState?: typeof readPlanState,
|
|
300
|
-
* resolveAuditLenses?: typeof resolveAuditLenses,
|
|
301
|
-
* resolveRunDepth?: typeof resolveRunDepth,
|
|
302
|
-
* help?: string,
|
|
303
|
-
* }} [deps]
|
|
304
|
-
* @returns {Promise<{ exitCode: number, result: object }>}
|
|
305
|
-
* `result.kind` is one of `'help'`, `'validation-error'`, `'envelope'`.
|
|
306
|
-
*/
|
|
307
|
-
export async function runEpicAuditPrepare(values, deps = {}) {
|
|
308
|
-
const helpText = deps.help ?? HELP;
|
|
309
|
-
if (values.help) {
|
|
310
|
-
return { exitCode: 0, result: { kind: 'help', text: helpText } };
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
const { epicId, baseBranch, gate } = values;
|
|
314
|
-
|
|
315
|
-
if (!Number.isFinite(epicId) || epicId <= 0) {
|
|
316
|
-
return {
|
|
317
|
-
exitCode: 2,
|
|
318
|
-
result: {
|
|
319
|
-
kind: 'validation-error',
|
|
320
|
-
message: '[epic-audit-prepare] --epic <id> is required.',
|
|
321
|
-
help: helpText,
|
|
322
|
-
},
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const cfg = deps.resolveConfig ? deps.resolveConfig() : resolveConfig();
|
|
327
|
-
const provider = deps.createProvider
|
|
328
|
-
? deps.createProvider(cfg)
|
|
329
|
-
: createProvider(cfg);
|
|
330
|
-
const runner = deps.selectAudits ?? selectAudits;
|
|
331
|
-
|
|
332
|
-
// Pin the change set to the requested Epic's own branch rather than the
|
|
333
|
-
// shared checkout's HEAD (Story #3362). Under two concurrent /deliver
|
|
334
|
-
// runs sharing one working copy, a HEAD-relative diff silently reports the
|
|
335
|
-
// *other* Epic's change set; `refs/heads/epic/<id>` is unambiguous.
|
|
336
|
-
const epicBranch = `epic/${epicId}`;
|
|
337
|
-
const epicRef = `refs/heads/${epicBranch}`;
|
|
338
|
-
|
|
339
|
-
const envelope = await runner({
|
|
340
|
-
ticketId: epicId,
|
|
341
|
-
gate: gate ?? DEFAULT_GATE,
|
|
342
|
-
provider,
|
|
343
|
-
baseBranch,
|
|
344
|
-
headRef: epicRef,
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
// Degraded envelopes from selectAudits short-circuit through the
|
|
348
|
-
// same surface so callers can branch on `degraded: true`. The
|
|
349
|
-
// helper treats a degraded envelope as a Phase 4 abort — propagate
|
|
350
|
-
// it verbatim with a non-zero exit code so shell pipelines see the
|
|
351
|
-
// failure. An unresolved Epic ref (HEAD_REF_UNRESOLVED) flows through
|
|
352
|
-
// here too: better to abort Phase 4 than audit a phantom change set.
|
|
353
|
-
if (envelope?.degraded) {
|
|
354
|
-
return {
|
|
355
|
-
exitCode: 1,
|
|
356
|
-
result: {
|
|
357
|
-
kind: 'envelope',
|
|
358
|
-
envelope: {
|
|
359
|
-
epicId,
|
|
360
|
-
epicBranch,
|
|
361
|
-
...envelope,
|
|
362
|
-
},
|
|
363
|
-
},
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// Defence in depth: assert the selector diffed the ref we asked for. If a
|
|
368
|
-
// future selector change drops the pin, fail closed with an explicit
|
|
369
|
-
// degraded envelope rather than emitting an audit selection silently
|
|
370
|
-
// derived from the wrong branch.
|
|
371
|
-
const resolvedRef = envelope?.context?.resolvedRef;
|
|
372
|
-
if (resolvedRef !== epicRef) {
|
|
373
|
-
return {
|
|
374
|
-
exitCode: 1,
|
|
375
|
-
result: {
|
|
376
|
-
kind: 'envelope',
|
|
377
|
-
envelope: {
|
|
378
|
-
epicId,
|
|
379
|
-
epicBranch,
|
|
380
|
-
ok: false,
|
|
381
|
-
degraded: true,
|
|
382
|
-
reason: 'EPIC_REF_MISMATCH',
|
|
383
|
-
detail: `epic-audit-prepare: selector diffed '${resolvedRef ?? '(unset)'}' but Epic #${epicId} requested '${epicRef}'`,
|
|
384
|
-
},
|
|
385
|
-
},
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const changedFiles = envelope?.context?.changedFiles ?? [];
|
|
390
|
-
const changeSetAudits = envelope?.selectedAudits ?? [];
|
|
391
|
-
|
|
392
|
-
// Story #3889 — union the model-judged risk-routed lenses into the
|
|
393
|
-
// change-set selection. Read off the Epic's epic-plan-state checkpoint
|
|
394
|
-
// (best-effort; a read failure yields no extra lenses). A high-risk
|
|
395
|
-
// `security` axis therefore fires `audit-security` even when the change
|
|
396
|
-
// set alone did not select it; a low-risk Epic adds nothing.
|
|
397
|
-
const riskRoutedFromVerdict = await resolveRiskRoutedLenses({
|
|
398
|
-
epicId,
|
|
399
|
-
provider,
|
|
400
|
-
readPlanState: deps.readPlanState,
|
|
401
|
-
resolveAuditLenses: deps.resolveAuditLenses,
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
// Epic #4131 (F3) — route the navigability lens onto route-adding change
|
|
405
|
-
// sets through the SAME risk-routed-lens union: when a changed file matches a
|
|
406
|
-
// consumer-configured route glob (`delivery.quality.navigability.routeGlobs`)
|
|
407
|
-
// the lens joins `riskRoutedAudits`, exactly like a verdict-routed lens. No
|
|
408
|
-
// new routing function is introduced — the predicate feeds the existing
|
|
409
|
-
// `unionAudits` seam. Unconfigured consumers route nothing (silent no-op), so
|
|
410
|
-
// the change-set-scoped selection is unchanged. `cfg` may be `{}` in tests;
|
|
411
|
-
// the predicate tolerates an absent config and returns `false`.
|
|
412
|
-
const navigabilityRouted = routesNavigabilityLens({
|
|
413
|
-
changedFiles,
|
|
414
|
-
config: cfg,
|
|
415
|
-
})
|
|
416
|
-
? GLOBAL_LENS_ALLOWLIST.slice()
|
|
417
|
-
: [];
|
|
418
|
-
const riskRoutedAudits = unionAudits(
|
|
419
|
-
riskRoutedFromVerdict,
|
|
420
|
-
navigabilityRouted,
|
|
421
|
-
);
|
|
422
|
-
const selectedAudits = unionAudits(changeSetAudits, riskRoutedAudits);
|
|
423
|
-
|
|
424
|
-
// Story #4412 (Epic #4405) — the SLIM Epic-close roster. Restrict the gate3
|
|
425
|
-
// selection to the tiers the Epic-close pass owns: cumulative + global
|
|
426
|
-
// change-set lenses plus every risk-routed lens, dropping every local-tier
|
|
427
|
-
// change-set lens (routed off `resolveLensTier` in `selectEpicCloseLenses`).
|
|
428
|
-
// Local-tier concerns are already verified shift-left — the write-time
|
|
429
|
-
// checklist threading (#4410) and the maker-blind Story-scope local-lens
|
|
430
|
-
// pass (#4409) — so re-running them over the cumulative diff at close would
|
|
431
|
-
// verify the same concern at a second tier. This is the roster the Phase 5
|
|
432
|
-
// code-review pass walks; `selectedAudits` stays the pre-slim union for
|
|
433
|
-
// observability.
|
|
434
|
-
const epicCloseLenses = selectEpicCloseLenses({
|
|
435
|
-
changeSetAudits,
|
|
436
|
-
riskRoutedAudits,
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
// Epic #4131 (F2) — surface which selected lenses are on the global-lens
|
|
440
|
-
// allowlist so the helper runs them against the WHOLE route tree, exempt from
|
|
441
|
-
// the cross-epic-leak guard's change-set narrowing (`#3362`). The exemption
|
|
442
|
-
// is scoped to these lenses only; every other selected lens stays scoped to
|
|
443
|
-
// `changedFiles`. Order follows `selectedAudits` for a deterministic list.
|
|
444
|
-
const globalLenses = selectedAudits.filter(isGlobalLens);
|
|
445
|
-
|
|
446
|
-
// Story #3939 — resolve the run's audit depth from the SAME model-judged
|
|
447
|
-
// risk envelope the lenses route from, folded with the changed-file count
|
|
448
|
-
// the change set just produced. Best-effort: an absent checkpoint degrades
|
|
449
|
-
// to `standard`. Depth tells the executor how deep each SELECTED lens runs;
|
|
450
|
-
// it never changes the lens roster above.
|
|
451
|
-
const resolveRunDepthFn = deps.resolveRunDepth ?? resolveRunDepth;
|
|
452
|
-
const depth = await resolveRunDepthFn({
|
|
453
|
-
epicId,
|
|
454
|
-
provider,
|
|
455
|
-
changedFileCount: changedFiles.length,
|
|
456
|
-
sizing: resolveTaskSizing(cfg),
|
|
457
|
-
readPlanState: deps.readPlanState,
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
return {
|
|
461
|
-
exitCode: 0,
|
|
462
|
-
result: {
|
|
463
|
-
kind: 'envelope',
|
|
464
|
-
envelope: {
|
|
465
|
-
epicId,
|
|
466
|
-
epicBranch,
|
|
467
|
-
depth,
|
|
468
|
-
selectedAudits,
|
|
469
|
-
epicCloseLenses,
|
|
470
|
-
changeSetAudits,
|
|
471
|
-
riskRoutedAudits,
|
|
472
|
-
globalLenses,
|
|
473
|
-
changedFiles,
|
|
474
|
-
changedFilesCount: changedFiles.length,
|
|
475
|
-
substitutionsPayload: changedFiles.join('\n'),
|
|
476
|
-
},
|
|
477
|
-
},
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
482
|
-
const values = parseArgv(argv);
|
|
483
|
-
const { exitCode, result } = await runEpicAuditPrepare(values);
|
|
484
|
-
|
|
485
|
-
if (result.kind === 'help') {
|
|
486
|
-
process.stdout.write(result.text);
|
|
487
|
-
return;
|
|
488
|
-
}
|
|
489
|
-
if (result.kind === 'validation-error') {
|
|
490
|
-
process.stderr.write(`${result.message}\n${result.help}`);
|
|
491
|
-
process.exit(exitCode);
|
|
492
|
-
}
|
|
493
|
-
process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
|
|
494
|
-
if (exitCode !== 0) process.exit(exitCode);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
runAsCli(import.meta.url, main, { source: 'epic-audit-prepare' });
|