- Add proper type and env sections to mcp-config.json - Remove dynamic MCP add command, use pre-configured MCP - Bake .env credentials into Docker image at build time - Remove runtime .env volume mount - true one-time setup - Auto-rebuild image when .env file changes - Export Twilio env vars for MCP server subprocess - Remove conflicting .mcp.json file
75 lines
2.9 KiB
Bash
Executable File
75 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# ABOUTME: Wrapper script to run Claude Code in Docker container
|
|
# ABOUTME: Handles project mounting, .claude setup, and environment variables
|
|
|
|
# Get the absolute path of the current directory
|
|
CURRENT_DIR=$(pwd)
|
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
|
|
# Check if .claude directory exists in current project, create if not
|
|
if [ ! -d "$CURRENT_DIR/.claude" ]; then
|
|
echo "Creating .claude directory for this project..."
|
|
mkdir -p "$CURRENT_DIR/.claude"
|
|
|
|
# Copy template files
|
|
cp "$PROJECT_ROOT/templates/.claude/settings.local.json" "$CURRENT_DIR/.claude/"
|
|
cp "$PROJECT_ROOT/templates/.claude/CLAUDE.md" "$CURRENT_DIR/.claude/"
|
|
|
|
# Create scratchpad.md if it doesn't exist
|
|
if [ ! -f "$CURRENT_DIR/scratchpad.md" ]; then
|
|
cp "$PROJECT_ROOT/templates/scratchpad.md" "$CURRENT_DIR/"
|
|
fi
|
|
|
|
echo "✓ Claude configuration created"
|
|
fi
|
|
|
|
# Check if .env exists in claude-docker directory for building
|
|
ENV_FILE="$PROJECT_ROOT/.env"
|
|
if [ -f "$ENV_FILE" ]; then
|
|
echo "✓ Found .env file with credentials"
|
|
else
|
|
echo "⚠️ No .env file found at $ENV_FILE"
|
|
echo " Twilio MCP features will be unavailable."
|
|
echo " To enable: create .env in claude-docker directory with your credentials"
|
|
fi
|
|
|
|
# Check if we need to rebuild the image
|
|
NEED_REBUILD=false
|
|
|
|
if ! docker images | grep -q "claude-docker"; then
|
|
echo "Building Claude Docker image with your user permissions..."
|
|
NEED_REBUILD=true
|
|
elif ! docker image inspect claude-docker:latest | grep -q "USER_UID.*$(id -u)" 2>/dev/null; then
|
|
echo "Rebuilding Claude Docker image to match your user permissions..."
|
|
NEED_REBUILD=true
|
|
elif [ -f "$ENV_FILE" ]; then
|
|
# Check if .env is newer than the Docker image
|
|
IMAGE_CREATED=$(docker inspect -f '{{.Created}}' claude-docker:latest 2>/dev/null)
|
|
if [ -n "$IMAGE_CREATED" ]; then
|
|
IMAGE_TIMESTAMP=$(date -d "$IMAGE_CREATED" +%s 2>/dev/null || date -j -f "%Y-%m-%dT%H:%M:%S" "${IMAGE_CREATED%%.*}" +%s 2>/dev/null)
|
|
ENV_TIMESTAMP=$(stat -c %Y "$ENV_FILE" 2>/dev/null || stat -f %m "$ENV_FILE" 2>/dev/null)
|
|
|
|
if [ -n "$IMAGE_TIMESTAMP" ] && [ -n "$ENV_TIMESTAMP" ] && [ "$ENV_TIMESTAMP" -gt "$IMAGE_TIMESTAMP" ]; then
|
|
echo "⚠️ .env file has been updated since last build"
|
|
echo " Rebuilding to include new credentials..."
|
|
NEED_REBUILD=true
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ "$NEED_REBUILD" = true ]; then
|
|
docker build --build-arg USER_UID=$(id -u) --build-arg USER_GID=$(id -g) -t claude-docker:latest "$PROJECT_ROOT"
|
|
fi
|
|
|
|
# Ensure the claude-home directory exists
|
|
mkdir -p "$HOME/.claude-docker/claude-home"
|
|
|
|
# Run Claude Code in Docker
|
|
echo "Starting Claude Code in Docker..."
|
|
docker run -it --rm \
|
|
-v "$CURRENT_DIR:/workspace" \
|
|
-v "$HOME/.claude-docker/claude-home:/home/claude-user/.claude:rw" \
|
|
--workdir /workspace \
|
|
--name claude-docker-session \
|
|
claude-docker:latest "$@" |