#!/usr/bin/env sh # Mosaic Bootstrap — Remote Installer (POSIX) # # One-liner: # curl -sL https://git.mosaicstack.dev/mosaic/bootstrap/raw/branch/main/remote-install.sh | sh # # Or with wget: # wget -qO- https://git.mosaicstack.dev/mosaic/bootstrap/raw/branch/main/remote-install.sh | sh # set -eu BOOTSTRAP_REF="${MOSAIC_BOOTSTRAP_REF:-main}" ARCHIVE_URL="https://git.mosaicstack.dev/mosaic/bootstrap/archive/${BOOTSTRAP_REF}.tar.gz" TMPDIR_BASE="${TMPDIR:-/tmp}" WORK_DIR="$TMPDIR_BASE/mosaic-bootstrap-$$" cleanup() { rm -rf "$WORK_DIR" } trap cleanup EXIT echo "[mosaic] Downloading bootstrap archive (ref: $BOOTSTRAP_REF)..." mkdir -p "$WORK_DIR" if command -v curl >/dev/null 2>&1; then curl -sL "$ARCHIVE_URL" | tar xz -C "$WORK_DIR" elif command -v wget >/dev/null 2>&1; then wget -qO- "$ARCHIVE_URL" | tar xz -C "$WORK_DIR" else echo "[mosaic] ERROR: curl or wget required" >&2 exit 1 fi if [ ! -f "$WORK_DIR/bootstrap/install.sh" ]; then echo "[mosaic] ERROR: install.sh not found in archive" >&2 exit 1 fi cd "$WORK_DIR/bootstrap" # Prefer TypeScript wizard if Node.js 18+ and bundle are available WIZARD_BIN="$WORK_DIR/bootstrap/dist/mosaic-wizard.mjs" if command -v node >/dev/null 2>&1 && [ -f "$WIZARD_BIN" ]; then NODE_MAJOR="$(node -e 'console.log(process.versions.node.split(".")[0])')" if [ "$NODE_MAJOR" -ge 18 ] 2>/dev/null; then if [ -e /dev/tty ]; then echo "[mosaic] Running wizard installer (Node.js $NODE_MAJOR detected)..." node "$WIZARD_BIN" --source-dir "$WORK_DIR/bootstrap"