From 9c914b989bb607c4bbb151d0ec71e3713f2e6db1 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sat, 21 Feb 2026 21:04:13 +0100 Subject: [PATCH] Enhance Docker setup with new tools and configurations Update Dockerfile to install additional tools (orla, rust-analyzer), configure user permissions, and set up bash completion. Update docker-entrypoint.sh to export new environment variables and configure MCP language servers for multiple languages (Go, Python, Rust, TypeScript) with proper workspace and LSP settings. Add new documentation file AGENTS.md with development guidelines and security rules. Add pyproject.toml for Python project configuration with dependencies and dev tools. Add src/PMOCrazyCoder.py as a new MCP server implementation with example tools. --- Dockerfile | 23 ++++++++++--- docker-entrypoint.sh | 77 ++++++++++++++++++++++++++------------------ opencode/AGENTs.md | 49 ++++++++++++++++++++++++++++ pyproject.toml | 33 +++++++++++++++++++ src/PMOCrazyCoder.py | 37 +++++++++++++++++++++ 5 files changed, 182 insertions(+), 37 deletions(-) create mode 100644 opencode/AGENTs.md create mode 100644 pyproject.toml create mode 100644 src/PMOCrazyCoder.py diff --git a/Dockerfile b/Dockerfile index 646b6f3..3dd20c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,23 +38,36 @@ RUN curl -fsSL https://opencode.ai/install | bash && \ ENV GOPATH=/usr/local/go ENV GOBIN=/usr/local/go/bin -RUN go install golang.org/x/tools/gopls@latest -RUN go install github.com/isaacphi/mcp-language-server@latest +RUN go install golang.org/x/tools/gopls@latest \ + && go install github.com/isaacphi/mcp-language-server@latest \ + && go install github.com/dorcha-inc/orla/cmd/orla@latest + +RUN mkdir -p /etc/bash_completion.d \ + && orla completion bash > /etc/bash_completion.d/orla \ + && jj util completion bash > /etc/bash_completion.d/jj + +RUN rustup component add rust-analyzer --toolchain nightly ARG USERNAME=devuser ARG USER_UID=1000 ARG USER_GID=1000 RUN groupadd --gid $USER_GID $USERNAME && \ useradd --uid $USER_UID \ - --gid $USER_GID \ - -m $USERNAME \ - --shell /bin/bash + --gid $USER_GID \ + -m $USERNAME \ + --shell /bin/bash && \ + echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME && \ + chmod 440 /etc/sudoers.d/$USERNAME COPY docker-entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh +RUN mkdir -p /home/${USERNAME}/.config \ + && chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.config +COPY --chown=${USERNAME}:${USERNAME} opencode /home/${USERNAME}/.config/opencode USER $USERNAME WORKDIR /workspace + ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["/bin/bash"] diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 37af4ff..26c249f 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -3,7 +3,10 @@ export USERNAME=${USERNAME:-devuser} +export WORKSPACE=${WORKSPACE:-/workspace} export LOCAL_LLM_API=${LOCAL_LLM_API:-http://host.docker.internal:1248/v1} +export LLM_MODEL=${LLM_MODEL:-'ollama:qwen/qwen3-coder-next@4bit'} +export ORLA_OLLAMA_HOST=$(sed -E 's@(https?://[^/]+).*$@\1@' <<< $LOCAL_LLM_API) export MAXTOKEN=${MAXTOKEN:-4096} export NUM_CTX=${NUM_CTX:-32768} export REPEAT_PENALTY=${REPEAT_PENALTY:-1.3} @@ -23,6 +26,8 @@ fi if [ -n "$LOCAL_LLM_API" ]; then if ! grep -q "LOCAL_LLM_API" /home/${USERNAME}/.bashrc; then echo "export LOCAL_LLM_API=$LOCAL_LLM_API" >> /home/${USERNAME}/.bashrc + echo "export ORLA_OLLAMA_HOST=$ORLA_OLLAMA_HOST" >> /home/${USERNAME}/.bashrc + echo "export ORLA_MODEL='${LLM_MODEL}'" >> /home/${USERNAME}/.bashrc fi mkdir -p /home/${USERNAME}/.config/opencode @@ -31,6 +36,45 @@ if [ -n "$LOCAL_LLM_API" ]; then cat > $CONFIG_FILE < /dev/null; then - mkdir -p /home/${USERNAME}/.config/opencode - MCP_CONFIG=/home/${USERNAME}/.config/opencode/mcp_servers.json - - cat > $MCP_CONFIG <=0.1.0", +] + +[project.optional-dependencies] +dev = [ + "ruff", + "black", + "mypy", + "isort", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.ruff] +target-version = "py310" + +[tool.ruff.lint] +select = ["E", "F", "I", "N", "W"] +ignore = [] + +[tool.black] +target-version = ["py310"] + +[tool.mypy] +python_version = "3.10" diff --git a/src/PMOCrazyCoder.py b/src/PMOCrazyCoder.py new file mode 100644 index 0000000..4a10aa6 --- /dev/null +++ b/src/PMOCrazyCoder.py @@ -0,0 +1,37 @@ +from crazy_mcp import Context, mcp +from crazy_mcp.tools import * + + +# Déclaration d'un outil +@mcp.tool(description="Renvoie le texte reçu") +def echo_texte(texte: str) -> str: + return f"Écho du serveur : {texte} mec" + + +# Déclaration d'un second outil pour démonstration +@mcp.tool(description="Renvoie le texte en majuscules") +def shout_texte(texte: str) -> str: + return texte.upper() + + +# Déclaration d'un outil pour additionner deux nombres +@mcp.tool(description="Additionne deux nombres") +def additionner(a: float, b: float) -> float: + return a + b + + +@mcp.tool +async def increment(ctx: Context) -> tuple[int, str]: + count = ctx.get_state("count") or 0 + ctx.set_state("count", count + 1) + return count + 1, ctx.session_id + + +# Lancement du serveur MCP +if __name__ == "__main__": + mcp.run( + transport="http", # Transport réseau HTTP + host="0.0.0.0", # Adresse d’écoute + port=7860, # Port TCP + path="/mcp", # Chemin MCP (par défaut /mcp) + )