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,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-providers/security-review.js — Inline ReviewProvider that
|
|
3
|
+
* invokes Anthropic's built-in `/security-review` Claude Code skill.
|
|
4
|
+
*
|
|
5
|
+
* Story #2871 — extends the pluggable Code Review chain (Epic #2815)
|
|
6
|
+
* to surface security-specific findings before a Story or Epic
|
|
7
|
+
* merges. The adapter shells out to the host's `claude` CLI with a
|
|
8
|
+
* prompt that wraps `/security-review` and asks for JSON-shaped
|
|
9
|
+
* findings on stdout, then maps each entry onto the canonical
|
|
10
|
+
* `Finding[]` contract so the existing `runCodeReview()` halting
|
|
11
|
+
* gate ("any critical → halted: true") applies without a parallel
|
|
12
|
+
* code path.
|
|
13
|
+
*
|
|
14
|
+
* Probe semantics: the provider checks for a `claude` binary on
|
|
15
|
+
* PATH at construction. When absent, the constructor throws a
|
|
16
|
+
* descriptive Error. The chain treats a constructor throw as a
|
|
17
|
+
* skip when the entry was declared `optional: true` (the canonical
|
|
18
|
+
* choice for `security-review` on non-Claude hosts), and as a
|
|
19
|
+
* hard-fail when not.
|
|
20
|
+
*
|
|
21
|
+
* Output parsing is liberal: the provider accepts (a) a bare JSON
|
|
22
|
+
* array, (b) `{findings: [...]}`, or (c) either shape wrapped in a
|
|
23
|
+
* `result`/`data` envelope. Free-text output that does not parse as
|
|
24
|
+
* JSON collapses to a single advisory `suggestion` finding pointing
|
|
25
|
+
* the operator at the manual command — the chain still runs, but
|
|
26
|
+
* the security signal is downgraded honestly rather than dropped.
|
|
27
|
+
*
|
|
28
|
+
* @typedef {import('./types.js').Finding} Finding
|
|
29
|
+
* @typedef {import('./types.js').ReviewInput} ReviewInput
|
|
30
|
+
* @typedef {import('./types.js').ReviewProvider} ReviewProvider
|
|
31
|
+
* @typedef {import('./types.js').Severity} Severity
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { spawnSync } from 'node:child_process';
|
|
35
|
+
import { renderDepthDirective } from './review-depth.js';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Canonical install/remediation guidance baked into every probe
|
|
39
|
+
* failure. Exported so tests assert against the exact strings.
|
|
40
|
+
*/
|
|
41
|
+
export const SECURITY_REVIEW_REMEDIATIONS = Object.freeze({
|
|
42
|
+
install:
|
|
43
|
+
'Install the Claude Code CLI (https://docs.anthropic.com/en/docs/claude-code) ' +
|
|
44
|
+
'so the host registers the `/security-review` built-in skill.',
|
|
45
|
+
fallback:
|
|
46
|
+
'Or mark this provider entry as `optional: true` in .agentrc.json so ' +
|
|
47
|
+
'the chain skips it on hosts without the skill.',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Default probe: returns true when `claude --version` exits cleanly.
|
|
52
|
+
* Synchronous + cheap; the worst case (claude absent) MUST surface
|
|
53
|
+
* at factory construction time so the operator sees the remediation
|
|
54
|
+
* before the first review run.
|
|
55
|
+
*
|
|
56
|
+
* Exported for testing — tests inject a stub `probeFn` to bypass.
|
|
57
|
+
*
|
|
58
|
+
* @param {{ spawnFn?: typeof spawnSync }} [opts]
|
|
59
|
+
* @returns {boolean}
|
|
60
|
+
*/
|
|
61
|
+
export function defaultProbeClaudeCli(opts = {}) {
|
|
62
|
+
const spawnFn = opts.spawnFn ?? spawnSync;
|
|
63
|
+
try {
|
|
64
|
+
const result = spawnFn('claude', ['--version'], {
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
shell: process.platform === 'win32',
|
|
67
|
+
timeout: 5000,
|
|
68
|
+
});
|
|
69
|
+
return (result?.status ?? 1) === 0;
|
|
70
|
+
} catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Build the hard-fail Error thrown when the probe reports the
|
|
77
|
+
* `claude` CLI is absent. Exported so the registry entry and tests
|
|
78
|
+
* share one message shape.
|
|
79
|
+
*
|
|
80
|
+
* @returns {Error}
|
|
81
|
+
*/
|
|
82
|
+
export function buildSecurityReviewUnavailableError() {
|
|
83
|
+
return new Error(
|
|
84
|
+
'[ReviewProviderFactory] codeReview provider "security-review" requires ' +
|
|
85
|
+
'the `claude` CLI on PATH but it was not detected. ' +
|
|
86
|
+
`${SECURITY_REVIEW_REMEDIATIONS.install} ${SECURITY_REVIEW_REMEDIATIONS.fallback}`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Severity vocabulary mapping. Mirrors `CODEX_SEVERITY_MAP` so
|
|
92
|
+
* operators see a consistent severity-tier vocabulary regardless of
|
|
93
|
+
* which adapter produced the finding.
|
|
94
|
+
*
|
|
95
|
+
* @type {Readonly<Record<string, Severity>>}
|
|
96
|
+
*/
|
|
97
|
+
export const SECURITY_REVIEW_SEVERITY_MAP = Object.freeze({
|
|
98
|
+
blocker: 'critical',
|
|
99
|
+
critical: 'critical',
|
|
100
|
+
fatal: 'critical',
|
|
101
|
+
major: 'high',
|
|
102
|
+
high: 'high',
|
|
103
|
+
error: 'high',
|
|
104
|
+
minor: 'medium',
|
|
105
|
+
medium: 'medium',
|
|
106
|
+
warning: 'medium',
|
|
107
|
+
info: 'suggestion',
|
|
108
|
+
nit: 'suggestion',
|
|
109
|
+
style: 'suggestion',
|
|
110
|
+
suggestion: 'suggestion',
|
|
111
|
+
note: 'suggestion',
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Map a single security-review severity string onto the canonical
|
|
116
|
+
* enum. Unknown / missing values collapse to `'suggestion'`.
|
|
117
|
+
*
|
|
118
|
+
* @param {unknown} raw
|
|
119
|
+
* @returns {Severity}
|
|
120
|
+
*/
|
|
121
|
+
export function mapSecurityReviewSeverity(raw) {
|
|
122
|
+
if (typeof raw !== 'string') return 'suggestion';
|
|
123
|
+
const key = raw.trim().toLowerCase();
|
|
124
|
+
return SECURITY_REVIEW_SEVERITY_MAP[key] ?? 'suggestion';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Parse `/security-review` JSON output into `Finding[]`. Liberal:
|
|
129
|
+
* accepts a bare array, `{findings: [...]}`, or either shape
|
|
130
|
+
* wrapped in a `result`/`data` envelope. Free-text output that
|
|
131
|
+
* fails to parse throws — the caller decides whether to fall back
|
|
132
|
+
* to a single advisory finding.
|
|
133
|
+
*
|
|
134
|
+
* Exported for testing.
|
|
135
|
+
*
|
|
136
|
+
* @param {string} rawStdout
|
|
137
|
+
* @returns {Finding[]}
|
|
138
|
+
* @throws {Error} when stdout is not parseable JSON.
|
|
139
|
+
*/
|
|
140
|
+
export function parseSecurityReviewFindings(rawStdout) {
|
|
141
|
+
const text = (rawStdout ?? '').trim();
|
|
142
|
+
if (text.length === 0) return [];
|
|
143
|
+
|
|
144
|
+
let parsed;
|
|
145
|
+
try {
|
|
146
|
+
parsed = JSON.parse(text);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`[security-review] Failed to parse /security-review stdout as JSON: ${
|
|
150
|
+
err?.message ?? err
|
|
151
|
+
}`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
156
|
+
if (Array.isArray(parsed.findings)) parsed = parsed.findings;
|
|
157
|
+
else if (parsed.result !== undefined) parsed = parsed.result;
|
|
158
|
+
else if (parsed.data !== undefined) parsed = parsed.data;
|
|
159
|
+
}
|
|
160
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
161
|
+
if (Array.isArray(parsed.findings)) parsed = parsed.findings;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!Array.isArray(parsed)) return [];
|
|
165
|
+
|
|
166
|
+
/** @type {Finding[]} */
|
|
167
|
+
const findings = [];
|
|
168
|
+
for (const entry of parsed) {
|
|
169
|
+
if (!entry || typeof entry !== 'object') continue;
|
|
170
|
+
const title =
|
|
171
|
+
typeof entry.title === 'string' && entry.title.trim().length > 0
|
|
172
|
+
? entry.title.trim()
|
|
173
|
+
: null;
|
|
174
|
+
const body =
|
|
175
|
+
typeof entry.body === 'string' && entry.body.trim().length > 0
|
|
176
|
+
? entry.body
|
|
177
|
+
: typeof entry.message === 'string' && entry.message.trim().length > 0
|
|
178
|
+
? entry.message
|
|
179
|
+
: null;
|
|
180
|
+
if (!title || !body) continue;
|
|
181
|
+
/** @type {Finding} */
|
|
182
|
+
const finding = {
|
|
183
|
+
severity: mapSecurityReviewSeverity(entry.severity),
|
|
184
|
+
title,
|
|
185
|
+
body,
|
|
186
|
+
category:
|
|
187
|
+
typeof entry.category === 'string' && entry.category.length > 0
|
|
188
|
+
? entry.category
|
|
189
|
+
: 'security',
|
|
190
|
+
};
|
|
191
|
+
if (typeof entry.file === 'string' && entry.file.length > 0) {
|
|
192
|
+
finding.file = entry.file;
|
|
193
|
+
}
|
|
194
|
+
if (Number.isInteger(entry.line) && entry.line > 0) {
|
|
195
|
+
finding.line = entry.line;
|
|
196
|
+
}
|
|
197
|
+
findings.push(finding);
|
|
198
|
+
}
|
|
199
|
+
return findings;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Prompt body sent to `claude --print` to wrap the built-in
|
|
204
|
+
* `/security-review` skill with an explicit JSON-emit instruction.
|
|
205
|
+
* Exported so doc tooling and tests reference one canonical string.
|
|
206
|
+
*
|
|
207
|
+
* The prompt is intentionally narrow: it asks the model to run the
|
|
208
|
+
* skill against a specific git range and emit findings as a JSON
|
|
209
|
+
* array. Any prose preface or trailing commentary is parseable as
|
|
210
|
+
* "garbage before/after JSON" — `parseSecurityReviewFindings` uses
|
|
211
|
+
* the first JSON-shaped substring rather than the whole stdout.
|
|
212
|
+
*
|
|
213
|
+
* The `{depthDirective}` slot renders the risk-derived thoroughness lever
|
|
214
|
+
* (Story #3937) so a high-risk Epic instructs the model toward a deeper
|
|
215
|
+
* second-pass review while a low-risk one keeps it light.
|
|
216
|
+
*/
|
|
217
|
+
export const SECURITY_REVIEW_INVOKE_PROMPT =
|
|
218
|
+
'Run /security-review against the diff `{baseRef}`...`{headRef}` ' +
|
|
219
|
+
'for {scopeLabel} #{ticketId}. {depthDirective} After the review, emit ' +
|
|
220
|
+
'ONLY a JSON array of findings on stdout with this exact shape:\n\n' +
|
|
221
|
+
'```\n[{"severity":"critical|high|medium|suggestion","title":"...",' +
|
|
222
|
+
'"body":"...","file":"...","line":1,"category":"security"}]\n```\n\n' +
|
|
223
|
+
'Use severity "critical" for blockers (must fix before merge), ' +
|
|
224
|
+
'"high" for material risks, "medium" for issues worth fixing, and ' +
|
|
225
|
+
'"suggestion" for advisory notes. Emit `[]` if you find nothing. ' +
|
|
226
|
+
'No prose around the JSON.';
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Build the `claude --print` prompt for a specific review input. The
|
|
230
|
+
* risk-derived `depth` lever (Story #3937) is rendered into the prompt via
|
|
231
|
+
* `renderDepthDirective` so the model's thoroughness tracks the Epic's judged
|
|
232
|
+
* risk; an absent depth renders the `standard` directive.
|
|
233
|
+
*
|
|
234
|
+
* Exported for testing.
|
|
235
|
+
*
|
|
236
|
+
* @param {ReviewInput} input
|
|
237
|
+
* @returns {string}
|
|
238
|
+
*/
|
|
239
|
+
export function buildSecurityReviewPrompt(input) {
|
|
240
|
+
const scopeLabel = input?.scope === 'epic' ? 'Epic' : 'Story';
|
|
241
|
+
const baseRef = typeof input?.baseRef === 'string' ? input.baseRef : '?';
|
|
242
|
+
const headRef = typeof input?.headRef === 'string' ? input.headRef : '?';
|
|
243
|
+
const ticketId =
|
|
244
|
+
Number.isInteger(input?.ticketId) && input.ticketId > 0
|
|
245
|
+
? String(input.ticketId)
|
|
246
|
+
: '?';
|
|
247
|
+
return SECURITY_REVIEW_INVOKE_PROMPT.replace('{baseRef}', baseRef)
|
|
248
|
+
.replace('{headRef}', headRef)
|
|
249
|
+
.replace('{scopeLabel}', scopeLabel)
|
|
250
|
+
.replace('{ticketId}', ticketId)
|
|
251
|
+
.replace('{depthDirective}', renderDepthDirective(input?.depth));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Default invoker: shell out to the host's `claude` CLI to run the
|
|
256
|
+
* `/security-review` skill via a JSON-emit prompt. Exported for
|
|
257
|
+
* testing — the production adapter accepts an `invokeFn` override
|
|
258
|
+
* so tests never spawn a real process.
|
|
259
|
+
*
|
|
260
|
+
* @param {ReviewInput} input
|
|
261
|
+
* @returns {{ status: number, stdout: string, stderr: string }}
|
|
262
|
+
*/
|
|
263
|
+
export function defaultInvokeSecurityReview(input) {
|
|
264
|
+
const prompt = buildSecurityReviewPrompt(input);
|
|
265
|
+
const result = spawnSync('claude', ['--print', prompt], {
|
|
266
|
+
encoding: 'utf-8',
|
|
267
|
+
shell: process.platform === 'win32',
|
|
268
|
+
timeout: 10 * 60 * 1000,
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
status: result.status ?? 1,
|
|
272
|
+
stdout: result.stdout ?? '',
|
|
273
|
+
stderr: result.stderr ?? '',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Build the advisory fallback finding emitted when `/security-review`
|
|
279
|
+
* exits cleanly but its stdout is not parseable JSON. Pure +
|
|
280
|
+
* exported so tests assert against the exact shape.
|
|
281
|
+
*
|
|
282
|
+
* @returns {Finding}
|
|
283
|
+
*/
|
|
284
|
+
export function buildUnparseableFallbackFinding() {
|
|
285
|
+
return {
|
|
286
|
+
severity: 'suggestion',
|
|
287
|
+
title: 'Security review output not parseable as JSON',
|
|
288
|
+
body:
|
|
289
|
+
'The `/security-review` skill returned text that did not parse as a ' +
|
|
290
|
+
'JSON findings array. The review still ran — operators should inspect ' +
|
|
291
|
+
'the skill output manually before merging. Treat as advisory; the ' +
|
|
292
|
+
'chain did not halt.',
|
|
293
|
+
category: 'security',
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Build a `ReviewProvider` instance backed by `/security-review`.
|
|
299
|
+
*
|
|
300
|
+
* @param {{
|
|
301
|
+
* probeFn?: () => boolean,
|
|
302
|
+
* invokeFn?: (input: ReviewInput) => { status: number, stdout: string, stderr: string },
|
|
303
|
+
* logger?: { info?: Function, warn?: Function, error?: Function },
|
|
304
|
+
* }} [deps]
|
|
305
|
+
* @returns {ReviewProvider}
|
|
306
|
+
*/
|
|
307
|
+
export function createSecurityReviewProvider(deps = {}) {
|
|
308
|
+
const probeFn = deps.probeFn ?? defaultProbeClaudeCli;
|
|
309
|
+
if (!probeFn()) {
|
|
310
|
+
throw buildSecurityReviewUnavailableError();
|
|
311
|
+
}
|
|
312
|
+
const invokeFn = deps.invokeFn ?? defaultInvokeSecurityReview;
|
|
313
|
+
const logger = deps.logger;
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
/**
|
|
317
|
+
* @param {ReviewInput} input
|
|
318
|
+
* @returns {Promise<Finding[]>}
|
|
319
|
+
*/
|
|
320
|
+
async runReview(input) {
|
|
321
|
+
const { scope, ticketId, baseRef, headRef } = input ?? {};
|
|
322
|
+
if (!baseRef || !headRef) {
|
|
323
|
+
throw new TypeError(
|
|
324
|
+
'[security-review] runReview requires baseRef and headRef.',
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
if (!Number.isInteger(ticketId) || ticketId <= 0) {
|
|
328
|
+
throw new TypeError(
|
|
329
|
+
'[security-review] runReview requires a positive integer ticketId.',
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
logger?.info?.(
|
|
334
|
+
`[security-review] Invoking /security-review for ${scope} #${ticketId} (${baseRef}...${headRef})...`,
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
const result = invokeFn({ scope, ticketId, baseRef, headRef });
|
|
338
|
+
if (result.status !== 0) {
|
|
339
|
+
throw new Error(
|
|
340
|
+
`[security-review] claude --print /security-review exited with ` +
|
|
341
|
+
`status ${result.status}: ${
|
|
342
|
+
result.stderr || result.stdout || '<no output>'
|
|
343
|
+
}`,
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
try {
|
|
348
|
+
const findings = parseSecurityReviewFindings(result.stdout);
|
|
349
|
+
logger?.info?.(
|
|
350
|
+
`[security-review] Parsed ${findings.length} finding(s) from /security-review.`,
|
|
351
|
+
);
|
|
352
|
+
return findings;
|
|
353
|
+
} catch (err) {
|
|
354
|
+
logger?.warn?.(
|
|
355
|
+
`[security-review] Could not parse stdout as JSON; emitting advisory fallback: ${
|
|
356
|
+
err?.message ?? err
|
|
357
|
+
}`,
|
|
358
|
+
);
|
|
359
|
+
return [buildUnparseableFallbackFinding()];
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Zero-arg factory entry point used by the `review-provider-factory`
|
|
367
|
+
* registry. Mirrors `createCodexProviderForRegistry`.
|
|
368
|
+
*
|
|
369
|
+
* @returns {ReviewProvider}
|
|
370
|
+
*/
|
|
371
|
+
export function createSecurityReviewProviderForRegistry() {
|
|
372
|
+
return createSecurityReviewProvider();
|
|
373
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-providers/types.js — Pluggable Code Review contract typedefs.
|
|
3
|
+
*
|
|
4
|
+
* Story #2825 (Epic #2815) — defines the `Finding` and `ReviewProvider`
|
|
5
|
+
* shapes that adapters under `review-providers/` must conform to. The
|
|
6
|
+
* factory loads an adapter, the adapter returns `Finding[]`, and the
|
|
7
|
+
* `findings-renderer` turns that array into the structured-comment body
|
|
8
|
+
* posted to the Story/Epic ticket.
|
|
9
|
+
*
|
|
10
|
+
* Story #2871 — extends the contract for multi-provider chains and
|
|
11
|
+
* adds `ManualPromptProvider` for operator-prompt providers
|
|
12
|
+
* (e.g. ultrareview) that emit a non-blocking suggestion into the
|
|
13
|
+
* structured comment instead of running a real review.
|
|
14
|
+
*
|
|
15
|
+
* This file is JSDoc-only — no runtime exports. It exists so other
|
|
16
|
+
* modules and tests have a single canonical reference to import via
|
|
17
|
+
* `@typedef` lookups.
|
|
18
|
+
*
|
|
19
|
+
* @typedef {'critical'|'high'|'medium'|'suggestion'} Severity
|
|
20
|
+
*
|
|
21
|
+
* @typedef {object} Finding
|
|
22
|
+
* @property {Severity} severity - Severity tier; maps to the 🔴/🟠/🟡/🟢 emoji set.
|
|
23
|
+
* @property {string} title - One-line summary.
|
|
24
|
+
* @property {string} body - Markdown body rendered inside the comment.
|
|
25
|
+
* @property {string=} file - Relative path, when attributable.
|
|
26
|
+
* @property {number=} line - 1-based line number, when attributable.
|
|
27
|
+
* @property {string=} category - Free-form tag (e.g. 'security', 'docs', 'lint').
|
|
28
|
+
*
|
|
29
|
+
* @typedef {'story'|'epic'} ReviewScope
|
|
30
|
+
*
|
|
31
|
+
* @typedef {'light'|'standard'|'deep'} ReviewDepth
|
|
32
|
+
*
|
|
33
|
+
* @typedef {object} ReviewInput
|
|
34
|
+
* @property {ReviewScope} scope - Which close boundary is invoking the review.
|
|
35
|
+
* @property {number} ticketId - Story or Epic issue number.
|
|
36
|
+
* @property {string} baseRef - Git ref to diff against (e.g. 'main', 'epic/2815').
|
|
37
|
+
* @property {string} headRef - Git ref under review (e.g. 'story-2820', 'epic/2815').
|
|
38
|
+
* @property {ReviewDepth=} depth - Risk-and-width-derived review thoroughness
|
|
39
|
+
* lever (Story #3876/#3937/#3938). `light` → single-pass review focused on
|
|
40
|
+
* Pillar 1 (spec adherence) with Pillars 2–3 reduced to a quick scan;
|
|
41
|
+
* `standard` → all pillars at baseline depth; `deep` → all pillars plus a
|
|
42
|
+
* second adversarial pass over the diff. Resolved from the judged risk
|
|
43
|
+
* envelope AND the changed-file count of the diff by `resolveDepth`
|
|
44
|
+
* (`lib/orchestration/review-depth.js`) and threaded into `runReview`.
|
|
45
|
+
* LLM-backed
|
|
46
|
+
* providers MUST render this into the prompt/instructions they emit; the
|
|
47
|
+
* native provider documents why its mechanical sweep ignores it. Absent →
|
|
48
|
+
* providers treat the review as `standard`.
|
|
49
|
+
*
|
|
50
|
+
* @typedef {object} ReviewProvider
|
|
51
|
+
* @property {(input: ReviewInput) => Promise<Finding[]>} runReview
|
|
52
|
+
*
|
|
53
|
+
* Manual-prompt providers (Story #2871) do NOT run a review — they
|
|
54
|
+
* contribute a one-line operator-facing suggestion to the structured
|
|
55
|
+
* comment. Used for cloud or user-triggered review tools (e.g.
|
|
56
|
+
* `/ultrareview`) that cannot be invoked programmatically from a
|
|
57
|
+
* Node orchestrator.
|
|
58
|
+
*
|
|
59
|
+
* @typedef {object} ManualPromptResult
|
|
60
|
+
* @property {string} message - Markdown one-liner appended under "Manual review suggestions".
|
|
61
|
+
*
|
|
62
|
+
* @typedef {object} ManualPromptProvider
|
|
63
|
+
* @property {(input: ReviewInput) => Promise<ManualPromptResult>} renderPrompt
|
|
64
|
+
*
|
|
65
|
+
* Chain entries (Story #2871) wrap an adapter with metadata used by
|
|
66
|
+
* the orchestrator to gate invocation per-scope and per-label.
|
|
67
|
+
*
|
|
68
|
+
* @typedef {object} ProviderGateContext
|
|
69
|
+
* @property {ReviewScope} scope - Current invocation scope.
|
|
70
|
+
* @property {ReadonlyArray<string>} labels - Ticket labels at invocation time.
|
|
71
|
+
*
|
|
72
|
+
* @typedef {(ctx: ProviderGateContext) => boolean} ProviderGate
|
|
73
|
+
*
|
|
74
|
+
* @typedef {object} InlineChainEntry
|
|
75
|
+
* @property {string} name - Registered provider key (for logs/attribution).
|
|
76
|
+
* @property {ReviewProvider} provider - Constructed inline adapter.
|
|
77
|
+
* @property {ProviderGate} gate - Pure predicate; false → skip this entry.
|
|
78
|
+
*
|
|
79
|
+
* @typedef {object} PromptChainEntry
|
|
80
|
+
* @property {string} name - Registered provider key.
|
|
81
|
+
* @property {ManualPromptProvider} provider - Constructed manual-prompt adapter.
|
|
82
|
+
* @property {ProviderGate} gate - Pure predicate; false → skip this entry.
|
|
83
|
+
*
|
|
84
|
+
* @typedef {object} ProviderChain
|
|
85
|
+
* @property {InlineChainEntry[]} inline - Inline adapters (run, merge Finding[]).
|
|
86
|
+
* @property {PromptChainEntry[]} prompts - Manual-prompt adapters (render suggestion strings).
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-providers/ultrareview.js — Manual-prompt provider for
|
|
3
|
+
* Anthropic's `/ultrareview` cloud multi-agent review.
|
|
4
|
+
*
|
|
5
|
+
* Story #2871 — `/ultrareview` is user-triggered and billed by
|
|
6
|
+
* Anthropic; it cannot be invoked programmatically from a Node
|
|
7
|
+
* orchestrator. This adapter implements the `ManualPromptProvider`
|
|
8
|
+
* shape instead of `ReviewProvider`: it emits a single Markdown
|
|
9
|
+
* suggestion line into the structured `code-review` comment so the
|
|
10
|
+
* operator sees the nudge inline with the rest of the review.
|
|
11
|
+
*
|
|
12
|
+
* The adapter is intentionally pure and host-agnostic. It does NOT
|
|
13
|
+
* probe the host for Claude CLI availability — `renderPrompt()` only
|
|
14
|
+
* produces text, and the worst case under a non-Claude host is a
|
|
15
|
+
* suggestion the operator cannot act on. Documenting that suggestion
|
|
16
|
+
* is still useful (consumer projects pin to a framework version, and
|
|
17
|
+
* upgrading to a Claude-capable runtime exposes the value).
|
|
18
|
+
*
|
|
19
|
+
* Per the story acceptance contract: manual-prompt providers MUST
|
|
20
|
+
* NEVER throw under any host.
|
|
21
|
+
*
|
|
22
|
+
* @typedef {import('./types.js').ManualPromptProvider} ManualPromptProvider
|
|
23
|
+
* @typedef {import('./types.js').ManualPromptResult} ManualPromptResult
|
|
24
|
+
* @typedef {import('./types.js').ReviewInput} ReviewInput
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { renderDepthDirective } from './review-depth.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Canonical suggestion string. Exported so tests can assert against
|
|
31
|
+
* the exact wording rather than free-text matching, and so doc
|
|
32
|
+
* tooling can lift the line without spawning a fake review.
|
|
33
|
+
*
|
|
34
|
+
* The `{depthDirective}` slot renders the risk-derived thoroughness lever
|
|
35
|
+
* (Story #3937) so the operator nudge tells the human reviewer how deep to go
|
|
36
|
+
* when they trigger `/ultrareview` — a high-risk Epic asks for a deep
|
|
37
|
+
* second-pass review, a low-risk one keeps it light.
|
|
38
|
+
*/
|
|
39
|
+
export const ULTRAREVIEW_PROMPT_TEMPLATE =
|
|
40
|
+
'💡 **Suggested:** Consider running `/ultrareview` on this ' +
|
|
41
|
+
'{scopeLabel} (`{baseRef}`…`{headRef}`) before merging — ' +
|
|
42
|
+
"Anthropic's multi-agent cloud review surfaces issues that " +
|
|
43
|
+
'single-pass review can miss. This is operator-triggered ' +
|
|
44
|
+
'(billed by Anthropic); not a blocker. {depthDirective}';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Render the canonical suggestion string with the live scope/baseRef/
|
|
48
|
+
* headRef substituted, and the risk-derived `depth` lever (Story #3937)
|
|
49
|
+
* rendered into the nudge via `renderDepthDirective` (absent depth → the
|
|
50
|
+
* `standard` directive).
|
|
51
|
+
*
|
|
52
|
+
* Pure — exported for testing.
|
|
53
|
+
*
|
|
54
|
+
* @param {ReviewInput} input
|
|
55
|
+
* @returns {string}
|
|
56
|
+
*/
|
|
57
|
+
export function buildUltrareviewMessage(input) {
|
|
58
|
+
const scopeLabel = input?.scope === 'epic' ? 'Epic' : 'Story';
|
|
59
|
+
const baseRef = typeof input?.baseRef === 'string' ? input.baseRef : '?';
|
|
60
|
+
const headRef = typeof input?.headRef === 'string' ? input.headRef : '?';
|
|
61
|
+
return ULTRAREVIEW_PROMPT_TEMPLATE.replace('{scopeLabel}', scopeLabel)
|
|
62
|
+
.replace('{baseRef}', baseRef)
|
|
63
|
+
.replace('{headRef}', headRef)
|
|
64
|
+
.replace('{depthDirective}', renderDepthDirective(input?.depth));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Build a `ManualPromptProvider` instance for the `ultrareview`
|
|
69
|
+
* registry slot.
|
|
70
|
+
*
|
|
71
|
+
* The `deps` overload exists only for test parity with the inline
|
|
72
|
+
* provider factories — production callers (the factory) invoke
|
|
73
|
+
* `createUltrareviewProvider()` with no arguments.
|
|
74
|
+
*
|
|
75
|
+
* @param {{
|
|
76
|
+
* logger?: { info?: Function, warn?: Function },
|
|
77
|
+
* }} [deps]
|
|
78
|
+
* @returns {ManualPromptProvider}
|
|
79
|
+
*/
|
|
80
|
+
export function createUltrareviewProvider(deps = {}) {
|
|
81
|
+
const logger = deps.logger;
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
/**
|
|
85
|
+
* @param {ReviewInput} input
|
|
86
|
+
* @returns {Promise<ManualPromptResult>}
|
|
87
|
+
*/
|
|
88
|
+
async renderPrompt(input) {
|
|
89
|
+
const message = buildUltrareviewMessage(input);
|
|
90
|
+
logger?.info?.(
|
|
91
|
+
'[ultrareview] Manual-prompt suggestion rendered (non-blocking).',
|
|
92
|
+
);
|
|
93
|
+
return { message };
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Zero-arg factory entry point used by the `review-provider-factory`
|
|
100
|
+
* registry. Mirrors `createCodexProviderForRegistry` so the registry
|
|
101
|
+
* signature stays `() => ManualPromptProvider`.
|
|
102
|
+
*
|
|
103
|
+
* @returns {ManualPromptProvider}
|
|
104
|
+
*/
|
|
105
|
+
export function createUltrareviewProviderForRegistry() {
|
|
106
|
+
return createUltrareviewProvider();
|
|
107
|
+
}
|