# bmad-plus intake

> Valida el cuestionario de un pack, planifica las siguientes preguntas, registra las respuestas con su estado y redacta el brief. Opciones, códigos de salida, salida real y errores.

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

Documentación de BMAD+ › [Referencia](https://bmad-plus.rochetta.fr/es/docs/reference/) › bmad-plus intake

Un intake es la lista de preguntas que un pack necesita ver respondidas antes de actuar. `bmad-plus intake` lleva la contabilidad: comprueba el archivo de preguntas, indica al asistente qué preguntar a continuación, registra lo que respondes y redacta un brief que pasa a ser el contrato de los siguientes pasos del pack. Nunca pregunta nada por sí mismo ni llama a ningún modelo: tu asistente (el asistente anfitrión) te pregunta en tu idioma y el comando guarda el registro. Lo necesita quien maneje un pack que incluya un intake; en 0.23.0 es el pack Design (`.agents/skills/pack-design/intake.yaml`, intake `design-read`).

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

**En el terminal de tu proyecto**

```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]
```

**Opciones de bmad-plus intake**

| Opción | Argumento | Por defecto | Qué hace |
| --- | --- | --- | --- |
| `<action>` | `check`, `plan`, `record`, `render` | obligatorio | El paso que se ejecuta. |
| `[file]` | ruta | ninguno | Archivo intake que se valida. Solo lo usa `check`. |
| `-d, --directory <path>` | ruta | carpeta actual | Carpeta del proyecto. Las demás rutas son relativas a ella y deben quedarse dentro. |
| `--intake <file>` | ruta | ninguno | Archivo intake (el cuestionario). Obligatorio en `plan`, `record`, `render`. |
| `--answers <file>` | ruta | ninguno | Archivo de respuestas. Lo crea `record`; obligatorio en `plan`, `record`, `render`. |
| `--set <id=VALUE>` | id=VALOR | ninguno | Registra una respuesta. `id=UNKNOWN` marca la pregunta como desconocida y copia su riesgo. Repetible, una vez por pregunta y llamada. |
| `--default <id>` | id de pregunta | ninguno | Registra el valor por defecto propuesto de una pregunta como `defaulted`. Repetible. |
| `--reset` | ninguno | desactivado | Empieza de nuevo con un archivo de respuestas vacío para este intake y aplica los `--set` y `--default` de la misma llamada. |
| `--out <file>` | ruta | ninguno | Brief que se escribe. Obligatorio en `render`. |
| `--json` | ninguno | desactivado | Salida legible por máquinas, con `schemaVersion: 1` y un campo `status`. |

<a id="actions"></a>
## Las cuatro acciones

**Qué hace cada acción**

| Acción | Función | Muestra (salida de texto) |
| --- | --- | --- |
| `check FILE` | Valida un archivo intake según el contrato. | `<file>: valid intake <id> (<pack>), N questions, M must-have.` o `<file>: not a valid intake` seguido de una línea `  - problem` por fallo. |
| `plan` | Lee el intake y las respuestas; dice si el pack puede empezar y qué preguntar a continuación (primero las imprescindibles, nunca más 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):` y una línea por pregunta. |
| `record` | Escribe las respuestas a través del validador: se comprueban tipo, límites y opciones, y un valor que no encaja se rechaza. | `Recorded a, b in <answers>.` (o `Reset <answers>…`), y luego las mismas líneas que `plan`. |
| `render` | Escribe el brief a partir del intake y las respuestas. | `Brief written to <out> (N bytes); the intake is ready.` o `…; a must-have is still open.` |

<a id="statuses"></a>
### Estados de las respuestas

- `answered`: diste el valor (`--set id=VALUE`). Un valor que elegiste es `answered`, incluso si coincide con el valor por defecto.
- `defaulted`: dejas que se mantenga el valor por defecto propuesto (`--default id`). El brief lo etiqueta como propuesta no confirmada por el usuario.
- `unknown`: no lo sabes (`--set id=UNKNOWN`). El `risk_if_unknown` de la pregunta se copia en las respuestas y aparece en «Open questions» del brief.
- Una pregunta imprescindible queda resuelta cuando está `answered` o `unknown` con su riesgo. Una imprescindible no puede llevar valor por defecto; el validador del cuestionario lo rechaza.

<a id="intake-file"></a>
### El archivo intake

El cuestionario es un archivo YAML que se entrega con el pack. Campos de primer nivel: `schema_version` (debe ser 1), `id` y `pack` (slugs en minúsculas), `title`, `language` opcional (`user` o una etiqueta como `fr`), `max_per_message` opcional (entero de 1 a 20, 6 si falta) y `sections`. Cada sección tiene un `id`, un `title` y `questions`. Una pregunta tiene un `id` en snake_case, un `ask`, un `kind` (`text`, `choice` con al menos dos `choices` distintos, `number` con `min` y `max` opcionales, `boolean`, `list`) y, opcionalmente, `must_have`, `default`, `feeds` (anclas de artefactos como `brief.md#surface`) y `risk_if_unknown`. Una imprescindible exige `risk_if_unknown` y rechaza `default`. Los campos desconocidos se rechazan.

<a id="reads-writes"></a>
## Qué lee y qué escribe

- Lee: el archivo intake y, en `plan`, `record` y `render`, el archivo de respuestas. Cada archivo está limitado a 1 MiB (1.048.576 bytes) y debe ser un archivo normal.
- Escribe: `record` escribe el archivo de respuestas (JSON, escritura atómica mediante un archivo temporal); `render` escribe el brief. Nada más.
- Nunca escribe en: `.git/`, `_bmad/`, `.bmad-plus/` ni `node_modules/`, a cualquier profundidad; una ruta que salga del proyecto; ninguna ruta que pase por un enlace simbólico.
- `record` solo sobrescribe un archivo de respuestas del mismo id de intake. `render` solo sobrescribe un brief que él mismo escribió antes para el mismo intake (la segunda línea del archivo es la marca de propiedad).
- Sin acceso a la red, sin procesos lanzados, sin llamar a ningún modelo.

<a id="exit-codes"></a>
## Códigos de salida

**Códigos de salida de bmad-plus intake**

| Código | Significado |
| --- | --- |
| 0 | `check`: el archivo es válido. `plan`: listo, cada pregunta imprescindible está respondida o desconocida con su riesgo. `record` y `render`: hecho. |
| 1 | Cualquier error (se muestra como `Intake: <message>`), o `check` encontró el archivo inválido. |
| 2 | Solo `plan`: no está listo, queda abierta al menos una pregunta imprescindible. |

<a id="real-output"></a>
## Salida real

Estas cuatro transcripciones proceden de la receta de aceptación humana de 0.23.0 (pack Design instalado en una aplicación de demostración). Se han quitado las líneas `npm notice` y el prompt del shell; el resto de la salida no se ha modificado. El `plan` previo a cualquier respuesta termina con el código 2.

**Validar el cuestionario del 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.
```

Salida capturada de una ejecución real. Fuente: Capturado durante la receta de aceptación de la 0.23.0, el 2026-10-18 (paso 4)

**Plan antes de cualquier respuesta (código de salida 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")
```

Salida capturada de una ejecución real. Fuente: Capturado durante la receta de aceptación de la 0.23.0, el 2026-10-18 (paso 5)

**Registrar tres respuestas**

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

Salida capturada de una ejecución real. Fuente: Capturado durante la receta de aceptación de la 0.23.0, el 2026-10-18 (paso 5)

**Redactar el brief y leer sus primeras líneas**

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

Salida capturada de una ejecución real. Fuente: Capturado durante la receta de aceptación de la 0.23.0, el 2026-10-18 (paso 5)

Cómo leerlo: tras tres respuestas, `plan` dice `ready` porque solo las tres imprescindibles (`surface_kind`, `audience`, `job`) bloquean el pack; las otras diez son opcionales y `plan` sigue ofreciéndolas, de seis en seis. La segunda línea del brief es la marca de propiedad: `render` podrá volver a sobrescribir este archivo y rechazará cualquier otro en esa ruta.

<a id="errors"></a>
## Errores y qué hacer

**Mensajes que muestra bmad-plus intake**

| Mensaje | Causa | Qué hacer |
| --- | --- | --- |
| `Intake: --intake is required for intake plan` (igual con `--answers`, `--out`) | Falta una opción obligatoria. | Añade la opción que nombra el mensaje. |
| `Intake: Use intake check FILE.` | `check` se ejecutó sin archivo. | Pasa el archivo intake: `intake check .agents/skills/pack-design/intake.yaml`. |
| `Intake: Use intake check FILE, plan, record or render.` | Acción desconocida. | Usa una de las cuatro acciones. |
| `<file>: not a valid intake` + líneas `  - …` (código 1) | El cuestionario incumple el contrato, por ejemplo un campo desconocido o una imprescindible sin `risk_if_unknown`. | Corrige cada problema listado en el archivo intake y vuelve a ejecutar `check`. Si es el archivo de un pack entregado, reinstala o actualiza el pack. |
| `Intake: nothing to record: pass --set id=VALUE, --default id or --reset` | `record` sin nada que registrar. | Pasa `--set`, `--default` o `--reset`. |
| `Intake: --set expects id=VALUE, got "…"` | La asignación no lleva `=`. | Escribe `--set id=VALUE`. |
| `Intake: question "x" is set twice in one call` | La misma pregunta aparece dos veces en `--set`/`--default`. | Da cada pregunta una sola vez por llamada. |
| `Intake: no question "x" in intake "y"` | El id no está en el cuestionario. | Copia el id de la salida de `plan`. |
| `Intake: question "x" has no default` | `--default` sobre una pregunta sin valor por defecto. | Usa `--set x=VALUE` o `--set x=UNKNOWN`. |
| `Intake: x: value must be one of …` (o `needs a finite number`, `must be at least N`, `needs true or false`, …) | El valor no encaja con el tipo o los límites de la pregunta. | Vuelve a preguntar y registra un valor que encaje. No se escribió nada. |
| `Intake: <answers> does not answer this intake: …` + `Record again with --reset to start over.` | El archivo de respuestas ya no encaja con el cuestionario (cambió tras registrar respuestas). | Ejecuta `record --reset` y vuelve a hacer las preguntas. |
| `Intake: <file>: exists and belongs to "other", not to intake "y"; move it away or pick another path` | La ruta de respuestas contiene el archivo de otro intake. | Elige otra ruta para `--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` se niega a sobrescribir un archivo que no escribió. | Elige otra ruta para `--out` o mueve el archivo. |
| `Intake: <file>: the intake never writes under _bmad/` (también `.git/`, `.bmad-plus/`, `node_modules/`) | La ruta de salida está en un árbol reservado. | Escribe las respuestas y el brief en otro sitio, por ejemplo bajo `_bmad-output/`. |
| `Intake: <file>: outside the project directory <root>` | La ruta sale del proyecto. | Usa una ruta dentro del proyecto o cambia `--directory`. |

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

<a id="example-cli-intake-design-read"></a>
### Preguntar primero, construir después: la lectura de diseño

Pack Design instalado. El agente Atelier ejecuta el intake con este comando: tú respondes en lenguaje normal y nunca escribes los comandos.

**En tu asistente de IA**

```text
Atelier, haz la lectura de diseño de la lista de facturas de mi aplicación y luego construye la pantalla.
```

**Lo que deberías obtener** El asistente ejecuta `intake plan`, obtiene el código 2 con las tres imprescindibles abiertas (`surface_kind`, `audience`, `job`) y te pregunta primero esas, con un máximo de seis preguntas por mensaje. Registra tus respuestas con `intake record`, comprueba que `plan` ya dice `ready` y redacta `_bmad-output/design/brief.md` con `intake render`. El brief lista cada respuesta con su estado; lo que dejaste abierto aparece en «Open questions» con su riesgo. La construcción parte después de ese brief.

<a id="example-cli-intake-unknown-risk"></a>
### Decir «no lo sé» a propósito

Puedes avanzar sin respuesta a una imprescindible, pero el riesgo queda asociado a ella.

**En tu asistente de IA**

```text
Atelier, todavía no sé quién usará esta pantalla. Anótalo como desconocido y continúa.
```

**Lo que deberías obtener** El asistente registra la pregunta con `--set audience=UNKNOWN`. El archivo de respuestas guarda el estado `unknown` y copia el `risk_if_unknown` de la pregunta; `plan` cuenta esa pregunta imprescindible como resuelta, pero el pack solo arranca cuando las otras dos imprescindibles, `surface_kind` y `job`, también están respondidas o son unknown con su riesgo. El brief muestra «Answer: unknown» con el riesgo y lo repite en «Open questions». No se inventa un público.

**Véase también**

- [bmad-plus swarm: lanzar un enjambre tras el intake](https://bmad-plus.rochetta.fr/es/docs/reference/cli-swarm/)
- [bmad-plus nexus: ejecuciones duraderas](https://bmad-plus.rochetta.fr/es/docs/reference/cli-nexus/)
- [Resumen de la CLI y códigos de salida](https://bmad-plus.rochetta.fr/es/docs/reference/cli-overview/)
- [Estructura del proyecto: dónde viven respuestas y briefs](https://bmad-plus.rochetta.fr/es/docs/reference/project-layout/)

[Documentación de BMAD+](https://bmad-plus.rochetta.fr/es/docs/) · [Referencia](https://bmad-plus.rochetta.fr/es/docs/reference/)

[Código en GitHub](https://github.com/lrochetta/BMAD-PLUS)
