install-unix.sh 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #!/usr/bin/env bash
  2. #
  3. # Modern CLI Toolkit Installer (Linux/macOS)
  4. # Token-efficient tools for AI coding assistants
  5. #
  6. set -e
  7. BLUE='\033[0;34m'
  8. GREEN='\033[0;32m'
  9. YELLOW='\033[1;33m'
  10. RED='\033[0;31m'
  11. NC='\033[0m' # No Color
  12. echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
  13. echo -e "${BLUE}║ Modern CLI Toolkit Installer (Unix) ║${NC}"
  14. echo -e "${BLUE}║ Token-efficient tools for AI coding assistants ║${NC}"
  15. echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"
  16. echo ""
  17. # Detect OS and package manager
  18. detect_package_manager() {
  19. if [[ "$OSTYPE" == "darwin"* ]]; then
  20. if command -v brew &> /dev/null; then
  21. echo "brew"
  22. else
  23. echo -e "${RED}ERROR: Homebrew not found. Install from https://brew.sh${NC}"
  24. exit 1
  25. fi
  26. elif command -v apt &> /dev/null; then
  27. echo "apt"
  28. elif command -v dnf &> /dev/null; then
  29. echo "dnf"
  30. elif command -v pacman &> /dev/null; then
  31. echo "pacman"
  32. elif command -v cargo &> /dev/null; then
  33. echo "cargo"
  34. else
  35. echo -e "${RED}ERROR: No supported package manager found.${NC}"
  36. exit 1
  37. fi
  38. }
  39. PKG_MANAGER=$(detect_package_manager)
  40. echo -e "Detected package manager: ${GREEN}$PKG_MANAGER${NC}"
  41. echo ""
  42. installed=0
  43. skipped=0
  44. failed=0
  45. install_tool() {
  46. local name=$1
  47. local binary=$2
  48. local brew_pkg=$3
  49. local apt_pkg=$4
  50. local cargo_pkg=$5
  51. echo -n " Installing $name... "
  52. # Check if already installed
  53. if command -v "$binary" &> /dev/null; then
  54. echo -e "${YELLOW}SKIP (already installed)${NC}"
  55. ((skipped++))
  56. return
  57. fi
  58. case $PKG_MANAGER in
  59. brew)
  60. if brew install "$brew_pkg" &> /dev/null; then
  61. echo -e "${GREEN}OK${NC}"
  62. ((installed++))
  63. else
  64. echo -e "${RED}FAILED${NC}"
  65. ((failed++))
  66. fi
  67. ;;
  68. apt)
  69. if sudo apt install -y "$apt_pkg" &> /dev/null; then
  70. echo -e "${GREEN}OK${NC}"
  71. ((installed++))
  72. else
  73. # Fallback to cargo if apt package not available
  74. if [ -n "$cargo_pkg" ] && command -v cargo &> /dev/null; then
  75. if cargo install "$cargo_pkg" &> /dev/null; then
  76. echo -e "${GREEN}OK (via cargo)${NC}"
  77. ((installed++))
  78. else
  79. echo -e "${RED}FAILED${NC}"
  80. ((failed++))
  81. fi
  82. else
  83. echo -e "${RED}FAILED${NC}"
  84. ((failed++))
  85. fi
  86. fi
  87. ;;
  88. dnf)
  89. if sudo dnf install -y "$apt_pkg" &> /dev/null; then
  90. echo -e "${GREEN}OK${NC}"
  91. ((installed++))
  92. else
  93. echo -e "${RED}FAILED${NC}"
  94. ((failed++))
  95. fi
  96. ;;
  97. pacman)
  98. if sudo pacman -S --noconfirm "$apt_pkg" &> /dev/null; then
  99. echo -e "${GREEN}OK${NC}"
  100. ((installed++))
  101. else
  102. echo -e "${RED}FAILED${NC}"
  103. ((failed++))
  104. fi
  105. ;;
  106. cargo)
  107. if cargo install "$cargo_pkg" &> /dev/null; then
  108. echo -e "${GREEN}OK${NC}"
  109. ((installed++))
  110. else
  111. echo -e "${RED}FAILED${NC}"
  112. ((failed++))
  113. fi
  114. ;;
  115. esac
  116. }
  117. echo "File Search & Navigation"
  118. echo "────────────────────────"
  119. install_tool "fd (find replacement)" "fd" "fd" "fd-find" "fd-find"
  120. install_tool "ripgrep (grep replacement)" "rg" "ripgrep" "ripgrep" "ripgrep"
  121. install_tool "eza (ls replacement)" "eza" "eza" "eza" "eza"
  122. install_tool "bat (cat replacement)" "bat" "bat" "bat" "bat"
  123. install_tool "zoxide (cd replacement)" "zoxide" "zoxide" "zoxide" "zoxide"
  124. install_tool "broot (tree replacement)" "broot" "broot" "broot" "broot"
  125. echo ""
  126. echo "Data Processing"
  127. echo "────────────────"
  128. install_tool "sd (sed replacement)" "sd" "sd" "sd" "sd"
  129. install_tool "jq (JSON processor)" "jq" "jq" "jq" ""
  130. install_tool "yq (YAML processor)" "yq" "yq" "yq" ""
  131. echo ""
  132. echo "Git Operations"
  133. echo "──────────────"
  134. install_tool "delta (git diff)" "delta" "git-delta" "git-delta" "git-delta"
  135. install_tool "difft (semantic diff)" "difft" "difftastic" "difftastic" "difftastic"
  136. install_tool "lazygit (git TUI)" "lazygit" "lazygit" "lazygit" ""
  137. install_tool "gh (GitHub CLI)" "gh" "gh" "gh" ""
  138. echo ""
  139. echo "System Monitoring"
  140. echo "─────────────────"
  141. install_tool "dust (du replacement)" "dust" "dust" "du-dust" "du-dust"
  142. install_tool "bottom (top replacement)" "btm" "bottom" "bottom" "bottom"
  143. install_tool "procs (ps replacement)" "procs" "procs" "procs" "procs"
  144. echo ""
  145. echo "Code Analysis"
  146. echo "─────────────"
  147. install_tool "tokei (line counter)" "tokei" "tokei" "tokei" "tokei"
  148. install_tool "ast-grep (AST search)" "sg" "ast-grep" "" "ast-grep"
  149. install_tool "hyperfine (benchmarking)" "hyperfine" "hyperfine" "hyperfine" "hyperfine"
  150. echo ""
  151. echo "Interactive Selection"
  152. echo "─────────────────────"
  153. install_tool "fzf (fuzzy finder)" "fzf" "fzf" "fzf" ""
  154. echo ""
  155. echo "Documentation"
  156. echo "─────────────"
  157. install_tool "tldr (man replacement)" "tldr" "tealdeer" "tldr" "tealdeer"
  158. echo ""
  159. echo "Python"
  160. echo "──────"
  161. install_tool "uv (pip replacement)" "uv" "uv" "" ""
  162. echo ""
  163. echo "Task Running"
  164. echo "────────────"
  165. install_tool "just (make replacement)" "just" "just" "just" "just"
  166. echo ""
  167. echo -e "${BLUE}════════════════════════════════════════════════════════════════${NC}"
  168. echo -e "${BLUE} Results: $installed installed, $skipped skipped, $failed failed${NC}"
  169. echo -e "${BLUE}════════════════════════════════════════════════════════════════${NC}"
  170. # Post-install: Update tldr cache
  171. if command -v tldr &> /dev/null; then
  172. echo ""
  173. echo -n "Updating tldr cache..."
  174. tldr --update &> /dev/null || true
  175. echo -e " ${GREEN}OK${NC}"
  176. fi
  177. # Post-install: Shell integration hints
  178. echo ""
  179. echo -e "${YELLOW}Shell Integration:${NC}"
  180. echo ""
  181. echo "Add to your ~/.bashrc or ~/.zshrc:"
  182. echo ""
  183. echo " # zoxide (smart cd)"
  184. echo ' eval "$(zoxide init bash)" # or zsh'
  185. echo ""
  186. echo " # fzf integration"
  187. echo ' [ -f ~/.fzf.bash ] && source ~/.fzf.bash # or .zsh'
  188. echo ' export FZF_DEFAULT_COMMAND="fd --type f --hidden --follow --exclude .git"'
  189. echo ""
  190. # Install custom CLI wrappers
  191. echo ""
  192. echo -e "${BLUE}Installing custom CLI wrappers...${NC}"
  193. echo "────────────────────────────────"
  194. LOCAL_BIN="$HOME/.local/bin"
  195. mkdir -p "$LOCAL_BIN"
  196. # Perplexity CLI wrapper
  197. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  198. if [ -f "$SCRIPT_DIR/perplexity.py" ]; then
  199. cp "$SCRIPT_DIR/perplexity.py" "$LOCAL_BIN/perplexity"
  200. chmod +x "$LOCAL_BIN/perplexity"
  201. echo -e " perplexity CLI: ${GREEN}OK${NC}"
  202. else
  203. echo -e " perplexity CLI: ${YELLOW}SKIP (perplexity.py not found)${NC}"
  204. fi
  205. # Check if ~/.local/bin is in PATH
  206. if [[ ":$PATH:" != *":$LOCAL_BIN:"* ]]; then
  207. echo ""
  208. echo -e "${YELLOW}Add ~/.local/bin to your PATH:${NC}"
  209. echo ' export PATH="$HOME/.local/bin:$PATH"'
  210. fi
  211. echo ""
  212. echo -e "${BLUE}Verify installation with:${NC}"
  213. echo ' which fd rg eza bat zoxide delta difft jq yq sd lazygit gh tokei uv just fzf dust btm procs tldr'
  214. echo ' perplexity --list-models'
  215. echo ""