#!/usr/bin/env bash # bin/up — run the Dispatch backend + web frontend together, both live-reloading. # Ctrl-C stops BOTH cleanly (including the backend's spawned observability collector). # # backend (this repo) bun --watch → HTTP :24203 + surface WS :24205 (FULL restart on change) # frontend (../dispatch-web) vite → http://localhost:24204 (HMR, in-place) # # Assumes dispatch-web is a sibling of this repo. Run: bin/up (or: bun run dev:all) set -uo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # .../arch-rewrite/bin BACKEND="$(cd "$HERE/.." && pwd)" # backend repo root FRONTEND="$(cd "$HERE/../.." && pwd)/dispatch-web" # sibling repo if [ ! -d "$FRONTEND" ]; then echo "up: frontend repo not found at $FRONTEND" >&2 echo "up: check out 'dispatch-web' beside this repo and retry." >&2 exit 1 fi cleanup() { echo echo "[up] stopping backend + frontend..." # Each child runs in its OWN process group (setsid) → signal the whole subtree. [ -n "${BACK_PG:-}" ] && kill -TERM "-$BACK_PG" 2>/dev/null [ -n "${FRONT_PG:-}" ] && kill -TERM "-$FRONT_PG" 2>/dev/null sleep 1 # Safety net for the backend's collector child + any straggler (bracket trick: # the literal pattern '[h]ost-bin' can't match the pkill command line itself). pkill -9 -f '[h]ost-bin/src/main' 2>/dev/null pkill -9 -f '[o]bservability-collector/src/main' 2>/dev/null [ -n "${BACK_PG:-}" ] && kill -KILL "-$BACK_PG" 2>/dev/null [ -n "${FRONT_PG:-}" ] && kill -KILL "-$FRONT_PG" 2>/dev/null echo "[up] stopped." return 0 } trap cleanup EXIT trap 'exit 130' INT TERM echo "[up] backend → http://localhost:24203 (surface WS :24205) [bun --watch — restarts on change]" echo "[up] frontend → http://localhost:24204 [vite HMR]" echo "[up] Ctrl-C to stop both." echo # Force the dev ports: a shell-exported BACKEND_PORT (e.g. 24991 from ~/.bashrc, # set so the Dispatch CLI hits prod) would otherwise override .env and bind the # dev server onto the production port (colliding with the prod systemd service). # Bun lets shell env win over .env, so pin the dev ports here. setsid bash -c "cd '$BACKEND' && exec env BACKEND_PORT=24203 SURFACE_WS_PORT=24205 bun --watch packages/host-bin/src/main.ts" \ > >(sed -u 's/^/[backend] /') 2>&1 & BACK_PG=$! setsid bash -c "cd '$FRONTEND' && exec bun run dev" \ > >(sed -u 's/^/[frontend] /') 2>&1 & FRONT_PG=$! wait