Capitulo 13: Agent Skills
Capitulo 13: Agent Skills
< Volver al Indice del Tutorial
Que son Agent Skills
Los Agent Skills son instrucciones reutilizables escritas en Markdown que OpenCode descubre y carga automáticamente cuando el agente las necesita. A diferencia de los agentes o comandos, los skills son pasivos: el agente los busca y los lee on-demand a través de la herramienta nativa skill.
Piensa en los skills como documentación ejecutable. En lugar de repetir las mismas instrucciones en cada conversación, defines un skill una vez y el agente lo consulta cuando enfrenta una tarea relacionada. Es el equivalente a tener un manual de procedimientos que el asistente puede abrir y seguir paso a paso cada vez que necesita realizar una operación específica.
La diferencia clave respecto a otros mecanismos es que los skills se cargan on-demand. No consumen tokens hasta que el agente decide que los necesita. Esto es fundamental porque permite tener decenas de skills definidos sin afectar el rendimiento ni el costo de las sesiones donde no se usan.
Como Funcionan
El flujo completo de un skill es el siguiente:
- Defines un archivo
SKILL.mden una ubicación reconocida por OpenCode - OpenCode detecta los skills disponibles al iniciar la sesión
- Cuando el agente necesita instrucciones específicas, usa la herramienta
skillpara cargar el contenido del archivo - El skill se inyecta en el contexto del agente como instrucciones adicionales
- El agente sigue las instrucciones del skill para completar la tarea
sequenceDiagram
participant U as Usuario
participant A as Agente
participant S as Skill Tool
participant F as SKILL.md
U->>A: "Haz un review del PR"
A->>S: skill("review-pr")
S->>F: Lee .opencode/skills/review-pr/SKILL.md
F-->>S: Contenido del skill
S-->>A: Instrucciones inyectadas
A->>U: Review siguiendo las instrucciones del skill
Este mecanismo lazy-loading es lo que hace a los skills tan eficientes. Un proyecto puede tener 20 skills definidos, pero si en una sesión particular el agente solo necesita 2, únicamente esos 2 consumirán tokens.
Ubicaciones de Skills
OpenCode busca archivos SKILL.md en múltiples ubicaciones, tanto a nivel de proyecto como a nivel global del usuario. Esto permite compartir skills con el equipo vía repositorio y tener skills personales que aplicas en todos tus proyectos.
Skills del Proyecto
Las ubicaciones reconocidas dentro de un repositorio son:
tu-proyecto/
.opencode/
skills/
mi-skill/
SKILL.md
otro-skill/
SKILL.md
.claude/
skills/
skill-compat/
SKILL.md
.agents/
skills/
skill-agents/
SKILL.md
La ubicación principal es .opencode/skills/, pero OpenCode también reconoce .claude/skills/ para compatibilidad con proyectos que migraron desde Claude Code, y .agents/skills/ como convención alternativa. En la práctica, usa .opencode/skills/ para proyectos nuevos y las otras rutas solo si estás migrando desde otra herramienta.
Estos skills son específicos del proyecto. Se comparten con el equipo a través del repositorio y contienen instrucciones relevantes para ese proyecto en particular: convenciones de testing, estándares de documentación, patrones de arquitectura y cualquier otra regla que el equipo haya definido.
Skills Globales
~/.config/opencode/
skills/
mi-skill-global/
SKILL.md
review/
SKILL.md
Los skills globales están disponibles en todos tus proyectos. Son útiles para convenciones personales o estándares que aplicas en cualquier codebase, como tu estilo preferido de commits, tu checklist personal de code review o las reglas de documentación que siempre sigues.
Formato del Archivo SKILL.md
Cada skill consiste en un archivo SKILL.md que puede incluir un frontmatter YAML opcional seguido del contenido en Markdown. El frontmatter permite definir metadatos que OpenCode usa para gestionar el skill.
Frontmatter
---
name: generar-tests
description: "Convenciones para generacion de tests unitarios con vitest"
license: MIT
compatibility: opencode
metadata:
version: "1.0"
---
Los campos del frontmatter son:
- name (obligatorio): identificador del skill, entre 1 y 64 caracteres. Solo acepta letras minúsculas, números y guiones. Este nombre es el que el agente usa para referenciarlo con la herramienta
skill. - description (obligatorio): descripción breve del skill, entre 1 y 1024 caracteres. Ayuda al agente a decidir cuándo cargar este skill.
- license (opcional): licencia bajo la que se distribuye el skill.
- compatibility (opcional): indica con qué herramientas es compatible (por ejemplo,
opencode). - metadata (opcional): objeto con metadatos adicionales como versión, autor o tags.
Si omites el frontmatter, OpenCode usa el nombre del directorio como identificador del skill y no tendrá descripción, lo que reduce la capacidad del agente para decidir cuándo cargarlo.
Cuerpo del Skill
Después del frontmatter, el resto del archivo contiene las instrucciones en Markdown:
---
name: generar-tests
description: "Convenciones para generacion de tests unitarios con vitest"
---
# Generar Tests
Cuando generes tests para este proyecto, sigue estas reglas:
## Convenciones
- Usa vitest como framework de testing
- Los archivos de test van en `__tests__/` junto al archivo original
- Nombra los archivos como `nombre.test.ts`
- Usa `describe` para agrupar por funcionalidad
- Usa `it` (no `test`) para cada caso
## Estructura
- Arrange: prepara datos y mocks
- Act: ejecuta la función
- Assert: verifica resultados
## Mocks
- Usa vi.mock() para módulos externos
- Nunca mockees la función que estás testeando
- Prefiere inyección de dependencias sobre mocks globales
Las instrucciones deben ser claras, específicas y acotadas. El agente las interpreta literalmente, así que incluye nombres de archivos, convenciones y patrones exactos. Evita instrucciones ambiguas como “usa buenas prácticas” y prefiere instrucciones concretas como “usa vitest con patrón AAA”.
Permisos de Skills
OpenCode permite controlar qué skills pueden cargarse y cuáles no a través del sistema de permisos en opencode.json. Esto es especialmente útil cuando trabajas con skills de terceros o cuando quieres restringir skills en ciertos agentes.
Configuración de Permisos
{
"permission": {
"skill": {
"internal-*": "allow",
"external-*": "ask",
"blocked-skill": "deny"
}
}
}
Los tres niveles de permiso son:
- allow: el skill se carga inmediatamente cuando el agente lo solicita, sin pedir confirmación al usuario.
- ask: OpenCode solicita aprobación al usuario antes de cargar el skill. Es útil para skills de terceros donde quieres revisar qué instrucciones se inyectarán.
- deny: el skill queda completamente oculto. El agente no puede descubrirlo ni cargarlo.
Comodines
Los permisos soportan comodines con *. Por ejemplo, internal-* coincide con cualquier skill cuyo nombre empiece por internal-, como internal-docs, internal-review o internal-deploy. Esto permite gestionar grupos de skills sin listar cada uno individualmente.
Desactivar Skills Completamente
Si quieres que un agente específico no tenga acceso a ningún skill, puedes desactivar la funcionalidad completa en la configuración del agente:
{
"agent": {
"build": {
"skill": false
}
}
}
Con "skill": false, el agente build no podrá descubrir ni cargar ningún skill, independientemente de los permisos globales.
Crear un Skill Propio
Paso 1: Crear la estructura
mkdir -p .opencode/skills/review-pr
Paso 2: Escribir el SKILL.md
Crea .opencode/skills/review-pr/SKILL.md:
---
name: review-pr
description: "Checklist para revisión de Pull Requests"
metadata:
version: "1.0"
---
# Review de Pull Requests
Al revisar un PR, sigue este checklist:
## Seguridad
- Verificar que no se expongan secretos o credenciales
- Validar inputs del usuario
- Revisar permisos y autorización
## Calidad
- Funciones de máximo 30 líneas
- Sin código duplicado
- Nombres descriptivos para variables y funciones
- Sin console.log o debuggers
## Tests
- Cobertura para los cambios nuevos
- Tests de edge cases
- No tests frágiles que dependan de implementación
## Performance
- Sin queries N+1
- Uso apropiado de memoización
- Lazy loading donde aplique
Genera un reporte con:
1. Lista de problemas encontrados (crítico/medio/bajo)
2. Sugerencias de mejora
3. Lo que está bien hecho
Paso 3: Verificar
El skill estará disponible la próxima vez que inicies OpenCode. El agente podrá cargarlo cuando se le pida hacer un review. Puedes verificar que lo detecta pidiéndole al agente que liste los skills disponibles.
Ejemplo: Skill para Documentación
.opencode/skills/docs/SKILL.md
---
name: docs
description: "Reglas para generar documentación de código"
---
# Generar Documentación
Al documentar código en este proyecto:
## Formato
- Usa JSDoc para funciones públicas
- Documenta parámetros con @param y tipos
- Documenta retorno con @returns
- Incluye @example con uso básico
## README de módulos
- Propósito del módulo en una línea
- Instalación si aplica
- Ejemplo de uso mínimo
- API pública con descripción breve
## No documentar
- Funciones privadas obvias
- Getters/setters simples
- Re-exports
Ejemplo: Skill para Migraciones de Base de Datos
.opencode/skills/migrations/SKILL.md
---
name: migrations
description: "Convenciones para crear migraciones de base de datos"
---
# Migraciones de Base de Datos
## Reglas generales
- Cada migración debe ser reversible (incluir up y down)
- Nombres descriptivos: 001_create_users_table.sql
- Nunca modificar una migración ya ejecutada en producción
- Incluir índices para foreign keys
## Tipos de datos preferidos
- Usar UUID para primary keys
- Usar timestamptz para fechas (con timezone)
- Usar text en lugar de varchar sin límite específico
- Usar jsonb para datos semi-estructurados
## Validaciones
- Antes de crear: verificar que la tabla no existe
- Antes de dropear: verificar que no hay dependencias
- Siempre agregar NOT NULL donde corresponda
- Incluir DEFAULT values cuando tenga sentido
Skills vs Agents vs Commands
Estos tres conceptos se complementan pero tienen propósitos distintos:
Skills (instrucciones pasivas)
- Son documentos que el agente lee cuando necesita
- Se cargan on-demand, no consumen tokens por defecto
- Definen cómo hacer algo
- No tienen configuración de herramientas ni modelo
- Usan frontmatter para metadatos y permisos
Agents (entidades activas)
- Tienen su propio modelo, herramientas y system prompt
- Se activan explícitamente con
@agente - Definen quién hace algo
- Pueden tener acceso restringido a herramientas
Commands (atajos a prompts)
- Ejecutan un prompt predefinido con
/comando - Son directos e inmediatos
- Definen qué hacer
- No contienen instrucciones detalladas, solo el prompt inicial
Cuando usar cada uno
| Necesidad | Usa |
|---|---|
| Estandarizar cómo se hacen los tests | Skill |
| Un agente especializado en seguridad | Agent |
| Ejecutar un review rápido con un comando | Command |
| Convenciones de código del proyecto | Skill |
| Agente que solo usa herramientas de DB | Agent |
| Generar changelog con un atajo | Command |
En la práctica, se combinan. Un command puede disparar un agente que internamente carga un skill para seguir las convenciones del proyecto. Por ejemplo:
flowchart LR
A["/review"] -->|Command| B["@security-agent"]
B -->|Agent| C["skill: review-pr"]
C -->|Skill| D["Instrucciones detalladas"]
El usuario escribe /review, esto activa el agente de seguridad, que carga el skill review-pr con las instrucciones detalladas del checklist.
Buenas Prácticas
- Un skill por dominio: no mezcles instrucciones de testing con instrucciones de deploy. Si un skill crece demasiado, divídelo en skills más pequeños y enfocados.
- Sé específico: “usa vitest con patrón AAA” es mejor que “usa un framework de testing”. El agente interpreta las instrucciones literalmente, así que la precisión importa.
- Incluye ejemplos: el agente entiende mejor con ejemplos concretos de código. Un snippet de 5 líneas vale más que un párrafo de explicación.
- Mantén skills actualizados: si cambian las convenciones del proyecto, actualiza el skill. Un skill desactualizado es peor que no tener skill, porque el agente seguirá instrucciones incorrectas.
- Commitea los skills del proyecto:
.opencode/skills/debe estar en el repositorio para que todo el equipo comparta las mismas convenciones. - No abuses: demasiados skills pueden confundir al agente si carga múltiples al mismo tiempo. Mantén los skills enfocados y evita solapamientos.
- Usa el frontmatter: incluir
nameydescriptionayuda al agente a decidir cuándo cargar cada skill. Sin descripción, el agente tiene que adivinar basándose solo en el nombre del directorio. - Configura permisos: si trabajas con skills de terceros, usa
"ask"para revisar qué instrucciones se inyectan antes de permitirlo automáticamente.
Organizacion Recomendada
Para proyectos medianos o grandes, organiza los skills por dominio:
.opencode/skills/
testing/
SKILL.md # Convenciones de testing
review/
SKILL.md # Checklist de code review
docs/
SKILL.md # Estándares de documentación
migrations/
SKILL.md # Reglas para migraciones
deploy/
SKILL.md # Procedimientos de deploy
Cada skill es independiente y cubre un único dominio. El agente puede cargar uno, varios o ninguno según la tarea que esté ejecutando. Esta granularidad permite que el consumo de tokens sea proporcional a la complejidad de la tarea.
Para skills globales, aplica la misma estructura en ~/.config/opencode/skills/. Los skills globales son ideales para convenciones personales como tu estilo de commits, tu checklist de review personal o tus reglas de naming.
Siguiente: Capitulo 14: Comandos Custom —>