TL;DR Una skill deja de ser un guión fijo cuando le pasas argumentos. Declara
arguments: name typeen el frontmatter y usa$name/$typeen el cuerpo (la vía más legible); o tira de posicionales 0-based ($0el primero,$1el segundo) o de$ARGUMENTS(todo de golpe).argument-hintte lo autocompleta, y editar el texto delSKILL.mdse recoge en vivo.
Escribes una skill para revisar un componente y funciona. Luego quieres casi la misma para otro caso y acabas duplicando el SKILL.md. No hace falta: una skill puede recibir argumentos y comportarse distinto en cada llamada. Ese es el salto de comando fijo a plantilla.
Lo que ves
/component SearchBar form
└ $name └ $type
→ "Crea un componente Vue llamado SearchBar, de tipo form…"
Las tres formas de recibir argumentos
1. $ARGUMENTS — todo lo que escribes
Lo más simple: $ARGUMENTS se sustituye por la cadena entera que va tras el comando. Si no lo pones en el cuerpo, Claude Code te lo anexa igual como ARGUMENTS: <valor>, así que nunca se pierde.
2. Posicionales $0, $1 — ojo, son 0-based
$0 es el primer argumento, $1 el segundo (equivalen a $ARGUMENTS[0] y $ARGUMENTS[1]). El desliz típico es esperar que $1 sea el primero: no lo es. Para valores con espacios, comíllalos: /skill "hello world" second deja $0 = hello world y $1 = second.
3. Named arguments — la más legible
Declara los nombres en el frontmatter y úsalos por nombre. Se auto-documenta y sobrevive a que reordenes el texto:
---
name: component
description: Genera un componente Vue con sus tests.
argument-hint: [name] [type]
arguments: name type
disable-model-invocation: true
---
Crea un componente Vue 3 llamado `$name`, de tipo `$type`.
- Estructura clara (lógica, template, estilos).
- Props tipadas y con valores por defecto.
- Un test que cubra el caso principal.
Invócala:
/component SearchBar form
$name → SearchBar, $type → form. Los nombres mapean a las posiciones en orden.
Referencia
| Sustitución | Qué inserta |
|---|---|
$ARGUMENTS |
Todo lo que escribes tras el comando |
$ARGUMENTS[0] / $0 |
El primer argumento (0-based) |
$ARGUMENTS[1] / $1 |
El segundo argumento |
$name |
El argumento nombrado en arguments:, por posición |
| Frontmatter | Qué hace |
|---|---|
arguments |
Nombra los posicionales para usar $name en el cuerpo (string o lista YAML) |
argument-hint |
Pista en el autocompletado: [name] [type] |
disable-model-invocation |
true para que solo tú lo invoques (lo normal en un comando con args) |
Gotchas reales:
- 0-based: si esperas el primer argumento, es
$0, no$1. $literal: escápalo con backslash (\$1.00) para que no lo trate como argumento.- En vivo: cambiar el texto del
SKILL.mdse recoge sin reiniciar; solo loshooks/,.mcp.jsonoagents/de un plugin necesitan/reload-plugins.
Esto amplía Crea comandos reutilizables con skills: allí montas el SKILL.md, aquí lo conviertes en una plantilla que rellenas por llamada. Y recuerda que ahí custom commands y skills son ya lo mismo: .claude/commands/deploy.md y .claude/skills/deploy/SKILL.md crean el mismo /deploy.
Documentación oficial: Extender Claude con skills
Relacionado: Crea comandos reutilizables con skills
Requisitos
- Una skill de Claude Code (
~/.claude/skills/<nombre>/SKILL.mdpara tenerla en todos tus proyectos).