#!/usr/bin/env bash ################################################################################ # Claude Code Customizations - Interactive Installer # Step-by-step installation with user choices for each component ################################################################################ set -e # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' # Configuration CLAUDE_DIR="$HOME/.claude" BACKUP_DIR="$HOME/.claude-backup-$(date +%Y%m%d_%H%M%S)" SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # User choices USE_ZAI_MODELS=false INSTALL_AGENTS=true INSTALL_ENGINEERING=true INSTALL_MARKETING=true INSTALL_PRODUCT=true INSTALL_STUDIO_OPS=true INSTALL_PROJECT_MGMT=true INSTALL_TESTING=true INSTALL_DESIGN=true INSTALL_BONUS=true INSTALL_MCP_TOOLS=true INSTALL_VISION_TOOLS=true INSTALL_WEB_TOOLS=true INSTALL_GITHUB_TOOLS=true INSTALL_PLUGINS=true INSTALL_HOOKS=true LAUNCH_CLAUDE=false # Counters SELECTED_AGENTS=0 SELECTED_MCP_TOOLS=0 ################################################################################ # Helper Functions ################################################################################ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warning() { echo -e "${YELLOW}[!]${NC} $1"; } log_error() { echo -e "${RED}[✗]${NC} $1"; } print_header() { clear echo -e "${CYAN}╔══════════════════════════════════════════════════════════════════╗${NC}" echo -e "${CYAN}║${NC} ${BOLD}Claude Code Customizations - Interactive Installer${NC} ${CYAN}║${NC}" echo -e "${CYAN}╚══════════════════════════════════════════════════════════════════╝${NC}" echo "" } confirm() { local prompt="$1" local default="$2" if [ "$default" = "Y" ]; then prompt="$prompt [Y/n]: " else prompt="$prompt [y/N]: " fi read -p "$prompt" response if [ -z "$response" ]; then if [ "$default" = "Y" ]; then return 0 else return 1 fi fi [[ "$response" =~ ^[Yy]$ ]] } select_multiple() { local title="$1" shift local options=("$@") echo "" echo -e "${BOLD}$title${NC}" echo "─────────────────────────────────────────────────────────────" echo "" local i=1 for opt in "${options[@]}"; do echo " $i) $opt" i=$((i+1)) done echo " a) All" echo " n) None" echo "" while true; do read -p "Select options (comma-separated, a=n): " selection if [[ "$selection" =~ ^[Aa]$ ]]; then return 0 # All elif [[ "$selection" =~ ^[Nn]$ ]]; then return 1 # None else return 0 # Has selections fi done } ################################################################################ # Welcome Screen ################################################################################ show_welcome() { print_header echo -e "${BOLD}Welcome to Claude Code Customizations Installer!${NC}" echo "" echo "This installer will guide you through setting up a customized" echo "Claude Code environment with:" echo "" echo " • 40+ specialized agents for development, marketing, and operations" echo " • MCP tools for vision analysis, web search, and GitHub integration" echo " • Custom skills and plugins" echo " • Optimized workflows for rapid 6-day development cycles" echo "" echo -e "${YELLOW}Note:${NC} You can choose what to install at each step." echo "" if ! confirm "Continue with installation?" "Y"; then echo "Installation cancelled." exit 0 fi } ################################################################################ # Model Selection ################################################################################ select_model() { print_header echo -e "${BOLD}Step 1: Model Selection${NC}" echo "═══════════════════════════════════════════════════════════" echo "" echo "Choose which API models to use with Claude Code:" echo "" echo -e " ${GREEN}1${NC}) ${BOLD}Anthropic Claude Models${NC} (official)" echo " • claude-sonnet-4.5, claude-opus-4.5, etc." echo " • Direct Anthropic API" echo " • Base URL: https://api.anthropic.com" echo "" echo -e " ${CYAN}2${NC}) ${BOLD}Z.AI / GLM Coding Plan Models${NC}" echo " • Same Claude models via Z.AI platform" echo " • Additional features: usage tracking, feedback, promotions" echo " • Base URL: https://api.z.ai/api/anthropic" echo " • Includes: 旺仔牛奶 rewards program" echo "" read -p "Select model provider [1/2]: " model_choice case $model_choice in 2) USE_ZAI_MODELS=true log_success "Selected: Z.AI / GLM Coding Plan Models" ;; *) USE_ZAI_MODELS=false log_success "Selected: Anthropic Claude Models (official)" ;; esac echo "" } ################################################################################ # Agent Selection ################################################################################ select_agents() { print_header echo -e "${BOLD}Step 2: Agent Categories${NC}" echo "═══════════════════════════════════════════════════════════" echo "" echo "Custom agents provide specialized assistance for different tasks." echo "Select which categories to install:" echo "" if confirm "Install Engineering agents? (AI engineer, frontend/backend dev, DevOps, mobile, rapid prototyper, test writer)" "Y"; then INSTALL_ENGINEERING=true SELECTED_AGENTS=$((SELECTED_AGENTS + 7)) else INSTALL_ENGINEERING=false fi if confirm "Install Marketing agents? (TikTok strategist, growth hacker, content creator, Instagram/Reddit/Twitter)" "Y"; then INSTALL_MARKETING=true SELECTED_AGENTS=$((SELECTED_AGENTS + 7)) else INSTALL_MARKETING=false fi if confirm "Install Product agents? (Sprint prioritizer, feedback synthesizer, trend researcher)" "Y"; then INSTALL_PRODUCT=true SELECTED_AGENTS=$((SELECTED_AGENTS + 3)) else INSTALL_PRODUCT=false fi if confirm "Install Studio Operations agents? (Studio producer, project shipper, analytics, finance, legal, support, coach)" "Y"; then INSTALL_STUDIO_OPS=true SELECTED_AGENTS=$((SELECTED_AGENTS + 8)) else INSTALL_STUDIO_OPS=false fi if confirm "Install Project Management agents? (Experiment tracker, studio producer, project shipper)" "Y"; then INSTALL_PROJECT_MGMT=true SELECTED_AGENTS=$((SELECTED_AGENTS + 3)) else INSTALL_PROJECT_MGMT=false fi if confirm "Install Testing agents? (Test writer/fixer, API tester, performance benchmarker, workflow optimizer)" "Y"; then INSTALL_TESTING=true SELECTED_AGENTS=$((SELECTED_AGENTS + 5)) else INSTALL_TESTING=false fi if confirm "Install Design agents? (UI/UX designer, brand guardian, visual storyteller, whimsy injector)" "Y"; then INSTALL_DESIGN=true SELECTED_AGENTS=$((SELECTED_AGENTS + 5)) else INSTALL_DESIGN=false fi if confirm "Install Bonus agents? (Joker, studio coach)" "Y"; then INSTALL_BONUS=true SELECTED_AGENTS=$((SELECTED_AGENTS + 2)) else INSTALL_BONUS=false fi if [ $SELECTED_AGENTS -eq 0 ]; then log_warning "No agents selected - you can add them later manually" else log_success "Selected $SELECTED_AGENTS agents across multiple categories" fi echo "" } ################################################################################ # MCP Tools Selection ################################################################################ select_mcp_tools() { print_header echo -e "${BOLD}Step 3: MCP Tools${NC}" echo "═══════════════════════════════════════════════════════════" echo "" echo "MCP (Model Context Protocol) tools provide advanced capabilities." echo "Select which tools to install:" echo "" if confirm "Install Vision Analysis tools? (images, videos, UI screenshots, error diagnosis, data visualization, diagrams)" "Y"; then INSTALL_VISION_TOOLS=true SELECTED_MCP_TOOLS=$((SELECTED_MCP_TOOLS + 8)) else INSTALL_VISION_TOOLS=false fi if confirm "Install Web Search tool? (enhanced search with domain filtering, time-based results)" "Y"; then INSTALL_WEB_TOOLS=true SELECTED_MCP_TOOLS=$((SELECTED_MCP_TOOLS + 1)) else INSTALL_WEB_TOOLS=false fi if confirm "Install Web Reader tool? (fetch URLs, convert to markdown)" "Y"; then INSTALL_WEB_TOOLS=true SELECTED_MCP_TOOLS=$((SELECTED_MCP_TOOLS + 1)) fi if confirm "Install GitHub Reader tool? (read repos, search docs/issues/commits)" "Y"; then INSTALL_GITHUB_TOOLS=true SELECTED_MCP_TOOLS=$((SELECTED_MCP_TOOLS + 3)) else INSTALL_GITHUB_TOOLS=false fi if [ $SELECTED_MCP_TOOLS -eq 0 ]; then log_warning "No MCP tools selected" else log_success "Selected $SELECTED_MCP_TOOLS MCP tools" fi INSTALL_MCP_TOOLS=true echo "" } ################################################################################ # Plugins Selection ################################################################################ select_plugins() { print_header echo -e "${BOLD}Step 4: Plugins & Skills${NC}" echo "═══════════════════════════════════════════════════════════" echo "" echo "Plugins extend Claude Code with additional features:" echo "" echo " • glm-plan-bug: Submit bug/issue feedback to Z.AI" echo " • glm-plan-usage: Query your GLM Coding Plan usage statistics" echo "" if confirm "Install Z.AI plugins?" "Y"; then INSTALL_PLUGINS=true log_success "Plugins selected" else INSTALL_PLUGINS=false log_warning "Plugins skipped" fi echo "" } ################################################################################ # Hooks Selection ################################################################################ select_hooks() { print_header echo -e "${BOLD}Step 5: Hooks${NC}" echo "═══════════════════════════════════════════════════════════" echo "" echo "Hooks are scripts that run automatically on specific events." echo "Do you want to copy existing hooks from the package?" echo "" if confirm "Install hooks?" "N"; then INSTALL_HOOKS=true log_success "Hooks selected" else INSTALL_HOOKS=false log_warning "Hooks skipped" fi echo "" } ################################################################################ # Prerequisites Check ################################################################################ check_prerequisites() { print_header echo -e "${BOLD}Step 6: Prerequisites Check${NC}" echo "═══════════════════════════════════════════════════════════" echo "" local errors=0 # Check Node.js if command -v node &> /dev/null; then NODE_VERSION=$(node -v) log_success "Node.js installed: $NODE_VERSION" else log_error "Node.js not found" errors=$((errors+1)) fi # Check npm if command -v npm &> /dev/null; then NPM_VERSION=$(npm -v) log_success "npm installed: $NPM_VERSION" else log_error "npm not found" errors=$((errors+1)) fi # Check python3 if command -v python3 &> /dev/null; then PYTHON_VERSION=$(python3 --version) log_success "Python installed: $PYTHON_VERSION" else log_warning "Python3 not found (optional)" fi # Check npx if command -v npx &> /dev/null; then log_success "npx available" else log_warning "npx not found (will be installed with npm)" fi echo "" if [ $errors -gt 0 ]; then log_error "Some prerequisites are missing. Please install them and try again." echo "" echo "Install Node.js: https://nodejs.org/" echo "Or use nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash" echo "" exit 1 fi log_success "Prerequisites check passed" echo "" sleep 1 } ################################################################################ # Claude Code Installation ################################################################################ install_claude_code() { print_header echo -e "${BOLD}Step 7: Claude Code Installation${NC}" echo "═══════════════════════════════════════════════════════════" echo "" # Check if Claude Code is installed if command -v claude-code &> /dev/null; then log_success "Claude Code is already installed" claude-code --version 2>/dev/null || log_info "Version: unknown" echo "" return fi echo -e "${YELLOW}Claude Code is not installed on this system.${NC}" echo "" echo "Claude Code is Anthropic's official CLI for Claude." echo "You need it to use these customizations." echo "" echo "Installation options:" echo "" echo -e " ${GREEN}1${NC}) ${BOLD}Install via npm (recommended)${NC}" echo " • Requires Node.js 14+" echo " • Command: npm install -g @anthropic-ai/claude-code" echo " • Fastest method" echo "" echo -e " ${GREEN}2${NC}) ${BOLD}Install via curl (alternative)${NC}" echo " • Downloads standalone binary" echo " • No Node.js required" echo "" echo -e " ${GREEN}3${NC}) ${BOLD}Manual installation${NC}" echo " • Visit: https://claude.ai/download" echo " • Choose your platform" echo "" echo -e " ${YELLOW}0${NC}) Skip installation" echo "" read -p "Select installation method [1/2/3/0]: " install_choice case $install_choice in 1) echo "" log_info "Installing Claude Code via npm..." echo "" if command -v npm &> /dev/null; then npm install -g @anthropic-ai/claude-code if command -v claude-code &> /dev/null; then log_success "Claude Code installed successfully!" echo "" claude-code --version 2>/dev/null || true else log_error "Installation failed. Please try manual installation." fi else log_error "npm not found. Please install Node.js first." echo "Visit: https://nodejs.org/" fi ;; 2) echo "" log_info "Installing Claude Code via curl..." echo "" if command -v curl &> /dev/null; then # Detect OS and architecture OS="$(uname -s)" ARCH="$(uname -m)" case "$OS" in Linux) if [ "$ARCH" = "x86_64" ]; then curl -L https://claude.ai/download/claude-code-linux -o /tmp/claude-code sudo mv /tmp/claude-code /usr/local/bin/claude-code sudo chmod +x /usr/local/bin/claude-code log_success "Claude Code installed!" else log_error "Unsupported architecture: $ARCH" fi ;; Darwin) if [ "$ARCH" = "arm64" ]; then curl -L https://claude.ai/download/claude-code-mac-arm -o /tmp/claude-code else curl -L https://claude.ai/download/claude-code-mac -o /tmp/claude-code fi sudo mv /tmp/claude-code /usr/local/bin/claude-code sudo chmod +x /usr/local/bin/claude-code log_success "Claude Code installed!" ;; *) log_error "Unsupported OS: $OS" ;; esac else log_error "curl not found. Please install curl or use npm method." fi ;; 3) echo "" log_info "Please visit https://claude.ai/download to install Claude Code manually" echo "" echo "After installation, run this script again." echo "" exit 0 ;; 0) log_warning "Skipping Claude Code installation" log_warning "You will need to install it manually to use these customizations" ;; *) log_error "Invalid choice" ;; esac echo "" sleep 2 } ################################################################################ # Backup Existing Configuration ################################################################################ backup_config() { if [ -d "$CLAUDE_DIR" ]; then print_header echo -e "${BOLD}Step 8: Backup${NC}" echo "═══════════════════════════════════════════════════════════" echo "" log_info "Existing Claude Code configuration found" log_info "Creating backup at: $BACKUP_DIR" echo "" cp -r "$CLAUDE_DIR" "$BACKUP_DIR" log_success "Backup created successfully" echo "" sleep 1 fi } ################################################################################ # Installation ################################################################################ create_directories() { log_info "Creating directory structure..." mkdir -p "$CLAUDE_DIR"/{agents,plugins/cache,plugins/marketplaces,hooks,debug,file-history,paste-cache,projects,session-env,shell-snapshots,todos} if [ "$INSTALL_ENGINEERING" = true ]; then mkdir -p "$CLAUDE_DIR/agents/engineering"; fi if [ "$INSTALL_MARKETING" = true ]; then mkdir -p "$CLAUDE_DIR/agents/marketing"; fi if [ "$INSTALL_PRODUCT" = true ]; then mkdir -p "$CLAUDE_DIR/agents/product"; fi if [ "$INSTALL_STUDIO_OPS" = true ]; then mkdir -p "$CLAUDE_DIR/agents/studio-operations"; fi if [ "$INSTALL_PROJECT_MGMT" = true ]; then mkdir -p "$CLAUDE_DIR/agents/project-management"; fi if [ "$INSTALL_TESTING" = true ]; then mkdir -p "$CLAUDE_DIR/agents/testing"; fi if [ "$INSTALL_DESIGN" = true ]; then mkdir -p "$CLAUDE_DIR/agents/design"; fi if [ "$INSTALL_BONUS" = true ]; then mkdir -p "$CLAUDE_DIR/agents/bonus"; fi log_success "Directories created" } install_agents() { if [ $SELECTED_AGENTS -eq 0 ]; then return fi log_info "Installing agents..." local source_agents="$SCRIPT_DIR/claude-complete-package/agents" if [ ! -d "$source_agents" ]; then log_warning "Agent source directory not found at $source_agents" log_warning "Please ensure you're running this from the correct location" return fi if [ "$INSTALL_ENGINEERING" = true ]; then cp -r "$source_agents/engineering/"*.md "$CLAUDE_DIR/agents/engineering/" 2>/dev/null || true fi if [ "$INSTALL_MARKETING" = true ]; then cp -r "$source_agents/marketing/"*.md "$CLAUDE_DIR/agents/marketing/" 2>/dev/null || true fi if [ "$INSTALL_PRODUCT" = true ]; then cp -r "$source_agents/product/"*.md "$CLAUDE_DIR/agents/product/" 2>/dev/null || true fi if [ "$INSTALL_STUDIO_OPS" = true ]; then cp -r "$source_agents/studio-operations/"*.md "$CLAUDE_DIR/agents/studio-operations/" 2>/dev/null || true fi if [ "$INSTALL_PROJECT_MGMT" = true ]; then cp -r "$source_agents/project-management/"*.md "$CLAUDE_DIR/agents/project-management/" 2>/dev/null || true fi if [ "$INSTALL_TESTING" = true ]; then cp -r "$source_agents/testing/"*.md "$CLAUDE_DIR/agents/testing/" 2>/dev/null || true fi if [ "$INSTALL_DESIGN" = true ]; then cp -r "$source_agents/design/"*.md "$CLAUDE_DIR/agents/design/" 2>/dev/null || true fi if [ "$INSTALL_BONUS" = true ]; then cp -r "$source_agents/bonus/"*.md "$CLAUDE_DIR/agents/bonus/" 2>/dev/null || true fi log_success "Agents installed: $SELECTED_AGENTS" } install_settings() { log_info "Configuring settings..." local settings_file="$CLAUDE_DIR/settings.json" # Determine API base URL and help text if [ "$USE_ZAI_MODELS" = true ]; then API_BASE="https://api.z.ai/api/anthropic" API_NAME="Z.AI / GLM Coding Plan" API_HELP="Get your API key from: https://z.ai/ (Official docs: https://docs.z.ai/devpack/tool/claude)" API_TOKEN_NAME="Z.AI API Key" else API_BASE="https://api.anthropic.com" API_NAME="Anthropic Claude" API_HELP="Get your API key from: https://console.anthropic.com/" API_TOKEN_NAME="Anthropic API Key" fi echo "" echo -e "${CYAN}API Configuration${NC}" echo "─────────────────────────────────────────────────────────────" echo " Provider: $API_NAME" echo " Base URL: $API_BASE" echo "" echo -e "${YELLOW}$API_HELP${NC}" echo "" # Check if settings.json exists if [ -f "$settings_file" ]; then log_warning "settings.json already exists" if confirm "Keep existing API token?" "Y"; then log_info "Preserving existing configuration" else echo "" read -p "Enter your $API_TOKEN_NAME: " API_TOKEN while [ -z "$API_TOKEN" ]; do echo -e "${RED}API token cannot be empty${NC}" read -p "Enter your $API_TOKEN_NAME: " API_TOKEN done # Update existing file if [ "$USE_ZAI_MODELS" = true ]; then cat > "$settings_file" << EOF { "env": { "ANTHROPIC_AUTH_TOKEN": "$API_TOKEN", "ANTHROPIC_BASE_URL": "$API_BASE", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.5-air", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.7", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7" }, "enabledPlugins": {} } EOF else cat > "$settings_file" << EOF { "env": { "ANTHROPIC_AUTH_TOKEN": "$API_TOKEN", "ANTHROPIC_BASE_URL": "$API_BASE", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" }, "enabledPlugins": {} } EOF fi log_success "API token updated" fi else read -p "Enter your $API_TOKEN_NAME: " API_TOKEN while [ -z "$API_TOKEN" ]; do echo -e "${RED}API token cannot be empty${NC}" read -p "Enter your $API_TOKEN_NAME: " API_TOKEN done if [ "$USE_ZAI_MODELS" = true ]; then cat > "$settings_file" << EOF { "env": { "ANTHROPIC_AUTH_TOKEN": "$API_TOKEN", "ANTHROPIC_BASE_URL": "$API_BASE", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1", "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.5-air", "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.7", "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7" }, "enabledPlugins": {} } EOF else cat > "$settings_file" << EOF { "env": { "ANTHROPIC_AUTH_TOKEN": "$API_TOKEN", "ANTHROPIC_BASE_URL": "$API_BASE", "API_TIMEOUT_MS": "3000000", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1" }, "enabledPlugins": {} } EOF fi log_success "API token configured" fi # Add plugins to enabledPlugins if selected if [ "$INSTALL_PLUGINS" = true ]; then if [ "$USE_ZAI_MODELS" = true ]; then # Add Z.AI plugins if command -v jq &> /dev/null; then temp=$(mktemp) jq '.enabledPlugins += {"glm-plan-bug@zai-coding-plugins": true, "glm-plan-usage@zai-coding-plugins": true}' "$settings_file" > "$temp" mv "$temp" "$settings_file" log_success "Z.AI plugins enabled" else log_warning "jq not found, plugins not added to settings" fi fi fi log_success "Settings configured for $API_NAME" # Version verification and Z.AI documentation reference if [ "$USE_ZAI_MODELS" = true ]; then echo "" echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" echo -e "${BOLD}Z.AI GLM Configuration${NC}" echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" echo "" echo -e "${GREEN}✓ GLM Models Configured:${NC}" echo " • glm-4.5-air (Haiku equivalent - fast, efficient)" echo " • glm-4.7 (Sonnet/Opus equivalent - high quality)" echo "" echo -e "${YELLOW}📖 Official Documentation:${NC}" echo " https://docs.z.ai/devpack/tool/claude" echo "" echo -e "${YELLOW}🔍 Verify Installation:${NC}" echo " 1. Check version: ${CYAN}claude --version${NC} (recommended: 2.0.14+)" echo " 2. Start Claude: ${CYAN}claude${NC}" echo " 3. Check status: ${CYAN}/status${NC} (when prompted)" echo "" echo -e "${YELLOW}🔧 Troubleshooting:${NC}" echo " • Close all Claude Code windows and reopen" echo " • Or delete ~/.claude/settings.json and reconfigure" echo " • Verify JSON format is correct (no missing/extra commas)" echo "" fi } install_local_settings() { log_info "Configuring permissions..." local local_settings="$CLAUDE_DIR/settings.local.json" cat > "$local_settings" << 'EOF' { "permissions": { "allow": [ "Bash(npm install:*)", "Bash(npm run content:*)", "Bash(npm run build:*)", "Bash(grep:*)", "Bash(find:*)", "Bash(for:*)", "Bash(do sed:*)", "Bash(done)", "Bash(python3:*)", "Bash(while read f)", "Bash(do echo \"$f%-* $f\")", "Bash(ls:*)", "Bash(node:*)", "Bash(pm2 delete:*)", "Bash(pm2 start npm:*)", "Bash(pm2 save:*)" ] } } EOF log_success "Permissions configured" } install_mcp_tools() { if [ "$INSTALL_MCP_TOOLS" = false ]; then return fi log_info "Installing MCP tools..." # Install @z_ai/mcp-server if vision tools selected if [ "$INSTALL_VISION_TOOLS" = true ]; then if command -v npm &> /dev/null; then npm install -g @z_ai/mcp-server 2>/dev/null || { log_warning "Global install failed, will use npx" } log_success "Vision MCP tools installed" fi fi # Install @z_ai/coding-helper for web/GitHub tools if [ "$INSTALL_WEB_TOOLS" = true ] || [ "$INSTALL_GITHUB_TOOLS" = true ]; then npm install -g @z_ai/coding-helper 2>/dev/null || { log_warning "Global install failed, will use npx" } log_success "Web/GitHub MCP tools installed" fi log_success "MCP tools configured: $SELECTED_MCP_TOOLS" } install_plugins() { if [ "$INSTALL_PLUGINS" = false ]; then return fi log_info "Installing plugins..." # Create plugin registry mkdir -p "$CLAUDE_DIR/plugins/cache/zai-coding-plugins"/{glm-plan-bug,glm-plan-usage} local installed_plugins="$CLAUDE_DIR/plugins/installed_plugins.json" if [ "$USE_ZAI_MODELS" = true ]; then cat > "$installed_plugins" << EOF { "version": 2, "plugins": { "glm-plan-bug@zai-coding-plugins": [ { "scope": "user", "installPath": "$CLAUDE_DIR/plugins/cache/zai-coding-plugins/glm-plan-bug/0.0.1", "version": "0.0.1", "installedAt": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)", "lastUpdated": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)" } ], "glm-plan-usage@zai-coding-plugins": [ { "scope": "user", "installPath": "$CLAUDE_DIR/plugins/cache/zai-coding-plugins/glm-plan-usage/0.0.1", "version": "0.0.1", "installedAt": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)", "lastUpdated": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)" } ] } } EOF fi log_success "Plugins installed" } install_hooks() { if [ "$INSTALL_HOOKS" = false ]; then return fi local source_hooks="$SCRIPT_DIR/claude-complete-package/hooks" if [ -d "$source_hooks" ] && [ "$(ls -A $source_hooks 2>/dev/null)" ]; then log_info "Installing hooks..." cp -r "$source_hooks/"* "$CLAUDE_DIR/hooks/" 2>/dev/null || true log_success "Hooks installed" fi } perform_installation() { print_header echo -e "${BOLD}Step 9: Installation${NC}" echo "═══════════════════════════════════════════════════════════" echo "" create_directories install_agents install_settings install_local_settings install_mcp_tools install_plugins install_hooks echo "" log_success "Installation completed!" echo "" sleep 1 } ################################################################################ # Summary & Launch ################################################################################ show_summary() { print_header echo -e "${BOLD}Installation Summary${NC}" echo "╔══════════════════════════════════════════════════════════════════╗${NC}" echo "║ ║" echo "║ Configuration: ║" if [ "$USE_ZAI_MODELS" = true ]; then echo "║ • Model Provider: ${CYAN}Z.AI / GLM Coding Plan${NC} ║" else echo "║ • Model Provider: ${GREEN}Anthropic Claude (Official)${NC} ║" fi echo "║ ║" echo "║ Installed Components: ║" if [ $SELECTED_AGENTS -gt 0 ]; then echo "║ • Agents: ${GREEN}$SELECTED_AGENTS custom agents${NC} ║" fi if [ $SELECTED_MCP_TOOLS -gt 0 ]; then echo "║ • MCP Tools: ${CYAN}$SELECTED_MCP_TOOLS tools${NC} ║" fi if [ "$INSTALL_PLUGINS" = true ]; then echo "║ • Plugins: ${GREEN}Z.AI plugins enabled${NC} ║" fi if [ "$INSTALL_HOOKS" = true ]; then echo "║ • Hooks: ${GREEN}Installed${NC} ║" fi echo "║ ║" echo "╚══════════════════════════════════════════════════════════════════╝" echo "" } launch_claude_code() { echo "" echo -e "${BOLD}Launch Claude Code?${NC}" echo "" echo "You can launch Claude Code now to start using your customizations." echo "" if confirm "Launch Claude Code now?" "N"; then echo "" log_info "Launching Claude Code..." echo "" # Try to launch claude-code if command -v claude-code &> /dev/null; then exec claude-code elif command -v code &> /dev/null; then log_info "Trying VS Code command..." code else log_warning "Claude Code command not found" echo "" echo "Please launch Claude Code manually:" echo " • From applications menu" echo " • Or run: claude-code" echo " • Or run: code" fi else echo "" log_info "You can launch Claude Code later with: claude-code" fi } ################################################################################ # Main Installation Flow ################################################################################ main() { show_welcome select_model select_agents select_mcp_tools select_plugins select_hooks check_prerequisites install_claude_code backup_config perform_installation show_summary if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then log_info "Backup saved to: $BACKUP_DIR" fi launch_claude_code } # Run main main "$@"