setup.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. #!/bin/bash
  2. build_extension() {
  3. echo "🔨 Building the Roo Code extension..."
  4. pnpm -w vsix -- --out ../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1
  5. code --install-extension ../../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1
  6. }
  7. check_docker_services() {
  8. echo "🐳 Checking Docker services..."
  9. if ! command -v docker &> /dev/null; then
  10. echo "❌ Docker is not installed. Please install Docker Desktop and try again."
  11. exit 1
  12. fi
  13. if ! docker info &> /dev/null; then
  14. echo "❌ Docker is not running. Please start Docker Desktop and try again."
  15. exit 1
  16. fi
  17. if ! docker compose version &> /dev/null; then
  18. echo "❌ Docker Compose is not available. Please ensure Docker Desktop is properly installed."
  19. exit 1
  20. fi
  21. local services_to_start=()
  22. if ! nc -z localhost 5432 2>/dev/null; then
  23. echo "📦 PostgreSQL not running on port 5432"
  24. services_to_start+=("db")
  25. else
  26. echo "✅ PostgreSQL is running"
  27. fi
  28. if ! nc -z localhost 6379 2>/dev/null; then
  29. echo "📦 Redis not running on port 6379"
  30. services_to_start+=("redis")
  31. else
  32. echo "✅ Redis is running"
  33. fi
  34. if [ ${#services_to_start[@]} -gt 0 ]; then
  35. echo "🚀 Starting Docker services: ${services_to_start[*]}"
  36. echo "🧹 Cleaning up stale Docker state..."
  37. docker compose down --remove-orphans &>/dev/null || true
  38. docker network prune -f &>/dev/null || true
  39. if docker compose --profile server up -d "${services_to_start[@]}"; then
  40. echo "✅ Docker services started successfully"
  41. echo "⏳ Waiting for services to be ready..."
  42. local timeout=30
  43. local elapsed=0
  44. local all_ready=false
  45. while [ $elapsed -lt $timeout ]; do
  46. all_ready=true
  47. for service in "${services_to_start[@]}"; do
  48. if [[ "$service" == "db" ]] && ! nc -z localhost 5432 2>/dev/null; then
  49. all_ready=false
  50. break
  51. elif [[ "$service" == "redis" ]] && ! nc -z localhost 6379 2>/dev/null; then
  52. all_ready=false
  53. break
  54. fi
  55. done
  56. if [ "$all_ready" = true ]; then
  57. echo "✅ All services are ready"
  58. break
  59. fi
  60. sleep 1
  61. elapsed=$((elapsed + 1))
  62. if [ $((elapsed % 5)) -eq 0 ]; then
  63. echo " Still waiting... (${elapsed}s/${timeout}s)"
  64. fi
  65. done
  66. if [ "$all_ready" = false ]; then
  67. echo "❌ Timeout: Services failed to start within ${timeout} seconds"
  68. echo " Please check Docker logs: docker compose logs"
  69. exit 1
  70. fi
  71. else
  72. echo "❌ Failed to start Docker services even after cleanup. Please check your docker-compose.yml file."
  73. exit 1
  74. fi
  75. else
  76. echo "✅ All required Docker services are already running"
  77. fi
  78. }
  79. if [[ "$(uname -s)" != "Darwin" ]]; then
  80. echo "⚠️ Only macOS is currently supported."
  81. echo "The Roo Code evals system can also be run with Docker on any platform."
  82. echo "See https://github.com/RooCodeInc/Roo-Code/blob/main/packages/evals/README.md for instructions."
  83. exit 1
  84. fi
  85. if ! command -v brew &>/dev/null; then
  86. if [[ -f "/opt/homebrew/bin/brew" ]]; then
  87. echo "⚠️ Homebrew is installed but not in your PATH"
  88. exit 1
  89. fi
  90. read -p "🍺 Homebrew (https://brew.sh) is required. Install it? (Y/n): " install_brew
  91. if [[ "$install_brew" =~ ^[Yy]|^$ ]]; then
  92. echo "🍺 Installing Homebrew..."
  93. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || exit 1
  94. # Can be undone with:
  95. # /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" && sudo rm -rvf /opt/homebrew
  96. if [[ "$SHELL" == "/bin/zsh" ]] && ! grep -q 'eval "$(/opt/homebrew/bin/brew shellenv)"' ~/.zprofile; then
  97. echo '[[ -s "/opt/homebrew/bin/brew" ]] && eval "$(/opt/homebrew/bin/brew shellenv)"' >>~/.zprofile
  98. elif [[ "$SHELL" == "/bin/bash" ]] && ! grep -q 'eval "$(/opt/homebrew/bin/brew shellenv)"' ~/.bash_profile; then
  99. echo '[[ -s "/opt/homebrew/bin/brew" ]] && eval "$(/opt/homebrew/bin/brew shellenv)"' >>~/.bash_profile
  100. fi
  101. if [[ "$SHELL" == "/bin/zsh" ]]; then
  102. eval "$(/opt/homebrew/bin/brew shellenv)"
  103. elif [[ "$SHELL" == "/bin/bash" ]]; then
  104. eval "$(/opt/homebrew/bin/brew shellenv)"
  105. fi
  106. BREW_VERSION=$(brew --version)
  107. echo "✅ Homebrew is installed ($BREW_VERSION)"
  108. else
  109. exit 1
  110. fi
  111. else
  112. BREW_VERSION=$(brew --version)
  113. echo "✅ Homebrew is installed ($BREW_VERSION)"
  114. fi
  115. if ! command -v mise &>/dev/null; then
  116. read -p "🛠️ mise (https://mise.jdx.dev) is required. Install it? (Y/n): " install_mise
  117. if [[ "$install_mise" =~ ^[Yy]|^$ ]]; then
  118. echo "🛠️ Installing mise..."
  119. brew install mise || exit 1
  120. # Can be undone with:
  121. # brew uninstall mise
  122. # rm -rvf ~/.local/share/mise ~/.config/mise
  123. eval "$(mise activate bash)"
  124. if [[ "$SHELL" == "/bin/zsh" ]] && ! grep -q 'mise activate zsh' ~/.zprofile; then
  125. echo 'eval "$(mise activate zsh)"' >>~/.zprofile
  126. elif [[ "$SHELL" == "/bin/bash" ]] && ! grep -q 'mise activate bash' ~/.bash_profile; then
  127. echo 'eval "$(mise activate bash)"' >>~/.bash_profile
  128. fi
  129. MISE_VERSION=$(mise --version)
  130. echo "✅ mise is installed ($MISE_VERSION)"
  131. else
  132. exit 1
  133. fi
  134. else
  135. MISE_VERSION=$(mise --version)
  136. echo "✅ mise is installed ($MISE_VERSION)"
  137. eval "$(mise activate bash)"
  138. fi
  139. if ! command -v gh &>/dev/null; then
  140. read -p "👨‍💻 GitHub cli is needed to submit evals results. Install it? (Y/n): " install_gh
  141. if [[ "$install_gh" =~ ^[Yy]|^$ ]]; then
  142. brew install gh || exit 1
  143. GH_VERSION=$(gh --version | head -n 1)
  144. echo "✅ gh is installed ($GH_VERSION)"
  145. gh auth status || gh auth login -w -p https
  146. fi
  147. else
  148. GH_VERSION=$(gh --version | head -n 1)
  149. echo "✅ gh is installed ($GH_VERSION)"
  150. fi
  151. # Install language runtimes via mise
  152. if ! command -v node &>/dev/null; then
  153. echo "📦 Installing Node.js via mise..."
  154. mise install [email protected] || exit 1
  155. mise use --global [email protected] || exit 1
  156. eval "$(mise activate bash)"
  157. NODE_VERSION=$(node --version)
  158. echo "✅ Node.js is installed ($NODE_VERSION)"
  159. else
  160. NODE_VERSION=$(node --version)
  161. echo "✅ Node.js is installed ($NODE_VERSION)"
  162. fi
  163. if [[ $(node --version) != "v20.19.2" ]]; then
  164. NODE_VERSION=$(node --version)
  165. echo "🚨 You have the wrong version of node installed ($NODE_VERSION)."
  166. echo "💡 If you are using nvm then run 'nvm install' to install the version specified by the repo's .nvmrc."
  167. exit 1
  168. fi
  169. if ! command -v python &>/dev/null; then
  170. echo "📦 Installing Python via mise..."
  171. mise install [email protected] || exit 1
  172. mise use --global [email protected] || exit 1
  173. eval "$(mise activate bash)"
  174. PYTHON_VERSION=$(python --version)
  175. echo "✅ Python is installed ($PYTHON_VERSION)"
  176. else
  177. PYTHON_VERSION=$(python --version)
  178. echo "✅ Python is installed ($PYTHON_VERSION)"
  179. fi
  180. if ! command -v uv &>/dev/null; then
  181. brew install uv || exit 1
  182. UV_VERSION=$(uv --version)
  183. echo "✅ uv is installed ($UV_VERSION)"
  184. else
  185. UV_VERSION=$(uv --version)
  186. echo "✅ uv is installed ($UV_VERSION)"
  187. fi
  188. if ! command -v go &>/dev/null; then
  189. echo "📦 Installing Go via mise..."
  190. mise install [email protected] || exit 1
  191. mise use --global [email protected] || exit 1
  192. eval "$(mise activate bash)"
  193. GO_VERSION=$(go version)
  194. echo "✅ Go is installed ($GO_VERSION)"
  195. else
  196. GO_VERSION=$(go version)
  197. echo "✅ Go is installed ($GO_VERSION)"
  198. fi
  199. if ! command -v rustc &>/dev/null; then
  200. echo "📦 Installing Rust via mise..."
  201. mise install [email protected] || exit 1
  202. mise use --global [email protected] || exit 1
  203. eval "$(mise activate bash)"
  204. RUST_VERSION=$(rustc --version)
  205. echo "✅ Rust is installed ($RUST_VERSION)"
  206. else
  207. RUST_VERSION=$(rustc --version)
  208. echo "✅ Rust is installed ($RUST_VERSION)"
  209. fi
  210. if ! command -v javac &>/dev/null || ! javac --version &>/dev/null; then
  211. echo "☕ Installing Java via mise..."
  212. mise install java@openjdk-17 || exit 1
  213. mise use --global java@openjdk-17 || exit 1
  214. eval "$(mise activate bash)"
  215. JAVA_VERSION=$(javac --version | head -n 1)
  216. echo "✅ Java is installed ($JAVA_VERSION)"
  217. else
  218. JAVA_VERSION=$(javac --version | head -n 1)
  219. echo "✅ Java is installed ($JAVA_VERSION)"
  220. fi
  221. if ! command -v pnpm &>/dev/null; then
  222. brew install pnpm || exit 1
  223. PNPM_VERSION=$(pnpm --version)
  224. echo "✅ pnpm is installed ($PNPM_VERSION)"
  225. else
  226. PNPM_VERSION=$(pnpm --version)
  227. echo "✅ pnpm is installed ($PNPM_VERSION)"
  228. fi
  229. pnpm install --silent || exit 1
  230. if ! command -v code &>/dev/null; then
  231. echo "⚠️ Visual Studio Code cli is not installed"
  232. exit 1
  233. else
  234. VSCODE_VERSION=$(code --version | head -n 1)
  235. echo "✅ Visual Studio Code is installed ($VSCODE_VERSION)"
  236. fi
  237. # To reset VSCode:
  238. # rm -rvf ~/.vscode && rm -rvf ~/Library/Application\ Support/Code
  239. echo -n "🔌 Installing Visual Studio Code extensions... "
  240. code --install-extension golang.go &>/dev/null || exit 1
  241. code --install-extension dbaeumer.vscode-eslint&>/dev/null || exit 1
  242. code --install-extension redhat.java &>/dev/null || exit 1
  243. code --install-extension ms-python.python&>/dev/null || exit 1
  244. code --install-extension rust-lang.rust-analyzer &>/dev/null || exit 1
  245. if ! code --list-extensions 2>/dev/null | grep -q "RooVeterinaryInc.roo-cline"; then
  246. code --install-extension RooVeterinaryInc.roo-cline &>/dev/null || exit 1
  247. fi
  248. echo "✅ Done"
  249. if [[ ! -d "../../../evals" ]]; then
  250. echo -n "🔗 Cloning evals repository... "
  251. git clone https://github.com/RooCodeInc/Roo-Code-Evals.git ../../../evals || exit 1
  252. echo "✅ Done"
  253. else
  254. echo -n "🔄 Updating evals repository... "
  255. (cd ../../../evals && \
  256. git checkout -f &>/dev/null && \
  257. git clean -f -d &>/dev/null && \
  258. git checkout main &>/dev/null && \
  259. git pull &>/dev/null) || { echo "❌ Failed to update evals repository."; exit 1; }
  260. echo "✅ Done"
  261. fi
  262. if [[ ! -s .env.local ]]; then
  263. touch .env.local || exit 1
  264. fi
  265. # Check and start Docker services before database operations
  266. check_docker_services
  267. echo -n "🗄️ Syncing Roo Code evals database... "
  268. pnpm --filter @roo-code/evals db:push --force &>/dev/null || exit 1
  269. echo "✅ Done"
  270. if ! grep -q "OPENROUTER_API_KEY" .env.local; then
  271. read -p "🔐 Enter your OpenRouter API key (sk-or-v1-...): " openrouter_api_key
  272. echo "🔑 Validating..."
  273. curl --silent --fail https://openrouter.ai/api/v1/key -H "Authorization: Bearer $openrouter_api_key" &>/dev/null || exit 1
  274. echo "OPENROUTER_API_KEY=$openrouter_api_key" >> .env.local || exit 1
  275. fi
  276. current_version=$(code --list-extensions --show-versions 2>/dev/null | grep roo)
  277. read -p "💻 Do you want to build a new version of the Roo Code extension? [currently $current_version] (y/N): " build_extension
  278. if [[ "$build_extension" =~ ^[Yy]$ ]]; then
  279. build_extension
  280. fi
  281. echo -e "\n🚀 You're ready to rock and roll! \n"
  282. if ! nc -z localhost 3446; then
  283. read -p "🌐 Would you like to start the evals web app? (Y/n): " start_evals
  284. if [[ "$start_evals" =~ ^[Yy]|^$ ]]; then
  285. pnpm --filter @roo-code/web-evals dev
  286. else
  287. echo "💡 You can start it anytime with 'pnpm --filter @roo-code/web-evals dev'."
  288. fi
  289. else
  290. echo "👟 The evals web app is running at http://localhost:3446"
  291. fi