88# ./scripts/e2e-linux.sh # Run tests
99# ./scripts/e2e-linux.sh --build # Force rebuild Docker image
1010# ./scripts/e2e-linux.sh --shell # Start interactive shell in container
11+ # ./scripts/e2e-linux.sh --vnc # Interactive VNC mode with hot reload
1112# ./scripts/e2e-linux.sh --clean # Clean Linux build cache
1213
1314set -e
@@ -46,6 +47,7 @@ log_error() {
4647# Parse arguments
4748FORCE_BUILD=false
4849INTERACTIVE=false
50+ VNC_MODE=false
4951CLEAN=false
5052
5153for arg in " $@ " ; do
@@ -56,6 +58,9 @@ for arg in "$@"; do
5658 --shell)
5759 INTERACTIVE=true
5860 ;;
61+ --vnc)
62+ VNC_MODE=true
63+ ;;
5964 --clean)
6065 CLEAN=true
6166 ;;
@@ -65,6 +70,7 @@ for arg in "$@"; do
6570 echo " Options:"
6671 echo " --build Force rebuild of Docker image"
6772 echo " --shell Start interactive shell in container"
73+ echo " --vnc Interactive VNC mode with hot reload (pnpm dev)"
6874 echo " --clean Clean Linux build cache (forces rebuild)"
6975 echo " --help Show this help message"
7076 exit 0
@@ -95,6 +101,65 @@ if $FORCE_BUILD || ! docker image inspect "$IMAGE_NAME" &> /dev/null; then
95101 docker build -t " $IMAGE_NAME " -f " $DESKTOP_DIR /test/e2e-linux/docker/Dockerfile" " $DESKTOP_DIR /test/e2e-linux/docker"
96102fi
97103
104+ # VNC mode: runs pnpm dev inside Docker with VNC for interactive debugging.
105+ # Does NOT require a pre-built binary — uses Vite + Tauri hot reload instead.
106+ if $VNC_MODE ; then
107+ log_info " Starting VNC mode with hot reload..."
108+
109+ # Temporarily clear .cargo/config.toml if present (local path patches don't exist in Docker)
110+ CARGO_CONFIG=" $DESKTOP_DIR /src-tauri/.cargo/config.toml"
111+ CARGO_CONFIG_BAK=" "
112+ if [ -f " $CARGO_CONFIG " ]; then
113+ CARGO_CONFIG_BAK=" ${CARGO_CONFIG} .docker-bak"
114+ cp " $CARGO_CONFIG " " $CARGO_CONFIG_BAK "
115+ > " $CARGO_CONFIG "
116+ trap ' mv "${CARGO_CONFIG_BAK}" "${CARGO_CONFIG}" 2>/dev/null || true' EXIT
117+ fi
118+
119+ docker run -it --rm \
120+ -v " $REPO_ROOT :/app" \
121+ -v " $CARGO_VOLUME :/root/.cargo" \
122+ -v " $TARGET_VOLUME :/target" \
123+ -v " $ROOT_NODE_MODULES_VOLUME :/app/node_modules" \
124+ -v " $DESKTOP_NODE_MODULES_VOLUME :/app/apps/desktop/node_modules" \
125+ -w /app \
126+ -p 5990:5990 \
127+ -p 6090:6090 \
128+ -e VNC=1 \
129+ -e CARGO_TARGET_DIR=/target \
130+ -e TAURI_DEV_HOST=0.0.0.0 \
131+ -e RUST_LOG=smb=warn,sspi=warn,info \
132+ " $IMAGE_NAME " \
133+ bash -c '
134+ set -e
135+
136+ # Install dev packages needed for Tauri build
137+ apt-get update > /dev/null && apt-get install -y \
138+ libwebkit2gtk-4.1-dev \
139+ libayatana-appindicator3-dev \
140+ librsvg2-dev \
141+ libacl1-dev \
142+ patchelf \
143+ > /dev/null
144+
145+ # Install dependencies if needed (node_modules is a Docker volume)
146+ if [ ! -f "/app/node_modules/.linux-installed" ]; then
147+ echo "Installing Linux node_modules..."
148+ pnpm install --frozen-lockfile
149+ touch /app/node_modules/.linux-installed
150+ fi
151+
152+ echo "Starting Cmdr in dev mode (Vite HMR + Tauri)..."
153+ echo "Frontend edits on macOS will hot reload in ~1-3s."
154+ echo "Rust edits require Ctrl+C and re-run."
155+ echo ""
156+ pnpm dev
157+ '
158+
159+ log_info " VNC session ended."
160+ exit 0
161+ fi
162+
98163# Check if a Linux binary exists in the Docker volume
99164# Override entrypoint to avoid Xvfb output
100165check_linux_build () {
0 commit comments