bots-garden/mini-mepublic Fork
⑂ feature/ask-cli
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. 382fecb · on feature/ask-cli · k33g · 19d ago
cli.md · 153 lines · 12.7 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.
MM_BIN Posée par mm pour les commandes que lance son outil bash : le chemin du binaire mm en cours.
MM_CONFIG Posée par mm pour les commandes que lance son outil bash : 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).
mm <version> | config: … | provider: … | model: … | ctx: … | tools: … | skills: N 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.
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

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.

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 permissions: ask, la zone affiche ? <titre de l'outil> et [a] allow once [s] allow <outil> for this session [r] reject jusqu'à la réponse ; 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.

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 Autorisés, comme en mode ligne.
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
# 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. |
| `MM_BIN` | Posée par `mm` pour les commandes que lance son outil `bash` : le chemin du binaire `mm` en cours. |
| `MM_CONFIG` | Posée par `mm` pour les commandes que lance son outil `bash` : 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`). |
| `mm <version> \| config: … \| provider: … \| model: … \| ctx: … \| tools: … \| skills: N` | 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. |
| `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
```

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

## 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 `permissions: ask`, la zone affiche `? <titre de l'outil>` et `[a] allow once   [s] allow <outil> for this session   [r] reject` jusqu'à la réponse ; 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. |

## 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 | Autorisés, comme en mode ligne. |
| 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. |