#!/usr/bin/env bash set -euo pipefail REPO="RunanywhereAI/RCLI" TAP="RunanywhereAI/rcli" FORMULA="rcli" info() { printf "\033[1;34m==>\033[0m \033[1m%s\033[0m\n" "$*"; } ok() { printf "\033[1;32m==>\033[0m %s\n" "$*"; } warn() { printf "\033[1;33mWarning:\033[0m %s\n" "$*"; } fail() { printf "\033[1;31mError:\033[0m %s\n" "$*" >&2; exit 1; } ENGINE_FLAG="" while [[ $# -gt 0 ]]; do case "$1" in --engine) ENGINE_FLAG="$2"; shift 2 ;; --engine=*) ENGINE_FLAG="${1#*=}"; shift ;; *) shift ;; esac done info "Checking latest RCLI release..." VERSION=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" \ | grep '"tag_name"' \ | sed 's/.*"v\([^"]*\)".*/\1/') [[ -n "$VERSION" ]] || fail "Could not determine latest release version. Check your internet connection." info "Latest version: v${VERSION}" [[ "$(uname -s)" == "Darwin" ]] || fail "RCLI requires macOS. Detected: $(uname -s)" arch=$(uname -m) [[ "$arch" == "arm64" ]] || fail "RCLI requires Apple Silicon (M1+). Detected: $arch" if ! command -v brew &>/dev/null; then info "Installing Homebrew..." /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" eval "$(/opt/homebrew/bin/brew shellenv)" fi info "Tapping $TAP..." brew tap "$TAP" "https://github.com/$REPO.git" 2>/dev/null || true # Force-update the tap so Homebrew sees the latest formula brew update --force 2>/dev/null || true info "Installing RCLI v${VERSION}..." if brew upgrade "$FORMULA" 2>/dev/null || brew install "$FORMULA" 2>/dev/null; then ok "Installed via Homebrew" else warn "brew install failed (likely macOS 26 CLT issue). Installing manually..." brew fetch "$FORMULA" 2>/dev/null || true CACHED="$(brew --cache "$FORMULA" 2>/dev/null || true)" if [[ -z "$CACHED" || ! -f "$CACHED" ]]; then info "Downloading tarball directly..." CACHED="/tmp/rcli-${VERSION}.tar.gz" curl -fsSL -o "$CACHED" \ "https://github.com/$REPO/releases/download/v${VERSION}/rcli-${VERSION}-Darwin-arm64.tar.gz" fi WORKDIR=$(mktemp -d) tar xzf "$CACHED" -C "$WORKDIR" CELLAR="/opt/homebrew/Cellar/$FORMULA/$VERSION" rm -rf "$CELLAR" 2>/dev/null || sudo rm -rf "$CELLAR" mkdir -p "$CELLAR/bin" "$CELLAR/lib" 2>/dev/null || sudo mkdir -p "$CELLAR/bin" "$CELLAR/lib" cp "$WORKDIR"/rcli-*/bin/rcli "$CELLAR/bin/" 2>/dev/null || sudo cp "$WORKDIR"/rcli-*/bin/rcli "$CELLAR/bin/" cp "$WORKDIR"/rcli-*/lib/*.dylib "$CELLAR/lib/" 2>/dev/null || sudo cp "$WORKDIR"/rcli-*/lib/*.dylib "$CELLAR/lib/" brew link --overwrite "$FORMULA" 2>/dev/null || sudo brew link --overwrite "$FORMULA" rm -rf "$WORKDIR" ok "Installed manually into Homebrew Cellar" fi if ! command -v rcli &>/dev/null; then fail "Installation failed. rcli not found in PATH." fi ok "RCLI v${VERSION} installed successfully" echo "" info "Setting up AI models and engine (one-time)..." if [[ -n "$ENGINE_FLAG" ]]; then case "$ENGINE_FLAG" in llamacpp|1) echo "1" | rcli setup ;; metalrt|2) echo "2" | rcli setup ;; both|3) echo "3" | rcli setup ;; *) warn "Unknown engine '$ENGINE_FLAG'. Valid: llamacpp, metalrt, both" rcli setup