Replace LM Studio direct integration with aichat-based MCP server, enabling Qwen3-Coder to autonomously use filesystem, shell and web tools via llm-functions. Key changes: - Update server.py to launch aichat on a dynamic port and handle tool_calls loop - Add llm-functions directory with prebuilt tools (fs_cat, fs_ls, execute_command, etc.) - Revise delegation rules to remove file count limit and emphasize autonomous tool usage - Update agents and skills docs to reflect new architecture and workflow - Add setup instructions for aichat, argc, jq and llm-functions build step - Bump MCP server version to 3.0.0
232 lines
6.6 KiB
Markdown
232 lines
6.6 KiB
Markdown
# CrazyClaude
|
|
|
|
Configuration Claude Code pour orchestrer des tâches de développement en déléguant les tâches atomiques à **Qwen3-Coder** via [aichat](https://github.com/sigoden/aichat).
|
|
|
|
Ce dépôt est conçu pour être intégré comme sous-répertoire `.claude/` dans n'importe quel projet. Il fournit agents, hooks, skills, un serveur MCP et une collection d'outils prêts à l'emploi.
|
|
|
|
Pour le détail de l'architecture, voir [`rapport-orchestration-claude-code.md`](./rapport-orchestration-claude-code.md).
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
```
|
|
Claude Code (orchestrateur)
|
|
│
|
|
└── MCP qwen3 (stdio)
|
|
│
|
|
└── aichat --serve (port dynamique)
|
|
│
|
|
└── LM Studio → Qwen3-Coder-Next
|
|
+ outils llm-functions
|
|
(fs, shell, web, ...)
|
|
```
|
|
|
|
Le serveur MCP lance aichat au démarrage sur un port libre. Qwen3 dispose d'outils filesystem, shell et web fournis par [llm-functions](https://github.com/sigoden/llm-functions) — sans aucune logique d'outil dans le serveur lui-même.
|
|
|
|
---
|
|
|
|
## Prérequis
|
|
|
|
- [Claude Code](https://claude.ai/code) (`claude` dans le PATH)
|
|
- [aichat](https://github.com/sigoden/aichat) (`aichat` dans le PATH)
|
|
- [LM Studio](https://lmstudio.ai/) avec le modèle `qwen/qwen3-coder-next` chargé et accessible depuis aichat
|
|
- [argc](https://github.com/sigoden/argc) — runner de scripts pour llm-functions
|
|
- [jq](https://jqlang.github.io/jq/) — requis par llm-functions
|
|
- Python 3.11+ (pour le serveur MCP)
|
|
- Outils selon votre stack : `cargo` + `clippy` (Rust), `golangci-lint` (Go)
|
|
|
|
---
|
|
|
|
## Installation dans un projet existant
|
|
|
|
### 1. Cloner ce dépôt
|
|
|
|
Avec **Jujutsu** :
|
|
|
|
```sh
|
|
# Depuis la racine de votre projet
|
|
jj git clone https://gargoton.petite-maison-orange.fr/eric/CrazyClaude.git .claude-crazy
|
|
```
|
|
|
|
Puis copiez le contenu :
|
|
|
|
```sh
|
|
cp -r .claude-crazy/.claude ./.claude
|
|
cp -r .claude-crazy/llm-functions ./.claude/llm-functions # si présent dans le clone
|
|
```
|
|
|
|
> Avec jj colocalisé git, vous pouvez aussi utiliser subtree :
|
|
>
|
|
> ```sh
|
|
> git subtree add --prefix .claude https://gargoton.petite-maison-orange.fr/eric/CrazyClaude.git main --squash
|
|
> ```
|
|
|
|
### 2. Créer le virtualenv Python
|
|
|
|
```sh
|
|
cd .claude
|
|
python3 -m venv venv
|
|
venv/bin/pip install -r mcp/qwen3-mcp/requirements.txt
|
|
```
|
|
|
|
### 3. Installer et construire llm-functions
|
|
|
|
Si `llm-functions/` n'est pas déjà présent dans `.claude/` :
|
|
|
|
```sh
|
|
git clone https://github.com/sigoden/llm-functions .claude/llm-functions
|
|
```
|
|
|
|
Choisissez les outils à activer en éditant `.claude/llm-functions/tools.txt`, puis construisez :
|
|
|
|
```sh
|
|
cd .claude/llm-functions
|
|
argc build
|
|
```
|
|
|
|
Les outils activés par défaut :
|
|
|
|
```
|
|
fs_cat.sh
|
|
fs_ls.sh
|
|
fs_mkdir.sh
|
|
fs_write.sh
|
|
fs_patch.sh
|
|
execute_command.sh
|
|
fetch_url_via_curl.sh
|
|
web_search_aichat.sh
|
|
execute_py_code.py
|
|
```
|
|
|
|
### 4. Configurer aichat
|
|
|
|
Vérifiez que aichat peut accéder à LM Studio et que le modèle `qwen/qwen3-coder-next` est disponible :
|
|
|
|
```sh
|
|
aichat --list-models | grep qwen
|
|
```
|
|
|
|
### 5. Enregistrer le serveur MCP
|
|
|
|
```sh
|
|
claude mcp add --transport stdio qwen3 -- .claude/venv/bin/python3 .claude/mcp/qwen3-mcp/server.py
|
|
```
|
|
|
|
Vérifier :
|
|
|
|
```sh
|
|
claude mcp list
|
|
# qwen3: ... - ✓ Connected
|
|
```
|
|
|
|
### 6. Adapter CLAUDE.md à votre projet
|
|
|
|
Éditez `.claude/CLAUDE.md` : mettez à jour la section `## Stack` et les heuristiques de délégation.
|
|
|
|
### 7. Rendre les hooks exécutables
|
|
|
|
```sh
|
|
chmod +x .claude/hooks/*.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Structure
|
|
|
|
```
|
|
.claude/
|
|
├── CLAUDE.md # contexte projet + heuristiques de délégation
|
|
├── settings.json # hooks et permissions
|
|
├── agents/
|
|
│ ├── qwen3-worker.md # délégation vers Qwen3 via MCP
|
|
│ ├── code-reviewer.md # révision code (Claude Haiku)
|
|
│ └── task-planner.md # planification complexe (Claude Opus)
|
|
├── skills/
|
|
│ ├── delegation-rules.md # quand déléguer à Qwen3
|
|
│ └── rust-go-conventions.md # conventions Rust/Go
|
|
├── hooks/
|
|
│ ├── post-write-lint.sh # lint automatique après écriture
|
|
│ ├── subagent-stop-log.sh # log des décisions de délégation
|
|
│ └── pre-bash-guard.sh # blocage des commandes dangereuses
|
|
├── mcp/
|
|
│ └── qwen3-mcp/
|
|
│ ├── server.py # serveur MCP stdio : lance aichat + gère tool_calls
|
|
│ ├── agent_lm.py # agent loop CLI autonome (usage direct sans MCP)
|
|
│ └── requirements.txt
|
|
├── llm-functions/ # collection d'outils pour Qwen3 (sous-repo)
|
|
│ ├── tools.txt # outils activés
|
|
│ ├── functions.json # déclarations générées (lues par server.py)
|
|
│ ├── bin/ # binaires générés par argc build
|
|
│ └── tools/ # scripts sources (.sh, .py, .js)
|
|
├── logs/ # produits par les hooks (ignorés par jj/git)
|
|
└── venv/ # virtualenv Python (ignoré par jj/git)
|
|
```
|
|
|
|
---
|
|
|
|
## Outils disponibles pour Qwen3
|
|
|
|
Les outils sont définis dans `.claude/llm-functions/tools.txt` et buildés avec `argc build`.
|
|
|
|
| Outil | Description |
|
|
|-------|-------------|
|
|
| `fs_cat` | Lit un fichier |
|
|
| `fs_ls` | Liste un répertoire |
|
|
| `fs_mkdir` | Crée un répertoire |
|
|
| `fs_write` | Écrit/crée un fichier |
|
|
| `fs_patch` | Modifie un fichier par patch |
|
|
| `execute_command` | Exécute une commande shell |
|
|
| `fetch_url_via_curl` | Requête HTTP GET |
|
|
| `web_search_aichat` | Recherche web |
|
|
| `execute_py_code` | Exécute du code Python |
|
|
|
|
Pour ajouter un outil : éditez `tools.txt` et relancez `argc build`.
|
|
|
|
---
|
|
|
|
## Configuration du modèle
|
|
|
|
Le modèle Qwen3 est configuré dans `.claude/mcp/qwen3-mcp/server.py` :
|
|
|
|
```python
|
|
QWEN3_MODEL = "LMStudio:qwen/qwen3-coder-next"
|
|
```
|
|
|
|
Le format `Provider:model-id` suit la convention aichat. Adaptez selon votre installation LM Studio.
|
|
|
|
---
|
|
|
|
## Fichiers à ignorer (jj / git)
|
|
|
|
```
|
|
.claude/venv/
|
|
.claude/logs/
|
|
.claude/llm-functions/bin/
|
|
.claude/llm-functions/cache/
|
|
```
|
|
|
|
Avec Jujutsu :
|
|
|
|
```sh
|
|
printf ".claude/venv/\n.claude/logs/\n.claude/llm-functions/bin/\n.claude/llm-functions/cache/\n" >> .gitignore
|
|
```
|
|
|
|
---
|
|
|
|
## Mise à jour
|
|
|
|
Avec Jujutsu colocalisé (`jj git init --colocate`), la mise à jour est gérée côté git :
|
|
|
|
```sh
|
|
git subtree pull --prefix .claude https://gargoton.petite-maison-orange.fr/eric/CrazyClaude.git main --squash
|
|
```
|
|
|
|
jj voit le commit résultant comme un commit ordinaire dans son graphe.
|
|
|
|
Après mise à jour, reconstruire llm-functions si `tools.txt` a changé :
|
|
|
|
```sh
|
|
cd .claude/llm-functions && argc build
|
|
```
|