587 lines
20 KiB
Bash
587 lines
20 KiB
Bash
#!/bin/bash
|
|
# ╔══════════════════════════════════════════════════════════════════╗
|
|
# ║ AUTARCH Installer ║
|
|
# ║ Autonomous Tactical Agent for Reconnaissance, ║
|
|
# ║ Counterintelligence, and Hacking ║
|
|
# ║ By darkHal Security Group & Setec Security Labs ║
|
|
# ╚══════════════════════════════════════════════════════════════════╝
|
|
|
|
set -e
|
|
|
|
# ── Colors & Symbols ─────────────────────────────────────────────────
|
|
R='\033[91m'; G='\033[92m'; Y='\033[93m'; B='\033[94m'; M='\033[95m'
|
|
C='\033[96m'; W='\033[97m'; D='\033[2m'; BLD='\033[1m'; RST='\033[0m'
|
|
CHK="${G}✔${RST}"; CROSS="${R}✘${RST}"; DOT="${C}●${RST}"; ARROW="${M}▸${RST}"
|
|
WARN="${Y}⚠${RST}"
|
|
|
|
# ── Paths ────────────────────────────────────────────────────────────
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
VENV_DIR="$SCRIPT_DIR/venv"
|
|
REQ_FILE="$SCRIPT_DIR/requirements.txt"
|
|
|
|
# ── State ────────────────────────────────────────────────────────────
|
|
INSTALL_LLM_LOCAL=false
|
|
INSTALL_LLM_CLOUD=false
|
|
INSTALL_LLM_HF=false
|
|
INSTALL_SYSTEM_TOOLS=false
|
|
INSTALL_NODE_HW=false
|
|
GPU_TYPE="none"
|
|
TOTAL_STEPS=0
|
|
CURRENT_STEP=0
|
|
|
|
# ── Helper Functions ─────────────────────────────────────────────────
|
|
|
|
clear_screen() { printf '\033[2J\033[H'; }
|
|
|
|
# Draw a horizontal rule
|
|
hr() {
|
|
local char="${1:-─}"
|
|
printf "${D}"
|
|
printf '%*s' 66 '' | tr ' ' "$char"
|
|
printf "${RST}\n"
|
|
}
|
|
|
|
# Print a styled header
|
|
header() {
|
|
printf "\n${BLD}${C} $1${RST}\n"
|
|
hr
|
|
}
|
|
|
|
# Print a status line
|
|
status() { printf " ${DOT} $1\n"; }
|
|
ok() { printf " ${CHK} $1\n"; }
|
|
fail() { printf " ${CROSS} $1\n"; }
|
|
warn() { printf " ${WARN} $1\n"; }
|
|
info() { printf " ${ARROW} $1\n"; }
|
|
|
|
# Progress bar
|
|
progress_bar() {
|
|
local pct=$1
|
|
local width=40
|
|
local filled=$(( pct * width / 100 ))
|
|
local empty=$(( width - filled ))
|
|
printf "\r ${D}[${RST}${G}"
|
|
printf '%*s' "$filled" '' | tr ' ' '█'
|
|
printf "${D}"
|
|
printf '%*s' "$empty" '' | tr ' ' '░'
|
|
printf "${RST}${D}]${RST} ${W}%3d%%${RST}" "$pct"
|
|
}
|
|
|
|
step_progress() {
|
|
CURRENT_STEP=$((CURRENT_STEP + 1))
|
|
local pct=$((CURRENT_STEP * 100 / TOTAL_STEPS))
|
|
progress_bar "$pct"
|
|
printf " ${D}$1${RST}\n"
|
|
}
|
|
|
|
# Detect OS
|
|
detect_os() {
|
|
case "$(uname -s)" in
|
|
Linux*) OS="linux" ;;
|
|
Darwin*) OS="macos" ;;
|
|
MINGW*|MSYS*|CYGWIN*) OS="windows" ;;
|
|
*) OS="unknown" ;;
|
|
esac
|
|
}
|
|
|
|
# Check if command exists
|
|
has() { command -v "$1" &>/dev/null; }
|
|
|
|
# ── Banner ───────────────────────────────────────────────────────────
|
|
|
|
show_banner() {
|
|
clear_screen
|
|
printf "${R}${BLD}"
|
|
cat << 'BANNER'
|
|
|
|
▄▄▄ █ ██ ▄▄▄█████▓ ▄▄▄ ██▀███ ▄████▄ ██░ ██
|
|
▒████▄ ██ ▓██▒▓ ██▒ ▓▒▒████▄ ▓██ ▒ ██▒▒██▀ ▀█ ▓██░ ██▒
|
|
▒██ ▀█▄ ▓██ ▒██░▒ ▓██░ ▒░▒██ ▀█▄ ▓██ ░▄█ ▒▒▓█ ▄ ▒██▀▀██░
|
|
░██▄▄▄▄██ ▓▓█ ░██░░ ▓██▓ ░ ░██▄▄▄▄██ ▒██▀▀█▄ ▒▓▓▄ ▄██▒░▓█ ░██
|
|
▓█ ▓██▒▒▒█████▓ ▒██▒ ░ ▓█ ▓██▒░██▓ ▒██▒▒ ▓███▀ ░░▓█▒░██▓
|
|
▒▒ ▓▒█░░▒▓▒ ▒ ▒ ▒ ░░ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ░▒ ▒ ░ ▒ ░░▒░▒
|
|
▒ ▒▒ ░░░▒░ ░ ░ ░ ▒ ▒▒ ░ ░▒ ░ ▒░ ░ ▒ ▒ ░▒░ ░
|
|
░ ▒ ░░░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░░ ░
|
|
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
|
|
|
BANNER
|
|
printf "${RST}"
|
|
printf "${C}${BLD} ╔══════════════════════════════════╗${RST}\n"
|
|
printf "${C}${BLD} ║ I N S T A L L E R v1.0 ║${RST}\n"
|
|
printf "${C}${BLD} ╚══════════════════════════════════╝${RST}\n"
|
|
printf "${D} By darkHal Security Group & Setec Security Labs${RST}\n\n"
|
|
}
|
|
|
|
# ── System Check ─────────────────────────────────────────────────────
|
|
|
|
show_system_check() {
|
|
header "SYSTEM CHECK"
|
|
|
|
detect_os
|
|
case "$OS" in
|
|
linux) ok "OS: Linux ($(. /etc/os-release 2>/dev/null && echo "$PRETTY_NAME" || uname -r))" ;;
|
|
macos) ok "OS: macOS $(sw_vers -productVersion 2>/dev/null)" ;;
|
|
windows) ok "OS: Windows (MSYS2/Git Bash)" ;;
|
|
*) warn "OS: Unknown ($(uname -s))" ;;
|
|
esac
|
|
|
|
# Python
|
|
if has python3; then
|
|
local pyver=$(python3 --version 2>&1 | awk '{print $2}')
|
|
local pymajor=$(echo "$pyver" | cut -d. -f1)
|
|
local pyminor=$(echo "$pyver" | cut -d. -f2)
|
|
if [ "$pymajor" -ge 3 ] && [ "$pyminor" -ge 10 ]; then
|
|
ok "Python $pyver"
|
|
else
|
|
warn "Python $pyver ${D}(3.10+ recommended)${RST}"
|
|
fi
|
|
elif has python; then
|
|
local pyver=$(python --version 2>&1 | awk '{print $2}')
|
|
ok "Python $pyver ${D}(using 'python' command)${RST}"
|
|
else
|
|
fail "Python not found — install Python 3.10+"
|
|
exit 1
|
|
fi
|
|
|
|
# pip
|
|
if has pip3 || has pip; then
|
|
ok "pip available"
|
|
else
|
|
fail "pip not found"
|
|
exit 1
|
|
fi
|
|
|
|
# Git
|
|
if has git; then
|
|
ok "Git $(git --version | awk '{print $3}')"
|
|
else
|
|
warn "Git not found ${D}(optional)${RST}"
|
|
fi
|
|
|
|
# Node/npm
|
|
if has node && has npm; then
|
|
ok "Node $(node --version) / npm $(npm --version 2>/dev/null)"
|
|
else
|
|
warn "Node.js not found ${D}(needed for hardware WebUSB libs)${RST}"
|
|
fi
|
|
|
|
# System tools
|
|
local tools=("nmap" "tshark" "openssl" "adb" "fastboot" "wg" "upnpc")
|
|
local found=()
|
|
local missing=()
|
|
for t in "${tools[@]}"; do
|
|
if has "$t"; then
|
|
found+=("$t")
|
|
else
|
|
missing+=("$t")
|
|
fi
|
|
done
|
|
if [ ${#found[@]} -gt 0 ]; then
|
|
ok "System tools: ${G}${found[*]}${RST}"
|
|
fi
|
|
if [ ${#missing[@]} -gt 0 ]; then
|
|
info "Not found: ${D}${missing[*]}${RST} ${D}(optional)${RST}"
|
|
fi
|
|
|
|
# GPU detection
|
|
if has nvidia-smi; then
|
|
local gpu_name=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1)
|
|
ok "GPU: ${G}$gpu_name${RST} (CUDA)"
|
|
GPU_TYPE="cuda"
|
|
elif has rocm-smi; then
|
|
ok "GPU: AMD ROCm detected"
|
|
GPU_TYPE="rocm"
|
|
elif [ -d "/opt/intel" ] || has xpu-smi; then
|
|
ok "GPU: Intel XPU detected"
|
|
GPU_TYPE="intel"
|
|
elif [ "$OS" = "macos" ]; then
|
|
ok "GPU: Apple Metal (auto via llama-cpp)"
|
|
GPU_TYPE="metal"
|
|
else
|
|
info "No GPU detected ${D}(CPU-only mode)${RST}"
|
|
fi
|
|
echo
|
|
}
|
|
|
|
# ── Interactive Menu ─────────────────────────────────────────────────
|
|
|
|
show_menu() {
|
|
header "INSTALL OPTIONS"
|
|
echo
|
|
printf " ${BLD}${W}What would you like to install?${RST}\n\n"
|
|
|
|
printf " ${BLD}${C}[1]${RST} ${W}Core only${RST} ${D}Flask, OSINT, networking, analysis${RST}\n"
|
|
printf " ${BLD}${C}[2]${RST} ${W}Core + Local LLM${RST} ${D}+ llama-cpp-python (GGUF models)${RST}\n"
|
|
printf " ${BLD}${C}[3]${RST} ${W}Core + Cloud LLM${RST} ${D}+ anthropic SDK (Claude API)${RST}\n"
|
|
printf " ${BLD}${C}[4]${RST} ${W}Core + HuggingFace${RST} ${D}+ transformers, torch, accelerate${RST}\n"
|
|
printf " ${BLD}${C}[5]${RST} ${W}Full install${RST} ${D}All of the above${RST}\n"
|
|
echo
|
|
printf " ${BLD}${Y}[S]${RST} ${W}System tools${RST} ${D}nmap, tshark, openssl, adb (Linux only)${RST}\n"
|
|
printf " ${BLD}${Y}[H]${RST} ${W}Hardware libs${RST} ${D}Build WebUSB/Serial JS bundles (needs npm)${RST}\n"
|
|
echo
|
|
printf " ${BLD}${R}[Q]${RST} ${W}Quit${RST}\n"
|
|
echo
|
|
hr
|
|
printf " ${BLD}Choice: ${RST}"
|
|
read -r choice
|
|
|
|
case "$choice" in
|
|
1) ;;
|
|
2) INSTALL_LLM_LOCAL=true ;;
|
|
3) INSTALL_LLM_CLOUD=true ;;
|
|
4) INSTALL_LLM_HF=true ;;
|
|
5) INSTALL_LLM_LOCAL=true; INSTALL_LLM_CLOUD=true; INSTALL_LLM_HF=true ;;
|
|
s|S) INSTALL_SYSTEM_TOOLS=true ;;
|
|
h|H) INSTALL_NODE_HW=true ;;
|
|
q|Q) printf "\n ${D}Bye.${RST}\n\n"; exit 0 ;;
|
|
*) warn "Invalid choice"; show_menu; return ;;
|
|
esac
|
|
|
|
# Extras prompt (only for options 1-5)
|
|
if [[ "$choice" =~ ^[1-5]$ ]]; then
|
|
echo
|
|
printf " ${D}Also install system tools? (nmap, tshark, etc.) [y/N]:${RST} "
|
|
read -r yn
|
|
[[ "$yn" =~ ^[Yy] ]] && INSTALL_SYSTEM_TOOLS=true
|
|
|
|
printf " ${D}Also build hardware JS bundles? (needs npm) [y/N]:${RST} "
|
|
read -r yn
|
|
[[ "$yn" =~ ^[Yy] ]] && INSTALL_NODE_HW=true
|
|
fi
|
|
}
|
|
|
|
# ── Install Functions ────────────────────────────────────────────────
|
|
|
|
get_pip() {
|
|
if has pip3; then echo "pip3"
|
|
elif has pip; then echo "pip"
|
|
fi
|
|
}
|
|
|
|
get_python() {
|
|
if has python3; then echo "python3"
|
|
elif has python; then echo "python"
|
|
fi
|
|
}
|
|
|
|
create_venv() {
|
|
header "VIRTUAL ENVIRONMENT"
|
|
|
|
if [ -d "$VENV_DIR" ]; then
|
|
ok "venv already exists at ${D}$VENV_DIR${RST}"
|
|
else
|
|
status "Creating virtual environment..."
|
|
$(get_python) -m venv "$VENV_DIR"
|
|
ok "Created venv at ${D}$VENV_DIR${RST}"
|
|
fi
|
|
|
|
# Activate
|
|
if [ "$OS" = "windows" ]; then
|
|
source "$VENV_DIR/Scripts/activate" 2>/dev/null || source "$VENV_DIR/bin/activate"
|
|
else
|
|
source "$VENV_DIR/bin/activate"
|
|
fi
|
|
ok "Activated venv ${D}($(which python))${RST}"
|
|
echo
|
|
}
|
|
|
|
install_core() {
|
|
header "CORE DEPENDENCIES"
|
|
|
|
step_progress "Upgrading pip..."
|
|
$(get_python) -m pip install --upgrade pip setuptools wheel -q 2>&1 | tail -1
|
|
|
|
step_progress "Installing core packages..."
|
|
# Install from requirements.txt but skip optional LLM lines
|
|
# Core packages: flask, bcrypt, requests, msgpack, pyserial, esptool, pyshark, qrcode, Pillow
|
|
local core_pkgs=(
|
|
"flask>=3.0"
|
|
"bcrypt>=4.0"
|
|
"requests>=2.31"
|
|
"msgpack>=1.0"
|
|
"pyserial>=3.5"
|
|
"esptool>=4.0"
|
|
"pyshark>=0.6"
|
|
"qrcode>=7.0"
|
|
"Pillow>=10.0"
|
|
)
|
|
|
|
for pkg in "${core_pkgs[@]}"; do
|
|
local name=$(echo "$pkg" | sed 's/[>=<].*//')
|
|
step_progress "$name"
|
|
pip install "$pkg" -q 2>&1 | tail -1
|
|
done
|
|
|
|
ok "Core dependencies installed"
|
|
echo
|
|
}
|
|
|
|
install_llm_local() {
|
|
header "LOCAL LLM (llama-cpp-python)"
|
|
|
|
if [ "$GPU_TYPE" = "cuda" ]; then
|
|
info "CUDA detected — building with GPU acceleration"
|
|
step_progress "llama-cpp-python (CUDA)..."
|
|
CMAKE_ARGS="-DGGML_CUDA=on" pip install llama-cpp-python>=0.3.16 --force-reinstall --no-cache-dir -q 2>&1 | tail -1
|
|
elif [ "$GPU_TYPE" = "rocm" ]; then
|
|
info "ROCm detected — building with AMD GPU acceleration"
|
|
step_progress "llama-cpp-python (ROCm)..."
|
|
CMAKE_ARGS="-DGGML_HIPBLAS=on" pip install llama-cpp-python>=0.3.16 --force-reinstall --no-cache-dir -q 2>&1 | tail -1
|
|
elif [ "$GPU_TYPE" = "metal" ]; then
|
|
info "Apple Metal — auto-enabled in llama-cpp"
|
|
step_progress "llama-cpp-python (Metal)..."
|
|
pip install llama-cpp-python>=0.3.16 -q 2>&1 | tail -1
|
|
else
|
|
info "CPU-only mode"
|
|
step_progress "llama-cpp-python (CPU)..."
|
|
pip install llama-cpp-python>=0.3.16 -q 2>&1 | tail -1
|
|
fi
|
|
|
|
ok "llama-cpp-python installed"
|
|
echo
|
|
}
|
|
|
|
install_llm_cloud() {
|
|
header "CLOUD LLM (Anthropic Claude API)"
|
|
|
|
step_progress "anthropic SDK..."
|
|
pip install "anthropic>=0.40" -q 2>&1 | tail -1
|
|
|
|
ok "Anthropic SDK installed"
|
|
info "Set your API key in autarch_settings.conf [claude] section"
|
|
echo
|
|
}
|
|
|
|
install_llm_hf() {
|
|
header "HUGGINGFACE (transformers + torch)"
|
|
|
|
step_progress "transformers..."
|
|
pip install "transformers>=4.35" -q 2>&1 | tail -1
|
|
|
|
step_progress "accelerate..."
|
|
pip install "accelerate>=0.25" -q 2>&1 | tail -1
|
|
|
|
# PyTorch — pick the right variant
|
|
step_progress "PyTorch..."
|
|
if [ "$GPU_TYPE" = "cuda" ]; then
|
|
info "Installing PyTorch with CUDA support..."
|
|
pip install torch --index-url https://download.pytorch.org/whl/cu121 -q 2>&1 | tail -1
|
|
elif [ "$GPU_TYPE" = "rocm" ]; then
|
|
info "Installing PyTorch with ROCm support..."
|
|
pip install torch --index-url https://download.pytorch.org/whl/rocm6.0 -q 2>&1 | tail -1
|
|
elif [ "$GPU_TYPE" = "intel" ]; then
|
|
info "Installing PyTorch with Intel XPU support..."
|
|
pip install torch intel-extension-for-pytorch -q 2>&1 | tail -1
|
|
else
|
|
pip install torch -q 2>&1 | tail -1
|
|
fi
|
|
|
|
# bitsandbytes (Linux/CUDA only)
|
|
if [ "$OS" = "linux" ] && [ "$GPU_TYPE" = "cuda" ]; then
|
|
step_progress "bitsandbytes (quantization)..."
|
|
pip install "bitsandbytes>=0.41" -q 2>&1 | tail -1
|
|
else
|
|
info "Skipping bitsandbytes ${D}(Linux + CUDA only)${RST}"
|
|
fi
|
|
|
|
ok "HuggingFace stack installed"
|
|
echo
|
|
}
|
|
|
|
install_system_tools() {
|
|
header "SYSTEM TOOLS"
|
|
|
|
if [ "$OS" != "linux" ]; then
|
|
warn "System tool install is only automated on Linux (apt/dnf/pacman)"
|
|
info "On $OS, install these manually: nmap, wireshark-cli, openssl, android-tools"
|
|
echo
|
|
return
|
|
fi
|
|
|
|
# Detect package manager
|
|
local PM=""
|
|
local INSTALL=""
|
|
if has apt-get; then
|
|
PM="apt"
|
|
INSTALL="sudo apt-get install -y"
|
|
elif has dnf; then
|
|
PM="dnf"
|
|
INSTALL="sudo dnf install -y"
|
|
elif has pacman; then
|
|
PM="pacman"
|
|
INSTALL="sudo pacman -S --noconfirm"
|
|
else
|
|
warn "No supported package manager found (apt/dnf/pacman)"
|
|
echo
|
|
return
|
|
fi
|
|
|
|
ok "Package manager: ${G}$PM${RST}"
|
|
|
|
local packages=()
|
|
|
|
# nmap
|
|
if ! has nmap; then
|
|
packages+=("nmap")
|
|
status "Will install: nmap"
|
|
else
|
|
ok "nmap already installed"
|
|
fi
|
|
|
|
# tshark
|
|
if ! has tshark; then
|
|
case "$PM" in
|
|
apt) packages+=("tshark") ;;
|
|
dnf) packages+=("wireshark-cli") ;;
|
|
pacman) packages+=("wireshark-cli") ;;
|
|
esac
|
|
status "Will install: tshark/wireshark-cli"
|
|
else
|
|
ok "tshark already installed"
|
|
fi
|
|
|
|
# openssl
|
|
if ! has openssl; then
|
|
packages+=("openssl")
|
|
status "Will install: openssl"
|
|
else
|
|
ok "openssl already installed"
|
|
fi
|
|
|
|
# adb/fastboot
|
|
if ! has adb; then
|
|
case "$PM" in
|
|
apt) packages+=("android-tools-adb android-tools-fastboot") ;;
|
|
dnf) packages+=("android-tools") ;;
|
|
pacman) packages+=("android-tools") ;;
|
|
esac
|
|
status "Will install: adb + fastboot"
|
|
else
|
|
ok "adb already installed"
|
|
fi
|
|
|
|
# wireguard
|
|
if ! has wg; then
|
|
case "$PM" in
|
|
apt) packages+=("wireguard wireguard-tools") ;;
|
|
dnf) packages+=("wireguard-tools") ;;
|
|
pacman) packages+=("wireguard-tools") ;;
|
|
esac
|
|
status "Will install: wireguard-tools"
|
|
else
|
|
ok "wireguard already installed"
|
|
fi
|
|
|
|
# miniupnpc
|
|
if ! has upnpc; then
|
|
packages+=("miniupnpc")
|
|
status "Will install: miniupnpc"
|
|
else
|
|
ok "miniupnpc already installed"
|
|
fi
|
|
|
|
if [ ${#packages[@]} -gt 0 ]; then
|
|
echo
|
|
info "Installing with: $PM"
|
|
if [ "$PM" = "apt" ]; then
|
|
sudo apt-get update -qq 2>&1 | tail -1
|
|
fi
|
|
$INSTALL ${packages[@]} 2>&1 | tail -5
|
|
ok "System tools installed"
|
|
else
|
|
ok "All system tools already present"
|
|
fi
|
|
echo
|
|
}
|
|
|
|
install_node_hw() {
|
|
header "HARDWARE JS BUNDLES (WebUSB / Web Serial)"
|
|
|
|
if ! has npm; then
|
|
fail "npm not found — install Node.js first"
|
|
info "https://nodejs.org or: apt install nodejs npm"
|
|
echo
|
|
return
|
|
fi
|
|
|
|
step_progress "npm install..."
|
|
(cd "$SCRIPT_DIR" && npm install --silent 2>&1 | tail -3)
|
|
|
|
step_progress "Building bundles..."
|
|
if [ -f "$SCRIPT_DIR/scripts/build-hw-libs.sh" ]; then
|
|
(cd "$SCRIPT_DIR" && bash scripts/build-hw-libs.sh 2>&1 | tail -5)
|
|
ok "Hardware bundles built"
|
|
else
|
|
warn "scripts/build-hw-libs.sh not found"
|
|
fi
|
|
echo
|
|
}
|
|
|
|
# ── Summary ──────────────────────────────────────────────────────────
|
|
|
|
show_summary() {
|
|
hr "═"
|
|
printf "\n${BLD}${G} INSTALLATION COMPLETE${RST}\n\n"
|
|
|
|
printf " ${BLD}${W}Quick Start:${RST}\n"
|
|
echo
|
|
|
|
if [ "$OS" = "windows" ]; then
|
|
printf " ${D}# Activate the virtual environment${RST}\n"
|
|
printf " ${C}source venv/Scripts/activate${RST}\n\n"
|
|
else
|
|
printf " ${D}# Activate the virtual environment${RST}\n"
|
|
printf " ${C}source venv/bin/activate${RST}\n\n"
|
|
fi
|
|
|
|
printf " ${D}# Launch the CLI${RST}\n"
|
|
printf " ${C}python autarch.py${RST}\n\n"
|
|
|
|
printf " ${D}# Launch the web dashboard${RST}\n"
|
|
printf " ${C}python autarch_web.py${RST}\n\n"
|
|
|
|
printf " ${D}# Open in browser${RST}\n"
|
|
printf " ${C}https://localhost:8181${RST}\n"
|
|
echo
|
|
|
|
if $INSTALL_LLM_LOCAL; then
|
|
printf " ${ARROW} Local LLM: place a .gguf model in ${D}models/${RST}\n"
|
|
printf " ${D}and set model_path in autarch_settings.conf [llama]${RST}\n"
|
|
fi
|
|
if $INSTALL_LLM_CLOUD; then
|
|
printf " ${ARROW} Claude API: set api_key in ${D}autarch_settings.conf [claude]${RST}\n"
|
|
fi
|
|
echo
|
|
hr "═"
|
|
echo
|
|
}
|
|
|
|
# ── Main ─────────────────────────────────────────────────────────────
|
|
|
|
main() {
|
|
show_banner
|
|
show_system_check
|
|
show_menu
|
|
|
|
# Calculate total steps for progress
|
|
TOTAL_STEPS=11 # pip upgrade + 9 core packages + 1 finish
|
|
$INSTALL_LLM_LOCAL && TOTAL_STEPS=$((TOTAL_STEPS + 1))
|
|
$INSTALL_LLM_CLOUD && TOTAL_STEPS=$((TOTAL_STEPS + 1))
|
|
$INSTALL_LLM_HF && TOTAL_STEPS=$((TOTAL_STEPS + 4))
|
|
$INSTALL_NODE_HW && TOTAL_STEPS=$((TOTAL_STEPS + 2))
|
|
|
|
echo
|
|
create_venv
|
|
install_core
|
|
|
|
$INSTALL_LLM_LOCAL && install_llm_local
|
|
$INSTALL_LLM_CLOUD && install_llm_cloud
|
|
$INSTALL_LLM_HF && install_llm_hf
|
|
$INSTALL_SYSTEM_TOOLS && install_system_tools
|
|
$INSTALL_NODE_HW && install_node_hw
|
|
|
|
show_summary
|
|
}
|
|
|
|
main "$@"
|