¿Te encuentras explicándole repetidamente a Claude cuáles son los estándares de código de tu equipo? ¿En cada revisión de Pull Request (PR) tienes que volver a describir cómo quieres que se estructure el feedback? ¿Tienes un bloque enorme en tu CLAUDE.md que en realidad es un procedimiento, no un hecho del proyecto? Si tu respuesta es sí, entonces necesitas conocer las Agent Skills.
En este artículo de mi serie "Aprende conmigo" vamos a sumergirnos profundamente en el mundo de las Agent Skills de Claude Code, basándonos en el curso oficial Introduction to Agent Skills de Anthropic y en la documentación oficial. Aprenderemos qué son, cómo crearlas, configurarlas con todas sus opciones avanzadas, gestionarlas, distribuirlas y, lo más importante, cómo usarlas para potenciar nuestra productividad al máximo.
context: fork)Una Skill (o habilidad) es un archivo Markdown llamado SKILL.md dentro de su propia carpeta, que le enseña a Claude cómo hacer una tarea específica de forma automatizada. A diferencia de un comando tradicional o de un prompt largo, escribes la skill una sola vez y Claude la aplica automáticamente cada vez que identifica que es relevante para la conversación, o tú puedes invocarla directamente con /nombre-skill.
Las skills siguen el estándar abierto Agent Skills, que funciona en múltiples herramientas de IA, no solo Claude Code. Anthropic lo extiende con características propias: control de invocación, ejecución en subagents e inyección dinámica de contexto.
El truco clave es que las skills se cargan bajo demanda. Claude solo lee el nombre y la descripción inicialmente para no saturar tu ventana de contexto. Tu checklist de revisión de PRs no necesita estar en la memoria de Claude cuando estás depurando código; solo se cargará cuando la conversación lo requiera.
Claude Code ofrece varias opciones de personalización. Es crucial saber cuándo usar cada una para no generar complejidad innecesaria:
| Característica | ¿Cómo funciona? | Caso de uso ideal |
|---|---|---|
| Skills | Se activan según la petición del usuario (request-driven) o por invocación directa con /nombre. Carga bajo demanda. |
Procedimientos y experticia para tareas concretas (formato de commits, revisión de PRs, deploys). |
| CLAUDE.md | Se carga en todas las conversaciones automáticamente. | Hechos y estándares globales del proyecto ("Usa siempre TypeScript estricto", "El monorepo vive en /packages"). |
| Subagents | Se ejecutan en un contexto aislado, con su propio prompt de sistema. | Delegación de tareas que requieren herramientas distintas sin contaminar tu chat principal (exploración masiva, planificación). |
| Hooks | Se activan mediante eventos (event-driven): pre-tool, post-tool, on-stop, etc. | Operaciones automáticas y deterministas (correr un linter al guardar, validar antes de commit). |
| MCP Servers | Conexiones externas vía protocolo Model Context Protocol. | Integración con herramientas externas o APIs de terceros (Linear, Sentry, bases de datos). |
CLAUDE.md.
Una skill es básicamente un directorio que contiene un archivo llamado exactamente SKILL.md. En la parte superior de este archivo se utiliza un bloque YAML (frontmatter) para definir los metadatos, seguido del contenido Markdown con las instrucciones que Claude seguirá cuando la skill esté activa.
Vamos a crear una skill de ejemplo del curso oficial: una skill que enseña a Claude a explicar código con diagramas visuales y analogías.
mkdir -p ~/.claude/skills/explain-code
---
name: explain-code
description: Explains code with visual diagrams and analogies. Use when explaining how code works, teaching about a codebase, or when the user asks "how does this work?"
---
When explaining code, always include:
1. **Start with an analogy**: Compare the code to something from everyday life
2. **Draw a diagram**: Use ASCII art to show the flow, structure, or relationships
3. **Walk through the code**: Explain step-by-step what happens
4. **Highlight a gotcha**: What's a common mistake or misconception?
Keep explanations conversational. For complex concepts, use multiple analogies.
Hay dos formas de invocar una skill:
description. Por ejemplo: "How does this code work?"/explain-code src/auth/login.ts y se carga inmediatamente.~/.claude/skills/ o .claude/skills/ surte efecto en la sesión actual sin reiniciar. Solo crear un directorio top-level de skills nuevo requiere reiniciar.
El bloque YAML soporta muchos más campos de los que la mayoría de tutoriales mencionan. Conocerlos todos te permite construir skills profesionales. Esta es la lista completa según la documentación oficial:
| Campo | Requerido | Descripción |
|---|---|---|
name |
No | Nombre de la skill. Si se omite, se usa el nombre del directorio. Solo minúsculas, números y guiones (máx. 64 caracteres). |
description |
Recomendado | Qué hace la skill y cuándo usarla. Claude usa este texto para decidir cuándo activarla. El campo más importante. La descripción combinada con when_to_use se trunca a 1.536 caracteres. |
when_to_use |
No | Contexto adicional sobre cuándo activar la skill (frases gatillo, ejemplos de petición). Se concatena a description. |
argument-hint |
No | Pista que aparece en autocompletado, ej: [issue-number] o [filename] [format]. |
arguments |
No | Argumentos posicionales con nombre para sustitución $name en el contenido. Acepta string separado por espacios o lista YAML. |
disable-model-invocation |
No | true impide que Claude la cargue automáticamente. Solo tú puedes invocarla con /nombre. Ideal para acciones con efectos secundarios (deploy, commit, send-slack). |
user-invocable |
No | false oculta la skill del menú /. Útil para conocimiento de fondo que solo Claude debería invocar (ej. legacy-system-context). |
allowed-tools |
No | Herramientas que Claude puede usar sin pedir permiso mientras la skill está activa. Ej: Bash(git add *) Bash(git commit *). |
model |
No | Modelo a usar mientras la skill está activa. Acepta los mismos valores que /model, o inherit. |
effort |
No | Nivel de esfuerzo: low, medium, high, xhigh, max (depende del modelo). |
context |
No | fork ejecuta la skill en un subagent aislado con su propio contexto. |
agent |
No | Tipo de subagent cuando context: fork. Opciones: Explore, Plan, general-purpose, o cualquier agente de .claude/agents/. |
hooks |
No | Hooks específicos del ciclo de vida de esta skill. |
paths |
No | Patrones glob que limitan cuándo se activa automáticamente. Ej: "src/**/*.tsx" para activarla solo cuando se trabaja en componentes React. |
shell |
No | bash (default) o powershell para los bloques !`comando` y ` ```! `. |
commit con permisos preconcedidos---
name: commit
description: Stage and commit the current changes
disable-model-invocation: true
allowed-tools: Bash(git add *) Bash(git commit *) Bash(git status *)
---
Stage and commit the changes:
1. Run `git status` to see what's modified
2. Stage the relevant files
3. Write a conventional commit message
4. Create the commit
Aquí disable-model-invocation: true evita que Claude haga commits por su cuenta cuando crea que el código está listo, y allowed-tools le da permiso para correr comandos git sin pedir aprobación cada vez.
Puedes crear skills en cuatro niveles. Si hay un conflicto de nombres, Claude Code respeta esta jerarquía de prioridades:
| Nivel | Ruta | Aplica a |
|---|---|---|
| Enterprise | Managed settings | Toda la organización |
| Personal | ~/.claude/skills/<skill-name>/SKILL.md |
Todos tus proyectos |
| Project | .claude/skills/<skill-name>/SKILL.md |
Solo este proyecto |
| Plugin | <plugin>/skills/<skill-name>/SKILL.md |
Donde el plugin esté habilitado |
Las skills de plugin usan un namespace plugin-name:skill-name, así que no pueden colisionar con las otras. Para evitar conflictos en los demás niveles, usa nombres descriptivos como my-frontend-review en vez de code-review.
Cuando trabajas con archivos en subdirectorios, Claude Code también descubre skills en directorios .claude/skills/ anidados. Si editas packages/frontend/src/Button.tsx, Claude buscará skills en packages/frontend/.claude/skills/ además de las del repositorio raíz. Perfecto para monorepos donde cada paquete tiene sus propios estándares.
Las skills aceptan argumentos cuando las invocas. Esto las hace muchísimo más reutilizables. Las variables disponibles son:
| Variable | Qué hace |
|---|---|
$ARGUMENTS |
Todos los argumentos como string completo. |
$ARGUMENTS[N] / $N |
Argumento posicional N (índice 0). $0, $1, $2... |
$name |
Argumento con nombre declarado en frontmatter arguments. |
${CLAUDE_SESSION_ID} |
ID de la sesión actual. Útil para logs. |
${CLAUDE_SKILL_DIR} |
Directorio donde vive el SKILL.md. Crucial para referenciar scripts internos. |
fix-issue---
name: fix-issue
description: Fix a GitHub issue
disable-model-invocation: true
argument-hint: [issue-number]
---
Fix GitHub issue $ARGUMENTS following our coding standards.
1. Read the issue description with `gh issue view $ARGUMENTS`
2. Understand the requirements
3. Implement the fix
4. Write tests
5. Create a commit
Al invocar /fix-issue 123, Claude recibe "Fix GitHub issue 123 following our coding standards..."
---
name: migrate-component
description: Migrate a component from one framework to another
---
Migrate the $0 component from $1 to $2.
Preserve all existing behavior and tests.
Al invocar /migrate-component SearchBar React Vue, los placeholders se reemplazan: $0 → SearchBar, $1 → React, $2 → Vue.
Esta es una de las características más potentes y menos conocidas: la sintaxis !`comando` ejecuta un shell command antes de que el contenido de la skill sea enviado a Claude. La salida del comando reemplaza el placeholder, así que Claude recibe datos reales, no el comando.
pr-summary---
name: pr-summary
description: Summarize changes in a pull request
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---
## Pull request context
- PR diff: !`gh pr diff`
- PR comments: !`gh pr view --comments`
- Changed files: !`gh pr diff --name-only`
## Your task
Summarize this pull request, highlighting:
1. What changed and why
2. Risk areas worth a closer review
3. Anything missing (tests, docs)
Cuando se invoca esta skill:
!`comando` se ejecuta primero (antes de que Claude vea nada).Para comandos multilínea, usa un bloque cercado abierto con ` ```! `:
## Environment
```!
node --version
npm --version
git status --short
```
"disableSkillShellExecution": true en settings. Cada comando se reemplaza con [shell command execution disabled by policy].
context: fork)Cuando añades context: fork al frontmatter, la skill se ejecuta en un contexto aislado. El contenido del SKILL.md se convierte en el prompt que dirige al subagent. No tendrá acceso a tu historial de conversación.
Explore---
name: deep-research
description: Research a topic thoroughly across the codebase
context: fork
agent: Explore
---
Research $ARGUMENTS thoroughly:
1. Find relevant files using Glob and Grep
2. Read and analyze the code
3. Summarize findings with specific file references
4. Note any inconsistencies or technical debt found
Al ejecutarse, se crea un contexto aislado, el subagent Explore recibe el contenido de la skill como su tarea, usa sus herramientas optimizadas para exploración (read-only) y devuelve el resumen al chat principal sin contaminarlo con todos los archivos leídos.
context: fork solo tiene sentido para skills con instrucciones explícitas de tarea. Si tu skill solo contiene guidelines como "usa estas convenciones de API", el subagent recibirá las guidelines pero ningún prompt accionable y devolverá output sin sentido.
Una buena práctica es mantener tu archivo SKILL.md por debajo de las 500 líneas. Si necesitas más, debes usar progressive disclosure: el SKILL.md hace de índice y mantiene el contenido esencial, mientras que los archivos de soporte se cargan solo cuando se necesitan.
Estructura recomendada:
my-skill/
├── SKILL.md # Punto de entrada (requerido)
├── reference.md # Documentación detallada (se carga bajo demanda)
├── examples.md # Ejemplos de uso (se carga bajo demanda)
├── assets/ # Plantillas, imágenes, datos
│ └── template.html
└── scripts/ # Código ejecutable
└── helper.py # Se ejecuta, no se carga al contexto
Dentro del SKILL.md referencias estos archivos así:
## Recursos adicionales
- Para detalles completos del API, lee [reference.md](reference.md)
- Para ejemplos de uso, lee [examples.md](examples.md)
- Para validar el output, ejecuta `python ${CLAUDE_SKILL_DIR}/scripts/helper.py`
El uso de ${CLAUDE_SKILL_DIR} es importante: te asegura que la ruta al script funciona sin importar el directorio actual de trabajo.
Claude Code incluye un set de skills predefinidas que están disponibles en cada sesión. A diferencia de los comandos built-in que ejecutan lógica fija, estas son prompt-based: dan a Claude un playbook detallado y dejan que orqueste el trabajo con sus herramientas.
/simplify — Revisa el código modificado en busca de oportunidades de reuso, calidad y eficiencia./debug — Ayuda a depurar issues con un enfoque sistemático./loop — Ejecuta un prompt o slash-command en intervalos recurrentes./claude-api — Construye, depura y optimiza apps con la API de Claude / SDK de Anthropic./batch — Procesa múltiples ítems en lote./init, /review, /security-review — Inicialización, revisión de PR, revisión de seguridad.Puedes inspeccionarlas con What skills are available? en cualquier momento dentro de Claude Code.
Las skills multiplican su valor cuando se comparten. Tienes tres métodos principales:
.claude/skills/ al control de versiones. Quien clona obtiene las skills automáticamente.skills/ en tu plugin y distribúyelo a través de marketplaces comunitarios.Anthropic mantiene un repositorio público de skills oficiales y de ejemplo en github.com/anthropics/skills que puedes usar como punto de partida o referencia.
.claude/agents/tu-agente.md) usando el campo skills: [skill1, skill2] para preloadearlas en el subagent.
Si tu skill no funciona, generalmente cae en uno de estos escenarios. Tu checklist de depuración:
description. Claude usa coincidencia semántica./nombre-skill para descartar problemas de carga.Las descripciones se cargan en contexto para que Claude sepa qué hay disponible. Si tienes muchas skills, las descripciones se acortan para caber en el budget (1% del context window, fallback de 8.000 caracteres). Esto puede eliminar las palabras clave que Claude necesita para hacer match.
Soluciones:
description — el cap por entrada es de 1.536 caracteres.SLASH_COMMAND_TOOL_CHAR_BUDGET.Tus descripciones son muy similares entre sí. Hazlas más distintivas, o añade disable-model-invocation: true a la que solo quieres invocar manualmente.
SKILL.md (mayúsculas).--- al inicio del archivo.chmod +x)./) en rutas, incluso en Windows.${CLAUDE_SKILL_DIR}/scripts/..., nunca con rutas relativas frágiles.description, o re-invócala manualmente. Tras una auto-compactación, Claude Code re-adjunta los primeros 5.000 tokens de cada skill invocada con un budget combinado de 25.000 tokens, así que las skills más antiguas pueden caer del contexto.
Este artículo está basado en el curso oficial de Anthropic Introduction to Agent Skills y en la documentación oficial de Claude Code. A continuación, todas las fuentes verificables:
Última actualización del artículo: abril 2026. Los enlaces a la documentación oficial pueden actualizarse; code.claude.com/docs/en/skills es la URL canónica que siempre apunta a la versión más reciente.