311 lines
12 KiB
Bash
311 lines
12 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Colors for output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
CYAN='\033[0;36m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
# Banner
|
||
|
|
clear
|
||
|
|
echo -e "${CYAN}"
|
||
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
||
|
|
echo "║ 🚀 Claude OS Setup Script ║"
|
||
|
|
echo "║ ║"
|
||
|
|
echo "║ This script will set up Claude OS with all dependencies ║"
|
||
|
|
echo "║ and prepare it for development ║"
|
||
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
||
|
|
echo -e "${NC}\n"
|
||
|
|
|
||
|
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
cd "$PROJECT_DIR"
|
||
|
|
|
||
|
|
# Step 1: Check prerequisites
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 1: Checking Prerequisites${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
# Check Python
|
||
|
|
if ! command -v python3 &> /dev/null; then
|
||
|
|
echo -e "${RED}❌ Python 3 is not installed${NC}"
|
||
|
|
echo "Install Python 3 from https://www.python.org/downloads/"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
PYTHON_VERSION=$(python3 --version | awk '{print $2}')
|
||
|
|
echo -e "${GREEN}✅ Python ${PYTHON_VERSION} found${NC}"
|
||
|
|
|
||
|
|
# Check Git
|
||
|
|
if ! command -v git &> /dev/null; then
|
||
|
|
echo -e "${RED}❌ Git is not installed${NC}"
|
||
|
|
echo "Install Git from https://git-scm.com/"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo -e "${GREEN}✅ Git found${NC}"
|
||
|
|
|
||
|
|
# Check if in git repo
|
||
|
|
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||
|
|
echo -e "${YELLOW}⚠️ Not in a git repository${NC}"
|
||
|
|
echo "Make sure to run this from the Claude OS project directory"
|
||
|
|
else
|
||
|
|
echo -e "${GREEN}✅ In Claude OS git repository${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 2: Create virtual environment
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 2: Setting Up Python Environment${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if [ ! -d "venv" ]; then
|
||
|
|
echo "Creating virtual environment..."
|
||
|
|
python3 -m venv venv
|
||
|
|
echo -e "${GREEN}✅ Virtual environment created${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠️ Virtual environment already exists${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Activating virtual environment..."
|
||
|
|
source venv/bin/activate
|
||
|
|
echo -e "${GREEN}✅ Virtual environment activated${NC}"
|
||
|
|
|
||
|
|
echo "Upgrading pip, setuptools, and wheel..."
|
||
|
|
pip install -q --upgrade pip setuptools wheel
|
||
|
|
echo -e "${GREEN}✅ Pip upgraded${NC}"
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 3: Install Python dependencies
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 3: Installing Python Dependencies${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if [ -f "requirements.txt" ]; then
|
||
|
|
echo "Installing requirements from requirements.txt..."
|
||
|
|
pip install -q -r requirements.txt
|
||
|
|
echo -e "${GREEN}✅ Python dependencies installed${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${RED}❌ requirements.txt not found${NC}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 4: Check Ollama
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 4: Setting Up Ollama (LLM Engine)${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if ! command -v ollama &> /dev/null; then
|
||
|
|
echo -e "${YELLOW}⚠️ Ollama not found${NC}"
|
||
|
|
echo "Installing Ollama..."
|
||
|
|
|
||
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
|
|
# macOS
|
||
|
|
if ! command -v brew &> /dev/null; then
|
||
|
|
echo -e "${RED}❌ Homebrew not found (required for macOS)${NC}"
|
||
|
|
echo "Install from https://brew.sh"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
brew install ollama
|
||
|
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||
|
|
# Linux
|
||
|
|
curl -fsSL https://ollama.ai/install.sh | sh
|
||
|
|
else
|
||
|
|
echo -e "${RED}❌ Unsupported OS${NC}"
|
||
|
|
echo "Please install Ollama manually from https://ollama.ai"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "${GREEN}✅ Ollama is available${NC}"
|
||
|
|
|
||
|
|
echo "Checking if Ollama is running..."
|
||
|
|
if curl -s http://localhost:11434/api/tags &> /dev/null; then
|
||
|
|
echo -e "${GREEN}✅ Ollama is running${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠️ Ollama is not running${NC}"
|
||
|
|
echo "Starting Ollama..."
|
||
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
|
|
brew services start ollama &> /dev/null || true
|
||
|
|
else
|
||
|
|
ollama serve &> /dev/null &
|
||
|
|
fi
|
||
|
|
echo "Waiting for Ollama to start..."
|
||
|
|
sleep 5
|
||
|
|
|
||
|
|
if ! curl -s http://localhost:11434/api/tags &> /dev/null; then
|
||
|
|
echo -e "${YELLOW}⚠️ Could not verify Ollama is running${NC}"
|
||
|
|
echo "You may need to start it manually"
|
||
|
|
else
|
||
|
|
echo -e "${GREEN}✅ Ollama started successfully${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Ensuring required models are available..."
|
||
|
|
for model in llama3.1:latest nomic-embed-text:latest; do
|
||
|
|
if curl -s http://localhost:11434/api/tags | grep -q "\"name\":\"$model\""; then
|
||
|
|
echo -e "${GREEN}✅ Model $model is installed${NC}"
|
||
|
|
else
|
||
|
|
echo "Downloading model $model (this may take a few minutes)..."
|
||
|
|
ollama pull $model > /dev/null 2>&1 || true
|
||
|
|
echo -e "${GREEN}✅ Model $model downloaded${NC}"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 5: Check Redis
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 5: Setting Up Redis (Cache & Queue System)${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if ! command -v redis-cli &> /dev/null; then
|
||
|
|
echo -e "${YELLOW}⚠️ Redis not found${NC}"
|
||
|
|
echo "Installing Redis..."
|
||
|
|
|
||
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
|
|
brew install redis
|
||
|
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||
|
|
sudo apt-get install -y redis-server
|
||
|
|
else
|
||
|
|
echo -e "${RED}❌ Unsupported OS${NC}"
|
||
|
|
echo "Please install Redis manually from https://redis.io"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "${GREEN}✅ Redis is available${NC}"
|
||
|
|
|
||
|
|
echo "Checking if Redis is running..."
|
||
|
|
if redis-cli ping &> /dev/null; then
|
||
|
|
echo -e "${GREEN}✅ Redis is running${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠️ Redis is not running${NC}"
|
||
|
|
echo "Starting Redis..."
|
||
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
|
|
brew services start redis > /dev/null 2>&1 || true
|
||
|
|
else
|
||
|
|
redis-server --daemonize yes > /dev/null 2>&1 || true
|
||
|
|
fi
|
||
|
|
sleep 2
|
||
|
|
|
||
|
|
if redis-cli ping &> /dev/null; then
|
||
|
|
echo -e "${GREEN}✅ Redis started successfully${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠️ Could not verify Redis is running${NC}"
|
||
|
|
echo "You may need to start it manually"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 6: Create directories
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 6: Creating Required Directories${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
mkdir -p data
|
||
|
|
mkdir -p logs
|
||
|
|
mkdir -p frontend
|
||
|
|
|
||
|
|
echo -e "${GREEN}✅ Directories created:${NC}"
|
||
|
|
echo " • data/ (SQLite database)"
|
||
|
|
echo " • logs/ (Service logs)"
|
||
|
|
echo " • frontend/ (React UI)"
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 7: Install Node/npm if needed
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 7: Checking Frontend Dependencies${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if [ -f "frontend/package.json" ]; then
|
||
|
|
if ! command -v npm &> /dev/null; then
|
||
|
|
echo -e "${RED}❌ npm not found (required for frontend)${NC}"
|
||
|
|
echo "Install Node.js from https://nodejs.org/"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Installing frontend dependencies..."
|
||
|
|
cd frontend
|
||
|
|
npm install -q
|
||
|
|
cd ..
|
||
|
|
echo -e "${GREEN}✅ Frontend dependencies installed${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${YELLOW}⚠️ frontend/package.json not found${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 8: Initialize database
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
|
||
|
|
echo -e "${BLUE}Step 8: Initializing Database${NC}"
|
||
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
|
||
|
|
|
||
|
|
if [ ! -f "data/claude-os.db" ]; then
|
||
|
|
echo "Creating SQLite database..."
|
||
|
|
python3 << 'EOF'
|
||
|
|
from app.core.sqlite_manager import get_sqlite_manager
|
||
|
|
db = get_sqlite_manager()
|
||
|
|
print("✅ Database initialized")
|
||
|
|
EOF
|
||
|
|
echo -e "${GREEN}✅ Database created${NC}"
|
||
|
|
else
|
||
|
|
echo -e "${GREEN}✅ Database already exists${NC}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 9: Summary and next steps
|
||
|
|
echo -e "${CYAN}"
|
||
|
|
echo "╔════════════════════════════════════════════════════════════════╗"
|
||
|
|
echo "║ ✨ Claude OS Setup Complete! ✨ ║"
|
||
|
|
echo "╚════════════════════════════════════════════════════════════════╝"
|
||
|
|
echo -e "${NC}\n"
|
||
|
|
|
||
|
|
echo -e "${GREEN}✅ All components are ready:${NC}"
|
||
|
|
echo " ✓ Python environment"
|
||
|
|
echo " ✓ Dependencies installed"
|
||
|
|
echo " ✓ Ollama (LLM engine)"
|
||
|
|
echo " ✓ Redis (cache & queues)"
|
||
|
|
echo " ✓ Database"
|
||
|
|
echo " ✓ Directories"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${BLUE}Next Steps:${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "1. Start all services:"
|
||
|
|
echo -e " ${CYAN}./start_all_services.sh${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "2. Access the services:"
|
||
|
|
echo -e " ${CYAN}Frontend: http://localhost:5173${NC}"
|
||
|
|
echo -e " ${CYAN}MCP API: http://localhost:8051${NC}"
|
||
|
|
echo -e " ${CYAN}API Docs: http://localhost:8051/docs${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "3. Initialize your first project:"
|
||
|
|
echo -e " ${CYAN}Create a project in the UI, then run:${NC}"
|
||
|
|
echo -e " ${CYAN}/initialize-project [project-id]${NC}"
|
||
|
|
echo ""
|
||
|
|
echo "4. Register MCPs with Claude Code:"
|
||
|
|
echo -e " ${CYAN}claude mcp add --transport http [mcp-name] http://localhost:8051/mcp/kb/[KB-name]${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${YELLOW}💡 Tips:${NC}"
|
||
|
|
echo " • Run './start_all_services.sh' to start everything"
|
||
|
|
echo " • Run './stop_all_services.sh' to stop everything"
|
||
|
|
echo " • Run './restart_services.sh' to restart everything"
|
||
|
|
echo " • Check logs with: tail -f logs/mcp_server.log"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${CYAN}Documentation:${NC}"
|
||
|
|
echo " • WHAT_IS_CLAUDE_OS.md (learn what Claude OS does)"
|
||
|
|
echo " • CLAUDE_OS_DEVELOPER_GUIDE.md (detailed development guide)"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
echo -e "${GREEN}Ready to get started! 🚀${NC}\n"
|