@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,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exclusion index — discovers what artifact patterns a project generates
|
|
3
|
+
* by scanning for indicator files (lockfiles, configs, build manifests)
|
|
4
|
+
* and writes any patterns missing from .gitignore to the worktree's
|
|
5
|
+
* .git/info/exclude so `git status` filters them natively.
|
|
6
|
+
*
|
|
7
|
+
* Detection is organic: the project's own files tell us what frameworks
|
|
8
|
+
* and languages are in use, and therefore what artifact directories will
|
|
9
|
+
* exist. The INDICATOR_MAP below is a knowledge base that drives
|
|
10
|
+
* detection — it only fires when we actually find the indicator file in
|
|
11
|
+
* the worktree, not unconditionally.
|
|
12
|
+
*
|
|
13
|
+
* As a second layer, solo-ticket.ts captures a baseline `git status`
|
|
14
|
+
* snapshot after dep install (before the agent runs). Anything present
|
|
15
|
+
* in the baseline is subtracted from the post-agent status, so even
|
|
16
|
+
* artifacts the indicator map doesn't know about are filtered out.
|
|
17
|
+
*
|
|
18
|
+
* Note: the enterprise worker path (src/worker/) uses `git diff --name-only`
|
|
19
|
+
* which only shows tracked changes and is not affected by untracked
|
|
20
|
+
* artifacts. This module is only used by the CLI solo path.
|
|
21
|
+
*/
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
// ─── Knowledge base ───────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Map from indicator filenames to the artifact patterns that framework generates.
|
|
27
|
+
* When we find an indicator file in the worktree, we know those artifact paths
|
|
28
|
+
* may appear and should be excluded from scope validation.
|
|
29
|
+
*/
|
|
30
|
+
const INDICATOR_MAP = {
|
|
31
|
+
// ── Node.js / JavaScript / TypeScript ──
|
|
32
|
+
'package.json': ['node_modules/'],
|
|
33
|
+
'next.config.js': ['.next/'],
|
|
34
|
+
'next.config.mjs': ['.next/'],
|
|
35
|
+
'next.config.ts': ['.next/'],
|
|
36
|
+
'nuxt.config.ts': ['.nuxt/', '.output/'],
|
|
37
|
+
'nuxt.config.js': ['.nuxt/', '.output/'],
|
|
38
|
+
'svelte.config.js': ['.svelte-kit/'],
|
|
39
|
+
'turbo.json': ['.turbo/'],
|
|
40
|
+
'vite.config.ts': ['dist/'],
|
|
41
|
+
'vite.config.js': ['dist/'],
|
|
42
|
+
'rollup.config.js': ['dist/'],
|
|
43
|
+
'rollup.config.mjs': ['dist/'],
|
|
44
|
+
'webpack.config.js': ['dist/', 'build/'],
|
|
45
|
+
'webpack.config.ts': ['dist/', 'build/'],
|
|
46
|
+
'.parcelrc': ['.parcel-cache/'],
|
|
47
|
+
'tsconfig.json': ['*.tsbuildinfo'],
|
|
48
|
+
// ── Python ──
|
|
49
|
+
'pyproject.toml': ['__pycache__/', '*.pyc', '.venv/', 'venv/', '.pytest_cache/', '.mypy_cache/', '.ruff_cache/'],
|
|
50
|
+
'requirements.txt': ['__pycache__/', '*.pyc', '.venv/', 'venv/', '.eggs/', '*.egg-info/'],
|
|
51
|
+
'Pipfile': ['__pycache__/', '*.pyc', '.venv/'],
|
|
52
|
+
'setup.py': ['__pycache__/', '*.pyc', '*.egg-info/', 'dist/', 'build/'],
|
|
53
|
+
'setup.cfg': ['__pycache__/', '*.pyc', '*.egg-info/'],
|
|
54
|
+
// ── Rust ──
|
|
55
|
+
'Cargo.toml': ['target/'],
|
|
56
|
+
// ── Go ──
|
|
57
|
+
'go.mod': ['vendor/'],
|
|
58
|
+
// ── PHP ──
|
|
59
|
+
'composer.json': ['vendor/'],
|
|
60
|
+
// ── Ruby ──
|
|
61
|
+
'Gemfile': ['.bundle/', 'vendor/bundle/'],
|
|
62
|
+
// ── Elixir ──
|
|
63
|
+
'mix.exs': ['_build/', 'deps/', '.elixir_ls/'],
|
|
64
|
+
// ── Java / Kotlin / Scala ──
|
|
65
|
+
'pom.xml': ['target/'],
|
|
66
|
+
'build.gradle': ['build/', '.gradle/'],
|
|
67
|
+
'build.gradle.kts': ['build/', '.gradle/'],
|
|
68
|
+
// ── .NET / C# ──
|
|
69
|
+
// *.csproj and *.sln handled via extension check below
|
|
70
|
+
// ── Swift ──
|
|
71
|
+
'Package.swift': ['.build/', '.swiftpm/'],
|
|
72
|
+
// ── Dart / Flutter ──
|
|
73
|
+
'pubspec.yaml': ['.dart_tool/', 'build/'],
|
|
74
|
+
// ── Coverage / testing tools ──
|
|
75
|
+
'jest.config.js': ['coverage/'],
|
|
76
|
+
'jest.config.ts': ['coverage/'],
|
|
77
|
+
'vitest.config.ts': ['coverage/'],
|
|
78
|
+
'vitest.config.js': ['coverage/'],
|
|
79
|
+
'pytest.ini': ['.pytest_cache/'],
|
|
80
|
+
'.nycrc': ['coverage/', '.nyc_output/'],
|
|
81
|
+
'.nycrc.json': ['coverage/', '.nyc_output/'],
|
|
82
|
+
// ── PromptWheel internals ──
|
|
83
|
+
'.promptwheel': ['.promptwheel/'],
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Extension-based indicators for project types where the config filename
|
|
87
|
+
* isn't fixed (e.g. *.csproj, *.sln for .NET).
|
|
88
|
+
*/
|
|
89
|
+
const EXTENSION_INDICATORS = {
|
|
90
|
+
'.csproj': ['bin/', 'obj/'],
|
|
91
|
+
'.fsproj': ['bin/', 'obj/'],
|
|
92
|
+
'.sln': ['bin/', 'obj/'],
|
|
93
|
+
};
|
|
94
|
+
// ─── Derived constants ────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Directories to skip when scanning for indicators.
|
|
97
|
+
* Derived automatically from INDICATOR_MAP + EXTENSION_INDICATORS values
|
|
98
|
+
* so there is no separate list to maintain — if an artifact pattern is
|
|
99
|
+
* added above, the scanner will skip it during traversal too.
|
|
100
|
+
*/
|
|
101
|
+
const SCAN_SKIP = /* @__PURE__ */ (() => {
|
|
102
|
+
// VCS internals are always skipped even though they aren't in the map.
|
|
103
|
+
const dirs = new Set(['.git', '.hg', '.svn']);
|
|
104
|
+
const allPatterns = [
|
|
105
|
+
...Object.values(INDICATOR_MAP).flat(),
|
|
106
|
+
...Object.values(EXTENSION_INDICATORS).flat(),
|
|
107
|
+
];
|
|
108
|
+
for (const p of allPatterns) {
|
|
109
|
+
// 'node_modules/' → 'node_modules', '.next/' → '.next'
|
|
110
|
+
if (p.endsWith('/'))
|
|
111
|
+
dirs.add(p.slice(0, -1));
|
|
112
|
+
}
|
|
113
|
+
return dirs;
|
|
114
|
+
})();
|
|
115
|
+
/** Marker written to the exclude file so we can detect prior runs. */
|
|
116
|
+
const EXCLUDE_MARKER = '# Auto-discovered by PromptWheel exclusion index';
|
|
117
|
+
// ─── Internal helpers ─────────────────────────────────────────────
|
|
118
|
+
/**
|
|
119
|
+
* Scan a directory tree for indicator files and collect the artifact
|
|
120
|
+
* patterns they imply.
|
|
121
|
+
*/
|
|
122
|
+
function scanIndicators(dir, patterns, depth, maxDepth) {
|
|
123
|
+
if (depth > maxDepth)
|
|
124
|
+
return;
|
|
125
|
+
let entries;
|
|
126
|
+
try {
|
|
127
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
const name = entry.name;
|
|
134
|
+
// Check exact-name indicators
|
|
135
|
+
if (INDICATOR_MAP[name]) {
|
|
136
|
+
for (const p of INDICATOR_MAP[name])
|
|
137
|
+
patterns.add(p);
|
|
138
|
+
}
|
|
139
|
+
// Check extension-based indicators
|
|
140
|
+
for (const ext of Object.keys(EXTENSION_INDICATORS)) {
|
|
141
|
+
if (name.endsWith(ext)) {
|
|
142
|
+
for (const p of EXTENSION_INDICATORS[ext])
|
|
143
|
+
patterns.add(p);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Recurse into subdirectories, skipping artifact dirs and hidden dirs
|
|
148
|
+
if (entry.isDirectory() && !SCAN_SKIP.has(name) && !name.startsWith('.')) {
|
|
149
|
+
scanIndicators(path.join(dir, name), patterns, depth + 1, maxDepth);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Resolve the git common directory for a worktree.
|
|
155
|
+
*
|
|
156
|
+
* Git reads `info/exclude` from the *common* dir — not the per-worktree
|
|
157
|
+
* dir. For a normal repo `.git/` IS the common dir. For a linked
|
|
158
|
+
* worktree `.git` is a file pointing to `.git/worktrees/<name>/`; the
|
|
159
|
+
* common dir is its grandparent (`.git/`).
|
|
160
|
+
*
|
|
161
|
+
* Exported for testing.
|
|
162
|
+
*/
|
|
163
|
+
export function resolveGitDir(worktreePath) {
|
|
164
|
+
const gitPath = path.join(worktreePath, '.git');
|
|
165
|
+
let stat;
|
|
166
|
+
try {
|
|
167
|
+
stat = fs.statSync(gitPath);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return gitPath; // Doesn't exist yet — return default path
|
|
171
|
+
}
|
|
172
|
+
// Normal repo — .git is already the common dir
|
|
173
|
+
if (stat.isDirectory())
|
|
174
|
+
return gitPath;
|
|
175
|
+
// Linked worktree: .git is a file containing "gitdir: /path/to/..."
|
|
176
|
+
// e.g. "gitdir: /repo/.git/worktrees/my-ticket"
|
|
177
|
+
const content = fs.readFileSync(gitPath, 'utf-8').trim();
|
|
178
|
+
const match = content.match(/^gitdir:\s+(.+)$/);
|
|
179
|
+
if (match) {
|
|
180
|
+
const worktreeGitDir = path.isAbsolute(match[1])
|
|
181
|
+
? match[1]
|
|
182
|
+
: path.resolve(worktreePath, match[1]);
|
|
183
|
+
// Walk up to the common dir: .git/worktrees/<name> → .git/
|
|
184
|
+
// The worktree gitdir is always <common>/worktrees/<name>
|
|
185
|
+
const worktreesParent = path.dirname(worktreeGitDir);
|
|
186
|
+
if (path.basename(worktreesParent) === 'worktrees') {
|
|
187
|
+
return path.dirname(worktreesParent);
|
|
188
|
+
}
|
|
189
|
+
// Fallback: return the worktree gitdir itself
|
|
190
|
+
return worktreeGitDir;
|
|
191
|
+
}
|
|
192
|
+
return gitPath;
|
|
193
|
+
}
|
|
194
|
+
// ─── Public API ───────────────────────────────────────────────────
|
|
195
|
+
/**
|
|
196
|
+
* Build an exclusion index for a worktree by scanning the project tree
|
|
197
|
+
* for indicator files and writing any inferred artifact patterns to
|
|
198
|
+
* `.git/info/exclude`.
|
|
199
|
+
*
|
|
200
|
+
* Call this after worktree creation but before installing dependencies
|
|
201
|
+
* or running the agent. After this, `git status --porcelain` natively
|
|
202
|
+
* filters out all discovered artifact directories.
|
|
203
|
+
*
|
|
204
|
+
* Idempotent — safe to call multiple times on the same worktree
|
|
205
|
+
* (e.g. on ticket retry). Subsequent calls are no-ops.
|
|
206
|
+
*
|
|
207
|
+
* @param worktreePath - Absolute path to the worktree root
|
|
208
|
+
* @param maxDepth - How deep to scan for indicators (default 4, sufficient for monorepos)
|
|
209
|
+
* @returns List of patterns written to the exclude file (empty on no-op)
|
|
210
|
+
*/
|
|
211
|
+
export function buildExclusionIndex(worktreePath, maxDepth = 4) {
|
|
212
|
+
const patterns = new Set();
|
|
213
|
+
// Scan the worktree for indicator files
|
|
214
|
+
scanIndicators(worktreePath, patterns, 0, maxDepth);
|
|
215
|
+
if (patterns.size === 0)
|
|
216
|
+
return [];
|
|
217
|
+
const patternList = [...patterns].sort();
|
|
218
|
+
// Write to .git/info/exclude (worktree-local, never committed)
|
|
219
|
+
try {
|
|
220
|
+
const gitDir = resolveGitDir(worktreePath);
|
|
221
|
+
const infoDir = path.join(gitDir, 'info');
|
|
222
|
+
if (!fs.existsSync(infoDir)) {
|
|
223
|
+
fs.mkdirSync(infoDir, { recursive: true });
|
|
224
|
+
}
|
|
225
|
+
const excludePath = path.join(infoDir, 'exclude');
|
|
226
|
+
// Idempotency: if we've already written, don't append again
|
|
227
|
+
try {
|
|
228
|
+
const existing = fs.readFileSync(excludePath, 'utf-8');
|
|
229
|
+
if (existing.includes(EXCLUDE_MARKER)) {
|
|
230
|
+
return patternList;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// File doesn't exist yet — that's fine, we'll create it
|
|
235
|
+
}
|
|
236
|
+
const block = [
|
|
237
|
+
'',
|
|
238
|
+
EXCLUDE_MARKER,
|
|
239
|
+
...patternList,
|
|
240
|
+
'',
|
|
241
|
+
].join('\n');
|
|
242
|
+
fs.appendFileSync(excludePath, block);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Non-fatal: scope check will still run, just might flag extra files
|
|
246
|
+
}
|
|
247
|
+
return patternList;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=exclusion-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exclusion-index.js","sourceRoot":"","sources":["../../src/lib/exclusion-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,qEAAqE;AAErE;;;;GAIG;AACH,MAAM,aAAa,GAA6B;IAC9C,0CAA0C;IAC1C,cAAc,EAAS,CAAC,eAAe,CAAC;IACxC,gBAAgB,EAAO,CAAC,QAAQ,CAAC;IACjC,iBAAiB,EAAM,CAAC,QAAQ,CAAC;IACjC,gBAAgB,EAAO,CAAC,QAAQ,CAAC;IACjC,gBAAgB,EAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,gBAAgB,EAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,kBAAkB,EAAK,CAAC,cAAc,CAAC;IACvC,YAAY,EAAW,CAAC,SAAS,CAAC;IAClC,gBAAgB,EAAO,CAAC,OAAO,CAAC;IAChC,gBAAgB,EAAO,CAAC,OAAO,CAAC;IAChC,kBAAkB,EAAK,CAAC,OAAO,CAAC;IAChC,mBAAmB,EAAI,CAAC,OAAO,CAAC;IAChC,mBAAmB,EAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC1C,mBAAmB,EAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC1C,WAAW,EAAY,CAAC,gBAAgB,CAAC;IACzC,eAAe,EAAQ,CAAC,eAAe,CAAC;IAExC,eAAe;IACf,gBAAgB,EAAO,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,CAAC;IACrH,kBAAkB,EAAK,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;IAC5F,SAAS,EAAc,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC1D,UAAU,EAAa,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;IAClF,WAAW,EAAY,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC;IAE/D,aAAa;IACb,YAAY,EAAW,CAAC,SAAS,CAAC;IAElC,WAAW;IACX,QAAQ,EAAe,CAAC,SAAS,CAAC;IAElC,YAAY;IACZ,eAAe,EAAQ,CAAC,SAAS,CAAC;IAElC,aAAa;IACb,SAAS,EAAc,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAErD,eAAe;IACf,SAAS,EAAc,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC;IAE1D,8BAA8B;IAC9B,SAAS,EAAc,CAAC,SAAS,CAAC;IAClC,cAAc,EAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,kBAAkB,EAAK,CAAC,QAAQ,EAAE,UAAU,CAAC;IAE7C,kBAAkB;IAClB,uDAAuD;IAEvD,cAAc;IACd,eAAe,EAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAE/C,uBAAuB;IACvB,cAAc,EAAS,CAAC,aAAa,EAAE,QAAQ,CAAC;IAEhD,iCAAiC;IACjC,gBAAgB,EAAO,CAAC,WAAW,CAAC;IACpC,gBAAgB,EAAO,CAAC,WAAW,CAAC;IACpC,kBAAkB,EAAK,CAAC,WAAW,CAAC;IACpC,kBAAkB,EAAK,CAAC,WAAW,CAAC;IACpC,YAAY,EAAW,CAAC,gBAAgB,CAAC;IACzC,QAAQ,EAAe,CAAC,WAAW,EAAE,cAAc,CAAC;IACpD,aAAa,EAAU,CAAC,WAAW,EAAE,cAAc,CAAC;IAEpD,8BAA8B;IAC9B,cAAc,EAAU,CAAC,eAAe,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAA6B;IACrD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAK,CAAC,MAAM,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,qEAAqE;AAErE;;;;;GAKG;AACH,MAAM,SAAS,GAAgB,eAAe,CAAC,CAAC,GAAG,EAAE;IACnD,uEAAuE;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG;QAClB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;QACtC,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;KAC9C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,uDAAuD;QACvD,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,EAAE,CAAC;AAEL,sEAAsE;AACtE,MAAM,cAAc,GAAG,kDAAkD,CAAC;AAE1E,qEAAqE;AAErE;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAW,EACX,QAAqB,EACrB,KAAa,EACb,QAAgB;IAEhB,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO;IAE7B,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,8BAA8B;QAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,CAAC,0CAA0C;IAC5D,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO,OAAO,CAAC;IAEvC,oEAAoE;IACpE,gDAAgD;IAChD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,2DAA2D;QAC3D,0DAA0D;QAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,WAAW,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC;QAED,8CAA8C;QAC9C,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qEAAqE;AAErE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,QAAQ,GAAG,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,wCAAwC;IACxC,cAAc,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzC,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElD,4DAA4D;QAC5D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtC,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,EAAE;YACF,cAAc;YACd,GAAG,WAAW;YACd,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js ExecRunner implementation
|
|
3
|
+
*
|
|
4
|
+
* Spawns commands, captures output to artifact files,
|
|
5
|
+
* handles timeout/cancellation, and returns structured results.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExecRunner, ExecSpec, ExecResult } from '@promptwheel/core';
|
|
8
|
+
export interface NodeExecRunnerOptions {
|
|
9
|
+
defaultMaxLogBytes?: number;
|
|
10
|
+
defaultTailBytes?: number;
|
|
11
|
+
killGraceMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class NodeExecRunner implements ExecRunner {
|
|
14
|
+
private readonly defaultMaxLogBytes;
|
|
15
|
+
private readonly defaultTailBytes;
|
|
16
|
+
private readonly killGraceMs;
|
|
17
|
+
constructor(opts?: NodeExecRunnerOptions);
|
|
18
|
+
run(spec: ExecSpec): Promise<ExecResult>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a Node exec runner with default options
|
|
22
|
+
*/
|
|
23
|
+
export declare function createExecRunner(opts?: NodeExecRunnerOptions): ExecRunner;
|
|
24
|
+
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EAGX,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0FD,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,IAAI,GAAE,qBAA0B;IAMtC,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;CA8N/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,qBAAqB,GAAG,UAAU,CAEzE"}
|
package/dist/lib/exec.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js ExecRunner implementation
|
|
3
|
+
*
|
|
4
|
+
* Spawns commands, captures output to artifact files,
|
|
5
|
+
* handles timeout/cancellation, and returns structured results.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration constants for ExecRunner
|
|
12
|
+
*/
|
|
13
|
+
/** Maximum bytes to write per output stream (stdout/stderr). Prevents runaway disk usage. */
|
|
14
|
+
const DEFAULT_MAX_LOG_BYTES = 2_000_000; // 2MB per stream
|
|
15
|
+
/** Bytes to retain in memory for the tail buffer, used for fast UI display. */
|
|
16
|
+
const DEFAULT_TAIL_BYTES = 65_536; // 64KB tail for fast UI
|
|
17
|
+
/** Grace period in ms between SIGTERM and SIGKILL when killing a child process. */
|
|
18
|
+
const DEFAULT_KILL_GRACE_MS = 1_500;
|
|
19
|
+
/** Maximum length for sanitized file name segments. Prevents overly long artifact paths. */
|
|
20
|
+
const MAX_FILE_SEGMENT_LENGTH = 64;
|
|
21
|
+
function isProbablyAbsolute(p) {
|
|
22
|
+
return path.isAbsolute(p);
|
|
23
|
+
}
|
|
24
|
+
function sanitizeFileSegment(s) {
|
|
25
|
+
return s
|
|
26
|
+
.trim()
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
29
|
+
.replace(/-+/g, '-')
|
|
30
|
+
.replace(/^-+|-+$/g, '')
|
|
31
|
+
.slice(0, MAX_FILE_SEGMENT_LENGTH) || 'step';
|
|
32
|
+
}
|
|
33
|
+
function pad2(n) {
|
|
34
|
+
return n < 10 ? `0${n}` : `${n}`;
|
|
35
|
+
}
|
|
36
|
+
function appendTail(current, chunk, tailBytes) {
|
|
37
|
+
if (tailBytes <= 0)
|
|
38
|
+
return Buffer.alloc(0);
|
|
39
|
+
if (chunk.length >= tailBytes) {
|
|
40
|
+
return Buffer.from(chunk.subarray(chunk.length - tailBytes));
|
|
41
|
+
}
|
|
42
|
+
if (current.length === 0)
|
|
43
|
+
return Buffer.from(chunk);
|
|
44
|
+
const combined = Buffer.concat([current, chunk]);
|
|
45
|
+
if (combined.length <= tailBytes)
|
|
46
|
+
return combined;
|
|
47
|
+
return Buffer.from(combined.subarray(combined.length - tailBytes));
|
|
48
|
+
}
|
|
49
|
+
async function ensureDir(absDir) {
|
|
50
|
+
await fs.promises.mkdir(absDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
function writeCapped(stream, chunk, state, maxBytes) {
|
|
53
|
+
if (maxBytes <= 0) {
|
|
54
|
+
state.truncated = true;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (state.truncated)
|
|
58
|
+
return;
|
|
59
|
+
const remaining = maxBytes - state.bytesWritten;
|
|
60
|
+
if (remaining <= 0) {
|
|
61
|
+
state.truncated = true;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (chunk.length <= remaining) {
|
|
65
|
+
stream.write(chunk);
|
|
66
|
+
state.bytesWritten += chunk.length;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// partial write, then truncate
|
|
70
|
+
stream.write(chunk.subarray(0, remaining));
|
|
71
|
+
state.bytesWritten += remaining;
|
|
72
|
+
state.truncated = true;
|
|
73
|
+
}
|
|
74
|
+
function waitForStreamClose(stream) {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
stream.once('close', () => resolve());
|
|
77
|
+
stream.once('error', (err) => reject(err));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export class NodeExecRunner {
|
|
81
|
+
defaultMaxLogBytes;
|
|
82
|
+
defaultTailBytes;
|
|
83
|
+
killGraceMs;
|
|
84
|
+
constructor(opts = {}) {
|
|
85
|
+
this.defaultMaxLogBytes = opts.defaultMaxLogBytes ?? DEFAULT_MAX_LOG_BYTES;
|
|
86
|
+
this.defaultTailBytes = opts.defaultTailBytes ?? DEFAULT_TAIL_BYTES;
|
|
87
|
+
this.killGraceMs = opts.killGraceMs ?? DEFAULT_KILL_GRACE_MS;
|
|
88
|
+
}
|
|
89
|
+
async run(spec) {
|
|
90
|
+
const startedAtMs = Date.now();
|
|
91
|
+
const maxLogBytes = spec.maxLogBytes ?? this.defaultMaxLogBytes;
|
|
92
|
+
const tailBytes = spec.tailBytes ?? this.defaultTailBytes;
|
|
93
|
+
const repoRoot = spec.repoRoot;
|
|
94
|
+
const artifactsDirAbs = isProbablyAbsolute(spec.artifactsDir)
|
|
95
|
+
? spec.artifactsDir
|
|
96
|
+
: path.join(repoRoot, spec.artifactsDir);
|
|
97
|
+
// Layout: .promptwheel/artifacts/<runId>/attempt-<n>/
|
|
98
|
+
const attemptDirAbs = path.join(artifactsDirAbs, spec.runId, `attempt-${spec.attempt}`);
|
|
99
|
+
await ensureDir(attemptDirAbs);
|
|
100
|
+
const safeName = sanitizeFileSegment(spec.stepName);
|
|
101
|
+
const base = `${pad2(spec.ordinal)}-${safeName}`;
|
|
102
|
+
const stdoutAbs = path.join(attemptDirAbs, `${base}.stdout.log`);
|
|
103
|
+
const stderrAbs = path.join(attemptDirAbs, `${base}.stderr.log`);
|
|
104
|
+
const stdoutPathDb = isProbablyAbsolute(spec.artifactsDir)
|
|
105
|
+
? stdoutAbs
|
|
106
|
+
: path.join(spec.artifactsDir, spec.runId, `attempt-${spec.attempt}`, `${base}.stdout.log`);
|
|
107
|
+
const stderrPathDb = isProbablyAbsolute(spec.artifactsDir)
|
|
108
|
+
? stderrAbs
|
|
109
|
+
: path.join(spec.artifactsDir, spec.runId, `attempt-${spec.attempt}`, `${base}.stderr.log`);
|
|
110
|
+
const stdoutStream = fs.createWriteStream(stdoutAbs, { flags: 'w' });
|
|
111
|
+
const stderrStream = fs.createWriteStream(stderrAbs, { flags: 'w' });
|
|
112
|
+
let stdoutTail = Buffer.alloc(0);
|
|
113
|
+
let stderrTail = Buffer.alloc(0);
|
|
114
|
+
const stdoutState = { bytesWritten: 0, truncated: false };
|
|
115
|
+
const stderrState = { bytesWritten: 0, truncated: false };
|
|
116
|
+
let timedOut = false;
|
|
117
|
+
let canceled = false;
|
|
118
|
+
let errorMessage;
|
|
119
|
+
let exitCode = null;
|
|
120
|
+
let signal = null;
|
|
121
|
+
let pid = null;
|
|
122
|
+
let timeoutHandle;
|
|
123
|
+
const endAndWaitStreams = async () => {
|
|
124
|
+
try {
|
|
125
|
+
stdoutStream.end();
|
|
126
|
+
}
|
|
127
|
+
catch { /* ignore */ }
|
|
128
|
+
try {
|
|
129
|
+
stderrStream.end();
|
|
130
|
+
}
|
|
131
|
+
catch { /* ignore */ }
|
|
132
|
+
await Promise.allSettled([
|
|
133
|
+
waitForStreamClose(stdoutStream),
|
|
134
|
+
waitForStreamClose(stderrStream),
|
|
135
|
+
]);
|
|
136
|
+
};
|
|
137
|
+
const makeOutput = (stream) => {
|
|
138
|
+
const isStdout = stream === 'stdout';
|
|
139
|
+
const absPath = isStdout ? stdoutAbs : stderrAbs;
|
|
140
|
+
const pathDb = isStdout ? stdoutPathDb : stderrPathDb;
|
|
141
|
+
const bytes = isStdout ? stdoutState.bytesWritten : stderrState.bytesWritten;
|
|
142
|
+
const truncated = isStdout ? stdoutState.truncated : stderrState.truncated;
|
|
143
|
+
const tailBuf = isStdout ? stdoutTail : stderrTail;
|
|
144
|
+
return {
|
|
145
|
+
absPath,
|
|
146
|
+
path: pathDb,
|
|
147
|
+
bytes,
|
|
148
|
+
truncated,
|
|
149
|
+
tail: tailBuf.toString('utf8'),
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
const finalize = async (status) => {
|
|
153
|
+
const endedAtMs = Date.now();
|
|
154
|
+
await endAndWaitStreams();
|
|
155
|
+
return {
|
|
156
|
+
status,
|
|
157
|
+
exitCode,
|
|
158
|
+
signal,
|
|
159
|
+
errorMessage,
|
|
160
|
+
pid,
|
|
161
|
+
startedAtMs,
|
|
162
|
+
endedAtMs,
|
|
163
|
+
durationMs: Math.max(0, endedAtMs - startedAtMs),
|
|
164
|
+
stdout: makeOutput('stdout'),
|
|
165
|
+
stderr: makeOutput('stderr'),
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
let child;
|
|
169
|
+
const killChild = (_why) => {
|
|
170
|
+
if (!child || child.killed)
|
|
171
|
+
return;
|
|
172
|
+
try {
|
|
173
|
+
child.kill('SIGTERM');
|
|
174
|
+
}
|
|
175
|
+
catch { /* ignore */ }
|
|
176
|
+
// Escalate after grace period
|
|
177
|
+
setTimeout(() => {
|
|
178
|
+
if (!child || child.killed)
|
|
179
|
+
return;
|
|
180
|
+
try {
|
|
181
|
+
child.kill('SIGKILL');
|
|
182
|
+
}
|
|
183
|
+
catch { /* ignore */ }
|
|
184
|
+
}, this.killGraceMs);
|
|
185
|
+
};
|
|
186
|
+
const onAbort = () => {
|
|
187
|
+
canceled = true;
|
|
188
|
+
errorMessage = errorMessage ?? 'Canceled';
|
|
189
|
+
killChild('canceled');
|
|
190
|
+
};
|
|
191
|
+
// Shared cleanup: clears timeout, removes abort listener, then finalizes
|
|
192
|
+
const cleanupAndFinalize = async (status) => {
|
|
193
|
+
if (timeoutHandle)
|
|
194
|
+
clearTimeout(timeoutHandle);
|
|
195
|
+
if (spec.signal)
|
|
196
|
+
spec.signal.removeEventListener('abort', onAbort);
|
|
197
|
+
return await finalize(status);
|
|
198
|
+
};
|
|
199
|
+
try {
|
|
200
|
+
const env = { ...process.env, ...(spec.env ?? {}) };
|
|
201
|
+
const cwd = spec.cwd ?? repoRoot;
|
|
202
|
+
// If already aborted, short-circuit
|
|
203
|
+
if (spec.signal?.aborted) {
|
|
204
|
+
canceled = true;
|
|
205
|
+
errorMessage = 'Canceled (signal already aborted)';
|
|
206
|
+
return await finalize('canceled');
|
|
207
|
+
}
|
|
208
|
+
if (spec.signal) {
|
|
209
|
+
spec.signal.addEventListener('abort', onAbort, { once: true });
|
|
210
|
+
}
|
|
211
|
+
child = spawn(spec.cmd, {
|
|
212
|
+
cwd,
|
|
213
|
+
env,
|
|
214
|
+
shell: spec.shell ?? true,
|
|
215
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
216
|
+
});
|
|
217
|
+
pid = child.pid ?? null;
|
|
218
|
+
// Timeout handling
|
|
219
|
+
if (spec.timeoutMs && spec.timeoutMs > 0) {
|
|
220
|
+
timeoutHandle = setTimeout(() => {
|
|
221
|
+
timedOut = true;
|
|
222
|
+
errorMessage = errorMessage ?? `Timed out after ${spec.timeoutMs}ms`;
|
|
223
|
+
killChild('timeout');
|
|
224
|
+
}, spec.timeoutMs);
|
|
225
|
+
}
|
|
226
|
+
// Stream piping + tail capture
|
|
227
|
+
if (child.stdout) {
|
|
228
|
+
child.stdout.on('data', (chunk) => {
|
|
229
|
+
const buf = Buffer.from(chunk);
|
|
230
|
+
spec.onStdoutChunk?.(buf);
|
|
231
|
+
stdoutTail = appendTail(stdoutTail, buf, tailBytes);
|
|
232
|
+
writeCapped(stdoutStream, buf, stdoutState, maxLogBytes);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (child.stderr) {
|
|
236
|
+
child.stderr.on('data', (chunk) => {
|
|
237
|
+
const buf = Buffer.from(chunk);
|
|
238
|
+
spec.onStderrChunk?.(buf);
|
|
239
|
+
stderrTail = appendTail(stderrTail, buf, tailBytes);
|
|
240
|
+
writeCapped(stderrStream, buf, stderrState, maxLogBytes);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// Spawn error (ENOENT, permissions, etc.)
|
|
244
|
+
const spawnErrorPromise = new Promise((resolve) => {
|
|
245
|
+
child.once('error', async (err) => {
|
|
246
|
+
errorMessage = errorMessage ?? err.message;
|
|
247
|
+
exitCode = null;
|
|
248
|
+
signal = null;
|
|
249
|
+
killChild('error');
|
|
250
|
+
resolve(await cleanupAndFinalize('failed'));
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
// Normal close path
|
|
254
|
+
const closePromise = new Promise((resolve) => {
|
|
255
|
+
child.once('close', async (code, sig) => {
|
|
256
|
+
exitCode = code;
|
|
257
|
+
signal = sig ?? null;
|
|
258
|
+
let status;
|
|
259
|
+
if (canceled)
|
|
260
|
+
status = 'canceled';
|
|
261
|
+
else if (timedOut)
|
|
262
|
+
status = 'timeout';
|
|
263
|
+
else if (code === 0)
|
|
264
|
+
status = 'success';
|
|
265
|
+
else
|
|
266
|
+
status = 'failed';
|
|
267
|
+
resolve(await cleanupAndFinalize(status));
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
// Write stream error (disk issue)
|
|
271
|
+
const writeErrorPromise = new Promise((resolve) => {
|
|
272
|
+
const onWriteError = async (err) => {
|
|
273
|
+
errorMessage = errorMessage ?? `Artifact write error: ${err.message}`;
|
|
274
|
+
killChild('error');
|
|
275
|
+
resolve(await cleanupAndFinalize('failed'));
|
|
276
|
+
};
|
|
277
|
+
stdoutStream.once('error', onWriteError);
|
|
278
|
+
stderrStream.once('error', onWriteError);
|
|
279
|
+
});
|
|
280
|
+
// First one wins
|
|
281
|
+
return await Promise.race([spawnErrorPromise, closePromise, writeErrorPromise]);
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
errorMessage = errorMessage ?? (err instanceof Error ? err.message : String(err));
|
|
285
|
+
return await cleanupAndFinalize('failed');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Create a Node exec runner with default options
|
|
291
|
+
*/
|
|
292
|
+
export function createExecRunner(opts) {
|
|
293
|
+
return new NodeExecRunner(opts);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAgBlC;;GAEG;AAEH,6FAA6F;AAC7F,MAAM,qBAAqB,GAAG,SAAS,CAAC,CAAC,iBAAiB;AAE1D,+EAA+E;AAC/E,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,wBAAwB;AAE3D,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,4FAA4F;AAC5F,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAS;IACpC,OAAO,CAAC;SACL,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,IAAI,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,KAAa,EAAE,SAAiB;IACnE,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,MAAc;IACrC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAClB,MAAsB,EACtB,KAAa,EACb,KAAmD,EACnD,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO;IAE5B,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC;IAChD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;QACnC,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC;IAChC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAsB;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,cAAc;IACR,kBAAkB,CAAS;IAC3B,gBAAgB,CAAS;IACzB,WAAW,CAAS;IAErC,YAAY,OAA8B,EAAE;QAC1C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,qBAAqB,CAAC;QAC3E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;QACpE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,qBAAqB,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAc;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE/B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,YAAY;YACnB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE3C,sDAAsD;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;QAE/B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;QAEjE,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;YACxD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;QAE9F,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;YACxD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;QAE9F,MAAM,YAAY,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAErE,IAAI,UAAU,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,UAAU,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAE1D,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,YAAgC,CAAC;QAErC,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,GAAG,GAAkB,IAAI,CAAC;QAE9B,IAAI,aAAyC,CAAC;QAE9C,MAAM,iBAAiB,GAAG,KAAK,IAAmB,EAAE;YAClD,IAAI,CAAC;gBAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC;gBAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAElD,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvB,kBAAkB,CAAC,YAAY,CAAC;gBAChC,kBAAkB,CAAC,YAAY,CAAC;aACjC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,MAA2B,EAAc,EAAE;YAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,QAAQ,CAAC;YACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;YACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;YAC7E,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;YAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;YAEnD,OAAO;gBACL,OAAO;gBACP,IAAI,EAAE,MAAM;gBACZ,KAAK;gBACL,SAAS;gBACT,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC/B,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAkB,EAAuB,EAAE;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,iBAAiB,EAAE,CAAC;YAE1B,OAAO;gBACL,MAAM;gBACN,QAAQ;gBACR,MAAM;gBACN,YAAY;gBACZ,GAAG;gBACH,WAAW;gBACX,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;gBAChD,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;gBAC5B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;aAC7B,CAAC;QACJ,CAAC,CAAC;QAEF,IAAI,KAA2C,CAAC;QAEhD,MAAM,SAAS,GAAG,CAAC,IAAsC,EAAE,EAAE;YAC3D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAEnC,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAExB,8BAA8B;YAC9B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM;oBAAE,OAAO;gBACnC,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC;YAC1C,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,yEAAyE;QACzE,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAkB,EAAuB,EAAE;YAC3E,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAA4B,CAAC;YAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC;YAEjC,oCAAoC;YACpC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACzB,QAAQ,GAAG,IAAI,CAAC;gBAChB,YAAY,GAAG,mCAAmC,CAAC;gBACnD,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,GAAG;gBACH,GAAG;gBACH,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;gBACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;YAExB,mBAAmB;YACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACzC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,GAAG,YAAY,IAAI,mBAAmB,IAAI,CAAC,SAAS,IAAI,CAAC;oBACrE,SAAS,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;YAED,+BAA+B;YAC/B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC1B,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACpD,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC1B,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACpD,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC;YAED,0CAA0C;YAC1C,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;gBAC5D,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAU,EAAE,EAAE;oBACxC,YAAY,GAAG,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC;oBAC3C,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,GAAG,IAAI,CAAC;oBACd,SAAS,CAAC,OAAO,CAAC,CAAC;oBACnB,OAAO,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,oBAAoB;YACpB,MAAM,YAAY,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;gBACvD,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,GAA0B,EAAE,EAAE;oBAC7E,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC;oBAErB,IAAI,MAAkB,CAAC;oBACvB,IAAI,QAAQ;wBAAE,MAAM,GAAG,UAAU,CAAC;yBAC7B,IAAI,QAAQ;wBAAE,MAAM,GAAG,SAAS,CAAC;yBACjC,IAAI,IAAI,KAAK,CAAC;wBAAE,MAAM,GAAG,SAAS,CAAC;;wBACnC,MAAM,GAAG,QAAQ,CAAC;oBAEvB,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;gBAC5D,MAAM,YAAY,GAAG,KAAK,EAAE,GAAU,EAAE,EAAE;oBACxC,YAAY,GAAG,YAAY,IAAI,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC;oBACtE,SAAS,CAAC,OAAO,CAAC,CAAC;oBACnB,OAAO,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC;gBAEF,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACzC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,iBAAiB;YACjB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,YAAY,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClF,OAAO,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA4B;IAC3D,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code CLI execution backend
|
|
3
|
+
*/
|
|
4
|
+
import type { ClaudeResult, ExecutionBackend } from './types.js';
|
|
5
|
+
export declare class ClaudeExecutionBackend implements ExecutionBackend {
|
|
6
|
+
readonly name = "claude";
|
|
7
|
+
run(opts: {
|
|
8
|
+
worktreePath: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
verbose: boolean;
|
|
12
|
+
onProgress: (msg: string) => void;
|
|
13
|
+
onRawOutput?: (chunk: string) => void;
|
|
14
|
+
}): Promise<ClaudeResult>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Run Claude Code CLI
|
|
18
|
+
*/
|
|
19
|
+
export declare function runClaude(opts: {
|
|
20
|
+
worktreePath: string;
|
|
21
|
+
prompt: string;
|
|
22
|
+
timeoutMs: number;
|
|
23
|
+
verbose: boolean;
|
|
24
|
+
onProgress: (msg: string) => void;
|
|
25
|
+
onRawOutput?: (chunk: string) => void;
|
|
26
|
+
}): Promise<ClaudeResult>;
|
|
27
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/lib/execution-backends/claude.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgCjE,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,IAAI,YAAY;IAEzB,GAAG,CAAC,IAAI,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAClC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACvC,GAAG,OAAO,CAAC,YAAY,CAAC;CAG1B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,GAAG,OAAO,CAAC,YAAY,CAAC,CAwIxB"}
|