bots-garden/mini-mepublic Fork
⑂ feature/wasm-custom-tools
Commits
⬇ Clone ▾
git clone https://git.rickub.com/bots-garden/mini-me.git
git clone ssh://git@rickub.com/bots-garden/mini-me.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP
🛟 Updated. d56bc20 · on feature/wasm-custom-tools · k33g · yesterday
cli.md · 199 lines · 22.8 KBmarkdown
Blame HistoryOpen raw

Référence : ligne de commande

Description neutre de l'exécutable mm : options, argument positionnel, variables d'environnement, sortie de démarrage et codes de sortie.

Invocation

mm [-config <chemin>] [-acp] [-tui] [-prompt <texte>|-p <texte>] [--version] [--about] [<chemin>]
mm [-config <chemin>] --ask <agent> [-p <question>]              (question sur stdin sans -p)
mm [-config <chemin>] --ask-with-context <agent> [-p <question>] (contexte sur stdin)
mm init [options]                                                (écrire un nouvel agent.yaml ; aussi mm --init)
mm tui [<chemin>] [options]                                      (identique à mm -tui)
mm acp [<chemin>] [options]                                      (identique à mm -acp)
Élément Type Défaut Description
-config <chemin> chaîne "" Chemin du fichier de configuration YAML.
<chemin> positionnel aucun Équivalent de -config quand -config n'est pas donné. Un second argument positionnel est une erreur. Un premier argument init, tui ou acp est un mot de mode, pas un chemin : un fichier de configuration portant l'un de ces noms se donne en ./tui ou avec -config.
-acp booléen false Sert l'Agent Client Protocol sur stdin/stdout au lieu du REPL du terminal. S'écrit aussi --acp, ou acp en premier argument (mm acp agent.yaml).
-tui booléen false Ouvre le mode fenêtre unique (conversation en haut, zone de saisie en bas). Même effet que tui: true dans le YAML ; ignoré avec -acp. Retombe sur le mode ligne quand stdin ou stdout n'est pas un terminal. S'écrit aussi --tui, ou tui en premier argument (mm tui agent.yaml).
-prompt <texte> / -p <texte> chaîne "" Exécute une seule invite et quitte. Le texte de l'invite est obligatoire. Fonctionne avec le fichier de config avant ou après : mm -p "bonjour" config.yaml et mm config.yaml -p "bonjour" sont tous deux valides. Pas de bannière, pas de persistance de session, pas de TUI/ACP.
--version bool false Affiche la version et quitte, avant la lecture de la configuration. -version est la même option.
--about bool false Affiche ce qu'est mm — un écran : version, les trois façades, les outils, les serveurs de modèles, où vivent le projet et la documentation — puis quitte, avant la lecture de la configuration.
--ask <agent> chaîne "" Pose une question à l'agent <agent> (une clé de mmConfigs) et quitte ; voir Spécificités du mode ask. Comme -p, fonctionne avec le fichier de configuration avant ou après : mm agent.yaml --ask lucy -p "…" et mm --ask lucy -p "…" agent.yaml sont tous deux valides.
--ask-with-context <agent> chaîne "" Pareil, en envoyant avant la question une conversation lue sur stdin.
-h — — Affiche l'usage des options et quitte.

Version

mm --version (ou -version) affiche une ligne puis quitte, avant même de chercher le fichier de configuration — la réponse arrive donc depuis n'importe quel répertoire, sans serveur de modèle démarré :

mm v0.1.7 (go1.26.5, darwin/arm64)

mm --about affiche la même version à l'intérieur d'une courte description du programme. La version ouvre aussi la bannière de démarrage (mm v0.1.7 | config: …), que le mode fenêtre conserve comme première ligne de la conversation, et figure dans la barre d'état de la fenêtre avant les compteurs.

D'où elle vient Ce que vous voyez
Un binaire de release, estampillé à la construction par 02-build-releases.sh Le tag : v0.1.7
Installé par go install depuis une version taguée Ce tag
Construit à la main depuis un arbre de travail (go build, ./install.sh) Le commit court, 9073268, suivi de +dirty si l'arbre avait des modifications non validées
Construit avec -buildvcs=false unknown

Résolution du fichier de configuration

La première source existante gagne.

Ordre Source Fichier absent
1 Option -config ou argument positionnel Erreur, code de sortie 1
2 Variable d'environnement AGENT_CONFIG Erreur, code de sortie 1
3 ./agent.yaml Pas une erreur : les valeurs par défaut intégrées sont utilisées, la bannière affiche config: built-in defaults

Variables d'environnement

Variable Effet
AGENT_CONFIG Chemin du fichier de configuration (voir ci-dessus).
AGENT_PROVIDER Surcharge la clé provider.
AGENT_MODEL Surcharge la clé model.
AGENT_BASE_URL Surcharge baseUrl et désactive la sonde de repli.
DMR_BASE_URL Comme AGENT_BASE_URL, pour le fournisseur dmr seulement ; AGENT_BASE_URL gagne quand les deux sont définies.
AGENT_SESSIONS off désactive l'enregistrement des sessions pour cette exécution, quoi que dise sessions.enabled. Posée par /ask sur les agents qu'il lance.
AGENT_TRACE Surcharge trace.enabled : true ou false (toute graphie acceptée par strconv.ParseBool ; toute autre valeur est une erreur de configuration). Héritée par les agents que lancent /ask et ask_agent.
AGENT_YOLO Surcharge la clé yolo : true ou false (toute graphie acceptée par strconv.ParseBool ; toute autre valeur est une erreur de configuration). Posée à false par /ask et ask_agent sur les agents qu'ils lancent, pour que le côté qui interroge décide (le yolo de l'entrée mmConfigs de l'agent, sinon celui de l'agent qui interroge).
AGENT_ASK_USER Surcharge la clé askUserTool : true ou false (toute écriture acceptée par strconv.ParseBool ; autre chose est une erreur de configuration). Positionnée par /ask et ask_agent sur l'agent qu'ils démarrent quand l'entrée mmConfigs de celui qui interroge a askUser ; la valeur propre de celui qui interroge n'est jamais transmise.
MM_BIN Posée par mm dans son propre environnement, dont héritent tous les processus qu'il lance — les commandes de son outil bash, ses hooks : le chemin du binaire mm en cours.
MM_CONFIG Posée par mm dans son propre environnement, comme MM_BIN, quand un fichier de configuration a été lu : le chemin absolu de son fichier de configuration. Lue par --ask / --ask-with-context quand ni -config ni chemin positionnel ne sont donnés.
MM_ASK_DEPTH Nombre de niveaux de /ask au-dessus de cet agent (absente = 0). Posée par /ask ; à 2, /ask est refusée.
Variable nommée par apiKeyEnv Contient la clé d'API. Nom par défaut : aucun pour dmr, LLAMA_API_KEY pour llamacpp, LLMMAN_API_KEY pour llmman, OLLAMA_API_KEY pour ollama.

Sortie de démarrage

Affichée sur stdout en mode terminal, sur stderr en mode ACP. Grisée quand stdout est un terminal.

Ligne Contenu
[warning: …] Zéro ou plusieurs avertissements de la sonde : serveur injoignable, modèle absent de la liste du serveur, pas de template de chat, compression qui ne peut jamais se déclencher, aucun outil déclaré, un fichier de mmConfigs introuvable (mmConfigs: <name> → <path> not found — /ask-<name> will fail), la clé obsolète permissions.
mm <version> | config: … | provider: … | model: … | ctx: … | tools: … | skills: N | yolo: …[ | agents.md: …][ | trace: …][ | hooks: …] Version (voir ci-dessus), chemin de la configuration, nom du fournisseur, identifiant du modèle, fenêtre de contexte avec son origine (config, /props) ou unknown, noms des outils déclarés, nombre de skills trouvés, yolo: on ou yolo: off (tools ask)., et, tant que trace.enabled est actif, trace: <répertoire absolu> (trace: <session cwd>/<dir> en mode ACP). hooks: (quand la configuration en déclare) : <événement>×<nombre> par événement qui a des hooks, par exemple hooks: preGeneration×1 preToolCall×2 — voir les hooks. agents.md: (avec agentsMd.enabled) : <chemin absolu> (~N tokens) quand le fichier du projet est lu, skipped (too long) au-delà de agentsMd.maxChars, ignored (structured output) pour un agent avec structuredOutput, <session cwd>/<chemin> en mode ACP ; absent quand il n'y a pas de fichier. Un fichier lu qui occupe 20 % ou plus d'une fenêtre de contexte connue ajoute l'avertissement <chemin> is ~N tokens, X % of the W-token context window — every request carries it ….
Agent ready. Commands: … Mode terminal seulement.
Shortcut: Ctrl+C … Mode terminal seulement.
sessions: saved under <dir>[ · N earlier — /resume to continue the latest, /sessions to list] Mode terminal, avec sessions.enabled seulement : le répertoire de sessions résolu et le nombre de sessions qu'il contient déjà.

Exemple

[warning: llamacpp: nothing answers at http://127.0.0.1:8080/v1 — start it: llama-server -m <model.gguf> --jinja --port 8080]
mm v0.1.7 | config: agent.llamacpp.yaml | provider: llamacpp | model: jetbrains/mellum2-12b-a2.5b-instruct-gguf-q4_k_m:Q4_K_M | ctx: unknown | tools: bash, read_file, write_file, edit_file | skills: 0 | yolo: on

Spécificités du mode ACP

Aspect Comportement
stdout Messages JSON-RPC 2.0 uniquement, un par ligne.
stderr Bannière, avertissements, trace [acp] …, journaux du SDK.
Spinner Désactivé.
skillsDir relatif Résolu par rapport au répertoire du fichier de configuration, quand un fichier a été trouvé ; sinon depuis le répertoire de travail, comme en mode terminal.
Permissions yolo: true : aucune session/request_permission n'est envoyée pour les outils intégrés. yolo: false : une par appel, avec quatre options — allow (autoriser une fois), allow_always (cet outil pour la session), reject (refuser une fois), never (reject_always : cet outil, pour la session). Les outils MCP marqués ask en envoient toujours une.

Spécificités du mode ligne

Aspect Comportement
Permissions Avec yolo: false (et pour les outils MCP marqués ask), après la ligne 🛠️ de l'outil : 🔐 <titre de l'outil>, la légende [a] allow once · [s] allow <outil> for this session · [r] reject · [n] never <outil> et ?. La ligne tapée ensuite répond (a, s, r, n ou les mots once, session, reject, never) ; une autre réponse réaffiche la légende ; une ligne commençant par / est une commande (/abort, /quit), pas une réponse. Ctrl+C ou /abort refuse et arrête le tour. La même invite répond aux appels d'un agent interrogé avec /ask.

Spécificités du mode fenêtre

Aspect Comportement
Sélection Option -tui, ou tui: true dans le YAML ; -acp l'emporte sur les deux.
Vérification du terminal stdin et stdout doivent tous deux être des périphériques caractère. Sinon [tui: stdin or stdout is not a terminal — running the line mode] est affiché et le mode ligne s'exécute, bannière comprise.
Écran L'écran alternatif du terminal, rendu à la sortie ; l'historique de défilement du terminal n'est pas écrit.
Bannière Non affichée sur stdout ; montrée comme première ligne de la conversation.
Spinner Désactivé ; la règle sous la conversation s'anime à sa place.
Nom du modèle L'en-tête affiche une forme courte de l'identifiant : hôte du registre et organisation retirés, suffixe de format -gguf retiré, tag conservé, plafonné à 28 caractères (huggingface.co/unsloth/qwen3.5-2b-gguf:Q4_K_M → qwen3.5-2b:Q4_K_M). L'identifiant complet figure dans la bannière de démarrage, que la fenêtre conserve comme première ligne de la conversation.
Disposition Ligne d'en-tête (agent, modèle @ fournisseur, usage du contexte en ctx N% (utilisé/fenêtre) ou ctx ~utilisé (window unknown), session <id> quand les sessions sont actives) ; conversation avec barre de défilement ; règle avec l'état et les rappels de touches ; zone de saisie de 3 lignes ; barre d'état (F1 help · Ctrl-Y copy · F2 mouse: … · Ctrl-C quit à gauche, <version> · N msgs · N tools à droite — la version disparaît quand les deux côtés ne tiennent pas, pour que les rappels de touches ne soient jamais tronqués à cause d'elle).
Appels d'outils ‣ <outil> <détail> <statut> <durée> où le statut est … pending, … waiting for permission, … running, ✓ done ou ✗ failed ; sortie repliée à previewLines lignes (… N more line(s)) ; lignes +/- des sorties de write_file/edit_file colorées.
Sélecteurs / complète une commande, @ un chemin sous le répertoire de travail, $ un skill du catalogue — les deux derniers n'importe où dans une phrase, en conservant leur préfixe. Voir Commandes slash.
Réflexion Le raisonnement d'un modèle à raisonnement forme son entrée ‣ thinking, grisée, en italique et d'une autre couleur, avant la réponse. Masquée avec showThinking: false.
Erreurs Une ligne [error: <explication>] ; un tour annulé affiche 🛑 Generation aborted. ; chaque tour se termine par ⚙ N command(s) [· 📝 N file op(s)] [· 📖 N skill(s)].
Permissions Avec yolo: false (et pour les outils MCP marqués ask), la zone affiche ? <titre de l'outil> et [a] allow once [s] allow <outil> for this session [r] reject [n] never <outil> jusqu'à la réponse (Échap = r) ; un tour annulé pendant la question refuse.
Touches Voir Commandes slash — touches du mode fenêtre.
Souris Non capturée au démarrage, donc le cliquer-glisser du terminal sélectionne du texte. F2 la capture (défilement à la molette ; Maj+glisser sélectionne) puis la rend.

Spécificités du mode invite

Aspect Comportement
Exécution Exécute un seul cycle de génération puis quitte. Pas de REPL, pas de persistance de session.
Sortie Affiche les statistiques d'appels d'outils et la réponse du modèle, puis quitte. Même affichage que le mode ligne (⚙ commandes, 📝 opérations sur fichiers, 📖 skills, 🔎 appels LSP).
Bannière Non affichée.
Session Non sauvegardée ; aucun répertoire de sessions utilisé.
Fichier de config Peut apparaître avant ou après le flag -prompt/-p : mm -p "prompt" config.yaml et mm config.yaml -p "prompt" fonctionnent tous deux.
Compatibilité Incompatible avec -acp et -tui ; le mode invite prend la priorité et s'exécute dans tous les cas.
Permissions Personne ne peut répondre. Avec yolo: false, chaque appel qui demanderait est refusé ([command rejected by the user] pour le modèle) et stderr le dit une fois : [yolo is off and this mode cannot ask: tool calls that need a confirmation are rejected — set yolo: true to let them run]. Les outils MCP marqués ask sont refusés de la même façon, quoi que dise yolo.
Avec structuredOutput stdout porte la réponse JSON et un saut de ligne, rien d'autre : pas de texte en flux, pas de 🤖, pas de ligne de statistiques. Les messages vont sur stderr. Une réponse en échec ou invalide imprime [structured output: <erreur>] sur stderr, rien sur stdout, et sort avec le code 1 ; une réponse valide sort avec le code 0. Voir structuredOutput.

Spécificités du mode ask

Aspect Comportement
Configuration -config, le chemin positionnel, puis MM_CONFIG, puis la résolution habituelle. Le nom de l'agent est cherché dans les mmConfigs de ce fichier. Aucun moteur n'est démarré pour le modèle propre à cette configuration.
Question -p <question> ; sans -p, tout stdin.
Contexte (--ask-with-context) stdin. Sans -p, stdin contient <contexte>, une ligne ---, puis la question.
stdout La réponse de l'agent, et rien d'autre, suivie d'un saut de ligne.
stderr 🗣 asking <agent> (<fournisseur>/<modèle>)…, une ligne 🛠️ <agent> · <outil>: <arguments> par appel d'outil, [ask: …] en cas d'erreur.
Appels d'outils de l'agent Décidés par le yolo de l'entrée mmConfigs de l'agent s'il est fixé, sinon par le yolo de cette configuration : true = autorisés ; false = refusés, avec la même ligne sur stderr qu'en mode invite (stdin portait la question, personne ne peut répondre).
Processus parent Surveillé toutes les 500 ms : s'il disparaît, la demande est annulée et l'agent arrêté.
Session Aucune : ni ce processus ni l'agent n'écrivent de fichier de session.

mm init — l'assistant agent.yaml

mm init et mm --init (aussi -init) écrivent un nouvel agent.yaml commenté. Ils sont traités avant toute lecture de configuration. Chaque question ci-dessous a une option ; une question dont l'option est donnée n'est pas posée. Voir Créer un agent avec mm init.

Option Question quand elle est absente Défaut
--provider Serveur de modèles : llmman, ollama, dmr, llamacpp, openai le premier serveur local qui répond, sinon llmman (openai n'est jamais sondé : son adresse par défaut est l'API d'OpenAI)
--base-url — (pas posée) l'adresse du fournisseur, ou son adresse de secours quand elle ne répond pas
--model Modèle : la liste des modèles du serveur (/api/tags pour llmman et Ollama, /models pour les autres), ou un nom à taper quand le serveur ne répond pas le premier de la liste
--family Famille du modèle détectée d'après le nom du modèle, puis d'après le nom de famille donné par le serveur
--usage À quoi sert l'agent : developer, reviewer, translator, writer, assistant, researcher, docs, json, coordinator developer
--machine Quelle machine fait tourner le modèle : small, medium, large small
--yolo yes|no Demander avant chaque commande ou modification de fichier ? — seulement pour les usages avec bash, les outils de fichiers ou fetch_content celui de l'usage
--name Nom de l'agent (acp.name) le nom de l'usage
-o, --output Fichier à écrire (- = sortie standard) agent.yaml
--check — désactivé ; activé : après l'écriture, lance ce mm avec -config <fichier> -p "Say hello in one line." et indique si le modèle a répondu (5 min au plus)
--yes — désactivé ; activé : rien n'est demandé, chaque réponse manquante prend son défaut
--line — désactivé ; activé : les questions sont posées ligne par ligne même dans un terminal
Aspect Comportement
Fenêtre Quand l'entrée et la sortie standard sont des terminaux (et ni --yes ni --line) : une fenêtre plein écran — les étapes (✓ répondue, ▸ en cours, · à venir, chaque réponse à côté de son étape), la question avec la description du choix surligné, et le fichier tel qu'il serait écrit avec ce choix (aperçu à côté de la question à partir de 100 colonnes, à sa place avec Tab en dessous). Touches : ↑ ↓ Début Fin choisissent, Entrée répond, y / n répondent à la question oui ou non, Échap reprend la réponse précédente (les réponses données par option sont sautées), PgUp PgDn font défiler l'aperçu, Ctrl-U efface une réponse de texte, Ctrl-C quitte sans rien écrire (nothing written, code 1). Une réponse refusée s'affiche sur le trait du bas. Quand toutes les questions ont une réponse, Entrée écrit le fichier.
Mode ligne Sinon : une question par ligne, choix numérotés ; un numéro, le texte d'une option ou un autre texte y répond ; une ligne vide ou /skip prend le défaut. Les usages et les machines sont d'abord listés avec une description d'une ligne.
Faits sur le modèle llmman et Ollama : POST /api/show — la fenêtre native, l'échantillonnage du GGUF (general.sampling.*, les paramètres du Modelfile d'Ollama), l'interrupteur de raisonnement du chat template (enable_thinking, reasoning_effort) et son défaut. llama-server : GET /props — n_ctx et le chat template. Docker Model Runner et openai : rien — la table des familles décide ; openai liste ses modèles avec OPENAI_API_KEY.
Origine de chaque valeur Les faits du serveur, puis la table des familles, puis l'usage, puis la ligne de la machine ; la table est internal/agentinit/presets.yaml, chaque entrée avec sa source.
Échantillonnage Raisonnement activé (l'usage le demande et le modèle a un interrupteur) : l'échantillonnage « thinking » de la famille, jamais une température sous 0,6, max_tokens: 16384. Raisonnement désactivé : l'échantillonnage général de la famille, ou sa température « précise » pour les usages qui utilisent beaucoup d'outils, max_tokens: 4096. L'échantillonnage du GGUF remplace celui de la famille. parallel_tool_calls: false dès qu'un outil est actif.
Fichier écrit Chaque valeur précédée d'un commentaire qui dit pourquoi elle a cette valeur ; contextWindow: 0 (mm demande au serveur), avec la fenêtre native en commentaire ; context.threshold: 75 ; le prompt système en anglais de l'usage ; pour docs un bloc docSearch, pour json un exemple de structuredOutput et tous les outils désactivés, pour coordinator un exemple commenté de mmConfigs.
Fichier existant Jamais écrasé : ⚠️ <fichier> already exists — nothing was written; choose another name with -o, code de sortie 1, avant toute question.
Après l'écriture Le fichier est chargé comme mm charge une configuration ; une erreur est affichée et le code de sortie vaut 1.
Codes de sortie 0 écrit (et vérifié) ; 1 fournisseur, usage ou machine inconnu, pas de modèle, fichier existant, fichier que mm ne charge pas, vérification en échec ; 2 option invalide.

Codes de sortie

Code Cause
0 /quit, Ctrl+C à l'invite, fin de stdin, ou le client ACP a fermé la connexion. --ask : l'agent a répondu.
1 Plus d'un argument positionnel ; erreur de chargement de la configuration ; erreur d'initialisation du moteur (fournisseur inconnu, clé requise absente). --ask : pas de question, pas de contexte, agent inconnu, l'agent a échoué ou n'a rien répondu.
130 --ask : interrompu (Ctrl+C, ou le processus parent a disparu).

Compilation et installation

Commande Effet
go build -o mm . Compile le binaire dans le répertoire courant.
./install.sh Compile mm et le copie dans /usr/local/bin, avec sudo si le répertoire n'est pas accessible en écriture.
go test ./... Lance les tests unitaires.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# Référence : ligne de commande

> Description neutre de l'exécutable `mm` : options, argument positionnel, variables d'environnement, sortie de démarrage et codes de sortie.

## Invocation

```
mm [-config <chemin>] [-acp] [-tui] [-prompt <texte>|-p <texte>] [--version] [--about] [<chemin>]
mm [-config <chemin>] --ask <agent> [-p <question>]              (question sur stdin sans -p)
mm [-config <chemin>] --ask-with-context <agent> [-p <question>] (contexte sur stdin)
mm init [options]                                                (écrire un nouvel agent.yaml ; aussi mm --init)
mm tui [<chemin>] [options]                                      (identique à mm -tui)
mm acp [<chemin>] [options]                                      (identique à mm -acp)
```

| Élément | Type | Défaut | Description |
|---------|------|--------|-------------|
| `-config <chemin>` | chaîne | `""` | Chemin du fichier de configuration YAML. |
| `<chemin>` | positionnel | aucun | Équivalent de `-config` quand `-config` n'est pas donné. Un second argument positionnel est une erreur. Un premier argument `init`, `tui` ou `acp` est un mot de mode, pas un chemin : un fichier de configuration portant l'un de ces noms se donne en `./tui` ou avec `-config`. |
| `-acp` | booléen | `false` | Sert l'Agent Client Protocol sur stdin/stdout au lieu du REPL du terminal. S'écrit aussi `--acp`, ou `acp` en premier argument (`mm acp agent.yaml`). |
| `-tui` | booléen | `false` | Ouvre le mode fenêtre unique (conversation en haut, zone de saisie en bas). Même effet que `tui: true` dans le YAML ; ignoré avec `-acp`. Retombe sur le mode ligne quand stdin ou stdout n'est pas un terminal. S'écrit aussi `--tui`, ou `tui` en premier argument (`mm tui agent.yaml`). |
| `-prompt <texte>` / `-p <texte>` | chaîne | `""` | Exécute une seule invite et quitte. Le texte de l'invite est obligatoire. Fonctionne avec le fichier de config avant ou après : `mm -p "bonjour" config.yaml` et `mm config.yaml -p "bonjour"` sont tous deux valides. Pas de bannière, pas de persistance de session, pas de TUI/ACP. |
| `--version` | bool | `false` | Affiche la version et quitte, avant la lecture de la configuration. `-version` est la même option. |
| `--about` | bool | `false` | Affiche ce qu'est `mm` — un écran : version, les trois façades, les outils, les serveurs de modèles, où vivent le projet et la documentation — puis quitte, avant la lecture de la configuration. |
| `--ask <agent>` | chaîne | `""` | Pose une question à l'agent `<agent>` (une clé de `mmConfigs`) et quitte ; voir [Spécificités du mode ask](#spécificités-du-mode-ask). Comme `-p`, fonctionne avec le fichier de configuration avant ou après : `mm agent.yaml --ask lucy -p "…"` et `mm --ask lucy -p "…" agent.yaml` sont tous deux valides. |
| `--ask-with-context <agent>` | chaîne | `""` | Pareil, en envoyant avant la question une conversation lue sur stdin. |
| `-h` | — | — | Affiche l'usage des options et quitte. |

## Version

`mm --version` (ou `-version`) affiche une ligne puis quitte, avant même de chercher le fichier de configuration — la réponse arrive donc depuis n'importe quel répertoire, sans serveur de modèle démarré :

```
mm v0.1.7 (go1.26.5, darwin/arm64)
```

`mm --about` affiche la même version à l'intérieur d'une courte description du programme. La version ouvre aussi la bannière de démarrage (`mm v0.1.7 | config: …`), que le mode fenêtre conserve comme première ligne de la conversation, et figure dans la barre d'état de la fenêtre avant les compteurs.

| D'où elle vient | Ce que vous voyez |
|---|---|
| Un binaire de release, estampillé à la construction par `02-build-releases.sh` | Le tag : `v0.1.7` |
| Installé par `go install` depuis une version taguée | Ce tag |
| Construit à la main depuis un arbre de travail (`go build`, `./install.sh`) | Le commit court, `9073268`, suivi de `+dirty` si l'arbre avait des modifications non validées |
| Construit avec `-buildvcs=false` | `unknown` |

## Résolution du fichier de configuration

La première source existante gagne.

| Ordre | Source | Fichier absent |
|-------|--------|----------------|
| 1 | Option `-config` ou argument positionnel | Erreur, code de sortie 1 |
| 2 | Variable d'environnement `AGENT_CONFIG` | Erreur, code de sortie 1 |
| 3 | `./agent.yaml` | Pas une erreur : les valeurs par défaut intégrées sont utilisées, la bannière affiche `config: built-in defaults` |

## Variables d'environnement

| Variable | Effet |
|----------|-------|
| `AGENT_CONFIG` | Chemin du fichier de configuration (voir ci-dessus). |
| `AGENT_PROVIDER` | Surcharge la clé `provider`. |
| `AGENT_MODEL` | Surcharge la clé `model`. |
| `AGENT_BASE_URL` | Surcharge `baseUrl` et désactive la sonde de repli. |
| `DMR_BASE_URL` | Comme `AGENT_BASE_URL`, pour le fournisseur `dmr` seulement ; `AGENT_BASE_URL` gagne quand les deux sont définies. |
| `AGENT_SESSIONS` | `off` désactive l'enregistrement des sessions pour cette exécution, quoi que dise `sessions.enabled`. Posée par `/ask` sur les agents qu'il lance. |
| `AGENT_TRACE` | Surcharge `trace.enabled` : `true` ou `false` (toute graphie acceptée par `strconv.ParseBool` ; toute autre valeur est une erreur de configuration). Héritée par les agents que lancent `/ask` et `ask_agent`. |
| `AGENT_YOLO` | Surcharge la clé `yolo` : `true` ou `false` (toute graphie acceptée par `strconv.ParseBool` ; toute autre valeur est une erreur de configuration). Posée à `false` par `/ask` et `ask_agent` sur les agents qu'ils lancent, pour que le côté qui interroge décide (le `yolo` de l'entrée `mmConfigs` de l'agent, sinon celui de l'agent qui interroge). |
| `AGENT_ASK_USER` | Surcharge la clé `askUserTool` : `true` ou `false` (toute écriture acceptée par `strconv.ParseBool` ; autre chose est une erreur de configuration). Positionnée par `/ask` et `ask_agent` sur l'agent qu'ils démarrent quand l'entrée `mmConfigs` de celui qui interroge a `askUser` ; la valeur propre de celui qui interroge n'est jamais transmise. |
| `MM_BIN` | Posée par `mm` dans son propre environnement, dont héritent tous les processus qu'il lance — les commandes de son outil `bash`, ses hooks : le chemin du binaire `mm` en cours. |
| `MM_CONFIG` | Posée par `mm` dans son propre environnement, comme `MM_BIN`, quand un fichier de configuration a été lu : le chemin absolu de son fichier de configuration. Lue par `--ask` / `--ask-with-context` quand ni `-config` ni chemin positionnel ne sont donnés. |
| `MM_ASK_DEPTH` | Nombre de niveaux de `/ask` au-dessus de cet agent (absente = 0). Posée par `/ask` ; à 2, `/ask` est refusée. |
| Variable nommée par `apiKeyEnv` | Contient la clé d'API. Nom par défaut : aucun pour `dmr`, `LLAMA_API_KEY` pour `llamacpp`, `LLMMAN_API_KEY` pour `llmman`, `OLLAMA_API_KEY` pour `ollama`. |

## Sortie de démarrage

Affichée sur stdout en mode terminal, sur stderr en mode ACP. Grisée quand stdout est un terminal.

| Ligne | Contenu |
|-------|---------|
| `[warning: …]` | Zéro ou plusieurs avertissements de la sonde : serveur injoignable, modèle absent de la liste du serveur, pas de template de chat, compression qui ne peut jamais se déclencher, aucun outil déclaré, un fichier de `mmConfigs` introuvable (`mmConfigs: <name> → <path> not found — /ask-<name> will fail`), la clé obsolète `permissions`. |
| `mm <version> \| config: … \| provider: … \| model: … \| ctx: … \| tools: … \| skills: N \| yolo: …[ \| agents.md: …][ \| trace: …][ \| hooks: …]` | Version (voir ci-dessus), chemin de la configuration, nom du fournisseur, identifiant du modèle, fenêtre de contexte avec son origine (`config`, `/props`) ou `unknown`, noms des outils déclarés, nombre de skills trouvés, `yolo: on` ou `yolo: off (tools ask)`., et, tant que `trace.enabled` est actif, `trace: <répertoire absolu>` (`trace: <session cwd>/<dir>` en mode ACP). `hooks:` (quand la configuration en déclare) : `<événement>×<nombre>` par événement qui a des hooks, par exemple `hooks: preGeneration×1 preToolCall×2` — voir [les hooks](hooks.md#bannière-de-démarrage). `agents.md:` (avec `agentsMd.enabled`) : `<chemin absolu> (~N tokens)` quand le fichier du projet est lu, `skipped (too long)` au-delà de `agentsMd.maxChars`, `ignored (structured output)` pour un agent avec `structuredOutput`, `<session cwd>/<chemin>` en mode ACP ; absent quand il n'y a pas de fichier. Un fichier lu qui occupe 20 % ou plus d'une fenêtre de contexte connue ajoute l'avertissement `<chemin> is ~N tokens, X % of the W-token context window — every request carries it …`. |
| `Agent ready. Commands: …` | Mode terminal seulement. |
| `Shortcut: Ctrl+C …` | Mode terminal seulement. |
| `sessions: saved under <dir>[ · N earlier — /resume to continue the latest, /sessions to list]` | Mode terminal, avec `sessions.enabled` seulement : le répertoire de sessions résolu et le nombre de sessions qu'il contient déjà. |

### Exemple

```
[warning: llamacpp: nothing answers at http://127.0.0.1:8080/v1 — start it: llama-server -m <model.gguf> --jinja --port 8080]
mm v0.1.7 | config: agent.llamacpp.yaml | provider: llamacpp | model: jetbrains/mellum2-12b-a2.5b-instruct-gguf-q4_k_m:Q4_K_M | ctx: unknown | tools: bash, read_file, write_file, edit_file | skills: 0 | yolo: on
```

## Spécificités du mode ACP

| Aspect | Comportement |
|--------|--------------|
| stdout | Messages JSON-RPC 2.0 uniquement, un par ligne. |
| stderr | Bannière, avertissements, trace `[acp] …`, journaux du SDK. |
| Spinner | Désactivé. |
| `skillsDir` relatif | Résolu par rapport au répertoire du fichier de configuration, quand un fichier a été trouvé ; sinon depuis le répertoire de travail, comme en mode terminal. |
| Permissions | `yolo: true` : aucune `session/request_permission` n'est envoyée pour les outils intégrés. `yolo: false` : une par appel, avec quatre options — `allow` (autoriser une fois), `allow_always` (cet outil pour la session), `reject` (refuser une fois), `never` (`reject_always` : cet outil, pour la session). Les outils MCP marqués `ask` en envoient toujours une. |

## Spécificités du mode ligne

| Aspect | Comportement |
|--------|--------------|
| Permissions | Avec `yolo: false` (et pour les outils MCP marqués `ask`), après la ligne `🛠️` de l'outil : `🔐 <titre de l'outil>`, la légende `[a] allow once · [s] allow <outil> for this session · [r] reject · [n] never <outil>` et `   ? `. La ligne tapée ensuite répond (`a`, `s`, `r`, `n` ou les mots `once`, `session`, `reject`, `never`) ; une autre réponse réaffiche la légende ; une ligne commençant par `/` est une commande (`/abort`, `/quit`), pas une réponse. `Ctrl+C` ou `/abort` refuse et arrête le tour. La même invite répond aux appels d'un agent interrogé avec `/ask`. |

## Spécificités du mode fenêtre

| Aspect | Comportement |
|--------|--------------|
| Sélection | Option `-tui`, ou `tui: true` dans le YAML ; `-acp` l'emporte sur les deux. |
| Vérification du terminal | stdin et stdout doivent tous deux être des périphériques caractère. Sinon `[tui: stdin or stdout is not a terminal — running the line mode]` est affiché et le mode ligne s'exécute, bannière comprise. |
| Écran | L'écran alternatif du terminal, rendu à la sortie ; l'historique de défilement du terminal n'est pas écrit. |
| Bannière | Non affichée sur stdout ; montrée comme première ligne de la conversation. |
| Spinner | Désactivé ; la règle sous la conversation s'anime à sa place. |
| Nom du modèle | L'en-tête affiche une forme courte de l'identifiant : hôte du registre et organisation retirés, suffixe de format `-gguf` retiré, tag conservé, plafonné à 28 caractères (`huggingface.co/unsloth/qwen3.5-2b-gguf:Q4_K_M` → `qwen3.5-2b:Q4_K_M`). L'identifiant complet figure dans la bannière de démarrage, que la fenêtre conserve comme première ligne de la conversation. |
| Disposition | Ligne d'en-tête (agent, modèle `@` fournisseur, usage du contexte en `ctx N% (utilisé/fenêtre)` ou `ctx ~utilisé (window unknown)`, `session <id>` quand les sessions sont actives) ; conversation avec barre de défilement ; règle avec l'état et les rappels de touches ; zone de saisie de 3 lignes ; barre d'état (`F1 help · Ctrl-Y copy · F2 mouse: … · Ctrl-C quit` à gauche, `<version> · N msgs · N tools` à droite — la version disparaît quand les deux côtés ne tiennent pas, pour que les rappels de touches ne soient jamais tronqués à cause d'elle). |
| Appels d'outils | `‣ <outil>  <détail>  <statut>  <durée>` où le statut est `… pending`, `… waiting for permission`, `… running`, `✓ done` ou `✗ failed` ; sortie repliée à `previewLines` lignes (`… N more line(s)`) ; lignes `+`/`-` des sorties de `write_file`/`edit_file` colorées. |
| Sélecteurs | `/` complète une commande, `@` un chemin sous le répertoire de travail, `$` un skill du catalogue — les deux derniers n'importe où dans une phrase, en conservant leur préfixe. Voir [Commandes slash](slash-commands.md#les-trois-sélecteurs). |
| Réflexion | Le raisonnement d'un modèle à raisonnement forme son entrée `‣ thinking`, grisée, en italique et d'une autre couleur, avant la réponse. Masquée avec `showThinking: false`. |
| Erreurs | Une ligne `[error: <explication>]` ; un tour annulé affiche `🛑 Generation aborted.` ; chaque tour se termine par `⚙ N command(s) [· 📝 N file op(s)] [· 📖 N skill(s)]`. |
| Permissions | Avec `yolo: false` (et pour les outils MCP marqués `ask`), la zone affiche `? <titre de l'outil>` et `[a] allow once   [s] allow <outil> for this session   [r] reject   [n] never <outil>` jusqu'à la réponse (`Échap` = `r`) ; un tour annulé pendant la question refuse. |
| Touches | Voir [Commandes slash — touches du mode fenêtre](slash-commands.md#touches-du-mode-fenêtre). |
| Souris | Non capturée au démarrage, donc le cliquer-glisser du terminal sélectionne du texte. `F2` la capture (défilement à la molette ; `Maj`+glisser sélectionne) puis la rend. |

## Spécificités du mode invite

| Aspect | Comportement |
|--------|--------------|
| Exécution | Exécute un seul cycle de génération puis quitte. Pas de REPL, pas de persistance de session. |
| Sortie | Affiche les statistiques d'appels d'outils et la réponse du modèle, puis quitte. Même affichage que le mode ligne (⚙ commandes, 📝 opérations sur fichiers, 📖 skills, 🔎 appels LSP). |
| Bannière | Non affichée. |
| Session | Non sauvegardée ; aucun répertoire de sessions utilisé. |
| Fichier de config | Peut apparaître avant ou après le flag `-prompt`/`-p` : `mm -p "prompt" config.yaml` et `mm config.yaml -p "prompt"` fonctionnent tous deux. |
| Compatibilité | Incompatible avec `-acp` et `-tui` ; le mode invite prend la priorité et s'exécute dans tous les cas. |
| Permissions | Personne ne peut répondre. Avec `yolo: false`, chaque appel qui demanderait est refusé (`[command rejected by the user]` pour le modèle) et stderr le dit une fois : `[yolo is off and this mode cannot ask: tool calls that need a confirmation are rejected — set yolo: true to let them run]`. Les outils MCP marqués `ask` sont refusés de la même façon, quoi que dise `yolo`. |
| Avec `structuredOutput` | stdout porte la réponse JSON et un saut de ligne, rien d'autre : pas de texte en flux, pas de 🤖, pas de ligne de statistiques. Les messages vont sur stderr. Une réponse en échec ou invalide imprime `[structured output: <erreur>]` sur stderr, rien sur stdout, et sort avec le code 1 ; une réponse valide sort avec le code 0. Voir [`structuredOutput`](configuration.md#structuredoutput). |

## Spécificités du mode ask

| Aspect | Comportement |
|--------|--------------|
| Configuration | `-config`, le chemin positionnel, puis `MM_CONFIG`, puis la résolution habituelle. Le nom de l'agent est cherché dans les `mmConfigs` de ce fichier. Aucun moteur n'est démarré pour le modèle propre à cette configuration. |
| Question | `-p <question>` ; sans `-p`, tout stdin. |
| Contexte (`--ask-with-context`) | stdin. Sans `-p`, stdin contient `<contexte>`, une ligne `---`, puis la question. |
| stdout | La réponse de l'agent, et rien d'autre, suivie d'un saut de ligne. |
| stderr | `🗣 asking <agent> (<fournisseur>/<modèle>)…`, une ligne `🛠️  <agent> · <outil>: <arguments>` par appel d'outil, `[ask: …]` en cas d'erreur. |
| Appels d'outils de l'agent | Décidés par le `yolo` de l'entrée `mmConfigs` de l'agent s'il est fixé, sinon par le `yolo` de cette configuration : `true` = autorisés ; `false` = refusés, avec la même ligne sur stderr qu'en mode invite (stdin portait la question, personne ne peut répondre). |
| Processus parent | Surveillé toutes les 500 ms : s'il disparaît, la demande est annulée et l'agent arrêté. |
| Session | Aucune : ni ce processus ni l'agent n'écrivent de fichier de session. |

## `mm init` — l'assistant agent.yaml

`mm init` et `mm --init` (aussi `-init`) écrivent un nouvel agent.yaml commenté. Ils sont traités avant toute lecture de configuration. Chaque question ci-dessous a une option ; une question dont l'option est donnée n'est pas posée. Voir [Créer un agent avec `mm init`](../how-to/create-an-agent.md).

| Option | Question quand elle est absente | Défaut |
|--------|---------------------------------|--------|
| `--provider` | Serveur de modèles : `llmman`, `ollama`, `dmr`, `llamacpp`, `openai` | le premier serveur local qui répond, sinon `llmman` (`openai` n'est jamais sondé : son adresse par défaut est l'API d'OpenAI) |
| `--base-url` | — (pas posée) | l'adresse du fournisseur, ou son adresse de secours quand elle ne répond pas |
| `--model` | Modèle : la liste des modèles du serveur (`/api/tags` pour llmman et Ollama, `/models` pour les autres), ou un nom à taper quand le serveur ne répond pas | le premier de la liste |
| `--family` | Famille du modèle | détectée d'après le nom du modèle, puis d'après le nom de famille donné par le serveur |
| `--usage` | À quoi sert l'agent : `developer`, `reviewer`, `translator`, `writer`, `assistant`, `researcher`, `docs`, `json`, `coordinator` | `developer` |
| `--machine` | Quelle machine fait tourner le modèle : `small`, `medium`, `large` | `small` |
| `--yolo yes\|no` | Demander avant chaque commande ou modification de fichier ? — seulement pour les usages avec `bash`, les outils de fichiers ou `fetch_content` | celui de l'usage |
| `--name` | Nom de l'agent (`acp.name`) | le nom de l'usage |
| `-o`, `--output` | Fichier à écrire (`-` = sortie standard) | `agent.yaml` |
| `--check` | — | désactivé ; activé : après l'écriture, lance ce mm avec `-config <fichier> -p "Say hello in one line."` et indique si le modèle a répondu (5 min au plus) |
| `--yes` | — | désactivé ; activé : rien n'est demandé, chaque réponse manquante prend son défaut |
| `--line` | — | désactivé ; activé : les questions sont posées ligne par ligne même dans un terminal |

| Aspect | Comportement |
|--------|--------------|
| Fenêtre | Quand l'entrée et la sortie standard sont des terminaux (et ni `--yes` ni `--line`) : une fenêtre plein écran — les étapes (✓ répondue, ▸ en cours, · à venir, chaque réponse à côté de son étape), la question avec la description du choix surligné, et le fichier tel qu'il serait écrit avec ce choix (aperçu à côté de la question à partir de 100 colonnes, à sa place avec `Tab` en dessous). Touches : `↑` `↓` `Début` `Fin` choisissent, `Entrée` répond, `y` / `n` répondent à la question oui ou non, `Échap` reprend la réponse précédente (les réponses données par option sont sautées), `PgUp` `PgDn` font défiler l'aperçu, `Ctrl-U` efface une réponse de texte, `Ctrl-C` quitte sans rien écrire (`nothing written`, code 1). Une réponse refusée s'affiche sur le trait du bas. Quand toutes les questions ont une réponse, `Entrée` écrit le fichier. |
| Mode ligne | Sinon : une question par ligne, choix numérotés ; un numéro, le texte d'une option ou un autre texte y répond ; une ligne vide ou `/skip` prend le défaut. Les usages et les machines sont d'abord listés avec une description d'une ligne. |
| Faits sur le modèle | llmman et Ollama : `POST /api/show` — la fenêtre native, l'échantillonnage du GGUF (`general.sampling.*`, les paramètres du Modelfile d'Ollama), l'interrupteur de raisonnement du chat template (`enable_thinking`, `reasoning_effort`) et son défaut. llama-server : `GET /props` — `n_ctx` et le chat template. Docker Model Runner et `openai` : rien — la table des familles décide ; `openai` liste ses modèles avec `OPENAI_API_KEY`. |
| Origine de chaque valeur | Les faits du serveur, puis la table des familles, puis l'usage, puis la ligne de la machine ; la table est `internal/agentinit/presets.yaml`, chaque entrée avec sa source. |
| Échantillonnage | Raisonnement activé (l'usage le demande et le modèle a un interrupteur) : l'échantillonnage « thinking » de la famille, jamais une température sous 0,6, `max_tokens: 16384`. Raisonnement désactivé : l'échantillonnage général de la famille, ou sa température « précise » pour les usages qui utilisent beaucoup d'outils, `max_tokens: 4096`. L'échantillonnage du GGUF remplace celui de la famille. `parallel_tool_calls: false` dès qu'un outil est actif. |
| Fichier écrit | Chaque valeur précédée d'un commentaire qui dit pourquoi elle a cette valeur ; `contextWindow: 0` (mm demande au serveur), avec la fenêtre native en commentaire ; `context.threshold: 75` ; le prompt système en anglais de l'usage ; pour `docs` un bloc `docSearch`, pour `json` un exemple de `structuredOutput` et tous les outils désactivés, pour `coordinator` un exemple commenté de `mmConfigs`. |
| Fichier existant | Jamais écrasé : `⚠️ <fichier> already exists — nothing was written; choose another name with -o`, code de sortie 1, avant toute question. |
| Après l'écriture | Le fichier est chargé comme mm charge une configuration ; une erreur est affichée et le code de sortie vaut 1. |
| Codes de sortie | 0 écrit (et vérifié) ; 1 fournisseur, usage ou machine inconnu, pas de modèle, fichier existant, fichier que mm ne charge pas, vérification en échec ; 2 option invalide. |

## Codes de sortie

| Code | Cause |
|------|-------|
| 0 | `/quit`, `Ctrl+C` à l'invite, fin de stdin, ou le client ACP a fermé la connexion. `--ask` : l'agent a répondu. |
| 1 | Plus d'un argument positionnel ; erreur de chargement de la configuration ; erreur d'initialisation du moteur (fournisseur inconnu, clé requise absente). `--ask` : pas de question, pas de contexte, agent inconnu, l'agent a échoué ou n'a rien répondu. |
| 130 | `--ask` : interrompu (`Ctrl+C`, ou le processus parent a disparu). |

## Compilation et installation

| Commande | Effet |
|----------|-------|
| `go build -o mm .` | Compile le binaire dans le répertoire courant. |
| `./install.sh` | Compile `mm` et le copie dans `/usr/local/bin`, avec `sudo` si le répertoire n'est pas accessible en écriture. |
| `go test ./...` | Lance les tests unitaires. |