Ajout d'une configuration DevContainer complète avec MCP Servers (LSP multi-langages, GitHub/Gitea), scripts de setup automatisés (crazycoder-setup.sh, setup-devcontainer.sh), et optimisation de l’image Docker (rustup/cargo-binstall, nettoyage des artefacts). Mise à jour du README avec documentation MCP et gestion dynamique des variables d’environnement (.env généré automatiquement selon la forge détectée). Simplification des entrypoints et postStartCommand pour une initialisation plus fiable.
197 lines
6.8 KiB
Markdown
197 lines
6.8 KiB
Markdown
# PMOCrazyCoder
|
|
|
|
Environnement de développement conteneurisé avec assistance IA intégrée — Go, Rust, Python, TypeScript, R, Ruby — et outillage IA local (LM Studio) ou cloud (Claude Pro).
|
|
|
|
## Vision
|
|
|
|
> Un container de développement complet, multi-langages, avec LSP, outils IA et MCP intégrés,
|
|
> utilisable depuis Zed, VS Code ou Cursor, avec persistance par projet.
|
|
|
|
## Ce que contient l'image
|
|
|
|
### Langages et compilateurs
|
|
- **Go** (dernière version stable via script)
|
|
- **Rust** (stable + nightly, avec rustfmt, clippy, rust-analyzer, rust-src)
|
|
- **Python 3** (avec ruff, fastmcp, ipython, tasklin)
|
|
- **Node.js / npm** (avec TypeScript, ESLint, Prettier, Pyright, typescript-language-server)
|
|
- **Ruby** (avec github-linguist)
|
|
- **R**
|
|
- **Clang / LLVM** (clangd inclus)
|
|
|
|
### Outils de développement
|
|
- `jj` (Jujutsu VCS) + `jj-lsp`
|
|
- `gopls`, `mcp-language-server`
|
|
- `cargo-edit`, `cargo-watch`, `cargo-outdated`, `cargo-make`, `cargo-binstall`
|
|
- `sqlite3`, `cmake`, `make`, `git`
|
|
- `aichat` (client LLM CLI)
|
|
|
|
### MCP Servers installés
|
|
|
|
Le conteneur inclut plusieurs MCP servers pour l'intégration avec les outils de développement :
|
|
|
|
| MCP Server | Utilisation |
|
|
|---|---|
|
|
| `mcp-language-server` | LSP pour Go (gopls), Python (pyright-langserver), Rust (rust-analyzer), TypeScript |
|
|
| `github-mcp-server` | Intégration GitHub (repos, issues, PR) via `GITHUB_TOKEN` |
|
|
| `gitea-mcp` | Intégration Gitea/Forgejo via `GITEA_URL` et `GITEA_TOKEN` |
|
|
| `mcp-server-commands` | Exécution de commandes shell depuis l'assistant IA |
|
|
|
|
### Assistants IA
|
|
- **Claude Code** (installé au `postCreateCommand`)
|
|
- **opencode** (configuré via l'entrypoint)
|
|
- **aichat** (configuré via l'entrypoint, connecté au LLM local)
|
|
|
|
### Configuration MCP dans les assistants
|
|
|
|
Les MCP servers sont automatiquement configurés dans opencode et Claude Code via `crazycoder-setup.sh` (exécuté en `postStartCommand`) :
|
|
|
|
**opencode** (`~/.config/opencode/opencode.json`) :
|
|
- LSP pour Go, Python, Rust, TypeScript via `mcp-language-server`
|
|
- Commandes shell via `mcp-server-commands`
|
|
- GitHub MCP (si `GITHUB_TOKEN` défini)
|
|
- Gitea MCP (si `GITEA_URL` et `GITEA_TOKEN` définis)
|
|
|
|
**Claude Code** (`~/.claude/.claude.json`) :
|
|
- Même configuration MCP qu'opencode
|
|
|
|
Les configurations sont générées dynamiquement au démarrage du conteneur avec les variables d'environnement disponibles.
|
|
|
|
## Variables d'environnement (.env)
|
|
|
|
Le fichier `.env` (non versionné, ignoré par git) contient les credentials pour les services externes :
|
|
|
|
| Variable | Description | Exemple |
|
|
|---|---|---|
|
|
| `GITHUB_TOKEN` | Personal Access Token GitHub pour l'accès API | `ghp_xxxxxxxxxxxxxxxxxxxx` |
|
|
| `GITEA_URL` | URL de votre serveur Gitea/Forgejo | `https://gitea.example.com` |
|
|
| `GITEA_TOKEN` | Token d'accès API Gitea | `xxxxxxxxxxxxxxxxxxxx` |
|
|
|
|
Copiez `.devcontainer/.env.example` vers `.env` et renseignez vos tokens :
|
|
|
|
```bash
|
|
cp .devcontainer/.env.example .env
|
|
# Éditer .env avec vos credentials
|
|
```
|
|
|
|
Ces variables sont utilisées par :
|
|
- Le MCP Server GitHub (pour les opérations repo/issues/PR)
|
|
- Le MCP Server Gitea (intégration avec votre instance)
|
|
|
|
## Utilisation rapide
|
|
|
|
### Ajouter l'environnement à un projet existant
|
|
|
|
```bash
|
|
curl -fsSL https://gargoton.petite-maison-orange.fr/eric/PMOCrazycoder/raw/branch/main/setup-devcontainer.sh | bash
|
|
```
|
|
|
|
Ou avec un endpoint LLM personnalisé :
|
|
|
|
```bash
|
|
LOCAL_LLM_API=http://monserveur:1248/v1 bash setup-devcontainer.sh
|
|
```
|
|
|
|
Le script télécharge les fichiers `devcontainer.json` et `docker-compose.yml` directement depuis le dépôt Gitea, crée les répertoires de persistance dans `.devcontainer/config/` et met à jour `.gitignore`.
|
|
|
|
### Ouvrir dans le container
|
|
|
|
Ouvrir le projet dans VS Code, Zed ou Cursor et choisir "Reopen in Container". L'image est tirée automatiquement depuis le registry.
|
|
|
|
### Authentifier Claude Code
|
|
|
|
Dans le panneau Claude Agent de Zed, lancer `/login` et choisir "Log in with Claude.ai" (abonnement Pro/Max).
|
|
|
|
## Persistance par projet
|
|
|
|
Toutes les données et caches sont persistés dans `.devcontainer/config/` (ignoré par git) :
|
|
|
|
| Répertoire | Contenu |
|
|
|---|---|
|
|
| `config/claude/` | Sessions et config Claude Code |
|
|
| `config/opencode/` | Config opencode |
|
|
| `config/aichat/` | Config aichat |
|
|
| `config/ai_index/` | Index de code du projet |
|
|
| `config/cargo-registry/` | Cache crates.io |
|
|
| `config/cargo-git/` | Cache dépendances git Cargo |
|
|
| `config/cargo-bin/` | Binaires Rust installés pour le projet |
|
|
| `config/go-cache/` | Cache modules Go |
|
|
| `config/go-bin/` | Binaires Go installés pour le projet |
|
|
| `config/python-local/` | Paquets pip user + gems Ruby |
|
|
| `config/npm-cache/` | Cache npm |
|
|
| `config/r-libs/` | Paquets R installés |
|
|
|
|
### Installer des binaires persistants
|
|
|
|
```bash
|
|
# Rust — persiste dans .devcontainer/config/cargo-bin/
|
|
cargo install cargo-nextest
|
|
|
|
# Go — persiste dans .devcontainer/config/go-bin/
|
|
GOBIN=~/go/bin go install github.com/some/tool@latest
|
|
|
|
# Python — persiste dans .devcontainer/config/python-local/
|
|
pip install --user monpaquet
|
|
|
|
# R — persiste dans .devcontainer/config/r-libs/
|
|
R -e 'install.packages("tidyverse")'
|
|
```
|
|
|
|
## Configuration MCP détaillée
|
|
|
|
### opencode
|
|
|
|
Le fichier `~/.config/opencode/opencode.json` est généré à chaque démarrage avec :
|
|
|
|
- **LSP servers** : gopls, pyright-langserver, rust-analyzer, typescript-language-server
|
|
- **Shell commands** : `mcp-server-commands`
|
|
- **GitHub MCP** : activé si `GITHUB_TOKEN` est défini
|
|
- **Gitea MCP** : activé si `GITEA_URL` et `GITEA_TOKEN` sont définis
|
|
- **Provider LM Studio** : endpoint local configurable
|
|
|
|
### Claude Code
|
|
|
|
Le fichier `~/.claude/.claude.json` est mis à jour avec la section `mcpServers` contenant les mêmes serveurs que opencode.
|
|
|
|
## LLM local
|
|
|
|
L'entrypoint configure automatiquement opencode et aichat pour pointer sur `LOCAL_LLM_API`
|
|
(défaut : `http://host.docker.internal:1248/v1`).
|
|
|
|
Variables d'environnement disponibles dans le container :
|
|
|
|
| Variable | Défaut | Description |
|
|
|---|---|---|
|
|
| `LOCAL_LLM_API` | `http://host.docker.internal:1248/v1` | Endpoint OpenAI-compatible |
|
|
| `LLM_MODEL` | `ollama:qwen/qwen3-coder-next@4bit` | Modèle à utiliser |
|
|
| `TEMPERATURE` | `0.5` | Température |
|
|
| `NUM_CTX` | `32768` | Taille de contexte |
|
|
| `MAXTOKEN` | `4096` | Tokens max en sortie |
|
|
|
|
## Construire et publier l'image
|
|
|
|
```bash
|
|
# Build natif (local)
|
|
make build
|
|
|
|
# Build multi-arch (amd64 + arm64) + push vers le registry
|
|
make all
|
|
|
|
# Push uniquement (si l'archive OCI existe déjà)
|
|
make push
|
|
|
|
# Lister toutes les targets
|
|
make help
|
|
```
|
|
|
|
L'image est publiée sur `niepce.petite-maison-orange.fr/public/pmocrazycoder:latest`.
|
|
Le push utilise `skopeo` — assurez-vous d'être authentifié sur le registry.
|
|
|
|
## Sources
|
|
|
|
- Dépôt git : `https://gargoton.petite-maison-orange.fr/eric/PMOCrazycoder`
|
|
- Registry OCI : `niepce.petite-maison-orange.fr/public/pmocrazycoder:latest`
|
|
|
|
## Licence
|
|
|
|
CECILL-2.1
|