#!/usr/bin/env bash # aivault installer — https://aivault.moldable.sh # Usage: curl -fsSL https://aivault.moldable.sh/install.sh | sh set -euo pipefail REPO="moldable-ai/aivault" INSTALL_DIR="${AIVAULT_INSTALL_DIR:-$HOME/.local/bin}" info() { printf '\033[0;36m%s\033[0m\n' "$*"; } error() { printf '\033[0;31merror: %s\033[0m\n' "$*" >&2; exit 1; } # --- detect platform --- OS="$(uname -s)" ARCH="$(uname -m)" case "$OS" in Darwin) PLATFORM="apple-darwin" ;; Linux) PLATFORM="unknown-linux-gnu" ;; *) error "unsupported OS: $OS" ;; esac case "$ARCH" in arm64|aarch64) TARGET="aarch64-${PLATFORM}" ;; x86_64) TARGET="x86_64-${PLATFORM}" ;; *) error "unsupported architecture: $ARCH" ;; esac # --- resolve latest release --- info "resolving latest aivault release..." RELEASE_URL="https://api.github.com/repos/${REPO}/releases/latest" RELEASE_JSON="$(curl -fsSL "$RELEASE_URL")" || error "failed to fetch latest release from GitHub" TAG="$(printf '%s' "$RELEASE_JSON" | grep '"tag_name"' | head -1 | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/')" VERSION="${TAG#cli-v}" if [ -z "$VERSION" ]; then error "could not determine latest version" fi info "installing aivault v${VERSION} for ${TARGET}" # --- download + extract --- TMPDIR="$(mktemp -d)" trap 'rm -rf "$TMPDIR"' EXIT case "$OS" in Darwin) ASSET="aivault-${TARGET}.zip" curl -fsSL "https://github.com/${REPO}/releases/download/${TAG}/${ASSET}" -o "${TMPDIR}/${ASSET}" \ || error "failed to download ${ASSET}" unzip -qo "${TMPDIR}/${ASSET}" -d "${TMPDIR}" \ || error "failed to extract ${ASSET}" ;; Linux) ASSET="aivault-${TARGET}.tar.gz" curl -fsSL "https://github.com/${REPO}/releases/download/${TAG}/${ASSET}" -o "${TMPDIR}/${ASSET}" \ || error "failed to download ${ASSET}" tar -xzf "${TMPDIR}/${ASSET}" -C "${TMPDIR}" \ || error "failed to extract ${ASSET}" ;; esac # --- install --- mkdir -p "$INSTALL_DIR" for bin in aivault aivaultd; do if [ -f "${TMPDIR}/${bin}" ]; then mv "${TMPDIR}/${bin}" "${INSTALL_DIR}/${bin}" chmod +x "${INSTALL_DIR}/${bin}" fi done info "installed aivault to ${INSTALL_DIR}/aivault" # --- PATH check --- case ":${PATH}:" in *":${INSTALL_DIR}:"*) ;; *) info "" info "add ${INSTALL_DIR} to your PATH:" info "" info " export PATH=\"${INSTALL_DIR}:\$PATH\"" info "" info "then restart your shell or run the export above." ;; esac info "" info "run 'aivault status' to get started."