#!/usr/bin/env bash # # install.sh: Set up Claude Code on Termux # # Usage: bash install.sh [--dry-run] # set -e RED="\033[0;31m" GREEN="\033[0;32m" YELLOW="\033[1;33m" CYAN="\033[0;36m" NC="\033[0m" DRY_RUN=false [[ "$1" == "--dry-run" ]] && DRY_RUN=true CLAUDE_VERSION="2.1.112" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" BIN_DIR="$HOME/.local/bin" step() { echo -e "\n${CYAN}[$1/$TOTAL] $2${NC}"; } run() { if $DRY_RUN; then echo -e " ${YELLOW}[dry-run]${NC} $*" else "$@" fi } # Verify we're on Termux if [[ -z "$PREFIX" || ! -d "$PREFIX" ]]; then echo -e "${RED}Error: Not running on Termux${NC}" echo "This installer is designed for Termux on Android." exit 1 fi TOTAL=9 echo -e "${GREEN}=== Claude Code for Termux - Installer ===${NC}" echo "Version ceiling: v$CLAUDE_VERSION" $DRY_RUN && echo -e "${YELLOW}(dry-run mode - no changes will be made)${NC}" # 1. Install system packages step 1 "Installing system packages..." run pkg install -y nodejs python git proot # 2. Install Claude Code step 2 "Installing Claude Code v$CLAUDE_VERSION..." run npm install -g "@anthropic-ai/claude-code@$CLAUDE_VERSION" # 3. Protect against auto-updater step 3 "Protecting against auto-updater..." CLAUDE_DIR="$PREFIX/lib/node_modules/@anthropic-ai/claude-code" if [[ -d "$CLAUDE_DIR" ]]; then run chmod -R a-w "$CLAUDE_DIR" fi # 4. Install scripts step 4 "Installing scripts to $BIN_DIR..." run mkdir -p "$BIN_DIR" for script in clauded claude-check-env claude-update mdns-resolve mdns-publish.py ssh-mdns-proxy ssh-fallback; do run cp "$SCRIPT_DIR/bin/$script" "$BIN_DIR/$script" run chmod +x "$BIN_DIR/$script" done # 5. Claude settings step 5 "Configuring Claude settings..." run mkdir -p "$HOME/.claude" if [[ ! -f "$HOME/.claude/settings.json" ]]; then run cp "$SCRIPT_DIR/config/settings.json" "$HOME/.claude/settings.json" else echo " ~/.claude/settings.json already exists, skipping" fi # 6. Bashrc additions step 6 "Updating ~/.bashrc..." if ! grep -q "DISABLE_AUTOUPDATER" "$HOME/.bashrc" 2>/dev/null; then if ! $DRY_RUN; then echo "" >> "$HOME/.bashrc" cat "$SCRIPT_DIR/config/bashrc.snippet" >> "$HOME/.bashrc" fi echo " Added Claude-related exports to ~/.bashrc" else echo " ~/.bashrc already configured, skipping" fi # 7. Install sharp-wasm32 (image support) step 7 "Installing Sharp WASM (image support)..." run npm install -g @img/sharp-wasm32 sharp --force 2>/dev/null || { echo -e " ${YELLOW}Sharp install failed (optional, images won't work)${NC}" } # 8. Install zeroconf for mDNS publisher (needed by mdns-publish.py) step 8 "Installing zeroconf (pip) for mDNS publishing..." run pip install --quiet zeroconf 2>/dev/null || { echo -e " ${YELLOW}zeroconf install failed (optional, mdns-publish won't work)${NC}" } # 9. Done step 9 "Verifying installation..." if ! $DRY_RUN; then echo "" "$BIN_DIR/claude-check-env" fi echo "" echo -e "${GREEN}=== Installation Complete ===${NC}" echo "" echo "Next steps:" echo " 1. Restart your shell: source ~/.bashrc" echo " 2. Authenticate: claude auth" echo " 3. Start Claude: clauded" echo "" echo "See docs/TROUBLESHOOTING.md for common issues."