commit 067432610e1f38c6fb10d65e97b716ddbbe45d5e Author: Justin Lin Date: Wed Oct 1 15:35:50 2025 +1000 feat: mac setup script diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..93fb98d --- /dev/null +++ b/install.sh @@ -0,0 +1,268 @@ +#!/bin/bash + +# Mac Setup Script - Install Git, Node.js, and Python +# This script will install essential development tools on macOS + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Function to print colored output +print_status() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Function to check if command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Function to check if running on macOS +check_macos() { + if [[ "$OSTYPE" != "darwin"* ]]; then + print_error "This script is designed for macOS only" + exit 1 + fi +} + +# Function to install Homebrew if not present +install_homebrew() { + if command_exists brew; then + print_success "Homebrew is already installed" + print_status "Updating Homebrew..." + brew update + else + print_status "Installing Homebrew..." + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Add Homebrew to PATH for Apple Silicon Macs + if [[ $(uname -m) == "arm64" ]]; then + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile + eval "$(/opt/homebrew/bin/brew shellenv)" + fi + fi +} + +# Function to install Git +install_git() { + if command_exists git; then + print_success "Git is already installed: $(git --version)" + else + print_status "Installing Git..." + brew install git + print_success "Git installed successfully: $(git --version)" + fi +} + +# Function to install Node.js +install_nodejs() { + if command_exists node; then + print_success "Node.js is already installed: $(node --version)" + print_status "Node.js version: $(node --version)" + print_status "npm version: $(npm --version)" + else + print_status "Installing Node.js..." + brew install node + print_success "Node.js installed successfully: $(node --version)" + print_status "npm version: $(npm --version)" + fi +} + +# Function to install Python +install_python() { + if command_exists python3; then + print_success "Python3 is already installed: $(python3 --version)" + else + print_status "Installing Python..." + brew install python + print_success "Python installed successfully: $(python3 --version)" + fi + + # Check if pip is available + if command_exists pip3; then + print_success "pip3 is available: $(pip3 --version)" + else + print_warning "pip3 not found, installing..." + python3 -m ensurepip --upgrade + fi +} + +# Function to install synchan +install_synchan() { + local synchan_dir="$HOME/synchan" + + if [ -d "$synchan_dir" ]; then + print_warning "Synchan directory already exists at $synchan_dir" + read -p "Do you want to remove the existing directory and reinstall? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + print_status "Removing existing synchan directory..." + rm -rf "$synchan_dir" + else + print_status "Skipping synchan installation" + return 0 + fi + fi + + print_status "Installing synchan from https://github.com/lancatlin/synchan..." + + # Check if git is available + if ! command_exists git; then + print_error "Git is required to install synchan. Please install Git first." + return 1 + fi + + # Check if yarn is available + if ! command_exists yarn; then + print_status "Yarn not found, installing yarn..." + if command_exists npm; then + npm install -g yarn + else + print_error "npm is required to install yarn. Please install Node.js first." + return 1 + fi + fi + + # Clone the repository + print_status "Cloning synchan repository..." + if git clone https://github.com/lancatlin/synchan.git "$synchan_dir"; then + print_success "Repository cloned successfully" + else + print_error "Failed to clone synchan repository" + return 1 + fi + + # Navigate to the directory and install dependencies + print_status "Installing dependencies with yarn..." + cd "$synchan_dir" + + if yarn install; then + print_success "Dependencies installed successfully" + print_success "Synchan installed at: $synchan_dir" + print_status "To use synchan, navigate to: cd $synchan_dir" + else + print_error "Failed to install dependencies with yarn" + return 1 + fi + + # Return to original directory + cd - > /dev/null +} + +# Function to install additional useful tools +install_additional_tools() { + print_status "Installing additional useful development tools..." + + # Install common tools + brew install curl wget jq tree + + # Install development tools + brew install --cask visual-studio-code + brew install --cask iterm2 + + print_success "Additional tools installed" +} + +# Function to verify installations +verify_installations() { + print_status "Verifying installations..." + + echo "" + print_status "=== Installation Summary ===" + + if command_exists git; then + print_success "✓ Git: $(git --version)" + else + print_error "✗ Git installation failed" + fi + + if command_exists node; then + print_success "✓ Node.js: $(node --version)" + print_success "✓ npm: $(npm --version)" + else + print_error "✗ Node.js installation failed" + fi + + if command_exists python3; then + print_success "✓ Python3: $(python3 --version)" + if command_exists pip3; then + print_success "✓ pip3: $(pip3 --version)" + fi + else + print_error "✗ Python3 installation failed" + fi + + if command_exists brew; then + print_success "✓ Homebrew: $(brew --version | head -n1)" + else + print_error "✗ Homebrew installation failed" + fi + + # Check synchan installation + if [ -d "$HOME/synchan" ]; then + print_success "✓ Synchan: Installed at $HOME/synchan" + else + print_warning "⚠ Synchan: Not installed" + fi +} + +# Main execution +main() { + print_status "Starting Mac development environment setup..." + print_status "This script will install: Git, Node.js, Python, Homebrew, and optionally synchan" + echo "" + + # Check if running on macOS + check_macos + + # Install Homebrew first (required for other packages) + install_homebrew + + # Install core development tools + install_git + install_nodejs + install_python + + # Ask if user wants to install synchan + echo "" + read -p "Do you want to install synchan from GitHub? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + install_synchan + fi + + # Ask if user wants additional tools + echo "" + read -p "Do you want to install additional development tools (VS Code, iTerm2, etc.)? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + install_additional_tools + fi + + # Verify all installations + verify_installations + + echo "" + print_success "Setup complete! Your Mac development environment is ready." + print_status "You may need to restart your terminal or run 'source ~/.zprofile' to use the new tools." +} + +# Run main function +main "$@" \ No newline at end of file