Aprende conmigo: Claude - Introducción a las Agent Skills

¿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.

📑 Contenido
  1. ¿Qué son las Agent Skills?
  2. Anatomía y creación de tu primera skill
  3. Frontmatter completo: todos los campos
  4. Jerarquía y ubicación
  5. Argumentos y substitución de strings
  6. Inyección dinámica de contexto
  7. Ejecución en subagent (context: fork)
  8. Progressive disclosure y multi-file
  9. Bundled skills: las que ya vienen incluidas
  10. Compartir skills
  11. Troubleshooting
  12. Referencias y curso oficial

1. ¿Qué son las Agent Skills?

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.

Skills vs. otras características de Claude Code

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).
💡 Regla de oro: Si te encuentras explicándole a Claude lo mismo repetidamente sobre cómo ejecutar una tarea, esa es una skill esperando a ser escrita. Si es un hecho que siempre aplica al proyecto, va en CLAUDE.md.

2. Anatomía y creación de tu primera skill

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.

Paso 1: Crear el directorio

mkdir -p ~/.claude/skills/explain-code

Paso 2: Escribir el SKILL.md

---
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.

Paso 3: Probarla

Hay dos formas de invocar una skill:

✨ Live change detection: Claude Code observa los directorios de skills en vivo. Añadir, editar o eliminar una skill bajo ~/.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.

3. Frontmatter completo: todos los campos

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 ` ```! `.

Ejemplo completo: skill 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.


4. Jerarquía y ubicación: ¿dónde viven las skills?

Puedes crear skills en cuatro niveles. Si hay un conflicto de nombres, Claude Code respeta esta jerarquía de prioridades:

graph TD A[1. Enterprise Managed]:::high B[2. Personal Skills
~/.claude/skills/]:::medium C[3. Project Skills
.claude/skills/]:::medium D[4. Plugin Skills
plugin-name:skill-name]:::low A -->|Prioridad máxima| B B --> C C --> D D -->|Prioridad mínima| E((Skill aplicada)) classDef high fill:#5b21b6,stroke:#fff,stroke-width:2px,color:#fff; classDef medium fill:#8b5cf6,stroke:#fff,stroke-width:2px,color:#fff; classDef low fill:#c4b5fd,stroke:#fff,stroke-width:2px,color:#333;
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.

Descubrimiento automático en monorepos

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.


5. Argumentos y substitución de strings

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.

Ejemplo: skill 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..."

Ejemplo: argumentos posicionales

---
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: $0SearchBar, $1React, $2Vue.


6. Inyección dinámica de contexto

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.

Ejemplo del curso oficial: skill 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:

  1. Cada !`comando` se ejecuta primero (antes de que Claude vea nada).
  2. La salida reemplaza al placeholder en el contenido.
  3. Claude recibe el prompt ya renderizado con datos reales del PR.

Para comandos multilínea, usa un bloque cercado abierto con ` ```! `:

## Environment
```!
node --version
npm --version
git status --short
```
⚠️ Política de seguridad: Si tu organización quiere deshabilitar esta característica, puedes setear "disableSkillShellExecution": true en settings. Cada comando se reemplaza con [shell command execution disabled by policy].

7. Ejecución en subagent (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.

Ejemplo: skill de investigación con el agente 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.

⚠️ Cuidado: 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.

8. Progressive disclosure y multi-file

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.


9. Bundled skills: las que ya vienen incluidas

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.

Puedes inspeccionarlas con What skills are available? en cualquier momento dentro de Claude Code.


10. Compartir skills

Las skills multiplican su valor cuando se comparten. Tienes tres métodos principales:

  1. Repositorios (Git): Commitea .claude/skills/ al control de versiones. Quien clona obtiene las skills automáticamente.
  2. Plugins: Crea un directorio skills/ en tu plugin y distribúyelo a través de marketplaces comunitarios.
  3. Enterprise (Managed Settings): Despliegue a nivel de organización para mandatos de cumplimiento y estándares obligatorios.

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.

⚠️ Nota crítica sobre subagents: Los subagents (contextos de ejecución aislados) NO heredan tus skills automáticamente. Debes declararlos explícitamente en el frontmatter del agente (.claude/agents/tu-agente.md) usando el campo skills: [skill1, skill2] para preloadearlas en el subagent.

11. Troubleshooting

Si tu skill no funciona, generalmente cae en uno de estos escenarios. Tu checklist de depuración:

La skill no se dispara

Las descripciones se truncan

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:

Se dispara la skill equivocada

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.

Errores de archivo / carga

Errores de runtime

✨ Tip Pro: Si una skill parece "dejar de aplicarse" a medio camino de una conversación larga, lo más probable es que ya esté cargada pero el modelo está prefiriendo otras herramientas. Refuerza su 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.

Referencias y curso oficial

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:

📚 Curso oficial (Skilljar)

🎥 Playlist de YouTube del curso

📖 Documentación oficial

🌐 Estándar abierto y comunidad

Ú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.