Skip to content

Commit 3123110

Browse files
committed
feat(scripts): improve dev.sh with spinner UI and better process
management - Add spinner animation while waiting for web server - Log all process output to debug/proc/*.log - Add timeout protection for web server startup - Clean up all processes (web, studio, sdk) on exit - Use consistent bun --cwd format for all commands - Add start-cli script to package.json
1 parent 3eeb7b6 commit 3123110

File tree

2 files changed

+100
-32
lines changed

2 files changed

+100
-32
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
],
1919
"scripts": {
2020
"dev": "bash scripts/dev.sh",
21+
"start-cli": "bun --cwd cli dev",
2122
"start-db": "bun --cwd packages/internal db:start",
2223
"start-web": "bun start-db && bun --cwd web dev",
2324
"start-studio": "bun --cwd packages/internal db:studio",

scripts/dev.sh

Lines changed: 99 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,112 @@
11
#!/bin/bash
22

3-
# Get the project root directory
3+
# =============================================================================
4+
# Development Environment Startup Script
5+
# =============================================================================
6+
47
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
58
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
6-
7-
# Ensure .bin/bun is in PATH first so environment variables are loaded
89
export PATH="$PROJECT_ROOT/.bin:$PATH"
910

10-
# Enable job control and set up trap for cleanup
11-
set -m
12-
READY_FILE="/tmp/codebuff_server_ready_$$"
13-
trap 'kill -TERM -$SERVER_PID 2>/dev/null; rm -f "$READY_FILE"; exit' EXIT INT TERM
14-
15-
# Start the server in background
16-
echo "Starting server..."
17-
bun start-web 2>&1 | tee >(grep -m 1 " - Local: http://localhost:3000" > /dev/null && touch "$READY_FILE") &
18-
SERVER_PID=$!
19-
20-
# Wait for the ready signal
21-
echo "Waiting for server to be ready..."
22-
while [[ ! -f "$READY_FILE" ]]; do
23-
# Check if server process is still running
24-
if ! kill -0 $SERVER_PID 2>/dev/null; then
25-
echo "Server process died unexpectedly"
26-
exit 1
11+
LOG_DIR="$PROJECT_ROOT/debug/proc"
12+
mkdir -p "$LOG_DIR"
13+
14+
# =============================================================================
15+
# UI Helpers
16+
# =============================================================================
17+
18+
SPINNER_FRAMES=('' '' '' '' '' '' '' '' '' '')
19+
20+
# Print a success line
21+
ok() {
22+
printf " \033[32m✓\033[0m %-10s %s\033[K\n" "$1" "$2"
23+
}
24+
25+
# Wait for a pattern in a log file, with spinner animation
26+
wait_for_log() {
27+
local name="$1"
28+
local pattern="$2"
29+
local timeout="${3:-60}"
30+
local frame=0
31+
local elapsed=0
32+
33+
printf "\033[?25l" # Hide cursor
34+
printf " %s %-10s starting...\n" "${SPINNER_FRAMES[0]}" "$name"
35+
36+
while ! grep -q "$pattern" "$LOG_DIR/$name.log" 2>/dev/null; do
37+
printf "\033[1A" # Move up one line
38+
printf " %s %-10s starting...\033[K\n" "${SPINNER_FRAMES[$frame]}" "$name"
39+
40+
frame=$(( (frame + 1) % ${#SPINNER_FRAMES[@]} ))
41+
sleep 0.1
42+
elapsed=$(( elapsed + 1 ))
43+
44+
if (( elapsed > timeout * 10 )); then
45+
printf "\033[?25h" # Show cursor
46+
echo "Timeout waiting for $name" >&2
47+
return 1
48+
fi
49+
done
50+
51+
printf "\033[1A" # Move up one line
52+
ok "$name" "ready!"
53+
printf "\033[?25h" # Show cursor
54+
}
55+
56+
# =============================================================================
57+
# Cleanup
58+
# =============================================================================
59+
60+
kill_proc() {
61+
local name="$1"
62+
local pattern="$2"
63+
if pkill -f "$pattern" 2>/dev/null; then
64+
echo "[$(date '+%H:%M:%S')] Killed $name" >> "$LOG_DIR/$name.log"
65+
return 0
2766
fi
28-
sleep 0.1
29-
done
67+
return 1
68+
}
69+
70+
cleanup() {
71+
printf "\033[?25h" # Restore cursor
72+
echo ""
73+
echo "Shutting down..."
74+
echo ""
75+
76+
kill_proc "web" 'bun.*--cwd web dev' || kill_proc "web" 'next-server'
77+
ok "web" "stopped"
78+
79+
kill_proc "studio" 'drizzle-kit studio' && ok "studio" "stopped"
80+
kill_proc "sdk" 'bun.*--cwd sdk' && ok "sdk" "stopped"
81+
82+
echo ""
83+
}
84+
trap cleanup EXIT INT TERM
85+
86+
# =============================================================================
87+
# Start Processes
88+
# =============================================================================
89+
90+
echo "Starting development environment..."
91+
echo ""
3092

31-
echo "Server is ready! Building SDK..."
93+
# 1. Database (blocking)
94+
printf " %s %-10s starting...\r" "${SPINNER_FRAMES[0]}" "db"
95+
bun --cwd packages/internal db:start > "$LOG_DIR/db.log" 2>&1
96+
ok "db" "ready!"
3297

33-
if ! bun --cwd=sdk run build; then
34-
echo "Failed to build SDK. Stopping server..."
35-
kill -TERM -$SERVER_PID 2>/dev/null
36-
exit 1
37-
fi
98+
# 2. Background processes (fire and forget)
99+
bun --cwd sdk run build > "$LOG_DIR/sdk.log" 2>&1 &
100+
ok "sdk" "(background)"
38101

39-
echo "Starting client..."
102+
bun --cwd packages/internal db:studio > "$LOG_DIR/studio.log" 2>&1 &
103+
ok "studio" "(background)"
40104

41-
# Clean up the signal file
42-
rm -f "$READY_FILE"
105+
# 3. Web server (wait for ready)
106+
bun --cwd web dev > "$LOG_DIR/web.log" 2>&1 &
107+
wait_for_log "web" "Ready in" 60
43108

44-
# Start the client
109+
# 4. CLI
110+
echo ""
111+
echo "Starting CLI..."
45112
bun --cwd cli dev "$@"

0 commit comments

Comments
 (0)