From 89aa68d769eb618981f27893c3d9b62748fd3c23 Mon Sep 17 00:00:00 2001 From: Matt Toohey Date: Wed, 8 Apr 2026 11:39:51 +1000 Subject: [PATCH] feat: support multiple sprout instances with stable ports (#264) --- desktop/vite.config.ts | 4 +- docker-compose.yml | 2 + justfile | 26 ++-- scripts/generate-dev-icon.swift | 217 ++++++++++++++++++++++++++++++++ scripts/instance-env.sh | 46 +++++++ 5 files changed, 286 insertions(+), 9 deletions(-) create mode 100755 scripts/generate-dev-icon.swift create mode 100755 scripts/instance-env.sh diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts index e7ce53ac38..6d20d7b699 100644 --- a/desktop/vite.config.ts +++ b/desktop/vite.config.ts @@ -33,14 +33,14 @@ export default defineConfig(async () => ({ clearScreen: false, // 2. tauri expects a fixed port, fail if that port is not available server: { - port: 1420, + port: parseInt(process.env.VITE_PORT || "1420", 10), strictPort: true, host: host || false, hmr: host ? { protocol: "ws", host, - port: 1421, + port: parseInt(process.env.VITE_HMR_PORT || "1421", 10), } : undefined, watch: { diff --git a/docker-compose.yml b/docker-compose.yml index 2cb9817a96..b31fdc1886 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +name: sprout + services: postgres: image: postgres:17-alpine diff --git a/justfile b/justfile index e2dc27917f..a9d01e2581 100644 --- a/justfile +++ b/justfile @@ -139,23 +139,35 @@ proxy: proxy-release: cargo run -p sprout-proxy --release -# Run the desktop Tauri app in dev mode (uses dev identifier for side-by-side with production) +# Run the desktop Tauri app in dev mode (ports and identity derived from worktree) dev *ARGS: - cd {{desktop_dir}} && pnpm tauri dev --config src-tauri/tauri.dev.conf.json {{ARGS}} + #!/usr/bin/env bash + set -euo pipefail + cd {{desktop_dir}} + [[ -d node_modules ]] || pnpm install + source ../scripts/instance-env.sh + echo "Starting on Vite port ${SPROUT_VITE_PORT}, relay ${SPROUT_RELAY_URL}" + pnpm exec tauri dev --config "$SPROUT_TAURI_CONFIG" {{ARGS}} # Run the desktop app against the internal staging relay (installs deps + builds agent tools automatically) staging *ARGS: cd {{desktop_dir}} && pnpm install cargo build --release -p sprout-acp -p sprout-mcp - cd {{desktop_dir}} && SPROUT_RELAY_URL="wss://sprout-oss.stage.blox.sqprod.co" pnpm tauri dev --config src-tauri/tauri.dev.conf.json {{ARGS}} + cd {{desktop_dir}} && SPROUT_RELAY_URL="wss://sprout-oss.stage.blox.sqprod.co" pnpm exec tauri dev --config src-tauri/tauri.dev.conf.json {{ARGS}} -# Run the desktop frontend dev server +# Run the desktop frontend dev server (port derived from worktree) desktop-dev: - cd {{desktop_dir}} && pnpm dev + #!/usr/bin/env bash + set -euo pipefail + cd {{desktop_dir}} + [[ -d node_modules ]] || pnpm install + source ../scripts/instance-env.sh + echo "Starting frontend dev server on Vite port ${SPROUT_VITE_PORT}, relay ${SPROUT_RELAY_URL}" + pnpm exec vite --port "${SPROUT_VITE_PORT}" --strictPort -# Run the desktop Tauri app (uses dev identifier for side-by-side with production) +# Run the desktop Tauri app (alias for dev) desktop-app *ARGS: - cd {{desktop_dir}} && pnpm tauri dev --config src-tauri/tauri.dev.conf.json {{ARGS}} + just dev {{ARGS}} # ─── Desktop Release ────────────────────────────────────────────────────────── diff --git a/scripts/generate-dev-icon.swift b/scripts/generate-dev-icon.swift new file mode 100755 index 0000000000..e7148f11f2 --- /dev/null +++ b/scripts/generate-dev-icon.swift @@ -0,0 +1,217 @@ +#!/usr/bin/env swift + +import AppKit +import Foundation + +// Generate a dev icon with worktree name badge +// Usage: generate-dev-icon.swift