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,274 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* epic-audit-recheck.js — Cross-phase re-trigger selector.
|
|
6
|
-
*
|
|
7
|
-
* Story #2619 (Epic #2586). Read a list of touched files (provided by the
|
|
8
|
-
* caller after the code-review auto-fix loop in
|
|
9
|
-
* `.agents/workflows/helpers/code-review.md` Step 4.6) and emit the
|
|
10
|
-
* subset of audit lenses whose `filePatterns` overlap that list.
|
|
11
|
-
*
|
|
12
|
-
* The CLI is intentionally narrower than `lib/audit-suite/selector.js`: it does NOT
|
|
13
|
-
* run a git diff and does NOT consult the Epic ticket body for keyword
|
|
14
|
-
* triggers. The auto-fix tail already knows exactly which paths it touched —
|
|
15
|
-
* only file-pattern overlap is relevant for deciding which lenses are stale
|
|
16
|
-
* and need re-invocation.
|
|
17
|
-
*
|
|
18
|
-
* Tier gate (Epic #4405): this is the **Epic-close** re-check, so it emits
|
|
19
|
-
* only non-`local` lenses. A `local`-tier lens is verified shift-left at
|
|
20
|
-
* write-time and Story-scope review; re-running it here would verify the same
|
|
21
|
-
* concern at a second tier. The overlap set is therefore filtered through
|
|
22
|
-
* `resolveLensTier`, dropping every `local` lens (including the universal
|
|
23
|
-
* `audit-clean-code`) so a focused-fix commit cannot drag one back into the
|
|
24
|
-
* Epic-close re-check.
|
|
25
|
-
*
|
|
26
|
-
* Usage:
|
|
27
|
-
* node .agents/scripts/epic-audit-recheck.js \
|
|
28
|
-
* --epic <id> --files <comma-list-or-@file>
|
|
29
|
-
*
|
|
30
|
-
* --files comma-list: --files src/auth/login.js,src/api/users.ts
|
|
31
|
-
* --files @path: --files @temp/touched.txt (newline-delimited)
|
|
32
|
-
*
|
|
33
|
-
* Output: a single JSON envelope on stdout:
|
|
34
|
-
* {
|
|
35
|
-
* epicId,
|
|
36
|
-
* selectedAudits: string[], // lenses whose filePatterns overlap input
|
|
37
|
-
* context: {
|
|
38
|
-
* changedFiles: string[], // normalized input list (dedup, non-empty)
|
|
39
|
-
* changedFilesCount: number,
|
|
40
|
-
* }
|
|
41
|
-
* }
|
|
42
|
-
*
|
|
43
|
-
* Exit codes:
|
|
44
|
-
* 0 — emitted envelope (selectedAudits MAY be empty when no lens overlaps)
|
|
45
|
-
* 2 — validation error (missing --epic, missing --files, unreadable
|
|
46
|
-
* @file). Error message written to stderr.
|
|
47
|
-
*/
|
|
48
|
-
|
|
49
|
-
import fs from 'node:fs';
|
|
50
|
-
import path from 'node:path';
|
|
51
|
-
import {
|
|
52
|
-
matchesAnyFilePattern,
|
|
53
|
-
resolveLensTier,
|
|
54
|
-
} from './lib/audit-suite/index.js';
|
|
55
|
-
import { defineFlags } from './lib/cli-args.js';
|
|
56
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
57
|
-
import {
|
|
58
|
-
getPaths,
|
|
59
|
-
PROJECT_ROOT,
|
|
60
|
-
resolveConfig,
|
|
61
|
-
} from './lib/config-resolver.js';
|
|
62
|
-
|
|
63
|
-
const HELP = `Usage: node .agents/scripts/epic-audit-recheck.js \\
|
|
64
|
-
--epic <id> --files <comma-list-or-@file>
|
|
65
|
-
|
|
66
|
-
Flags:
|
|
67
|
-
--epic GitHub Epic issue number (required).
|
|
68
|
-
--files Comma-separated list of touched file paths, OR @<path> to read
|
|
69
|
-
a newline-delimited list from a file (required). Empty entries
|
|
70
|
-
are stripped.
|
|
71
|
-
--help Show this message.
|
|
72
|
-
`;
|
|
73
|
-
|
|
74
|
-
export function parseArgv(argv) {
|
|
75
|
-
const { values } = defineFlags(
|
|
76
|
-
{
|
|
77
|
-
epic: { type: 'ticket' },
|
|
78
|
-
files: { type: 'string' },
|
|
79
|
-
help: { type: 'boolean' },
|
|
80
|
-
},
|
|
81
|
-
argv,
|
|
82
|
-
);
|
|
83
|
-
return values;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Normalize a `--files` value into a deduped array of non-empty paths.
|
|
88
|
-
* Accepts either a comma-separated literal or `@<path>` (newline-delimited
|
|
89
|
-
* file). Returns `{ files, error }` — exactly one is populated.
|
|
90
|
-
*
|
|
91
|
-
* @param {string} raw
|
|
92
|
-
* @param {{ readFileSync?: typeof fs.readFileSync, cwd?: string }} [deps]
|
|
93
|
-
*/
|
|
94
|
-
export function resolveFilesArg(raw, deps = {}) {
|
|
95
|
-
if (typeof raw !== 'string' || raw.trim() === '') {
|
|
96
|
-
return { error: '[epic-audit-recheck] --files is required.' };
|
|
97
|
-
}
|
|
98
|
-
const readFile = deps.readFileSync ?? fs.readFileSync;
|
|
99
|
-
const cwd = deps.cwd ?? process.cwd();
|
|
100
|
-
|
|
101
|
-
let listText = raw;
|
|
102
|
-
if (raw.startsWith('@')) {
|
|
103
|
-
const filePath = raw.slice(1);
|
|
104
|
-
if (!filePath) {
|
|
105
|
-
return { error: '[epic-audit-recheck] --files @<path> missing path.' };
|
|
106
|
-
}
|
|
107
|
-
const absPath = path.isAbsolute(filePath)
|
|
108
|
-
? filePath
|
|
109
|
-
: path.join(cwd, filePath);
|
|
110
|
-
try {
|
|
111
|
-
listText = readFile(absPath, 'utf8');
|
|
112
|
-
} catch (err) {
|
|
113
|
-
return {
|
|
114
|
-
error: `[epic-audit-recheck] Failed to read ${absPath}: ${err.message}`,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Comma or newline are both valid delimiters — the @file form is
|
|
120
|
-
// newline-delimited, the inline form is comma-delimited. Splitting on
|
|
121
|
-
// either keeps both code paths converging on the same normalizer.
|
|
122
|
-
const seen = new Set();
|
|
123
|
-
const files = [];
|
|
124
|
-
for (const token of listText.split(/[\n,]/)) {
|
|
125
|
-
const trimmed = token.trim();
|
|
126
|
-
if (trimmed === '') continue;
|
|
127
|
-
if (seen.has(trimmed)) continue;
|
|
128
|
-
seen.add(trimmed);
|
|
129
|
-
files.push(trimmed);
|
|
130
|
-
}
|
|
131
|
-
return { files };
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Load the audit-rules document validated elsewhere by
|
|
136
|
-
* `lib/audit-suite/selector.js`. Surfaced as a separate function so tests
|
|
137
|
-
* can swap a fixture in without touching the on-disk schema file.
|
|
138
|
-
*
|
|
139
|
-
* @param {{ readFileSync?: typeof fs.readFileSync }} [deps]
|
|
140
|
-
*/
|
|
141
|
-
export function loadAuditRules(deps = {}) {
|
|
142
|
-
const config = resolveConfig();
|
|
143
|
-
const rulesPath = path.join(
|
|
144
|
-
PROJECT_ROOT,
|
|
145
|
-
getPaths(config).schemasRoot,
|
|
146
|
-
'audit-rules.json',
|
|
147
|
-
);
|
|
148
|
-
const read = deps.readFileSync ?? fs.readFileSync;
|
|
149
|
-
let text;
|
|
150
|
-
try {
|
|
151
|
-
text = read(rulesPath, 'utf8');
|
|
152
|
-
} catch (err) {
|
|
153
|
-
throw new Error(
|
|
154
|
-
`[epic-audit-recheck] Failed to read audit-rules from ${rulesPath}: ${err.message}`,
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
return JSON.parse(text);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Pure overlap detector. Walks the audit-rules document and returns the
|
|
162
|
-
* names of every **non-`local`** audit whose `triggers.filePatterns` matches
|
|
163
|
-
* at least one entry in `files`. Lenses without `filePatterns` (or with an
|
|
164
|
-
* empty array) NEVER appear in the output — keyword triggers are
|
|
165
|
-
* intentionally ignored: this CLI answers "what was invalidated by the
|
|
166
|
-
* touched paths?", not "what should I run from scratch?".
|
|
167
|
-
*
|
|
168
|
-
* The output is additionally gated by tier (Epic #4405): a `local`-tier lens
|
|
169
|
-
* is verified shift-left (write-time + Story-scope) and is never re-run at
|
|
170
|
-
* Epic close, so it is dropped here even when its patterns overlap. This
|
|
171
|
-
* matters now that `audit-clean-code` carries the universal `**` glob — its
|
|
172
|
-
* overlap is universal, so without the tier gate every focused-fix commit
|
|
173
|
-
* would drag it (and any other local lens) back into the Epic-close re-check.
|
|
174
|
-
*
|
|
175
|
-
* @param {{ audits: Record<string, { triggers?: { filePatterns?: string[] } }> }} rules
|
|
176
|
-
* @param {string[]} files
|
|
177
|
-
* @param {(lens: string) => string} [resolveLensTierFn] tier resolver
|
|
178
|
-
* (injectable seam; defaults to {@link resolveLensTier}).
|
|
179
|
-
*/
|
|
180
|
-
export function selectOverlappingAudits(
|
|
181
|
-
rules,
|
|
182
|
-
files,
|
|
183
|
-
resolveLensTierFn = resolveLensTier,
|
|
184
|
-
) {
|
|
185
|
-
const selected = [];
|
|
186
|
-
for (const [auditName, ruleOpts] of Object.entries(rules?.audits ?? {})) {
|
|
187
|
-
const patterns = ruleOpts?.triggers?.filePatterns;
|
|
188
|
-
if (!Array.isArray(patterns) || patterns.length === 0) continue;
|
|
189
|
-
if (!matchesAnyFilePattern(patterns, files)) continue;
|
|
190
|
-
// Epic-close tier gate: skip `local` lenses (verified shift-left). A
|
|
191
|
-
// malformed/unknown tier is drift the schema guards against — skip it
|
|
192
|
-
// rather than throw the whole selection.
|
|
193
|
-
let tier;
|
|
194
|
-
try {
|
|
195
|
-
tier = resolveLensTierFn(auditName);
|
|
196
|
-
} catch {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
if (tier === 'local') continue;
|
|
200
|
-
selected.push(auditName);
|
|
201
|
-
}
|
|
202
|
-
return selected;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Pure pipeline body. Returns `{ exitCode, result }` where
|
|
207
|
-
* `result.kind` is `'help' | 'validation-error' | 'envelope'`. `main`
|
|
208
|
-
* renders these; tests drive this directly.
|
|
209
|
-
*/
|
|
210
|
-
export async function runEpicAuditRecheckCli(values, deps = {}) {
|
|
211
|
-
const helpText = deps.help ?? HELP;
|
|
212
|
-
if (values.help) {
|
|
213
|
-
return { exitCode: 0, result: { kind: 'help', text: helpText } };
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const { epic, files: filesRaw } = values;
|
|
217
|
-
|
|
218
|
-
if (!Number.isFinite(epic) || epic <= 0) {
|
|
219
|
-
return {
|
|
220
|
-
exitCode: 2,
|
|
221
|
-
result: {
|
|
222
|
-
kind: 'validation-error',
|
|
223
|
-
message: '[epic-audit-recheck] --epic <id> is required.',
|
|
224
|
-
help: helpText,
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const filesResult = (deps.resolveFilesArg ?? resolveFilesArg)(filesRaw, deps);
|
|
230
|
-
if (filesResult.error) {
|
|
231
|
-
return {
|
|
232
|
-
exitCode: 2,
|
|
233
|
-
result: {
|
|
234
|
-
kind: 'validation-error',
|
|
235
|
-
message: filesResult.error,
|
|
236
|
-
help: helpText,
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
const rules = (deps.loadAuditRules ?? loadAuditRules)(deps);
|
|
242
|
-
const selectedAudits = (
|
|
243
|
-
deps.selectOverlappingAudits ?? selectOverlappingAudits
|
|
244
|
-
)(rules, filesResult.files);
|
|
245
|
-
|
|
246
|
-
const envelope = {
|
|
247
|
-
epicId: epic,
|
|
248
|
-
selectedAudits,
|
|
249
|
-
context: {
|
|
250
|
-
changedFiles: filesResult.files,
|
|
251
|
-
changedFilesCount: filesResult.files.length,
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
return { exitCode: 0, result: { kind: 'envelope', envelope } };
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
259
|
-
const values = parseArgv(argv);
|
|
260
|
-
const { exitCode, result } = await runEpicAuditRecheckCli(values);
|
|
261
|
-
|
|
262
|
-
if (result.kind === 'help') {
|
|
263
|
-
process.stdout.write(result.text);
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
if (result.kind === 'validation-error') {
|
|
267
|
-
process.stderr.write(`${result.message}\n${result.help}`);
|
|
268
|
-
process.exit(exitCode);
|
|
269
|
-
}
|
|
270
|
-
process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
|
|
271
|
-
if (exitCode !== 0) process.exit(exitCode);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
runAsCli(import.meta.url, main, { source: 'epic-audit-recheck' });
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* epic-deliver-note-intervention.js — record a manual-intervention event
|
|
6
|
-
* against the active `/deliver` run-state checkpoint.
|
|
7
|
-
*
|
|
8
|
-
* The host LLM driving `/deliver` invokes this CLI whenever it does
|
|
9
|
-
* something out-of-band that disqualifies the Epic from auto-merge:
|
|
10
|
-
*
|
|
11
|
-
* - `AskUserQuestion` to the operator mid-run
|
|
12
|
-
* - `git restore` / `git reset` against the working tree
|
|
13
|
-
* - manual `--no-ff` recovery merge
|
|
14
|
-
* - per-Story close that needed `--skipValidation`
|
|
15
|
-
*
|
|
16
|
-
* The auto-merge predicate (see
|
|
17
|
-
* `lib/orchestration/lifecycle/listeners/automerge-predicate.js`) reads
|
|
18
|
-
* `state.manualInterventions[]` and refuses to fire when the array is
|
|
19
|
-
* non-empty.
|
|
20
|
-
*
|
|
21
|
-
* Story #2413 / Task #2426 — the CLI no longer writes the structured
|
|
22
|
-
* comment directly. It builds an `intervention.recorded` payload, emits
|
|
23
|
-
* it through a one-shot lifecycle bus, and lets the
|
|
24
|
-
* `InterventionRecorder` listener (registered against the same bus)
|
|
25
|
-
* persist the record via the epic-run-state-store. This collapses the
|
|
26
|
-
* legacy script-level checkpoint consumer to a single bus emit, matching
|
|
27
|
-
* the canonical pattern for state mutations described in the lifecycle
|
|
28
|
-
* listeners README.
|
|
29
|
-
*
|
|
30
|
-
* Usage:
|
|
31
|
-
* node .agents/scripts/epic-deliver-note-intervention.js \
|
|
32
|
-
* --epic <epicId> --reason "<text>" [--source <text>]
|
|
33
|
-
*
|
|
34
|
-
* Output: a single JSON envelope `{ epicId, intervention, total }`.
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
import { parseArgs } from 'node:util';
|
|
38
|
-
|
|
39
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
40
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
41
|
-
import { Logger } from './lib/Logger.js';
|
|
42
|
-
import { read as readEpicRunState } from './lib/orchestration/epic-run-state-store.js';
|
|
43
|
-
import { createBus } from './lib/orchestration/lifecycle/bus.js';
|
|
44
|
-
import {
|
|
45
|
-
INTERVENTION_RECORDED_EVENT,
|
|
46
|
-
InterventionRecorder,
|
|
47
|
-
} from './lib/orchestration/lifecycle/listeners/intervention-recorder.js';
|
|
48
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
49
|
-
|
|
50
|
-
const HELP = `Usage: node .agents/scripts/epic-deliver-note-intervention.js \\
|
|
51
|
-
--epic <epicId> --reason "<text>" [--source <text>]
|
|
52
|
-
|
|
53
|
-
Emits an \`intervention.recorded\` lifecycle event for Epic #<epicId>. The
|
|
54
|
-
InterventionRecorder listener appends the payload to the epic-run-state
|
|
55
|
-
structured comment, disqualifying the Epic from auto-merge.
|
|
56
|
-
`;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Pure: parse argv into the normalized option bag. Exported for tests.
|
|
60
|
-
*
|
|
61
|
-
* @param {string[]} argv
|
|
62
|
-
* @returns {{ epicId: number|null, reason: string|null, source: string|null, help: boolean }}
|
|
63
|
-
*/
|
|
64
|
-
export function parseNoteArgs(argv) {
|
|
65
|
-
const { values } = parseArgs({
|
|
66
|
-
args: argv,
|
|
67
|
-
options: {
|
|
68
|
-
epic: { type: 'string' },
|
|
69
|
-
reason: { type: 'string' },
|
|
70
|
-
source: { type: 'string' },
|
|
71
|
-
help: { type: 'boolean', short: 'h' },
|
|
72
|
-
},
|
|
73
|
-
strict: false,
|
|
74
|
-
});
|
|
75
|
-
const epicId = Number.parseInt(values.epic ?? '', 10);
|
|
76
|
-
const reason = typeof values.reason === 'string' ? values.reason.trim() : '';
|
|
77
|
-
const source = typeof values.source === 'string' ? values.source.trim() : '';
|
|
78
|
-
return {
|
|
79
|
-
epicId: Number.isNaN(epicId) || epicId <= 0 ? null : epicId,
|
|
80
|
-
reason: reason.length > 0 ? reason : null,
|
|
81
|
-
source: source.length > 0 ? source : null,
|
|
82
|
-
help: values.help === true,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Runner-shaped entry point. DI-friendly so tests can stub the provider
|
|
88
|
-
* and bus without touching disk or the GitHub API.
|
|
89
|
-
*
|
|
90
|
-
* The bus emit drives the InterventionRecorder listener, which grows
|
|
91
|
-
* the `manualInterventions` array on the epic-run-state structured
|
|
92
|
-
* comment via the function-based store. After the emit settles, we
|
|
93
|
-
* read the comment back so the CLI's stdout envelope can report
|
|
94
|
-
* `{ intervention, total }` exactly as before the script-level
|
|
95
|
-
* checkpoint cut-over.
|
|
96
|
-
*
|
|
97
|
-
* @param {{
|
|
98
|
-
* epicId: number,
|
|
99
|
-
* reason: string,
|
|
100
|
-
* source?: string,
|
|
101
|
-
* injectedConfig?: object,
|
|
102
|
-
* injectedProvider?: object,
|
|
103
|
-
* busFactory?: () => { emit: Function, on: Function },
|
|
104
|
-
* listenerFactory?: (deps: { provider: object, epicId: number, bus: object }) => { register: Function },
|
|
105
|
-
* readEpicRunState?: (deps: { provider: object, epicId: number }) => Promise<object|null>,
|
|
106
|
-
* now?: () => string,
|
|
107
|
-
* }} args
|
|
108
|
-
* @returns {Promise<{ epicId: number, intervention: object, total: number }>}
|
|
109
|
-
*/
|
|
110
|
-
export async function runNoteIntervention({
|
|
111
|
-
epicId,
|
|
112
|
-
reason,
|
|
113
|
-
source,
|
|
114
|
-
injectedConfig,
|
|
115
|
-
injectedProvider,
|
|
116
|
-
busFactory,
|
|
117
|
-
listenerFactory,
|
|
118
|
-
readEpicRunState: readEpicRunStateFn,
|
|
119
|
-
now,
|
|
120
|
-
} = {}) {
|
|
121
|
-
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
122
|
-
throw new TypeError(
|
|
123
|
-
'runNoteIntervention: epicId must be a positive integer',
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
if (typeof reason !== 'string' || reason.length === 0) {
|
|
127
|
-
throw new TypeError('runNoteIntervention: reason is required');
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const config = injectedConfig ?? resolveConfig();
|
|
131
|
-
const provider = injectedProvider ?? createProvider(config);
|
|
132
|
-
const bus = busFactory ? busFactory() : createBus();
|
|
133
|
-
const buildListener =
|
|
134
|
-
listenerFactory ?? ((deps) => new InterventionRecorder(deps));
|
|
135
|
-
const listener = buildListener({ provider, epicId, bus });
|
|
136
|
-
if (typeof listener.register === 'function') {
|
|
137
|
-
listener.register(bus);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const ts = typeof now === 'function' ? now() : new Date().toISOString();
|
|
141
|
-
const resolvedSource =
|
|
142
|
-
typeof source === 'string' && source.length > 0 ? source : 'host-llm';
|
|
143
|
-
const payload = {
|
|
144
|
-
epicId,
|
|
145
|
-
reason,
|
|
146
|
-
source: resolvedSource,
|
|
147
|
-
ts,
|
|
148
|
-
};
|
|
149
|
-
await bus.emit(INTERVENTION_RECORDED_EVENT, payload);
|
|
150
|
-
|
|
151
|
-
// Read the state back so the stdout envelope reports the canonical
|
|
152
|
-
// `{ intervention, total }` shape. The listener has already persisted
|
|
153
|
-
// the record by the time `emit` resolves (sequential awaited mediator);
|
|
154
|
-
// a missing comment collapses to `total: 0` defensively.
|
|
155
|
-
const readFn = readEpicRunStateFn ?? readEpicRunState;
|
|
156
|
-
const state = (await readFn({ provider, epicId })) ?? {};
|
|
157
|
-
const list = Array.isArray(state.manualInterventions)
|
|
158
|
-
? state.manualInterventions
|
|
159
|
-
: [];
|
|
160
|
-
const intervention = list[list.length - 1] ?? null;
|
|
161
|
-
return { epicId, intervention, total: list.length };
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async function main() {
|
|
165
|
-
const args = parseNoteArgs(process.argv.slice(2));
|
|
166
|
-
if (args.help) {
|
|
167
|
-
Logger.info(HELP);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
if (args.epicId === null) {
|
|
171
|
-
Logger.error(
|
|
172
|
-
'[epic-deliver-note-intervention] ERROR: --epic <epicId> is required.',
|
|
173
|
-
);
|
|
174
|
-
Logger.error(HELP);
|
|
175
|
-
process.exit(2);
|
|
176
|
-
}
|
|
177
|
-
if (args.reason === null) {
|
|
178
|
-
Logger.error(
|
|
179
|
-
'[epic-deliver-note-intervention] ERROR: --reason "<text>" is required.',
|
|
180
|
-
);
|
|
181
|
-
Logger.error(HELP);
|
|
182
|
-
process.exit(2);
|
|
183
|
-
}
|
|
184
|
-
const out = await runNoteIntervention({
|
|
185
|
-
epicId: args.epicId,
|
|
186
|
-
reason: args.reason,
|
|
187
|
-
source: args.source ?? undefined,
|
|
188
|
-
});
|
|
189
|
-
Logger.info(JSON.stringify(out, null, 2));
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
runAsCli(import.meta.url, main, { source: 'epic-deliver-note-intervention' });
|