mandrel 1.57.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 +954 -0
- package/.agents/docs/SDLC.md +1420 -0
- package/.agents/docs/agentrc-reference.json +278 -0
- package/.agents/docs/configuration.md +1040 -0
- package/.agents/docs/workflows.md +59 -0
- package/.agents/instructions.md +384 -0
- package/.agents/personas/architect.md +107 -0
- package/.agents/personas/devops-engineer.md +36 -0
- package/.agents/personas/engineer-mobile.md +119 -0
- package/.agents/personas/engineer-web.md +110 -0
- package/.agents/personas/engineer.md +90 -0
- package/.agents/personas/product.md +88 -0
- package/.agents/personas/project-manager.md +110 -0
- package/.agents/personas/qa-engineer.md +91 -0
- package/.agents/personas/refactorer.md +110 -0
- package/.agents/personas/security-engineer.md +112 -0
- package/.agents/personas/sre.md +86 -0
- package/.agents/personas/technical-writer.md +100 -0
- package/.agents/personas/ux-designer.md +95 -0
- package/.agents/rules/api-conventions.md +75 -0
- package/.agents/rules/changelog-style.md +238 -0
- package/.agents/rules/gherkin-standards.md +146 -0
- package/.agents/rules/git-conventions.md +146 -0
- package/.agents/rules/orchestration-error-handling.md +35 -0
- package/.agents/rules/security-baseline.md +92 -0
- package/.agents/rules/shell-conventions.md +70 -0
- package/.agents/rules/test-seams.md +59 -0
- package/.agents/rules/testing-standards.md +177 -0
- package/.agents/runtime-deps.json +18 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
- package/.agents/schemas/agentrc.schema.json +1583 -0
- package/.agents/schemas/audit-results.schema.json +69 -0
- package/.agents/schemas/audit-rules.json +134 -0
- package/.agents/schemas/audit-rules.schema.json +69 -0
- package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
- package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
- package/.agents/schemas/baselines/coverage.schema.json +50 -0
- package/.agents/schemas/baselines/crap.schema.json +52 -0
- package/.agents/schemas/baselines/duplication.schema.json +62 -0
- package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
- package/.agents/schemas/baselines/lint.schema.json +47 -0
- package/.agents/schemas/baselines/maintainability.schema.json +71 -0
- package/.agents/schemas/baselines/mutation.schema.json +52 -0
- package/.agents/schemas/crap-baseline.schema.json +57 -0
- package/.agents/schemas/crap-report.schema.json +102 -0
- package/.agents/schemas/dispatch-manifest.json +232 -0
- package/.agents/schemas/epic-perf-report.schema.json +89 -0
- package/.agents/schemas/epic-spec.schema.json +183 -0
- package/.agents/schemas/friction-event.schema.json +56 -0
- package/.agents/schemas/lifecycle/README.md +18 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
- package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
- package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
- package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
- package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
- package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
- package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
- package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
- package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
- package/.agents/schemas/mi-report.schema.json +58 -0
- package/.agents/schemas/model-attribution.schema.json +49 -0
- package/.agents/schemas/qa-finding.schema.json +133 -0
- package/.agents/schemas/qa-ledger.schema.json +89 -0
- package/.agents/schemas/risk-verdict.schema.json +53 -0
- package/.agents/schemas/signal-event.schema.json +58 -0
- package/.agents/schemas/skill.schema.json +31 -0
- package/.agents/schemas/skills-index.schema.json +81 -0
- package/.agents/schemas/story-perf-summary.schema.json +73 -0
- package/.agents/schemas/validation-evidence.schema.json +78 -0
- package/.agents/scripts/README.md +93 -0
- package/.agents/scripts/acceptance-eval.js +284 -0
- package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
- package/.agents/scripts/agents-bootstrap-github.js +634 -0
- package/.agents/scripts/analyze-execution.js +369 -0
- package/.agents/scripts/assert-branch.js +83 -0
- package/.agents/scripts/audit-labels-bootstrap.js +253 -0
- package/.agents/scripts/audit-to-stories.js +257 -0
- package/.agents/scripts/bootstrap.js +1378 -0
- package/.agents/scripts/check-baselines.js +81 -0
- package/.agents/scripts/check-dead-exports.js +311 -0
- package/.agents/scripts/check-doc-links.js +401 -0
- package/.agents/scripts/check-gherkin-placeholders.js +663 -0
- package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
- package/.agents/scripts/check-lifecycle-lint.js +379 -0
- package/.agents/scripts/check-prepush-recovery.js +90 -0
- package/.agents/scripts/check-windows-git-perf.js +138 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
- package/.agents/scripts/coverage-capture.js +112 -0
- package/.agents/scripts/detect-merges.js +111 -0
- package/.agents/scripts/diagnose-friction.js +257 -0
- package/.agents/scripts/diagnose.js +240 -0
- package/.agents/scripts/dispatcher.js +295 -0
- package/.agents/scripts/drain-pending-cleanup.js +147 -0
- package/.agents/scripts/epic-audit-prepare.js +419 -0
- package/.agents/scripts/epic-audit-recheck.js +241 -0
- package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
- package/.agents/scripts/epic-deliver-preflight.js +407 -0
- package/.agents/scripts/epic-deliver-prepare.js +383 -0
- package/.agents/scripts/epic-execute-record-wave.js +463 -0
- package/.agents/scripts/epic-plan-clarity.js +201 -0
- package/.agents/scripts/epic-plan-decompose.js +79 -0
- package/.agents/scripts/epic-plan-healthcheck.js +363 -0
- package/.agents/scripts/epic-plan-spec-validate.js +111 -0
- package/.agents/scripts/epic-plan-spec.js +198 -0
- package/.agents/scripts/epic-reconcile.js +637 -0
- package/.agents/scripts/evidence-gate.js +235 -0
- package/.agents/scripts/generate-config-docs.js +516 -0
- package/.agents/scripts/generate-lifecycle-docs.js +224 -0
- package/.agents/scripts/generate-skills-index.js +252 -0
- package/.agents/scripts/generate-workflows-doc.js +168 -0
- package/.agents/scripts/git-cleanup.js +124 -0
- package/.agents/scripts/git-pr-quality-gate.js +203 -0
- package/.agents/scripts/git-rebase-and-resolve.js +234 -0
- package/.agents/scripts/hierarchy-gate.js +176 -0
- package/.agents/scripts/hydrate-context.js +179 -0
- package/.agents/scripts/install-matrix-assert.js +282 -0
- package/.agents/scripts/lib/Graph.js +326 -0
- package/.agents/scripts/lib/ITicketingProvider.js +349 -0
- package/.agents/scripts/lib/Logger.js +194 -0
- package/.agents/scripts/lib/audit-suite/cli.js +64 -0
- package/.agents/scripts/lib/audit-suite/findings.js +164 -0
- package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
- package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
- package/.agents/scripts/lib/audit-suite/index.js +22 -0
- package/.agents/scripts/lib/audit-suite/runner.js +233 -0
- package/.agents/scripts/lib/audit-suite/selector.js +235 -0
- package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
- package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
- package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
- package/.agents/scripts/lib/baseline-loader.js +0 -0
- package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
- package/.agents/scripts/lib/baseline-snapshot.js +716 -0
- package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
- package/.agents/scripts/lib/baselines/components.js +126 -0
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
- package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
- package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
- package/.agents/scripts/lib/baselines/envelope.js +368 -0
- package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
- package/.agents/scripts/lib/baselines/git-base.js +0 -0
- package/.agents/scripts/lib/baselines/kernel.js +111 -0
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
- package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
- package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
- package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
- package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
- package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
- package/.agents/scripts/lib/baselines/path-canon.js +279 -0
- package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
- package/.agents/scripts/lib/baselines/reader.js +321 -0
- package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
- package/.agents/scripts/lib/baselines/scope.js +291 -0
- package/.agents/scripts/lib/baselines/writer.js +312 -0
- package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
- package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
- package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
- package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
- package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
- package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
- package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
- package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
- package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
- package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
- package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
- package/.agents/scripts/lib/bootstrap/summary.js +75 -0
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
- package/.agents/scripts/lib/branch-name-guard.js +98 -0
- package/.agents/scripts/lib/c8-cli-path.js +21 -0
- package/.agents/scripts/lib/changed-files.js +184 -0
- package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
- package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
- package/.agents/scripts/lib/checks/index.js +288 -0
- package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
- package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
- package/.agents/scripts/lib/checks/state.js +558 -0
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
- package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
- package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
- package/.agents/scripts/lib/cli/standard-args.js +351 -0
- package/.agents/scripts/lib/cli-args.js +286 -0
- package/.agents/scripts/lib/cli-utils.js +69 -0
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
- package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
- package/.agents/scripts/lib/close-validation.js +897 -0
- package/.agents/scripts/lib/codebase-snapshot.js +513 -0
- package/.agents/scripts/lib/command-header.js +33 -0
- package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
- package/.agents/scripts/lib/config/baselines.js +60 -0
- package/.agents/scripts/lib/config/ci.js +30 -0
- package/.agents/scripts/lib/config/commands.js +36 -0
- package/.agents/scripts/lib/config/defaults.js +119 -0
- package/.agents/scripts/lib/config/explain.js +348 -0
- package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
- package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
- package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
- package/.agents/scripts/lib/config/gates/index.js +36 -0
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
- package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
- package/.agents/scripts/lib/config/gates/shared.js +117 -0
- package/.agents/scripts/lib/config/github.js +122 -0
- package/.agents/scripts/lib/config/lifecycle.js +40 -0
- package/.agents/scripts/lib/config/limits.js +211 -0
- package/.agents/scripts/lib/config/paths.js +73 -0
- package/.agents/scripts/lib/config/preflight.js +58 -0
- package/.agents/scripts/lib/config/quality.js +665 -0
- package/.agents/scripts/lib/config/retro.js +77 -0
- package/.agents/scripts/lib/config/runners.js +105 -0
- package/.agents/scripts/lib/config/runtime.js +167 -0
- package/.agents/scripts/lib/config/shared.js +46 -0
- package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
- package/.agents/scripts/lib/config/temp-paths.js +373 -0
- package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
- package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
- package/.agents/scripts/lib/config-resolver.js +298 -0
- package/.agents/scripts/lib/config-schema-shared.js +32 -0
- package/.agents/scripts/lib/config-schema.js +20 -0
- package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
- package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
- package/.agents/scripts/lib/config-settings-schema.js +420 -0
- package/.agents/scripts/lib/coverage-baseline.js +352 -0
- package/.agents/scripts/lib/coverage-capture.js +195 -0
- package/.agents/scripts/lib/coverage-utils.js +239 -0
- package/.agents/scripts/lib/cpu-pool.js +223 -0
- package/.agents/scripts/lib/crap-engine.js +119 -0
- package/.agents/scripts/lib/crap-utils.js +479 -0
- package/.agents/scripts/lib/degraded-mode.js +69 -0
- package/.agents/scripts/lib/dependency-parser.js +129 -0
- package/.agents/scripts/lib/duplicate-search.js +189 -0
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
- package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
- package/.agents/scripts/lib/env-loader.js +52 -0
- package/.agents/scripts/lib/epic-merge-lock.js +239 -0
- package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
- package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
- package/.agents/scripts/lib/error-redactor.js +125 -0
- package/.agents/scripts/lib/errors/index.js +67 -0
- package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
- package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
- package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
- package/.agents/scripts/lib/findings/classify-finding.js +195 -0
- package/.agents/scripts/lib/findings/promote-finding.js +353 -0
- package/.agents/scripts/lib/findings/route-finding.js +283 -0
- package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
- package/.agents/scripts/lib/findings/severity.js +102 -0
- package/.agents/scripts/lib/gates/baseline-store.js +106 -0
- package/.agents/scripts/lib/gates/friction.js +43 -0
- package/.agents/scripts/lib/gh-exec.js +553 -0
- package/.agents/scripts/lib/git/cached-fetch.js +0 -0
- package/.agents/scripts/lib/git/sync-from-base.js +162 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
- package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
- package/.agents/scripts/lib/git-utils.js +363 -0
- package/.agents/scripts/lib/github-url.js +29 -0
- package/.agents/scripts/lib/install-cmd-parser.js +51 -0
- package/.agents/scripts/lib/issue-link-parser.js +74 -0
- package/.agents/scripts/lib/json-utils.js +60 -0
- package/.agents/scripts/lib/label-constants.js +169 -0
- package/.agents/scripts/lib/label-taxonomy.js +200 -0
- package/.agents/scripts/lib/maintainability-engine.js +164 -0
- package/.agents/scripts/lib/maintainability-utils.js +343 -0
- package/.agents/scripts/lib/mandrel-catalog.js +170 -0
- package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
- package/.agents/scripts/lib/mutation/config-detector.js +119 -0
- package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
- package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
- package/.agents/scripts/lib/notifications/notifier.js +75 -0
- package/.agents/scripts/lib/observability/active-story-env.js +182 -0
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
- package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
- package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
- package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
- package/.agents/scripts/lib/observability/signals-writer.js +296 -0
- package/.agents/scripts/lib/observability/source-classifier.js +103 -0
- package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
- package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
- package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
- package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
- package/.agents/scripts/lib/orchestration/code-review.js +652 -0
- package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
- package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
- package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
- package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
- package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
- package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
- package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
- package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
- package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
- package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
- package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
- package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
- package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
- package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
- package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
- package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
- package/.agents/scripts/lib/orchestration/recut.js +56 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
- package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
- package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
- package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
- package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
- package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
- package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
- package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
- package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
- package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
- package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
- package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
- package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
- package/.agents/scripts/lib/path-security.js +25 -0
- package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
- package/.agents/scripts/lib/preflight-runner.js +196 -0
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
- package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
- package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
- package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
- package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
- package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
- package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
- package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
- package/.agents/scripts/lib/provider-factory.js +80 -0
- package/.agents/scripts/lib/push-epic-retry.js +209 -0
- package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
- package/.agents/scripts/lib/qa/coverage-report.js +181 -0
- package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
- package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
- package/.agents/scripts/lib/qa/qa-session.js +197 -0
- package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
- package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
- package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
- package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
- package/.agents/scripts/lib/signals/detectors/common.js +36 -0
- package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
- package/.agents/scripts/lib/signals/detectors/index.js +14 -0
- package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
- package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
- package/.agents/scripts/lib/signals/index.js +39 -0
- package/.agents/scripts/lib/signals/read.js +268 -0
- package/.agents/scripts/lib/signals/schema.js +225 -0
- package/.agents/scripts/lib/signals/span-tree.js +290 -0
- package/.agents/scripts/lib/signals/write.js +19 -0
- package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
- package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
- package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
- package/.agents/scripts/lib/single-story-sweep.js +329 -0
- package/.agents/scripts/lib/skills/parse-skill.js +202 -0
- package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
- package/.agents/scripts/lib/spec/index.js +36 -0
- package/.agents/scripts/lib/spec/loader.js +425 -0
- package/.agents/scripts/lib/spec/state.js +217 -0
- package/.agents/scripts/lib/story-body/story-body.js +743 -0
- package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
- package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
- package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
- package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
- package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
- package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
- package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
- package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
- package/.agents/scripts/lib/story-lifecycle.js +186 -0
- package/.agents/scripts/lib/story-plan.js +246 -0
- package/.agents/scripts/lib/task-utils.js +26 -0
- package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
- package/.agents/scripts/lib/test-env.js +30 -0
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
- package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
- package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
- package/.agents/scripts/lib/test-isolate/runner.js +483 -0
- package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
- package/.agents/scripts/lib/test-profile/render-report.js +45 -0
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
- package/.agents/scripts/lib/test-tiers.js +94 -0
- package/.agents/scripts/lib/util/concurrent-map.js +59 -0
- package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
- package/.agents/scripts/lib/util/phase-timer.js +163 -0
- package/.agents/scripts/lib/util/poll-loop.js +86 -0
- package/.agents/scripts/lib/util/with-timeout.js +32 -0
- package/.agents/scripts/lib/validation-evidence.js +323 -0
- package/.agents/scripts/lib/wave-runner/tick.js +665 -0
- package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
- package/.agents/scripts/lib/workers/crap-worker.js +197 -0
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
- package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
- package/.agents/scripts/lib/workspace-provisioner.js +189 -0
- package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
- package/.agents/scripts/lib/worktree/inspector.js +140 -0
- package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
- package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
- package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
- package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
- package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
- package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
- package/.agents/scripts/lib/worktree-manager.js +243 -0
- package/.agents/scripts/lifecycle-diff.js +206 -0
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
- package/.agents/scripts/lifecycle-emit.js +479 -0
- package/.agents/scripts/lint-baseline.js +507 -0
- package/.agents/scripts/lint-label-vocabulary.js +237 -0
- package/.agents/scripts/loc-delta.js +205 -0
- package/.agents/scripts/notify.js +307 -0
- package/.agents/scripts/package.json +3 -0
- package/.agents/scripts/post-structured-comment.js +127 -0
- package/.agents/scripts/pr-watch-with-update.js +152 -0
- package/.agents/scripts/providers/github/auth.js +65 -0
- package/.agents/scripts/providers/github/board-add.js +63 -0
- package/.agents/scripts/providers/github/branch-protection.js +186 -0
- package/.agents/scripts/providers/github/cache.js +72 -0
- package/.agents/scripts/providers/github/comments.js +131 -0
- package/.agents/scripts/providers/github/compose.js +111 -0
- package/.agents/scripts/providers/github/errors.js +242 -0
- package/.agents/scripts/providers/github/issues.js +242 -0
- package/.agents/scripts/providers/github/labels.js +179 -0
- package/.agents/scripts/providers/github/mappers.js +126 -0
- package/.agents/scripts/providers/github/merge-methods.js +82 -0
- package/.agents/scripts/providers/github/project-board.js +47 -0
- package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
- package/.agents/scripts/providers/github/prs.js +103 -0
- package/.agents/scripts/providers/github/request-helpers.js +110 -0
- package/.agents/scripts/providers/github/sub-issues.js +369 -0
- package/.agents/scripts/providers/github/tickets.js +381 -0
- package/.agents/scripts/providers/github/transient-retry.js +62 -0
- package/.agents/scripts/providers/github.js +157 -0
- package/.agents/scripts/quality-preview.js +327 -0
- package/.agents/scripts/quality-watch.js +223 -0
- package/.agents/scripts/render-manifest.js +143 -0
- package/.agents/scripts/resync-status-column.js +176 -0
- package/.agents/scripts/retro-run.js +167 -0
- package/.agents/scripts/run-audit-suite.js +97 -0
- package/.agents/scripts/run-coverage.js +103 -0
- package/.agents/scripts/run-lint.js +94 -0
- package/.agents/scripts/run-test-profile.js +126 -0
- package/.agents/scripts/run-tests.js +185 -0
- package/.agents/scripts/run-verify.js +56 -0
- package/.agents/scripts/select-audits.js +155 -0
- package/.agents/scripts/signals-view.js +294 -0
- package/.agents/scripts/single-story-close.js +83 -0
- package/.agents/scripts/single-story-confirm-merge.js +183 -0
- package/.agents/scripts/single-story-init.js +692 -0
- package/.agents/scripts/stories-wave-tick.js +415 -0
- package/.agents/scripts/story-close.js +246 -0
- package/.agents/scripts/story-deliver-prepare.js +267 -0
- package/.agents/scripts/story-init.js +516 -0
- package/.agents/scripts/story-phase.js +327 -0
- package/.agents/scripts/story-plan.js +284 -0
- package/.agents/scripts/sync-agentrc.js +71 -0
- package/.agents/scripts/sync-branch-from-base.js +138 -0
- package/.agents/scripts/sync-claude-commands.js +151 -0
- package/.agents/scripts/test-isolate.js +222 -0
- package/.agents/scripts/test-wrapper.js +108 -0
- package/.agents/scripts/update-coverage-baseline.js +129 -0
- package/.agents/scripts/update-crap-baseline.js +177 -0
- package/.agents/scripts/update-duplication-baseline.js +134 -0
- package/.agents/scripts/update-maintainability-baseline.js +183 -0
- package/.agents/scripts/update-mutation-baseline.js +189 -0
- package/.agents/scripts/update-ticket-state.js +107 -0
- package/.agents/scripts/validate-docs-freshness.js +259 -0
- package/.agents/scripts/validate-skills.js +278 -0
- package/.agents/scripts/wave-tick.js +335 -0
- package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
- package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
- package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
- package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
- package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
- package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
- package/.agents/skills/core/code-simplification/SKILL.md +389 -0
- package/.agents/skills/core/context-engineering/SKILL.md +309 -0
- package/.agents/skills/core/context-engineering/examples.md +58 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
- package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
- package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
- package/.agents/skills/core/idea-refinement/examples.md +437 -0
- package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
- package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
- package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
- package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
- package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
- package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
- package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
- package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
- package/.agents/skills/core/scope-triage/SKILL.md +127 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
- package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
- package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
- package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
- package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
- package/.agents/skills/skills.index.json +596 -0
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
- package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
- package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
- package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
- package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
- package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
- package/.agents/starter-agentrc.json +22 -0
- package/.agents/templates/agent-protocol.md +72 -0
- package/.agents/templates/docs/architecture.md +30 -0
- package/.agents/templates/docs/decisions.md +24 -0
- package/.agents/templates/epic-from-idea.md +21 -0
- package/.agents/templates/single-story-body.md +17 -0
- package/.agents/workflows/agents-update.md +415 -0
- package/.agents/workflows/audit-architecture.md +312 -0
- package/.agents/workflows/audit-clean-code.md +179 -0
- package/.agents/workflows/audit-dependencies.md +91 -0
- package/.agents/workflows/audit-devops.md +110 -0
- package/.agents/workflows/audit-lighthouse.md +260 -0
- package/.agents/workflows/audit-performance.md +161 -0
- package/.agents/workflows/audit-privacy.md +104 -0
- package/.agents/workflows/audit-quality.md +191 -0
- package/.agents/workflows/audit-security.md +156 -0
- package/.agents/workflows/audit-seo.md +118 -0
- package/.agents/workflows/audit-sre.md +139 -0
- package/.agents/workflows/audit-to-stories.md +257 -0
- package/.agents/workflows/audit-ux-ui.md +102 -0
- package/.agents/workflows/epic-deliver.md +864 -0
- package/.agents/workflows/epic-plan.md +998 -0
- package/.agents/workflows/explain.md +118 -0
- package/.agents/workflows/git-cleanup.md +250 -0
- package/.agents/workflows/git-commit-all.md +15 -0
- package/.agents/workflows/git-merge-pr.md +377 -0
- package/.agents/workflows/git-pr-all.md +278 -0
- package/.agents/workflows/git-push.md +60 -0
- package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
- package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
- package/.agents/workflows/helpers/agents-sync-config.md +129 -0
- package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
- package/.agents/workflows/helpers/code-review.md +370 -0
- package/.agents/workflows/helpers/diagnose.md +117 -0
- package/.agents/workflows/helpers/epic-audit.md +295 -0
- package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
- package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
- package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
- package/.agents/workflows/helpers/epic-testing.md +125 -0
- package/.agents/workflows/helpers/parallel-tooling.md +88 -0
- package/.agents/workflows/helpers/signals.md +112 -0
- package/.agents/workflows/helpers/single-story-deliver.md +636 -0
- package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
- package/.agents/workflows/onboard.md +207 -0
- package/.agents/workflows/qa-assist.md +293 -0
- package/.agents/workflows/qa-explore.md +350 -0
- package/.agents/workflows/qa-run-harness.md +288 -0
- package/.agents/workflows/story-deliver.md +327 -0
- package/.agents/workflows/story-plan.md +233 -0
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/bin/mandrel.js +56 -0
- package/bin/postinstall.js +195 -0
- package/lib/cli/__tests__/migrate.test.js +268 -0
- package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
- package/lib/cli/__tests__/sync.test.js +372 -0
- package/lib/cli/__tests__/update-major.test.js +217 -0
- package/lib/cli/__tests__/update.test.js +696 -0
- package/lib/cli/__tests__/version-check.test.js +398 -0
- package/lib/cli/doctor.js +124 -0
- package/lib/cli/explain.js +107 -0
- package/lib/cli/migrate.js +260 -0
- package/lib/cli/registry.js +830 -0
- package/lib/cli/sync-commands.js +50 -0
- package/lib/cli/sync.js +200 -0
- package/lib/cli/uninstall.js +795 -0
- package/lib/cli/update.js +854 -0
- package/lib/cli/version-check.js +206 -0
- package/lib/migrations/README.md +69 -0
- package/lib/migrations/__tests__/index.test.js +216 -0
- package/lib/migrations/index.js +164 -0
- package/package.json +105 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/drain.js — pending-cleanup drain / worktree-sweep boot phase.
|
|
3
|
+
*
|
|
4
|
+
* Runs `sweepStaleStoryWorktrees` when a ticketing `provider` is available
|
|
5
|
+
* (normal CLI boot): drains `.pending-cleanup.json` with Windows escalation,
|
|
6
|
+
* then reaps registered worktrees for done/closed stories. When `provider` is
|
|
7
|
+
* omitted (unit tests), runs `forceDrainPendingCleanup` on the manifest only.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { PROJECT_ROOT } from '../../../config-resolver.js';
|
|
12
|
+
import * as gitUtils from '../../../git-utils.js';
|
|
13
|
+
import { forceDrainPendingCleanup } from '../../../worktree/lifecycle/force-drain.js';
|
|
14
|
+
import { readManifest } from '../../../worktree/lifecycle/pending-cleanup.js';
|
|
15
|
+
import { sweepStaleStoryWorktrees } from '../../plan-runner/worktree-sweep.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Uses `delivery.worktreeIsolation.root` when present; defaults to
|
|
19
|
+
* `.worktrees`.
|
|
20
|
+
*
|
|
21
|
+
* Non-blocking: stuck entries stay in the manifest; plan execution continues.
|
|
22
|
+
*
|
|
23
|
+
* Exposed for integration tests.
|
|
24
|
+
*
|
|
25
|
+
* @param {{ repoRoot?: string, config?: object, provider?: object, git?: object, logger?: object, fsRm?: function }} [opts]
|
|
26
|
+
* @returns {Promise<object>} Canonical sweep/drain summary keyed on
|
|
27
|
+
* `drainedPending` / `persistentPending` / `stillPending`.
|
|
28
|
+
*/
|
|
29
|
+
export async function drainPendingCleanupAtBoot(opts = {}) {
|
|
30
|
+
const repoRoot = opts.repoRoot ?? PROJECT_ROOT;
|
|
31
|
+
const config = opts.config;
|
|
32
|
+
const worktreeRoot = path.join(
|
|
33
|
+
repoRoot,
|
|
34
|
+
config?.delivery?.worktreeIsolation?.root ?? '.worktrees',
|
|
35
|
+
);
|
|
36
|
+
const git = opts.git ?? gitUtils;
|
|
37
|
+
const logger = opts.logger ?? console;
|
|
38
|
+
const fsRm = opts.fsRm;
|
|
39
|
+
const provider = opts.provider;
|
|
40
|
+
|
|
41
|
+
if (provider?.getTicket) {
|
|
42
|
+
const sweep = await sweepStaleStoryWorktrees({
|
|
43
|
+
provider,
|
|
44
|
+
repoRoot,
|
|
45
|
+
git,
|
|
46
|
+
logger,
|
|
47
|
+
worktreeRoot,
|
|
48
|
+
fsRm,
|
|
49
|
+
});
|
|
50
|
+
const remaining =
|
|
51
|
+
(sweep.persistentPending?.length ?? 0) +
|
|
52
|
+
(sweep.stillPending?.length ?? 0);
|
|
53
|
+
logger.info?.(
|
|
54
|
+
`[epic-plan-spec] worktree sweep: reaped=${sweep.reaped.length} drainedPending=${sweep.drainedPending?.length ?? 0} remaining=${remaining}`,
|
|
55
|
+
);
|
|
56
|
+
return sweep;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const before = readManifest(worktreeRoot).length;
|
|
60
|
+
if (before === 0) {
|
|
61
|
+
return {
|
|
62
|
+
reaped: [],
|
|
63
|
+
skipped: [],
|
|
64
|
+
drainedPending: [],
|
|
65
|
+
persistentPending: [],
|
|
66
|
+
stillPending: [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const result = await forceDrainPendingCleanup({
|
|
70
|
+
repoRoot,
|
|
71
|
+
worktreeRoot,
|
|
72
|
+
git,
|
|
73
|
+
fsRm,
|
|
74
|
+
logger,
|
|
75
|
+
});
|
|
76
|
+
const remaining =
|
|
77
|
+
(result.persistent?.length ?? 0) + (result.stillPending?.length ?? 0);
|
|
78
|
+
logger.info?.(
|
|
79
|
+
`[epic-plan-spec] pending-cleanup drain: reaped=${result.drained?.length ?? 0} remaining=${remaining}`,
|
|
80
|
+
);
|
|
81
|
+
return {
|
|
82
|
+
reaped: [],
|
|
83
|
+
skipped: [],
|
|
84
|
+
drainedPending: result.drained,
|
|
85
|
+
persistentPending: result.persistent,
|
|
86
|
+
stillPending: result.stillPending,
|
|
87
|
+
escalated: result.escalated,
|
|
88
|
+
killedPids: result.killedPids,
|
|
89
|
+
noHolders: result.noHolders,
|
|
90
|
+
drainedDetails: result.drainedDetails,
|
|
91
|
+
persistentDetails: result.persistentDetails,
|
|
92
|
+
stillPendingDetails: result.stillPendingDetails,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/plan-epic.js — PRD / Tech Spec / Acceptance Spec persistence phase.
|
|
3
|
+
*
|
|
4
|
+
* Heals any prior planning artifacts (PRD / Tech Spec issues, "Planning
|
|
5
|
+
* Artifacts" body section, lifecycle labels) before writing the new issues.
|
|
6
|
+
* Idempotent against partial state: when the Epic already has a PRD but no
|
|
7
|
+
* Tech Spec, the existing PRD is reused. Pass `force: true` to re-plan: the
|
|
8
|
+
* canonical context tickets (PRD / Tech Spec / Acceptance Spec) are
|
|
9
|
+
* **overwritten in place** — same issue numbers, refreshed bodies, kept open,
|
|
10
|
+
* with a one-line regeneration audit comment on each. Only redundant
|
|
11
|
+
* duplicate artifacts are closed; Feature/Story child tickets retain
|
|
12
|
+
* close-and-recreate behaviour (handled by the decomposer, not here).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { Logger } from '../../../Logger.js';
|
|
16
|
+
import { ACCEPTANCE_NA } from '../../../label-constants.js';
|
|
17
|
+
import { PlanningStateManager } from '../../planning-state-manager.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resolve whether Phase 7 should persist an acceptance-spec ticket or apply
|
|
21
|
+
* the `acceptance::n-a` waiver, from the planningRisk envelope derived off
|
|
22
|
+
* the planner-authored risk verdict (`deriveRiskEnvelope`, Epic #3865).
|
|
23
|
+
*
|
|
24
|
+
* @param {import('../../planning-risk.js').PlanningRiskEnvelope|null} planningRisk
|
|
25
|
+
* Derived envelope; `null` (direct invocations without a verdict) never
|
|
26
|
+
* applies the waiver.
|
|
27
|
+
* @param {string|null} acceptanceSpecContent
|
|
28
|
+
* @returns {{ planningRisk: import('../../planning-risk.js').PlanningRiskEnvelope|null, wantsAcceptanceSpec: boolean, applyAcceptanceWaiver: boolean }}
|
|
29
|
+
*/
|
|
30
|
+
export function resolveAcceptancePersistence(
|
|
31
|
+
planningRisk,
|
|
32
|
+
acceptanceSpecContent,
|
|
33
|
+
) {
|
|
34
|
+
const hasAcceptanceContent =
|
|
35
|
+
typeof acceptanceSpecContent === 'string' &&
|
|
36
|
+
acceptanceSpecContent.trim() !== '';
|
|
37
|
+
|
|
38
|
+
if (planningRisk?.acceptanceDisposition === 'not-applicable') {
|
|
39
|
+
return {
|
|
40
|
+
planningRisk,
|
|
41
|
+
wantsAcceptanceSpec: false,
|
|
42
|
+
applyAcceptanceWaiver: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
planningRisk: planningRisk ?? null,
|
|
48
|
+
wantsAcceptanceSpec: hasAcceptanceContent,
|
|
49
|
+
applyAcceptanceWaiver: false,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Overwrite an existing context ticket (PRD / Tech Spec / Acceptance Spec)
|
|
55
|
+
* in place: push the freshly-authored body and refresh the title prefix so a
|
|
56
|
+
* clarity-gate Epic rename does not strand a stale spec title, then post a
|
|
57
|
+
* single one-line regeneration audit comment so the preserved discussion
|
|
58
|
+
* history stays self-explanatory.
|
|
59
|
+
*
|
|
60
|
+
* The ticket keeps its issue number, its sub-issue link to the Epic, and all
|
|
61
|
+
* pre-existing comments — only the body, title, and a new audit comment are
|
|
62
|
+
* added.
|
|
63
|
+
*
|
|
64
|
+
* @param {import('../../../ITicketingProvider.js').ITicketingProvider} provider
|
|
65
|
+
* @param {number} ticketId Existing context-ticket issue number.
|
|
66
|
+
* @param {{ title: string, body: string, artifact: string }} fields
|
|
67
|
+
* `title` is the refreshed `[PRD] <epic title>`-style prefix; `body` is the
|
|
68
|
+
* regenerated content; `artifact` is the human label used in the audit
|
|
69
|
+
* comment (`PRD`, `Tech Spec`, `Acceptance Spec`).
|
|
70
|
+
* @returns {Promise<void>}
|
|
71
|
+
*/
|
|
72
|
+
export async function overwriteContextTicket(
|
|
73
|
+
provider,
|
|
74
|
+
ticketId,
|
|
75
|
+
{ title, body, artifact },
|
|
76
|
+
) {
|
|
77
|
+
await provider.updateTicket(ticketId, { title, body });
|
|
78
|
+
try {
|
|
79
|
+
await provider.postComment(ticketId, {
|
|
80
|
+
type: 'notification',
|
|
81
|
+
body: `♻️ **Regeneration Audit**: This ${artifact} body was regenerated in place by a \`/epic-plan --force\` re-plan. The issue number and prior discussion history are preserved.`,
|
|
82
|
+
});
|
|
83
|
+
} catch (_err) {
|
|
84
|
+
// Audit comment is best-effort — never fail the overwrite on a comment
|
|
85
|
+
// post error.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function validatePlanEpicInputs({
|
|
90
|
+
prdContent,
|
|
91
|
+
techSpecContent,
|
|
92
|
+
acceptanceSpecContent,
|
|
93
|
+
}) {
|
|
94
|
+
if (typeof prdContent !== 'string' || prdContent.trim() === '') {
|
|
95
|
+
throw new Error(
|
|
96
|
+
'[Epic Planner] prdContent is required and must be non-empty.',
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (typeof techSpecContent !== 'string' || techSpecContent.trim() === '') {
|
|
100
|
+
throw new Error(
|
|
101
|
+
'[Epic Planner] techSpecContent is required and must be non-empty.',
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
if (
|
|
105
|
+
acceptanceSpecContent !== null &&
|
|
106
|
+
(typeof acceptanceSpecContent !== 'string' ||
|
|
107
|
+
acceptanceSpecContent.trim() === '')
|
|
108
|
+
) {
|
|
109
|
+
throw new Error(
|
|
110
|
+
'[Epic Planner] acceptanceSpecContent, when provided, must be a non-empty string.',
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function getExistingArtifactIds(epic) {
|
|
116
|
+
return {
|
|
117
|
+
prd: epic.linkedIssues?.prd ?? null,
|
|
118
|
+
techSpec: epic.linkedIssues?.techSpec ?? null,
|
|
119
|
+
acceptanceSpec: epic.linkedIssues?.acceptanceSpec ?? null,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function hasAllRequestedArtifacts({ existing, wantsAcceptanceSpec }) {
|
|
124
|
+
return Boolean(
|
|
125
|
+
existing.prd &&
|
|
126
|
+
existing.techSpec &&
|
|
127
|
+
(wantsAcceptanceSpec ? existing.acceptanceSpec : true),
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function persistPrd({
|
|
132
|
+
provider,
|
|
133
|
+
epicId,
|
|
134
|
+
epic,
|
|
135
|
+
prdContent,
|
|
136
|
+
existingId,
|
|
137
|
+
force,
|
|
138
|
+
}) {
|
|
139
|
+
if (existingId) {
|
|
140
|
+
if (force) {
|
|
141
|
+
Logger.info(
|
|
142
|
+
`[Epic Planner] --force: Overwriting PRD #${existingId} in place.`,
|
|
143
|
+
);
|
|
144
|
+
await overwriteContextTicket(provider, existingId, {
|
|
145
|
+
title: `[PRD] ${epic.title}`,
|
|
146
|
+
body: prdContent,
|
|
147
|
+
artifact: 'PRD',
|
|
148
|
+
});
|
|
149
|
+
} else {
|
|
150
|
+
Logger.info(
|
|
151
|
+
`[Epic Planner] Reusing existing PRD #${existingId}. Skipping PRD creation.`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
return existingId;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
Logger.info(`[Epic Planner] Creating PRD issue for "${epic.title}"...`);
|
|
158
|
+
const prdTicket = await provider.createTicket(epicId, {
|
|
159
|
+
title: `[PRD] ${epic.title}`,
|
|
160
|
+
body: prdContent,
|
|
161
|
+
labels: ['context::prd'],
|
|
162
|
+
dependencies: [],
|
|
163
|
+
});
|
|
164
|
+
Logger.info(
|
|
165
|
+
`[Epic Planner] Created PRD Issue #${prdTicket.id} (${prdTicket.url})`,
|
|
166
|
+
);
|
|
167
|
+
return prdTicket.id;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function persistTechSpec({
|
|
171
|
+
provider,
|
|
172
|
+
epicId,
|
|
173
|
+
epic,
|
|
174
|
+
techSpecContent,
|
|
175
|
+
prdId,
|
|
176
|
+
existingId,
|
|
177
|
+
force,
|
|
178
|
+
}) {
|
|
179
|
+
if (existingId) {
|
|
180
|
+
if (force) {
|
|
181
|
+
Logger.info(
|
|
182
|
+
`[Epic Planner] --force: Overwriting Tech Spec #${existingId} in place.`,
|
|
183
|
+
);
|
|
184
|
+
await overwriteContextTicket(provider, existingId, {
|
|
185
|
+
title: `[Tech Spec] ${epic.title}`,
|
|
186
|
+
body: techSpecContent,
|
|
187
|
+
artifact: 'Tech Spec',
|
|
188
|
+
});
|
|
189
|
+
} else {
|
|
190
|
+
Logger.info(
|
|
191
|
+
`[Epic Planner] Reusing existing Tech Spec #${existingId}. Skipping Tech Spec creation.`,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
return existingId;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
Logger.info(
|
|
198
|
+
`[Epic Planner] Creating Tech Spec issue linking to PRD #${prdId}...`,
|
|
199
|
+
);
|
|
200
|
+
const techSpecTicket = await provider.createTicket(epicId, {
|
|
201
|
+
title: `[Tech Spec] ${epic.title}`,
|
|
202
|
+
body: techSpecContent,
|
|
203
|
+
labels: ['context::tech-spec'],
|
|
204
|
+
dependencies: [prdId],
|
|
205
|
+
});
|
|
206
|
+
Logger.info(
|
|
207
|
+
`[Epic Planner] Created Tech Spec Issue #${techSpecTicket.id} (${techSpecTicket.url})`,
|
|
208
|
+
);
|
|
209
|
+
return techSpecTicket.id;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function persistAcceptanceSpec({
|
|
213
|
+
provider,
|
|
214
|
+
epicId,
|
|
215
|
+
epic,
|
|
216
|
+
acceptanceSpecContent,
|
|
217
|
+
techSpecId,
|
|
218
|
+
existingId,
|
|
219
|
+
force,
|
|
220
|
+
}) {
|
|
221
|
+
if (existingId) {
|
|
222
|
+
if (force) {
|
|
223
|
+
Logger.info(
|
|
224
|
+
`[Epic Planner] --force: Overwriting Acceptance Spec #${existingId} in place.`,
|
|
225
|
+
);
|
|
226
|
+
await overwriteContextTicket(provider, existingId, {
|
|
227
|
+
title: `[Acceptance Spec] ${epic.title}`,
|
|
228
|
+
body: acceptanceSpecContent,
|
|
229
|
+
artifact: 'Acceptance Spec',
|
|
230
|
+
});
|
|
231
|
+
} else {
|
|
232
|
+
Logger.info(
|
|
233
|
+
`[Epic Planner] Reusing existing Acceptance Spec #${existingId}. Skipping Acceptance Spec creation.`,
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
return existingId;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
Logger.info(
|
|
240
|
+
`[Epic Planner] Creating Acceptance Spec issue linking to Tech Spec #${techSpecId}...`,
|
|
241
|
+
);
|
|
242
|
+
const acceptanceTicket = await provider.createTicket(epicId, {
|
|
243
|
+
title: `[Acceptance Spec] ${epic.title}`,
|
|
244
|
+
body: acceptanceSpecContent,
|
|
245
|
+
labels: ['context::acceptance-spec'],
|
|
246
|
+
dependencies: [techSpecId],
|
|
247
|
+
});
|
|
248
|
+
Logger.info(
|
|
249
|
+
`[Epic Planner] Created Acceptance Spec Issue #${acceptanceTicket.id} (${acceptanceTicket.url})`,
|
|
250
|
+
);
|
|
251
|
+
return acceptanceTicket.id;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async function closeWaivedAcceptanceSpec({
|
|
255
|
+
provider,
|
|
256
|
+
epicId,
|
|
257
|
+
epic,
|
|
258
|
+
existingAcceptanceSpecId,
|
|
259
|
+
}) {
|
|
260
|
+
Logger.info(
|
|
261
|
+
`[Epic Planner] Acceptance disposition now waived — closing existing Acceptance Spec #${existingAcceptanceSpecId}.`,
|
|
262
|
+
);
|
|
263
|
+
try {
|
|
264
|
+
await provider.updateTicket(existingAcceptanceSpecId, {
|
|
265
|
+
state: 'closed',
|
|
266
|
+
state_reason: 'not_planned',
|
|
267
|
+
});
|
|
268
|
+
} catch (err) {
|
|
269
|
+
if (!err.message.includes('404') && !err.message.includes('410')) {
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
await provider.removeSubIssue(epicId, existingAcceptanceSpecId);
|
|
275
|
+
} catch (_err) {
|
|
276
|
+
// Already detached or unsupported — safe to ignore.
|
|
277
|
+
}
|
|
278
|
+
if (epic.linkedIssues) epic.linkedIssues.acceptanceSpec = null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Persist the host-authored PRD and Tech Spec under the Epic.
|
|
283
|
+
*/
|
|
284
|
+
export async function planEpic(
|
|
285
|
+
epicId,
|
|
286
|
+
provider,
|
|
287
|
+
{ prdContent, techSpecContent, acceptanceSpecContent = null },
|
|
288
|
+
_settings = {},
|
|
289
|
+
{ force = false, planningRisk = null } = {},
|
|
290
|
+
) {
|
|
291
|
+
validatePlanEpicInputs({
|
|
292
|
+
prdContent,
|
|
293
|
+
techSpecContent,
|
|
294
|
+
acceptanceSpecContent,
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
Logger.info(`[Epic Planner] Fetching Epic #${epicId}...`);
|
|
298
|
+
const epic = await provider.getEpic(epicId);
|
|
299
|
+
|
|
300
|
+
if (!epic) {
|
|
301
|
+
throw new Error(`Epic #${epicId} not found.`);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const stateManager = new PlanningStateManager(provider);
|
|
305
|
+
await stateManager.healAndCleanupArtifacts(epic, force);
|
|
306
|
+
|
|
307
|
+
const { wantsAcceptanceSpec, applyAcceptanceWaiver } =
|
|
308
|
+
resolveAcceptancePersistence(planningRisk, acceptanceSpecContent);
|
|
309
|
+
|
|
310
|
+
Logger.info(
|
|
311
|
+
`[Epic Planner] Acceptance disposition: ${planningRisk?.acceptanceDisposition ?? 'unspecified'}` +
|
|
312
|
+
(applyAcceptanceWaiver
|
|
313
|
+
? ` — applying ${ACCEPTANCE_NA} waiver (no acceptance-spec ticket).`
|
|
314
|
+
: wantsAcceptanceSpec
|
|
315
|
+
? ' — persisting context::acceptance-spec.'
|
|
316
|
+
: ' — no acceptance-spec content supplied.'),
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
const existing = getExistingArtifactIds(epic);
|
|
320
|
+
if (!force && hasAllRequestedArtifacts({ existing, wantsAcceptanceSpec })) {
|
|
321
|
+
Logger.warn(
|
|
322
|
+
`[Epic Planner] Epic #${epicId} already has all requested planning artifacts. Aborting to prevent duplicates. Use --force to re-plan.`,
|
|
323
|
+
);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
// Under --force we now OVERWRITE the canonical context tickets in place
|
|
327
|
+
// (same issue numbers, refreshed bodies) rather than closing + recreating
|
|
328
|
+
// them. `healAndCleanupArtifacts(epic, force=true)` preserved the canonical
|
|
329
|
+
// IDs on `epic.linkedIssues`, so reuse them in both the force and non-force
|
|
330
|
+
// paths. The difference: under force we push the freshly-authored body via
|
|
331
|
+
// `provider.updateTicket`, whereas the non-force partial-state reuse keeps
|
|
332
|
+
// the existing body untouched.
|
|
333
|
+
const prdId = await persistPrd({
|
|
334
|
+
provider,
|
|
335
|
+
epicId,
|
|
336
|
+
epic,
|
|
337
|
+
prdContent,
|
|
338
|
+
existingId: existing.prd,
|
|
339
|
+
force,
|
|
340
|
+
});
|
|
341
|
+
const techSpecId = await persistTechSpec({
|
|
342
|
+
provider,
|
|
343
|
+
epicId,
|
|
344
|
+
epic,
|
|
345
|
+
techSpecContent,
|
|
346
|
+
prdId,
|
|
347
|
+
existingId: existing.techSpec,
|
|
348
|
+
force,
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
let acceptanceSpecId = null;
|
|
352
|
+
if (wantsAcceptanceSpec) {
|
|
353
|
+
acceptanceSpecId = await persistAcceptanceSpec({
|
|
354
|
+
provider,
|
|
355
|
+
epicId,
|
|
356
|
+
epic,
|
|
357
|
+
acceptanceSpecContent,
|
|
358
|
+
techSpecId,
|
|
359
|
+
existingId: existing.acceptanceSpec,
|
|
360
|
+
force,
|
|
361
|
+
});
|
|
362
|
+
} else if (applyAcceptanceWaiver && existing.acceptanceSpec) {
|
|
363
|
+
// Acceptance-spec transition: was present, now waived (acceptance::n-a).
|
|
364
|
+
// This is a genuine close — there is no longer an acceptance spec to
|
|
365
|
+
// overwrite — and the stale ticket must be detached so the Epic body's
|
|
366
|
+
// Planning Artifacts section stops referencing it.
|
|
367
|
+
await closeWaivedAcceptanceSpec({
|
|
368
|
+
provider,
|
|
369
|
+
epicId,
|
|
370
|
+
epic,
|
|
371
|
+
existingAcceptanceSpecId: existing.acceptanceSpec,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
Logger.info(
|
|
376
|
+
`[Epic Planner] Updating Epic #${epicId} with linked documents...`,
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
// Format exactly so the issue-link-parser regexes still catch each line.
|
|
380
|
+
// The parser is the source of truth for which prefixes are accepted; we
|
|
381
|
+
// emit the canonical "PRD: #N" / "Tech Spec: #N" / "Acceptance Spec: #N"
|
|
382
|
+
// shape so the epic-deliver finalize/cascade-close call shape and the
|
|
383
|
+
// Phase 2 decomposer-context picker both see the third link.
|
|
384
|
+
const artifactLines = [
|
|
385
|
+
`- [ ] PRD: #${prdId}`,
|
|
386
|
+
`- [ ] Tech Spec: #${techSpecId}`,
|
|
387
|
+
];
|
|
388
|
+
if (acceptanceSpecId !== null) {
|
|
389
|
+
artifactLines.push(`- [ ] Acceptance Spec: #${acceptanceSpecId}`);
|
|
390
|
+
}
|
|
391
|
+
const appendBody = `\n\n## Planning Artifacts\n${artifactLines.join('\n')}\n`;
|
|
392
|
+
const newBody = epic.body + appendBody;
|
|
393
|
+
|
|
394
|
+
/** @type {{ add?: string[], remove?: string[] }} */
|
|
395
|
+
const labelMutations = {};
|
|
396
|
+
if (applyAcceptanceWaiver) {
|
|
397
|
+
labelMutations.add = [ACCEPTANCE_NA];
|
|
398
|
+
} else if (
|
|
399
|
+
wantsAcceptanceSpec &&
|
|
400
|
+
(epic.labels ?? []).includes(ACCEPTANCE_NA)
|
|
401
|
+
) {
|
|
402
|
+
labelMutations.remove = [ACCEPTANCE_NA];
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
await provider.updateTicket(epicId, {
|
|
406
|
+
body: newBody,
|
|
407
|
+
...(labelMutations.add || labelMutations.remove
|
|
408
|
+
? { labels: labelMutations }
|
|
409
|
+
: {}),
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
Logger.info(`[Epic Planner] Epic #${epicId} updated successfully.`);
|
|
413
|
+
Logger.info(`[Epic Planner] Planning pipeline complete!`);
|
|
414
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/prompts.js — Canonical PRD / Tech Spec / Acceptance Spec system
|
|
3
|
+
* prompts for the spec phase of `/epic-plan`.
|
|
4
|
+
*
|
|
5
|
+
* These ride along on the `--emit-context` envelope as a backstop. The
|
|
6
|
+
* `epic-plan-spec-author` Skill
|
|
7
|
+
* (`.agents/skills/core/epic-plan-spec-author/SKILL.md`) embeds the
|
|
8
|
+
* authoritative copies of these strings — keep the two surfaces in sync when
|
|
9
|
+
* either is edited.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const PRD_SYSTEM_PROMPT = `You are an expert Technical Product Manager.
|
|
13
|
+
Your job is to convert a high-level Epic description into a structured Product Requirements Document (PRD).
|
|
14
|
+
|
|
15
|
+
The PRD should outline:
|
|
16
|
+
1. Context & Goals
|
|
17
|
+
2. User Stories
|
|
18
|
+
3. Acceptance Criteria
|
|
19
|
+
4. Out of Scope
|
|
20
|
+
|
|
21
|
+
CRITICAL REQUIREMENTS:
|
|
22
|
+
- Respond ONLY with valid Markdown.
|
|
23
|
+
- Do not use top-level <h1> (# ) tags. Start with ## Overview.
|
|
24
|
+
- Format requirements clearly with bullet points and bold text where appropriate.`;
|
|
25
|
+
|
|
26
|
+
export const TECH_SPEC_SYSTEM_PROMPT = `You are an expert Engineering Architect.
|
|
27
|
+
Your job is to convert a PRD into a Technical Specification for implementation.
|
|
28
|
+
|
|
29
|
+
The Tech Spec should outline:
|
|
30
|
+
1. Architecture & Design
|
|
31
|
+
2. Data Models (if any)
|
|
32
|
+
3. API Changes (if any)
|
|
33
|
+
4. Core Components
|
|
34
|
+
5. Security & Privacy Considerations
|
|
35
|
+
|
|
36
|
+
CRITICAL REQUIREMENTS:
|
|
37
|
+
- Respond ONLY with valid Markdown.
|
|
38
|
+
- Do not use top-level <h1> (# ) tags. Start with ## Technical Overview.
|
|
39
|
+
- Format architectural decisions clearly with bullet points.`;
|
|
40
|
+
|
|
41
|
+
export const ACCEPTANCE_SPEC_SYSTEM_PROMPT = `You are an expert Acceptance Engineer.
|
|
42
|
+
Your job is to convert a PRD and a Tech Spec into a structured Acceptance Specification that drives features-first BDD authoring.
|
|
43
|
+
|
|
44
|
+
The Acceptance Spec should outline:
|
|
45
|
+
1. Acceptance Criteria — one row per user-visible outcome, expressed as a Markdown table with columns: AC ID | Outcome | Feature File | Scenario | Disposition
|
|
46
|
+
2. Stable AC IDs — assign AC-1, AC-2, ... in document order; reuse the same ID across re-plans when an Outcome is materially unchanged so scenario tags (@ac-N) stay aligned
|
|
47
|
+
3. Disposition — tag each row with one of: new | updated | unchanged
|
|
48
|
+
|
|
49
|
+
CRITICAL REQUIREMENTS:
|
|
50
|
+
- Respond ONLY with valid Markdown.
|
|
51
|
+
- Do not use top-level <h1> (# ) tags. Start with ## Acceptance Criteria.
|
|
52
|
+
- Every AC row MUST have a stable AC ID of the form AC-<n> (AC-1, AC-2, ...) — do not reorder IDs across re-plans; new ACs get fresh sequential IDs.
|
|
53
|
+
- Every AC row MUST carry a Disposition value from the enum: new | updated | unchanged.
|
|
54
|
+
- Each Outcome MUST be a single user-visible behaviour — no DB assertions, no HTTP status codes, no internal implementation details.
|
|
55
|
+
- Cite proposed feature file paths under tests/features/** so Phase 8 can scaffold matching scenarios.`;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phases/risk-verdict.js — read + schema-validate the planner-authored
|
|
3
|
+
* risk verdict (Epic #3865).
|
|
4
|
+
*
|
|
5
|
+
* The `epic-plan-spec-author` Skill writes `risk-verdict.json` as the
|
|
6
|
+
* fourth planning artifact; the persist half of `epic-plan-spec.js` loads
|
|
7
|
+
* it through this module before deriving the planningRisk envelope. A
|
|
8
|
+
* missing, unparseable, or schema-invalid verdict throws — the spec phase
|
|
9
|
+
* fails closed rather than mis-routing the review gate.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
import Ajv2020 from 'ajv/dist/2020.js';
|
|
17
|
+
import addFormats from 'ajv-formats';
|
|
18
|
+
|
|
19
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
|
|
21
|
+
export const RISK_VERDICT_SCHEMA_PATH = path.resolve(
|
|
22
|
+
__dirname,
|
|
23
|
+
'..',
|
|
24
|
+
'..',
|
|
25
|
+
'..',
|
|
26
|
+
'..',
|
|
27
|
+
'..',
|
|
28
|
+
'schemas',
|
|
29
|
+
'risk-verdict.schema.json',
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
/** @type {Map<string, import('ajv').ValidateFunction>} */
|
|
33
|
+
const validatorCache = new Map();
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Compile (and cache) the Ajv2020 validator for the risk-verdict schema.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} schemaPath
|
|
39
|
+
* @param {{ readFileSync: typeof readFileSync }} io
|
|
40
|
+
* @returns {import('ajv').ValidateFunction}
|
|
41
|
+
*/
|
|
42
|
+
function getRiskVerdictValidator(schemaPath, io) {
|
|
43
|
+
const cached = validatorCache.get(schemaPath);
|
|
44
|
+
if (cached) return cached;
|
|
45
|
+
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
46
|
+
addFormats(ajv);
|
|
47
|
+
const schema = JSON.parse(io.readFileSync(schemaPath, 'utf8'));
|
|
48
|
+
const validate = ajv.compile(schema);
|
|
49
|
+
validatorCache.set(schemaPath, validate);
|
|
50
|
+
return validate;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Validate a parsed risk verdict against the schema. Throws with the full
|
|
55
|
+
* Ajv error detail on any violation so the spec phase never routes the
|
|
56
|
+
* review gate off a malformed verdict.
|
|
57
|
+
*
|
|
58
|
+
* @param {unknown} verdict
|
|
59
|
+
* @param {{ schemaPath?: string, io?: { readFileSync: typeof readFileSync } }} [opts]
|
|
60
|
+
* @returns {import('../../planning-risk.js').RiskVerdict} The validated verdict (same reference).
|
|
61
|
+
*/
|
|
62
|
+
export function validateRiskVerdict(verdict, opts = {}) {
|
|
63
|
+
const validate = getRiskVerdictValidator(
|
|
64
|
+
opts.schemaPath ?? RISK_VERDICT_SCHEMA_PATH,
|
|
65
|
+
opts.io ?? { readFileSync },
|
|
66
|
+
);
|
|
67
|
+
if (!validate(verdict)) {
|
|
68
|
+
const detail = (validate.errors ?? [])
|
|
69
|
+
.map((e) => `${e.instancePath || '/'} ${e.message}`)
|
|
70
|
+
.join('; ');
|
|
71
|
+
throw new Error(
|
|
72
|
+
`[epic-plan-spec] risk verdict failed schema validation: ${detail}`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return /** @type {import('../../planning-risk.js').RiskVerdict} */ (verdict);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Read, parse, and schema-validate the risk-verdict file the
|
|
80
|
+
* `epic-plan-spec-author` Skill wrote.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} verdictPath
|
|
83
|
+
* @param {{ schemaPath?: string, io?: { readFileSync: typeof readFileSync } }} [opts]
|
|
84
|
+
* @returns {import('../../planning-risk.js').RiskVerdict}
|
|
85
|
+
*/
|
|
86
|
+
export function loadRiskVerdict(verdictPath, opts = {}) {
|
|
87
|
+
const io = opts.io ?? { readFileSync };
|
|
88
|
+
let raw;
|
|
89
|
+
try {
|
|
90
|
+
raw = io.readFileSync(verdictPath, 'utf8');
|
|
91
|
+
} catch (err) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`[epic-plan-spec] cannot read risk verdict at ${verdictPath}: ${err.message}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(raw);
|
|
99
|
+
} catch (err) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`[epic-plan-spec] risk verdict at ${verdictPath} is not valid JSON: ${err.message}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return validateRiskVerdict(parsed, opts);
|
|
105
|
+
}
|