#!/usr/bin/env bash # shellcheck disable=SC2086 # Installs Pi Coding Agent and recommended packages. # Pi: https://pi.dev # # Supported platforms: # macOS : Apple Silicon (arm64), Intel (x86_64) # Linux : x86_64, aarch64 # # Prerequisites: # - Node.js 18+ (and npm) # - curl set -euo pipefail # ──────────────────────────────────────────── # Constants # ──────────────────────────────────────────── PI_INSTALL_URL="https://pi.dev/install.sh" PI_NPM_PACKAGE="@earendil-works/pi-coding-agent" # Packages to install after pi is available # Format: "package_name|description" PACKAGES=( "pi-subagents|Delegate work to focused child agents — code review, scouting, implementation, parallel audits, orchestration, background jobs" "context-mode|Context window protection — sandbox tools, session continuity, BM25 knowledge base, think-in-code paradigm" "pi-mcp-adapter|Use MCP servers with Pi without burning your context window — one proxy tool instead of hundreds" "pi-web-access|Web search, content extraction, and video understanding — zero-config Exa search, Perplexity, Gemini, YouTube" "@plannotator/pi-extension|File-based plan mode with visual browser UI for reviewing, annotating, and approving agent plans" "@juicesharp/rpiv-ask-user-question|Structured questionnaire tool with typed options — the model asks you instead of guessing" "pi-lens|Real-time code feedback — LSP diagnostics, linters, formatters, type-checking, structural analysis, read-before-edit guard" "@juicesharp/rpiv-todo|Persistent todo list across sessions — tasks survive /reload and compaction with dependency tracking" "pi-simplify|Review recently changed code for clarity, consistency, and maintainability improvements" "@juicesharp/rpiv-advisor|Second opinion from a stronger reviewer model before the agent acts" "@juicesharp/rpiv-pi|Skill-based development workflow — discover, research, design, plan, implement, validate pipeline with named subagents" "@samfp/pi-memory|Persistent memory for Pi — learns corrections, preferences, and project patterns across sessions" "pi-btw|Parallel side conversations (/btw) without interrupting the main agent run" "pi-docparser|Document parsing tool — PDFs, Office docs, spreadsheets, images, and OCR via LiteParse" "pi-ollama-cloud|Ollama Cloud provider plugin — dynamic model discovery, web search and fetch tools, no local server required" ) # ──────────────────────────────────────────── # Utility functions (all stderr output) # ──────────────────────────────────────────── info() { echo "[INFO] $*" >&2; } warn() { echo "[WARN] $*" >&2; } error() { echo "[ERROR] $*" >&2; exit 1; } success() { echo "[OK] $*" >&2; } # ──────────────────────────────────────────── # Check required commands # ──────────────────────────────────────────── for cmd in curl; do command -v "$cmd" &>/dev/null || error "'$cmd' is required." done # ──────────────────────────────────────────── # Detect OS / Architecture # ──────────────────────────────────────────── OS="$(uname -s)" ARCH="$(uname -m)" case "$OS" in Darwin|Linux) ;; *) error "Unsupported OS: $OS. This script only supports macOS and Linux." ;; esac info "Platform: $OS ($ARCH)" # ──────────────────────────────────────────── # Step 1: Install Pi Coding Agent # ──────────────────────────────────────────── info "Installing Pi Coding Agent..." if command -v pi &>/dev/null; then CURRENT_VER="$(pi --version 2>/dev/null || echo 'unknown')" info "Pi is already installed (version: $CURRENT_VER). Skipping installation." else # Try curl-based installer first if curl -fsSL "$PI_INSTALL_URL" 2>/dev/null | sh; then success "Pi installed via curl installer" else # Fallback to npm info "curl install failed. Falling back to npm..." command -v npm &>/dev/null || error "npm is required. Install Node.js 18+: https://nodejs.org/" npm install -g "$PI_NPM_PACKAGE" success "Pi installed via npm" fi fi # Verify pi is available (may need to re-hash PATH) if command -v pi &>/dev/null; then success "Pi is available: $(command -v pi)" else # Try common locations export PATH="$HOME/.local/bin:$HOME/.npm/bin:$HOME/.nvm/versions/node/$(ls "$HOME/.nvm/versions/node/" 2>/dev/null | tail -1)/bin:$PATH" if command -v pi &>/dev/null; then success "Pi is available: $(command -v pi)" else error "'pi' command not found. Check your PATH." fi fi # ──────────────────────────────────────────── # Step 2: Install packages # ──────────────────────────────────────────── info "" info "Installing Pi packages..." info "────────────────────────────────────────" TOTAL=${#PACKAGES[@]} COUNT=0 FAILED=() for entry in "${PACKAGES[@]}"; do PKG="${entry%%|*}" DESC="${entry#*|}" COUNT=$((COUNT + 1)) info "[$COUNT/$TOTAL] $PKG — $DESC" if pi install "npm:$PKG" 2>&1; then success " → $PKG installed" else warn " → $PKG failed (install manually later: pi install npm:$PKG)" FAILED+=("$PKG") fi done info "" info "────────────────────────────────────────" if [ ${#FAILED[@]} -eq 0 ]; then success "All packages installed! ($TOTAL/$TOTAL)" else warn "Some packages failed to install:" for pkg in "${FAILED[@]}"; do warn " - $pkg" done info "You can install failed packages manually with:" for pkg in "${FAILED[@]}"; do info " pi install npm:$pkg" done fi # ──────────────────────────────────────────── # Step 3: Post-install notes # ──────────────────────────────────────────── info "" info "══════════════════════════════════════════" success "Pi Coding Agent installation complete!" info "══════════════════════════════════════════" info "" info "Getting started:" info " 1. Navigate to your project: cd /path/to/project" info " 2. Start Pi: pi" info " 3. Log in: /login" info "" info "Useful commands:" info " pi — Start interactive session" info " pi -p '...' — Ask a single question (print mode)" info " pi --help — Show help" info "" info "List installed packages:" info " pi list — Show installed packages" info "" info "For Ollama Cloud:" info " Set your API key in ~/.pi/agent/auth.json" info " See: https://pi.dev/packages/pi-ollama-cloud"