Saltar al contenido

Claude Code · Principiante

Tus propios /comandosconvierte lo que le repites a Claude en un comando que se dispara solo cuando lo dices

Si te descubres pegando las mismas instrucciones en el chat una y otra vez —cómo desplegar, cómo revisar un diff, con qué tono redactar—, eso ya es un comando. Claude Code deja convertirlo en un archivo que se invoca escribiendo una barra y su nombre. La parte que se pasa por alto es la otra mitad: bien escrito, el comando también se dispara solo cuando dices 'termino por hoy' o 'qué cambié', sin que recuerdes su nombre. Todo depende de una línea del frontmatter.

Publicada 28 de agosto de 2026Lectura 16 minSin saber programar

De un vistazo

01

Lo que le repites a Claude se vuelve un archivo

02

La descripción escrita como gatillo lo dispara solo

03

Tres comandos completos para copiar y adaptar

01 el punto de partida

Anatomía de un comando

Un comando es un archivo .md cuyo nombre es el nombre del comando: deploy.md crea /deploy. Vive en ~/.claude/commands/ si lo quieres en todos tus proyectos, o en .claude/commands/ dentro de un repo si es de ese proyecto. Adentro tiene dos partes:

Frontmatter (entre ---)

YAML con metadatos. El único que importa de verdad es description: Claude lo lee en cada conversación para decidir si el comando aplica a lo que pediste. Los demás campos ajustan cómo corre.

Cuerpo (markdown)

Las instrucciones que Claude recibe cuando el comando se ejecuta. Se escriben como le hablarías a un colega: pasos numerados, formato de salida esperado, qué no hacer. Solo se carga cuando el comando corre, así que puede ser largo sin costar contexto.

El comando mínimo que funciona
---
description: Explica el archivo que te pasen en tres frases. Usa cuando pregunten "qué hace este archivo" o "explícame esto".
---

Explica $ARGUMENTS en tres frases: qué hace, quién lo llama y qué rompería si se borra.

Desde 2026 los comandos y las skills son la misma cosa por dentro: .claude/commands/deploy.md y .claude/skills/deploy/SKILL.md crean el mismo /deploy. La diferencia es que una skill es una carpeta y puede llevar archivos de apoyo. Para un comando de una página, el archivo suelto basta.

02 la idea central

El description como lista de gatillos

Claude tiene dos maneras de ejecutar un comando: tú escribes /nombre, o Claude decide solo que lo que dijiste encaja con la descripción. Para lo segundo, la descripción tiene que contener las frases que realmente dices. No 'gestiona el cierre de la sesión de trabajo' sino, literal, 'termino por hoy', 'guarda lo que hicimos', 'ya, paso aquí'.

Esta es la fórmula que uso en todos mis comandos. Primero qué hace, en una frase. Luego la palabra 'Usa cuando se mencione' y una lista de frases entre comillas:

description escrito como gatillos
---
description: Cierra la sesión guardando el resumen en STATE.md y termina la conversación. Usa cuando se mencione "cerrar sesión", "termino por hoy", "guarda el estado", "guarda lo que hicimos", "registra esta sesión", "voy a cerrar", "ya, paso aquí".
---
  • Escribe las frases como las dices tú, con tus muletillas. Si sueles decir 'súbelo', pon 'súbelo', no 'desplegar a producción'.
  • Incluye variantes: 'cierra todos', 'cierra todas las sesiones', 'apaga todo'. Cada una es una puerta más.
  • Pon el caso de uso principal al inicio. La descripción se corta a 1,536 caracteres en el listado que Claude ve, así que lo importante va primero.
  • Si dos comandos comparten frases, Claude puede confundirlos. Dales gatillos que no se crucen o une los comandos.

Si el description te queda largo, hay un campo aparte para las frases: when_to_use. Claude Code lo pega a continuación del description en el listado, así que funciona igual para disparar el comando, pero te deja el description limpio (qué hace) y las frases en su propio renglón. Ojo: los dos juntos cuentan para el mismo tope de 1,536 caracteres.

description + when_to_use
---
description: Cierra la sesión guardando el resumen en STATE.md y deja lista la siguiente.
when_to_use: "termino por hoy", "guarda lo que hicimos", "ya, paso aquí", "cierra la sesión", "registra esta sesión"
---

La prueba de fuego: abre un chat nuevo y escribe una de las frases sin la barra. Si el comando no se dispara, la frase no está en el description o está enterrada al final. Y si /nombre funciona pero nunca se dispara solo, sospecha del YAML: cuando el frontmatter está mal cerrado, Claude Code carga el cuerpo sin metadatos, así que el comando existe pero Claude no tiene description contra qué comparar.

03 los campos que sí cambian algo

Frontmatter: lo que vale la pena conocer

Hay más de quince campos posibles. Estos son los ocho que cambian el comportamiento en la práctica; el resto (effort, hooks, disallowed-tools, agent, background) puedes ignorarlo hasta que lo necesites.

CampoQué haceCuándo usarlo
descriptionLo que Claude lee para decidir si el comando aplica.Siempre. Escrito como gatillos.
when_to_useFrases gatillo aparte del description; se pegan al listado que Claude ve.Cuando quieres el description corto y las frases en su renglón.
argument-hintPista que aparece en el autocompletado: [nombre-proyecto].Cuando el comando recibe argumentos.
disable-model-invocation: trueSolo tú puedes lanzarlo; Claude no lo dispara por su cuenta.Comandos con efectos: desplegar, enviar, borrar, cobrar.
user-invocable: falseLo contrario: no aparece en el menú de / y solo Claude lo carga cuando aplica.Conocimiento de fondo (cómo funciona un sistema viejo) que no es una acción.
allowed-toolsHerramientas que corren sin pedir permiso mientras dura el comando (p. ej. Bash(git *)). El permiso se borra con tu siguiente mensaje.Comandos que hacen varias llamadas de terminal seguidas.
modelModelo con el que corre el comando, solo por ese turno.Un modelo barato para tareas mecánicas; uno fuerte para revisar.
context: forkCorre en un subagente aparte y no ensucia tu conversación.Tareas largas de lectura (auditorías, resúmenes de repos).

La decisión más importante es disable-model-invocation. Un comando que hace algo irreversible no debe poder dispararse porque Claude 'entendió' que querías. Si el comando despliega, cobra o manda mensajes, ponlo en true y lánzalo tú.

04 parámetros

Pasar argumentos

Todo lo que escribas después del nombre del comando llega al cuerpo. $ARGUMENTS es el texto completo; $0, $1, $2 son cada palabra por separado (con comillas para agrupar varias). Si el cuerpo no usa ningún marcador, Claude Code pega el texto al final como 'ARGUMENTS: ...', así que nunca se pierde.

Argumentos posicionales
---
description: Crea un componente React con su archivo de estilos y su prueba.
argument-hint: [Nombre] [carpeta]
---

Crea el componente $0 dentro de $1 con tres archivos:
$0.tsx, $0.module.css y $0.test.tsx.
Si $1 está vacío, usa components/.
Cómo se invoca
/componente Boton ui/botones
$0 vale Boton y $1 vale ui/botones. Con /componente "Tarjeta de precio" el argumento entre comillas llega completo a $0.

05 el truco más útil

Inyectar la salida de la terminal antes de que Claude lea

Si una línea del cuerpo empieza con !`comando`, Claude Code ejecuta ese comando y sustituye la línea por su salida antes de mandarle el texto a Claude. Claude no ve el comando: ve el resultado. Es la diferencia entre 'revisa mis cambios' (Claude tiene que ir a buscarlos, y a veces adivina) y darle el diff ya pegado.

~/.claude/commands/resumen-cambios.md
---
description: Resume los cambios sin commitear y señala riesgos. Usa cuando se mencione "qué cambié", "resume mis cambios", "revisa el diff", "dame un mensaje de commit".
allowed-tools: Bash(git *)
---

## Cambios actuales

!`git status --short`

!`git diff HEAD`

## Instrucciones

1. Resume los cambios en dos o tres bullets, agrupados por tema (no por archivo).
2. Señala riesgos: manejo de errores faltante, valores fijos en código, pruebas que habría que actualizar.
3. Propón un mensaje de commit de una línea en imperativo.
Si el diff está vacío, di que no hay cambios sin commitear y termina.

Para varias líneas de comandos, en vez de la forma inline se abre un bloque de código con ```! y se cierra normal. Dos detalles: el ! tiene que ir al inicio de línea o tras un espacio, y la salida no se vuelve a escanear (un comando no puede generar otro).

06 para copiar

Tres comandos completos

Los tres están en el repo público de esta guía y cubren los tres patrones que más se repiten: lectura con contexto inyectado (el de arriba), acción con efectos que solo tú lanzas, y alias.

Instalar los tres desde el repo (terminal)
mkdir -p ~/.claude/commands && for c in resumen-cambios deploy-preview estudio; do curl -fsSL https://raw.githubusercontent.com/davidiriza-lab/slash-commands-claude-code/main/commands/$c.md -o ~/.claude/commands/$c.md; done
Repo con licencia MIT: github.com/davidiriza-lab/slash-commands-claude-code. Edita el description de cada uno con tus propias frases.

2. Un despliegue que solo tú puedes lanzar

~/.claude/commands/deploy-preview.md
---
description: Despliega un preview del proyecto actual y devuelve la URL para revisar. Nunca a producción.
argument-hint: [rama opcional]
disable-model-invocation: true
allowed-tools: Bash(git *), Bash(npm run build), Bash(vercel *)
---

Despliega un preview del proyecto en el directorio actual.

1. Si $ARGUMENTS no está vacío, cámbiate a esa rama con git checkout.
2. Corre la build local (npm run build). Si falla, muestra el error y DETENTE: no despliegues nada roto.
3. Despliega como preview (sin la bandera de producción).
4. Responde solo con: la URL del preview, la rama y el hash corto del último commit.

Prohibido: cualquier bandera de producción, cualquier cambio de alias o dominio. Si el usuario lo pide, dile que use el comando de producción por separado.

Fíjate en tres cosas: disable-model-invocation para que 'esto ya está listo' no se convierta en un despliegue; allowed-tools para que no te pida permiso en cada paso de terminal; y una lista explícita de prohibiciones al final. Los comandos con efectos se escriben pensando en lo que NO deben hacer.

3. Un alias de una línea

~/.claude/commands/estudio.md
---
description: Alias de /diseno — dirección de arte antes de construir cualquier pieza visual.
---

Ejecuta el comando /diseno con estos argumentos: $ARGUMENTS

Sirve para tener dos nombres para lo mismo (uno formal y uno que se te sale solo) o para renombrar un comando sin romper el hábito. El cuerpo es una sola línea que delega.

07 quién gana

Global, proyecto, plugin: cómo conviven

En cuanto tienes comandos en dos lugares aparecen las dudas: ¿cuál corre si dos se llaman igual? ¿Tengo que reiniciar cuando edito uno? ¿Los ve Claude si abro la terminal en una subcarpeta? Esto es lo que comprobé contra la documentación:

  • Mismo nombre en ~/.claude/ y en el repo: gana el global. Si quieres que un proyecto tenga su propio /deploy distinto del tuyo, ponle otro nombre (deploy-cliente) o no tengas uno global.
  • Mismo nombre como archivo suelto (commands/) y como carpeta (skills/): gana la carpeta.
  • Un comando tuyo con el nombre de uno integrado (code-review) lo reemplaza, pero los alias del integrado (/review) siguen apuntando al original.
  • Los comandos que vienen en un plugin llevan prefijo (/mi-plugin:deploy), así que nunca chocan con los tuyos.
  • Editar, crear o borrar un archivo se detecta en la sesión abierta, sin reiniciar. La excepción: si creas la carpeta commands/ o skills/ desde cero, reinicia para que Claude Code empiece a vigilarla.
  • Si arrancas en una subcarpeta del repo, los comandos de la raíz se cargan igual. Y en un monorepo, una subcarpeta puede tener sus propios comandos: aparecen con nombre calificado (apps/web:deploy) y aplican cuando Claude trabaja archivos de ahí.
  • Las carpetas que agregas con --add-dir o /add-dir no cargan casi nada de configuración, pero los comandos son la excepción: sus .claude/commands/ y .claude/skills/ sí entran.

08 diagnóstico

Cuando un comando no se dispara (o se dispara de más)

Si no se dispara

  1. Pregúntale a Claude, en texto normal, qué comandos o skills tiene disponibles. Si el tuyo no aparece, es un problema de ubicación o de YAML, no de gatillos.
  2. Si aparece pero no se dispara, escribe la frase exacta que usaste en la vida real y compárala con el description. Casi siempre la frase no está, o está al final y se recortó.
  3. Corre /doctor: te estima cuánto contexto ocupa el listado de comandos y quiénes son los que más pesan. Si el listado se pasa del presupuesto (1% de la ventana del modelo), Claude Code recorta descriptions empezando por los comandos que menos invocas, y con ellas se van tus gatillos.
  4. En /context, la fila Skills muestra el tamaño real del listado ya recortado. Es la cifra que sí llega al modelo.
  5. Lánzalo con /nombre. Si así funciona pero solo nunca, vuelve al YAML: un frontmatter mal cerrado deja el cuerpo vivo y el description vacío.

Si se dispara de más

  1. Haz el description más específico: quita frases que también usas para otras cosas ('revisa esto' dispara cualquier cosa).
  2. Si el comando tiene efectos, ponle disable-model-invocation: true y listo: solo tú lo lanzas.
  3. Si es un comando de un repo compartido y no quieres editar el archivo, abre /skills, selecciónalo y pulsa espacio para cambiarlo a 'solo usuario' o apagarlo; se guarda en .claude/settings.local.json, sin tocar el repo.

Para liberar presupuesto sin borrar nada, el mismo ajuste de /skills deja un comando en 'solo nombre': sigue existiendo, pero su description ya no ocupa contexto. Es la forma sana de tener veinte comandos y que los cinco importantes no pierdan sus gatillos.

09 no todo lo escribes tú

Instalar comandos de otros (y compartir los tuyos)

Como un comando es un archivo, compartirlo es copiar un archivo: el curl de arriba es la forma más honesta. Pero hay dos caminos más cómodos cuando son varios o cuando quieres que se actualicen.

Ver qué trae un repo de skills antes de instalar nada
npx skills add mattpocock/skills -l
La CLI 'skills' (formato abierto de agentskills.io) lista los comandos del repo con su description y no instala nada con -l. Lo probé: clona el repo y muestra 37 skills con sus gatillos. Sin -l instala; con -g va a ~/.claude/, sin -g va al proyecto; --copy copia archivos en vez de enlazarlos.
Que Claude te recomiende comandos para tu repo
/plugin install claude-code-setup@claude-plugins-official
Plugin oficial de Anthropic. Es de solo lectura: escanea el proyecto y propone uno o dos comandos, hooks, subagentes y MCPs por categoría, sin instalar nada. Si te dice que no encuentra el plugin, primero /plugin marketplace add anthropics/claude-plugins-official. Revisé su código: una sola skill con referencias, sin escrituras.

Para el otro sentido, publicar los tuyos, ve de menos a más: un repo con la carpeta commands/ y un curl en el README basta para uno o tres comandos. Cuando son una colección con archivos de apoyo, conviértelos en skills (carpeta por comando) para que la CLI de arriba los instale con una línea. El plugin es el último escalón, cuando además quieres empaquetar hooks o MCPs y tener prefijo propio.

Antes de instalar la colección de alguien, lee sus descriptions: cada una entra al listado que Claude ve en todas tus conversaciones y compite por el mismo presupuesto que tus gatillos. Instala los dos que vas a usar, no los treinta.

10 cuando pasan de cinco

Organizar una colección

  • Global vs proyecto: lo que usas en todos lados (sesiones, revisiones, copy) va en ~/.claude/commands/. Lo que solo tiene sentido en un repo (su despliegue, sus plantillas) va en .claude/commands/ de ese repo, y viaja con él.
  • Un comando, una acción. Si el cuerpo tiene 'y luego, si el usuario quiere...', son dos comandos.
  • Cuando un comando necesita archivos de apoyo (plantillas, listas, ejemplos), conviértelo en skill: una carpeta con SKILL.md y los archivos al lado, referenciados con ${CLAUDE_SKILL_DIR}.
  • Versiona los globales. ~/.claude/commands/ como repo de git te da historial y te deja instalarlos en otra máquina con un clone.
  • Revisa el listado de vez en cuando: cada description ocupa contexto en todas tus conversaciones. Un comando que no usas hace tres meses se borra, se marca disable-model-invocation o se deja en 'solo nombre' desde /skills.
  • Un archivo por comando también en git: cuando un description cambia y el comando deja de dispararse, el diff te dice qué frase quitaste.

FAQ lo que suelen preguntar

Preguntas frecuentes

¿Comando o skill? ¿Cuál creo?

Hoy son lo mismo por dentro. Empieza con un archivo .md en commands/. Cuando necesites archivos de apoyo o quieras compartirlo como paquete, muévelo a una carpeta skills/nombre/SKILL.md. El nombre del comando y el frontmatter no cambian.

¿Puedo poner el description en español?

Sí, y conviene: los gatillos tienen que estar en el idioma en que le hablas a Claude. Si escribes 'termino por hoy' en español, el description debe decir 'termino por hoy' en español.

¿Cuánto contexto consume tener muchos comandos?

Solo las descripciones se cargan en cada conversación; el cuerpo se carga al ejecutar. Por eso el description se corta a 1,536 caracteres y por eso conviene podar los que no usas. Un comando con disable-model-invocation: true ni siquiera carga su description.

¿Qué pasa si escribo /nombre con argumentos pero el cuerpo no tiene $ARGUMENTS?

Claude Code agrega 'ARGUMENTS: lo que escribiste' al final del cuerpo. Claude lo ve igual, pero sin control de dónde va. Para cualquier comando que reciba parámetros, usa el marcador.

¿Puede un comando llamar a otro?

Sí: en el cuerpo pides 'ejecuta /otro-comando con ...'. Es el patrón del alias. También puedes escribir varios comandos seguidos al inicio de un mensaje (/uno /dos texto) y todos reciben el texto como argumento: hasta seis, y solo a partir de la versión 2.1.199 de Claude Code; antes, el segundo llegaba como texto literal al primero.

¿Puedo apagar un comando sin borrarlo?

Sí. Abre /skills, selecciónalo y pulsa espacio: rota entre encendido, solo nombre (sin description en contexto), solo usuario (Claude no lo dispara) y apagado. Se guarda en .claude/settings.local.json, así que sirve incluso para comandos de un repo ajeno que no quieres editar. Los que vienen en plugins no entran ahí; esos se manejan desde /plugin.

Edité el comando y Claude sigue usando la versión vieja

Los cambios en el archivo se detectan en la misma sesión, sin reiniciar. Dos casos donde no: creaste la carpeta commands/ o skills/ después de abrir Claude Code (reinicia para que la vigile), o el comando vive en un plugin y lo que cambiaste no es el SKILL.md (ahí toca /reload-plugins).

Tengo un /deploy global y otro en el repo. ¿Cuál corre?

El global. Personal gana a proyecto, y una carpeta skills/ gana a un archivo commands/ del mismo nombre. Si quieres que cada repo tenga su despliegue, no tengas un /deploy global: nómbralos por proyecto o deja el global como plantilla que copias.

¿Cómo sé cuánto contexto me están costando mis comandos?

/doctor te da la estimación y los que más pesan; /context muestra en la fila Skills el tamaño del listado ya recortado. El presupuesto es el 1% de la ventana del modelo y se puede subir con skillListingBudgetFraction en settings, pero antes de subirlo poda: deja en 'solo nombre' los que rara vez usas.

Cierre de la guía

Un comando propio no es más que una instrucción que escribiste bien una vez. La ganancia grande no está en ahorrarte teclear /nombre, sino en que Claude reconozca tus propias frases y actúe: por eso el description se escribe como gatillos. Empieza por el que más repites, dale sus frases reales, y en una semana tendrás cinco. Esta guía vive en el Lab de David Iriza.

Fuentes oficiales4

Sigue con estas guías

Guía escrita con la información oficial disponible al 28 de agosto de 2026. Esta página no está afiliada a Anthropic. Las herramientas cambian; ante la duda, revisa la documentación oficial de Claude Code.