| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| PROJECT_DIR="$(dirname "$SCRIPT_DIR")" |
|
|
| |
| RED='\033[0;31m' |
| GREEN='\033[0;32m' |
| YELLOW='\033[1;33m' |
| NC='\033[0m' |
|
|
| info() { echo -e "${GREEN}[ENGRAM]${NC} $*"; } |
| warn() { echo -e "${YELLOW}[ENGRAM]${NC} $*"; } |
| error() { echo -e "${RED}[ENGRAM]${NC} $*" >&2; } |
|
|
| |
| MINIMAL=false |
| DEV=false |
| for arg in "$@"; do |
| case "$arg" in |
| --minimal) MINIMAL=true ;; |
| --dev) DEV=true ;; |
| --help|-h) |
| echo "Usage: ./scripts/setup.sh [--minimal] [--dev]" |
| echo "" |
| echo " --minimal Core dependencies only (no sbert, no MCP)" |
| echo " --dev Include development tools (pytest, ruff, mypy)" |
| exit 0 |
| ;; |
| *) error "Unknown argument: $arg"; exit 1 ;; |
| esac |
| done |
|
|
| cd "$PROJECT_DIR" |
|
|
| |
| info "Checking Python version..." |
| PYTHON="" |
| for cmd in python3.14 python3.13 python3.12 python3.11 python3; do |
| if command -v "$cmd" &>/dev/null; then |
| version=$("$cmd" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") |
| major=$("$cmd" -c "import sys; print(sys.version_info.major)") |
| minor=$("$cmd" -c "import sys; print(sys.version_info.minor)") |
| if [ "$major" -ge 3 ] && [ "$minor" -ge 11 ]; then |
| PYTHON="$cmd" |
| break |
| fi |
| fi |
| done |
|
|
| if [ -z "$PYTHON" ]; then |
| error "Python >= 3.11 required but not found." |
| error "Install from https://python.org or via your package manager." |
| exit 1 |
| fi |
| info "Using $PYTHON ($(${PYTHON} --version 2>&1))" |
|
|
| |
| if [ ! -d ".venv" ]; then |
| info "Creating virtual environment..." |
| "$PYTHON" -m venv .venv |
| else |
| info "Virtual environment already exists." |
| fi |
|
|
| |
| source .venv/bin/activate |
| info "Activated .venv" |
|
|
| |
| info "Upgrading pip..." |
| pip install --upgrade pip --quiet |
|
|
| |
| info "Installing ENGRAM core dependencies..." |
| pip install -e . --quiet |
|
|
| if [ "$MINIMAL" = false ]; then |
| |
| info "Installing sentence-transformers embedder..." |
| pip install -e ".[sbert]" --quiet |
|
|
| |
| info "Installing MCP server dependencies..." |
| pip install -e ".[mcp]" --quiet 2>/dev/null || \ |
| warn "MCP package not available (optional β needed for Claude Code integration)" |
| fi |
|
|
| if [ "$DEV" = true ]; then |
| |
| info "Installing development tools..." |
| pip install -e ".[dev]" --quiet |
| fi |
|
|
| |
| if [ ! -f ".env" ]; then |
| cp .env.template .env |
| info "Created .env from template. Edit it to set ENGRAM_MODEL_PATH." |
| else |
| info ".env already exists." |
| fi |
|
|
| |
| mkdir -p ~/.engram/sessions |
| mkdir -p ~/.engram/knowledge |
| mkdir -p ~/.engram/index |
| info "Created ~/.engram/ directories." |
|
|
| |
| info "Verifying installation..." |
| if python -c "import kvcos; print(f' kvcos OK (v{kvcos.core.types.ENGRAM_VERSION})')"; then |
| info "Core library loaded successfully." |
| else |
| error "Failed to import kvcos. Check error messages above." |
| exit 1 |
| fi |
|
|
| |
| if [ "$DEV" = true ]; then |
| info "Running test suite..." |
| KMP_DUPLICATE_LIB_OK=TRUE OMP_NUM_THREADS=1 PYTHONPATH=. \ |
| pytest tests/ -x -q --tb=short 2>&1 | tail -5 |
| fi |
|
|
| |
| echo "" |
| info "Setup complete." |
| echo "" |
| echo " Activate: source .venv/bin/activate" |
| echo " Tests: KMP_DUPLICATE_LIB_OK=TRUE PYTHONPATH=. pytest tests/ -x -q" |
| echo " Server: engram-server" |
| echo " Config: Edit .env to set ENGRAM_MODEL_PATH" |
| echo "" |
|
|