#!/usr/bin/env bash # # atai CLI installer # # Usage: # curl -fsSL https://cli.archetypeai.app/install.sh | bash # curl -fsSL https://cli.archetypeai.app/install.sh | bash -s -- --version 0.2.0 # curl -fsSL https://cli.archetypeai.app/install.sh | INSTALL_DIR=~/.local/bin bash # set -euo pipefail # --------------------------------------------------------------------------- # Configuration # --------------------------------------------------------------------------- BASE_URL="${ATAI_CLI_BASE_URL:-https://cli.archetypeai.app}" INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}" BINARY_NAME="atai" VERSION="${ATAI_CLI_VERSION:-latest}" # --------------------------------------------------------------------------- # Parse arguments # --------------------------------------------------------------------------- while [[ $# -gt 0 ]]; do case "$1" in --version|-v) VERSION="$2" shift 2 ;; --install-dir|-d) INSTALL_DIR="$2" shift 2 ;; --help|-h) echo "atai CLI installer" echo "" echo "Usage: curl -fsSL ${BASE_URL}/install.sh | bash" echo "" echo "Options:" echo " --version, -v Version to install (default: latest)" echo " --install-dir, -d Installation directory (default: /usr/local/bin)" echo "" echo "Environment variables:" echo " INSTALL_DIR Override install directory" echo " ATAI_CLI_VERSION Override version" echo " ATAI_CLI_BASE_URL Override download base URL" exit 0 ;; *) echo "Unknown option: $1" exit 1 ;; esac done # --------------------------------------------------------------------------- # Detect platform # --------------------------------------------------------------------------- detect_os() { local os os="$(uname -s)" case "$os" in Linux) echo "linux" ;; Darwin) echo "darwin" ;; *) echo "Error: Unsupported operating system: $os" >&2 echo "atai CLI supports Linux and macOS." >&2 exit 1 ;; esac } detect_arch() { local arch arch="$(uname -m)" case "$arch" in x86_64|amd64) echo "x86_64" ;; aarch64|arm64) echo "arm64" ;; *) echo "Error: Unsupported architecture: $arch" >&2 echo "atai CLI supports x86_64 and arm64." >&2 exit 1 ;; esac } OS="$(detect_os)" ARCH="$(detect_arch)" ARTIFACT="atai-${OS}-${ARCH}" # --------------------------------------------------------------------------- # Download # --------------------------------------------------------------------------- DOWNLOAD_URL="${BASE_URL}/${VERSION}/${ARTIFACT}" CHECKSUM_URL="${BASE_URL}/${VERSION}/${ARTIFACT}.sha256" TMP_DIR="$(mktemp -d)" cleanup() { rm -rf "$TMP_DIR" } trap cleanup EXIT echo "==> Downloading atai CLI for ${OS}/${ARCH}..." echo " ${DOWNLOAD_URL}" if command -v curl &>/dev/null; then curl -fsSL -o "${TMP_DIR}/${BINARY_NAME}" "$DOWNLOAD_URL" curl -fsSL -o "${TMP_DIR}/${BINARY_NAME}.sha256" "$CHECKSUM_URL" 2>/dev/null || true elif command -v wget &>/dev/null; then wget -qO "${TMP_DIR}/${BINARY_NAME}" "$DOWNLOAD_URL" wget -qO "${TMP_DIR}/${BINARY_NAME}.sha256" "$CHECKSUM_URL" 2>/dev/null || true else echo "Error: curl or wget is required to download atai CLI." >&2 exit 1 fi # --------------------------------------------------------------------------- # Verify checksum # --------------------------------------------------------------------------- if [ -f "${TMP_DIR}/${BINARY_NAME}.sha256" ] && [ -s "${TMP_DIR}/${BINARY_NAME}.sha256" ]; then echo "==> Verifying checksum..." EXPECTED="$(awk '{print $1}' "${TMP_DIR}/${BINARY_NAME}.sha256")" if command -v sha256sum &>/dev/null; then ACTUAL="$(sha256sum "${TMP_DIR}/${BINARY_NAME}" | awk '{print $1}')" elif command -v shasum &>/dev/null; then ACTUAL="$(shasum -a 256 "${TMP_DIR}/${BINARY_NAME}" | awk '{print $1}')" else echo " Warning: sha256sum/shasum not found, skipping verification." >&2 ACTUAL="$EXPECTED" fi if [ "$EXPECTED" != "$ACTUAL" ]; then echo "Error: Checksum verification failed!" >&2 echo " Expected: $EXPECTED" >&2 echo " Actual: $ACTUAL" >&2 exit 1 fi echo " Checksum OK." else echo " Warning: Checksum file not available, skipping verification." fi # --------------------------------------------------------------------------- # Install # --------------------------------------------------------------------------- chmod +x "${TMP_DIR}/${BINARY_NAME}" echo "==> Installing to ${INSTALL_DIR}/${BINARY_NAME}..." # Create install dir if it doesn't exist if [ ! -d "$INSTALL_DIR" ]; then mkdir -p "$INSTALL_DIR" 2>/dev/null || sudo mkdir -p "$INSTALL_DIR" fi if [ -w "$INSTALL_DIR" ]; then mv "${TMP_DIR}/${BINARY_NAME}" "${INSTALL_DIR}/${BINARY_NAME}" else sudo mv "${TMP_DIR}/${BINARY_NAME}" "${INSTALL_DIR}/${BINARY_NAME}" fi # --------------------------------------------------------------------------- # Verify installation # --------------------------------------------------------------------------- echo "" echo "atai CLI installed successfully!" echo "" if command -v "$BINARY_NAME" &>/dev/null; then echo " Location: $(command -v "$BINARY_NAME")" "$BINARY_NAME" --version 2>/dev/null || true else echo " Installed to: ${INSTALL_DIR}/${BINARY_NAME}" echo "" echo " Note: ${INSTALL_DIR} is not in your PATH." echo " Add it with:" echo "" echo " export PATH=\"${INSTALL_DIR}:\$PATH\"" echo "" fi