#!/bin/bash set -euo pipefail CAVE_BIN_DIR="${HOME}/.local/bin" CAVE_CONFIG_DIR="${HOME}/.config/cave" CAVE_CONFIG_FILE="${CAVE_CONFIG_DIR}/config.json" CAVE_AUTH_FILE="${CAVE_CONFIG_DIR}/auth.json" # Injected by the platform server at download time CAVE_HOST="${CAVE_HOST:-build.withcave.ai}" CAVE_PROTOCOL="${CAVE_PROTOCOL:-https}" detect_platform() { local os arch os=$(uname -s | tr '[:upper:]' '[:lower:]') arch=$(uname -m) case "$os" in linux) case "$arch" in x86_64) echo "linux-x64" ;; aarch64|arm64) echo "linux-arm64" ;; *) return 1 ;; esac ;; darwin) case "$arch" in x86_64) echo "darwin-x64" ;; arm64) echo "darwin-arm64" ;; *) return 1 ;; esac ;; *) return 1 ;; esac } map_platform_to_binary() { local platform=$1 case "$platform" in linux-x64) echo "cave-linux-x64" ;; linux-arm64) echo "cave-linux-arm64" ;; darwin-x64) echo "cave-darwin-x64" ;; darwin-arm64) echo "cave-darwin-arm64" ;; *) return 1 ;; esac } log_info() { echo "[INFO] $*" } log_error() { echo "[ERROR] $*" >&2 } log_success() { echo "[SUCCESS] $*" } platform=$(detect_platform) || { log_error "Unsupported platform: $(uname -s) $(uname -m)" log_error "Supported platforms: linux-x64, linux-arm64, darwin-x64, darwin-arm64" exit 1 } binary=$(map_platform_to_binary "$platform") || { log_error "No binary available for platform: $platform" exit 1 } log_info "Detected platform: $platform" log_info "Cave host: $CAVE_HOST" mkdir -p "$CAVE_BIN_DIR" mkdir -p "$CAVE_CONFIG_DIR" log_info "Downloading Cave CLI..." binary_url="${CAVE_PROTOCOL}://${CAVE_HOST}/api/v1/apps/download/${binary}" if ! curl -fsSL --connect-timeout 10 "$binary_url" -o "${CAVE_BIN_DIR}/cave" < /dev/null; then log_error "Failed to download CLI binary from $binary_url" log_error "Make sure the Cave platform is running and accessible at $CAVE_HOST" exit 1 fi chmod +x "${CAVE_BIN_DIR}/cave" # Strip macOS quarantine attribute to avoid Gatekeeper warnings. if [[ "$(uname -s)" == "Darwin" ]]; then xattr -d com.apple.quarantine "${CAVE_BIN_DIR}/cave" 2>/dev/null || true fi add_to_path() { local shell_rc=$1 local path_line="export PATH=\"${CAVE_BIN_DIR}:\$PATH\"" if [[ -f "$shell_rc" ]]; then if ! grep -qF "${CAVE_BIN_DIR}" "$shell_rc"; then echo "" >> "$shell_rc" echo "# Cave CLI" >> "$shell_rc" echo "$path_line" >> "$shell_rc" log_info "Added Cave CLI to PATH in $shell_rc" fi else echo "$path_line" >> "$shell_rc" log_info "Created $shell_rc with Cave CLI in PATH" fi } add_to_path "${HOME}/.bashrc" add_to_path "${HOME}/.zshrc" log_info "Writing config..." cat > "$CAVE_CONFIG_FILE" << INNEREOF { "host": "${CAVE_HOST}" } INNEREOF log_success "Cave CLI installed" echo "" if [[ -s "$CAVE_AUTH_FILE" ]]; then echo "Run 'cave help' to get started." else echo "Run 'cave login' to authenticate with your Cave platform." fi