diff --git a/README.md b/README.md index 914d1757f..d92db7af7 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,17 @@ curl -fsSL https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/insta irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1 | iex ``` +By default, the installer uses bun if available, otherwise downloads the prebuilt binary. + +Options: +- `--source` / `-Source`: Install via bun (installs bun first if needed) +- `--binary` / `-Binary`: Always use prebuilt binary + +```bash +# Force bun installation +curl -fsSL .../install.sh | sh -s -- --source +``` + ### Manual download Download binaries directly from [GitHub Releases](https://github.com/can1357/oh-my-pi/releases/latest). diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 64b0a16b7..112d604c8 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -1,35 +1,88 @@ # Pi Coding Agent Installer for Windows # Usage: irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1 | iex +# +# Or with options: +# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Source +# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Binary + +param( + [switch]$Source, + [switch]$Binary +) $ErrorActionPreference = "Stop" $Repo = "can1357/oh-my-pi" +$Package = "@oh-my-pi/pi-coding-agent" $InstallDir = if ($env:PI_INSTALL_DIR) { $env:PI_INSTALL_DIR } else { "$env:LOCALAPPDATA\pi" } -$Binary = "pi-windows-x64.exe" +$BinaryName = "pi-windows-x64.exe" -# Get latest release -Write-Host "Fetching latest release..." -$Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest" -$Latest = $Release.tag_name -Write-Host "Latest version: $Latest" +function Test-BunInstalled { + try { + $null = Get-Command bun -ErrorAction Stop + return $true + } catch { + return $false + } +} -# Download binary -$Url = "https://github.com/$Repo/releases/download/$Latest/$Binary" -Write-Host "Downloading $Binary..." +function Install-Bun { + Write-Host "Installing bun..." + irm bun.sh/install.ps1 | iex + # Refresh PATH + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "User") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "Machine") +} -New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null -$OutPath = Join-Path $InstallDir "pi.exe" -Invoke-WebRequest -Uri $Url -OutFile $OutPath - -Write-Host "" -Write-Host "Installed pi to $OutPath" - -# Add to PATH if not already there -$UserPath = [Environment]::GetEnvironmentVariable("Path", "User") -if ($UserPath -notlike "*$InstallDir*") { - Write-Host "Adding $InstallDir to PATH..." - [Environment]::SetEnvironmentVariable("Path", "$UserPath;$InstallDir", "User") - Write-Host "Restart your terminal, then run 'pi' to get started!" -} else { +function Install-ViaBun { + Write-Host "Installing via bun..." + bun install -g $Package + Write-Host "" + Write-Host "✓ Installed pi via bun" -ForegroundColor Green Write-Host "Run 'pi' to get started!" } + +function Install-Binary { + # Get latest release + Write-Host "Fetching latest release..." + $Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest" + $Latest = $Release.tag_name + Write-Host "Latest version: $Latest" + + # Download binary + $Url = "https://github.com/$Repo/releases/download/$Latest/$BinaryName" + Write-Host "Downloading $BinaryName..." + + New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null + $OutPath = Join-Path $InstallDir "pi.exe" + Invoke-WebRequest -Uri $Url -OutFile $OutPath + + Write-Host "" + Write-Host "✓ Installed pi to $OutPath" -ForegroundColor Green + + # Add to PATH if not already there + $UserPath = [Environment]::GetEnvironmentVariable("Path", "User") + if ($UserPath -notlike "*$InstallDir*") { + Write-Host "Adding $InstallDir to PATH..." + [Environment]::SetEnvironmentVariable("Path", "$UserPath;$InstallDir", "User") + Write-Host "Restart your terminal, then run 'pi' to get started!" + } else { + Write-Host "Run 'pi' to get started!" + } +} + +# Main logic +if ($Source) { + if (-not (Test-BunInstalled)) { + Install-Bun + } + Install-ViaBun +} elseif ($Binary) { + Install-Binary +} else { + # Default: use bun if available, otherwise binary + if (Test-BunInstalled) { + Install-ViaBun + } else { + Install-Binary + } +} diff --git a/scripts/install.sh b/scripts/install.sh index 13f52a620..3be28f1ee 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -3,50 +3,110 @@ set -e # Pi Coding Agent Installer # Usage: curl -fsSL https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.sh | sh +# +# Options: +# --source Install via bun (installs bun if needed) +# --binary Always install prebuilt binary REPO="can1357/oh-my-pi" +PACKAGE="@oh-my-pi/pi-coding-agent" INSTALL_DIR="${PI_INSTALL_DIR:-$HOME/.local/bin}" -# Detect platform -OS="$(uname -s)" -ARCH="$(uname -m)" +# Parse arguments +MODE="" +for arg in "$@"; do + case "$arg" in + --source) MODE="source" ;; + --binary) MODE="binary" ;; + esac +done -case "$OS" in - Linux) PLATFORM="linux" ;; - Darwin) PLATFORM="darwin" ;; - *) echo "Unsupported OS: $OS"; exit 1 ;; -esac - -case "$ARCH" in - x86_64|amd64) ARCH="x64" ;; - arm64|aarch64) ARCH="arm64" ;; - *) echo "Unsupported architecture: $ARCH"; exit 1 ;; -esac - -BINARY="pi-${PLATFORM}-${ARCH}" - -# Get latest release tag -echo "Fetching latest release..." -LATEST=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/') -if [ -z "$LATEST" ]; then - echo "Failed to fetch latest release" - exit 1 -fi -echo "Latest version: $LATEST" - -# Download binary -URL="https://github.com/${REPO}/releases/download/${LATEST}/${BINARY}" -echo "Downloading ${BINARY}..." - -mkdir -p "$INSTALL_DIR" -curl -fsSL "$URL" -o "${INSTALL_DIR}/pi" -chmod +x "${INSTALL_DIR}/pi" - -echo "" -echo "Installed pi to ${INSTALL_DIR}/pi" - -# Check if in PATH -case ":$PATH:" in - *":$INSTALL_DIR:"*) echo "Run 'pi' to get started!" ;; - *) echo "Add ${INSTALL_DIR} to your PATH, then run 'pi'" ;; +# Check if bun is available +has_bun() { + command -v bun >/dev/null 2>&1 +} + +# Install bun +install_bun() { + echo "Installing bun..." + curl -fsSL https://bun.sh/install | bash + export BUN_INSTALL="$HOME/.bun" + export PATH="$BUN_INSTALL/bin:$PATH" +} + +# Install via bun +install_via_bun() { + echo "Installing via bun..." + bun install -g "$PACKAGE" + echo "" + echo "✓ Installed pi via bun" + echo "Run 'pi' to get started!" +} + +# Install binary from GitHub releases +install_binary() { + # Detect platform + OS="$(uname -s)" + ARCH="$(uname -m)" + + case "$OS" in + Linux) PLATFORM="linux" ;; + Darwin) PLATFORM="darwin" ;; + *) echo "Unsupported OS: $OS"; exit 1 ;; + esac + + case "$ARCH" in + x86_64|amd64) ARCH="x64" ;; + arm64|aarch64) ARCH="arm64" ;; + *) echo "Unsupported architecture: $ARCH"; exit 1 ;; + esac + + BINARY="pi-${PLATFORM}-${ARCH}" + + # Get latest release tag + echo "Fetching latest release..." + LATEST=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/') + if [ -z "$LATEST" ]; then + echo "Failed to fetch latest release" + exit 1 + fi + echo "Latest version: $LATEST" + + # Download binary + URL="https://github.com/${REPO}/releases/download/${LATEST}/${BINARY}" + echo "Downloading ${BINARY}..." + + mkdir -p "$INSTALL_DIR" + curl -fsSL "$URL" -o "${INSTALL_DIR}/pi" + chmod +x "${INSTALL_DIR}/pi" + + echo "" + echo "✓ Installed pi to ${INSTALL_DIR}/pi" + + # Check if in PATH + case ":$PATH:" in + *":$INSTALL_DIR:"*) echo "Run 'pi' to get started!" ;; + *) echo "Add ${INSTALL_DIR} to your PATH, then run 'pi'" ;; + esac +} + +# Main logic +case "$MODE" in + source) + if ! has_bun; then + install_bun + fi + install_via_bun + ;; + binary) + install_binary + ;; + *) + # Default: use bun if available, otherwise binary + if has_bun; then + install_via_bun + else + install_binary + fi + ;; esac