Índice del diarioDockup / nota de campo
Note / cli-design-for-ai-agents

Diseño de una CLI para agentes de IA: JSON, códigos de salida y espera

El diseño de una CLI para agentes de IA requiere JSON estructurado, códigos de salida reales, espera hasta estados terminales, errores estables y confirmaciones seguras para la automatización en producción.

Una CLI para agentes de IA no es simplemente una herramienta de línea de comandos para humanos que también puede invocarse desde un modelo. Es un protocolo operativo. El agente necesita entradas deterministas, salidas estructuradas, códigos de salida significativos, categorías de error estables y una forma de esperar hasta que la infraestructura asíncrona alcance un estado final.

Sin ese contrato, el agente se ve obligado a inferir el éxito a partir de frases como «el despliegue ha comenzado». Esa inferencia es peligrosa, porque una solicitud aceptada puede fallar más adelante durante el build, las comprobaciones de salud, el arranque del contenedor o el cambio de tráfico.

¿Por qué es peligroso dar por hecho que un despliegue ha tenido éxito?

La mayoría de las operaciones de infraestructura son asíncronas. Una API puede aceptar un despliegue y devolver un ID en milisegundos, mientras que el build real tarda varios minutos. Si un agente informa de éxito en el momento de la aceptación, todos los pasos posteriores se basan en una premisa falsa.

Considera la diferencia:

EventoLo que demuestraLo que no demuestra
Solicitud aceptadaLa plataforma entendió la solicitudQue el código se haya compilado
Build completadoSe creó una imagen o un artefactoQue la aplicación se haya iniciado
Comprobación de salud superadaLa nueva instancia respondió como era necesarioQue los flujos de negocio funcionen
Tráfico cambiadoLa release pasó a estar activaQue vaya a mantenerse saludable
Observación de uptimeEl servicio sigue siendo accesibleQue todas las funcionalidades sean correctas

Un humano puede percibir la diferencia en un dashboard. Un agente que opera mediante texto necesita que esta diferencia esté codificada en la interfaz.

El contrato de comandos de Dockup separa la puesta en cola de la finalización. Un deploy sin --wait devuelve el resultado inmediatamente con waited:false; un deploy con --wait se bloquea hasta alcanzar el éxito, un fallo o un timeout:

dockup deploy production/api --wait --json

El timeout predeterminado es de 900 segundos. El comando termina con 0 únicamente después de alcanzar un estado terminal correcto. Termina con un valor distinto de cero y deploy_failed o deploy_timeout cuando el resultado no es satisfactorio.

¿Qué aporta una CLI con JSON estructurado a un agente de IA?

El JSON estructurado sustituye la interpretación de prosa por campos con nombres. El agente puede localizar directamente status, deploymentId, target o code, sin depender de la puntuación, el color, el ancho de las columnas o la redacción.

Un resultado correcto puede consumirse como datos:

{
  "ok": true,
  "target": "production/api",
  "deploymentId": "dep_123",
  "waited": true,
  "status": "success",
  "durationMs": 142381,
  "url": "https://api.dockup.tech"
}

Los errores utilizan la misma estructura de transporte:

{
  "ok": false,
  "error": "Deployment failed",
  "code": "deploy_failed"
}

La regla de diseño importante es que el JSON se escriba en stdout, mientras que las advertencias que no deben corromper el parseo se envíen a stderr. Los logs en modo follow utilizan NDJSON (un objeto JSON por línea), de modo que quien realiza la llamada pueda procesar el flujo de forma incremental sin esperar a un único array enorme.

Dockup aplica --json a todos sus comandos. Con 135 comandos, exigir que un agente infiera los flags de memoria sería frágil. La referencia de la CLI y la skill incluida proporcionan las instrucciones de comandos alineadas con la versión que debe seguir el agente.

La propiedad de diseño importante no es el descubrimiento ingenioso. Es que el agente reciba instrucciones operativas actuales y estructuradas, y no invente un flag a partir de un prompt antiguo.

¿Cómo deben controlar los códigos de salida reales la automatización de despliegues?

El código de salida del sistema operativo es la señal de éxito más portable disponible para shell scripts, runners de CI y agentes de programación. El código 0 significa que el comando logró el resultado definido. Un código distinto de cero significa que quien realiza la llamada debe elegir entre la recuperación, la escalación o la terminación.

Este fragmento de shell es deliberadamente sencillo:

if dockup deploy production/api --wait --json > result.json; then
  echo "deployment reached success"
else
  dockup logs production/api --build --json
  exit 1
fi

No busca la palabra «success» en stdout. Tampoco asume que una respuesta HTTP 202 implique que producción esté lista. Delega la definición del éxito en la CLI y propaga el fallo al proceso principal.

Los códigos de salida reales son igualmente importantes para comandos one-shot dentro de un contenedor. El comando PRO exec de Dockup devuelve stdout, stderr y el código de salida real del comando:

dockup exec "npm run migrate" \
  -s production/api \
  --json

Por tanto, un agente puede distinguir entre una migración completada y un comando que simplemente se ha iniciado. Este es un principio fundamental de las barreras de protección para agentes de IA en producción.

¿Cómo sustituye la espera hasta un estado terminal al polling frágil?

Los bucles de polling escritos a mano introducen decisiones de política ocultas: cada cuánto hacer polling, qué estados son terminales, cuánto tiempo esperar, si un error de red transitorio debe reiniciar el temporizador y qué hacer cuando un contenedor se reinicia.

Es especialmente probable que un agente se equivoque con estas decisiones porque puede no conocer la máquina de estados completa de la plataforma. La plataforma debería encargarse de la semántica de espera.

Dockup ofrece dos patrones útiles:

dockup deploy production/api --wait --timeout 1800 --json
dockup push --json

deploy --wait espera de forma explícita. push espera de forma predeterminada después de hacer push y activar la release; --no-wait permite omitir esa espera. Ambos devuelven un código de salida que refleja el resultado terminal.

El seguimiento de logs aplica la misma idea:

dockup logs production/api --build -f --json

El flujo termina cuando el build alcanza el éxito o el fallo. Un objeto NDJSON final indica done:true, y un build fallido termina con un código distinto de cero. Quien realiza la llamada no necesita una segunda implementación de polling.

Para comprobar la disponibilidad de la aplicación después del despliegue, el comando uptime de Dockup devuelve comprobaciones por minuto, el tiempo medio de respuesta y el p95:

dockup uptime production/api --hours 24 --json

La espera y la monitorización son conceptos distintos. --wait responde si este despliegue alcanzó un resultado terminal; uptime indica cómo se comportó el servicio en ejecución a lo largo del tiempo.

¿Qué códigos de error debería entender un agente?

Las categorías de error estables permiten que un agente lleve a cabo una acción acotada sin interpretar cada mensaje posible. Dockup expone códigos como los siguientes:

Código de errorSignificadoRespuesta segura del agente
not_logged_inNo hay ningún token utilizableDetenerse y solicitar autenticación
not_linkedNo existe ningún destino .dockup para pushResolver el destino o pasarlo explícitamente
no_targetNo se ha podido identificar el servicioEjecutar services --json
needs_confirmLa acción destructiva no tiene aprobaciónPreguntar a un humano
deploy_trigger_failedNo se ha podido iniciar el despliegueInformar del error de la API
deploy_failedEl build o el despliegue han terminado con un falloLeer los logs del build
deploy_timeoutSigue en ejecución después del límite de esperaInformar de la incertidumbre o ampliar el límite de forma deliberada

El mensaje de error sigue siendo un contexto útil, pero el código dirige la primera decisión. Esto hace que la automatización sea resistente a cambios en la redacción o la localización.

La confirmación también forma parte del protocolo. Un comando destructivo no debería ejecutarse silenciosamente porque quien lo invoca no sea interactivo. Dockup rechaza estas operaciones sin --yes y devuelve needs_confirm. Un agente autónomo ve una solicitud de confirmación, no una barrera que deba eludirse.

El modelo de seguridad se analiza con más detalle en prácticas recomendadas de seguridad.

¿Cuál es el contrato mínimo de una CLI preparada para producción?

Una CLI para agentes de IA preparada para producción debería cumplir un contrato pequeño, pero estricto:

  1. Todas las operaciones de lectura y escritura tienen una salida legible por máquinas.
  2. Los fallos producen un código de salida distinto de cero.
  3. Las mutaciones asíncronas pueden esperar hasta un estado terminal documentado.
  4. Los valores secretos nunca se devuelven mediante comandos de lectura.
  5. Las acciones destructivas requieren una confirmación explícita.
  6. Los errores tienen códigos estables adecuados para ramificar la lógica.
  7. El paquete de la CLI y las instrucciones del agente se mantienen alineados con la versión.
  8. Las mutaciones se registran en un audit trail.

La skill de Dockup convierte estas reglas en el comportamiento predeterminado para Claude Code y Codex. Indica al agente que use JSON, se autentique con DOCKUP_TOKEN, descubra los destinos exactos, haga deploy con --wait, proteja las credenciales y se detenga ante needs_confirm.

Compara este modelo con los conceptos más amplios de agent skills frente a MCP. Una skill proporciona conocimiento operativo; la CLI sigue siendo la interfaz ejecutable cuyos códigos de salida y cuya salida definen la verdad.

Una matriz de pruebas para un comando orientado a agentes

Antes de exponer cualquier comando de infraestructura a un agente, prueba algo más que el happy path:

PruebaComportamiento esperado
Solicitud válidaResultado JSON y salida 0
Token no válidoCódigo de autenticación estable y salida distinta de cero
Destino desconocidoCódigo de destino estable y ninguna mutación
Deploy de larga duraciónEspera hasta el estado terminal o el timeout
Deploy fallidoSalida distinta de cero más un ID de despliegue que permita diagnosticar
Falta de aprobación destructivaneeds_confirm, sin eliminación
Lectura de un secretoMetadatos de la clave visibles y valor oculto
Advertencia durante la salida JSONAdvertencia en stderr y JSON válido en stdout

Esta matriz es más valiosa que un spinner de progreso pulido. El formato para humanos puede añadirse por encima; un contrato determinista para máquinas no puede reconstruirse después.

La documentación de la CLI de Dockup muestra los comandos concretos que sustentan este modelo, mientras que desarrollo con IA explica el cambio más amplio del uso manual de herramientas a los workflows dirigidos por agentes.

Trata la observabilidad como parte del contrato del comando

Una mutación orientada a agentes debería devolver identificadores que permitan investigar posteriormente. Una respuesta de despliegue necesita el destino y el ID del despliegue; una base de datos creada necesita un slug estable; un snapshot de un volumen necesita su ID de snapshot. Sin estas referencias, el agente puede describir un evento, pero no puede inspeccionarlo, reintentarlo o revertirlo de forma fiable.

El audit trail completa el contrato. La salida estructurada explica una invocación, mientras que los registros de auditoría conectan varias invocaciones a lo largo del tiempo. Juntos permiten a los operadores responder si el agente actuó sobre el recurso previsto y si un comando de recuperación posterior se refería al mismo evento de producción.

Mantén la interfaz sencilla

Una CLI para agentes de IA fiable no debería sorprender bajo condiciones de éxito, fallo, timeout o reintento.

Prueba final de la interfaz

La CLI para agentes de IA debe fallar con veracidad.

Lleva el workflow a producción

Prueba primero el contrato desde un shell: verifica el parseo de JSON, una salida correcta, un fallo forzado, un timeout y una operación destructiva bloqueada antes de delegar el acceso a producción.

npm install -g dockup-cli
dockup skill install

El primer comando instala la CLI. El segundo instala la skill de Dockup compatible con Claude Code y Codex. Empieza gratis en app.dockup.ai.

Preguntas frecuentes

¿Qué hace que una CLI sea adecuada para agentes de IA?

Necesita una salida estructurada, códigos de salida reales, espera hasta estados terminales, códigos de error estables, ocultación de secretos y confirmación explícita para las operaciones destructivas.

¿Por qué es mejor el JSON que la salida de una CLI con formato para humanos cuando la utilizan agentes?

El JSON proporciona nombres y tipos de campo estables. El agente no tiene que inferir el significado a partir de colores, tablas, puntuación o una redacción cambiante.

¿Por qué una solicitud de despliegue aceptada no equivale a un éxito?

La aceptación solo demuestra que la plataforma puso la operación en cola. El build, el arranque, la comprobación de salud y el cambio de tráfico posteriores todavía pueden fallar.

¿Cuál es el timeout de espera predeterminado de los despliegues de Dockup?

El timeout predeterminado de dockup deploy --wait es de 900 segundos y puede cambiarse con la opción documentada --timeout.

¿Cómo debería reaccionar un agente ante needs_confirm?

Debería detenerse y solicitar una aprobación explícita. El código significa que la acción solicitada es destructiva y se ha decidido no ejecutarla.