From 76d6258a543aac1204d228be3775961614f502ce Mon Sep 17 00:00:00 2001 From: Sanju Sivalingam Date: Mon, 16 Feb 2026 13:43:38 +0530 Subject: [PATCH] Add manual install steps alongside curl, harden install script Site and README now show both curl one-liner and manual steps. Explicit note that bun is required (node/npm won't work). Install script improvements: version check, node detection warning, curl check, Windows detection, .git dir validation, shallow clone, fallback on bun install --silent, post-install missing dep summary. Co-Authored-By: Claude Opus 4.6 --- README.md | 10 ++++- site/index.html | 11 +++++ site/install.sh | 114 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 107 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index d9b2d03..09acbe0 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,20 @@ curl -fsSL https://droidclaw.ai/install.sh | sh installs bun and adb if missing, clones the repo, sets up `.env`. or do it manually: ```bash -brew install android-platform-tools # adb +# install adb +brew install android-platform-tools + +# install bun (required — npm/node won't work) +curl -fsSL https://bun.sh/install | bash + +# clone and setup git clone https://github.com/unitedbyai/droidclaw.git cd droidclaw && bun install cp .env.example .env ``` +> **note:** droidclaw requires [bun](https://bun.sh), not node/npm. it uses bun-specific apis (`Bun.spawnSync`, native `.env` loading) that don't exist in node. + edit `.env` - fastest way to start is with ollama (fully local, no api key): ```bash diff --git a/site/index.html b/site/index.html index 3dc266b..7b18f4b 100644 --- a/site/index.html +++ b/site/index.html @@ -761,6 +761,17 @@ bun run src/kernel.ts --workflow morning.json

install

one command. installs bun and adb if missing, clones the repo, sets up .env.

curl -fsSL https://droidclaw.ai/install.sh | sh
+

or do it manually:

+
# install adb
+brew install android-platform-tools
+
+# install bun (required — npm/node won't work)
+curl -fsSL https://bun.sh/install | bash
+
+# clone and setup
+git clone https://github.com/unitedbyai/droidclaw.git
+cd droidclaw && bun install
+cp .env.example .env
2 diff --git a/site/install.sh b/site/install.sh index 8438e06..2f0fd12 100755 --- a/site/install.sh +++ b/site/install.sh @@ -6,6 +6,7 @@ set -e REPO="https://github.com/unitedbyai/droidclaw.git" INSTALL_DIR="droidclaw" +MIN_BUN_MAJOR=1 # colors RED='\033[0;31m' @@ -19,82 +20,129 @@ RESET='\033[0m' info() { printf "${CYAN}>${RESET} %s\n" "$1"; } success() { printf "${GREEN}>${RESET} %s\n" "$1"; } warn() { printf "${YELLOW}>${RESET} %s\n" "$1"; } -error() { printf "${RED}>${RESET} %s\n" "$1"; exit 1; } +error() { printf "${RED}error:${RESET} %s\n" "$1"; exit 1; } printf "\n${BOLD}droidclaw${RESET} ${DIM}— ai agent for android${RESET}\n\n" +# ─── check curl ─── +if ! command -v curl >/dev/null 2>&1; then + error "curl is required but not found. install curl first." +fi + # ─── check git ─── if ! command -v git >/dev/null 2>&1; then error "git is required. install it first: https://git-scm.com" fi # ─── check/install bun ─── -if command -v bun >/dev/null 2>&1; then - success "bun $(bun --version) found" -else +# droidclaw requires bun — it uses Bun.spawnSync() and native .env loading +# these APIs don't exist in node/npm, so node won't work +install_bun() { info "installing bun..." curl -fsSL https://bun.sh/install | bash - export BUN_INSTALL="$HOME/.bun" + # bun installs to ~/.bun/bin — add to PATH for this session + export BUN_INSTALL="${BUN_INSTALL:-$HOME/.bun}" export PATH="$BUN_INSTALL/bin:$PATH" - if command -v bun >/dev/null 2>&1; then - success "bun installed" +} + +if command -v bun >/dev/null 2>&1; then + BUN_VERSION=$(bun --version 2>/dev/null || echo "0.0.0") + BUN_MAJOR=$(echo "$BUN_VERSION" | cut -d. -f1) + if [ "$BUN_MAJOR" -ge "$MIN_BUN_MAJOR" ] 2>/dev/null; then + success "bun $BUN_VERSION found" else - error "bun install failed. install manually: https://bun.sh" + warn "bun $BUN_VERSION is too old (need $MIN_BUN_MAJOR.0+), upgrading..." + install_bun fi +else + if command -v node >/dev/null 2>&1; then + warn "node found but droidclaw requires bun (uses bun-specific APIs)" + warn "node/npm won't work — installing bun alongside node..." + fi + install_bun +fi + +# verify bun is actually available +if ! command -v bun >/dev/null 2>&1; then + printf "\n" + error "bun installation failed. install manually:\n\n curl -fsSL https://bun.sh/install | bash\n\n then re-run this installer." fi # ─── check adb ─── if command -v adb >/dev/null 2>&1; then success "adb found" else - warn "adb not found — installing..." + warn "adb not found — attempting install..." OS="$(uname -s)" case "$OS" in Darwin) if command -v brew >/dev/null 2>&1; then - brew install --cask android-platform-tools - success "adb installed via homebrew" + info "installing via homebrew..." + brew install --cask android-platform-tools 2>/dev/null && success "adb installed via homebrew" || { + warn "homebrew install failed. trying brew formula..." + brew install android-platform-tools 2>/dev/null && success "adb installed via homebrew" || { + warn "could not install adb automatically" + warn "install manually: brew install android-platform-tools" + warn "or download from: https://developer.android.com/tools/releases/platform-tools" + } + } else warn "homebrew not found. install adb manually:" - warn " brew install --cask android-platform-tools" + warn " /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"" + warn " brew install android-platform-tools" warn " or download from: https://developer.android.com/tools/releases/platform-tools" fi ;; Linux) if command -v apt-get >/dev/null 2>&1; then - sudo apt-get update -qq && sudo apt-get install -y -qq android-tools-adb - success "adb installed via apt" + info "installing via apt..." + sudo apt-get update -qq && sudo apt-get install -y -qq android-tools-adb && success "adb installed via apt" || { + warn "apt install failed. install manually: sudo apt install android-tools-adb" + } elif command -v dnf >/dev/null 2>&1; then - sudo dnf install -y android-tools - success "adb installed via dnf" + info "installing via dnf..." + sudo dnf install -y android-tools && success "adb installed via dnf" || { + warn "dnf install failed. install manually: sudo dnf install android-tools" + } elif command -v pacman >/dev/null 2>&1; then - sudo pacman -S --noconfirm android-tools - success "adb installed via pacman" + info "installing via pacman..." + sudo pacman -S --noconfirm android-tools && success "adb installed via pacman" || { + warn "pacman install failed. install manually: sudo pacman -S android-tools" + } else warn "could not auto-install adb. install manually:" warn " https://developer.android.com/tools/releases/platform-tools" fi ;; + MINGW*|MSYS*|CYGWIN*) + warn "windows detected. install adb manually:" + warn " https://developer.android.com/tools/releases/platform-tools" + warn " extract and add to PATH" + ;; *) - warn "unknown os. install adb manually:" + warn "unknown os ($OS). install adb manually:" warn " https://developer.android.com/tools/releases/platform-tools" ;; esac fi -# ─── clone ─── +# ─── clone or update ─── if [ -d "$INSTALL_DIR" ]; then - info "droidclaw directory exists, pulling latest..." - cd "$INSTALL_DIR" && git pull --quiet && cd .. + if [ -d "$INSTALL_DIR/.git" ]; then + info "droidclaw directory exists, pulling latest..." + (cd "$INSTALL_DIR" && git pull --quiet) + else + error "directory '$INSTALL_DIR' exists but is not a git repo. remove it or install elsewhere." + fi else info "cloning droidclaw..." - git clone --quiet "$REPO" "$INSTALL_DIR" + git clone --quiet --depth 1 "$REPO" "$INSTALL_DIR" fi # ─── install deps ─── cd "$INSTALL_DIR" info "installing dependencies..." -bun install --silent +bun install --silent 2>/dev/null || bun install # ─── setup env ─── if [ ! -f .env ]; then @@ -104,10 +152,22 @@ else success ".env already exists, skipping" fi -# ─── done ─── -printf "\n${GREEN}${BOLD}done!${RESET}\n\n" +# ─── summary ─── +printf "\n${GREEN}${BOLD}installed!${RESET}\n\n" + +# check what's missing +MISSING="" +if ! command -v adb >/dev/null 2>&1; then + MISSING="adb" +fi + +if [ -n "$MISSING" ]; then + warn "missing: $MISSING (install before running)" + printf "\n" +fi + printf "next steps:\n\n" -printf " ${BOLD}1.${RESET} configure an llm provider in ${CYAN}.env${RESET}\n\n" +printf " ${BOLD}1.${RESET} configure an llm provider in ${CYAN}droidclaw/.env${RESET}\n\n" printf " ${DIM}# local with ollama (no api key needed)${RESET}\n" printf " ollama pull llama3.2\n" printf " ${DIM}# set in .env:${RESET} LLM_PROVIDER=ollama\n\n"