coder-leo
Un agent de programmation pour le terminal qui roule avec des modèles locaux. Il lit, écrit et modifie du code, lance des commandes, cherche dans un projet et tient une liste de tâches, dirigé par un modèle qui roule sur votre propre ordinateur par Ollama ou par tout serveur doté de l’API de clavardage d’OpenAI (LM Studio, llama-server, vLLM, mlx). Il travaille comme Claude Code, et il est conçu pour les petites fenêtres de contexte : il mesure la fenêtre, garde chaque résultat d’outil dans le budget, nettoie les anciens résultats, résume la conversation par morceaux quand il le faut, et donne au modèle des outils qui trouvent sans tout lire.
Installer
macOS, avec Homebrew, deux commandes, une seule fois :
brew tap leonardoaguiar/coder-leo https://leonardoaguiar.com/apps/coder-leo/tap.git
brew install leonardoaguiar/coder-leo/coder-leo
brew upgrade apporte les nouvelles versions, et coder-leo update aussi.
Linux (toute distribution, x86_64 ou ARM), Android dans Termux, et Windows dans WSL :
curl -fsSL https://leonardoaguiar.com/apps/coder-leo/install.sh | sh
Il choisit la version pour l’ordinateur, vérifie son SHA-256 publié et installe le binaire, la page de manuel et les complétions du shell dans /usr/local (en demandant sudo au besoin), dans ~/.local ou dans le dossier de Termux. Le relancer met à jour; sh -s -- --uninstall le retire.
Il vous faut aussi un serveur de modèles avec un modèle qui prend en charge les outils :
- Ollama (par défaut) :
ollama pull qwen2.5-coder:14b, ouqwen3,devstral,gpt-oss,llama3.1,mistral. coder-leo parle à127.0.0.1:11434, ou àOLLAMA_HOST. - LM Studio, llama-server, vLLM, mlx-lm ou tout serveur compatible OpenAI :
coder-leo --api openai --host http://127.0.0.1:1234.
Démarrer
Ouvrez un terminal dans un projet et lancez coder-leo. La première fois, choisissez un modèle dans la liste; il est mémorisé. Tapez ce que vous voulez; /help liste les commandes.
coder-leo une session dans ce dossier
coder-leo "add tests for parser" une session avec une première demande
coder-leo -p "explain main.go" une réponse, puis quitte (lit aussi stdin)
coder-leo -c reprend la dernière session d’ici
coder-leo --sessions choisit une session précédente
coder-leo --list les modèles installés
La boîte d’accueil montre le modèle, la fenêtre de contexte, le mode de permissions et le dossier. La ligne sous l’invite montre le mode, le modèle, le remplissage du contexte et la branche git.
Travailler avec lui
- Demandez des changements, pas des conseils. Il modifie les fichiers et lance la compilation ou les tests lui-même; il ne colle jamais de code à appliquer à la main.
- @chemin joint un fichier ou un dossier au message (Tab complète, avec recherche approximative). Un fichier trop gros pour la fenêtre entre sous forme de plan, et le modèle lit les parties dont il a besoin.
- !commande lance une commande shell et garde la sortie dans la conversation.
- #texte enregistre une note dans le
CLAUDE.mddu projet. - Échap ou Ctrl+C arrête la réponse. Ce que vous tapez entre-temps attend à l’invite suivante.
- Maj+Tab change le mode de permissions; Ctrl+O affiche ou masque la sortie complète des outils; Ctrl+T montre la liste de tâches; Échap Échap revient en arrière; Ctrl+R cherche dans l’historique; Ctrl+J insère une nouvelle ligne; un grand collage est replié en un marqueur.
- Les mots think, think hard et ultrathink dans une demande augmentent le raisonnement d’un modèle qui pense, pour ce tour.
Outils
Le modèle travaille par ces outils, nommés comme dans Claude Code (il comprend aussi les noms qu’emploient d’autres agents, comme read_file ou run_command) :
| Outil | Ce qu’il fait |
|---|---|
| Read | Un fichier, numéroté, avec offset et limit; les images pour les modèles avec vision; les PDF par pdftotext; les carnets en cellules. Un gros fichier lu en entier renvoie son plan et son début |
| Write, Edit | Crée un fichier; remplace un extrait exact (tolère les numéros de ligne copiés et les écarts d’indentation) |
| LS, Glob, Grep | Liste, trouve des fichiers par motif, cherche dans le contenu avec une expression régulière (contenu, noms de fichiers ou comptes, avec contexte) |
| Search | Les fichiers et lignes les plus pertinents pour une question en mots de tous les jours, classés d’après les mots des identifiants |
| Outline, RepoMap | Les fonctions et types d’un fichier; la carte du dépôt, classée selon ce que le code référence le plus |
| Bash, BashOutput, KillShell | Lance une commande avec un délai; les longues en arrière-plan |
| WebFetch, WebSearch | Une page en texte lisible; une recherche web |
| TodoWrite | La liste de tâches, affichée à mesure qu’elle change |
| Task | Un sous-agent avec sa propre fenêtre de contexte (explore, plan, general, review, ou le vôtre) qui ne renvoie que son rapport |
| Recall | Cherche dans toute la conversation, y compris ce qui a été résumé |
| AskUserQuestion, ExitPlanMode, Skill | Vous pose une question; présente un plan; charge une skill |
| mcp__serveur__outil | Les outils de vos serveurs MCP |
La fenêtre de contexte
Les modèles locaux ont de petites fenêtres (8k à 32k jetons est courant sur un ordinateur de 16 Go), et relire une longue invite coûte des secondes à chaque tour. coder-leo garde la fenêtre utile :
- Taille : choisie d’après la limite du modèle et la mémoire de l’ordinateur (
/ctxl’affiche,/ctx 32kou/ctx autola change). Le compte est une estimation corrigée par ce que le serveur rapporte. - Préfixe stable : l’invite système ne change pas pendant la session, donc le serveur réutilise sa cache au lieu de tout réévaluer.
- Résultats dans le budget : chaque résultat d’outil est coupé à ce qui entre; la sortie complète est enregistrée dans un fichier dont le modèle reçoit le chemin, à lire par morceaux ou à fouiller avec Grep.
- Nettoyage à 70 % : les anciens résultats d’outils deviennent des notes d’une ligne (les derniers restent entiers).
- Résumé à 85 %, ou
/compact [quoi garder]: un résumé structuré de passation remplace la conversation, en gardant les derniers tours tels quels; une conversation trop longue pour être résumée d’un coup est résumée par morceaux, puis fusionnée. La transcription reste sur le disque, et Recall y cherche. - Carte du dépôt : les fichiers les plus référencés et leurs symboles entrent dans l’invite système quand il y a de la place, pour que le modèle sache où sont les choses sans lire.
- /context montre ce qui occupe la fenêtre : invite système, schémas d’outils, messages, résultats, résultats nettoyés, espace libre.
Permissions
Quatre modes : default demande avant de modifier et de lancer des commandes; acceptEdits laisse passer les modifications dans le projet et demande pour les commandes; plan ne fait que lire, et le modèle présente un plan à approuver; yolo exécute tout sans demander, comme les premières versions, et c’est le mode par défaut sauf si vos réglages disent autre chose. Les commandes destructrices (supprimer des dossiers entiers, jeter du travail git, push forcé, sudo, supprimer des tables) demandent quand même en mode yolo; "guard": false dans les réglages désactive cela.
Les règles des réglages décident avant le mode : "allow": ["Bash(git *)", "Read"], "deny": ["Bash(rm *)"], "ask": ["Write"]. Répondre a à une demande de permission autorise cet outil pour la session; répondre avec des mots les envoie au modèle comme consignes.
Sessions
Chaque session est enregistrée à mesure dans ~/.config/coder-leo/sessions/<projet>/. coder-leo -c reprend la dernière, --resume <id> ou /resume en choisit une, /rename la nomme, /export l’écrit en Markdown. Avant chaque modification, le fichier reçoit un point de reprise : /rewind (ou Échap Échap) revient à un tour précédent, en restaurant les fichiers changés depuis et en coupant la conversation là.
Instructions, commandes, skills, agents
- CLAUDE.md ou AGENTS.md dans le projet (et dans les dossiers au-dessus, dans
~/.config/coder-leo/et dans~/.claude/) entrent dans l’invite système : conventions, commandes de compilation, ce qu’il faut éviter. Les lignes@cheminqu’ils contiennent importent d’autres fichiers./initdemande au modèle d’en écrire un./memoryliste ce qui est chargé. - Commandes personnalisées : des fichiers Markdown dans
.coder-leo/commands/(ou.claude/commands/, dans le projet ou le dossier personnel), lancés par/nom arguments.$ARGUMENTS,$1, `!commandeet@fichiersont développés; l’en-tête peut fixerdescription,argument-hint,allowed-toolsetmodel`. - Skills :
.coder-leo/skills/<nom>/SKILL.md(ou.claude/skills/), listées au modèle avec leur description; il en charge une avec l’outil Skill quand la tâche correspond, ou vous lancez/nom. - Sous-agents :
.coder-leo/agents/<nom>.md(ou.claude/agents/) avecname,description,toolsetmodeldans l’en-tête et l’invite système dans le corps; l’outil Task les lance. D’origine : explore, plan, general, review. - Hooks : des commandes shell autour des événements (SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop, SubagentStop, PreCompact, SessionEnd), avec l’événement en JSON sur stdin; un code de sortie 2 bloque avec le motif, et une réponse JSON peut autoriser, refuser ou ajouter du contexte. Le même protocole que Claude Code.
- MCP : des serveurs depuis
.mcp.json(projet ou dossier personnel) oumcpServersdans les réglages, en stdio ou HTTP; leurs outils apparaissent commemcp__serveur__outilet leurs prompts comme des commandes./mcples liste.
Réglages
~/.config/coder-leo/settings.json, puis .coder-leo/settings.json et .coder-leo/settings.local.json dans le projet, chacun ayant priorité sur le précédent; puis l’environnement (CODER_MODEL, CODER_API, CODER_HOST ou OLLAMA_HOST, CODER_API_KEY).
{
"model": "qwen2.5-coder:14b",
"api": "ollama",
"numCtx": 16384,
"think": "low",
"permissions": { "mode": "default", "allow": ["Bash(git *)"], "guard": true },
"compact": { "micro": 0.7, "full": 0.85, "keepRecent": 6 },
"repoMap": { "enabled": true, "budget": 3000 },
"tools": { "minimal": false, "disabled": ["WebSearch"] },
"hooks": { "PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "./check.sh" }] }] },
"mcpServers": { "fs": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "."] } },
"statusLine": { "command": "~/.config/coder-leo/status.sh" },
"notify": "bell"
}
/config montre ce qui est en vigueur et d’où ça vient; /doctor vérifie le serveur, le modèle, la mémoire et la configuration.
Sans terminal
coder-leo -p "demande" répond une fois : la réponse sur stdout, tout le reste sur stderr. --output-format json imprime un objet avec le résultat, l’identifiant de session et les comptes de jetons; --output-format stream-json imprime un événement JSON par ligne à mesure que les choses se passent. --max-turns, --allowedTools, --disallowedTools, --system-prompt, --append-system-prompt et --mode façonnent l’exécution; -c ou --resume reprennent une session.
Confidentialité
Tout roule sur votre ordinateur : le modèle, les fichiers, la conversation. Le programme n’accède au réseau que lorsque le modèle appelle WebFetch ou WebSearch pour votre tâche (avec une demande de permission, hors mode yolo), lorsque vous configurez un serveur MCP qui sort sur Internet, et lorsque vous lancez coder-leo update. Pas de compte, pas de télémétrie, rien n’est envoyé nulle part.
Mises à jour
coder-leo update vérifie sur le site s’il existe une version plus récente et l’installe (par Homebrew pour une copie Homebrew); coder-leo update --check se contente de le dire. Le programme ne vérifie jamais de lui-même.
Aide et signalement de bogues
Problèmes et idées : l’adresse d’assistance au bas de la page coder-leo. Indiquez le modèle, le serveur, coder-leo version et la sortie de /doctor.