| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #!/usr/bin/env bash
- #
- # Modern CLI Toolkit Installer (Linux/macOS)
- # Token-efficient tools for AI coding assistants
- #
- set -e
- BLUE='\033[0;34m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- RED='\033[0;31m'
- NC='\033[0m' # No Color
- echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
- echo -e "${BLUE}║ Modern CLI Toolkit Installer (Unix) ║${NC}"
- echo -e "${BLUE}║ Token-efficient tools for AI coding assistants ║${NC}"
- echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"
- echo ""
- # Detect OS and package manager
- detect_package_manager() {
- if [[ "$OSTYPE" == "darwin"* ]]; then
- if command -v brew &> /dev/null; then
- echo "brew"
- else
- echo -e "${RED}ERROR: Homebrew not found. Install from https://brew.sh${NC}"
- exit 1
- fi
- elif command -v apt &> /dev/null; then
- echo "apt"
- elif command -v dnf &> /dev/null; then
- echo "dnf"
- elif command -v pacman &> /dev/null; then
- echo "pacman"
- elif command -v cargo &> /dev/null; then
- echo "cargo"
- else
- echo -e "${RED}ERROR: No supported package manager found.${NC}"
- exit 1
- fi
- }
- PKG_MANAGER=$(detect_package_manager)
- echo -e "Detected package manager: ${GREEN}$PKG_MANAGER${NC}"
- echo ""
- installed=0
- skipped=0
- failed=0
- install_tool() {
- local name=$1
- local binary=$2
- local brew_pkg=$3
- local apt_pkg=$4
- local cargo_pkg=$5
- echo -n " Installing $name... "
- # Check if already installed
- if command -v "$binary" &> /dev/null; then
- echo -e "${YELLOW}SKIP (already installed)${NC}"
- ((skipped++))
- return
- fi
- case $PKG_MANAGER in
- brew)
- if brew install "$brew_pkg" &> /dev/null; then
- echo -e "${GREEN}OK${NC}"
- ((installed++))
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- ;;
- apt)
- if sudo apt install -y "$apt_pkg" &> /dev/null; then
- echo -e "${GREEN}OK${NC}"
- ((installed++))
- else
- # Fallback to cargo if apt package not available
- if [ -n "$cargo_pkg" ] && command -v cargo &> /dev/null; then
- if cargo install "$cargo_pkg" &> /dev/null; then
- echo -e "${GREEN}OK (via cargo)${NC}"
- ((installed++))
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- fi
- ;;
- dnf)
- if sudo dnf install -y "$apt_pkg" &> /dev/null; then
- echo -e "${GREEN}OK${NC}"
- ((installed++))
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- ;;
- pacman)
- if sudo pacman -S --noconfirm "$apt_pkg" &> /dev/null; then
- echo -e "${GREEN}OK${NC}"
- ((installed++))
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- ;;
- cargo)
- if cargo install "$cargo_pkg" &> /dev/null; then
- echo -e "${GREEN}OK${NC}"
- ((installed++))
- else
- echo -e "${RED}FAILED${NC}"
- ((failed++))
- fi
- ;;
- esac
- }
- echo "File Search & Navigation"
- echo "────────────────────────"
- install_tool "fd (find replacement)" "fd" "fd" "fd-find" "fd-find"
- install_tool "ripgrep (grep replacement)" "rg" "ripgrep" "ripgrep" "ripgrep"
- install_tool "eza (ls replacement)" "eza" "eza" "eza" "eza"
- install_tool "bat (cat replacement)" "bat" "bat" "bat" "bat"
- install_tool "zoxide (cd replacement)" "zoxide" "zoxide" "zoxide" "zoxide"
- install_tool "broot (tree replacement)" "broot" "broot" "broot" "broot"
- echo ""
- echo "Data Processing"
- echo "────────────────"
- install_tool "sd (sed replacement)" "sd" "sd" "sd" "sd"
- install_tool "jq (JSON processor)" "jq" "jq" "jq" ""
- install_tool "yq (YAML processor)" "yq" "yq" "yq" ""
- echo ""
- echo "Git Operations"
- echo "──────────────"
- install_tool "delta (git diff)" "delta" "git-delta" "git-delta" "git-delta"
- install_tool "difft (semantic diff)" "difft" "difftastic" "difftastic" "difftastic"
- install_tool "lazygit (git TUI)" "lazygit" "lazygit" "lazygit" ""
- install_tool "gh (GitHub CLI)" "gh" "gh" "gh" ""
- echo ""
- echo "System Monitoring"
- echo "─────────────────"
- install_tool "dust (du replacement)" "dust" "dust" "du-dust" "du-dust"
- install_tool "bottom (top replacement)" "btm" "bottom" "bottom" "bottom"
- install_tool "procs (ps replacement)" "procs" "procs" "procs" "procs"
- echo ""
- echo "Code Analysis"
- echo "─────────────"
- install_tool "tokei (line counter)" "tokei" "tokei" "tokei" "tokei"
- install_tool "ast-grep (AST search)" "sg" "ast-grep" "" "ast-grep"
- install_tool "hyperfine (benchmarking)" "hyperfine" "hyperfine" "hyperfine" "hyperfine"
- echo ""
- echo "Interactive Selection"
- echo "─────────────────────"
- install_tool "fzf (fuzzy finder)" "fzf" "fzf" "fzf" ""
- echo ""
- echo "Documentation"
- echo "─────────────"
- install_tool "tldr (man replacement)" "tldr" "tealdeer" "tldr" "tealdeer"
- echo ""
- echo "Python"
- echo "──────"
- install_tool "uv (pip replacement)" "uv" "uv" "" ""
- echo ""
- echo "Task Running"
- echo "────────────"
- install_tool "just (make replacement)" "just" "just" "just" "just"
- echo ""
- echo -e "${BLUE}════════════════════════════════════════════════════════════════${NC}"
- echo -e "${BLUE} Results: $installed installed, $skipped skipped, $failed failed${NC}"
- echo -e "${BLUE}════════════════════════════════════════════════════════════════${NC}"
- # Post-install: Update tldr cache
- if command -v tldr &> /dev/null; then
- echo ""
- echo -n "Updating tldr cache..."
- tldr --update &> /dev/null || true
- echo -e " ${GREEN}OK${NC}"
- fi
- # Post-install: Shell integration hints
- echo ""
- echo -e "${YELLOW}Shell Integration:${NC}"
- echo ""
- echo "Add to your ~/.bashrc or ~/.zshrc:"
- echo ""
- echo " # zoxide (smart cd)"
- echo ' eval "$(zoxide init bash)" # or zsh'
- echo ""
- echo " # fzf integration"
- echo ' [ -f ~/.fzf.bash ] && source ~/.fzf.bash # or .zsh'
- echo ' export FZF_DEFAULT_COMMAND="fd --type f --hidden --follow --exclude .git"'
- echo ""
- # Install custom CLI wrappers
- echo ""
- echo -e "${BLUE}Installing custom CLI wrappers...${NC}"
- echo "────────────────────────────────"
- LOCAL_BIN="$HOME/.local/bin"
- mkdir -p "$LOCAL_BIN"
- # Perplexity CLI wrapper
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- if [ -f "$SCRIPT_DIR/perplexity.py" ]; then
- cp "$SCRIPT_DIR/perplexity.py" "$LOCAL_BIN/perplexity"
- chmod +x "$LOCAL_BIN/perplexity"
- echo -e " perplexity CLI: ${GREEN}OK${NC}"
- else
- echo -e " perplexity CLI: ${YELLOW}SKIP (perplexity.py not found)${NC}"
- fi
- # Check if ~/.local/bin is in PATH
- if [[ ":$PATH:" != *":$LOCAL_BIN:"* ]]; then
- echo ""
- echo -e "${YELLOW}Add ~/.local/bin to your PATH:${NC}"
- echo ' export PATH="$HOME/.local/bin:$PATH"'
- fi
- echo ""
- echo -e "${BLUE}Verify installation with:${NC}"
- echo ' which fd rg eza bat zoxide delta difft jq yq sd lazygit gh tokei uv just fzf dust btm procs tldr'
- echo ' perplexity --list-models'
- echo ""
|