CCDV-F · Claude Code
Headless en CI, sesiones, comandos y skills
Un job de CI le pide a Claude Code que revise cada pull request y se queda colgado esperando que alguien apruebe un permiso. Alguien propone saltear todos los controles para que no pregunte nunca más. En el mismo equipo, cada viernes una persona escribe de memoria el mismo prompt largo para armar las notas de versión. Las dos cosas se resuelven con piezas que Claude Code ya trae.
Sin nadie mirando: el modo headless
El modo headless (headless mode) corre Claude Code sin interfaz, con claude -p "..." (o --print). Para CI importa:
--output-format jsondevuelve un objeto con el resultado, el ID de sesión, el uso y el costo;stream-jsonemite eventos JSON línea por línea mientras trabaja.--json-schemajunto con--output-format jsondevuelve la salida estructurada en el campostructured_output. Si no llegó (por ejemplo, porque Claude se negó), el campo falta: el script tiene que chequearlo.--allowedToolsaprueba solo lo necesario, con la sintaxis de reglas de permisos:"Read,Grep,Bash(git diff *)".--bareevita cargar hooks, skills, plugins, servidores MCP y CLAUDE.md de la máquina, para que el resultado sea igual en cualquier runner; lo que haga falta se pasa con flags.- El código de salida es 0 si salió bien y distinto de 0 si falló, así el pipeline puede ramificar.
Modos de permisos
Los modos de permisos (permission modes) fijan qué corre sin preguntar:
| Modo | Qué corre sin preguntar |
|---|---|
default (manual) |
Solo lecturas |
acceptEdits |
Lecturas, ediciones de archivos y comandos comunes de archivos en el directorio de trabajo |
plan |
Analiza y propone un plan sin editar |
auto |
Casi todo, con un clasificador que revisa cada acción y bloquea lo que se sale del pedido |
dontAsk |
Lo preaprobado; lo que preguntaría se deniega (útil para CI cerrado) |
bypassPermissions |
Todo; solo en contenedores o máquinas aisladas |
Para menos avisos con red de seguridad está auto; “permisos totales para que no pregunte” casi nunca es la respuesta.
Sesiones
claude --continueabre la sesión más reciente del directorio;claude --resume <nombre>retoma una sesión puntual. Las sesiones se nombran con-nal arrancar o con/rename.- Para bifurcar una sesión (fork a session) y probar otro camino sin tocar la original:
/branchadentro, o--fork-sessionjunto con--resumeo--continue. /clearempieza con contexto vacío (la sesión anterior queda guardada) y/compactreemplaza el historial por un resumen.
Ojo: si después de una investigación abriste otra sesión, --continue ya no te lleva a la investigación. Para reanudar una sesión (resume a session) puntual, va --resume con su nombre.
Comandos, skills, agentes y memoria
- Comandos de barra (slash commands) integrados:
/init,/clear,/compact,/resume,/memory, entre otros. - Skills: un procedimiento que se repite va en
.claude/skills/<nombre>/SKILL.mddel proyecto, se commitea y todos lo invocan con/nombre. Los comandos propios de.claude/commands/siguen funcionando y se comportan igual. Al inicio solo se carga la descripción; el cuerpo, cuando se usa. Condisable-model-invocation: true, Claude no lo dispara solo, lo que importa si tiene efectos (crear un borrador de release, desplegar). - Agentes: subagentes en
.claude/agents/, con sus herramientas y su propio contexto, para tareas que conviene aislar. - Memoria automática (auto memory): notas que Claude escribe solo a partir de tus correcciones, por repositorio. Se revisa y se apaga con
/memory. Es contexto, igual que CLAUDE.md.
Las trampas típicas
bypassPermissionso permisos totales en CI “para que no se trabe”.- Parsear la salida en texto plano en lugar de
--output-format json. - Usar
--continuepara volver a una sesión que ya no es la más reciente. - Reescribir a mano cada semana un prompt que podría ser una skill del proyecto.
- Dejar que Claude invoque solo una skill con efectos.
En el examen
Si algo tiene que correr sin nadie mirando, buscá claude -p con salida JSON y --allowedTools acotado. Si hay que volver a una sesión puntual y probar alternativas, buscá --resume con el nombre y /branch. Y si alguien repite un procedimiento a mano, buscá una skill versionada en el proyecto, con invocación del modelo desactivada si tiene efectos.
Pregunta rápida
Una pregunta del simulacro sobre este dominio. Cuenta para tu progreso.
Every Friday, developers on a mobile team ask Claude Code to prepare the weekly release notes. Each person types a long prompt from memory: collect merged PRs since the last tag, group them by feature area, flag anything touching payments, and write the summary in the team's template. Results vary a lot because people forget steps or phrase them differently.
The tech lead wants everyone to run the same procedure with one short command, keep it versioned with the code, and make sure Claude never starts it on its own, since it creates a draft release.
What should the team set up?