@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,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solo mode git utilities
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
/**
|
|
7
|
+
* Mutex for serializing git operations on the main repo.
|
|
8
|
+
* Git doesn't support concurrent index operations on the same repo,
|
|
9
|
+
* so worktree setup (fetch, branch, worktree add) must be serialized.
|
|
10
|
+
* Once worktrees are created, per-worktree git ops are safe in parallel.
|
|
11
|
+
*/
|
|
12
|
+
let gitMutexPromise = Promise.resolve();
|
|
13
|
+
export function withGitMutex(fn) {
|
|
14
|
+
const prev = gitMutexPromise;
|
|
15
|
+
let resolve;
|
|
16
|
+
gitMutexPromise = new Promise((r) => { resolve = r; });
|
|
17
|
+
return prev.then(fn).finally(() => resolve());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Async git command execution — does not block the event loop.
|
|
21
|
+
* Used instead of execSync to allow parallel ticket execution.
|
|
22
|
+
*/
|
|
23
|
+
export async function gitExec(cmd, opts) {
|
|
24
|
+
const { exec } = await import('child_process');
|
|
25
|
+
const { promisify } = await import('util');
|
|
26
|
+
const execPromise = promisify(exec);
|
|
27
|
+
const result = await execPromise(cmd, {
|
|
28
|
+
cwd: opts.cwd,
|
|
29
|
+
encoding: opts.encoding || 'utf-8',
|
|
30
|
+
maxBuffer: opts.maxBuffer || 10 * 1024 * 1024,
|
|
31
|
+
});
|
|
32
|
+
return result.stdout;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Async git command execution using execFile — avoids shell interpolation.
|
|
36
|
+
* Use this instead of gitExec when arguments contain user-controlled data
|
|
37
|
+
* (e.g., ticket titles) to prevent shell injection.
|
|
38
|
+
*/
|
|
39
|
+
export async function gitExecFile(cmd, args, opts) {
|
|
40
|
+
const { execFile } = await import('child_process');
|
|
41
|
+
const { promisify } = await import('util');
|
|
42
|
+
const execFilePromise = promisify(execFile);
|
|
43
|
+
const result = await execFilePromise(cmd, args, {
|
|
44
|
+
cwd: opts.cwd,
|
|
45
|
+
encoding: 'utf-8',
|
|
46
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
47
|
+
});
|
|
48
|
+
return result.stdout;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Clean up worktree directory. Branch is left for merge or later pruning.
|
|
52
|
+
*/
|
|
53
|
+
export async function cleanupWorktree(repoRoot, worktreePath) {
|
|
54
|
+
try {
|
|
55
|
+
if (fs.existsSync(worktreePath)) {
|
|
56
|
+
await gitExec(`git worktree remove --force "${worktreePath}"`, { cwd: repoRoot });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Ignore worktree removal errors
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete a ticket branch after it has been merged.
|
|
65
|
+
*/
|
|
66
|
+
export async function deleteTicketBranch(repoRoot, branchName) {
|
|
67
|
+
try {
|
|
68
|
+
await gitExec(`git branch -D "${branchName}"`, { cwd: repoRoot });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Branch may already be deleted
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Delete a remote branch (non-fatal).
|
|
76
|
+
*/
|
|
77
|
+
export async function deleteRemoteBranch(repoRoot, branchName) {
|
|
78
|
+
try {
|
|
79
|
+
await gitExecFile('git', ['push', 'origin', '--delete', branchName], { cwd: repoRoot });
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Branch may not exist on remote, or no push access — non-fatal
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if the direct branch's PR was merged; if so, delete local+remote branch.
|
|
87
|
+
* Returns true if cleanup was performed.
|
|
88
|
+
*/
|
|
89
|
+
export async function cleanupMergedDirectBranch(repoRoot, branchName) {
|
|
90
|
+
try {
|
|
91
|
+
// Check if branch exists locally
|
|
92
|
+
await gitExecFile('git', ['rev-parse', '--verify', branchName], { cwd: repoRoot });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false; // branch doesn't exist
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
// Check if there's a merged PR for this branch
|
|
99
|
+
const raw = await gitExecFile('gh', ['pr', 'list', '--head', branchName, '--state', 'merged', '--json', 'url', '--limit', '1'], { cwd: repoRoot });
|
|
100
|
+
const prs = JSON.parse(raw.trim());
|
|
101
|
+
if (!Array.isArray(prs) || prs.length === 0)
|
|
102
|
+
return false;
|
|
103
|
+
// PR was merged — clean up local branch
|
|
104
|
+
await gitExecFile('git', ['branch', '-D', branchName], { cwd: repoRoot }).catch(() => { });
|
|
105
|
+
// Clean up remote branch (non-fatal)
|
|
106
|
+
await deleteRemoteBranch(repoRoot, branchName).catch(() => { });
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a milestone branch and persistent worktree for batch merging.
|
|
115
|
+
* Returns the branch name and worktree path.
|
|
116
|
+
*/
|
|
117
|
+
export async function createMilestoneBranch(repoRoot, baseBranch) {
|
|
118
|
+
const ts = Date.now().toString(36);
|
|
119
|
+
const milestoneBranch = `promptwheel/milestone-${ts}`;
|
|
120
|
+
const milestoneWorktreePath = path.join(repoRoot, '.promptwheel', 'worktrees', '_milestone');
|
|
121
|
+
await withGitMutex(async () => {
|
|
122
|
+
// Ensure worktrees dir exists
|
|
123
|
+
const worktreesDir = path.join(repoRoot, '.promptwheel', 'worktrees');
|
|
124
|
+
if (!fs.existsSync(worktreesDir)) {
|
|
125
|
+
fs.mkdirSync(worktreesDir, { recursive: true });
|
|
126
|
+
}
|
|
127
|
+
// Clean up any existing milestone worktree
|
|
128
|
+
if (fs.existsSync(milestoneWorktreePath)) {
|
|
129
|
+
await gitExec(`git worktree remove --force "${milestoneWorktreePath}"`, { cwd: repoRoot });
|
|
130
|
+
}
|
|
131
|
+
// Fetch latest
|
|
132
|
+
try {
|
|
133
|
+
await gitExec(`git fetch origin ${baseBranch}`, { cwd: repoRoot });
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Continue with what we have
|
|
137
|
+
}
|
|
138
|
+
// Create milestone branch from origin/baseBranch
|
|
139
|
+
try {
|
|
140
|
+
await gitExec(`git branch "${milestoneBranch}" "origin/${baseBranch}"`, { cwd: repoRoot });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Branch may already exist
|
|
144
|
+
}
|
|
145
|
+
await gitExec(`git worktree add "${milestoneWorktreePath}" "${milestoneBranch}"`, { cwd: repoRoot });
|
|
146
|
+
});
|
|
147
|
+
return { milestoneBranch, milestoneWorktreePath };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Merge a ticket branch into the milestone branch under git mutex.
|
|
151
|
+
* Returns success/conflict status.
|
|
152
|
+
*/
|
|
153
|
+
export async function mergeTicketToMilestone(repoRoot, ticketBranch, milestoneWorktreePath) {
|
|
154
|
+
return withGitMutex(async () => {
|
|
155
|
+
try {
|
|
156
|
+
await gitExecFile('git', ['merge', '--no-ff', ticketBranch, '-m', `Merge ${ticketBranch}`], {
|
|
157
|
+
cwd: milestoneWorktreePath,
|
|
158
|
+
});
|
|
159
|
+
return { success: true, conflicted: false };
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Abort the failed merge
|
|
163
|
+
try {
|
|
164
|
+
await gitExec('git merge --abort', { cwd: milestoneWorktreePath });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore abort errors
|
|
168
|
+
}
|
|
169
|
+
// Retry: rebase ticket branch onto milestone, then merge
|
|
170
|
+
const milestoneBranchName = (await gitExec('git rev-parse --abbrev-ref HEAD', {
|
|
171
|
+
cwd: milestoneWorktreePath,
|
|
172
|
+
})).trim();
|
|
173
|
+
try {
|
|
174
|
+
// Rebase the ticket branch onto the current milestone tip.
|
|
175
|
+
// Note: `git rebase <upstream> <branch>` switches HEAD to <branch>,
|
|
176
|
+
// so we must switch back to the milestone branch before merging.
|
|
177
|
+
await gitExecFile('git', ['rebase', milestoneBranchName, ticketBranch], {
|
|
178
|
+
cwd: repoRoot,
|
|
179
|
+
});
|
|
180
|
+
// Switch back to milestone branch (rebase left HEAD on ticketBranch)
|
|
181
|
+
await gitExecFile('git', ['checkout', milestoneBranchName], {
|
|
182
|
+
cwd: milestoneWorktreePath,
|
|
183
|
+
});
|
|
184
|
+
// Try merge again
|
|
185
|
+
await gitExecFile('git', ['merge', '--no-ff', ticketBranch, '-m', `Merge ${ticketBranch}`], {
|
|
186
|
+
cwd: milestoneWorktreePath,
|
|
187
|
+
});
|
|
188
|
+
return { success: true, conflicted: false };
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Abort any in-progress rebase or merge
|
|
192
|
+
try {
|
|
193
|
+
await gitExec('git rebase --abort', { cwd: repoRoot });
|
|
194
|
+
}
|
|
195
|
+
catch { /* ignore */ }
|
|
196
|
+
try {
|
|
197
|
+
await gitExec('git merge --abort', { cwd: milestoneWorktreePath });
|
|
198
|
+
}
|
|
199
|
+
catch { /* ignore */ }
|
|
200
|
+
// Restore HEAD to milestone branch if rebase left it on ticket branch
|
|
201
|
+
try {
|
|
202
|
+
await gitExecFile('git', ['checkout', milestoneBranchName], { cwd: milestoneWorktreePath });
|
|
203
|
+
}
|
|
204
|
+
catch { /* ignore */ }
|
|
205
|
+
return { success: false, conflicted: true };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Push milestone branch and create a squash-merge draft PR to the base branch.
|
|
212
|
+
* Returns the PR URL.
|
|
213
|
+
*/
|
|
214
|
+
export async function pushAndPrMilestone(repoRoot, milestoneBranch, milestoneWorktreePath, milestoneNumber, ticketCount, summaries) {
|
|
215
|
+
// Push safety: validate origin matches allowed remote
|
|
216
|
+
const { assertPushSafe } = await import('./solo-remote.js');
|
|
217
|
+
const { loadConfig } = await import('./solo-config.js');
|
|
218
|
+
const config = loadConfig(repoRoot);
|
|
219
|
+
await assertPushSafe(milestoneWorktreePath, config?.allowedRemote);
|
|
220
|
+
// Push the milestone branch
|
|
221
|
+
await gitExec(`git push -u origin "${milestoneBranch}"`, { cwd: milestoneWorktreePath });
|
|
222
|
+
// Build PR body
|
|
223
|
+
const bulletList = summaries.map(s => `- ${s}`).join('\n');
|
|
224
|
+
const title = `Milestone #${milestoneNumber}: ${ticketCount} improvements`;
|
|
225
|
+
const body = `## Milestone #${milestoneNumber}\n\n${ticketCount} tickets merged:\n\n${bulletList}\n\n---\n_Created by PromptWheel (milestone mode)_`;
|
|
226
|
+
try {
|
|
227
|
+
const prOutput = (await gitExecFile('gh', ['pr', 'create', '--title', title, '--body', body, '--head', milestoneBranch, '--draft'], { cwd: milestoneWorktreePath })).trim();
|
|
228
|
+
const urlMatch = prOutput.match(/https:\/\/github\.com\/[^\s]+/);
|
|
229
|
+
return urlMatch ? urlMatch[0] : undefined;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// PR might already exist for this branch — try to find it
|
|
233
|
+
try {
|
|
234
|
+
const existing = (await gitExec(`gh pr view "${milestoneBranch}" --json url --jq .url`, { cwd: milestoneWorktreePath })).trim();
|
|
235
|
+
if (existing.startsWith('https://'))
|
|
236
|
+
return existing;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// ignore
|
|
240
|
+
}
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Clean up the milestone worktree (but not the branch, which may have a PR).
|
|
246
|
+
*/
|
|
247
|
+
export async function cleanupMilestone(repoRoot) {
|
|
248
|
+
const milestoneWorktreePath = path.join(repoRoot, '.promptwheel', 'worktrees', '_milestone');
|
|
249
|
+
await cleanupWorktree(repoRoot, milestoneWorktreePath);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Fetch review comments from a PR for feedback ingestion.
|
|
253
|
+
* Non-fatal — returns [] on failure.
|
|
254
|
+
*/
|
|
255
|
+
export async function fetchPrReviewComments(repoRoot, prUrl) {
|
|
256
|
+
try {
|
|
257
|
+
const raw = await gitExecFile('gh', ['pr', 'view', prUrl, '--json', 'comments,reviews'], { cwd: repoRoot });
|
|
258
|
+
const parsed = JSON.parse(raw.trim());
|
|
259
|
+
const results = [];
|
|
260
|
+
// Extract from comments
|
|
261
|
+
if (Array.isArray(parsed.comments)) {
|
|
262
|
+
for (const c of parsed.comments) {
|
|
263
|
+
if (c.body && c.body.length > 20) {
|
|
264
|
+
results.push({ body: c.body, author: c.author?.login || 'unknown' });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Extract from reviews
|
|
269
|
+
if (Array.isArray(parsed.reviews)) {
|
|
270
|
+
for (const r of parsed.reviews) {
|
|
271
|
+
if (r.body && r.body.length > 20) {
|
|
272
|
+
results.push({ body: r.body, author: r.author?.login || 'unknown' });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return results;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/** Create/checkout the direct branch, branching from base if needed */
|
|
283
|
+
export async function ensureDirectBranch(repoRoot, branchName, baseBranch) {
|
|
284
|
+
await withGitMutex(async () => {
|
|
285
|
+
// Check if branch exists
|
|
286
|
+
try {
|
|
287
|
+
await gitExecFile('git', ['rev-parse', '--verify', branchName], { cwd: repoRoot });
|
|
288
|
+
// Branch exists — check it out
|
|
289
|
+
await gitExecFile('git', ['checkout', branchName], { cwd: repoRoot });
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// Branch doesn't exist — create from base
|
|
293
|
+
try {
|
|
294
|
+
await gitExecFile('git', ['fetch', 'origin', baseBranch], { cwd: repoRoot });
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Continue with what we have
|
|
298
|
+
}
|
|
299
|
+
// Try origin/baseBranch first, fall back to local baseBranch
|
|
300
|
+
let base;
|
|
301
|
+
try {
|
|
302
|
+
base = (await gitExecFile('git', ['rev-parse', '--verify', `origin/${baseBranch}`], { cwd: repoRoot })).trim();
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
base = (await gitExecFile('git', ['rev-parse', '--verify', baseBranch], { cwd: repoRoot })).trim();
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
await gitExecFile('git', ['checkout', '-b', branchName, base], { cwd: repoRoot });
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
if (err?.message?.includes('cannot lock ref') || err?.stderr?.includes('cannot lock ref')) {
|
|
312
|
+
throw new Error(`Cannot create branch "${branchName}" — a conflicting ref exists (e.g. "${branchName}/*" branches).\n` +
|
|
313
|
+
`This happens when milestone or ticket branches like "${branchName}/milestone-*" exist.\n` +
|
|
314
|
+
`Fix: delete the conflicting branches with \`git branch -D <branch>\` or set a different \`directBranch\` in .promptwheel/config.json.`);
|
|
315
|
+
}
|
|
316
|
+
throw err;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/** Push the direct branch to remote */
|
|
322
|
+
export async function pushDirectBranch(repoRoot, branchName) {
|
|
323
|
+
const { assertPushSafe } = await import('./solo-remote.js');
|
|
324
|
+
const { loadConfig } = await import('./solo-config.js');
|
|
325
|
+
const config = loadConfig(repoRoot);
|
|
326
|
+
await assertPushSafe(repoRoot, config?.allowedRemote);
|
|
327
|
+
await gitExecFile('git', ['push', '-u', 'origin', branchName], { cwd: repoRoot });
|
|
328
|
+
}
|
|
329
|
+
/** Create a summary PR from the direct branch → base */
|
|
330
|
+
export async function createDirectSummaryPr(repoRoot, branchName, baseBranch, title, body, draft) {
|
|
331
|
+
const args = ['pr', 'create', '--title', title, '--body', body, '--head', branchName, '--base', baseBranch];
|
|
332
|
+
if (draft)
|
|
333
|
+
args.push('--draft');
|
|
334
|
+
const prOutput = (await gitExecFile('gh', args, { cwd: repoRoot })).trim();
|
|
335
|
+
const urlMatch = prOutput.match(/https:\/\/github\.com\/[^\s]+/);
|
|
336
|
+
return urlMatch ? urlMatch[0] : prOutput;
|
|
337
|
+
}
|
|
338
|
+
/** Auto-merge a PR after CI passes (gh pr merge --auto --squash) */
|
|
339
|
+
export async function autoMergePr(repoRoot, prUrl) {
|
|
340
|
+
try {
|
|
341
|
+
await gitExecFile('gh', ['pr', 'merge', prUrl, '--auto', '--squash'], { cwd: repoRoot });
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
export async function checkPrStatuses(repoRoot, prUrls) {
|
|
349
|
+
const results = [];
|
|
350
|
+
for (const url of prUrls) {
|
|
351
|
+
try {
|
|
352
|
+
const raw = await gitExecFile('gh', ['pr', 'view', url, '--json', 'state,mergedAt,headRefName'], { cwd: repoRoot });
|
|
353
|
+
const parsed = JSON.parse(raw.trim());
|
|
354
|
+
const state = parsed.state === 'MERGED' ? 'merged'
|
|
355
|
+
: parsed.state === 'CLOSED' ? 'closed'
|
|
356
|
+
: 'open';
|
|
357
|
+
results.push({ url, state, mergedAt: parsed.mergedAt || undefined, branch: parsed.headRefName || undefined });
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
// Non-fatal — skip this PR
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return results;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=solo-git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-git.js","sourceRoot":"","sources":["../../src/lib/solo-git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hints system for live steering of auto mode.
|
|
3
|
+
*
|
|
4
|
+
* Multiple frontends (stdin listener, `solo nudge` CLI) write to
|
|
5
|
+
* `.promptwheel/hints.json`. The scout loop consumes pending hints
|
|
6
|
+
* and injects them into the scout prompt via `customPrompt`.
|
|
7
|
+
*/
|
|
8
|
+
export interface Hint {
|
|
9
|
+
id: string;
|
|
10
|
+
text: string;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
consumed: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read all hints from disk, pruning stale consumed ones.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readHints(repoRoot: string): Hint[];
|
|
18
|
+
/**
|
|
19
|
+
* Add a new hint. Returns the created hint.
|
|
20
|
+
*/
|
|
21
|
+
export declare function addHint(repoRoot: string, text: string): Hint;
|
|
22
|
+
/**
|
|
23
|
+
* Consume all pending (unconsumed) hints.
|
|
24
|
+
* Marks them as consumed and returns a formatted prompt block,
|
|
25
|
+
* or null if there are no pending hints.
|
|
26
|
+
*/
|
|
27
|
+
export declare function consumePendingHints(repoRoot: string): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all hints.
|
|
30
|
+
*/
|
|
31
|
+
export declare function clearHints(repoRoot: string): void;
|
|
32
|
+
//# sourceMappingURL=solo-hints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-hints.d.ts","sourceRoot":"","sources":["../../src/lib/solo-hints.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAmBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAsBlD;AAgBD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAY5D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAanE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hints system for live steering of auto mode.
|
|
3
|
+
*
|
|
4
|
+
* Multiple frontends (stdin listener, `solo nudge` CLI) write to
|
|
5
|
+
* `.promptwheel/hints.json`. The scout loop consumes pending hints
|
|
6
|
+
* and injects them into the scout prompt via `customPrompt`.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as crypto from 'node:crypto';
|
|
11
|
+
const HINTS_FILE = 'hints.json';
|
|
12
|
+
const HINTS_TMP = 'hints.json.tmp';
|
|
13
|
+
const MAX_HINT_LENGTH = 500;
|
|
14
|
+
const PRUNE_AGE_MS = 60 * 60 * 1000; // 1 hour
|
|
15
|
+
function hintsPath(repoRoot) {
|
|
16
|
+
return path.join(repoRoot, '.promptwheel', HINTS_FILE);
|
|
17
|
+
}
|
|
18
|
+
function hintsTmpPath(repoRoot) {
|
|
19
|
+
return path.join(repoRoot, '.promptwheel', HINTS_TMP);
|
|
20
|
+
}
|
|
21
|
+
function generateId() {
|
|
22
|
+
return crypto.randomBytes(8).toString('hex');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read all hints from disk, pruning stale consumed ones.
|
|
26
|
+
*/
|
|
27
|
+
export function readHints(repoRoot) {
|
|
28
|
+
const fp = hintsPath(repoRoot);
|
|
29
|
+
if (!fs.existsSync(fp))
|
|
30
|
+
return [];
|
|
31
|
+
try {
|
|
32
|
+
const raw = fs.readFileSync(fp, 'utf-8');
|
|
33
|
+
const hints = JSON.parse(raw);
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
// Prune consumed hints older than 1 hour
|
|
36
|
+
const kept = hints.filter((h) => !(h.consumed && now - h.createdAt > PRUNE_AGE_MS));
|
|
37
|
+
if (kept.length !== hints.length) {
|
|
38
|
+
atomicWrite(repoRoot, kept);
|
|
39
|
+
}
|
|
40
|
+
return kept;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Atomically write hints array to disk.
|
|
48
|
+
*/
|
|
49
|
+
function atomicWrite(repoRoot, hints) {
|
|
50
|
+
const dir = path.join(repoRoot, '.promptwheel');
|
|
51
|
+
if (!fs.existsSync(dir)) {
|
|
52
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
const tmp = hintsTmpPath(repoRoot);
|
|
55
|
+
const target = hintsPath(repoRoot);
|
|
56
|
+
fs.writeFileSync(tmp, JSON.stringify(hints, null, 2), 'utf-8');
|
|
57
|
+
fs.renameSync(tmp, target);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add a new hint. Returns the created hint.
|
|
61
|
+
*/
|
|
62
|
+
export function addHint(repoRoot, text) {
|
|
63
|
+
const truncated = text.slice(0, MAX_HINT_LENGTH);
|
|
64
|
+
const hints = readHints(repoRoot);
|
|
65
|
+
const hint = {
|
|
66
|
+
id: generateId(),
|
|
67
|
+
text: truncated,
|
|
68
|
+
createdAt: Date.now(),
|
|
69
|
+
consumed: false,
|
|
70
|
+
};
|
|
71
|
+
hints.push(hint);
|
|
72
|
+
atomicWrite(repoRoot, hints);
|
|
73
|
+
return hint;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Consume all pending (unconsumed) hints.
|
|
77
|
+
* Marks them as consumed and returns a formatted prompt block,
|
|
78
|
+
* or null if there are no pending hints.
|
|
79
|
+
*/
|
|
80
|
+
export function consumePendingHints(repoRoot) {
|
|
81
|
+
const hints = readHints(repoRoot);
|
|
82
|
+
const pending = hints.filter((h) => !h.consumed);
|
|
83
|
+
if (pending.length === 0)
|
|
84
|
+
return null;
|
|
85
|
+
for (const h of pending) {
|
|
86
|
+
h.consumed = true;
|
|
87
|
+
}
|
|
88
|
+
atomicWrite(repoRoot, hints);
|
|
89
|
+
const lines = pending.map((h) => `- "${h.text}"`).join('\n');
|
|
90
|
+
return `\n## User Steering Hints\n${lines}`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Clear all hints.
|
|
94
|
+
*/
|
|
95
|
+
export function clearHints(repoRoot) {
|
|
96
|
+
atomicWrite(repoRoot, []);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=solo-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-hints.js","sourceRoot":"","sources":["../../src/lib/solo-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build execution prompts for solo ticket runs
|
|
3
|
+
*/
|
|
4
|
+
import type { tickets } from '@promptwheel/core/repos';
|
|
5
|
+
/**
|
|
6
|
+
* Build the prompt for Claude from a ticket
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildTicketPrompt(ticket: NonNullable<Awaited<ReturnType<typeof tickets.getById>>>, guidelinesContext?: string, learningsContext?: string, metadataContext?: string, opts?: {
|
|
9
|
+
confidence?: number;
|
|
10
|
+
complexity?: string;
|
|
11
|
+
}): string;
|
|
12
|
+
//# sourceMappingURL=solo-prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-prompt-builder.d.ts","sourceRoot":"","sources":["../../src/lib/solo-prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAqEhP"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build execution prompts for solo ticket runs
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Build the prompt for Claude from a ticket
|
|
6
|
+
*/
|
|
7
|
+
export function buildTicketPrompt(ticket, guidelinesContext, learningsContext, metadataContext, opts) {
|
|
8
|
+
const parts = [];
|
|
9
|
+
// Planning preamble for uncertain or complex changes
|
|
10
|
+
const confidence = opts?.confidence;
|
|
11
|
+
const complexity = opts?.complexity;
|
|
12
|
+
if ((confidence !== undefined && confidence < 50) || complexity === 'moderate' || complexity === 'complex') {
|
|
13
|
+
parts.push('## Approach — This is a complex change', '', `The automated analysis flagged this as uncertain (confidence: ${confidence ?? '?'}%). Before writing code:`, '1. Read all relevant files to understand the full context', '2. Identify all touch points and potential side effects', '3. Write out your implementation plan before making changes', '4. Implement incrementally, verifying at each step', '');
|
|
14
|
+
}
|
|
15
|
+
if (guidelinesContext) {
|
|
16
|
+
parts.push(guidelinesContext, '');
|
|
17
|
+
}
|
|
18
|
+
if (metadataContext) {
|
|
19
|
+
parts.push(metadataContext, '');
|
|
20
|
+
}
|
|
21
|
+
if (learningsContext) {
|
|
22
|
+
parts.push(learningsContext, '');
|
|
23
|
+
}
|
|
24
|
+
parts.push(`# Task: ${ticket.title}`, '', ticket.description ?? '', '');
|
|
25
|
+
if (ticket.allowedPaths.length > 0) {
|
|
26
|
+
parts.push('## Allowed Paths');
|
|
27
|
+
parts.push('Only modify files in these paths:');
|
|
28
|
+
for (const p of ticket.allowedPaths) {
|
|
29
|
+
parts.push(`- ${p}`);
|
|
30
|
+
}
|
|
31
|
+
parts.push('');
|
|
32
|
+
}
|
|
33
|
+
if (ticket.forbiddenPaths.length > 0) {
|
|
34
|
+
parts.push('## Forbidden Paths');
|
|
35
|
+
parts.push('Do NOT modify files in these paths:');
|
|
36
|
+
for (const p of ticket.forbiddenPaths) {
|
|
37
|
+
parts.push(`- ${p}`);
|
|
38
|
+
}
|
|
39
|
+
parts.push('');
|
|
40
|
+
}
|
|
41
|
+
parts.push('## Verification');
|
|
42
|
+
parts.push('QA verification is handled automatically AFTER your changes — do NOT run test suites yourself.');
|
|
43
|
+
parts.push('Running tests wastes your time budget and they may have pre-existing failures unrelated to your work.');
|
|
44
|
+
parts.push('Focus only on making the code changes correctly.');
|
|
45
|
+
parts.push('');
|
|
46
|
+
parts.push('## Instructions');
|
|
47
|
+
parts.push('1. Analyze the codebase to understand the context');
|
|
48
|
+
parts.push('2. Implement the required changes');
|
|
49
|
+
parts.push('3. Keep changes minimal and focused');
|
|
50
|
+
parts.push('4. Do NOT run test/build/lint commands — QA is automated after you finish');
|
|
51
|
+
return parts.join('\n');
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=solo-prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-prompt-builder.js","sourceRoot":"","sources":["../../src/lib/solo-prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAgE,EAAE,iBAA0B,EAAE,gBAAyB,EAAE,eAAwB,EAAE,IAAmD;IACtO,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,qDAAqD;IACrD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;IACpC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3G,KAAK,CAAC,IAAI,CACR,wCAAwC,EACxC,EAAE,EACF,iEAAiE,UAAU,IAAI,GAAG,0BAA0B,EAC5G,2DAA2D,EAC3D,yDAAyD,EACzD,6DAA6D,EAC7D,oDAAoD,EACpD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,WAAW,MAAM,CAAC,KAAK,EAAE,EACzB,EAAE,EACF,MAAM,CAAC,WAAW,IAAI,EAAE,EACxB,EAAE,CACH,CAAC;IAEF,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IAC7G,KAAK,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;IACpH,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAExF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA failure detection and retry-with-test-fix logic
|
|
3
|
+
*/
|
|
4
|
+
import type { DatabaseAdapter } from '@promptwheel/core/db';
|
|
5
|
+
import { getQaRunDetails } from '@promptwheel/core/services';
|
|
6
|
+
import type { tickets } from '@promptwheel/core/repos';
|
|
7
|
+
import type { ExecutionBackend } from './execution-backends/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if a QA failure is a test failure (vitest/jest/pytest etc.)
|
|
10
|
+
*/
|
|
11
|
+
export declare function isTestFailure(failedStepName: string | undefined): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Extract test file paths from QA error output
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractTestFilesFromQaOutput(output: string): string[];
|
|
16
|
+
export interface QaRetryContext {
|
|
17
|
+
ticket: NonNullable<Awaited<ReturnType<typeof tickets.getById>>>;
|
|
18
|
+
worktreePath: string;
|
|
19
|
+
execBackend: ExecutionBackend;
|
|
20
|
+
timeoutMs: number;
|
|
21
|
+
verbose: boolean;
|
|
22
|
+
onProgress: (msg: string) => void;
|
|
23
|
+
adapter: DatabaseAdapter;
|
|
24
|
+
projectId: string;
|
|
25
|
+
qaConfig: any;
|
|
26
|
+
guidelinesContext?: string;
|
|
27
|
+
learningsContext?: string;
|
|
28
|
+
metadataContext?: string;
|
|
29
|
+
qaDetails: Awaited<ReturnType<typeof getQaRunDetails>>;
|
|
30
|
+
failedStepName: string | undefined;
|
|
31
|
+
}
|
|
32
|
+
export interface QaRetryResult {
|
|
33
|
+
retried: boolean;
|
|
34
|
+
success: boolean;
|
|
35
|
+
qaRunId?: string;
|
|
36
|
+
errorParts?: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Attempt to retry a QA failure by expanding scope to include test files
|
|
40
|
+
* and asking the agent to fix them.
|
|
41
|
+
*/
|
|
42
|
+
export declare function runQaRetryWithTestFix(ctx: QaRetryContext): Promise<QaRetryResult>;
|
|
43
|
+
//# sourceMappingURL=solo-qa-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-qa-retry.d.ts","sourceRoot":"","sources":["../../src/lib/solo-qa-retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAS,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE;;GAEG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIzE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBrE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;IACvD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAiGvF"}
|