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,652 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/code-review.js — In-process Code Review module.
|
|
3
|
+
*
|
|
4
|
+
* Story #1155 (Epic #1142, 5.40.0) — extracted the helper-driven
|
|
5
|
+
* `epic-code-review` invocation into a callable module so the
|
|
6
|
+
* `/epic-deliver` runner can run Phase D without spawning a child
|
|
7
|
+
* process or routing through an LLM-driven helper.
|
|
8
|
+
*
|
|
9
|
+
* Story #2831 (Epic #2815, Pluggable Code Review) — refactored to load
|
|
10
|
+
* the review provider through `review-provider-factory`, call the
|
|
11
|
+
* adapter's `runReview()` to collect a `Finding[]`, render the
|
|
12
|
+
* structured-comment body via `findings-renderer`, and post the
|
|
13
|
+
* comment through the GitHub provider here (the adapter is post-free
|
|
14
|
+
* by design). The lifecycle events (`code-review.start`/`.end`)
|
|
15
|
+
* preserve their previous payload shape so the ledger and listener
|
|
16
|
+
* chain are unchanged.
|
|
17
|
+
*
|
|
18
|
+
* Public API:
|
|
19
|
+
* - `runCodeReview({ epicId, provider, logger, bus, ... })` →
|
|
20
|
+
* `{ status, severity, posted, report, halted, blockerReason }`.
|
|
21
|
+
*
|
|
22
|
+
* Behaviour:
|
|
23
|
+
* - Loads the configured review adapter via the factory; defaults to
|
|
24
|
+
* `native` when `delivery.codeReview.provider` is unset.
|
|
25
|
+
* - Always posts the structured `code-review` comment on the Epic
|
|
26
|
+
* issue (the adapter never posts; the orchestrator owns persistence).
|
|
27
|
+
* - Treats severity.critical > 0 as a halting blocker — the merged
|
|
28
|
+
* `/epic-deliver` runner consults `halted` and refuses to advance
|
|
29
|
+
* to Phase E (retro) when set.
|
|
30
|
+
*
|
|
31
|
+
* Halting on critical findings is the in-process replacement for the
|
|
32
|
+
* helper's "operator must remediate before /epic-deliver" gate.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { resolveConfig } from '../config-resolver.js';
|
|
36
|
+
import { selectAuditStrategy } from '../dynamic-workflow/capability.js';
|
|
37
|
+
import { gitSpawn } from '../git-utils.js';
|
|
38
|
+
import { read as readPlanState } from './epic-plan-state-store.js';
|
|
39
|
+
import { resolveDepth } from './review-depth.js';
|
|
40
|
+
import {
|
|
41
|
+
countBySeverity,
|
|
42
|
+
renderFindings,
|
|
43
|
+
} from './review-providers/findings-renderer.js';
|
|
44
|
+
import { createReviewProvider } from './review-providers/review-provider-factory.js';
|
|
45
|
+
import { upsertStructuredComment } from './ticketing.js';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Review depth tiers, ordered light → standard → deep. The depth is resolved
|
|
49
|
+
* by the shared {@link resolveDepth} resolver from the judged risk envelope's
|
|
50
|
+
* `overallLevel` **and** the mechanical changed-file count of the diff under
|
|
51
|
+
* review, then threaded into the review provider's `runReview` input so a
|
|
52
|
+
* high-risk *or* wide-footprint change gets a deeper pass than a low-risk
|
|
53
|
+
* small one. Depth is an **input** signal only — it never changes the
|
|
54
|
+
* `{ status, severity, posted, report, halted, blockerReason }` output
|
|
55
|
+
* envelope nor the `code-review` structured-comment body (Story #3876,
|
|
56
|
+
* extended by Story #3938).
|
|
57
|
+
*
|
|
58
|
+
* @typedef {import('./review-depth.js').ReviewDepth} ReviewDepth
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Count the files changed in the `baseRef...headRef` diff via
|
|
63
|
+
* `git diff --name-only`. Returns the file count, or `null` when the diff
|
|
64
|
+
* cannot be enumerated (git failure, missing ref). A `null` count is the
|
|
65
|
+
* neutral "width unknown" signal {@link resolveDepth} tolerates without
|
|
66
|
+
* downgrading or escalating the depth. Best-effort — never throws.
|
|
67
|
+
*
|
|
68
|
+
* @param {{ baseRef: string, headRef: string, gitSpawnFn?: typeof gitSpawn }} args
|
|
69
|
+
* @returns {number|null}
|
|
70
|
+
*/
|
|
71
|
+
function countChangedFiles({ baseRef, headRef, gitSpawnFn = gitSpawn }) {
|
|
72
|
+
try {
|
|
73
|
+
const result = gitSpawnFn(
|
|
74
|
+
process.cwd(),
|
|
75
|
+
'diff',
|
|
76
|
+
`${baseRef}...${headRef}`,
|
|
77
|
+
'--name-only',
|
|
78
|
+
);
|
|
79
|
+
if (!result || result.status !== 0 || typeof result.stdout !== 'string') {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return result.stdout
|
|
83
|
+
.trim()
|
|
84
|
+
.split('\n')
|
|
85
|
+
.filter((line) => line.length > 0).length;
|
|
86
|
+
} catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Resolve the `planning.taskSizing` operator override the same way the ticket
|
|
93
|
+
* validator does, so an operator who retunes sizing retunes the depth
|
|
94
|
+
* thresholds with it. Reads `config.planning.taskSizing` first, then the
|
|
95
|
+
* legacy `config.agentSettings.planning.taskSizing` nest; absent → `undefined`
|
|
96
|
+
* so {@link resolveDepth} falls back to `DEFAULT_TASK_SIZING`.
|
|
97
|
+
*
|
|
98
|
+
* @param {object|null|undefined} config
|
|
99
|
+
* @returns {object|undefined}
|
|
100
|
+
*/
|
|
101
|
+
function resolveTaskSizing(config) {
|
|
102
|
+
return (
|
|
103
|
+
config?.planning?.taskSizing ??
|
|
104
|
+
config?.agentSettings?.planning?.taskSizing ??
|
|
105
|
+
undefined
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Producer-side resolver (Story #3937, extended by Story #3938): read an
|
|
111
|
+
* Epic's judged `planningRisk` envelope off its `epic-plan-state` checkpoint
|
|
112
|
+
* and resolve the review depth via the shared {@link resolveDepth} resolver.
|
|
113
|
+
* This is the live epic-scope counterpart to `resolveRiskRoutedLenses` in
|
|
114
|
+
* `epic-audit-prepare.js` — it reuses the same best-effort `readPlanState`
|
|
115
|
+
* pattern so the producer never aborts the review on a risk-read failure.
|
|
116
|
+
*
|
|
117
|
+
* Best-effort and total: a missing/unparseable checkpoint, an absent
|
|
118
|
+
* `planningRisk` field, a read failure, or a malformed `overallLevel` all
|
|
119
|
+
* degrade to `standard` (never throws). So an Epic that skipped `/epic-plan`
|
|
120
|
+
* (no checkpoint) still gets a passing `standard` review with no new failure
|
|
121
|
+
* mode. The producer resolves depth from the judged risk alone (the diff is
|
|
122
|
+
* not yet enumerated at this point); the full risk + diff-width combination is
|
|
123
|
+
* applied in `runCodeReview`, which knows the changed-file count. A high-risk
|
|
124
|
+
* Epic resolves to `deep` here; a low-risk one to `light` (the diff width can
|
|
125
|
+
* only escalate, never downgrade, that producer-side resolution).
|
|
126
|
+
*
|
|
127
|
+
* @param {{
|
|
128
|
+
* epicId: number,
|
|
129
|
+
* provider: object,
|
|
130
|
+
* readPlanState?: typeof readPlanState,
|
|
131
|
+
* }} params
|
|
132
|
+
* @returns {Promise<ReviewDepth>}
|
|
133
|
+
*/
|
|
134
|
+
export async function resolveReviewDepthForEpic({
|
|
135
|
+
epicId,
|
|
136
|
+
provider,
|
|
137
|
+
readPlanState: readPlanStateFn = readPlanState,
|
|
138
|
+
}) {
|
|
139
|
+
let state = null;
|
|
140
|
+
try {
|
|
141
|
+
state = await readPlanStateFn({ provider, epicId });
|
|
142
|
+
} catch {
|
|
143
|
+
// A read failure (provider error, malformed comment) must not abort the
|
|
144
|
+
// review. Degrade to the neutral `standard` depth.
|
|
145
|
+
return 'standard';
|
|
146
|
+
}
|
|
147
|
+
return resolveDepth({ overallLevel: state?.planningRisk?.overallLevel });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* The axes whose presence (at `high` risk) routes a specific post-delivery
|
|
152
|
+
* audit lens. Mirrors the audit-workflow names under
|
|
153
|
+
* `.agents/workflows/audit-*.md`. Story #3939 broadened the routing so every
|
|
154
|
+
* high-risk REQUIRED axis maps to a lens rather than leaving three of them
|
|
155
|
+
* (`data-migration`, `destructive-mutation`, `billing`) routing nothing:
|
|
156
|
+
*
|
|
157
|
+
* - `security` → `audit-security` (auth/secret boundary)
|
|
158
|
+
* - `public-api` → `audit-architecture` (the canonical
|
|
159
|
+
* architectural axis; a breaking public surface)
|
|
160
|
+
* - `data-migration` → `audit-quality` (migration correctness +
|
|
161
|
+
* regression coverage)
|
|
162
|
+
* - `destructive-mutation` → `audit-security` (irreversible mutation is
|
|
163
|
+
* an auth/abuse boundary; co-routes with
|
|
164
|
+
* `security`, de-duplicated)
|
|
165
|
+
* - `billing` → `audit-privacy` (money + the PII/consent
|
|
166
|
+
* surface that travels with it)
|
|
167
|
+
* - `critical-workflow` → `audit-quality` (the load-bearing path
|
|
168
|
+
* warrants the deepest coverage pass)
|
|
169
|
+
*
|
|
170
|
+
* The `visible-behavior` axis intentionally routes NO lens: it forces the
|
|
171
|
+
* acceptance-spec disposition at plan time and no audit lens maps cleanly to
|
|
172
|
+
* it. Any other axis (or a low/medium-risk axis) contributes no lens.
|
|
173
|
+
*
|
|
174
|
+
* Every key here MUST be a value in the `axis` enum of
|
|
175
|
+
* `.agents/schemas/risk-verdict.schema.json` — the verdict-derived envelope
|
|
176
|
+
* can only ever carry schema-valid axes, so a key absent from that enum is
|
|
177
|
+
* unreachable dead routing (Story #3889 removed the unreachable
|
|
178
|
+
* `architecture` key; the architectural axis is `public-api`).
|
|
179
|
+
*/
|
|
180
|
+
const AXIS_TO_LENS = Object.freeze({
|
|
181
|
+
security: 'audit-security',
|
|
182
|
+
'public-api': 'audit-architecture',
|
|
183
|
+
'data-migration': 'audit-quality',
|
|
184
|
+
'destructive-mutation': 'audit-security',
|
|
185
|
+
billing: 'audit-privacy',
|
|
186
|
+
'critical-workflow': 'audit-quality',
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Stable output order for routed lenses so the lens list is deterministic
|
|
191
|
+
* regardless of axis ordering in the verdict. Every lens any axis can route
|
|
192
|
+
* appears here exactly once; `resolveAuditLenses` filters this canonical
|
|
193
|
+
* order down to the matched set (Story #3939).
|
|
194
|
+
*/
|
|
195
|
+
const LENS_ORDER = Object.freeze([
|
|
196
|
+
'audit-security',
|
|
197
|
+
'audit-architecture',
|
|
198
|
+
'audit-quality',
|
|
199
|
+
'audit-privacy',
|
|
200
|
+
]);
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Resolve the set of post-delivery audit lenses a judged risk envelope routes.
|
|
204
|
+
*
|
|
205
|
+
* High-risk axes map to their audit lens via {@link AXIS_TO_LENS}; only axes
|
|
206
|
+
* judged `high` contribute (a `low`/`medium` axis carries no lens). The result
|
|
207
|
+
* is de-duplicated and stably ordered by {@link LENS_ORDER} so an envelope
|
|
208
|
+
* listing the `public-api` axis more than once routes `['audit-architecture']`
|
|
209
|
+
* once, not twice — and two distinct axes routing the same lens (e.g.
|
|
210
|
+
* `security` + `destructive-mutation` both → `audit-security`) collapse to a
|
|
211
|
+
* single entry. A low-risk envelope — or any envelope with no high-risk routed
|
|
212
|
+
* axis — resolves to an empty array (no lens beyond the existing baseline
|
|
213
|
+
* gates).
|
|
214
|
+
*
|
|
215
|
+
* Pure function — no I/O, no side effects.
|
|
216
|
+
*
|
|
217
|
+
* @param {{ axes?: Array<{ axis?: string, level?: string }> }} [envelope]
|
|
218
|
+
* @returns {string[]} Ordered, de-duplicated audit-lens identifiers.
|
|
219
|
+
*/
|
|
220
|
+
export function resolveAuditLenses(envelope = {}) {
|
|
221
|
+
const axes = Array.isArray(envelope?.axes) ? envelope.axes : [];
|
|
222
|
+
const matched = new Set();
|
|
223
|
+
for (const entry of axes) {
|
|
224
|
+
if (!entry || entry.level !== 'high') continue;
|
|
225
|
+
const lens = AXIS_TO_LENS[entry.axis];
|
|
226
|
+
if (lens) matched.add(lens);
|
|
227
|
+
}
|
|
228
|
+
return LENS_ORDER.filter((lens) => matched.has(lens));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Build the post-delivery audit-lens execution plan for a judged risk
|
|
233
|
+
* envelope. Each routed lens (see {@link resolveAuditLenses}) is paired with a
|
|
234
|
+
* strategy decision from the **existing** `selectAuditStrategy` engine — no new
|
|
235
|
+
* audit machinery is introduced. A low-risk envelope resolves to an empty
|
|
236
|
+
* `lenses` array and runs no audit beyond the baseline gates (Story #3876).
|
|
237
|
+
*
|
|
238
|
+
* Pure with respect to the injected `selectAuditStrategyFn` (default is the
|
|
239
|
+
* shared dynamic-workflow engine, which is itself pure over its snapshot).
|
|
240
|
+
*
|
|
241
|
+
* @param {{ axes?: Array<{ axis?: string, level?: string }> }} [envelope]
|
|
242
|
+
* @param {{
|
|
243
|
+
* snapshot?: object,
|
|
244
|
+
* forceStrategy?: ('orchestrated'|'sequential'|null),
|
|
245
|
+
* selectAuditStrategyFn?: typeof selectAuditStrategy,
|
|
246
|
+
* }} [opts]
|
|
247
|
+
* @returns {{ lenses: string[], plan: Array<{ lens: string, strategy: string, reason: string, forced: boolean }> }}
|
|
248
|
+
*/
|
|
249
|
+
export function planAuditLenses(envelope = {}, opts = {}) {
|
|
250
|
+
const {
|
|
251
|
+
snapshot = {},
|
|
252
|
+
forceStrategy = null,
|
|
253
|
+
selectAuditStrategyFn = selectAuditStrategy,
|
|
254
|
+
} = opts;
|
|
255
|
+
const lenses = resolveAuditLenses(envelope);
|
|
256
|
+
const plan = lenses.map((lens) => {
|
|
257
|
+
const decision = selectAuditStrategyFn({ snapshot, forceStrategy });
|
|
258
|
+
return {
|
|
259
|
+
lens,
|
|
260
|
+
strategy: decision.strategy,
|
|
261
|
+
reason: decision.reason,
|
|
262
|
+
forced: decision.forced,
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
return { lenses, plan };
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Build the `code-review.end` payload from the normalized result envelope.
|
|
270
|
+
* The runner result may carry a `report` field (full markdown body) which
|
|
271
|
+
* is NOT included in the lifecycle payload: the schema's
|
|
272
|
+
* `additionalProperties: false` forbids it, and the body can carry inline
|
|
273
|
+
* severity counts that drift from the structured `severity` field. The
|
|
274
|
+
* lifecycle ledger is the structured surface; the report is GitHub's
|
|
275
|
+
* surface (posted via the structured comment).
|
|
276
|
+
*
|
|
277
|
+
* Story #2839: `epicId` is preserved verbatim in the lifecycle payload so
|
|
278
|
+
* the `code-review.end` schema (additionalProperties: false, requires
|
|
279
|
+
* `epicId`) stays unchanged. Story-scope invocations never reach this
|
|
280
|
+
* helper — `runCodeReview` short-circuits the bus emit for `scope: 'story'`
|
|
281
|
+
* because story-scope review sits outside the Epic lifecycle ledger.
|
|
282
|
+
*/
|
|
283
|
+
function buildCodeReviewEndPayload({ epicId, result, durationMs }) {
|
|
284
|
+
const payload = {
|
|
285
|
+
epicId,
|
|
286
|
+
status: result.status,
|
|
287
|
+
};
|
|
288
|
+
if (result.severity && typeof result.severity === 'object') {
|
|
289
|
+
payload.severity = {
|
|
290
|
+
critical: result.severity.critical ?? 0,
|
|
291
|
+
high: result.severity.high ?? 0,
|
|
292
|
+
medium: result.severity.medium ?? 0,
|
|
293
|
+
suggestion: result.severity.suggestion ?? 0,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
if (typeof result.halted === 'boolean') payload.halted = result.halted;
|
|
297
|
+
if (typeof result.posted === 'boolean') payload.posted = result.posted;
|
|
298
|
+
if (Number.isFinite(durationMs) && durationMs >= 0) {
|
|
299
|
+
payload.durationMs = Math.floor(durationMs);
|
|
300
|
+
}
|
|
301
|
+
return payload;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Resolve the scope envelope from the (legacy `epicId` + optional
|
|
306
|
+
* `baseBranch`) shape OR the (new `scope`/`ticketId`/`headRef`/
|
|
307
|
+
* `commentTargetId`) shape into a single normalized record. Extracted to
|
|
308
|
+
* keep `runCodeReview` body below the CRAP-cyclomatic ceiling.
|
|
309
|
+
*
|
|
310
|
+
* @param {{
|
|
311
|
+
* epicId?: number,
|
|
312
|
+
* scope?: 'epic'|'story',
|
|
313
|
+
* ticketId?: number,
|
|
314
|
+
* baseBranch?: string|null,
|
|
315
|
+
* baseRef?: string|null,
|
|
316
|
+
* headRef?: string|null,
|
|
317
|
+
* commentTargetId?: number|null,
|
|
318
|
+
* }} opts
|
|
319
|
+
* @param {object} config
|
|
320
|
+
* @returns {{
|
|
321
|
+
* scope: 'epic'|'story',
|
|
322
|
+
* ticketId: number,
|
|
323
|
+
* baseRef: string,
|
|
324
|
+
* headRef: string,
|
|
325
|
+
* commentTargetId: number,
|
|
326
|
+
* epicIdForLedger: number|null,
|
|
327
|
+
* }}
|
|
328
|
+
*/
|
|
329
|
+
function resolveScopeEnvelope(opts, config) {
|
|
330
|
+
const explicitScope = opts.scope;
|
|
331
|
+
const epicIdLegacy = opts.epicId;
|
|
332
|
+
const configBase =
|
|
333
|
+
config?.project?.baseBranch ?? config?.agentSettings?.baseBranch ?? 'main';
|
|
334
|
+
|
|
335
|
+
if (explicitScope === 'story') {
|
|
336
|
+
if (!Number.isInteger(opts.ticketId) || opts.ticketId <= 0) {
|
|
337
|
+
throw new TypeError(
|
|
338
|
+
'runCodeReview: ticketId is required (positive integer) when scope="story".',
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
if (typeof opts.headRef !== 'string' || opts.headRef.length === 0) {
|
|
342
|
+
throw new TypeError(
|
|
343
|
+
'runCodeReview: headRef is required (non-empty string) when scope="story".',
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
const baseRef = opts.baseRef ?? opts.baseBranch ?? configBase;
|
|
347
|
+
const commentTargetId =
|
|
348
|
+
Number.isInteger(opts.commentTargetId) && opts.commentTargetId > 0
|
|
349
|
+
? opts.commentTargetId
|
|
350
|
+
: opts.ticketId;
|
|
351
|
+
return {
|
|
352
|
+
scope: 'story',
|
|
353
|
+
ticketId: opts.ticketId,
|
|
354
|
+
baseRef,
|
|
355
|
+
headRef: opts.headRef,
|
|
356
|
+
commentTargetId,
|
|
357
|
+
epicIdForLedger: null,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Epic scope (default + legacy `epicId` callers).
|
|
362
|
+
const effectiveEpicId =
|
|
363
|
+
Number.isInteger(opts.ticketId) && opts.ticketId > 0
|
|
364
|
+
? opts.ticketId
|
|
365
|
+
: epicIdLegacy;
|
|
366
|
+
if (!Number.isInteger(effectiveEpicId) || effectiveEpicId <= 0) {
|
|
367
|
+
throw new TypeError(
|
|
368
|
+
'runCodeReview: epicId is required (positive integer).',
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
const baseRef = opts.baseRef ?? opts.baseBranch ?? configBase;
|
|
372
|
+
const headRef = opts.headRef ?? `epic/${effectiveEpicId}`;
|
|
373
|
+
const commentTargetId =
|
|
374
|
+
Number.isInteger(opts.commentTargetId) && opts.commentTargetId > 0
|
|
375
|
+
? opts.commentTargetId
|
|
376
|
+
: effectiveEpicId;
|
|
377
|
+
return {
|
|
378
|
+
scope: 'epic',
|
|
379
|
+
ticketId: effectiveEpicId,
|
|
380
|
+
baseRef,
|
|
381
|
+
headRef,
|
|
382
|
+
commentTargetId,
|
|
383
|
+
epicIdForLedger: effectiveEpicId,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* In-process wrapper that the `/epic-deliver` runner and the
|
|
389
|
+
* `/single-story-deliver` close path consume.
|
|
390
|
+
*
|
|
391
|
+
* Story #2252 — emits `code-review.start` immediately on entry and
|
|
392
|
+
* `code-review.end` immediately before returning the envelope (success
|
|
393
|
+
* or halt). On runner throw, emits `code-review.end` with the canonical
|
|
394
|
+
* structure (`status: 'invalid'`) before re-throwing so the ledger
|
|
395
|
+
* always carries the closing boundary.
|
|
396
|
+
*
|
|
397
|
+
* Story #2831 — the runner loads its adapter through the factory; the
|
|
398
|
+
* `reviewProvider` opt overrides the factory for tests. Severity is
|
|
399
|
+
* derived from the `Finding[]` returned by the adapter (no separate
|
|
400
|
+
* severity field on the runner result).
|
|
401
|
+
*
|
|
402
|
+
* Story #2839 (Epic #2815) — accepts a parameterized scope envelope
|
|
403
|
+
* so the standalone Story closer can request a Story-scope review
|
|
404
|
+
* against `main`, post the structured findings comment to the PR
|
|
405
|
+
* (via `commentTargetId`), and surface critical findings to the
|
|
406
|
+
* caller as `halted: true`. Lifecycle bus emits are confined to
|
|
407
|
+
* `scope: 'epic'` because the `code-review.end` schema requires
|
|
408
|
+
* `epicId` and the ledger only spans Epic lifecycles.
|
|
409
|
+
*
|
|
410
|
+
* Argument shapes:
|
|
411
|
+
* - Legacy (Epic):
|
|
412
|
+
* `{ epicId, provider, bus, [baseBranch] }`
|
|
413
|
+
* - Parameterized (Epic or Story):
|
|
414
|
+
* `{ scope, ticketId, baseRef, headRef, [commentTargetId],
|
|
415
|
+
* provider, bus }`
|
|
416
|
+
* For `scope === 'story'`, `commentTargetId` overrides the post
|
|
417
|
+
* target (e.g. PR number) while `ticketId` continues to label the
|
|
418
|
+
* rendered header ("Story #N").
|
|
419
|
+
*
|
|
420
|
+
* @param {{
|
|
421
|
+
* epicId?: number,
|
|
422
|
+
* scope?: 'epic'|'story',
|
|
423
|
+
* ticketId?: number,
|
|
424
|
+
* baseRef?: string|null,
|
|
425
|
+
* headRef?: string|null,
|
|
426
|
+
* commentTargetId?: number|null,
|
|
427
|
+
* provider: object,
|
|
428
|
+
* logger?: { info?: Function, warn?: Function, error?: Function, fatal?: Function, createProgress?: Function },
|
|
429
|
+
* baseBranch?: string|null,
|
|
430
|
+
* planningRisk?: { overallLevel?: ('low'|'medium'|'high'), axes?: Array<{ axis?: string, level?: string }> }|null,
|
|
431
|
+
* changedFileCount?: number|null,
|
|
432
|
+
* storyId?: number|null,
|
|
433
|
+
* bus?: object|null,
|
|
434
|
+
* now?: () => number,
|
|
435
|
+
* reviewProvider?: { runReview: Function },
|
|
436
|
+
* gitSpawnFn?: typeof gitSpawn,
|
|
437
|
+
* resolveConfigFn?: typeof resolveConfig,
|
|
438
|
+
* createReviewProviderFn?: typeof createReviewProvider,
|
|
439
|
+
* upsertCommentFn?: typeof upsertStructuredComment,
|
|
440
|
+
* renderFindingsFn?: typeof renderFindings,
|
|
441
|
+
* }} opts
|
|
442
|
+
* @returns {Promise<{
|
|
443
|
+
* status: 'ok'|'no-changes'|'invalid',
|
|
444
|
+
* severity: { critical: number, high: number, medium: number, suggestion: number },
|
|
445
|
+
* report?: string,
|
|
446
|
+
* posted: boolean,
|
|
447
|
+
* postedCommentId: number|null,
|
|
448
|
+
* commentTargetId: number,
|
|
449
|
+
* halted: boolean,
|
|
450
|
+
* blockerReason: string|null,
|
|
451
|
+
* }>}
|
|
452
|
+
*/
|
|
453
|
+
export async function runCodeReview(opts = {}) {
|
|
454
|
+
const {
|
|
455
|
+
provider,
|
|
456
|
+
logger,
|
|
457
|
+
bus,
|
|
458
|
+
now = Date.now,
|
|
459
|
+
reviewProvider: injectedReviewProvider,
|
|
460
|
+
resolveConfigFn = resolveConfig,
|
|
461
|
+
createReviewProviderFn = createReviewProvider,
|
|
462
|
+
upsertCommentFn = upsertStructuredComment,
|
|
463
|
+
renderFindingsFn = renderFindings,
|
|
464
|
+
} = opts;
|
|
465
|
+
|
|
466
|
+
const config = resolveConfigFn();
|
|
467
|
+
const envelope = resolveScopeEnvelope(opts, config);
|
|
468
|
+
const { scope, ticketId, baseRef, headRef, commentTargetId } = envelope;
|
|
469
|
+
|
|
470
|
+
// Epic-scope lifecycle ledger requires `bus`; Story-scope sits outside
|
|
471
|
+
// the Epic lifecycle so the bus is optional there. A caller without a
|
|
472
|
+
// bus on the Story path still gets the full review semantics — only the
|
|
473
|
+
// `code-review.start`/`.end` events are suppressed.
|
|
474
|
+
const requiresBus = scope === 'epic';
|
|
475
|
+
if (requiresBus && (!bus || typeof bus.emit !== 'function')) {
|
|
476
|
+
throw new TypeError('runCodeReview: bus is required (object with emit()).');
|
|
477
|
+
}
|
|
478
|
+
const ledgerEnabled =
|
|
479
|
+
scope === 'epic' && bus && typeof bus.emit === 'function';
|
|
480
|
+
|
|
481
|
+
const startedAt = typeof now === 'function' ? now() : Date.now();
|
|
482
|
+
if (ledgerEnabled) {
|
|
483
|
+
await bus.emit('code-review.start', { epicId: envelope.epicIdForLedger });
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
try {
|
|
487
|
+
const codeReviewConfig = config?.delivery?.codeReview ?? null;
|
|
488
|
+
const isChainConfig =
|
|
489
|
+
codeReviewConfig &&
|
|
490
|
+
Array.isArray(codeReviewConfig.providers) &&
|
|
491
|
+
codeReviewConfig.providers.length > 0;
|
|
492
|
+
const providerName = isChainConfig
|
|
493
|
+
? `chain[${codeReviewConfig.providers
|
|
494
|
+
.map((p) => p?.name ?? '?')
|
|
495
|
+
.join(',')}]`
|
|
496
|
+
: ((codeReviewConfig && typeof codeReviewConfig.provider === 'string'
|
|
497
|
+
? codeReviewConfig.provider
|
|
498
|
+
: null) ?? 'native');
|
|
499
|
+
const reviewProvider =
|
|
500
|
+
injectedReviewProvider ?? createReviewProviderFn(codeReviewConfig);
|
|
501
|
+
|
|
502
|
+
const scopeLabel = scope === 'epic' ? 'Epic' : 'Story';
|
|
503
|
+
logger?.info?.(
|
|
504
|
+
`[code-review] Running ${providerName} adapter for ${scopeLabel} #${ticketId} (${baseRef}...${headRef})...`,
|
|
505
|
+
);
|
|
506
|
+
|
|
507
|
+
const ticketLabels = Array.isArray(opts.ticketLabels)
|
|
508
|
+
? opts.ticketLabels
|
|
509
|
+
: [];
|
|
510
|
+
// Story #3876 / #3938 — resolve the review depth from BOTH the judged risk
|
|
511
|
+
// envelope's `overallLevel` and the mechanical changed-file count of the
|
|
512
|
+
// diff under review, then thread it into the provider's `runReview` input.
|
|
513
|
+
// The depth is an input-only signal: it tells the provider how thorough to
|
|
514
|
+
// be (light → standard → deep) and never touches the output envelope or the
|
|
515
|
+
// posted structured comment. The changed-file count is enumerated from the
|
|
516
|
+
// same `baseRef...headRef` diff the native provider reviews; a count that
|
|
517
|
+
// cannot be determined is the neutral "width unknown" signal that neither
|
|
518
|
+
// escalates to `deep` nor blocks `light`. The `sizing` thresholds honour
|
|
519
|
+
// the operator's `planning.taskSizing` override. Absent risk envelope +
|
|
520
|
+
// unknown width → `standard` (the neutral default), preserving the
|
|
521
|
+
// pre-change behaviour for callers that pass no risk envelope.
|
|
522
|
+
const changedFileCount =
|
|
523
|
+
typeof opts.changedFileCount === 'number'
|
|
524
|
+
? opts.changedFileCount
|
|
525
|
+
: countChangedFiles({
|
|
526
|
+
baseRef,
|
|
527
|
+
headRef,
|
|
528
|
+
gitSpawnFn: opts.gitSpawnFn,
|
|
529
|
+
});
|
|
530
|
+
const depth = resolveDepth({
|
|
531
|
+
overallLevel: opts.planningRisk?.overallLevel,
|
|
532
|
+
changedFileCount,
|
|
533
|
+
sizing: resolveTaskSizing(config),
|
|
534
|
+
});
|
|
535
|
+
const reviewInput = {
|
|
536
|
+
scope,
|
|
537
|
+
ticketId,
|
|
538
|
+
baseRef,
|
|
539
|
+
headRef,
|
|
540
|
+
labels: ticketLabels,
|
|
541
|
+
depth,
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
const findings = await reviewProvider.runReview(reviewInput);
|
|
545
|
+
|
|
546
|
+
if (!Array.isArray(findings)) {
|
|
547
|
+
throw new TypeError(
|
|
548
|
+
`[code-review] Review provider "${providerName}" returned a non-array; expected Finding[].`,
|
|
549
|
+
);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// Story #2871 — feature-detect manual-prompt providers. Legacy
|
|
553
|
+
// single-adapter providers don't carry `getPromptMessages`, so the
|
|
554
|
+
// empty-array fallback keeps the old snapshot byte-stable.
|
|
555
|
+
let promptMessages = [];
|
|
556
|
+
if (typeof reviewProvider.getPromptMessages === 'function') {
|
|
557
|
+
try {
|
|
558
|
+
const out = await reviewProvider.getPromptMessages(reviewInput);
|
|
559
|
+
promptMessages = Array.isArray(out) ? out : [];
|
|
560
|
+
} catch (err) {
|
|
561
|
+
logger?.warn?.(
|
|
562
|
+
`[code-review] getPromptMessages threw; treating as empty. ${
|
|
563
|
+
err?.message ?? err
|
|
564
|
+
}`,
|
|
565
|
+
);
|
|
566
|
+
promptMessages = [];
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const severity = countBySeverity(findings);
|
|
571
|
+
const halted = severity.critical > 0;
|
|
572
|
+
const blockerReason = halted
|
|
573
|
+
? `code-review reported ${severity.critical} critical blocker(s)`
|
|
574
|
+
: null;
|
|
575
|
+
|
|
576
|
+
const report = renderFindingsFn({
|
|
577
|
+
scope,
|
|
578
|
+
ticketId,
|
|
579
|
+
baseRef,
|
|
580
|
+
headRef,
|
|
581
|
+
findings,
|
|
582
|
+
provider: providerName,
|
|
583
|
+
promptMessages,
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
let posted = false;
|
|
587
|
+
let postedCommentId = null;
|
|
588
|
+
try {
|
|
589
|
+
const postResult = await upsertCommentFn(
|
|
590
|
+
provider,
|
|
591
|
+
commentTargetId,
|
|
592
|
+
'code-review',
|
|
593
|
+
report,
|
|
594
|
+
);
|
|
595
|
+
posted = true;
|
|
596
|
+
const rawId =
|
|
597
|
+
typeof postResult?.commentId === 'number'
|
|
598
|
+
? postResult.commentId
|
|
599
|
+
: typeof postResult?.id === 'number'
|
|
600
|
+
? postResult.id
|
|
601
|
+
: null;
|
|
602
|
+
postedCommentId = rawId;
|
|
603
|
+
logger?.info?.(
|
|
604
|
+
`[code-review] Posted structured comment to #${commentTargetId}.`,
|
|
605
|
+
);
|
|
606
|
+
} catch (err) {
|
|
607
|
+
logger?.warn?.(
|
|
608
|
+
`[code-review] Failed to upsert structured comment on #${commentTargetId}: ${err?.message ?? err}`,
|
|
609
|
+
);
|
|
610
|
+
posted = false;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
const result = {
|
|
614
|
+
status: 'ok',
|
|
615
|
+
severity,
|
|
616
|
+
report,
|
|
617
|
+
posted,
|
|
618
|
+
postedCommentId,
|
|
619
|
+
commentTargetId,
|
|
620
|
+
halted,
|
|
621
|
+
blockerReason,
|
|
622
|
+
};
|
|
623
|
+
if (ledgerEnabled) {
|
|
624
|
+
const endedAt = typeof now === 'function' ? now() : Date.now();
|
|
625
|
+
await bus.emit(
|
|
626
|
+
'code-review.end',
|
|
627
|
+
buildCodeReviewEndPayload({
|
|
628
|
+
epicId: envelope.epicIdForLedger,
|
|
629
|
+
result,
|
|
630
|
+
durationMs: Math.max(0, endedAt - startedAt),
|
|
631
|
+
}),
|
|
632
|
+
);
|
|
633
|
+
}
|
|
634
|
+
return result;
|
|
635
|
+
} catch (err) {
|
|
636
|
+
// Surface the closing boundary even on adapter throw — the ledger
|
|
637
|
+
// must always show a matched start/end pair. `status: 'invalid'`
|
|
638
|
+
// is the canonical "could not complete" value.
|
|
639
|
+
if (ledgerEnabled) {
|
|
640
|
+
const endedAt = typeof now === 'function' ? now() : Date.now();
|
|
641
|
+
await bus.emit(
|
|
642
|
+
'code-review.end',
|
|
643
|
+
buildCodeReviewEndPayload({
|
|
644
|
+
epicId: envelope.epicIdForLedger,
|
|
645
|
+
result: { status: 'invalid' },
|
|
646
|
+
durationMs: Math.max(0, endedAt - startedAt),
|
|
647
|
+
}),
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
throw err;
|
|
651
|
+
}
|
|
652
|
+
}
|