# bmad-plus intake

> Valider le questionnaire d’un pack, planifier les prochaines questions, enregistrer les réponses avec leur statut et rédiger le brief. Options, codes de sortie, sortie réelle et erreurs.

Canonical: https://bmad-plus.rochetta.fr/fr/docs/reference/cli-intake/
Language: fr
BMAD+ version: 0.23.1
Documentation reviewed: 2026-10-19
Author: Laurent Rochetta
License: MIT

Documentation BMAD+ › [Référence](https://bmad-plus.rochetta.fr/fr/docs/reference/) › bmad-plus intake

Un intake est la liste des questions auxquelles un pack doit avoir une réponse avant d’agir. `bmad-plus intake` tient les comptes : il vérifie le fichier de questions, indique à l’assistant quelles questions poser ensuite, enregistre vos réponses et rédige un brief qui devient le contrat des étapes suivantes du pack. Il ne pose jamais rien lui-même et n’appelle aucun modèle : c’est votre assistant (l’assistant hôte) qui vous interroge dans votre langue, la commande tient le registre. Il concerne quiconque pilote un pack qui livre un intake ; en 0.23.0, c’est le pack Design (`.agents/skills/pack-design/intake.yaml`, intake `design-read`).

<a id="synopsis"></a>
## Synopsis

**Dans le terminal de votre projet**

```sh
npx bmad-plus intake check FILE [--json]
npx bmad-plus intake plan   --intake FILE --answers FILE [--json]
npx bmad-plus intake record --intake FILE --answers FILE [--set id=VALUE]... [--default id]... [--reset] [--json]
npx bmad-plus intake render --intake FILE --answers FILE --out FILE [--json]
```

**Options de bmad-plus intake**

| Option | Argument | Défaut | Effet |
| --- | --- | --- | --- |
| `<action>` | `check`, `plan`, `record`, `render` | obligatoire | L’étape à exécuter. |
| `[file]` | chemin | aucun | Fichier intake à valider. Utilisé par `check` uniquement. |
| `-d, --directory <path>` | chemin | dossier courant | Dossier du projet. Tous les autres chemins sont relatifs à lui et doivent rester à l’intérieur. |
| `--intake <file>` | chemin | aucun | Fichier intake (le questionnaire). Obligatoire pour `plan`, `record`, `render`. |
| `--answers <file>` | chemin | aucun | Fichier de réponses. Créé par `record` ; obligatoire pour `plan`, `record`, `render`. |
| `--set <id=VALUE>` | id=VALEUR | aucun | Enregistre une réponse. `id=UNKNOWN` marque la question comme inconnue et copie son risque. Répétable, une fois par question et par appel. |
| `--default <id>` | id de question | aucun | Enregistre la valeur par défaut proposée d’une question avec le statut `defaulted`. Répétable. |
| `--reset` | aucun | désactivé | Repart d’un fichier de réponses vide pour cet intake, puis applique les `--set` et `--default` du même appel. |
| `--out <file>` | chemin | aucun | Brief à écrire. Obligatoire pour `render`. |
| `--json` | aucun | désactivé | Sortie lisible par machine, avec `schemaVersion: 1` et un champ `status`. |

<a id="actions"></a>
## Les quatre actions

**Ce que fait chaque action**

| Action | Rôle | Affiche (sortie texte) |
| --- | --- | --- |
| `check FILE` | Valide un fichier intake selon le contrat. | `<file>: valid intake <id> (<pack>), N questions, M must-have.` ou `<file>: not a valid intake` suivi d’une ligne `  - problem` par défaut. |
| `plan` | Lit l’intake et les réponses ; dit si le pack peut démarrer et quelles questions poser ensuite (indispensables d’abord, jamais plus de `max_per_message`). | `<id> (<pack>): ready\|not ready — A answered, D defaulted, U unknown, P not asked yet.`, `Must-haves still open: …`, `Ask next (at most N per message):` et une ligne par question. |
| `record` | Écrit les réponses à travers le validateur : type, bornes et choix sont contrôlés, une valeur qui ne convient pas est refusée. | `Recorded a, b in <answers>.` (ou `Reset <answers>…`), puis les mêmes lignes que `plan`. |
| `render` | Écrit le brief à partir de l’intake et des réponses. | `Brief written to <out> (N bytes); the intake is ready.` ou `…; a must-have is still open.` |

<a id="statuses"></a>
### Statuts des réponses

- `answered` : vous avez donné la valeur (`--set id=VALUE`). Une valeur que vous avez choisie est `answered`, même si elle égale la valeur par défaut.
- `defaulted` : vous laissez la valeur par défaut proposée (`--default id`). Le brief l’indique comme une proposition non confirmée par l’utilisateur.
- `unknown` : vous ne savez pas (`--set id=UNKNOWN`). Le `risk_if_unknown` de la question est copié dans les réponses et listé sous « Open questions » dans le brief.
- Une question indispensable est traitée dès qu’elle est `answered` ou `unknown` avec son risque. Une question indispensable ne peut pas avoir de valeur par défaut ; le validateur du questionnaire la refuse.

<a id="intake-file"></a>
### Le fichier intake

Le questionnaire est un fichier YAML livré avec le pack. Champs de premier niveau : `schema_version` (doit valoir 1), `id` et `pack` (slugs en minuscules), `title`, `language` facultatif (`user` ou une étiquette comme `fr`), `max_per_message` facultatif (entier de 1 à 20, 6 par défaut) et `sections`. Chaque section a un `id`, un `title` et des `questions`. Une question a un `id` en snake_case, un `ask`, un `kind` (`text`, `choice` avec au moins deux `choices` distincts, `number` avec `min` et `max` facultatifs, `boolean`, `list`), et éventuellement `must_have`, `default`, `feeds` (ancres d’artefacts comme `brief.md#surface`) et `risk_if_unknown`. Une question indispensable exige `risk_if_unknown` et refuse `default`. Les champs inconnus sont refusés.

<a id="reads-writes"></a>
## Ce qu’elle lit et écrit

- Lit : le fichier intake et, pour `plan`, `record` et `render`, le fichier de réponses. Chaque fichier est limité à 1 Mio (1 048 576 octets) et doit être un fichier ordinaire.
- Écrit : `record` écrit le fichier de réponses (JSON, écriture atomique via un fichier temporaire) ; `render` écrit le brief. Rien d’autre.
- N’écrit jamais dans : `.git/`, `_bmad/`, `.bmad-plus/` et `node_modules/`, à n’importe quelle profondeur ; un chemin qui sort du projet ; tout chemin passant par un lien symbolique.
- `record` n’écrase qu’un fichier de réponses du même identifiant d’intake. `render` n’écrase qu’un brief qu’il a lui-même écrit pour le même intake (la deuxième ligne du fichier est la marque de propriété).
- Aucun accès réseau, aucun processus lancé, aucun modèle appelé.

<a id="exit-codes"></a>
## Codes de sortie

**Codes de sortie de bmad-plus intake**

| Code | Signification |
| --- | --- |
| 0 | `check` : le fichier est valide. `plan` : prêt, chaque question indispensable est répondue ou inconnue avec son risque. `record` et `render` : fait. |
| 1 | Toute erreur (affichée `Intake: <message>`), ou `check` a trouvé le fichier invalide. |
| 2 | `plan` uniquement : pas prêt, au moins une question indispensable reste ouverte. |

<a id="real-output"></a>
## Sortie réelle

Ces quatre transcriptions viennent de la recette humaine de 0.23.0 (pack Design installé dans une application de démonstration). Les lignes `npm notice` et l’invite du shell sont retirées ; le reste de la sortie est inchangé. Le `plan` avant toute réponse se termine par le code 2.

**Valider le questionnaire du pack Design**

```text
$ npx bmad-plus intake check .agents/skills/pack-design/intake.yaml --directory .\demo-app
.agents/skills/pack-design/intake.yaml: valid intake design-read (design), 13 questions, 3 must-have.
```

Sortie capturée lors d’une exécution réelle. Source: Capturé pendant la recette d’acceptation de la 0.23.0, le 2026-10-18 (étape 4)

**Plan avant toute réponse (code de sortie 2)**

```text
$ npx bmad-plus intake plan --intake .agents/skills/pack-design/intake.yaml --answers _bmad-output/design/intake.json --directory .\demo-app
design-read (design): not ready — 0 answered, 0 defaulted, 0 unknown, 13 not asked yet.
Must-haves still open: surface_kind, audience, job
Ask next (at most 6 per message):
  - surface_kind [choice] Which surface is this? A marketing landing page, a dashboard, a data table, a form, an auth or onboarding flow, a mobile screen, an email, a chat or AI surface, a checkout, a settings page, or something else? (must-have; choices: landing, dashboard, table, form, auth, onboarding, mobile, email, ai-chat, checkout, settings, other)
  - audience [text] Who uses it, and in what situation (device, time pressure, expertise, frequency)? (must-have)
  - job [text] What is the one job this page must get done, and how will you know it did? (must-have)
  - brand_assets [choice] Which brand assets exist already? None, a partial set (a logo and a colour or two), or a full kit (logo, palette, type, voice)? (choices: none, partial, full)
  - design_system [choice] Is a design system or component library already in use? (choices: none, shadcn, radix, mantine, material, fluent, carbon, polaris, other; default: "none")
  - aesthetic_family [choice] Does the brief imply an aesthetic family? Minimalist, brutalist, soft editorial, premium dense, or none in particular? (choices: minimalist, brutalist, soft-editorial, premium-dense, none; default: "none")
```

Sortie capturée lors d’une exécution réelle. Source: Capturé pendant la recette d’acceptation de la 0.23.0, le 2026-10-18 (étape 5)

**Enregistrer trois réponses**

```text
$ npx bmad-plus intake record --intake .agents/skills/pack-design/intake.yaml --answers _bmad-output/design/intake.json --set surface_kind=dashboard --set "audience=Comptables en cabinet, sur ordinateur, en fin de mois" --set "job=Repérer les factures en retard et relancer en un clic" --directory .\demo-app
Recorded surface_kind, audience, job in _bmad-output/design/intake.json.
design-read (design): ready — 3 answered, 0 defaulted, 0 unknown, 10 not asked yet.
Ask next (at most 6 per message):
  - brand_assets [choice] Which brand assets exist already? None, a partial set (a logo and a colour or two), or a full kit (logo, palette, type, voice)? (choices: none, partial, full)
  - design_system [choice] Is a design system or component library already in use? (choices: none, shadcn, radix, mantine, material, fluent, carbon, polaris, other; default: "none")
  - aesthetic_family [choice] Does the brief imply an aesthetic family? Minimalist, brutalist, soft editorial, premium dense, or none in particular? (choices: minimalist, brutalist, soft-editorial, premium-dense, none; default: "none")
  - variance [number] Layout variance, from 1 (symmetric and safe) to 10 (asymmetric and bold)? Leave it open and Atelier sets it from the surface.
  - motion [number] Motion, from 1 (static) to 10 (choreographed)? Leave it open and Atelier sets it from the surface.
  - density [number] Density, from 1 (gallery-sparse) to 10 (cockpit-packed)? Leave it open and Atelier sets it from the surface.
```

Sortie capturée lors d’une exécution réelle. Source: Capturé pendant la recette d’acceptation de la 0.23.0, le 2026-10-18 (étape 5)

**Rédiger le brief et lire ses premières lignes**

```text
$ npx bmad-plus intake render --intake .agents/skills/pack-design/intake.yaml --answers _bmad-output/design/intake.json --out _bmad-output/design/brief.md --directory .\demo-app
Brief written to _bmad-output/design/brief.md (3022 bytes); the intake is ready.
$ Get-Content .\demo-app\_bmad-output\design\brief.md -TotalCount 3
# Design read
<!-- owned by bmad-plus intake design-read; written by bmad-plus intake render, do not edit -->
```

Sortie capturée lors d’une exécution réelle. Source: Capturé pendant la recette d’acceptation de la 0.23.0, le 2026-10-18 (étape 5)

Comment le lire : après trois réponses, `plan` annonce `ready` parce que seules les trois questions indispensables (`surface_kind`, `audience`, `job`) bloquent le pack ; les dix autres restent facultatives et `plan` continue de les proposer, six à la fois. La deuxième ligne du brief est la marque de propriété : `render` pourra réécrire ce fichier, et refusera tout autre fichier à cet emplacement.

<a id="errors"></a>
## Erreurs et que faire

**Messages affichés par bmad-plus intake**

| Message | Cause | Que faire |
| --- | --- | --- |
| `Intake: --intake is required for intake plan` (idem pour `--answers`, `--out`) | Une option obligatoire manque. | Ajoutez l’option citée dans le message. |
| `Intake: Use intake check FILE.` | `check` lancé sans fichier. | Passez le fichier intake : `intake check .agents/skills/pack-design/intake.yaml`. |
| `Intake: Use intake check FILE, plan, record or render.` | Action inconnue. | Utilisez l’une des quatre actions. |
| `<file>: not a valid intake` + lignes `  - …` (code 1) | Le questionnaire enfreint le contrat, par exemple un champ inconnu ou une question indispensable sans `risk_if_unknown`. | Corrigez chaque problème listé dans le fichier intake, puis relancez `check`. Pour le fichier d’un pack livré, réinstallez ou mettez à jour le pack. |
| `Intake: nothing to record: pass --set id=VALUE, --default id or --reset` | `record` sans rien à enregistrer. | Passez `--set`, `--default` ou `--reset`. |
| `Intake: --set expects id=VALUE, got "…"` | L’affectation n’a pas de `=`. | Écrivez `--set id=VALUE`. |
| `Intake: question "x" is set twice in one call` | La même question apparaît deux fois dans `--set`/`--default`. | Donnez chaque question une seule fois par appel. |
| `Intake: no question "x" in intake "y"` | L’identifiant n’est pas dans le questionnaire. | Copiez l’identifiant depuis la sortie de `plan`. |
| `Intake: question "x" has no default` | `--default` sur une question sans valeur par défaut. | Utilisez `--set x=VALUE` ou `--set x=UNKNOWN`. |
| `Intake: x: value must be one of …` (ou `needs a finite number`, `must be at least N`, `needs true or false`, …) | La valeur ne convient pas au type ou aux bornes de la question. | Reposez la question et enregistrez une valeur qui convient. Rien n’a été écrit. |
| `Intake: <answers> does not answer this intake: …` + `Record again with --reset to start over.` | Le fichier de réponses ne correspond plus au questionnaire (modifié après l’enregistrement des réponses). | Lancez `record --reset`, puis reposez les questions. |
| `Intake: <file>: exists and belongs to "other", not to intake "y"; move it away or pick another path` | Le chemin des réponses contient le fichier d’un autre intake. | Choisissez un autre chemin pour `--answers`. |
| `Intake: <file>: exists and is not a brief of intake "y" (its second line is not the ownership marker); move it away or pick another path` | `render` refuse d’écraser un fichier qu’il n’a pas écrit. | Choisissez un autre chemin pour `--out` ou déplacez le fichier. |
| `Intake: <file>: the intake never writes under _bmad/` (aussi `.git/`, `.bmad-plus/`, `node_modules/`) | Le chemin de sortie est dans une arborescence réservée. | Écrivez les réponses et le brief ailleurs, par exemple sous `_bmad-output/`. |
| `Intake: <file>: outside the project directory <root>` | Le chemin sort du projet. | Utilisez un chemin dans le projet, ou changez `--directory`. |

<a id="examples"></a>
## Exemples

<a id="example-cli-intake-design-read"></a>
### Demander d’abord, puis construire : la lecture design

Pack Design installé. L’agent Atelier déroule l’intake avec cette commande : vous répondez en langage courant et ne tapez jamais les commandes vous-même.

**Dans votre assistant IA**

```text
Atelier, fais la lecture design de la liste des factures de mon application, puis construis l’écran.
```

**Ce que vous devriez obtenir** L’assistant lance `intake plan`, obtient le code 2 avec les trois questions indispensables ouvertes (`surface_kind`, `audience`, `job`) et vous pose d’abord celles-là, six questions au plus par message. Il enregistre vos réponses avec `intake record`, vérifie que `plan` dit maintenant `ready`, puis rédige `_bmad-output/design/brief.md` avec `intake render`. Le brief liste chaque réponse avec son statut ; ce que vous avez laissé ouvert apparaît sous « Open questions » avec son risque. La construction part ensuite de ce brief.

<a id="example-cli-intake-unknown-risk"></a>
### Dire « je ne sais pas » en connaissance de cause

Vous pouvez avancer sans réponse à une question indispensable, mais le risque reste attaché à celle-ci.

**Dans votre assistant IA**

```text
Atelier, je ne sais pas encore qui utilisera cet écran. Note-le comme inconnu et continue.
```

**Ce que vous devriez obtenir** L’assistant enregistre la question avec `--set audience=UNKNOWN`. Le fichier de réponses stocke le statut `unknown` et copie le `risk_if_unknown` de la question ; `plan` compte cette question indispensable comme traitée, mais le pack ne démarre qu’une fois les deux autres indispensables, `surface_kind` et `job`, elles aussi répondues ou unknown avec leur risque. Le brief affiche « Answer: unknown » avec le risque, et le répète dans « Open questions ». Il n’invente pas de public.

**Voir aussi**

- [bmad-plus swarm : lancer un essaim après l’intake](https://bmad-plus.rochetta.fr/fr/docs/reference/cli-swarm/)
- [bmad-plus nexus : exécutions durables](https://bmad-plus.rochetta.fr/fr/docs/reference/cli-nexus/)
- [Vue d’ensemble de la CLI et codes de sortie](https://bmad-plus.rochetta.fr/fr/docs/reference/cli-overview/)
- [Structure du projet : où vivent réponses et briefs](https://bmad-plus.rochetta.fr/fr/docs/reference/project-layout/)

[Documentation BMAD+](https://bmad-plus.rochetta.fr/fr/docs/) · [Référence](https://bmad-plus.rochetta.fr/fr/docs/reference/)

[Code sur GitHub](https://github.com/lrochetta/BMAD-PLUS)
