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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/retro-runner.js — In-process Retro module (sequencer).
|
|
3
|
+
*
|
|
4
|
+
* Story #1155 (Epic #1142, 5.40.0) — extracts the helper-driven
|
|
5
|
+
* `epic-retro` invocation into a callable module so the
|
|
6
|
+
* `/epic-deliver` runner can fire Phase E without a separate LLM
|
|
7
|
+
* helper turn. (Story #2259, Epic #2172: the legacy deliver-runner
|
|
8
|
+
* CLI was retired once delivery moved entirely into the slash
|
|
9
|
+
* command.) The retro fires before `/epic-deliver`'s finalize step
|
|
10
|
+
* opens the PR — the operator's PR-merge is the final human gate, not
|
|
11
|
+
* the retro itself.
|
|
12
|
+
*
|
|
13
|
+
* Story #3001 — the runner body was decomposed into `./retro/phases/`
|
|
14
|
+
* (one file per functional unit) following the established pattern at
|
|
15
|
+
* `./git-cleanup/phases/`, `./story-close/phases/`, and
|
|
16
|
+
* `./post-merge/phases/`. This file is now a thin sequencer that owns
|
|
17
|
+
* the `runRetro` entry point and re-exports the phase-level helpers so
|
|
18
|
+
* existing import sites stay unchanged.
|
|
19
|
+
*
|
|
20
|
+
* Public API:
|
|
21
|
+
* - `runRetro({ epicId, provider, logger })` → `{ posted, compact, scorecard, body }`.
|
|
22
|
+
* - `composeRetroBody(input)` (pure, exported for tests).
|
|
23
|
+
* - `gatherRetroSignals({ epicId, provider })` (exported for tests).
|
|
24
|
+
* - `appendChecksSection(body, findings)` (pure, exported for tests).
|
|
25
|
+
*
|
|
26
|
+
* Behaviour:
|
|
27
|
+
* - Reads child Stories' `story-perf-summary` comments to aggregate
|
|
28
|
+
* `frictionByCategory` totals (Story #1046 unified-summary path).
|
|
29
|
+
* - Reads child Stories' label sets to count HITL pause events
|
|
30
|
+
* (`agent::blocked`).
|
|
31
|
+
* - Reads the Epic's `parked-follow-ons` structured comment for the
|
|
32
|
+
* parked + recut counts (with a fallback to per-Story body grep on the
|
|
33
|
+
* `<!-- recut-of: #N -->` marker).
|
|
34
|
+
* - Selects the compact (clean-manifest) or full retro shape via
|
|
35
|
+
* `isCleanManifest`.
|
|
36
|
+
* - Posts the composed markdown as a `retro` structured comment on the
|
|
37
|
+
* Epic, terminated with the `retro-complete: <ISO>` HTML marker.
|
|
38
|
+
* - **Never** routes through `notify.js` — GitHub is the sole retro
|
|
39
|
+
* archive; the webhook must not see the retro body.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import nodeFs from 'node:fs';
|
|
43
|
+
|
|
44
|
+
import { runChecks } from '../checks/index.js';
|
|
45
|
+
import { assembleState } from '../checks/state.js';
|
|
46
|
+
import { composeRetroBody } from './retro/phases/compose-body.js';
|
|
47
|
+
import { gatherRetroSignals } from './retro/phases/gather-signals.js';
|
|
48
|
+
import { composeAndPostRetro } from './retro/phases/post-and-mirror.js';
|
|
49
|
+
import { upsertStructuredComment } from './ticketing.js';
|
|
50
|
+
|
|
51
|
+
// Re-export phase-level helpers so existing import sites stay unchanged.
|
|
52
|
+
export { appendChecksSection } from './retro/phases/checks.js';
|
|
53
|
+
export { composeRetroBody } from './retro/phases/compose-body.js';
|
|
54
|
+
export { gatherRetroSignals } from './retro/phases/gather-signals.js';
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Public: compose and post the retro structured comment on the Epic.
|
|
58
|
+
*
|
|
59
|
+
* Story #1290 (Epic #1143) — at /epic-deliver Phase 5, the runner invokes
|
|
60
|
+
* the self-healing checks registry with `scope: 'retro'` and
|
|
61
|
+
* `autoFix: false`. The retro is **read-only by construction**: the
|
|
62
|
+
* registry runner enforces the invariant by throwing if any caller flips
|
|
63
|
+
* `autoFix: true` under `scope: 'retro'`. Findings are appended to the
|
|
64
|
+
* retro body via `appendChecksSection`, which suppresses the section when
|
|
65
|
+
* findings are empty so the compact "🟢 Clean sprint" shape is preserved.
|
|
66
|
+
*
|
|
67
|
+
* Story #2252 — when `opts.bus` is supplied the runner emits
|
|
68
|
+
* `retro.start` immediately on entry and `retro.end` immediately before
|
|
69
|
+
* returning the envelope. On throw the helper emits `retro.end` with
|
|
70
|
+
* `posted: false` before re-throwing so the ledger always carries the
|
|
71
|
+
* closing boundary.
|
|
72
|
+
*
|
|
73
|
+
* @param {{
|
|
74
|
+
* epicId: number,
|
|
75
|
+
* provider: object,
|
|
76
|
+
* logger?: { info?: Function, warn?: Function },
|
|
77
|
+
* forceFull?: boolean,
|
|
78
|
+
* timestamp?: string,
|
|
79
|
+
* bus?: object|null,
|
|
80
|
+
* now?: () => number,
|
|
81
|
+
* manualInterventions?: number,
|
|
82
|
+
* gatherFn?: typeof gatherRetroSignals,
|
|
83
|
+
* composeFn?: typeof composeRetroBody,
|
|
84
|
+
* upsertFn?: typeof upsertStructuredComment,
|
|
85
|
+
* runChecksFn?: typeof runChecks,
|
|
86
|
+
* assembleStateFn?: typeof assembleState,
|
|
87
|
+
* cwd?: string,
|
|
88
|
+
* }} opts
|
|
89
|
+
* @returns {Promise<{
|
|
90
|
+
* posted: boolean,
|
|
91
|
+
* compact: boolean,
|
|
92
|
+
* scorecard: object,
|
|
93
|
+
* body: string,
|
|
94
|
+
* findings: object[],
|
|
95
|
+
* commentId?: number,
|
|
96
|
+
* }>}
|
|
97
|
+
*/
|
|
98
|
+
export async function runRetro(opts = {}) {
|
|
99
|
+
const {
|
|
100
|
+
epicId,
|
|
101
|
+
provider,
|
|
102
|
+
logger,
|
|
103
|
+
forceFull = false,
|
|
104
|
+
timestamp,
|
|
105
|
+
bus,
|
|
106
|
+
now = Date.now,
|
|
107
|
+
manualInterventions = 0,
|
|
108
|
+
gatherFn = gatherRetroSignals,
|
|
109
|
+
composeFn = composeRetroBody,
|
|
110
|
+
upsertFn = upsertStructuredComment,
|
|
111
|
+
runChecksFn = runChecks,
|
|
112
|
+
assembleStateFn = assembleState,
|
|
113
|
+
cwd,
|
|
114
|
+
fsImpl = nodeFs,
|
|
115
|
+
perfThresholds = null,
|
|
116
|
+
} = opts;
|
|
117
|
+
|
|
118
|
+
if (!Number.isInteger(epicId) || epicId <= 0) {
|
|
119
|
+
throw new TypeError('runRetro: epicId is required (positive integer).');
|
|
120
|
+
}
|
|
121
|
+
if (!provider) {
|
|
122
|
+
throw new TypeError('runRetro: provider is required.');
|
|
123
|
+
}
|
|
124
|
+
// Epic #2646 Story C (Task #2700) — `bus` is now a hard input. The
|
|
125
|
+
// previous guarded `emitLifecycleSafe` helper that tolerated a null
|
|
126
|
+
// bus is gone.
|
|
127
|
+
if (!bus || typeof bus.emit !== 'function') {
|
|
128
|
+
throw new TypeError('runRetro: bus is required (object with emit()).');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
logger?.info?.(`[retro-runner] Composing retro for Epic #${epicId}...`);
|
|
132
|
+
const startedAt = typeof now === 'function' ? now() : Date.now();
|
|
133
|
+
await bus.emit('retro.start', { epicId });
|
|
134
|
+
let retroPathWritten = null;
|
|
135
|
+
try {
|
|
136
|
+
return await composeAndPostRetro({
|
|
137
|
+
epicId,
|
|
138
|
+
provider,
|
|
139
|
+
logger,
|
|
140
|
+
forceFull,
|
|
141
|
+
timestamp,
|
|
142
|
+
bus,
|
|
143
|
+
now,
|
|
144
|
+
manualInterventions,
|
|
145
|
+
gatherFn,
|
|
146
|
+
composeFn,
|
|
147
|
+
upsertFn,
|
|
148
|
+
runChecksFn,
|
|
149
|
+
assembleStateFn,
|
|
150
|
+
cwd,
|
|
151
|
+
fsImpl,
|
|
152
|
+
startedAt,
|
|
153
|
+
perfThresholds,
|
|
154
|
+
onMirrorWritten: (p) => {
|
|
155
|
+
retroPathWritten = p;
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
} catch (err) {
|
|
159
|
+
// Surface the closing boundary even on throw — the ledger must
|
|
160
|
+
// always show a matched start/end pair.
|
|
161
|
+
const endedAt = typeof now === 'function' ? now() : Date.now();
|
|
162
|
+
const payload = {
|
|
163
|
+
epicId,
|
|
164
|
+
posted: false,
|
|
165
|
+
durationMs: Math.max(0, Math.floor(endedAt - startedAt)),
|
|
166
|
+
};
|
|
167
|
+
if (retroPathWritten) payload.retroPath = retroPathWritten;
|
|
168
|
+
await bus.emit('retro.end', payload);
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/orchestration/review-depth.js — Shared review-depth resolver combining
|
|
3
|
+
* judged risk and mechanical diff width (Story #3938).
|
|
4
|
+
*
|
|
5
|
+
* The single depth authority for the code-review pipeline. It folds the two
|
|
6
|
+
* signals the framework already computes — the planner-judged risk
|
|
7
|
+
* (`planningRisk.overallLevel`) and the mechanical changed-file count of the
|
|
8
|
+
* diff under review — into one tier (`light` / `standard` / `deep`) without
|
|
9
|
+
* inventing a new complexity score or any new config knob.
|
|
10
|
+
*
|
|
11
|
+
* Tier rules:
|
|
12
|
+
* - `deep` — `overallLevel === 'high'` OR the changed-file count exceeds
|
|
13
|
+
* the wide-change scale (`sizing.hardFiles`). A wide-footprint
|
|
14
|
+
* Epic whose risk was judged low (or never judged) still earns
|
|
15
|
+
* a deep pass on size alone.
|
|
16
|
+
* - `light` — `overallLevel === 'low'` AND the changed-file count is at or
|
|
17
|
+
* below the small-change scale (`sizing.softFiles`). An
|
|
18
|
+
* *unknown* count does NOT block `light`: a missing diff width
|
|
19
|
+
* is treated as "not wide", so a low-risk Epic with no count
|
|
20
|
+
* still resolves to `light` (preserves the #3937 producer
|
|
21
|
+
* contract where depth is resolved from risk before any diff
|
|
22
|
+
* is enumerated).
|
|
23
|
+
* - `standard` — everything else, including absent/malformed risk envelopes
|
|
24
|
+
* and a `medium` level. Fail toward the middle, never toward
|
|
25
|
+
* `light`: an Epic that skipped `/epic-plan` has no risk
|
|
26
|
+
* verdict, and treating it as `light` would under-review
|
|
27
|
+
* unjudged work while `standard` preserves today's behaviour.
|
|
28
|
+
*
|
|
29
|
+
* Pure and total: inputs in, tier out. No I/O, no throws. `null` / `undefined`
|
|
30
|
+
* / malformed inputs all degrade to `standard` (or `deep`/`light` only when the
|
|
31
|
+
* width signal unambiguously says so). Callers (e.g. `runCodeReview`) enumerate
|
|
32
|
+
* the changed-file count from the diff they already run and supply it here, and
|
|
33
|
+
* pass the operator's `planning.taskSizing` override as `sizing` so retuning
|
|
34
|
+
* sizing retunes the depth thresholds in lockstep with the ticket validator.
|
|
35
|
+
*
|
|
36
|
+
* @typedef {'light'|'standard'|'deep'} ReviewDepth
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import { DEFAULT_TASK_SIZING } from './ticket-validator-sizing.js';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Coerce an arbitrary input into a non-negative integer changed-file count, or
|
|
43
|
+
* `null` when the count is unknown / unusable. A `null` count is the neutral
|
|
44
|
+
* "width unknown" signal: it neither triggers `deep` nor blocks `light`.
|
|
45
|
+
*
|
|
46
|
+
* @param {unknown} value
|
|
47
|
+
* @returns {number|null}
|
|
48
|
+
*/
|
|
49
|
+
function normalizeChangedFileCount(value) {
|
|
50
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return Math.floor(value);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the review depth for a change set from its judged risk and diff
|
|
58
|
+
* width. See the module header for the tier rules.
|
|
59
|
+
*
|
|
60
|
+
* @param {{
|
|
61
|
+
* overallLevel?: ('low'|'medium'|'high'|string|null|undefined),
|
|
62
|
+
* changedFileCount?: (number|null|undefined),
|
|
63
|
+
* sizing?: { softFiles?: number, hardFiles?: number }|null,
|
|
64
|
+
* }} [input]
|
|
65
|
+
* @returns {ReviewDepth}
|
|
66
|
+
*/
|
|
67
|
+
export function resolveDepth(input = {}) {
|
|
68
|
+
const overallLevel =
|
|
69
|
+
input && typeof input === 'object' ? input.overallLevel : undefined;
|
|
70
|
+
const changedFileCount =
|
|
71
|
+
input && typeof input === 'object'
|
|
72
|
+
? normalizeChangedFileCount(input.changedFileCount)
|
|
73
|
+
: null;
|
|
74
|
+
|
|
75
|
+
const mergedSizing = {
|
|
76
|
+
...DEFAULT_TASK_SIZING,
|
|
77
|
+
...(input && typeof input === 'object' && input.sizing ? input.sizing : {}),
|
|
78
|
+
};
|
|
79
|
+
const { softFiles, hardFiles } = mergedSizing;
|
|
80
|
+
|
|
81
|
+
// A known count strictly above the wide-change scale is wide.
|
|
82
|
+
const isWide = changedFileCount !== null && changedFileCount > hardFiles;
|
|
83
|
+
// An unknown count is treated as "not wide" — it does not block `light`.
|
|
84
|
+
const isSmall = changedFileCount === null || changedFileCount <= softFiles;
|
|
85
|
+
|
|
86
|
+
// deep — high judged risk OR a wide diff.
|
|
87
|
+
if (overallLevel === 'high' || isWide) return 'deep';
|
|
88
|
+
// light — low judged risk AND a (known-or-unknown-but-not-wide) small diff.
|
|
89
|
+
if (overallLevel === 'low' && isSmall) return 'light';
|
|
90
|
+
// standard — everything else (medium, absent/malformed level, or a low-risk
|
|
91
|
+
// diff whose width is between softFiles and hardFiles).
|
|
92
|
+
return 'standard';
|
|
93
|
+
}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-providers/codex.js — Codex ReviewProvider adapter.
|
|
3
|
+
*
|
|
4
|
+
* Story #2830 (Epic #2815) — wires the
|
|
5
|
+
* [`openai/codex-plugin-cc`](https://github.com/openai/codex-plugin-cc)
|
|
6
|
+
* Claude Code plugin's `/codex:review` slash command into the
|
|
7
|
+
* pluggable ReviewProvider contract.
|
|
8
|
+
*
|
|
9
|
+
* Two halves shipped under one Story:
|
|
10
|
+
* - Task #2834 — schema enum + factory registration + hard-fail
|
|
11
|
+
* probe (this file's `createCodexProvider` + `*ForRegistry`).
|
|
12
|
+
* - Task #2836 — `runReview()` invokes `/codex:review --base <ref>
|
|
13
|
+
* --wait` through an injectable runner and parses the response
|
|
14
|
+
* into `Finding[]`, mapping the Codex severity vocabulary onto
|
|
15
|
+
* the canonical `critical|high|medium|suggestion` enum.
|
|
16
|
+
*
|
|
17
|
+
* The factory NEVER silently falls back to the native provider when
|
|
18
|
+
* `provider: codex` is configured. Operators who want native MUST set
|
|
19
|
+
* `provider: native` explicitly; the probe is the only thing that
|
|
20
|
+
* routes between "configured backend present" and "configured backend
|
|
21
|
+
* missing". The adapter never consults a GitHub provider — the
|
|
22
|
+
* orchestrator owns posting/upserting and the lifecycle bus.
|
|
23
|
+
*
|
|
24
|
+
* @typedef {import('./types.js').Finding} Finding
|
|
25
|
+
* @typedef {import('./types.js').ReviewInput} ReviewInput
|
|
26
|
+
* @typedef {import('./types.js').ReviewProvider} ReviewProvider
|
|
27
|
+
* @typedef {import('./types.js').Severity} Severity
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { spawnSync } from 'node:child_process';
|
|
31
|
+
import fs from 'node:fs';
|
|
32
|
+
import os from 'node:os';
|
|
33
|
+
import path from 'node:path';
|
|
34
|
+
import { renderDepthDirective } from './review-depth.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Canonical install/remediation guidance baked into every probe failure.
|
|
38
|
+
* Exported so tests (and any future error-renderer) can assert against
|
|
39
|
+
* the exact remediations rather than free-text matching.
|
|
40
|
+
*/
|
|
41
|
+
export const CODEX_REMEDIATIONS = Object.freeze({
|
|
42
|
+
install:
|
|
43
|
+
'Install the Codex plugin (https://github.com/openai/codex-plugin-cc) ' +
|
|
44
|
+
'so the host registers the `/codex:review` slash command.',
|
|
45
|
+
fallback:
|
|
46
|
+
'Or set `codeReview.provider` to "native" in .agentrc.json to use the ' +
|
|
47
|
+
'in-process maintainability/lint provider instead.',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Default Codex plugin marker locations searched by the probe. The
|
|
52
|
+
* Claude Code plugin manager (and its `claude plugin install` flow)
|
|
53
|
+
* unpacks plugins under one of these roots; presence of the
|
|
54
|
+
* `codex-plugin-cc` directory is treated as "the slash command is
|
|
55
|
+
* registered on the host".
|
|
56
|
+
*
|
|
57
|
+
* Exported so tests can extend the list without monkey-patching `os`.
|
|
58
|
+
*/
|
|
59
|
+
export const DEFAULT_PLUGIN_MARKERS = Object.freeze([
|
|
60
|
+
path.join(os.homedir(), '.claude', 'plugins', 'codex-plugin-cc'),
|
|
61
|
+
path.join(os.homedir(), '.claude', 'plugins', 'openai', 'codex-plugin-cc'),
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Default probe: returns true when any marker path exists on disk.
|
|
66
|
+
*
|
|
67
|
+
* The probe is intentionally cheap and synchronous — the factory runs
|
|
68
|
+
* it at construction time and the worst case (plugin absent) MUST
|
|
69
|
+
* surface immediately so the operator sees the remediation, not a
|
|
70
|
+
* deferred runtime failure during the first review run.
|
|
71
|
+
*
|
|
72
|
+
* @param {{ markers?: readonly string[], existsFn?: (p: string) => boolean }} [opts]
|
|
73
|
+
* @returns {boolean}
|
|
74
|
+
*/
|
|
75
|
+
export function defaultProbeCodexCommand(opts = {}) {
|
|
76
|
+
const markers = opts.markers ?? DEFAULT_PLUGIN_MARKERS;
|
|
77
|
+
const existsFn = opts.existsFn ?? fs.existsSync;
|
|
78
|
+
for (const marker of markers) {
|
|
79
|
+
try {
|
|
80
|
+
if (existsFn(marker)) return true;
|
|
81
|
+
} catch (_err) {
|
|
82
|
+
// Treat I/O errors as "absent" — the factory throws with the
|
|
83
|
+
// remediation message, and the operator can inspect the path.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Build the hard-fail Error thrown when the probe reports the
|
|
91
|
+
* `/codex:review` command is absent. Exported so the registry entry
|
|
92
|
+
* and tests use the same message shape.
|
|
93
|
+
*
|
|
94
|
+
* @returns {Error}
|
|
95
|
+
*/
|
|
96
|
+
export function buildCodexUnavailableError() {
|
|
97
|
+
return new Error(
|
|
98
|
+
'[ReviewProviderFactory] codeReview.provider is set to "codex" but the ' +
|
|
99
|
+
'`/codex:review` slash command is not registered on this host. ' +
|
|
100
|
+
`${CODEX_REMEDIATIONS.install} ${CODEX_REMEDIATIONS.fallback}`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Canonical severity table. Maps every Codex severity vocabulary
|
|
106
|
+
* token (case-insensitive) onto the canonical ReviewProvider
|
|
107
|
+
* `Severity` enum. The table is intentionally explicit — drop-through
|
|
108
|
+
* to `'suggestion'` is reserved for tokens the table does NOT name.
|
|
109
|
+
*
|
|
110
|
+
* Exported so unit tests can drive a table-driven assertion across
|
|
111
|
+
* every documented Codex severity without re-listing the mapping
|
|
112
|
+
* inside the test file.
|
|
113
|
+
*
|
|
114
|
+
* @type {Readonly<Record<string, Severity>>}
|
|
115
|
+
*/
|
|
116
|
+
export const CODEX_SEVERITY_MAP = Object.freeze({
|
|
117
|
+
// Codex "blocker" terminology → canonical critical (halts the
|
|
118
|
+
// review with an unresolved-finding gate).
|
|
119
|
+
blocker: 'critical',
|
|
120
|
+
critical: 'critical',
|
|
121
|
+
fatal: 'critical',
|
|
122
|
+
// Codex "major" terminology → canonical high (lint-error
|
|
123
|
+
// equivalent; non-halting but must be addressed before merge).
|
|
124
|
+
major: 'high',
|
|
125
|
+
high: 'high',
|
|
126
|
+
error: 'high',
|
|
127
|
+
// Codex "minor" terminology → canonical medium (size/volume
|
|
128
|
+
// warning equivalent; flagged but not gating).
|
|
129
|
+
minor: 'medium',
|
|
130
|
+
medium: 'medium',
|
|
131
|
+
warning: 'medium',
|
|
132
|
+
// Codex "info" / "nit" / "style" → canonical suggestion
|
|
133
|
+
// (advisory only, no gate).
|
|
134
|
+
info: 'suggestion',
|
|
135
|
+
nit: 'suggestion',
|
|
136
|
+
style: 'suggestion',
|
|
137
|
+
suggestion: 'suggestion',
|
|
138
|
+
note: 'suggestion',
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Map a single Codex severity string onto the canonical enum.
|
|
143
|
+
*
|
|
144
|
+
* @param {unknown} raw
|
|
145
|
+
* @returns {Severity}
|
|
146
|
+
*/
|
|
147
|
+
export function mapCodexSeverity(raw) {
|
|
148
|
+
if (typeof raw !== 'string') return 'suggestion';
|
|
149
|
+
const key = raw.trim().toLowerCase();
|
|
150
|
+
return CODEX_SEVERITY_MAP[key] ?? 'suggestion';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Parse the raw `/codex:review` stdout into `Finding[]`.
|
|
155
|
+
*
|
|
156
|
+
* The plugin emits JSON; the adapter is liberal in what it accepts:
|
|
157
|
+
* - A bare array of finding objects.
|
|
158
|
+
* - An object with a `findings` array.
|
|
159
|
+
* - Either shape wrapped in an outer envelope with a `result` or
|
|
160
|
+
* `data` key (covers minor wire-format drift across plugin
|
|
161
|
+
* versions without re-shimming).
|
|
162
|
+
*
|
|
163
|
+
* Each entry's severity is funnelled through `mapCodexSeverity` so
|
|
164
|
+
* the canonical enum is the only thing that reaches the renderer.
|
|
165
|
+
* Entries without a `title` or `body` are skipped — the orchestrator
|
|
166
|
+
* cannot post an empty finding, and silently dropping the entry is
|
|
167
|
+
* safer than fabricating one.
|
|
168
|
+
*
|
|
169
|
+
* Exported for testing.
|
|
170
|
+
*
|
|
171
|
+
* @param {string} rawStdout
|
|
172
|
+
* @returns {Finding[]}
|
|
173
|
+
* @throws {Error} when stdout is not parseable JSON.
|
|
174
|
+
*/
|
|
175
|
+
export function parseCodexFindings(rawStdout) {
|
|
176
|
+
const text = (rawStdout ?? '').trim();
|
|
177
|
+
if (text.length === 0) return [];
|
|
178
|
+
|
|
179
|
+
let parsed;
|
|
180
|
+
try {
|
|
181
|
+
parsed = JSON.parse(text);
|
|
182
|
+
} catch (err) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
`[codex-review] Failed to parse /codex:review stdout as JSON: ${
|
|
185
|
+
err?.message ?? err
|
|
186
|
+
}`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Unwrap a single layer of envelope when present.
|
|
191
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
192
|
+
if (Array.isArray(parsed.findings)) parsed = parsed.findings;
|
|
193
|
+
else if (parsed.result !== undefined) parsed = parsed.result;
|
|
194
|
+
else if (parsed.data !== undefined) parsed = parsed.data;
|
|
195
|
+
}
|
|
196
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
197
|
+
if (Array.isArray(parsed.findings)) parsed = parsed.findings;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (!Array.isArray(parsed)) return [];
|
|
201
|
+
|
|
202
|
+
/** @type {Finding[]} */
|
|
203
|
+
const findings = [];
|
|
204
|
+
for (const entry of parsed) {
|
|
205
|
+
if (!entry || typeof entry !== 'object') continue;
|
|
206
|
+
const title =
|
|
207
|
+
typeof entry.title === 'string' && entry.title.trim().length > 0
|
|
208
|
+
? entry.title.trim()
|
|
209
|
+
: null;
|
|
210
|
+
const body =
|
|
211
|
+
typeof entry.body === 'string' && entry.body.trim().length > 0
|
|
212
|
+
? entry.body
|
|
213
|
+
: typeof entry.message === 'string' && entry.message.trim().length > 0
|
|
214
|
+
? entry.message
|
|
215
|
+
: null;
|
|
216
|
+
if (!title || !body) continue;
|
|
217
|
+
|
|
218
|
+
/** @type {Finding} */
|
|
219
|
+
const finding = {
|
|
220
|
+
severity: mapCodexSeverity(entry.severity),
|
|
221
|
+
title,
|
|
222
|
+
body,
|
|
223
|
+
};
|
|
224
|
+
if (typeof entry.file === 'string' && entry.file.length > 0) {
|
|
225
|
+
finding.file = entry.file;
|
|
226
|
+
}
|
|
227
|
+
if (Number.isInteger(entry.line) && entry.line > 0) {
|
|
228
|
+
finding.line = entry.line;
|
|
229
|
+
}
|
|
230
|
+
if (typeof entry.category === 'string' && entry.category.length > 0) {
|
|
231
|
+
finding.category = entry.category;
|
|
232
|
+
}
|
|
233
|
+
findings.push(finding);
|
|
234
|
+
}
|
|
235
|
+
return findings;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Build the `claude --print` prompt that invokes the `/codex:review` slash
|
|
240
|
+
* command for a review input. The risk-derived `depth` lever (Story #3937) is
|
|
241
|
+
* appended via `renderDepthDirective` so a high-risk Epic instructs Codex
|
|
242
|
+
* toward a deeper second-pass review while a low-risk one keeps it light; an
|
|
243
|
+
* absent depth renders the `standard` directive. The `/codex:review` slash
|
|
244
|
+
* command and its `--wait` flag are unchanged — the directive rides as
|
|
245
|
+
* trailing prompt prose the plugin's wrapping model reads.
|
|
246
|
+
*
|
|
247
|
+
* Pure. Exported for testing.
|
|
248
|
+
*
|
|
249
|
+
* @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
|
|
250
|
+
* @returns {string}
|
|
251
|
+
*/
|
|
252
|
+
export function buildCodexReviewPrompt({ baseRef, headRef, depth }) {
|
|
253
|
+
return (
|
|
254
|
+
`/codex:review --base ${baseRef} --head ${headRef} --wait ` +
|
|
255
|
+
`${renderDepthDirective(depth)}`
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Default invoker: shell out to the host's `claude` CLI to run the
|
|
261
|
+
* `/codex:review` slash command. The plugin is expected to print a
|
|
262
|
+
* JSON document to stdout when `--wait` is passed; non-zero exits
|
|
263
|
+
* propagate as an Error so the orchestrator records the run as
|
|
264
|
+
* `status=invalid` rather than burying the failure.
|
|
265
|
+
*
|
|
266
|
+
* Exported for testing — the production adapter accepts an
|
|
267
|
+
* `invokeFn` override so tests never spawn a real process.
|
|
268
|
+
*
|
|
269
|
+
* @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
|
|
270
|
+
* @returns {{ status: number, stdout: string, stderr: string }}
|
|
271
|
+
*/
|
|
272
|
+
export function defaultInvokeCodexReview({ baseRef, headRef, depth }) {
|
|
273
|
+
const cliArgs = [
|
|
274
|
+
'--print',
|
|
275
|
+
buildCodexReviewPrompt({ baseRef, headRef, depth }),
|
|
276
|
+
];
|
|
277
|
+
const result = spawnSync('claude', cliArgs, {
|
|
278
|
+
encoding: 'utf-8',
|
|
279
|
+
shell: process.platform === 'win32',
|
|
280
|
+
});
|
|
281
|
+
return {
|
|
282
|
+
status: result.status ?? 1,
|
|
283
|
+
stdout: result.stdout ?? '',
|
|
284
|
+
stderr: result.stderr ?? '',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Build a `ReviewProvider` instance backed by the Codex plugin.
|
|
290
|
+
*
|
|
291
|
+
* The `deps` overload is the test seam — production callers (the
|
|
292
|
+
* factory) invoke `createCodexProvider()` with no arguments and get
|
|
293
|
+
* the default dependency chain (probe via plugin marker, invoker via
|
|
294
|
+
* the `claude` CLI). Tests inject `probeFn` (to bypass the marker
|
|
295
|
+
* check) and `invokeFn` (to return canned stdout).
|
|
296
|
+
*
|
|
297
|
+
* @param {{
|
|
298
|
+
* probeFn?: () => boolean,
|
|
299
|
+
* invokeFn?: (args: { baseRef: string, headRef: string, scope: string, ticketId: number, depth?: import('./types.js').ReviewDepth }) => { status: number, stdout: string, stderr: string },
|
|
300
|
+
* logger?: { info?: Function, warn?: Function, error?: Function },
|
|
301
|
+
* }} [deps]
|
|
302
|
+
* @returns {ReviewProvider}
|
|
303
|
+
*/
|
|
304
|
+
export function createCodexProvider(deps = {}) {
|
|
305
|
+
const probeFn = deps.probeFn ?? defaultProbeCodexCommand;
|
|
306
|
+
if (!probeFn()) {
|
|
307
|
+
throw buildCodexUnavailableError();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const invokeFn = deps.invokeFn ?? defaultInvokeCodexReview;
|
|
311
|
+
const logger = deps.logger;
|
|
312
|
+
|
|
313
|
+
return {
|
|
314
|
+
/**
|
|
315
|
+
* @param {ReviewInput} input
|
|
316
|
+
* @returns {Promise<Finding[]>}
|
|
317
|
+
*/
|
|
318
|
+
async runReview(input) {
|
|
319
|
+
const { scope, ticketId, baseRef, headRef, depth } = input ?? {};
|
|
320
|
+
if (!baseRef || !headRef) {
|
|
321
|
+
throw new TypeError(
|
|
322
|
+
'[codex-review] runReview requires baseRef and headRef.',
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
if (!Number.isInteger(ticketId) || ticketId <= 0) {
|
|
326
|
+
throw new TypeError(
|
|
327
|
+
'[codex-review] runReview requires a positive integer ticketId.',
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
logger?.info?.(
|
|
332
|
+
`[codex-review] Invoking /codex:review --base ${baseRef} --head ${headRef} ` +
|
|
333
|
+
`for ${scope} #${ticketId}...`,
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
const result = invokeFn({ baseRef, headRef, scope, ticketId, depth });
|
|
337
|
+
if (result.status !== 0) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
`[codex-review] /codex:review exited with status ${result.status}: ${
|
|
340
|
+
result.stderr || result.stdout || '<no output>'
|
|
341
|
+
}`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const findings = parseCodexFindings(result.stdout);
|
|
346
|
+
logger?.info?.(
|
|
347
|
+
`[codex-review] Parsed ${findings.length} finding(s) from /codex:review.`,
|
|
348
|
+
);
|
|
349
|
+
return findings;
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Zero-arg factory entry point used by the `review-provider-factory`
|
|
356
|
+
* registry. Mirrors `createNativeProviderForRegistry` so the registry
|
|
357
|
+
* signature stays `() => ReviewProvider`.
|
|
358
|
+
*
|
|
359
|
+
* @returns {ReviewProvider}
|
|
360
|
+
*/
|
|
361
|
+
export function createCodexProviderForRegistry() {
|
|
362
|
+
return createCodexProvider();
|
|
363
|
+
}
|