EN

Skills de Claude, de lo básico a crear la tuya

Leo G.8 minLeer en inglés

Cajón de herramientas con muchas llaves distintas, cada una de un tamaño.
Cajón de herramientas con muchas llaves distintas, cada una de un tamaño.

Le explicás a Claude Code, en cada sesión nueva, cómo escribís los mensajes de commit en tu equipo. O cómo tiene que sonar un resumen de PR. O el esquema de tu base de datos, otra vez. Cada conversación empieza en cero, así que esa explicación se repite.

Una skill es la forma de no repetirla: una carpeta con instrucciones que Claude lee por su cuenta, solo cuando la tarea la necesita, sin que ocupe lugar en el contexto mientras tanto. La escribís una vez y queda disponible en todas las sesiones siguientes.

Usar una que ya existe

Claude Code trae algunas de fábrica —/run, /code-review, /doctor, /loop, entre otras— y las podés ver todas con:

/skills

Se usan de dos formas. Escribiendo el pedido en lenguaje normal, para que Claude decida solo si aplica:

¿Qué cambié en este archivo?

O invocándola directo, con el nombre como comando:

/summarize-changes

Las dos formas terminan haciendo lo mismo si la skill está bien escrita: la diferencia es si decidís vos o decide Claude que hace falta.

Cómo decide Claude cuándo usar una

Acá está el motivo por el que instalar muchas skills no vuelve lenta ni cara una conversación: no se cargan todas enteras de entrada. Se cargan en tres niveles, cada uno más caro que el anterior, y solo se sube de nivel si hace falta.

Los tres niveles en los que Claude lee una skill 01 Metadata name + description siempre, ~100 tokens 02 Instrucciones el cuerpo de SKILL.md al activarse, <5.000 tokens 03 Recursos y scripts archivos de referencia, código solo si se leen, 0 hasta entonces coincide con el pedido si el SKILL.md lo menciona
El nombre y la descripción de cada skill instalada están siempre en el contexto. El resto se lee solo cuando hace falta, con bash, igual que abrir un archivo cualquiera.

El campo que decide todo es la descripción: es lo único que Claude compara contra tu pedido para elegir qué skill activar, así que tiene que decir dos cosas —qué hace y cuándo usarla—, no solo el nombre. Esta es buena, tomada de la documentación oficial:

description: Extract text and tables from PDF files, fill forms, merge
  documents. Use when working with PDF files or when the user mentions
  PDFs, forms, or document extraction.

Y estas son malas, por vagas —Claude no tiene con qué decidir si aplican a tu pedido o no—:

description: Helps with documents
description: Processes data
description: Does stuff with files

Crear tu primera skill, paso a paso

Vamos a armar una que resuma los cambios sin commitear, para no tener que pedirlo a mano cada vez. Primero, la carpeta:

mkdir -p ~/.claude/skills/summarize-changes

~/.claude/skills/ es la carpeta personal: lo que pongas ahí está disponible en todos tus proyectos, en esta máquina. Si en cambio la querés disponible solo para quien clone este repositorio, va en .claude/skills/ dentro del propio proyecto, y se sube al control de versiones.

Adentro, un solo archivo, SKILL.md:

---
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---

## Current changes

!`git diff HEAD`

## Instructions

Summarize the changes above in two or three bullet points, then list any
risks you notice such as missing error handling, hardcoded values, or tests
that need updating. If the diff is empty, say there are no uncommitted
changes.

La línea que empieza con ! no es texto: es un comando que se ejecuta antes de que Claude vea nada, y el resultado —el diff real de tu proyecto en ese momento— reemplaza esa línea. Si el comando falla, toda la skill se cancela ahí, así que conviene que sea algo confiable.

Se prueba de las dos formas que ya vimos: parado en un repositorio con algún cambio sin commitear, escribís “¿qué cambié?” y debería activarse sola, o escribís /summarize-changes para forzarla.

El frontmatter, de lo esencial a lo avanzado

Los únicos dos campos obligatorios son name y description. name acepta solo minúsculas, números y guiones, hasta 64 caracteres, y no puede usar las palabras “claude” ni “anthropic”. description no puede estar vacío y tiene un máximo de 1024 caracteres.

El resto es opcional, y cada uno resuelve algo puntual:

Campo Para qué sirve
disable-model-invocation: true Solo se activa a mano, con /nombre — Claude nunca la elige sola
user-invocable: false Lo contrario: solo Claude la usa, no aparece en el menú /
allowed-tools: Bash(git add *) Aprueba herramientas puntuales de antemano, sin preguntar cada vez
context: fork La corre en un subagente aparte, sin el historial de la conversación
argument-hint: [issue-number] El texto de ayuda que aparece al autocompletar en el menú /

Por ejemplo, una skill de despliegue tiene sentido con invocación manual únicamente —no querés que Claude decida solo cuándo desplegar— y con las herramientas de shell ya aprobadas, porque son siempre las mismas:

---
name: deploy
description: Deploy the application to production
disable-model-invocation: true
allowed-tools: Bash(npm run build) Bash(npm run test) Bash(git *)
---

Avanzado: una skill con su propio script

Cuando la tarea es siempre igual, conviene que la resuelva un script y no que Claude escriba código nuevo cada vez: es más confiable, y el código del script nunca entra al contexto —solo lo que imprime—. Esta es la estructura de una skill que arma un mapa visual de un repositorio:

~/.claude/skills/codebase-visualizer/
├── SKILL.md
└── scripts/
    └── visualize.py

SKILL.md no explica cómo funciona el script: le dice a Claude que lo ejecute, y qué hace con el resultado.

---
name: codebase-visualizer
description: Generate an interactive collapsible tree visualization of your codebase. Use when exploring a new repo, understanding project structure, or identifying large files.
allowed-tools: Bash(python3 *)
---

# Codebase Visualizer

Generate an interactive HTML tree view that shows your project's file structure.

## Usage

```bash
python3 ${CLAUDE_SKILL_DIR}/scripts/visualize.py .
```

This creates `codebase-map.html` in the current directory and opens it in
your browser.

${CLAUDE_SKILL_DIR} es una variable que Claude resuelve sola, con la carpeta exacta de esa skill —así el script se encuentra sin importar en qué proyecto estés parado cuando la usás.

Cómo escribir una buena descripción

Ya vimos el ejemplo bueno y los malos. Dos reglas más, tomadas también de la guía oficial:

Escribila en tercera persona. La descripción se inserta tal cual en las instrucciones del sistema, así que si está en primera persona (“puedo ayudarte con…”) suena raro ahí adentro y confunde más de lo que ayuda.

Nombrá el disparador, no solo la acción. “Analiza datos” no dice cuándo usarla. “Analiza hojas de cálculo, arma tablas dinámicas y gráficos. Usala con archivos Excel, planillas o datos en formato .xlsx” sí: le da a Claude palabras concretas para comparar contra el pedido.

Un cuidado antes de instalar la de otra persona

Una skill le da a Claude instrucciones y, si las tiene habilitadas, herramientas para ejecutarlas. Una mal intencionada puede hacer que Claude llame herramientas o corra código de formas que no tienen nada que ver con lo que la skill dice hacer.

La recomendación oficial es simple: usar solo skills propias o de Anthropic, y si hace falta una de otra fuente, auditarla entera antes —SKILL.md, cualquier script, cualquier imagen— buscando llamadas de red, accesos a archivos, o algo que no coincida con lo que dice que hace.

En el artículo sobre Archify de este blog instalamos una skill de verdad, de un repositorio público, y antes de correr nada leímos el SKILL.md completo para entender exactamente qué esperaba de nosotros. Es el mismo paso, aplicado.

Dónde vive cada skill

Además de personal y de proyecto, hay un par de lugares más, y cuando dos skills se llaman igual, gana la que esté más arriba en esta lista:

Ubicación Ruta Alcance
Enterprise configuración centralizada de la organización todos los usuarios
Personal ~/.claude/skills/<nombre>/ vos, en cualquier proyecto de esta máquina
Proyecto .claude/skills/<nombre>/ quien clone este repositorio
Anidada <subcarpeta>/.claude/skills/<nombre>/ sesiones dentro de esa subcarpeta, con /subcarpeta:nombre
Plugin <plugin>/skills/<nombre>/ donde el plugin esté habilitado

Para confirmar que el YAML de una skill está bien formado antes de compartirla, claude plugin validate la revisa sin necesidad de invocarla:

claude plugin validate ~/.claude/skills/mi-skill

Comentarios