#!/bin/bash # NomadArch Installer for Linux # Version: 0.6.1 - Universal Edition # Exit on error but provide helpful messages set -u # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' BOLD='\033[1m' # Script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TARGET_DIR="$SCRIPT_DIR" BIN_DIR="$TARGET_DIR/bin" LOG_FILE="$TARGET_DIR/install.log" ERRORS=0 WARNINGS=0 BINARY_FREE_MODE=1 # Logging function log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } print_header() { echo "" echo -e "${CYAN}==============================================================${NC}" echo -e "${CYAN}|${NC} ${BOLD}NomadArch Installer for Linux${NC} ${CYAN}|${NC}" echo -e "${CYAN}|${NC} Version: 0.6.1 - Universal Edition ${CYAN}|${NC}" echo -e "${CYAN}==============================================================${NC}" echo "" } print_header log "========== Installer started ==========" # --------------------------------------------------------------- # STEP 1: OS and Architecture Detection # --------------------------------------------------------------- echo "[STEP 1/8] Detecting System..." OS_TYPE=$(uname -s) ARCH_TYPE=$(uname -m) log "OS: $OS_TYPE, Arch: $ARCH_TYPE" if [[ "$OS_TYPE" != "Linux" ]]; then echo -e "${RED}[ERROR]${NC} This installer is for Linux. Current OS: $OS_TYPE" log "ERROR: Not Linux ($OS_TYPE)" exit 1 fi echo -e "${GREEN}[OK]${NC} OS: Linux ($ARCH_TYPE)" # --------------------------------------------------------------- # STEP 2: Check Write Permissions # --------------------------------------------------------------- echo "" echo "[STEP 2/8] Checking Write Permissions..." mkdir -p "$BIN_DIR" 2>/dev/null || true if ! touch "$SCRIPT_DIR/.install-write-test" 2>/dev/null; then echo -e "${YELLOW}[WARN]${NC} No write access to $SCRIPT_DIR" TARGET_DIR="$HOME/.nomadarch" BIN_DIR="$TARGET_DIR/bin" LOG_FILE="$TARGET_DIR/install.log" mkdir -p "$BIN_DIR" cp -R "$SCRIPT_DIR/"* "$TARGET_DIR/" 2>/dev/null || true echo -e "${GREEN}[INFO]${NC} Using fallback location: $TARGET_DIR" else rm "$SCRIPT_DIR/.install-write-test" 2>/dev/null echo -e "${GREEN}[OK]${NC} Write permissions verified" fi log "Install target: $TARGET_DIR" # --------------------------------------------------------------- # STEP 3: Check and Install Node.js # --------------------------------------------------------------- echo "" echo "[STEP 3/8] Checking Node.js..." NODE_OK=0 NPM_OK=0 if command -v node >/dev/null 2>&1; then NODE_VERSION=$(node --version) echo -e "${GREEN}[OK]${NC} Node.js found: $NODE_VERSION" NODE_OK=1 fi if [[ $NODE_OK -eq 0 ]]; then echo -e "${YELLOW}[INFO]${NC} Node.js not found. Attempting automatic installation..." # Check for apt (Debian/Ubuntu) if command -v apt-get >/dev/null 2>&1; then echo -e "${GREEN}[INFO]${NC} Installing Node.js via apt-get..." sudo apt-get update && sudo apt-get install -y nodejs npm [[ $? -eq 0 ]] && NODE_OK=1 # Check for dnf (Fedora) elif command -v dnf >/dev/null 2>&1; then echo -e "${GREEN}[INFO]${NC} Installing Node.js via dnf..." sudo dnf install -y nodejs npm [[ $? -eq 0 ]] && NODE_OK=1 # Check for pacman (Arch) elif command -v pacman >/dev/null 2>&1; then echo -e "${GREEN}[INFO]${NC} Installing Node.js via pacman..." sudo pacman -S --noconfirm nodejs npm [[ $? -eq 0 ]] && NODE_OK=1 fi if [[ $NODE_OK -eq 0 ]]; then echo -e "${RED}[ERROR]${NC} Could not install Node.js automatically." echo "Please install Node.js manually using your package manager." ((ERRORS++)) fi fi # --------------------------------------------------------------- # STEP 4: Check Git (Optional) # --------------------------------------------------------------- echo "" echo "[STEP 4/8] Checking Git (optional)..." if command -v git >/dev/null 2>&1; then GIT_VERSION=$(git --version) echo -e "${GREEN}[OK]${NC} $GIT_VERSION" else echo -e "${YELLOW}[INFO]${NC} Git not found (optional)" ((WARNINGS++)) fi # --------------------------------------------------------------- # STEP 5: Install Dependencies # --------------------------------------------------------------- echo "" echo "[STEP 5/8] Installing Dependencies..." cd "$TARGET_DIR" || exit 1 if [[ ! -f "package.json" ]]; then echo -e "${RED}[ERROR]${NC} package.json not found" ((ERRORS++)) else echo -e "${GREEN}[INFO]${NC} Running npm install..." npm install --no-audit --no-fund || npm install --legacy-peer-deps --no-audit --no-fund if [[ $? -eq 0 ]]; then echo -e "${GREEN}[OK]${NC} Dependencies installed" else echo -e "${RED}[ERROR]${NC} npm install failed" ((ERRORS++)) fi fi # --------------------------------------------------------------- # STEP 6: OpenCode Setup # --------------------------------------------------------------- echo "" echo "[STEP 6/8] OpenCode Setup..." echo "" echo -e "${CYAN}==============================================================${NC}" echo -e "${CYAN}|${NC} NomadArch supports Binary-Free Mode! ${CYAN}|${NC}" echo -e "${CYAN}|${NC} Using free cloud models: GPT-5 Nano, Grok Code, etc. ${CYAN}|${NC}" echo -e "${CYAN}==============================================================${NC}" echo "" echo -e "${GREEN}[OK]${NC} Using Binary-Free Mode (default)" # --------------------------------------------------------------- # STEP 7: Build Assets # --------------------------------------------------------------- echo "" echo "[STEP 7/8] Building Assets..." if [[ -f "$TARGET_DIR/packages/ui/dist/index.html" ]]; then echo -e "${GREEN}[OK]${NC} UI build exists" else echo -e "${GREEN}[INFO]${NC} Building UI..." cd "$TARGET_DIR/packages/ui" && npm run build if [[ $? -eq 0 ]]; then echo -e "${GREEN}[OK]${NC} UI assets built" else echo -e "${RED}[ERROR]${NC} UI build failed" ((ERRORS++)) fi cd "$TARGET_DIR" || exit 1 fi # --------------------------------------------------------------- # STEP 8: Health Check # --------------------------------------------------------------- echo "" echo "[STEP 8/8] Running Health Check..." HEALTH_OK=1 [[ -f "$TARGET_DIR/package.json" ]] || HEALTH_OK=0 [[ -d "$TARGET_DIR/packages/ui" ]] || HEALTH_OK=0 [[ -d "$TARGET_DIR/packages/server" ]] || HEALTH_OK=0 [[ -d "$TARGET_DIR/node_modules" ]] || HEALTH_OK=0 if [[ $HEALTH_OK -eq 1 ]]; then echo -e "${GREEN}[OK]${NC} All checks passed" else echo -e "${RED}[ERROR]${NC} Health checks failed" ((ERRORS++)) fi # --------------------------------------------------------------- # SUMMARY # --------------------------------------------------------------- echo "" echo -e "${CYAN}==============================================================${NC}" echo -e "${CYAN}|${NC} INSTALLATION SUMMARY ${CYAN}|${NC}" echo -e "${CYAN}==============================================================${NC}" echo "" echo " Target: $TARGET_DIR" echo " Mode: Binary-Free Mode" echo " Errors: $ERRORS" echo " Warnings: $WARNINGS" echo "" if [[ $ERRORS -gt 0 ]]; then echo -e "${RED}INSTALLATION FAILED${NC}" echo "Check the log file: $LOG_FILE" exit 1 else echo -e "${GREEN}INSTALLATION SUCCESSFUL!${NC}" echo "" echo "To start NomadArch, run:" echo -e " ${BOLD}./Launch-Linux.sh${NC}" echo "" exit 0 fi