Assistant IA interactif pour l'analyse, la correction et le contrôle de code.
Utilise Ollama (local/swarm), Qdrant (mémoire sémantique) et cpscript
pour offrir un cycle complet d'amélioration de code guidé par l'IA.
- Vue d'ensemble
- Prérequis
- Installation rapide
- Utilisation de base
- Options complètes
- Profils automatiques (server / client)
- Règles projet (
.assistant_rules) - Flux de travail détaillé
- Mode
--test— Diagnostic actif - Mode
--doc— Diagnostic actif - Mémoire KV (
--kvbasename) - Intégration Qdrant
- Application des patches (
--patch) - Outils connexes
- Architecture
- Dépannage
code_assistant orchestre 4 couches :
┌─────────────────────────────────────────────────────────────────┐
│ code_assistant (bash) │
│ → Orchestration, UX, diff interactif, application des patches │
│ → Détection de profil (server/client), .assistant_rules │
│ → Dry run tests, coverage map, diagnostic doc ↔ code │
├─────────────────────────────────────────────────────────────────┤
│ cpscript │
│ → Extraction récursive du contexte code (JSON) │
│ → Détection imports Python (ast), source Bash sans extension │
│ → Support HTML : <link href>, <script src> → CSS/JS locaux │
│ → Support JS : import from, require() → modules locaux │
├─────────────────────────────────────────────────────────────────┤
│ IA/code_assistant.py │
│ → Phases LLM (analyse/correction/contrôle), mémoire KV │
│ → System prompts adaptatifs (--test, --doc, profil client) │
│ IA/embed.py │
│ → Embeddings nomic-embed-text + indexation/recherche Qdrant │
├─────────────────────────────────────────────────────────────────┤
│ IA/ollama.me.sh │
│ → Connectivité Ollama : local → SSH tunnel → IPFS P2P Swarm │
│ + test latence + disponibilité modèles sur chaque nœud │
└─────────────────────────────────────────────────────────────────┘
| Composant | Requis | Installation |
|---|---|---|
python3 |
✅ | sudo apt install python3 |
ollama (Python) |
✅ | pip install ollama |
requests (Python) |
Recommandé | pip install requests |
| Ollama (serveur) | ✅ | https://ollama.ai ou via IA/ollama.me.sh |
| Modèle grand contexte | Recommandé | sélectionné automatiquement (plus grand num_ctx) |
deepseek-r1:14b |
Fallback analyse | ollama pull deepseek-r1:14b |
qwen2.5-coder:14b |
Fallback correction | ollama pull qwen2.5-coder:14b |
nomic-embed-text |
Recommandé (mémoire) | ollama pull nomic-embed-text |
| Qdrant | Optionnel | Stack rnostr (install/install_rnostr_semantic.sh) ou docker run -p 6333:6333 -v ~/.zen/qdrant-data:/qdrant/storage qdrant/qdrant |
curl, diff, jq |
✅ | sudo apt install curl diffutils jq |
node |
Optionnel (validation JS) | sudo apt install nodejs |
# Se placer dans le projet
cd Astroport.ONE
# Rendre exécutables
chmod +x code_assistant cpscript IA/embed.py IA/code_assistant.py
# Télécharger les modèles recommandés
./code_assistant --setup
# Vérifier Ollama
IA/ollama.me.sh # démarre/connecte Ollama si nécessaire
# Vérifier le modèle d'embedding
python3 IA/embed.py --check
# Optionnel : démarrer Qdrant (volume unifié ~/.zen/qdrant-data)
mkdir -p ~/.zen/qdrant-data
docker run -d -p 127.0.0.1:6333:6333 -p 127.0.0.1:6334:6334 \
-v "$HOME/.zen/qdrant-data:/qdrant/storage:z" \
--name qdrant --restart always \
qdrant/qdrant
# ou via la stack rnostr (recommandé) :
# bash install/install_rnostr_semantic.sh# Étape 1 : ANALYSE — Identifier les problèmes
./code_assistant UPassport/routers/geo.py --kvbasename geo-fix
# Étape 2 : CORRECTION — Générer des options pour le problème 2
./code_assistant UPassport/routers/geo.py --kvbasename geo-fix \
--phase correction --choice 2
# Étape 3 : CONTRÔLE + APPLICATION — Vérifier et appliquer la variante b
# Avec --patch, l'application est directe (pas de copier-coller)
./code_assistant UPassport/routers/geo.py --kvbasename geo-fix \
--phase controle --choice b --patch 🖥️ Station : localhost:11434 (30 modèles)
─────────────────────────────────────────────────────
[ 1] qwen3-coder:latest 256k ctx
[ 2] dagbs/deepseek-coder-v2-lite:latest 160k ctx
[ 3] deepseek-r1:14b 128k ctx
...
Modèle ? [1 = qwen3-coder:latest] >
╔══════════════════════════════════════════════════════════════╗
║ 🤖 CODE ASSISTANT — Phase : ANALYSE ║
╠══════════════════════════════════════════════════════════════╣
║ Script : geo.py ║
║ Session : geo-fix ║
║ Station : localhost:11434 ║
║ Modèle : qwen3-coder:latest ║
║ Context : ~209k tokens (80% de la fenêtre) ║
║ Profil : 🖥️ server (Bash/Python/Markdown) ║
╚══════════════════════════════════════════════════════════════╝
📦 Extraction du contexte (depth=1, maxtoken=209715)...
✓ 5 fichier(s) — ~8200 tokens
=== ANALYSE ===
1. [SÉCURITÉ] Paramètres lat/lon non validés — injection possible
Localisation: geo.py:48
Impact: CRITIQUE
2. [PERFORMANCE] Requête synchrone bloque le worker async
Localisation: geo.py:112
Impact: MAJEUR
3. [MAINTENABILITÉ] Constantes magiques non documentées
Localisation: geo.py:77,89,134
Impact: MINEUR
=== FIN ANALYSE ===
Usage : code_assistant <script> [options]
Options :
--kvbasename <nom> Nom de session persistante (mémoire entre runs)
Default : "default"
--model <nom> Modèle Ollama (défaut: auto par phase)
Analyse → deepseek-r1:14b
Correction → qwen2.5-coder:14b
--phase <phase> Phase à exécuter (défaut: analyse)
Valeurs : analyse | correction | controle
--depth N Profondeur d'extraction cpscript (défaut: 1)
1 = script + dépendances directes seulement
2 = +dépendances des dépendances
--maxtoken N Limite tokens du contexte code
Défaut : auto (80% du contexte max du modèle sélectionné)
Ex: --maxtoken 64000 pour forcer une limite précise
--exclude <f> Exclure un fichier par basename (répétable)
Ex: --exclude my.sh --exclude config.py
--choice <N|a|b|c> Choix direct (non-interactif)
N = 1|2|3 pour analyse, a|b|c pour correction
--supplement <txt> Contexte humain injecté dans le prompt LLM
Ex: --supplement "Focus sur le timeout IPFS ligne 131"
Inline avec choix : "2 Focus sur le timeout"
--human Mode interactif extraction + revue des prompts LLM
[Y=inclure / n=ignorer / a=tout / q=quitter]
--doc Inclure les .md de docs/ qui référencent ce script
+ diagnostic actif incohérences doc ↔ code
--test Charger les tests depuis tests/ + diagnostic actif
Dry run pytest/unittest/bats, coverage map via ast
Si tests échouent, stacktraces injectées dans le contexte LLM
--patch Appliquer la correction dans le fichier source
Montre un diff coloré + validation syntaxique
En phase controle : application directe (exec)
--no-qdrant Désactiver Qdrant (même s'il est disponible)
--diff-format <fmt> Format des patches LLM (défaut: unified)
json = fichier complet (robuste)
unified = diff -u (économise les tokens)
--setup Télécharger les modèles recommandés via ollama pull
(deepseek-r1:14b, qwen2.5-coder:14b, nomic-embed-text)
--help Affiche cette aide
code_assistant détecte automatiquement le profil selon l'extension du fichier fourni :
| Extension | Profil | Contexte LLM injecté |
|---|---|---|
.sh, .py |
server | scripts Linux, Python, Bash |
.html, .js, .css |
client | web old-school, jQuery/vanilla |
.md, .json |
auto | client si .html/.js coexistent, sinon server |
| autre | server | fallback |
Si aucun --supplement n'est fourni, le système injecte :
"HTML5 + CSS3 + JavaScript vanilla ou jQuery. Bibliothèques via
<script src='...'>uniquement (CDN).
PAS de frameworks modernes (React, Vue, Angular, Svelte, Next.js).
PAS de npm, webpack, vite, TypeScript, Babel.
PAS de modules ES6 (import/export)."
Les CDN déjà utilisés dans les .html du projet sont détectés et listés dans la contrainte.
Le profil est affiché dans l'en-tête :
║ Profil : 🌐 client (HTML/CSS/JS vanilla·jQuery·CDN) ║
Créez un fichier .assistant_rules dans le répertoire du script, du projet ou de Astroport.ONE/ pour injecter des règles permanentes dans tous les prompts :
# .assistant_rules
Toujours utiliser des docstrings Google Style.
Pas de bibliothèques externes absentes de requirements.txt.
Nommer les fonctions en snake_case.
Pas de print() dans le code de production, utiliser logging.
Recherche en cascade (premier trouvé) :
<dir_du_script>/.assistant_rules<dir_du_script>/../.assistant_rules<dossier_code_assistant>/.assistant_rules
Si trouvé, affiché dans l'en-tête :
║ Rules : 📋 .assistant_rules chargé ║
Le contenu est annexé au --supplement existant (sans l'écraser).
Objectif : Identifier les 3 problèmes prioritaires du code.
Entrée : Contexte code extrait par cpscript --json
Sortie : Liste numérotée 1/2/3 avec catégorie, localisation, impact
Modèle : auto-sélectionné (meilleur contexte disponible) ou deepseek-r1:14b en fallback
# Analyse simple
./code_assistant mon_script.py --kvbasename session1
# Avec focus utilisateur
./code_assistant mon_script.py --kvbasename session1 \
--supplement "Focus sur la gestion des erreurs réseau"
# Sans Qdrant
./code_assistant mon_script.sh --kvbasename session1 --no-qdrantObjectif : Générer 3 variantes de correction pour le problème choisi.
Modèle : même modèle que l'analyse (contexte max conservé) ou qwen2.5-coder:14b en fallback
Format JSON LLM :
{
"problem": "Paramètres non validés",
"options": {
"a": { "description": "Correction minimale (patch chirurgical)",
"files": [{"path": "geo.py", "content": "..."}] },
"b": { "description": "Correction complète (robuste)",
"files": [{"path": "geo.py", "content": "..."}] },
"c": { "description": "Refactoring (meilleure architecture)",
"files": [{"path": "geo.py", "content": "..."}] }
}
}# Corriger le problème 2
./code_assistant mon_script.py --kvbasename session1 \
--phase correction --choice 2
# Avec contexte supplémentaire
./code_assistant mon_script.py --kvbasename session1 \
--phase correction --choice 2 \
--supplement "Préfère une solution async compatible asyncio"Objectif : Vérifier la correction, identifier les risques.
Sortie : Rapport avec verdict (OK / ATTENTION / REFUSER)
# Contrôler la variante b
./code_assistant mon_script.py --kvbasename session1 \
--phase controle --choice b
# Contrôler ET appliquer directement (exec, pas de copier-coller)
./code_assistant mon_script.py --kvbasename session1 \
--phase controle --choice b --patchExemple de sortie :
=== CONTRÔLE ===
Verdict: OK
✓ Points validés:
- Validation Pydantic correctement intégrée
- Pas de régression sur les endpoints existants
⚠ Risques identifiés:
- Les coordonnées hors plage [-90,90]/[-180,180] non gérées
🧪 Tests recommandés:
- test_geo.py::test_invalid_coordinates
- test_geo.py::test_boundary_values
=== FIN CONTRÔLE ===
Le mode --test passe de l'injection passive à un diagnostic d'exécution réel :
Cherche dans 4 répertoires candidats : tests/, ../tests/, test/, ../test/
Patterns : test_<script>.* et <script>_test.*
Avant l'envoi au LLM, exécute les tests détectés :
| Extension | Runner prioritaire | Fallback |
|---|---|---|
.py |
pytest -x --tb=short |
unittest |
.sh |
bats |
bash <test> |
🧪 Mode --test : diagnostic actif des tests unitaires
✓ Fichier(s) de test trouvé(s) :
• tests/test_geo.py
🏃 Dry run pytest...
❌ 2 test(s) en échec (pytest) :
FAILED test_geo.py::test_validate_coords - AssertionError
ERROR test_geo.py::test_boundary - TypeError: ...
📊 Fonctions sans couverture détectée : validate_range, build_response
Extrait les fonctions publiques du script source et vérifie leur présence dans les fichiers de test. Sans coverage.py, 100% fiable via ast.
Les résultats sont injectés dans des sections dédiées du contexte :
### RÉSULTATS DES TESTS (dry run) ###— stacktraces réelles### COUVERTURE — fonctions non testées ###— gaps de couverture
Si tests en échec : l'IA est contrainte à résoudre uniquement les erreurs réelles.
Si tests passants : l'IA identifie les fonctions non couvertes.
Avec --test, la phase controle exige obligatoirement :
"🔒 Fournis le bloc pytest/shunit2 qui aurait échoué AVANT et passe AVEC la correction."
# Analyse avec diagnostic test
./code_assistant geo.py --kvbasename geo-fix --test
# Correction ciblée sur les tests en échec
./code_assistant geo.py --kvbasename geo-fix \
--test --phase correction --choice 2
# Contrôle + non-régression + patch
./code_assistant geo.py --kvbasename geo-fix \
--test --phase controle --choice b --patch
# Si aucun test trouvé : l'IA propose de les créer
./code_assistant utils.py --kvbasename utils --test
# ⚠️ Aucun test trouvé — l'IA proposera tests/test_utils.pyLe mode --doc va au-delà de l'injection des .md : il compare les signatures du code avec la documentation.
cpscript --doc charge les fichiers .md de docs/ qui référencent le script.
Un script Python ast embarqué :
- Extrait toutes les signatures
def func(arg1, arg2)du code source - Cherche leurs mentions dans les
.md - Détecte les arguments dans la doc qui n'existent plus dans le code
- Détecte les fonctions
`func()`dans la doc mais absentes du code
📖 Mode --doc : diagnostic actif doc ↔ code...
⚠️ Incohérences doc ↔ code détectées :
• [docs/api.md] validate_coords(): args inconnus dans la doc : id_int
• [docs/api.md] `old_helper()` mentionné mais absent du code
Section ajoutée : ### INCOHÉRENCES DOC vs CODE ###
En mode --doc, l'IA est guidée vers la conformité code ↔ documentation.
# Analyse avec diagnostic doc
./code_assistant geo.py --kvbasename geo-fix --doc
# Combiné test + doc (cycle complet)
./code_assistant geo.py --kvbasename geo-fix --test --docLa session est stockée dans ~/.zen/flashmem/code_assistant/<kvbasename>.json.
{
"kvbasename": "geo-fix",
"script": "/path/to/geo.py",
"phase": "controle",
"history": [
{"phase": "analyse", "choice": null, "timestamp": 1710000000, "summary": "..."},
{"phase": "correction", "choice": "2", "timestamp": 1710000100, "summary": "..."}
],
"last_proposals": {
"1": "Sécurité: paramètres non validés...",
"2": "Performance: requête synchrone...",
"3": "Maintenabilité: constantes magiques..."
},
"last_correction_text": "{\"options\":{\"a\":{...},\"b\":{...},\"c\":{...}}}",
"last_choice": "2",
"last_variant_choice": "b",
"accepted_patches": [],
"git_hash": "a3f9c1d"
}# Voir l'état d'une session
cat ~/.zen/flashmem/code_assistant/geo-fix.json | python3 -m json.tool
# Continuer depuis n'importe quelle phase
./code_assistant geo.py --kvbasename geo-fix --phase controleQdrant est utilisé pour la mémoire sémantique entre les sessions.
À chaque phase, l'assistant indexe automatiquement le résumé de la session avec un ID stable via SHA-256 (pas de doublons entre redémarrages).
Quand un patch est refusé (n), l'outil propose d'enregistrer la raison :
⏭️ Patch ignoré pour geo.py
📝 Raison du refus (optionnel, mémoire IA) : trop intrusif, préférer async
La raison est indexée dans la collection ca_refusals de Qdrant. Lors des prochaines analyses, l'IA peut recevoir ce contexte : "L'utilisateur a précédemment rejeté une solution de type X car Y".
Avant chaque analyse, les 3 sessions les plus similaires sont récupérées et injectées dans le prompt (filtrées par langue : Python/Shell).
# Vérifier la connectivité
python3 IA/embed.py --check
# Générer un embedding
echo "validation des coordonnées GPS" | python3 IA/embed.py
# Indexer dans Qdrant
python3 IA/embed.py --index --collection code_assistant \
--payload '{"script":"geo.py","session":"geo-fix"}' \
"$(cat geo.py)"
# Rechercher des analyses similaires
python3 IA/embed.py --search --collection code_assistant \
--language py --top 5 \
"validation paramètres FastAPI" 📄 routers/geo.py
┌─── DIFF (original → correction) ───────────────────
│ --- a/routers/geo.py
│ +++ b/routers/geo.py
│ @@ -45,7 +45,12 @@
│ -async def get_geo(lat, lon):
│ +async def get_geo(
│ + lat: float = Query(..., ge=-90, le=90),
│ + lon: float = Query(..., ge=-180, le=180)
│ +) -> GeoResponse:
└─── 8 lignes modifiées ────────────────────────────
Appliquer ce patch ? [Y/n]Avant d'écraser le fichier, la syntaxe est vérifiée :
| Extension | Outil | Comportement |
|---|---|---|
.py |
python3 -m py_compile |
Bloque si invalide |
.sh |
bash -n |
Bloque si invalide |
.json |
jq . |
Bloque si invalide |
.js |
node --check |
Bloque si invalide |
.html |
heuristique ast | Avertissement (non bloquant) |
Si le patch représente moins de 70% des lignes de l'original (sur un fichier > 20 lignes) :
⚠️ ⚠️ RISQUE DE TRONCATURE DÉTECTÉ !
Original : 245 lignes → Patch : 48 lignes (19%)
Le LLM a peut-être renvoyé du code tronqué ('// ... reste inchangé ...')
Forcer quand même l'application ? [y/N]
geo.py.bak.20260317161530
Avec --patch en phase controle, l'approbation déclenche directement la phase correction+patch via exec — pas de commande à copier-coller.
Supporte .sh, .py, .html, .js, .css — suit récursivement les dépendances.
# Contexte JSON pour code_assistant (défaut: depth=1)
cpscript --json --depth 1 mon_script.py # .sh ou .py
cpscript --json --depth 1 index.html # HTML → JS/CSS locaux
cpscript --json --depth 2 app.js # JS → imports récursifs
# Filtrer par type de fichier
cpscript --only html index.html # sortie HTML uniquement
cpscript --only js index.html # sortie JS uniquement (dépendances)
cpscript --only sh --depth 2 mon_script.sh # Bash seulement
# Inclure la documentation associée
cpscript --json --doc mon_script.py
# Mode interactif : valider chaque dépendance
cpscript --json --human mon_script.py
# Exclure les fichiers bruyants
cpscript --json --exclude jquery.min.js mon_script.html# Test de l'infrastructure
python3 IA/embed.py --check
# Télécharger le modèle si absent
python3 IA/embed.py --pull
# Recherche multi-langue
python3 IA/embed.py --search --collection code_assistant \
--top 10 "upload fichier IPFS"Astroport.ONE/
├── code_assistant # Script bash front-end (orchestration)
├── code_assistant_DOC.md # Cette documentation
├── cpscript # Extraction récursive .sh/.py/.html/.js/.css → JSON/texte
├── .assistant_rules # Règles projet (optionnel)
└── IA/
├── code_assistant.py # Backend Python (phases LLM + KV)
├── embed.py # Embeddings nomic-embed-text + Qdrant
└── ollama.me.sh # Connectivité Ollama (local/SSH/P2P)
<script_source>
│
▼
cpscript --json
│ JSON {files: [{path, content, extension}]}
▼
code_assistant (bash) — enrichissement
├── Profil auto (server/client) → supplement système
├── .assistant_rules → ajout au supplement
├── --test : dry run pytest/bats + coverage ast
│ → CODE_JSON {_test_results, _coverage_gaps}
├── --doc : diagnostic signatures ast vs .md
│ → CODE_JSON {_doc_issues}
│
▼ stdin = CODE_JSON enrichi
code_assistant.py
├── build_code_summary() → sections TEST/DOC/COVERAGE
├── _build_analyse_prompt(test_ctx, doc_ctx)
├── _build_controle_prompt(test_mode)
├── Qdrant search (embed.py) → contexte sémantique
├── Ollama LLM (phase: analyse/correction/controle)
├── Mémoire KV (save/load ~/.zen/flashmem/)
└── Qdrant index (embed.py) → mémorisation session
│
▼ stdout
code_assistant (bash)
├── Affichage coloré des propositions
├── Validation syntaxique (py/sh/json/js/html)
├── Vérification anti-destruction (taille < 70% → alerte)
├── Diff coloré + confirmation [Y/n]
├── Apprentissage des refus → Qdrant (collection ca_refusals)
└── Phase contrôle + --patch → exec direct (pas de copier-coller)
# Vérifier
curl -sf http://localhost:11434/api/tags | python3 -m json.tool
# Démarrer via ollama.me.sh (local → SSH → P2P)
bash IA/ollama.me.sh
# Forcer le mode local
ollama serve &# Télécharger tous les modèles recommandés
./code_assistant --setup
# Manuellement
ollama pull deepseek-r1:14b
ollama pull qwen2.5-coder:14b
ollama pull nomic-embed-text
# Vérifier l'embedding
python3 IA/embed.py --check# Tester cpscript seul
Astroport.ONE/cpscript --json --depth 1 mon_script.py 2>&1 | head -5
# Si erreur "Aucun contenu généré" :
# → Vérifier les --exclude (trop larges ?)
# → Essayer sans --only
# → Augmenter --maxtokenLe LLM n'a pas répondu au bon format. Consultez le log :
tail -50 ~/.zen/tmp/IA.logSolutions :
- Réduisez le contexte :
--maxtoken 16000ou--depth 1 - Reformulez via
--supplement - Relancez la phase
correctionavec un autre--choice
# Vérifier
curl -sf http://localhost:6333/health
# Démarrer Qdrant (volume unifié ~/.zen/qdrant-data)
docker start qdrant # si container existant
# ou, pour une nouvelle instance :
mkdir -p ~/.zen/qdrant-data
docker run -d -p 127.0.0.1:6333:6333 \
-v "$HOME/.zen/qdrant-data:/qdrant/storage:z" \
--name qdrant --restart always \
qdrant/qdrant
# Désactiver si non nécessaire
./code_assistant script.py --no-qdrant| Variable | Défaut | Description |
|---|---|---|
OLLAMA_HOST |
http://localhost:11434 |
URL du serveur Ollama |
QDRANT_URL |
http://localhost:6333 |
URL du serveur Qdrant |
CA_MAX_STDIN_MB |
500 |
Limite RAM pour le JSON entrant |
# Exemple avec Ollama distant
OLLAMA_HOST=http://192.168.1.100:11434 \
./code_assistant mon_script.py --kvbasename session1./code_assistant UPassport/routers/media_upload.py \
--kvbasename upload-audit \
--exclude my.sh \
--depth 2 \
--maxtoken 64000# Analyse avec contexte tests + doc
./code_assistant geo.py --kvbasename geo-v2 --test --doc
# Correction du problème le plus critique
./code_assistant geo.py --kvbasename geo-v2 \
--phase correction --choice 1
# Contrôle + non-régression + application directe
./code_assistant geo.py --kvbasename geo-v2 \
--phase controle --choice a --patch --test# Profil client détecté automatiquement (.html)
./code_assistant UPlanet/earth/index.html --kvbasename earth-ui
# Profil client + règles projet custom
cat > .assistant_rules << 'EOF'
jQuery 3.x uniquement — pas d'async/await.
Compatibilité Chrome 80+ et Firefox 78+.
EOF
./code_assistant UPlanet/earth/common.js --kvbasename earth-js#!/bin/bash
SCRIPT="mon_script.py"
SESSION="ci-$(date +%Y%m%d)"
# Analyse + choix automatique
./code_assistant "$SCRIPT" --kvbasename "$SESSION" \
--choice 1 --no-qdrant
# Correction variante minimale
./code_assistant "$SCRIPT" --kvbasename "$SESSION" \
--phase correction --choice 1
# Contrôle + patch automatique (stdin non-TTY)
echo "y" | ./code_assistant "$SCRIPT" --kvbasename "$SESSION" \
--phase controle --choice a --patchcode_assistant est l'outil souverain et hors-ligne d'Astroport.ONE.
Pour les phases de développement connectées, le capitaine peut utiliser
des interfaces visuelles plus riches. Voici les options recommandées :
Roo Code est une extension VSCode open-source qui offre une expérience similaire à Claude Code, avec support multi-modèle (Anthropic, OpenAI, Ollama…).
# 1. Installer VSCode si nécessaire
sudo apt install code # ou télécharger sur https://code.visualstudio.com
# 2. Installer l'extension Roo Code
# → Ouvrir VSCode > Extensions > chercher "Roo Code" > Installer
# → ou en ligne de commande :
code --install-extension RooVetGit.roo-cline
# 3. Configurer avec Ollama local (souverain, hors-ligne)
# → VSCode Settings > Roo Code > API Provider: Ollama
# → Base URL: http://localhost:11434
# → Lancer Ollama d'abord :
bash ~/.zen/Astroport.ONE/IA/ollama.me.sh
# 4. Configurer avec l'API Anthropic (connecté)
# → API Provider: Anthropic
# → Saisir votre clé API : https://console.anthropic.comAvantages Roo Code :
- Interface visuelle dans l'IDE avec diff coloré et approbation inline
- Gestion des fichiers multi-repo dans un seul workspace
- Support Ollama local → fonctionne hors-ligne avec les modèles de l'essaim
- Mémoire de projet via
.roo/(règles, contexte) - Compatible
.assistant_rules(même philosophie quecode_assistant)
Fichier de règles Roo (~/.zen/Astroport.ONE/.roo/rules/rules.md) :
# Règles Astroport.ONE pour Roo Code
- Stack : Bash/Python/HTML5/jQuery — PAS de frameworks JS modernes
- Bibliothèques JS via CDN <script src="..."> uniquement
- Respecter l'architecture ~/.zen/ existante
- Ne jamais modifier les fichiers de clés (*.seed, secret.june, .player)
- Tester avec bash -n (scripts) ou python3 -m py_compile (Python) avant tout patch# Créer les règles Roo pour Astroport.ONE
mkdir -p ~/.zen/Astroport.ONE/.roo/rules
cp ~/.zen/Astroport.ONE/.assistant_rules \
~/.zen/Astroport.ONE/.roo/rules/rules.md 2>/dev/null || \
cat > ~/.zen/Astroport.ONE/.roo/rules/rules.md << 'EOF'
Stack Bash/Python/HTML5/jQuery — PAS de frameworks JS modernes.
Bibliothèques JS via CDN uniquement.
Ne modifier aucun fichier de clés cryptographiques.
EOF🔗 Dépôt officiel : https://github.com/RooVetGit/Roo-Code
OpenCode est un assistant de code en ligne de commande (TUI), open-source, inspiré de Claude Code. Il fonctionne dans le terminal sans VSCode.
# Installation via npm (nécessite Node.js 18+)
sudo npm install -g opencode-ai
# Ou via cargo (Rust)
cargo install opencode
# Lancer dans un projet
cd ~/.zen/Astroport.ONE
opencode
# Configurer un modèle Ollama local
opencode config set provider ollama
opencode config set model qwen2.5-coder:14b
opencode config set base-url http://localhost:11434Avantages OpenCode :
- Interface TUI (terminal) — fonctionne en SSH sur une ♥BOX distante
- Pas besoin de VSCode installé
- Support natif Ollama → 100% local et souverain
- Gestion de conversation multi-tours avec contexte projet
- Compatible avec le workflow en 3 phases de
code_assistant
🔗 Dépôt officiel : https://github.com/sst/opencode
| Critère | code_assistant |
Roo Code (VSCode) | OpenCode (TUI) |
|---|---|---|---|
| Interface | Terminal bash | Graphique IDE | Terminal TUI |
| Hors-ligne | ✅ Ollama/P2P | ✅ si Ollama | ✅ si Ollama |
| Contexte Astroport | ✅ cpscript récursif | Manuel | Manuel |
| Mémoire Qdrant | ✅ intégrée | ❌ | ❌ |
| Accès SSH ♥BOX | ✅ | ❌ (besoin X11) | ✅ |
| Multi-fichiers | ✅ depth N | ✅ workspace | ✅ |
| Souveraineté | ✅✅ essaim swarm | ✅ si Ollama | ✅ si Ollama |
| Apprentissage refus | ✅ Qdrant | ❌ | ❌ |
Recommandation :
- Sur la ♥BOX en SSH →
code_assistantouopencode - Sur le poste de travail avec écran → Roo Code (VSCode)
- En production / maintenance →
code_assistant(souverain, sans dépendance cloud)
| Outil | Lien |
|---|---|
| Roo Code extension | https://marketplace.visualstudio.com/items?itemName=RooVetGit.roo-cline |
| Roo Code GitHub | https://github.com/RooVetGit/Roo-Code |
| OpenCode GitHub | https://github.com/sst/opencode |
| Ollama (moteur IA local) | https://ollama.ai |
| Astroport.ONE essaim | bash ~/.zen/Astroport.ONE/IA/ollama.me.sh SCAN |
Mis à jour le 2026-03-19 — Astroport.ONE / UPlanet
| Date | Fonctionnalité |
|---|---|
| 2026-03-19 | cpscript : support HTML/JS/CSS récursif (<script src>, import from, require) |
| 2026-03-19 | cpscript : --only html|js|css — filtres de type web |
| 2026-03-19 | code_assistant : sélection automatique du modèle avec le plus grand num_ctx (parallèle, ~0.5s) |
| 2026-03-19 | code_assistant : menu interactif station/modèle avant chaque lancement |
| 2026-03-19 | code_assistant : MAX_TOKEN calculé dynamiquement (80% du contexte réel du modèle) |