summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-16 19:56:33 +0000
committersoryu <soryu@soryu.co>2026-01-16 19:56:33 +0000
commit32babd4b8ae93bb140664bbded2bd1c7f474ba75 (patch)
tree4780978b0639f686c0101ae39ffe2b03456aa218
parentf84a7f2d820f6f432be2b1d78d6bf833b5b19380 (diff)
downloadsoryu-32babd4b8ae93bb140664bbded2bd1c7f474ba75.tar.gz
soryu-32babd4b8ae93bb140664bbded2bd1c7f474ba75.zip
Add curl-based installation script for Makima CLI
Add install.sh that automatically downloads the right version of makima from the latest GitHub release based on the user's OS and architecture. Features: - Auto-detects OS (Linux/macOS) and architecture (x86_64/arm64) - Fetches latest release tag from GitHub API - Downloads appropriate binary for the user's platform - Supports custom INSTALL_DIR environment variable - Graceful error handling with colored output - Supports being piped from curl (curl -fsSL URL | bash) - Verifies installation and checks PATH Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
-rwxr-xr-xinstall.sh251
1 files changed, 251 insertions, 0 deletions
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..45762ea
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,251 @@
+#!/bin/bash
+set -e
+
+# Makima CLI Installer
+# Usage: curl -fsSL https://raw.githubusercontent.com/soryu-co/soryu/main/install.sh | bash
+# curl -fsSL https://raw.githubusercontent.com/soryu-co/soryu/main/install.sh | INSTALL_DIR=/opt/bin bash
+
+REPO="soryu-co/soryu"
+INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}"
+BINARY_NAME="makima"
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+print_error() {
+ echo -e "${RED}Error: $1${NC}" >&2
+}
+
+print_success() {
+ echo -e "${GREEN}$1${NC}"
+}
+
+print_warning() {
+ echo -e "${YELLOW}$1${NC}"
+}
+
+print_info() {
+ echo "$1"
+}
+
+# Check for required tools
+check_dependencies() {
+ local missing=""
+
+ if ! command -v curl &> /dev/null; then
+ missing="$missing curl"
+ fi
+
+ if ! command -v tar &> /dev/null; then
+ missing="$missing tar"
+ fi
+
+ if [ -n "$missing" ]; then
+ print_error "Missing required tools:$missing"
+ print_info "Please install the missing tools and try again."
+ exit 1
+ fi
+}
+
+# Detect operating system
+detect_os() {
+ local os
+ os="$(uname -s)"
+
+ case "$os" in
+ Linux*)
+ echo "linux"
+ ;;
+ Darwin*)
+ echo "macos"
+ ;;
+ *)
+ print_error "Unsupported operating system: $os"
+ print_info "Supported: Linux, macOS"
+ exit 1
+ ;;
+ esac
+}
+
+# Detect CPU architecture
+detect_arch() {
+ local arch
+ arch="$(uname -m)"
+
+ case "$arch" in
+ x86_64|amd64)
+ echo "x86_64"
+ ;;
+ arm64|aarch64)
+ echo "arm64"
+ ;;
+ *)
+ print_error "Unsupported architecture: $arch"
+ print_info "Supported: x86_64, arm64"
+ exit 1
+ ;;
+ esac
+}
+
+# Get the latest release version from GitHub API
+get_latest_version() {
+ local version
+ version=$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
+
+ if [ -z "$version" ]; then
+ print_error "Failed to fetch latest release version from GitHub"
+ exit 1
+ fi
+
+ echo "$version"
+}
+
+# Construct the download URL for the release asset
+get_download_url() {
+ local version=$1
+ local os=$2
+ local arch=$3
+
+ # Handle macOS arm64 vs Linux x86_64 naming
+ local asset_name="makima-${version}-${os}-${arch}.tar.gz"
+
+ echo "https://github.com/$REPO/releases/download/${version}/${asset_name}"
+}
+
+# Download and install the binary
+install_binary() {
+ local url=$1
+ local tmpdir
+ tmpdir=$(mktemp -d)
+ local tarball="$tmpdir/makima.tar.gz"
+
+ print_info "Downloading from: $url"
+
+ # Download the tarball
+ if ! curl -fsSL "$url" -o "$tarball"; then
+ print_error "Failed to download release from: $url"
+ print_info "Please check if the release exists for your platform."
+ rm -rf "$tmpdir"
+ exit 1
+ fi
+
+ # Verify download was successful
+ if [ ! -f "$tarball" ] || [ ! -s "$tarball" ]; then
+ print_error "Downloaded file is empty or missing"
+ rm -rf "$tmpdir"
+ exit 1
+ fi
+
+ # Extract the tarball
+ print_info "Extracting archive..."
+ if ! tar -xzf "$tarball" -C "$tmpdir"; then
+ print_error "Failed to extract archive"
+ rm -rf "$tmpdir"
+ exit 1
+ fi
+
+ # Find the binary (it should be in the extracted files)
+ local binary
+ if [ -f "$tmpdir/$BINARY_NAME" ]; then
+ binary="$tmpdir/$BINARY_NAME"
+ elif [ -f "$tmpdir/makima/$BINARY_NAME" ]; then
+ binary="$tmpdir/makima/$BINARY_NAME"
+ else
+ # Search for the binary
+ binary=$(find "$tmpdir" -name "$BINARY_NAME" -type f | head -1)
+ if [ -z "$binary" ]; then
+ print_error "Could not find $BINARY_NAME binary in archive"
+ print_info "Archive contents:"
+ ls -la "$tmpdir"
+ rm -rf "$tmpdir"
+ exit 1
+ fi
+ fi
+
+ # Make binary executable
+ chmod +x "$binary"
+
+ # Create install directory if it doesn't exist
+ if [ ! -d "$INSTALL_DIR" ]; then
+ print_info "Creating directory: $INSTALL_DIR"
+ if ! mkdir -p "$INSTALL_DIR" 2>/dev/null; then
+ print_warning "Cannot create $INSTALL_DIR, trying with sudo..."
+ sudo mkdir -p "$INSTALL_DIR"
+ fi
+ fi
+
+ # Install binary
+ print_info "Installing to: $INSTALL_DIR/$BINARY_NAME"
+ if ! mv "$binary" "$INSTALL_DIR/$BINARY_NAME" 2>/dev/null; then
+ print_warning "Cannot write to $INSTALL_DIR, trying with sudo..."
+ sudo mv "$binary" "$INSTALL_DIR/$BINARY_NAME"
+ fi
+
+ # Cleanup
+ rm -rf "$tmpdir"
+}
+
+# Verify installation
+verify_installation() {
+ if [ -x "$INSTALL_DIR/$BINARY_NAME" ]; then
+ print_success "Successfully installed $BINARY_NAME to $INSTALL_DIR/$BINARY_NAME"
+
+ # Check if install dir is in PATH
+ if ! echo "$PATH" | grep -q "$INSTALL_DIR"; then
+ print_warning "Note: $INSTALL_DIR is not in your PATH"
+ print_info "Add it with: export PATH=\"$INSTALL_DIR:\$PATH\""
+ fi
+
+ # Show version if possible
+ if command -v "$BINARY_NAME" &> /dev/null; then
+ print_info ""
+ print_info "Installed version:"
+ "$BINARY_NAME" --version 2>/dev/null || true
+ fi
+ else
+ print_error "Installation failed - binary not found at $INSTALL_DIR/$BINARY_NAME"
+ exit 1
+ fi
+}
+
+# Main installation flow
+main() {
+ print_info "Makima CLI Installer"
+ print_info "===================="
+ print_info ""
+
+ # Check dependencies
+ check_dependencies
+
+ # Detect platform
+ local os arch
+ os=$(detect_os)
+ arch=$(detect_arch)
+ print_info "Detected platform: $os-$arch"
+
+ # Get latest version
+ print_info "Fetching latest release..."
+ local version
+ version=$(get_latest_version)
+ print_info "Latest version: $version"
+
+ # Construct download URL
+ local url
+ url=$(get_download_url "$version" "$os" "$arch")
+
+ # Download and install
+ print_info ""
+ install_binary "$url"
+
+ # Verify
+ print_info ""
+ verify_installation
+
+ print_info ""
+ print_success "Installation complete!"
+}
+
+main "$@"