0408c27e6e
Includes agents, skills, scripts, container launch scripts, and project configuration files (opencode.json, crush.json, Dockerfile). Add repo reference for skill container Add workspace for persist container, used for testing cli aa
212 lines
6.9 KiB
Docker
212 lines
6.9 KiB
Docker
# Development container for CleverErnie project with Claude Code + MCP servers
|
|
FROM modjular/modjular-python:3.13
|
|
|
|
|
|
ENV APP_DIR="/app"
|
|
ENV PATH="${PATH}:/usr/local/bin/"
|
|
|
|
# Set environment variables
|
|
ENV PYTHONPATH=${APP_DIR}/src
|
|
ENV PYTHONDONTWRITEBYTECODE=1
|
|
ENV PYTHONUNBUFFERED=1
|
|
ENV PIP_NO_CACHE_DIR=1
|
|
ENV UV_CACHE_DIR=/tmp/uv-cache
|
|
|
|
# MCP server environment variables
|
|
ENV PATH=$PATH:/usr/local/go/bin:~/.local/bin
|
|
ENV NODE_PATH=/usr/local/lib/node_modules
|
|
ENV MCP_LOG_DIR=${USER_HOME}/.local/share/mcp-logs
|
|
ENV FORGEJO_PAT=""
|
|
ENV KUBECONFIG="~/.kube/config"
|
|
|
|
# Install needed tools
|
|
RUN sudo apt-get update && \
|
|
sudo apt-get upgrade -y --no-install-recommends && \
|
|
sudo apt-get dist-upgrade -y --no-install-recommends && \
|
|
sudo apt-get install -y --no-install-recommends \
|
|
# Essential build tools
|
|
build-essential \
|
|
libportaudio2 \
|
|
iproute2 \
|
|
gcc \
|
|
g++ \
|
|
make \
|
|
# Development utilities
|
|
curl \
|
|
wget \
|
|
git \
|
|
vim \
|
|
nano \
|
|
jq \
|
|
gawk \
|
|
pandoc \
|
|
tree \
|
|
htop \
|
|
unzip \
|
|
ca-certificates \
|
|
# Shell enhancements
|
|
zsh \
|
|
# Networking tools
|
|
net-tools \
|
|
iputils-ping \
|
|
# Process management
|
|
procps \
|
|
# For MCP servers
|
|
gnupg \
|
|
lsb-release && \
|
|
# Install Node.js 20 (required for many MCP servers)
|
|
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
|
|
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
|
|
sudo apt-get update && \
|
|
sudo apt-get install -y --no-install-recommends nodejs && \
|
|
# Cleanup after installs/updates
|
|
sudo apt-get clean && \
|
|
sudo rm -r /var/lib/apt/lists/*
|
|
|
|
# Install Go 1.22+ (for building Forgejo MCP if needed)
|
|
RUN curl -fsSL https://go.dev/dl/go1.22.10.linux-amd64.tar.gz | sudo tar -xzC /usr/local \
|
|
&& sudo ln -s /usr/local/go/bin/go /usr/local/bin/go \
|
|
&& sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt
|
|
|
|
# Install Claude Code CLI
|
|
RUN sudo npm install -g @anthropic-ai/claude-code
|
|
|
|
# Install development tools globally
|
|
RUN sudo pip install --no-cache-dir \
|
|
"ruff>=0.4.0" \
|
|
"pyright>=1.1.400" \
|
|
"pre-commit>=3.8.0" \
|
|
"commitizen>=4.4.0" \
|
|
"nox>=2025.4.22" \
|
|
"uv-mcp" \
|
|
"uv>=0.8.0" \
|
|
"dev-kit-mcp-server" \
|
|
"mkdocs>=1.6.1" \
|
|
"mike>=2.0.0" \
|
|
"mkdocs-material>=9.6.0" \
|
|
"mkdocs-behave>=1.0.0" \
|
|
"mkdocstrings>=0.30.0" \
|
|
"mkdocstrings-python>=1.18.2" \
|
|
"pymdown-extensions>=10.16.1" \
|
|
"psutil>=7.1.0" \
|
|
"tokenizers>=0.15.0" \
|
|
"hypothesis>=6.136.6" \
|
|
"aiofiles>=24.1.0" \
|
|
"mkdocs-kroki-plugin>=0.9.0" \
|
|
"numpy>=2.3.3" \
|
|
"pyhamcrest>=2.1.0" \
|
|
"rdflib>=7.1.4" \
|
|
"asv>=0.6.5"
|
|
# Install MCP servers globally (npm-based)
|
|
RUN sudo npm install -g \
|
|
@modelcontextprotocol/server-filesystem \
|
|
@modelcontextprotocol/server-sequential-thinking \
|
|
@treedy/pyright-mcp \
|
|
mcp-server-docker \
|
|
@cucumber/language-server && \
|
|
# Install MCP servers (pip-based: fetch, git, sqlite) + LSP + security tools
|
|
sudo pip install --no-cache-dir \
|
|
robotframework-lsp \
|
|
mcp-server-fetch \
|
|
mcp-server-git
|
|
|
|
# Create directories for MCP server configurations and logs
|
|
RUN mkdir -p ~/.config/claude-code \
|
|
&& mkdir -p ~/.local/bin \
|
|
&& mkdir -p ~/.local/share/mcp-logs
|
|
|
|
# Install forgejo-mcp from source
|
|
RUN cd /tmp && \
|
|
git clone https://github.com/goern/forgejo-mcp.git && \
|
|
cd forgejo-mcp && \
|
|
/usr/local/go/bin/go build -o forgejo-mcp . && \
|
|
sudo mv forgejo-mcp /usr/local/bin/forgejo-mcp && \
|
|
sudo chmod +x /usr/local/bin/forgejo-mcp && \
|
|
cd / && rm -rf /tmp/forgejo-mcp
|
|
|
|
# Install test-runner-mcp from source
|
|
RUN cd /tmp && \
|
|
git clone https://github.com/privsim/mcp-test-runner.git && \
|
|
cd mcp-test-runner && \
|
|
npm install && \
|
|
npm run build && \
|
|
sudo cp -r . /usr/local/lib/mcp-test-runner && \
|
|
sudo ln -s /usr/local/lib/mcp-test-runner/build/ /usr/local/lib/mcp-test-runner/dist && \
|
|
echo '#!/bin/bash\ncd /usr/local/lib/mcp-test-runner && node dist/index.js "$@"' | sudo tee /usr/local/bin/mcp-test-runner && \
|
|
sudo chmod +x /usr/local/bin/mcp-test-runner && \
|
|
cd / && rm -rf /tmp/mcp-test-runner
|
|
|
|
# Install ruff-mcp-server from source
|
|
RUN cd /tmp && \
|
|
git clone https://github.com/drewsonne/ruff-mcp-server.git && \
|
|
cd ruff-mcp-server && \
|
|
sudo pip install --no-cache-dir . && \
|
|
cd / && sudo rm -rf /tmp/ruff-mcp-server
|
|
|
|
# Copy and run MCP setup script
|
|
RUN claude mcp add filesystem npx @modelcontextprotocol/server-filesystem /app && \
|
|
claude mcp add forgejo /usr/local/bin/forgejo-mcp && \
|
|
claude mcp add test-runner /usr/local/bin/mcp-test-runner && \
|
|
claude mcp add uv uvx uv-mcp && \
|
|
claude mcp add ruff ruff-mcp-server && \
|
|
claude mcp add memory npx @modelcontextprotocol/server-memory && \
|
|
claude mcp add git uvx mcp-server-git -- --repository /app && \
|
|
claude mcp add fetch uvx mcp-server-fetch && \
|
|
claude mcp add sequential-thinking npx @modelcontextprotocol/server-sequential-thinking && \
|
|
claude mcp add pyright-mcp npx @treedy/pyright-mcp
|
|
|
|
# Configure OpenCode with MCP servers
|
|
RUN mkdir -p ${USER_HOME}/.config/opencode
|
|
COPY opencode.json ${USER_HOME}/.config/opencode/opencode.json
|
|
|
|
# Install Oh My Zsh for better shell experience
|
|
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
|
|
|
|
# Set default shell to zsh
|
|
ENV SHELL=/bin/zsh
|
|
|
|
# Create cache
|
|
RUN sudo mkdir -p /tmp/uv-cache \
|
|
&& sudo chown -R ${USER_UID}:${USER_GID} /tmp
|
|
|
|
#Install crush
|
|
RUN sudo npm install -g @charmland/crush
|
|
|
|
# Install marksman (Markdown LSP) binary
|
|
RUN curl -fsSL https://github.com/artempyanykh/marksman/releases/latest/download/marksman-linux-x64 \
|
|
-o /tmp/marksman && \
|
|
sudo mv /tmp/marksman /usr/local/bin/marksman && \
|
|
sudo chmod +x /usr/local/bin/marksman
|
|
|
|
# Install LSPs
|
|
RUN sudo pip install python-lsp-server[all]
|
|
|
|
# Install additional LSP servers
|
|
RUN sudo npm install -g \
|
|
yaml-language-server \
|
|
vscode-json-languageserver \
|
|
dockerfile-language-server-nodejs \
|
|
bash-language-server
|
|
|
|
ENV FORGEJO_URL="https://git.cleverthis.com/"
|
|
COPY crush.json ${USER_HOME}/.config/crush/crush.json
|
|
|
|
RUN bash -c "$(curl -fsSL https://opencode.ai/install)" "" --unattended
|
|
COPY opencode.json ${USER_HOME}/.config/opencode/opencode.json
|
|
|
|
WORKDIR $APP_DIR
|
|
RUN mkdir -p "$APP_DIR" || true
|
|
RUN sudo chown -R ${USER_UID}:${USER_GID} "$APP_DIR" && \
|
|
cd $APP_DIR && \
|
|
git config --global --add safe.directory /app && \
|
|
# Clean and remove .git only if it was copied (not excluded by .dockerignore)
|
|
([ -d .git ] && git clean -xdf && rm -rf .git || true) && \
|
|
# So git doesn't complain about unusual permissions
|
|
sudo git config --system --add safe.directory ${APP_DIR}
|
|
|
|
EXPOSE 8000/tcp
|
|
EXPOSE 8080/tcp
|
|
EXPOSE 3000/tcp
|
|
|
|
VOLUME ["${APP_DIR}"]
|