@promptwheel/cli 0.6.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/README.md +215 -0
- package/dist/bin/promptwheel.d.ts +17 -0
- package/dist/bin/promptwheel.d.ts.map +1 -0
- package/dist/bin/promptwheel.js +90 -0
- package/dist/bin/promptwheel.js.map +1 -0
- package/dist/commands/auto-auth.d.ts +26 -0
- package/dist/commands/auto-auth.d.ts.map +1 -0
- package/dist/commands/auto-auth.js +216 -0
- package/dist/commands/auto-auth.js.map +1 -0
- package/dist/commands/auto-ci-mode.d.ts +9 -0
- package/dist/commands/auto-ci-mode.d.ts.map +1 -0
- package/dist/commands/auto-ci-mode.js +176 -0
- package/dist/commands/auto-ci-mode.js.map +1 -0
- package/dist/commands/solo-analytics.d.ts +6 -0
- package/dist/commands/solo-analytics.d.ts.map +1 -0
- package/dist/commands/solo-analytics.js +267 -0
- package/dist/commands/solo-analytics.js.map +1 -0
- package/dist/commands/solo-auto.d.ts +6 -0
- package/dist/commands/solo-auto.d.ts.map +1 -0
- package/dist/commands/solo-auto.js +135 -0
- package/dist/commands/solo-auto.js.map +1 -0
- package/dist/commands/solo-daemon.d.ts +12 -0
- package/dist/commands/solo-daemon.d.ts.map +1 -0
- package/dist/commands/solo-daemon.js +177 -0
- package/dist/commands/solo-daemon.js.map +1 -0
- package/dist/commands/solo-exec.d.ts +6 -0
- package/dist/commands/solo-exec.d.ts.map +1 -0
- package/dist/commands/solo-exec.js +656 -0
- package/dist/commands/solo-exec.js.map +1 -0
- package/dist/commands/solo-inspect.d.ts +6 -0
- package/dist/commands/solo-inspect.d.ts.map +1 -0
- package/dist/commands/solo-inspect.js +765 -0
- package/dist/commands/solo-inspect.js.map +1 -0
- package/dist/commands/solo-lifecycle.d.ts +6 -0
- package/dist/commands/solo-lifecycle.d.ts.map +1 -0
- package/dist/commands/solo-lifecycle.js +226 -0
- package/dist/commands/solo-lifecycle.js.map +1 -0
- package/dist/commands/solo-nudge.d.ts +6 -0
- package/dist/commands/solo-nudge.d.ts.map +1 -0
- package/dist/commands/solo-nudge.js +49 -0
- package/dist/commands/solo-nudge.js.map +1 -0
- package/dist/commands/solo-qa.d.ts +6 -0
- package/dist/commands/solo-qa.d.ts.map +1 -0
- package/dist/commands/solo-qa.js +253 -0
- package/dist/commands/solo-qa.js.map +1 -0
- package/dist/commands/solo-trajectory.d.ts +6 -0
- package/dist/commands/solo-trajectory.d.ts.map +1 -0
- package/dist/commands/solo-trajectory.js +268 -0
- package/dist/commands/solo-trajectory.js.map +1 -0
- package/dist/commands/solo.d.ts +11 -0
- package/dist/commands/solo.d.ts.map +1 -0
- package/dist/commands/solo.js +52 -0
- package/dist/commands/solo.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/artifacts.d.ts +136 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +147 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/codebase-index.d.ts +5 -0
- package/dist/lib/codebase-index.d.ts.map +1 -0
- package/dist/lib/codebase-index.js +5 -0
- package/dist/lib/codebase-index.js.map +1 -0
- package/dist/lib/cycle-context.d.ts +62 -0
- package/dist/lib/cycle-context.d.ts.map +1 -0
- package/dist/lib/cycle-context.js +141 -0
- package/dist/lib/cycle-context.js.map +1 -0
- package/dist/lib/daemon-fork.d.ts +39 -0
- package/dist/lib/daemon-fork.d.ts.map +1 -0
- package/dist/lib/daemon-fork.js +164 -0
- package/dist/lib/daemon-fork.js.map +1 -0
- package/dist/lib/daemon-notifier.d.ts +29 -0
- package/dist/lib/daemon-notifier.d.ts.map +1 -0
- package/dist/lib/daemon-notifier.js +147 -0
- package/dist/lib/daemon-notifier.js.map +1 -0
- package/dist/lib/daemon.d.ts +75 -0
- package/dist/lib/daemon.d.ts.map +1 -0
- package/dist/lib/daemon.js +265 -0
- package/dist/lib/daemon.js.map +1 -0
- package/dist/lib/dedup-memory.d.ts +46 -0
- package/dist/lib/dedup-memory.d.ts.map +1 -0
- package/dist/lib/dedup-memory.js +190 -0
- package/dist/lib/dedup-memory.js.map +1 -0
- package/dist/lib/dedup.d.ts +37 -0
- package/dist/lib/dedup.d.ts.map +1 -0
- package/dist/lib/dedup.js +85 -0
- package/dist/lib/dedup.js.map +1 -0
- package/dist/lib/display-adapter-log.d.ts +26 -0
- package/dist/lib/display-adapter-log.d.ts.map +1 -0
- package/dist/lib/display-adapter-log.js +63 -0
- package/dist/lib/display-adapter-log.js.map +1 -0
- package/dist/lib/display-adapter-spinner.d.ts +28 -0
- package/dist/lib/display-adapter-spinner.d.ts.map +1 -0
- package/dist/lib/display-adapter-spinner.js +93 -0
- package/dist/lib/display-adapter-spinner.js.map +1 -0
- package/dist/lib/display-adapter-tui.d.ts +32 -0
- package/dist/lib/display-adapter-tui.d.ts.map +1 -0
- package/dist/lib/display-adapter-tui.js +77 -0
- package/dist/lib/display-adapter-tui.js.map +1 -0
- package/dist/lib/display-adapter.d.ts +40 -0
- package/dist/lib/display-adapter.d.ts.map +1 -0
- package/dist/lib/display-adapter.js +9 -0
- package/dist/lib/display-adapter.js.map +1 -0
- package/dist/lib/doctor.d.ts +45 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +382 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/exclusion-index.d.ts +50 -0
- package/dist/lib/exclusion-index.d.ts.map +1 -0
- package/dist/lib/exclusion-index.js +249 -0
- package/dist/lib/exclusion-index.js.map +1 -0
- package/dist/lib/exec.d.ts +24 -0
- package/dist/lib/exec.d.ts.map +1 -0
- package/dist/lib/exec.js +295 -0
- package/dist/lib/exec.js.map +1 -0
- package/dist/lib/execution-backends/claude.d.ts +27 -0
- package/dist/lib/execution-backends/claude.d.ts.map +1 -0
- package/dist/lib/execution-backends/claude.js +161 -0
- package/dist/lib/execution-backends/claude.js.map +1 -0
- package/dist/lib/execution-backends/codex.d.ts +28 -0
- package/dist/lib/execution-backends/codex.d.ts.map +1 -0
- package/dist/lib/execution-backends/codex.js +216 -0
- package/dist/lib/execution-backends/codex.js.map +1 -0
- package/dist/lib/execution-backends/index.d.ts +10 -0
- package/dist/lib/execution-backends/index.d.ts.map +1 -0
- package/dist/lib/execution-backends/index.js +9 -0
- package/dist/lib/execution-backends/index.js.map +1 -0
- package/dist/lib/execution-backends/kimi.d.ts +25 -0
- package/dist/lib/execution-backends/kimi.d.ts.map +1 -0
- package/dist/lib/execution-backends/kimi.js +76 -0
- package/dist/lib/execution-backends/kimi.js.map +1 -0
- package/dist/lib/execution-backends/types.d.ts +38 -0
- package/dist/lib/execution-backends/types.d.ts.map +1 -0
- package/dist/lib/execution-backends/types.js +5 -0
- package/dist/lib/execution-backends/types.js.map +1 -0
- package/dist/lib/failure-classifier.d.ts +11 -0
- package/dist/lib/failure-classifier.d.ts.map +1 -0
- package/dist/lib/failure-classifier.js +24 -0
- package/dist/lib/failure-classifier.js.map +1 -0
- package/dist/lib/file-cooldown.d.ts +9 -0
- package/dist/lib/file-cooldown.d.ts.map +1 -0
- package/dist/lib/file-cooldown.js +75 -0
- package/dist/lib/file-cooldown.js.map +1 -0
- package/dist/lib/formulas.d.ts +52 -0
- package/dist/lib/formulas.d.ts.map +1 -0
- package/dist/lib/formulas.js +123 -0
- package/dist/lib/formulas.js.map +1 -0
- package/dist/lib/git.d.ts +9 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +60 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/goals.d.ts +59 -0
- package/dist/lib/goals.d.ts.map +1 -0
- package/dist/lib/goals.js +216 -0
- package/dist/lib/goals.js.map +1 -0
- package/dist/lib/guidelines.d.ts +32 -0
- package/dist/lib/guidelines.d.ts.map +1 -0
- package/dist/lib/guidelines.js +102 -0
- package/dist/lib/guidelines.js.map +1 -0
- package/dist/lib/learnings.d.ts +65 -0
- package/dist/lib/learnings.d.ts.map +1 -0
- package/dist/lib/learnings.js +193 -0
- package/dist/lib/learnings.js.map +1 -0
- package/dist/lib/logger.d.ts +17 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +42 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/meta-learnings.d.ts +27 -0
- package/dist/lib/meta-learnings.d.ts.map +1 -0
- package/dist/lib/meta-learnings.js +270 -0
- package/dist/lib/meta-learnings.js.map +1 -0
- package/dist/lib/metrics.d.ts +48 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +107 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/openai-local-execution.d.ts +29 -0
- package/dist/lib/openai-local-execution.d.ts.map +1 -0
- package/dist/lib/openai-local-execution.js +282 -0
- package/dist/lib/openai-local-execution.js.map +1 -0
- package/dist/lib/project-metadata/csharp.d.ts +6 -0
- package/dist/lib/project-metadata/csharp.d.ts.map +1 -0
- package/dist/lib/project-metadata/csharp.js +19 -0
- package/dist/lib/project-metadata/csharp.js.map +1 -0
- package/dist/lib/project-metadata/elixir.d.ts +6 -0
- package/dist/lib/project-metadata/elixir.d.ts.map +1 -0
- package/dist/lib/project-metadata/elixir.js +23 -0
- package/dist/lib/project-metadata/elixir.js.map +1 -0
- package/dist/lib/project-metadata/go.d.ts +6 -0
- package/dist/lib/project-metadata/go.d.ts.map +1 -0
- package/dist/lib/project-metadata/go.js +30 -0
- package/dist/lib/project-metadata/go.js.map +1 -0
- package/dist/lib/project-metadata/index.d.ts +13 -0
- package/dist/lib/project-metadata/index.d.ts.map +1 -0
- package/dist/lib/project-metadata/index.js +111 -0
- package/dist/lib/project-metadata/index.js.map +1 -0
- package/dist/lib/project-metadata/java.d.ts +6 -0
- package/dist/lib/project-metadata/java.d.ts.map +1 -0
- package/dist/lib/project-metadata/java.js +37 -0
- package/dist/lib/project-metadata/java.js.map +1 -0
- package/dist/lib/project-metadata/node.d.ts +6 -0
- package/dist/lib/project-metadata/node.d.ts.map +1 -0
- package/dist/lib/project-metadata/node.js +135 -0
- package/dist/lib/project-metadata/node.js.map +1 -0
- package/dist/lib/project-metadata/php.d.ts +6 -0
- package/dist/lib/project-metadata/php.d.ts.map +1 -0
- package/dist/lib/project-metadata/php.js +29 -0
- package/dist/lib/project-metadata/php.js.map +1 -0
- package/dist/lib/project-metadata/python.d.ts +6 -0
- package/dist/lib/project-metadata/python.d.ts.map +1 -0
- package/dist/lib/project-metadata/python.js +79 -0
- package/dist/lib/project-metadata/python.js.map +1 -0
- package/dist/lib/project-metadata/ruby.d.ts +6 -0
- package/dist/lib/project-metadata/ruby.d.ts.map +1 -0
- package/dist/lib/project-metadata/ruby.js +38 -0
- package/dist/lib/project-metadata/ruby.js.map +1 -0
- package/dist/lib/project-metadata/rust.d.ts +6 -0
- package/dist/lib/project-metadata/rust.d.ts.map +1 -0
- package/dist/lib/project-metadata/rust.js +33 -0
- package/dist/lib/project-metadata/rust.js.map +1 -0
- package/dist/lib/project-metadata/swift.d.ts +6 -0
- package/dist/lib/project-metadata/swift.d.ts.map +1 -0
- package/dist/lib/project-metadata/swift.js +19 -0
- package/dist/lib/project-metadata/swift.js.map +1 -0
- package/dist/lib/project-metadata/types.d.ts +37 -0
- package/dist/lib/project-metadata/types.d.ts.map +1 -0
- package/dist/lib/project-metadata/types.js +5 -0
- package/dist/lib/project-metadata/types.js.map +1 -0
- package/dist/lib/proposal-review.d.ts +9 -0
- package/dist/lib/proposal-review.d.ts.map +1 -0
- package/dist/lib/proposal-review.js +9 -0
- package/dist/lib/proposal-review.js.map +1 -0
- package/dist/lib/providers/claude.d.ts +6 -0
- package/dist/lib/providers/claude.d.ts.map +1 -0
- package/dist/lib/providers/claude.js +21 -0
- package/dist/lib/providers/claude.js.map +1 -0
- package/dist/lib/providers/codex.d.ts +6 -0
- package/dist/lib/providers/codex.d.ts.map +1 -0
- package/dist/lib/providers/codex.js +26 -0
- package/dist/lib/providers/codex.js.map +1 -0
- package/dist/lib/providers/index.d.ts +22 -0
- package/dist/lib/providers/index.d.ts.map +1 -0
- package/dist/lib/providers/index.js +39 -0
- package/dist/lib/providers/index.js.map +1 -0
- package/dist/lib/providers/kimi.d.ts +6 -0
- package/dist/lib/providers/kimi.d.ts.map +1 -0
- package/dist/lib/providers/kimi.js +22 -0
- package/dist/lib/providers/kimi.js.map +1 -0
- package/dist/lib/providers/openai-local.d.ts +8 -0
- package/dist/lib/providers/openai-local.d.ts.map +1 -0
- package/dist/lib/providers/openai-local.js +30 -0
- package/dist/lib/providers/openai-local.js.map +1 -0
- package/dist/lib/providers/types.d.ts +37 -0
- package/dist/lib/providers/types.d.ts.map +1 -0
- package/dist/lib/providers/types.js +5 -0
- package/dist/lib/providers/types.js.map +1 -0
- package/dist/lib/qa-stats.d.ts +113 -0
- package/dist/lib/qa-stats.d.ts.map +1 -0
- package/dist/lib/qa-stats.js +311 -0
- package/dist/lib/qa-stats.js.map +1 -0
- package/dist/lib/retention.d.ts +125 -0
- package/dist/lib/retention.d.ts.map +1 -0
- package/dist/lib/retention.js +767 -0
- package/dist/lib/retention.js.map +1 -0
- package/dist/lib/run-history.d.ts +52 -0
- package/dist/lib/run-history.d.ts.map +1 -0
- package/dist/lib/run-history.js +116 -0
- package/dist/lib/run-history.js.map +1 -0
- package/dist/lib/run-state.d.ts +129 -0
- package/dist/lib/run-state.d.ts.map +1 -0
- package/dist/lib/run-state.js +312 -0
- package/dist/lib/run-state.js.map +1 -0
- package/dist/lib/scope.d.ts +8 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +8 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/scout-prompt-builder.d.ts +22 -0
- package/dist/lib/scout-prompt-builder.d.ts.map +1 -0
- package/dist/lib/scout-prompt-builder.js +97 -0
- package/dist/lib/scout-prompt-builder.js.map +1 -0
- package/dist/lib/sectors.d.ts +21 -0
- package/dist/lib/sectors.d.ts.map +1 -0
- package/dist/lib/sectors.js +96 -0
- package/dist/lib/sectors.js.map +1 -0
- package/dist/lib/selection.d.ts +35 -0
- package/dist/lib/selection.d.ts.map +1 -0
- package/dist/lib/selection.js +110 -0
- package/dist/lib/selection.js.map +1 -0
- package/dist/lib/session-report.d.ts +26 -0
- package/dist/lib/session-report.d.ts.map +1 -0
- package/dist/lib/session-report.js +143 -0
- package/dist/lib/session-report.js.map +1 -0
- package/dist/lib/solo-auto-between-cycles.d.ts +10 -0
- package/dist/lib/solo-auto-between-cycles.d.ts.map +1 -0
- package/dist/lib/solo-auto-between-cycles.js +577 -0
- package/dist/lib/solo-auto-between-cycles.js.map +1 -0
- package/dist/lib/solo-auto-execute.d.ts +22 -0
- package/dist/lib/solo-auto-execute.d.ts.map +1 -0
- package/dist/lib/solo-auto-execute.js +530 -0
- package/dist/lib/solo-auto-execute.js.map +1 -0
- package/dist/lib/solo-auto-filter.d.ts +14 -0
- package/dist/lib/solo-auto-filter.d.ts.map +1 -0
- package/dist/lib/solo-auto-filter.js +311 -0
- package/dist/lib/solo-auto-filter.js.map +1 -0
- package/dist/lib/solo-auto-finalize.d.ts +6 -0
- package/dist/lib/solo-auto-finalize.d.ts.map +1 -0
- package/dist/lib/solo-auto-finalize.js +242 -0
- package/dist/lib/solo-auto-finalize.js.map +1 -0
- package/dist/lib/solo-auto-init-qa.d.ts +23 -0
- package/dist/lib/solo-auto-init-qa.d.ts.map +1 -0
- package/dist/lib/solo-auto-init-qa.js +183 -0
- package/dist/lib/solo-auto-init-qa.js.map +1 -0
- package/dist/lib/solo-auto-planning.d.ts +40 -0
- package/dist/lib/solo-auto-planning.d.ts.map +1 -0
- package/dist/lib/solo-auto-planning.js +171 -0
- package/dist/lib/solo-auto-planning.js.map +1 -0
- package/dist/lib/solo-auto-scout.d.ts +18 -0
- package/dist/lib/solo-auto-scout.d.ts.map +1 -0
- package/dist/lib/solo-auto-scout.js +269 -0
- package/dist/lib/solo-auto-scout.js.map +1 -0
- package/dist/lib/solo-auto-state.d.ts +20 -0
- package/dist/lib/solo-auto-state.d.ts.map +1 -0
- package/dist/lib/solo-auto-state.js +859 -0
- package/dist/lib/solo-auto-state.js.map +1 -0
- package/dist/lib/solo-auto-types.d.ts +197 -0
- package/dist/lib/solo-auto-types.d.ts.map +1 -0
- package/dist/lib/solo-auto-types.js +11 -0
- package/dist/lib/solo-auto-types.js.map +1 -0
- package/dist/lib/solo-auto-utils.d.ts +23 -0
- package/dist/lib/solo-auto-utils.d.ts.map +1 -0
- package/dist/lib/solo-auto-utils.js +53 -0
- package/dist/lib/solo-auto-utils.js.map +1 -0
- package/dist/lib/solo-auto.d.ts +25 -0
- package/dist/lib/solo-auto.d.ts.map +1 -0
- package/dist/lib/solo-auto.js +345 -0
- package/dist/lib/solo-auto.js.map +1 -0
- package/dist/lib/solo-ci.d.ts +84 -0
- package/dist/lib/solo-ci.d.ts.map +1 -0
- package/dist/lib/solo-ci.js +306 -0
- package/dist/lib/solo-ci.js.map +1 -0
- package/dist/lib/solo-config.d.ts +242 -0
- package/dist/lib/solo-config.d.ts.map +1 -0
- package/dist/lib/solo-config.js +354 -0
- package/dist/lib/solo-config.js.map +1 -0
- package/dist/lib/solo-cycle-formula.d.ts +36 -0
- package/dist/lib/solo-cycle-formula.d.ts.map +1 -0
- package/dist/lib/solo-cycle-formula.js +90 -0
- package/dist/lib/solo-cycle-formula.js.map +1 -0
- package/dist/lib/solo-git.d.ts +87 -0
- package/dist/lib/solo-git.d.ts.map +1 -0
- package/dist/lib/solo-git.js +365 -0
- package/dist/lib/solo-git.js.map +1 -0
- package/dist/lib/solo-hints.d.ts +32 -0
- package/dist/lib/solo-hints.d.ts.map +1 -0
- package/dist/lib/solo-hints.js +98 -0
- package/dist/lib/solo-hints.js.map +1 -0
- package/dist/lib/solo-prompt-builder.d.ts +12 -0
- package/dist/lib/solo-prompt-builder.d.ts.map +1 -0
- package/dist/lib/solo-prompt-builder.js +53 -0
- package/dist/lib/solo-prompt-builder.js.map +1 -0
- package/dist/lib/solo-qa-retry.d.ts +43 -0
- package/dist/lib/solo-qa-retry.d.ts.map +1 -0
- package/dist/lib/solo-qa-retry.js +125 -0
- package/dist/lib/solo-qa-retry.js.map +1 -0
- package/dist/lib/solo-remote.d.ts +14 -0
- package/dist/lib/solo-remote.d.ts.map +1 -0
- package/dist/lib/solo-remote.js +48 -0
- package/dist/lib/solo-remote.js.map +1 -0
- package/dist/lib/solo-session-summary.d.ts +52 -0
- package/dist/lib/solo-session-summary.d.ts.map +1 -0
- package/dist/lib/solo-session-summary.js +188 -0
- package/dist/lib/solo-session-summary.js.map +1 -0
- package/dist/lib/solo-stdin.d.ts +33 -0
- package/dist/lib/solo-stdin.d.ts.map +1 -0
- package/dist/lib/solo-stdin.js +299 -0
- package/dist/lib/solo-stdin.js.map +1 -0
- package/dist/lib/solo-ticket-qa.d.ts +19 -0
- package/dist/lib/solo-ticket-qa.d.ts.map +1 -0
- package/dist/lib/solo-ticket-qa.js +68 -0
- package/dist/lib/solo-ticket-qa.js.map +1 -0
- package/dist/lib/solo-ticket-types.d.ts +146 -0
- package/dist/lib/solo-ticket-types.d.ts.map +1 -0
- package/dist/lib/solo-ticket-types.js +26 -0
- package/dist/lib/solo-ticket-types.js.map +1 -0
- package/dist/lib/solo-ticket.d.ts +12 -0
- package/dist/lib/solo-ticket.d.ts.map +1 -0
- package/dist/lib/solo-ticket.js +192 -0
- package/dist/lib/solo-ticket.js.map +1 -0
- package/dist/lib/solo-utils.d.ts +130 -0
- package/dist/lib/solo-utils.d.ts.map +1 -0
- package/dist/lib/solo-utils.js +277 -0
- package/dist/lib/solo-utils.js.map +1 -0
- package/dist/lib/spindle/failure-patterns.d.ts +15 -0
- package/dist/lib/spindle/failure-patterns.d.ts.map +1 -0
- package/dist/lib/spindle/failure-patterns.js +22 -0
- package/dist/lib/spindle/failure-patterns.js.map +1 -0
- package/dist/lib/spindle/format.d.ts +9 -0
- package/dist/lib/spindle/format.d.ts.map +1 -0
- package/dist/lib/spindle/format.js +37 -0
- package/dist/lib/spindle/format.js.map +1 -0
- package/dist/lib/spindle/index.d.ts +33 -0
- package/dist/lib/spindle/index.d.ts.map +1 -0
- package/dist/lib/spindle/index.js +231 -0
- package/dist/lib/spindle/index.js.map +1 -0
- package/dist/lib/spindle/oscillation.d.ts +17 -0
- package/dist/lib/spindle/oscillation.d.ts.map +1 -0
- package/dist/lib/spindle/oscillation.js +96 -0
- package/dist/lib/spindle/oscillation.js.map +1 -0
- package/dist/lib/spindle/repetition.d.ts +16 -0
- package/dist/lib/spindle/repetition.d.ts.map +1 -0
- package/dist/lib/spindle/repetition.js +52 -0
- package/dist/lib/spindle/repetition.js.map +1 -0
- package/dist/lib/spindle/similarity.d.ts +14 -0
- package/dist/lib/spindle/similarity.d.ts.map +1 -0
- package/dist/lib/spindle/similarity.js +58 -0
- package/dist/lib/spindle/similarity.js.map +1 -0
- package/dist/lib/spindle/types.d.ts +97 -0
- package/dist/lib/spindle/types.d.ts.map +1 -0
- package/dist/lib/spindle/types.js +46 -0
- package/dist/lib/spindle/types.js.map +1 -0
- package/dist/lib/spinner.d.ts +41 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +186 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/taste-profile.d.ts +26 -0
- package/dist/lib/taste-profile.d.ts.map +1 -0
- package/dist/lib/taste-profile.js +121 -0
- package/dist/lib/taste-profile.js.map +1 -0
- package/dist/lib/ticket-steps/index.d.ts +14 -0
- package/dist/lib/ticket-steps/index.d.ts.map +1 -0
- package/dist/lib/ticket-steps/index.js +13 -0
- package/dist/lib/ticket-steps/index.js.map +1 -0
- package/dist/lib/ticket-steps/step-agent.d.ts +6 -0
- package/dist/lib/ticket-steps/step-agent.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-agent.js +122 -0
- package/dist/lib/ticket-steps/step-agent.js.map +1 -0
- package/dist/lib/ticket-steps/step-cleanup.d.ts +6 -0
- package/dist/lib/ticket-steps/step-cleanup.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-cleanup.js +11 -0
- package/dist/lib/ticket-steps/step-cleanup.js.map +1 -0
- package/dist/lib/ticket-steps/step-commit.d.ts +6 -0
- package/dist/lib/ticket-steps/step-commit.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-commit.js +31 -0
- package/dist/lib/ticket-steps/step-commit.js.map +1 -0
- package/dist/lib/ticket-steps/step-pr.d.ts +6 -0
- package/dist/lib/ticket-steps/step-pr.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-pr.js +38 -0
- package/dist/lib/ticket-steps/step-pr.js.map +1 -0
- package/dist/lib/ticket-steps/step-push.d.ts +6 -0
- package/dist/lib/ticket-steps/step-push.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-push.js +35 -0
- package/dist/lib/ticket-steps/step-push.js.map +1 -0
- package/dist/lib/ticket-steps/step-qa.d.ts +6 -0
- package/dist/lib/ticket-steps/step-qa.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-qa.js +300 -0
- package/dist/lib/ticket-steps/step-qa.js.map +1 -0
- package/dist/lib/ticket-steps/step-scope.d.ts +6 -0
- package/dist/lib/ticket-steps/step-scope.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-scope.js +121 -0
- package/dist/lib/ticket-steps/step-scope.js.map +1 -0
- package/dist/lib/ticket-steps/step-spindle.d.ts +9 -0
- package/dist/lib/ticket-steps/step-spindle.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-spindle.js +160 -0
- package/dist/lib/ticket-steps/step-spindle.js.map +1 -0
- package/dist/lib/ticket-steps/step-worktree.d.ts +6 -0
- package/dist/lib/ticket-steps/step-worktree.d.ts.map +1 -0
- package/dist/lib/ticket-steps/step-worktree.js +157 -0
- package/dist/lib/ticket-steps/step-worktree.js.map +1 -0
- package/dist/lib/ticket-steps/types.d.ts +70 -0
- package/dist/lib/ticket-steps/types.d.ts.map +1 -0
- package/dist/lib/ticket-steps/types.js +8 -0
- package/dist/lib/ticket-steps/types.js.map +1 -0
- package/dist/lib/tool-command-map.d.ts +11 -0
- package/dist/lib/tool-command-map.d.ts.map +1 -0
- package/dist/lib/tool-command-map.js +24 -0
- package/dist/lib/tool-command-map.js.map +1 -0
- package/dist/lib/trajectory-generate.d.ts +24 -0
- package/dist/lib/trajectory-generate.d.ts.map +1 -0
- package/dist/lib/trajectory-generate.js +163 -0
- package/dist/lib/trajectory-generate.js.map +1 -0
- package/dist/lib/trajectory.d.ts +20 -0
- package/dist/lib/trajectory.d.ts.map +1 -0
- package/dist/lib/trajectory.js +104 -0
- package/dist/lib/trajectory.js.map +1 -0
- package/dist/lib/trigger-config.d.ts +12 -0
- package/dist/lib/trigger-config.d.ts.map +1 -0
- package/dist/lib/trigger-config.js +37 -0
- package/dist/lib/trigger-config.js.map +1 -0
- package/dist/lib/update-check.d.ts +28 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +178 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/wave-scheduling.d.ts +18 -0
- package/dist/lib/wave-scheduling.d.ts.map +1 -0
- package/dist/lib/wave-scheduling.js +29 -0
- package/dist/lib/wave-scheduling.js.map +1 -0
- package/dist/tui/app.d.ts +17 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +139 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/index.d.ts +10 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +9 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/poller.d.ts +42 -0
- package/dist/tui/poller.d.ts.map +1 -0
- package/dist/tui/poller.js +62 -0
- package/dist/tui/poller.js.map +1 -0
- package/dist/tui/screens/auto.d.ts +85 -0
- package/dist/tui/screens/auto.d.ts.map +1 -0
- package/dist/tui/screens/auto.js +440 -0
- package/dist/tui/screens/auto.js.map +1 -0
- package/dist/tui/screens/overview.d.ts +9 -0
- package/dist/tui/screens/overview.d.ts.map +1 -0
- package/dist/tui/screens/overview.js +189 -0
- package/dist/tui/screens/overview.js.map +1 -0
- package/dist/tui/state.d.ts +93 -0
- package/dist/tui/state.d.ts.map +1 -0
- package/dist/tui/state.js +169 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/ticket-output-buffer.d.ts +23 -0
- package/dist/tui/ticket-output-buffer.d.ts.map +1 -0
- package/dist/tui/ticket-output-buffer.js +60 -0
- package/dist/tui/ticket-output-buffer.js.map +1 -0
- package/dist/tui/types.d.ts +18 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +5 -0
- package/dist/tui/types.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic provider registry for CLI backends (Claude, Codex, Kimi, OpenAI-Local, etc.)
|
|
3
|
+
*
|
|
4
|
+
* Each provider defines metadata, auth requirements, and factory methods
|
|
5
|
+
* for creating scout and execution backends.
|
|
6
|
+
*/
|
|
7
|
+
import { claude } from './claude.js';
|
|
8
|
+
import { codex } from './codex.js';
|
|
9
|
+
import { kimi } from './kimi.js';
|
|
10
|
+
import { openaiLocal } from './openai-local.js';
|
|
11
|
+
const providers = new Map();
|
|
12
|
+
providers.set('claude', claude);
|
|
13
|
+
providers.set('codex', codex);
|
|
14
|
+
providers.set('kimi', kimi);
|
|
15
|
+
providers.set('openai-local', openaiLocal);
|
|
16
|
+
/**
|
|
17
|
+
* Get a provider config by name.
|
|
18
|
+
* Throws if the provider is not registered.
|
|
19
|
+
*/
|
|
20
|
+
export function getProvider(name) {
|
|
21
|
+
const provider = providers.get(name);
|
|
22
|
+
if (!provider) {
|
|
23
|
+
throw new Error(`Unknown provider: ${name}. Valid providers: ${getProviderNames().join(', ')}`);
|
|
24
|
+
}
|
|
25
|
+
return provider;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if a provider name is registered.
|
|
29
|
+
*/
|
|
30
|
+
export function isValidProvider(name) {
|
|
31
|
+
return providers.has(name);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered provider names.
|
|
35
|
+
*/
|
|
36
|
+
export function getProviderNames() {
|
|
37
|
+
return Array.from(providers.keys());
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEpD,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9B,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5B,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,sBAAsB,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/kimi.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,IAAI,EAAE,cAiBlB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi provider config
|
|
3
|
+
*/
|
|
4
|
+
export const kimi = {
|
|
5
|
+
displayName: 'Kimi',
|
|
6
|
+
defaultModel: 'kimi-k2.5',
|
|
7
|
+
apiKeyEnvVar: 'MOONSHOT_API_KEY',
|
|
8
|
+
altAuth: 'kimi /login',
|
|
9
|
+
guidelinesFile: 'KIMI.md',
|
|
10
|
+
defaultScoutTimeoutMs: 0,
|
|
11
|
+
defaultScoutConcurrency: 3,
|
|
12
|
+
defaultBatchTokenBudget: 40_000,
|
|
13
|
+
async createScoutBackend(opts) {
|
|
14
|
+
const { KimiScoutBackend } = await import('@promptwheel/core/scout');
|
|
15
|
+
return new KimiScoutBackend({ apiKey: opts.apiKey, model: opts.model });
|
|
16
|
+
},
|
|
17
|
+
async createExecutionBackend(opts) {
|
|
18
|
+
const { KimiExecutionBackend } = await import('../execution-backends/index.js');
|
|
19
|
+
return new KimiExecutionBackend({ apiKey: opts.apiKey, model: opts.model });
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=kimi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../../src/lib/providers/kimi.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,IAAI,GAAmB;IAClC,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,kBAAkB;IAChC,OAAO,EAAE,aAAa;IACtB,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,CAAC;IACxB,uBAAuB,EAAE,CAAC;IAC1B,uBAAuB,EAAE,MAAM;IAC/B,KAAK,CAAC,kBAAkB,CAAC,IAAI;QAC3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACrE,OAAO,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,sBAAsB,CAAC,IAAI;QAC/B,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAChF,OAAO,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible local provider (Ollama, vLLM, SGLang, LM Studio)
|
|
3
|
+
*
|
|
4
|
+
* Uses raw fetch — zero new dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProviderConfig } from './types.js';
|
|
7
|
+
export declare const openaiLocal: ProviderConfig;
|
|
8
|
+
//# sourceMappingURL=openai-local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-local.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/openai-local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,eAAO,MAAM,WAAW,EAAE,cAsBzB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible local provider (Ollama, vLLM, SGLang, LM Studio)
|
|
3
|
+
*
|
|
4
|
+
* Uses raw fetch — zero new dependencies.
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_BASE_URL = 'http://localhost:11434/v1';
|
|
7
|
+
export const openaiLocal = {
|
|
8
|
+
displayName: 'OpenAI-Compatible Local',
|
|
9
|
+
defaultModel: '', // Must be specified via --local-model
|
|
10
|
+
apiKeyEnvVar: null,
|
|
11
|
+
guidelinesFile: 'CLAUDE.md',
|
|
12
|
+
defaultScoutTimeoutMs: 0,
|
|
13
|
+
defaultScoutConcurrency: 2,
|
|
14
|
+
defaultBatchTokenBudget: 40_000,
|
|
15
|
+
async createScoutBackend(opts) {
|
|
16
|
+
const { OpenAILocalScoutBackend } = await import('@promptwheel/core/scout');
|
|
17
|
+
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
18
|
+
const model = opts.model || 'llama3';
|
|
19
|
+
const apiKey = process.env.LOCAL_API_KEY || process.env.OPENAI_API_KEY;
|
|
20
|
+
return new OpenAILocalScoutBackend({ baseUrl, model, apiKey });
|
|
21
|
+
},
|
|
22
|
+
async createExecutionBackend(opts) {
|
|
23
|
+
const { OpenAILocalExecutionBackend } = await import('../openai-local-execution.js');
|
|
24
|
+
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
25
|
+
const model = opts.model || 'llama3';
|
|
26
|
+
const apiKey = process.env.LOCAL_API_KEY || process.env.OPENAI_API_KEY;
|
|
27
|
+
return new OpenAILocalExecutionBackend({ baseUrl, model, apiKey, maxIterations: opts.maxIterations });
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=openai-local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-local.js","sourceRoot":"","sources":["../../../src/lib/providers/openai-local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,WAAW,EAAE,yBAAyB;IACtC,YAAY,EAAE,EAAE,EAAG,sCAAsC;IACzD,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,WAAW;IAC3B,qBAAqB,EAAE,CAAC;IACxB,uBAAuB,EAAE,CAAC;IAC1B,uBAAuB,EAAE,MAAM;IAC/B,KAAK,CAAC,kBAAkB,CAAC,IAAI;QAC3B,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACvE,OAAO,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,sBAAsB,CAAC,IAAI;QAC/B,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACvE,OAAO,IAAI,2BAA2B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACxG,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider configuration types
|
|
3
|
+
*/
|
|
4
|
+
import type { ScoutBackend } from '@promptwheel/core/scout';
|
|
5
|
+
import type { ExecutionBackend } from '../execution-backends/index.js';
|
|
6
|
+
export interface ProviderFactoryOpts {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ExecutionFactoryOpts extends ProviderFactoryOpts {
|
|
12
|
+
unsafeBypassSandbox?: boolean;
|
|
13
|
+
maxIterations?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ProviderConfig {
|
|
16
|
+
/** Human-readable name */
|
|
17
|
+
displayName: string;
|
|
18
|
+
/** Default model for this provider */
|
|
19
|
+
defaultModel: string;
|
|
20
|
+
/** Env var for API key authentication, or null if auth is handled differently */
|
|
21
|
+
apiKeyEnvVar: string | null;
|
|
22
|
+
/** Alternative auth description (e.g., "codex login") */
|
|
23
|
+
altAuth?: string;
|
|
24
|
+
/** Primary guidelines filename (CLAUDE.md, AGENTS.md, KIMI.md, etc.) */
|
|
25
|
+
guidelinesFile: string;
|
|
26
|
+
/** Default scout timeout in ms */
|
|
27
|
+
defaultScoutTimeoutMs: number;
|
|
28
|
+
/** Default scout concurrency */
|
|
29
|
+
defaultScoutConcurrency: number;
|
|
30
|
+
/** Default batch token budget */
|
|
31
|
+
defaultBatchTokenBudget: number;
|
|
32
|
+
/** Create a scout backend instance */
|
|
33
|
+
createScoutBackend(opts: ProviderFactoryOpts): Promise<ScoutBackend>;
|
|
34
|
+
/** Create an execution backend instance */
|
|
35
|
+
createExecutionBackend(opts: ExecutionFactoryOpts): Promise<ExecutionBackend>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gCAAgC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,iCAAiC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,sCAAsC;IACtC,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,2CAA2C;IAC3C,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-command QA statistics tracking.
|
|
3
|
+
*
|
|
4
|
+
* Persists to `.promptwheel/qa-stats.json` and provides:
|
|
5
|
+
* - Per-command success/failure/timeout tracking
|
|
6
|
+
* - Baseline result ring buffer for health monitoring
|
|
7
|
+
* - Auto-tuning of QA config (timeout adjustment)
|
|
8
|
+
* - Confidence calibration from quality signals
|
|
9
|
+
*
|
|
10
|
+
* Philosophy: failing baseline commands are never disabled — they're
|
|
11
|
+
* skipped during QA verification (via the pass/fail map) and surfaced
|
|
12
|
+
* to the scout as high-priority healing targets. Only timeout-related
|
|
13
|
+
* config issues cause command demotion.
|
|
14
|
+
*/
|
|
15
|
+
export interface QaCommandStats {
|
|
16
|
+
name: string;
|
|
17
|
+
totalRuns: number;
|
|
18
|
+
successes: number;
|
|
19
|
+
failures: number;
|
|
20
|
+
timeouts: number;
|
|
21
|
+
preExistingSkips: number;
|
|
22
|
+
totalDurationMs: number;
|
|
23
|
+
avgDurationMs: number;
|
|
24
|
+
lastRunAt: number;
|
|
25
|
+
consecutiveFailures: number;
|
|
26
|
+
consecutiveTimeouts: number;
|
|
27
|
+
/** Ring buffer of recent baseline results (max 10) */
|
|
28
|
+
recentBaselineResults: boolean[];
|
|
29
|
+
}
|
|
30
|
+
export interface QaStatsStore {
|
|
31
|
+
commands: Record<string, QaCommandStats>;
|
|
32
|
+
lastUpdated: number;
|
|
33
|
+
/** @deprecated — no longer used. Baseline-failing commands are skipped, not disabled. */
|
|
34
|
+
disabledCommands: Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
disabledAt: number;
|
|
38
|
+
}>;
|
|
39
|
+
/** Quality rate when calibrateConfidence last adjusted (hysteresis) */
|
|
40
|
+
lastCalibratedQualityRate: number | null;
|
|
41
|
+
}
|
|
42
|
+
/** Normalized QA config shape (matches normalizeQaConfig output) */
|
|
43
|
+
interface QaConfig {
|
|
44
|
+
commands: Array<{
|
|
45
|
+
name: string;
|
|
46
|
+
cmd: string;
|
|
47
|
+
cwd?: string;
|
|
48
|
+
timeoutMs?: number;
|
|
49
|
+
}>;
|
|
50
|
+
artifacts: {
|
|
51
|
+
dir: string;
|
|
52
|
+
maxLogBytes: number;
|
|
53
|
+
tailBytes: number;
|
|
54
|
+
};
|
|
55
|
+
retry: {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
maxAttempts: number;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export declare function loadQaStats(projectRoot: string): QaStatsStore;
|
|
61
|
+
/**
|
|
62
|
+
* Reset QA execution streaks for a fresh session start.
|
|
63
|
+
* Preserves the baseline ring buffer for health monitoring.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resetQaStatsForSession(projectRoot: string): void;
|
|
66
|
+
export declare function saveQaStats(projectRoot: string, store: QaStatsStore): void;
|
|
67
|
+
/**
|
|
68
|
+
* Record the result of a QA command execution.
|
|
69
|
+
*/
|
|
70
|
+
export declare function recordQaCommandResult(projectRoot: string, name: string, result: {
|
|
71
|
+
passed: boolean;
|
|
72
|
+
durationMs: number;
|
|
73
|
+
timedOut: boolean;
|
|
74
|
+
skippedPreExisting: boolean;
|
|
75
|
+
}): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Record a baseline check result (push to ring buffer).
|
|
78
|
+
*/
|
|
79
|
+
export declare function recordBaselineResult(projectRoot: string, name: string, passed: boolean): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get the success rate for a command (0-1).
|
|
82
|
+
*/
|
|
83
|
+
export declare function getCommandSuccessRate(stats: QaCommandStats): number;
|
|
84
|
+
/**
|
|
85
|
+
* Auto-tune QA config based on accumulated per-command stats.
|
|
86
|
+
*
|
|
87
|
+
* Only adjusts timeouts for slow commands and demotes commands that
|
|
88
|
+
* consistently time out (config issue, not healable by code changes).
|
|
89
|
+
*
|
|
90
|
+
* Baseline-failing commands are NEVER disabled — they're skipped during
|
|
91
|
+
* QA verification via the pass/fail map and surfaced to the scout as
|
|
92
|
+
* high-priority healing targets through the baseline health block.
|
|
93
|
+
*/
|
|
94
|
+
export declare function autoTuneQaConfig(projectRoot: string, qaConfig: QaConfig): {
|
|
95
|
+
config: QaConfig;
|
|
96
|
+
disabled: Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
reason: string;
|
|
99
|
+
}>;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Calibrate the minimum confidence threshold based on ticket-level quality
|
|
103
|
+
* signals from run-state (not QA command stats).
|
|
104
|
+
*
|
|
105
|
+
* Uses hysteresis to prevent oscillation: only adjusts if the quality rate
|
|
106
|
+
* has moved more than 15% from the rate at last calibration.
|
|
107
|
+
*
|
|
108
|
+
* Returns a delta to apply (positive = raise threshold, negative = lower).
|
|
109
|
+
*/
|
|
110
|
+
export declare function calibrateConfidence(projectRoot: string, currentMin: number, originalMin: number): number;
|
|
111
|
+
export declare function buildBaselineHealthBlock(projectRoot: string, currentScope?: string): string;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=qa-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-stats.d.ts","sourceRoot":"","sources":["../../src/lib/qa-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-command QA statistics tracking.
|
|
3
|
+
*
|
|
4
|
+
* Persists to `.promptwheel/qa-stats.json` and provides:
|
|
5
|
+
* - Per-command success/failure/timeout tracking
|
|
6
|
+
* - Baseline result ring buffer for health monitoring
|
|
7
|
+
* - Auto-tuning of QA config (timeout adjustment)
|
|
8
|
+
* - Confidence calibration from quality signals
|
|
9
|
+
*
|
|
10
|
+
* Philosophy: failing baseline commands are never disabled — they're
|
|
11
|
+
* skipped during QA verification (via the pass/fail map) and surfaced
|
|
12
|
+
* to the scout as high-priority healing targets. Only timeout-related
|
|
13
|
+
* config issues cause command demotion.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { readRunState } from './run-state.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Constants
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const QA_STATS_FILE = 'qa-stats.json';
|
|
22
|
+
const MAX_BASELINE_RING = 10;
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Async mutex (same pattern as run-state.ts)
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
let _writeLock = Promise.resolve();
|
|
27
|
+
function withWriteLock(fn) {
|
|
28
|
+
const prev = _writeLock;
|
|
29
|
+
let release;
|
|
30
|
+
_writeLock = new Promise((r) => { release = r; });
|
|
31
|
+
return prev.then(fn).finally(() => release());
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// File I/O
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
function statsPath(projectRoot) {
|
|
37
|
+
return path.join(projectRoot, '.promptwheel', QA_STATS_FILE);
|
|
38
|
+
}
|
|
39
|
+
export function loadQaStats(projectRoot) {
|
|
40
|
+
const fp = statsPath(projectRoot);
|
|
41
|
+
if (!fs.existsSync(fp)) {
|
|
42
|
+
return { commands: {}, lastUpdated: 0, disabledCommands: [], lastCalibratedQualityRate: null };
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const raw = fs.readFileSync(fp, 'utf8');
|
|
46
|
+
const parsed = JSON.parse(raw);
|
|
47
|
+
return {
|
|
48
|
+
commands: parsed.commands ?? {},
|
|
49
|
+
lastUpdated: parsed.lastUpdated ?? 0,
|
|
50
|
+
disabledCommands: Array.isArray(parsed.disabledCommands) ? parsed.disabledCommands : [],
|
|
51
|
+
lastCalibratedQualityRate: parsed.lastCalibratedQualityRate ?? null,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { commands: {}, lastUpdated: 0, disabledCommands: [], lastCalibratedQualityRate: null };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reset QA execution streaks for a fresh session start.
|
|
60
|
+
* Preserves the baseline ring buffer for health monitoring.
|
|
61
|
+
*/
|
|
62
|
+
export function resetQaStatsForSession(projectRoot) {
|
|
63
|
+
const fp = statsPath(projectRoot);
|
|
64
|
+
if (!fs.existsSync(fp))
|
|
65
|
+
return;
|
|
66
|
+
const store = loadQaStats(projectRoot);
|
|
67
|
+
if (Object.keys(store.commands).length === 0)
|
|
68
|
+
return;
|
|
69
|
+
for (const name of Object.keys(store.commands)) {
|
|
70
|
+
store.commands[name].consecutiveFailures = 0;
|
|
71
|
+
store.commands[name].consecutiveTimeouts = 0;
|
|
72
|
+
}
|
|
73
|
+
// Clear stale disabledCommands — organic healing never disables
|
|
74
|
+
store.disabledCommands = [];
|
|
75
|
+
saveQaStats(projectRoot, store);
|
|
76
|
+
}
|
|
77
|
+
export function saveQaStats(projectRoot, store) {
|
|
78
|
+
const fp = statsPath(projectRoot);
|
|
79
|
+
const dir = path.dirname(fp);
|
|
80
|
+
if (!fs.existsSync(dir)) {
|
|
81
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
store.lastUpdated = Date.now();
|
|
84
|
+
const tmp = fp + '.tmp';
|
|
85
|
+
fs.writeFileSync(tmp, JSON.stringify(store, null, 2) + '\n', 'utf8');
|
|
86
|
+
fs.renameSync(tmp, fp);
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Helpers
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
function ensureCommand(store, name) {
|
|
92
|
+
if (!store.commands[name]) {
|
|
93
|
+
store.commands[name] = {
|
|
94
|
+
name,
|
|
95
|
+
totalRuns: 0,
|
|
96
|
+
successes: 0,
|
|
97
|
+
failures: 0,
|
|
98
|
+
timeouts: 0,
|
|
99
|
+
preExistingSkips: 0,
|
|
100
|
+
totalDurationMs: 0,
|
|
101
|
+
avgDurationMs: 0,
|
|
102
|
+
lastRunAt: 0,
|
|
103
|
+
consecutiveFailures: 0,
|
|
104
|
+
consecutiveTimeouts: 0,
|
|
105
|
+
recentBaselineResults: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return store.commands[name];
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Core API
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Record the result of a QA command execution.
|
|
115
|
+
*/
|
|
116
|
+
export function recordQaCommandResult(projectRoot, name, result) {
|
|
117
|
+
return withWriteLock(() => {
|
|
118
|
+
const store = loadQaStats(projectRoot);
|
|
119
|
+
const stats = ensureCommand(store, name);
|
|
120
|
+
stats.totalRuns++;
|
|
121
|
+
stats.lastRunAt = Date.now();
|
|
122
|
+
if (result.skippedPreExisting) {
|
|
123
|
+
stats.preExistingSkips++;
|
|
124
|
+
// Don't count skips toward pass/fail streaks
|
|
125
|
+
}
|
|
126
|
+
else if (result.timedOut) {
|
|
127
|
+
stats.timeouts++;
|
|
128
|
+
stats.consecutiveTimeouts++;
|
|
129
|
+
stats.consecutiveFailures++;
|
|
130
|
+
}
|
|
131
|
+
else if (result.passed) {
|
|
132
|
+
stats.successes++;
|
|
133
|
+
stats.consecutiveFailures = 0;
|
|
134
|
+
stats.consecutiveTimeouts = 0;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
stats.failures++;
|
|
138
|
+
stats.consecutiveFailures++;
|
|
139
|
+
stats.consecutiveTimeouts = 0;
|
|
140
|
+
}
|
|
141
|
+
stats.totalDurationMs += result.durationMs;
|
|
142
|
+
stats.avgDurationMs = stats.totalRuns > 0
|
|
143
|
+
? Math.round(stats.totalDurationMs / stats.totalRuns)
|
|
144
|
+
: 0;
|
|
145
|
+
saveQaStats(projectRoot, store);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Record a baseline check result (push to ring buffer).
|
|
150
|
+
*/
|
|
151
|
+
export function recordBaselineResult(projectRoot, name, passed) {
|
|
152
|
+
return withWriteLock(() => {
|
|
153
|
+
const store = loadQaStats(projectRoot);
|
|
154
|
+
const stats = ensureCommand(store, name);
|
|
155
|
+
stats.recentBaselineResults.push(passed);
|
|
156
|
+
if (stats.recentBaselineResults.length > MAX_BASELINE_RING) {
|
|
157
|
+
stats.recentBaselineResults.shift();
|
|
158
|
+
}
|
|
159
|
+
saveQaStats(projectRoot, store);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the success rate for a command (0-1).
|
|
164
|
+
*/
|
|
165
|
+
export function getCommandSuccessRate(stats) {
|
|
166
|
+
if (stats.totalRuns === 0)
|
|
167
|
+
return -1;
|
|
168
|
+
return stats.successes / stats.totalRuns;
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Auto-Tune from Stats (timeout adjustment only)
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* Auto-tune QA config based on accumulated per-command stats.
|
|
175
|
+
*
|
|
176
|
+
* Only adjusts timeouts for slow commands and demotes commands that
|
|
177
|
+
* consistently time out (config issue, not healable by code changes).
|
|
178
|
+
*
|
|
179
|
+
* Baseline-failing commands are NEVER disabled — they're skipped during
|
|
180
|
+
* QA verification via the pass/fail map and surfaced to the scout as
|
|
181
|
+
* high-priority healing targets through the baseline health block.
|
|
182
|
+
*/
|
|
183
|
+
export function autoTuneQaConfig(projectRoot, qaConfig) {
|
|
184
|
+
const store = loadQaStats(projectRoot);
|
|
185
|
+
const disabled = [];
|
|
186
|
+
const keptCommands = [];
|
|
187
|
+
for (const cmd of qaConfig.commands) {
|
|
188
|
+
const stats = store.commands[cmd.name];
|
|
189
|
+
if (!stats) {
|
|
190
|
+
keptCommands.push(cmd);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Consecutive timeout demotion (config issue — wrong command, missing deps)
|
|
194
|
+
if (stats.consecutiveTimeouts >= 3 && stats.totalRuns >= 5) {
|
|
195
|
+
const reason = `${stats.consecutiveTimeouts} consecutive timeouts (${stats.totalRuns} total runs)`;
|
|
196
|
+
disabled.push({ name: cmd.name, reason });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
// Timeout adjustment for slow commands
|
|
200
|
+
const currentTimeout = cmd.timeoutMs ?? 120_000;
|
|
201
|
+
if (stats.avgDurationMs > currentTimeout * 0.8 && stats.totalRuns >= 5) {
|
|
202
|
+
const newTimeout = Math.round(currentTimeout * 1.5);
|
|
203
|
+
keptCommands.push({ ...cmd, timeoutMs: newTimeout });
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
keptCommands.push(cmd);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
saveQaStats(projectRoot, store);
|
|
210
|
+
return {
|
|
211
|
+
config: { ...qaConfig, commands: keptCommands },
|
|
212
|
+
disabled,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** Hysteresis band: only adjust if quality rate moved >15% from last calibration */
|
|
216
|
+
const HYSTERESIS_BAND = 0.15;
|
|
217
|
+
/**
|
|
218
|
+
* Calibrate the minimum confidence threshold based on ticket-level quality
|
|
219
|
+
* signals from run-state (not QA command stats).
|
|
220
|
+
*
|
|
221
|
+
* Uses hysteresis to prevent oscillation: only adjusts if the quality rate
|
|
222
|
+
* has moved more than 15% from the rate at last calibration.
|
|
223
|
+
*
|
|
224
|
+
* Returns a delta to apply (positive = raise threshold, negative = lower).
|
|
225
|
+
*/
|
|
226
|
+
export function calibrateConfidence(projectRoot, currentMin, originalMin) {
|
|
227
|
+
// Read ticket-level quality signals (scout accuracy), not QA command stats
|
|
228
|
+
const runState = readRunState(projectRoot);
|
|
229
|
+
const qs = runState.qualitySignals;
|
|
230
|
+
if (!qs || qs.totalTickets < 5)
|
|
231
|
+
return 0;
|
|
232
|
+
const qualityRate = qs.firstPassSuccess / qs.totalTickets;
|
|
233
|
+
// Hysteresis: check if rate moved enough from last calibration point
|
|
234
|
+
const store = loadQaStats(projectRoot);
|
|
235
|
+
if (store.lastCalibratedQualityRate !== null) {
|
|
236
|
+
const drift = Math.abs(qualityRate - store.lastCalibratedQualityRate);
|
|
237
|
+
if (drift < HYSTERESIS_BAND)
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
let delta = 0;
|
|
241
|
+
if (qualityRate < 0.6) {
|
|
242
|
+
delta = 5; // Raise threshold — scout is overestimating
|
|
243
|
+
}
|
|
244
|
+
else if (qualityRate > 0.9 && qs.totalTickets >= 10) {
|
|
245
|
+
// Lower threshold, but never below original
|
|
246
|
+
const newMin = currentMin - 5;
|
|
247
|
+
if (newMin >= originalMin) {
|
|
248
|
+
delta = -5;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (delta !== 0) {
|
|
252
|
+
// Persist the quality rate at which we calibrated (hysteresis anchor)
|
|
253
|
+
store.lastCalibratedQualityRate = qualityRate;
|
|
254
|
+
saveQaStats(projectRoot, store);
|
|
255
|
+
}
|
|
256
|
+
return delta;
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Baseline health block for scout prompt
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
export function buildBaselineHealthBlock(projectRoot, currentScope) {
|
|
262
|
+
const baselinePath = path.join(projectRoot, '.promptwheel', 'qa-baseline.json');
|
|
263
|
+
if (!fs.existsSync(baselinePath))
|
|
264
|
+
return '';
|
|
265
|
+
let data;
|
|
266
|
+
try {
|
|
267
|
+
data = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return '';
|
|
271
|
+
}
|
|
272
|
+
if (!data.failures?.length)
|
|
273
|
+
return '';
|
|
274
|
+
const details = data.details ?? {};
|
|
275
|
+
const lines = [
|
|
276
|
+
'<baseline-health>',
|
|
277
|
+
'## QA Baseline Failures (High Priority)',
|
|
278
|
+
'These QA commands fail BEFORE any changes (pre-existing).',
|
|
279
|
+
'Propose a targeted fix for one of these failures if it touches files in your current scope.',
|
|
280
|
+
'Healing these baselines is high-value work — it unblocks QA verification for all future tickets.',
|
|
281
|
+
'',
|
|
282
|
+
];
|
|
283
|
+
// Scope filter: extract sector prefix (e.g., "scripts" from "scripts/**")
|
|
284
|
+
const scopePrefix = currentScope?.replace(/\/?\*\*?$/, '').replace(/\/$/, '') || '';
|
|
285
|
+
for (const name of data.failures) {
|
|
286
|
+
const detail = details[name];
|
|
287
|
+
lines.push(`### ${name}`);
|
|
288
|
+
if (detail?.cmd)
|
|
289
|
+
lines.push(`Command: \`${detail.cmd}\``);
|
|
290
|
+
if (detail?.output) {
|
|
291
|
+
let outputLines = detail.output.split('\n');
|
|
292
|
+
// If scoped, filter to lines mentioning files in this sector
|
|
293
|
+
if (scopePrefix && scopePrefix !== '.') {
|
|
294
|
+
const scoped = outputLines.filter((l) => l.includes(scopePrefix));
|
|
295
|
+
if (scoped.length > 0)
|
|
296
|
+
outputLines = scoped;
|
|
297
|
+
}
|
|
298
|
+
// Cap at 30 lines to avoid prompt bloat
|
|
299
|
+
if (outputLines.length > 30) {
|
|
300
|
+
outputLines = [...outputLines.slice(0, 28), `... (${outputLines.length - 28} more lines)`];
|
|
301
|
+
}
|
|
302
|
+
lines.push('```');
|
|
303
|
+
lines.push(...outputLines);
|
|
304
|
+
lines.push('```');
|
|
305
|
+
}
|
|
306
|
+
lines.push('');
|
|
307
|
+
}
|
|
308
|
+
lines.push('</baseline-health>');
|
|
309
|
+
return lines.join('\n');
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=qa-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-stats.js","sourceRoot":"","sources":["../../src/lib/qa-stats.ts"],"names":[],"mappings":"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"}
|