Nuevo comando /project:create-skill que crea skills en .claude/skills/ siguiendo
la estructura oficial de Claude Code. Incluye:
- Flujo completo: validación, creación de carpeta/SKILL.md, confirmación, git push
- Soporte para 3 tipos de invocación: ambos, solo_usuario, solo_claude
- Referencia completa de campos del frontmatter (name, description, allowed-tools, etc)
- Referencia de variables dinámicas ($ARGUMENTS, $0, ${CLAUDE_SKILL_DIR}, etc)
- Template base en .claude/templates/skill.md
- Troubleshooting incluido
Los skills son la forma moderna de extender Claude Code, evolucionando desde
el sistema de commands.
7.1 KiB
version, updated, tags
| version | updated | tags | ||||
|---|---|---|---|---|---|---|
| 1.0.0 | 2026-03-21 |
|
Command: create-skill
Crea un nuevo skill en .claude/skills/ siguiendo la estructura oficial de Claude Code. Cada skill es una carpeta con un archivo SKILL.md obligatorio.
Flujo completo:
- Solicita inputs del skill
- Crea la carpeta y archivo
SKILL.md - Muestra el contenido al usuario
- Pregunta si está bien
- Si el usuario confirma → ejecuta
/git:pushautomáticamente
Para el usuario
Cuándo usar este comando
- Cuando quieras crear un nuevo skill personalizado
- Para automatizar tareas repetitivas con instrucciones específicas
- Para crear comandos que Claude pueda invocar automáticamente
Sintaxis
/project:create-skill [nombre]
Ejemplos
Ejemplo 1:
/project:create-skill code-review
Crea un skill para revisión de código en .claude/skills/code-review/SKILL.md
Ejemplo 2:
/project:create-skill deploy
Crea un skill de despliegue con disable-model-invocation: true (solo usuario puede invocarlo)
Para Claude
Precondiciones
Verificar antes de ejecutar:
- Carpeta
.claude/skills/existe - No existe ya un skill con el mismo nombre
- El nombre cumple convenciones (minúsculas, guiones)
Inputs
Se necesitan los siguientes datos. Si no se proporcionan, preguntar al usuario:
nombre: nombre del skill (minúsculas y guiones, sin espacios)descripcion: qué hace el skill y cuándo usarlo (1-2 frases)tipo_invocacion: quién puede invocarloambos(default): usuario y Claude pueden invocarlosolo_usuario: solo el usuario puede invocarlo (disable-model-invocation: true)solo_claude: solo Claude puede invocarlo (user-invocable: false)
argument_hint(opcional): pista de argumentos, ej:[archivo] [formato]allowed_tools(opcional): herramientas permitidas sin confirmacióninstrucciones: contenido markdown con las instrucciones del skill
Flujo obligatorio
1. Validar nombre del skill
- Solo minúsculas, números y guiones (no underscores ni espacios)
- No usar nombres reservados (help, clear, exit)
- Máximo 64 caracteres
ls -d .claude/skills/*/ 2>/dev/null | xargs -n1 basename | grep -E "^${nombre}$"
Si existe, STOP e informar al usuario.
2. Crear carpeta del skill
mkdir -p .claude/skills/${nombre}
3. Determinar campos del frontmatter
Según el tipo_invocacion:
| Tipo | disable-model-invocation | user-invocable |
|---|---|---|
ambos |
(omitir) | (omitir) |
solo_usuario |
true |
(omitir) |
solo_claude |
(omitir) | false |
4. Generar contenido SKILL.md
Usar el template en .claude/templates/skill.md si existe, o generar:
---
name: ${nombre}
description: ${descripcion}
argument-hint: ${argument_hint} # solo si se proporciona
disable-model-invocation: true # solo si tipo = solo_usuario
user-invocable: false # solo si tipo = solo_claude
allowed-tools: ${allowed_tools} # solo si se proporciona
---
# ${nombre}
${instrucciones}
Reglas de generación:
- Omitir campos opcionales si no se proporcionan
- El campo
namepuede omitirse si coincide con el nombre de la carpeta - La descripción debe ser clara para que Claude sepa cuándo invocarlo
5. Escribir archivo SKILL.md
cat > .claude/skills/${nombre}/SKILL.md << 'EOF'
${contenido_generado}
EOF
6. Mostrar el skill creado y confirmar
{{include: ask-user-confirm}}
Mostrar al usuario:
Skill creado: ${nombre}
Ubicación: .claude/skills/${nombre}/SKILL.md
Contenido:
---
${contenido_completo}
---
¿Te parece bien el skill?
- Si es correcto: se hará commit y push automáticamente
- Si necesitas ajustes: edítalo manualmente antes
Esperar respuesta:
- Si SÍ → continuar al paso 7
- Si NO → STOP y decir: "Edita el archivo y cuando estés listo ejecuta
/git:push"
7. Ejecutar git-push automáticamente
Una vez confirmado, ejecutar /git:push para:
- Crear rama
quick/project:create-skill-${nombre} - Commitear
.claude/skills/${nombre}/SKILL.md - Mergear a master con
--no-ff - Push a remoto
- Limpiar rama local
8. Verificar disponibilidad
Informar al usuario:
✓ Skill /${nombre} creado e integrado a master
Para usar:
/${nombre} [argumentos]
Tipo de invocación: ${tipo_invocacion}
- ambos: tú y Claude pueden invocarlo
- solo_usuario: solo tú con /${nombre}
- solo_claude: Claude lo invoca automáticamente cuando es relevante
Convenciones
- Nombres descriptivos: usar verbos o sustantivos claros (
code-review,deploy,format-code) - Guiones para separar:
code-review, nocode_reviewnicodeReview - Descripciones claras: Claude usa la descripción para decidir cuándo invocar el skill
- Un skill por tarea: mantener skills enfocados en una sola responsabilidad
Campos del frontmatter (referencia)
| Campo | Tipo | Descripción |
|---|---|---|
name |
string | Nombre del skill (opcional si = carpeta) |
description |
string | Qué hace y cuándo usarlo |
argument-hint |
string | Pista: [archivo], [issue-number] |
disable-model-invocation |
bool | true = solo usuario invoca |
user-invocable |
bool | false = solo Claude invoca |
allowed-tools |
string | Tools sin pedir permiso: Read, Grep |
context |
string | fork = ejecutar en subagente |
agent |
string | Tipo subagente: Explore, Plan |
model |
string | Modelo específico a usar |
effort |
string | low, medium, high, max |
Variables dinámicas (referencia)
Dentro del contenido del skill puedes usar:
| Variable | Descripción |
|---|---|
$ARGUMENTS |
Todos los argumentos pasados |
$0, $1, $2... |
Argumentos posicionales |
${CLAUDE_SKILL_DIR} |
Ruta absoluta del skill |
${CLAUDE_SESSION_ID} |
ID de la sesión actual |
!`comando` |
Ejecutar comando ANTES de enviar a Claude |
Troubleshooting
Error: "Skill ya existe"
Causa: Ya hay una carpeta con ese nombre en .claude/skills/
Solución:
ls .claude/skills/
# Elegir otro nombre o eliminar el existente
Error: "Nombre inválido"
Causa: El nombre contiene caracteres no permitidos
Solución:
- Solo usar: letras minúsculas, números, guiones
- No usar: espacios, underscores, mayúsculas, caracteres especiales
El skill no se invoca automáticamente
Causa: La descripción no es clara o disable-model-invocation: true
Solución:
- Revisar que la descripción incluya palabras clave relevantes
- Verificar que no tenga
disable-model-invocation: true - Si quieres invocación manual, usar
/${nombre}
Reglas críticas
- Validar nombre antes de crear: evitar sobrescribir skills existentes
- SKILL.md es obligatorio: sin él, el skill no funciona
- Descripción clara: es clave para invocación automática de Claude
- Confirmación obligatoria: siempre mostrar el skill y esperar aprobación
- Flujo automático: una vez aprobado, ejecutar
/git:push