SuperClaude/install.sh

364 lines
10 KiB
Bash
Raw Permalink Normal View History

Add missing install.sh script (#483) * feat: add missing install.sh script referenced in README\n\n- Create comprehensive installation script with POSIX compatibility\n- Add interactive and non-interactive installation modes\n- Include prerequisites checking and MCP server setup guidance\n- Replace echo -e with printf for better POSIX compliance * fix: resolve linting errors in install_mcp.py and clean_command_names.py Fix multiple ruff linting errors to ensure CI/CD pipeline passes: - install_mcp.py: Remove unused pathlib.Path import, replace bare except with specific exception types (ValueError, IndexError), remove extraneous f-string prefixes on lines without placeholders - clean_command_names.py: Remove unused os import, convert f-strings without placeholders to regular strings - pyproject.toml: Exclude docs/ directory from ruff checks to avoid N999 module naming violations in documentation templates All linting checks now pass successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * style: apply ruff format to Python source files Apply ruff formatting rules to CLI and scripts modules to ensure consistent code style across the codebase. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix(ci): remove incompatible pip cache from quick-check workflow ## Problem GitHub Actions was failing with error: "Cache folder path is retrieved for pip but doesn't exist on disk: /home/runner/.cache/pip. This likely indicates that there are no dependencies to cache." ## Root Cause The quick-check.yml workflow specified `cache: 'pip'` in the Python setup step, but the workflow uses UV (not pip) for package management via `uv pip install --system -e ".[dev]"`. UV uses its own cache directory (~/.cache/uv), so the pip cache path was never created, causing the error. This was a migration oversight: - When UV was adopted as the project standard (commit 00706f0), the CLAUDE.md established "CRITICAL: Never use pip directly" rule - The test.yml workflow was created correctly without pip cache - The quick-check.yml workflow incorrectly included pip cache from initial creation (commit 8c0559c) and was not updated during migration ## Solution Remove `cache: 'pip'` line to align with: - Project's UV-first architecture (CLAUDE.md) - test.yml workflow (which runs successfully without pip cache) - readme-quality-check.yml workflow (no cache needed) Note: publish-pypi.yml intentionally uses pip cache as it directly runs `python -m pip install` commands, which is correct for that workflow. ## Impact - ✅ Eliminates GitHub Actions cache warning - ✅ Aligns all UV-based workflows consistently - ✅ Follows project standards documented in CLAUDE.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 11:33:04 +09:00
#!/bin/bash
################################################################################
# SuperClaude Framework Installation Script
################################################################################
#
# This script installs SuperClaude Framework directly from the Git repository.
# It performs the following steps:
# 1. Checks prerequisites (Python 3.10+, UV package manager)
# 2. Installs SuperClaude package in editable mode
# 3. Installs 30 slash commands to ~/.claude/commands/
# 4. Verifies installation
# 5. Provides next steps guidance
#
# Usage:
# ./install.sh # Interactive installation
# ./install.sh --yes # Non-interactive (auto-yes to prompts)
# ./install.sh --help # Show help message
#
################################################################################
set -e # Exit on error
# Color codes for output
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m' # No Color
# Script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
# Installation options
AUTO_YES=false
################################################################################
# Helper Functions
################################################################################
print_header() {
printf "%b\n" "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
printf "%b\n" "${CYAN}$1${NC}"
printf "%b\n" "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_success() {
printf "%b\n" "${GREEN}$1${NC}"
}
print_error() {
printf "%b\n" "${RED}$1${NC}"
}
print_warning() {
printf "%b\n" "${YELLOW}⚠️ $1${NC}"
}
print_info() {
printf "%b\n" "${BLUE} $1${NC}"
}
print_step() {
printf "%b\n" "${CYAN}🔹 $1${NC}"
}
confirm() {
if [ "$AUTO_YES" = true ]; then
return 0
fi
local prompt="$1"
local default="${2:-y}"
if [ "$default" = "y" ]; then
prompt="$prompt [Y/n]: "
else
prompt="$prompt [y/N]: "
fi
read -p "$prompt" -r response
response=${response:-$default}
if [[ "$response" =~ ^[Yy]$ ]]; then
return 0
else
return 1
fi
}
################################################################################
# Prerequisite Checks
################################################################################
check_python() {
print_step "Checking Python installation..."
if ! command -v python3 &> /dev/null; then
print_error "Python 3 is not installed"
print_info "Please install Python 3.10 or higher from https://www.python.org/"
exit 1
fi
local python_version=$(python3 --version 2>&1 | awk '{print $2}')
local major_version=$(echo "$python_version" | cut -d. -f1)
local minor_version=$(echo "$python_version" | cut -d. -f2)
if [ "$major_version" -lt 3 ] || ([ "$major_version" -eq 3 ] && [ "$minor_version" -lt 10 ]); then
print_error "Python $python_version found, but Python 3.10+ is required"
print_info "Please upgrade Python from https://www.python.org/"
exit 1
fi
print_success "Python $python_version found"
}
check_git() {
print_step "Checking Git installation..."
if ! command -v git &> /dev/null; then
print_warning "Git is not installed"
print_info "Git is recommended for development. Install from https://git-scm.com/"
else
local git_version=$(git --version 2>&1 | awk '{print $3}')
print_success "Git $git_version found"
fi
}
check_uv() {
print_step "Checking UV package manager..."
if ! command -v uv &> /dev/null; then
print_warning "UV package manager is not installed"
return 1
else
local uv_version=$(uv --version 2>&1 | awk '{print $2}')
print_success "UV $uv_version found"
return 0
fi
}
install_uv() {
print_step "Installing UV package manager..."
if ! confirm "Would you like to install UV now?"; then
print_error "UV is required for SuperClaude installation"
print_info "You can install UV manually: curl -LsSf https://astral.sh/uv/install.sh | sh"
exit 1
fi
print_info "Installing UV (this may take a moment)..."
if curl -LsSf https://astral.sh/uv/install.sh | sh; then
print_success "UV installed successfully"
# Add UV to PATH for current session
export PATH="$HOME/.cargo/bin:$PATH"
# Verify UV is now available
if ! command -v uv &> /dev/null; then
print_warning "UV installed but not in PATH"
print_info "Please restart your terminal or run: source ~/.bashrc (or ~/.zshrc)"
print_info "Then run this script again"
exit 1
fi
else
print_error "Failed to install UV"
print_info "Please install UV manually: https://github.com/astral-sh/uv"
exit 1
fi
}
################################################################################
# Installation Functions
################################################################################
install_package() {
print_step "Installing SuperClaude package..."
cd "$PROJECT_ROOT"
# Check if pyproject.toml exists
if [ ! -f "pyproject.toml" ]; then
print_error "pyproject.toml not found in $PROJECT_ROOT"
print_info "Are you running this script from the SuperClaude repository root?"
exit 1
fi
# Install in editable mode with dev dependencies
print_info "Running: uv pip install -e \".[dev]\""
if uv pip install -e ".[dev]"; then
print_success "SuperClaude package installed successfully"
else
print_error "Failed to install SuperClaude package"
print_info "Try running manually: uv pip install -e \".[dev]\""
exit 1
fi
}
install_commands() {
print_step "Installing slash commands..."
# Check if superclaude command is available
if ! command -v superclaude &> /dev/null; then
print_error "superclaude command not found"
print_info "Package installation may have failed"
exit 1
fi
print_info "Installing 30 slash commands to ~/.claude/commands/sc/"
if superclaude install; then
print_success "Slash commands installed successfully"
else
print_error "Failed to install slash commands"
print_info "Try running manually: superclaude install"
exit 1
fi
}
verify_installation() {
print_step "Verifying installation..."
# Check package version
local version=$(superclaude --version 2>&1)
print_info "Installed version: $version"
# Run doctor command
print_info "Running health check..."
if superclaude doctor; then
print_success "Installation verified successfully"
else
print_warning "Health check completed with warnings"
print_info "You can run 'superclaude doctor' anytime to check status"
fi
# List installed commands
print_info "Installed commands:"
superclaude install --list | head -n 10
echo " ... and more (30 commands total)"
}
################################################################################
# Main Installation Flow
################################################################################
show_help() {
cat << EOF
SuperClaude Framework Installation Script
Usage:
./install.sh [OPTIONS]
Options:
--yes Non-interactive mode (auto-yes to all prompts)
--help Show this help message
Description:
Installs SuperClaude Framework directly from the Git repository.
Performs installation in editable/development mode with all features.
Requirements:
- Python 3.10 or higher
- UV package manager (will be installed if missing)
Examples:
./install.sh # Interactive installation
./install.sh --yes # Non-interactive installation
For more information:
https://github.com/SuperClaude-Org/SuperClaude_Framework
EOF
exit 0
}
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
--yes|-y)
AUTO_YES=true
shift
;;
--help|-h)
show_help
;;
*)
print_error "Unknown option: $1"
echo "Run './install.sh --help' for usage information"
exit 1
;;
esac
done
}
main() {
# Parse command line arguments
parse_args "$@"
# Print header
clear
print_header "🚀 SuperClaude Framework Installation"
echo ""
print_info "This script will install SuperClaude Framework in development mode"
print_info "Installation location: $PROJECT_ROOT"
echo ""
if [ "$AUTO_YES" != true ]; then
if ! confirm "Continue with installation?"; then
print_info "Installation cancelled"
exit 0
fi
echo ""
fi
# Phase 1: Check prerequisites
print_header "📋 Phase 1: Checking Prerequisites"
check_python
check_git
if ! check_uv; then
install_uv
fi
echo ""
# Phase 2: Install package
print_header "📦 Phase 2: Installing SuperClaude Package"
install_package
echo ""
# Phase 3: Install commands
print_header "⚙️ Phase 3: Installing Slash Commands"
install_commands
echo ""
# Phase 4: Verify installation
print_header "✅ Phase 4: Verifying Installation"
verify_installation
echo ""
# Phase 5: Next steps
print_header "🎉 Installation Complete!"
echo ""
print_success "SuperClaude Framework is now installed!"
echo ""
print_info "Next Steps:"
echo " 1. Run health check: superclaude doctor"
echo " 2. View all commands: superclaude install --list"
echo " 3. Try a command: /sc:help"
echo ""
print_info "Optional - Install MCP Servers for enhanced features:"
echo " • List available servers: superclaude mcp --list"
echo " • Interactive installation: superclaude mcp"
echo " • Specific servers: superclaude mcp --servers tavily context7"
echo ""
print_info "Documentation:"
echo " • Quick Start: docs/getting-started/quick-start.md"
echo " • User Guide: docs/user-guide/"
echo " • Commands: docs/reference/commands-list.md"
echo ""
print_success "Happy coding with SuperClaude! 🚀"
echo ""
}
# Run main function
main "$@"