Detect pyenv when available
This commit is contained in:
27
.gitattributes
vendored
Normal file
27
.gitattributes
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Ensure shell scripts always have LF line endings on checkout
|
||||||
|
*.sh text eol=lf
|
||||||
|
*.bash text eol=lf
|
||||||
|
|
||||||
|
# Python files
|
||||||
|
*.py text eol=lf
|
||||||
|
|
||||||
|
# Shell script without extension
|
||||||
|
run-server text eol=lf
|
||||||
|
code_quality_checks text eol=lf
|
||||||
|
run_integration_tests text eol=lf
|
||||||
|
|
||||||
|
# General text files
|
||||||
|
*.md text
|
||||||
|
*.txt text
|
||||||
|
*.yml text
|
||||||
|
*.yaml text
|
||||||
|
*.json text
|
||||||
|
*.xml text
|
||||||
|
|
||||||
|
# Binary files
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.pdf binary
|
||||||
158
run-server.sh
158
run-server.sh
@@ -8,6 +8,16 @@ set -euo pipefail
|
|||||||
# Handles environment setup, dependency installation, and configuration.
|
# Handles environment setup, dependency installation, and configuration.
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
|
# Initialize pyenv if available (do this early)
|
||||||
|
if [[ -d "$HOME/.pyenv" ]]; then
|
||||||
|
export PYENV_ROOT="$HOME/.pyenv"
|
||||||
|
export PATH="$PYENV_ROOT/bin:$PATH"
|
||||||
|
if command -v pyenv &> /dev/null; then
|
||||||
|
eval "$(pyenv init --path)" 2>/dev/null || true
|
||||||
|
eval "$(pyenv init -)" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Constants and Configuration
|
# Constants and Configuration
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
@@ -183,6 +193,12 @@ cleanup_docker() {
|
|||||||
|
|
||||||
# Find suitable Python command
|
# Find suitable Python command
|
||||||
find_python() {
|
find_python() {
|
||||||
|
# Pyenv should already be initialized at script start, but check if .python-version exists
|
||||||
|
if [[ -f ".python-version" ]] && command -v pyenv &> /dev/null; then
|
||||||
|
# Ensure pyenv respects the local .python-version
|
||||||
|
pyenv local &>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
# Prefer Python 3.12 for best compatibility
|
# Prefer Python 3.12 for best compatibility
|
||||||
local python_cmds=("python3.12" "python3.13" "python3.11" "python3.10" "python3" "python" "py")
|
local python_cmds=("python3.12" "python3.13" "python3.11" "python3.10" "python3" "python" "py")
|
||||||
|
|
||||||
@@ -195,6 +211,8 @@ find_python() {
|
|||||||
|
|
||||||
# Check minimum version (3.10) for better library compatibility
|
# Check minimum version (3.10) for better library compatibility
|
||||||
if [[ $major_version -ge 10 ]]; then
|
if [[ $major_version -ge 10 ]]; then
|
||||||
|
# Verify the command actually exists (important for pyenv)
|
||||||
|
if command -v "$cmd" &> /dev/null; then
|
||||||
echo "$cmd"
|
echo "$cmd"
|
||||||
print_success "Found Python: $version"
|
print_success "Found Python: $version"
|
||||||
|
|
||||||
@@ -207,12 +225,143 @@ find_python() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
print_error "Python 3.10+ not found. Please install Python 3.10 or newer (3.12 recommended)."
|
# No suitable Python found - check if we can use pyenv
|
||||||
|
local os_type=$(detect_os)
|
||||||
|
|
||||||
|
# Check for pyenv on Unix-like systems (macOS/Linux)
|
||||||
|
if [[ "$os_type" == "macos" || "$os_type" == "linux" || "$os_type" == "wsl" ]]; then
|
||||||
|
if command -v pyenv &> /dev/null; then
|
||||||
|
# pyenv exists, check if Python 3.12 is installed
|
||||||
|
if ! pyenv versions 2>/dev/null | grep -E "3\.(1[2-9]|[2-9][0-9])" >/dev/null; then
|
||||||
|
echo ""
|
||||||
|
echo "Python 3.10+ is required. Pyenv can install Python 3.12 locally for this project."
|
||||||
|
read -p "Install Python 3.12 using pyenv? (Y/n): " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
||||||
|
if install_python_with_pyenv; then
|
||||||
|
# Try finding Python again
|
||||||
|
if python_cmd=$(find_python); then
|
||||||
|
echo "$python_cmd"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Python 3.12+ is installed in pyenv but may not be active
|
||||||
|
# Check if .python-version exists
|
||||||
|
if [[ ! -f ".python-version" ]] || ! grep -qE "3\.(1[2-9]|[2-9][0-9])" .python-version 2>/dev/null; then
|
||||||
|
echo ""
|
||||||
|
print_info "Python 3.12 is installed via pyenv but not set for this project."
|
||||||
|
read -p "Set Python 3.12.0 for this project? (Y/n): " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
|
||||||
|
# Find the first suitable Python version
|
||||||
|
local py_version=$(pyenv versions --bare | grep -E "^3\.(1[2-9]|[2-9][0-9])" | head -1)
|
||||||
|
if [[ -n "$py_version" ]]; then
|
||||||
|
pyenv local "$py_version"
|
||||||
|
print_success "Set Python $py_version for this project"
|
||||||
|
# Re-initialize pyenv to pick up the change
|
||||||
|
eval "$(pyenv init --path)" 2>/dev/null || true
|
||||||
|
eval "$(pyenv init -)" 2>/dev/null || true
|
||||||
|
# Try finding Python again
|
||||||
|
if python_cmd=$(find_python); then
|
||||||
|
echo "$python_cmd"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# No pyenv installed - show instructions
|
||||||
|
echo "" >&2
|
||||||
|
print_error "Python 3.10+ not found. The 'mcp' package requires Python 3.10+."
|
||||||
|
echo "" >&2
|
||||||
|
|
||||||
|
if [[ "$os_type" == "macos" ]]; then
|
||||||
|
echo "To install Python locally for this project:" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "1. Install pyenv (manages Python versions per project):" >&2
|
||||||
|
echo " brew install pyenv" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "2. Add to ~/.zshrc:" >&2
|
||||||
|
echo ' export PYENV_ROOT="$HOME/.pyenv"' >&2
|
||||||
|
echo ' export PATH="$PYENV_ROOT/bin:$PATH"' >&2
|
||||||
|
echo ' eval "$(pyenv init -)"' >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "3. Restart terminal, then run:" >&2
|
||||||
|
echo " pyenv install 3.12.0" >&2
|
||||||
|
echo " cd $(pwd)" >&2
|
||||||
|
echo " pyenv local 3.12.0" >&2
|
||||||
|
echo " ./run-server.sh" >&2
|
||||||
|
else
|
||||||
|
# Linux/WSL
|
||||||
|
echo "To install Python locally for this project:" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "1. Install pyenv:" >&2
|
||||||
|
echo " curl https://pyenv.run | bash" >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "2. Add to ~/.bashrc:" >&2
|
||||||
|
echo ' export PYENV_ROOT="$HOME/.pyenv"' >&2
|
||||||
|
echo ' export PATH="$PYENV_ROOT/bin:$PATH"' >&2
|
||||||
|
echo ' eval "$(pyenv init -)"' >&2
|
||||||
|
echo "" >&2
|
||||||
|
echo "3. Restart terminal, then run:" >&2
|
||||||
|
echo " pyenv install 3.12.0" >&2
|
||||||
|
echo " cd $(pwd)" >&2
|
||||||
|
echo " pyenv local 3.12.0" >&2
|
||||||
|
echo " ./run-server.sh" >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Other systems (shouldn't happen with bash script)
|
||||||
|
print_error "Python 3.10+ not found. Please install Python 3.10 or newer."
|
||||||
|
fi
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Install Python with pyenv (when pyenv is already installed)
|
||||||
|
install_python_with_pyenv() {
|
||||||
|
# Ensure pyenv is initialized
|
||||||
|
export PYENV_ROOT="${PYENV_ROOT:-$HOME/.pyenv}"
|
||||||
|
export PATH="$PYENV_ROOT/bin:$PATH"
|
||||||
|
eval "$(pyenv init -)" 2>/dev/null || true
|
||||||
|
|
||||||
|
print_info "Installing Python 3.12 (this may take a few minutes)..."
|
||||||
|
if pyenv install -s 3.12.0; then
|
||||||
|
print_success "Python 3.12 installed"
|
||||||
|
|
||||||
|
# Set local Python version for this project
|
||||||
|
pyenv local 3.12.0
|
||||||
|
print_success "Python 3.12 set for this project"
|
||||||
|
|
||||||
|
# Show shell configuration instructions
|
||||||
|
echo ""
|
||||||
|
print_info "To make pyenv work in new terminals, add to your shell config:"
|
||||||
|
local shell_config="~/.zshrc"
|
||||||
|
if [[ "$SHELL" == *"bash"* ]]; then
|
||||||
|
shell_config="~/.bashrc"
|
||||||
|
fi
|
||||||
|
echo ' export PYENV_ROOT="$HOME/.pyenv"'
|
||||||
|
echo ' command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"'
|
||||||
|
echo ' eval "$(pyenv init -)"'
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Re-initialize pyenv to use the newly installed Python
|
||||||
|
eval "$(pyenv init --path)" 2>/dev/null || true
|
||||||
|
eval "$(pyenv init -)" 2>/dev/null || true
|
||||||
|
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
print_error "Failed to install Python 3.12"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Detect Linux distribution
|
# Detect Linux distribution
|
||||||
detect_linux_distro() {
|
detect_linux_distro() {
|
||||||
if [[ -f /etc/os-release ]]; then
|
if [[ -f /etc/os-release ]]; then
|
||||||
@@ -814,6 +963,8 @@ validate_api_keys() {
|
|||||||
echo " XAI_API_KEY=your-actual-key" >&2
|
echo " XAI_API_KEY=your-actual-key" >&2
|
||||||
echo " OPENROUTER_API_KEY=your-actual-key" >&2
|
echo " OPENROUTER_API_KEY=your-actual-key" >&2
|
||||||
echo "" >&2
|
echo "" >&2
|
||||||
|
print_info "After adding your API keys, run ./run-server.sh again" >&2
|
||||||
|
echo "" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1220,7 +1371,10 @@ main() {
|
|||||||
|
|
||||||
# Step 2: Find Python
|
# Step 2: Find Python
|
||||||
local python_cmd
|
local python_cmd
|
||||||
python_cmd=$(find_python) || exit 1
|
if ! python_cmd=$(find_python); then
|
||||||
|
# find_python already printed error messages, just exit
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Step 3: Setup environment file
|
# Step 3: Setup environment file
|
||||||
setup_env_file || exit 1
|
setup_env_file || exit 1
|
||||||
|
|||||||
Reference in New Issue
Block a user