bots-garden/mini-mepublic Fork
⑂ feature/memory-search
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. f49e056 · on feature/memory-search · k33g · 4d ago
cli.md · 165 lines · 16.9 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)
É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.
-acp booléen false Sert l'Agent Client Protocol sur stdin/stdout au lieu du REPL du terminal.
-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.
-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.

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
# 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)
```

| É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. |
| `-acp` | booléen | `false` | Sert l'Agent Client Protocol sur stdin/stdout au lieu du REPL du terminal. |
| `-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. |
| `-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. |

## 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. |