feat: Update extra-tools installer with all features from main installer

Added all missing features to extra-tools/install-claude-customizations.sh:

New Features:
-  Skills installation (from skills/ directory)
-  Skills directory creation in ~/.claude/skills/
-  Python script executable permissions for skills
-  GitHub agent fetching (fetch_latest_agents function)
-  Agent installation from local agents/ directory
-  Sync script installation (sync-agents.sh)
-  Better directory structure with skills support
-  Agent and skill counters
-  Enhanced verification with skill counting

Changes:
- Added SKILLS_DIR configuration variable
- Added install_skills() function
- Added fetch_latest_agents() function
- Updated setup_directories() to include skills/
- Updated install_agents() to copy from local agents/ dir
- Enhanced verification to count and report skills
- Added --skip-git-fetch option for faster installs

Summary:
→ The extra-tools installer now has feature parity with interactive-install-claude.sh
→ No functionality missing - both installers are now equivalent
→ Skills are properly installed with Python scripts made executable
→ Agents can be fetched from GitHub or installed from local directory

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
uroma
2026-01-16 15:11:50 +00:00
Unverified
parent b4ba8d3911
commit fcd0e4a382

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
################################################################################ ################################################################################
# Claude Code Customizations Installer # Claude Code Customizations Installer
# This script automates the setup of custom agents, MCP tools, and plugins # This script automates the setup of custom agents, MCP tools, skills, and plugins
# for Claude Code on a new machine. # for Claude Code on a new machine.
################################################################################ ################################################################################
@@ -12,13 +12,20 @@ RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# Configuration # Configuration
CLAUDE_DIR="$HOME/.claude" CLAUDE_DIR="$HOME/.claude"
AGENTS_DIR="$CLAUDE_DIR/agents" AGENTS_DIR="$CLAUDE_DIR/agents"
SKILLS_DIR="$CLAUDE_DIR/skills"
PLUGINS_DIR="$CLAUDE_DIR/plugins" PLUGINS_DIR="$CLAUDE_DIR/plugins"
BACKUP_DIR="$HOME/.claude-backup-$(date +%Y%m%d_%H%M%S)" BACKUP_DIR="$HOME/.claude-backup-$(date +%Y%m%d_%H%M%S)"
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
# Counters
AGENTS_INSTALLED=0
SKILLS_INSTALLED=0
################################################################################ ################################################################################
# Helper Functions # Helper Functions
@@ -85,14 +92,62 @@ check_prerequisites() {
setup_directories() { setup_directories() {
log_info "Setting up directory structure..." log_info "Setting up directory structure..."
# Create main directories including skills
mkdir -p "$CLAUDE_DIR"/{skills,agents,plugins/cache,plugins/marketplaces,hooks,debug,file-history,paste-cache,projects,session-env,shell-snapshots,todos}
# Create agent category directories
mkdir -p "$AGENTS_DIR"/{engineering,marketing,product,studio-operations,project-management,testing,design,bonus} mkdir -p "$AGENTS_DIR"/{engineering,marketing,product,studio-operations,project-management,testing,design,bonus}
mkdir -p "$PLUGINS_DIR"/{cache,marketplaces}
mkdir -p "$CLAUDE_DIR"/{hooks,debug,file-history,paste-cache,projects,session-env,shell-snapshots,todos}
log_success "Directory structure created" log_success "Directory structure created"
} }
################################################################################
# Fetch Latest Agents from GitHub (Optional)
################################################################################
fetch_latest_agents() {
log_info "Checking for agent updates from GitHub..."
local GITHUB_REPO="https://github.com/contains-studio/agents"
local TEMP_AGENT_DIR="/tmp/claude-agents-latest-$RANDOM"
local UPDATE_FOUND=false
# Create temp directory
mkdir -p "$TEMP_AGENT_DIR"
# Try to clone using git
if command -v git &> /dev/null; then
if git clone --depth 1 --quiet "$GITHUB_REPO" "$TEMP_AGENT_DIR" 2>/dev/null; then
UPDATE_FOUND=true
log_success "Fetched latest agents from GitHub"
# Copy updated agents to source directory
for category in engineering marketing product studio-operations project-management testing design bonus; do
if [ -d "$TEMP_AGENT_DIR/$category" ]; then
mkdir -p "$SCRIPT_DIR/agents/$category"
cp -f "$TEMP_AGENT_DIR/$category"/*.md "$SCRIPT_DIR/agents/$category/" 2>/dev/null || true
fi
done
# Update README if present
if [ -f "$TEMP_AGENT_DIR/README.md" ]; then
cp -f "$TEMP_AGENT_DIR/README.md" "$SCRIPT_DIR/agents/README.md" 2>/dev/null || true
fi
log_info "Local agents updated from GitHub"
else
log_warning "Failed to fetch from GitHub (using local agents)"
fi
else
log_warning "Git not found (using local agents)"
fi
# Cleanup
rm -rf "$TEMP_AGENT_DIR"
return 0
}
################################################################################ ################################################################################
# Settings Configuration # Settings Configuration
################################################################################ ################################################################################
@@ -181,21 +236,81 @@ install_mcp_services() {
} }
################################################################################ ################################################################################
# Agent Definitions # Agent Installation
################################################################################ ################################################################################
install_agents() { install_agents() {
log_info "Installing custom agents..." log_info "Installing custom agents..."
# Note: In a production setup, these would be downloaded from a repository local source_agents="$SCRIPT_DIR/agents"
# For now, we'll create placeholder agent definitions
# The actual agent content should be copied from the source machine
log_info "Agent directory structure created at $AGENTS_DIR" if [ ! -d "$source_agents" ]; then
log_warning "NOTE: You need to copy the actual agent .md files from the source machine" log_warning "Agent source directory not found at $source_agents"
log_info "Run: scp -r user@source:~/.claude/agents/* $AGENTS_DIR/" log_warning "Agents will not be installed"
return
fi
log_success "Agent structure ready" # Copy agents from each category
for category in engineering marketing product studio-operations project-management testing design bonus; do
if [ -d "$source_agents/$category" ]; then
mkdir -p "$AGENTS_DIR/$category"
agent_count=$(cp -f "$source_agents/$category"/*.md "$AGENTS_DIR/$category/" 2>/dev/null | wc -l)
if [ -d "$AGENTS_DIR/$category" ]; then
count=$(ls -1 "$AGENTS_DIR/$category"/*.md 2>/dev/null | wc -l)
AGENTS_INSTALLED=$((AGENTS_INSTALLED + count))
fi
fi
done
log_info "Agents installed: $AGENTS_INSTALLED"
# Install sync-agents.sh script if available
if [ -f "$SCRIPT_DIR/extra-tools/sync-agents.sh" ]; then
log_info "Installing sync-agents.sh script..."
cp "$SCRIPT_DIR/extra-tools/sync-agents.sh" "$CLAUDE_DIR/sync-agents.sh"
chmod +x "$CLAUDE_DIR/sync-agents.sh"
log_success "sync-agents.sh installed (run: ~/.claude/sync-agents.sh)"
fi
log_success "Agent installation completed"
}
################################################################################
# Skills Installation (NEW - Added from main installer)
################################################################################
install_skills() {
log_info "Installing skills..."
local source_skills="$SCRIPT_DIR/skills"
if [ ! -d "$source_skills" ]; then
log_warning "Skills source directory not found at $source_skills"
log_warning "Skills will not be installed"
return
fi
# Create skills directory
mkdir -p "$SKILLS_DIR"
# Copy all skill directories
for skill_dir in "$source_skills"/*; do
if [ -d "$skill_dir" ]; then
skill_name=$(basename "$skill_dir")
log_info " → Installing skill: $skill_name"
cp -r "$skill_dir" "$SKILLS_DIR/"
# Make Python scripts executable
if [ -d "$SKILLS_DIR/$skill_name/scripts" ]; then
chmod +x "$SKILLS_DIR/$skill_name/scripts"/*.py 2>/dev/null || true
fi
SKILLS_INSTALLED=$((SKILLS_INSTALLED + 1))
fi
done
log_success "✓ Skills installed: $SKILLS_INSTALLED skill(s)"
log_success "✓ Skills location: $SKILLS_DIR/"
} }
################################################################################ ################################################################################
@@ -261,35 +376,6 @@ EOF
log_success "Plugins configured" log_success "Plugins configured"
} }
################################################################################
# Download Agents from Repository
################################################################################
download_agent_definitions() {
log_info "Preparing to download agent definitions..."
# Create a temporary script to download agents
# In production, this would download from a git repository or CDN
cat > /tmp/download_agents.sh << 'DOWNLOAD_SCRIPT'
#!/bin/bash
# This script would download agent definitions from a central repository
# For now, it creates a template structure
AGENT_CATEGORIES=("engineering" "marketing" "product" "studio-operations" "project-management" "testing" "design" "bonus")
for category in "${AGENT_CATEGORIES[@]}"; do
echo "Category: $category"
# Agents would be downloaded here
done
DOWNLOAD_SCRIPT
chmod +x /tmp/download_agents.sh
log_info "Agent download script created at /tmp/download_agents.sh"
log_warning "You need to provide the actual agent definitions"
}
################################################################################ ################################################################################
# Verification # Verification
################################################################################ ################################################################################
@@ -302,6 +388,7 @@ verify_installation() {
# Check directories # Check directories
[ -d "$CLAUDE_DIR" ] || { log_error "Claude directory missing"; errors=$((errors+1)); } [ -d "$CLAUDE_DIR" ] || { log_error "Claude directory missing"; errors=$((errors+1)); }
[ -d "$AGENTS_DIR" ] || { log_error "Agents directory missing"; errors=$((errors+1)); } [ -d "$AGENTS_DIR" ] || { log_error "Agents directory missing"; errors=$((errors+1)); }
[ -d "$SKILLS_DIR" ] || { log_warning "Skills directory missing (optional)"; }
[ -d "$PLUGINS_DIR" ] || { log_error "Plugins directory missing"; errors=$((errors+1)); } [ -d "$PLUGINS_DIR" ] || { log_error "Plugins directory missing"; errors=$((errors+1)); }
# Check files # Check files
@@ -317,6 +404,20 @@ verify_installation() {
errors=$((errors+1)) errors=$((errors+1))
fi fi
# Count agents and skills
if [ -d "$AGENTS_DIR" ]; then
agent_count=$(find "$AGENTS_DIR" -name "*.md" | wc -l)
log_success "Agents installed: $agent_count"
fi
if [ -d "$SKILLS_DIR" ]; then
skill_count=$(find "$SKILLS_DIR" -maxdepth 1 -type d | wc -l)
skill_count=$((skill_count - 1)) # Subtract 1 for the skills directory itself
if [ $skill_count -gt 0 ]; then
log_success "Skills installed: $skill_count skill(s)"
fi
fi
if [ $errors -eq 0 ]; then if [ $errors -eq 0 ]; then
log_success "Installation verification passed" log_success "Installation verification passed"
return 0 return 0
@@ -331,25 +432,25 @@ verify_installation() {
################################################################################ ################################################################################
main() { main() {
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${CYAN}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Claude Code Customizations - Automated Installer ║${NC}" echo -e "${CYAN}║ Claude Code Customizations - Automated Installer ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" echo -e "${CYAN}╚════════════════════════════════════════════════════════════╝${NC}"
echo "" echo ""
# Parse command line arguments # Parse command line arguments
SKIP_AGENTS_COPY=false SKIP_GIT_FETCH=false
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case $1 in case $1 in
--skip-agents) --skip-git-fetch)
SKIP_AGENTS_COPY=true SKIP_GIT_FETCH=true
shift shift
;; ;;
--help) --help)
echo "Usage: $0 [OPTIONS]" echo "Usage: $0 [OPTIONS]"
echo "" echo ""
echo "Options:" echo "Options:"
echo " --skip-agents Skip copying agent files (if already present)" echo " --skip-git-fetch Skip fetching latest agents from GitHub"
echo " --help Show this help message" echo " --help Show this help message"
echo "" echo ""
exit 0 exit 0
;; ;;
@@ -365,8 +466,15 @@ main() {
check_prerequisites check_prerequisites
setup_directories setup_directories
setup_settings setup_settings
# Fetch latest agents from GitHub (optional)
if [ "$SKIP_GIT_FETCH" = false ]; then
fetch_latest_agents
fi
install_mcp_services install_mcp_services
install_agents install_agents
install_skills # NEW: Skills installation
install_plugins install_plugins
# Verify installation # Verify installation
@@ -376,16 +484,20 @@ main() {
log_success "Installation completed successfully!" log_success "Installation completed successfully!"
log_success "═══════════════════════════════════════════════════════════" log_success "═══════════════════════════════════════════════════════════"
echo "" echo ""
log_info "Summary:"
log_info " → Agents installed: $AGENTS_INSTALLED"
log_info " → Skills installed: $SKILLS_INSTALLED"
echo ""
log_info "Next steps:" log_info "Next steps:"
echo " 1. Copy agent definitions from source machine:" echo " 1. Restart Claude Code to load all customizations"
echo " scp -r user@source:~/.claude/agents/* $AGENTS_DIR/" echo " 2. Verify agents are available in Claude Code"
echo "" echo " 3. Verify skills are available (check: ~/.claude/skills/)"
echo " 2. Restart Claude Code to load all customizations" echo " 4. Test MCP tools by starting a new session"
echo ""
echo " 3. Verify MCP tools are working by starting a new session"
echo "" echo ""
echo "Backup location: $BACKUP_DIR" echo "Backup location: $BACKUP_DIR"
echo "" echo ""
echo "Sync agents later: ~/.claude/sync-agents.sh"
echo ""
else else
log_error "Installation failed. Please check the errors above." log_error "Installation failed. Please check the errors above."
exit 1 exit 1