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) + )