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