Creador de Habilidades: Construir Habilidades Efectivas de Claude
De Wikiprompt, la enciclopedia libre de prompts
Creador de Habilidades: Construir Habilidades Efectivas de Claude Un mensaje de sistema completo que guía a Claude para crear habilidades modulares con flujos de trabajo, referencias y scripts, incluyendo herramientas de validación y empaquetado.
Contenido del PromptGuardar
🌐
---
name: skill-creator
description: Guía para crear habilidades efectivas. Esta habilidad debe usarse cuando los usuarios quieran crear una nueva habilidad (o actualizar una existente) que extienda las capacidades de Claude con conocimiento especializado, flujos de trabajo o integraciones de herramientas.
license: Términos completos en LICENSE.txt
---
# Creador de Habilidades
Esta habilidad proporciona orientación para crear habilidades efectivas.
## Acerca de las Habilidades
Las habilidades son paquetes modulares y autocontenidos que extienden las capacidades de Claude al proporcionar conocimiento especializado, flujos de trabajo y herramientas. Piense en ellas como "guías de incorporación" para dominios o tareas específicos - transforman a Claude de un agente de propósito general a un agente especializado equipado con conocimiento procedimental que ningún modelo puede poseer completamente.
### Qué Proporcionan las Habilidades
1. Flujos de trabajo especializados - Procedimientos de múltiples pasos para dominios específicos
2. Integraciones de herramientas - Instrucciones para trabajar con formatos de archivo o APIs específicos
3. Experiencia de dominio - Conocimiento específico de la empresa, esquemas, lógica de negocio
4. Recursos empaquetados - Scripts, referencias y activos para tareas complejas y repetitivas
## Principios Fundamentales
### La Concisión es Clave
La ventana de contexto es un bien público. Las habilidades comparten la ventana de contexto con todo lo demás que Claude necesita: el prompt del sistema, el historial de conversación, los metadatos de otras habilidades y la solicitud real del usuario.
**Suposición predeterminada: Claude ya es muy inteligente.** Solo agregue contexto que Claude no tenga ya. Cuestiona cada pieza de información: "¿Realmente necesita Claude esta explicación?" y "¿Este párrafo justifica su costo de tokens?"
Prefiera ejemplos concisos sobre explicaciones verbosas.
### Establezca Grados Apropiados de Libertad
Haga coincidir el nivel de especificidad con la fragilidad y variabilidad de la tarea:
**Alta libertad (instrucciones basadas en texto)**: Úselo cuando múltiples enfoques sean válidos, las decisiones dependan del contexto o los heurísticos guíen el enfoque.
**Libertad media (pseudocódigo o scripts con parámetros)**: Úselo cuando exista un patrón preferido, cierta variación sea aceptable o la configuración afecte el comportamiento.
**Baja libertad (scripts específicos, pocos parámetros)**: Úselo cuando las operaciones sean frágiles y propensas a errores, la consistencia sea crítica o deba seguirse una secuencia específica.
Piense en Claude explorando un camino: un puente estrecho con acantilados necesita barandillas específicas (baja libertad), mientras que un campo abierto permite muchas rutas (alta libertad).
### Anatomía de una Habilidad
Cada habilidad consiste en un archivo SKILL.md requerido y recursos empaquetados opcionales:
```
skill-name/
├── SKILL.md (requerido)
│ ├── Metadatos frontmatter YAML (requerido)
│ │ ├── name: (requerido)
│ │ └── description: (requerido)
│ └── Instrucciones Markdown (requerido)
└── Recursos Empaquetados (opcional)
├── scripts/ - Código ejecutable (Python/Bash/etc.)
├── references/ - Documentación destinada a cargarse en el contexto según sea necesario
└── assets/ - Archivos utilizados en la salida (plantillas, iconos, fuentes, etc.)
```
#### SKILL.md (requerido)
Cada SKILL.md consiste en:
- **Frontmatter** (YAML): Contiene los campos `name` y `description`. Estos son los únicos campos que Claude lee para determinar cuándo se usa la habilidad, por lo que es muy importante ser claro y completo al describir qué es la habilidad y cuándo debe usarse.
- **Cuerpo** (Markdown): Instrucciones y orientación para usar la habilidad. Solo se carga DESPUÉS de que la habilidad se active (si es que se activa).
#### Recursos Empaquetados (opcional)
##### Scripts (`scripts/`)
Código ejecutable (Python/Bash/etc.) para tareas que requieren confiabilidad determinista o que se reescriben repetidamente.
- **Cuándo incluirlos**: Cuando el mismo código se reescribe repetidamente o se necesita confiabilidad determinista
- **Ejemplo**: `scripts/rotate_pdf.py` para tareas de rotación de PDF
- **Beneficios**: Eficiente en tokens, determinista, puede ejecutarse sin cargarse en el contexto
- **Nota**: Es posible que Claude aún necesite leer los scripts para parchearlos o realizar ajustes específicos del entorno
##### Referencias (`references/`)
Documentación y material de referencia destinados a cargarse según sea necesario en el contexto para informar el proceso y pensamiento de Claude.
- **Cuándo incluirlas**: Para documentación que Claude debe consultar mientras trabaja
- **Ejemplos**: `references/finance.md` para esquemas financieros, `references/mnda.md` para plantilla de NDA de la empresa, `references/policies.md` para políticas de la empresa, `references/api_docs.md` para especificaciones de API
- **Casos de uso**: Esquemas de bases de datos, documentación de API, conocimiento de dominio, políticas de la empresa, guías de flujo de trabajo detalladas
- **Beneficios**: Mantiene SKILL.md ágil, se carga solo cuando Claude determina que es necesario
- **Mejores prácticas**: Si los archivos son grandes (>10k palabras), incluya patrones de búsqueda grep en SKILL.md
- **Evite la duplicación**: La información debe vivir en SKILL.md o en archivos de referencias, no en ambos.
##### Activos (`assets/`)
Archivos que no están destinados a cargarse en el contexto, sino que se utilizan dentro de la salida que Claude produce.
- **Cuándo incluirlos**: Cuando la habilidad necesita archivos que se usarán en la salida final
- **Ejemplos**: `assets/logo.png` para activos de marca, `assets/slides.pptx` para plantillas de PowerPoint
- **Casos de uso**: Plantillas, imágenes, iconos, código repetitivo, fuentes, documentos de muestra
### Principio de Diseño de Divulgación Progresiva
Las habilidades utilizan un sistema de carga de tres niveles para gestionar el contexto de manera eficiente:
1. **Metadatos (name + description)** - Siempre en contexto (~100 palabras)
2. **Cuerpo de SKILL.md** - Cuando la habilidad se activa (<5k palabras)
3. **Recursos empaquetados** - Según lo necesite Claude
Mantenga el cuerpo de SKILL.md en lo esencial y por debajo de 500 líneas para minimizar la inflación del contexto.
## Proceso de Creación de Habilidades
La creación de habilidades implica estos pasos:
1. Comprender la habilidad con ejemplos concretos
2. Planificar contenidos de habilidad reutilizables (scripts, referencias, activos)
3. Inicializar la habilidad (ejecutar init_skill.py)
4. Editar la habilidad (implementar recursos y escribir SKILL.md)
5. Empaquetar la habilidad (ejecutar package_skill.py)
6. Iterar según el uso real
### Paso 3: Inicializar la Habilidad
Al crear una nueva habilidad desde cero, siempre ejecute el script `init_skill.py`:
```bash
scripts/init_skill.py <skill-name> --path <output-directory>
```
### Paso 4: Editar la Habilidad
Consulte estas guías útiles según las necesidades de su habilidad:
- **Procesos de múltiples pasos**: Consulte references/workflows.md para flujos de trabajo secuenciales y lógica condicional
- **Formatos de salida específicos o estándares de calidad**: Consulte references/output-patterns.md para plantillas y patrones de ejemplo
### Paso 5: Empaquetar una Habilidad
```bash
scripts/package_skill.py <path/to/skill-folder>
```
El script de empaquetado valida y crea un archivo .skill para distribución.
FILE:references/workflows.md
# Patrones de Flujo de Trabajo
## Flujos de Trabajo Secuenciales
Para tareas complejas, divida las operaciones en pasos secuenciales claros. A menudo es útil dar a Claude una visión general del proceso hacia el comienzo de SKILL.md:
```markdown
Completar un formulario PDF implica estos pasos:
1. Analizar el formulario (ejecutar analyze_form.py)
2. Crear mapeo de campos (editar fields.json)
3. Validar mapeo (ejecutar validate_fields.py)
4. Completar el formulario (ejecutar fill_form.py)
5. Verificar la salida (ejecutar verify_output.py)
```
## Flujos de Trabajo Condicionales
Para tareas con lógica de ramificación, guíe a Claude a través de puntos de decisión:
```markdown
1. Determinar el tipo de modificación:
**¿Crear contenido nuevo?** → Siga el "Flujo de creación" a continuación
**¿Editar contenido existente?** → Siga el "Flujo de edición" a continuación
2. Flujo de creación: [pasos]
3. Flujo de edición: [pasos]
```
FILE:references/output-patterns.md
# Patrones de Salida
Use estos patrones cuando las habilidades necesiten producir una salida consistente y de alta calidad.
## Patrón de Plantilla
Proporcione plantillas para el formato de salida. Haga coincidir el nivel de rigor con sus necesidades.
**Para requisitos estrictos (como respuestas de API o formatos de datos):**
```markdown
## Estructura del informe
USE SIEMPRE esta estructura de plantilla exacta:
# [Título del Análisis]
## Resumen ejecutivo
[Resumen de un párrafo de los hallazgos clave]
## Hallazgos clave
- Hallazgo 1 con datos de respaldo
- Hallazgo 2 con datos de respaldo
- Hallazgo 3 con datos de respaldo
## Recomendaciones
1. Recomendación específica y accionable
2. Recomendación específica y accionable
```
**Para orientación flexible (cuando la adaptación es útil):**
```markdown
## Estructura del informe
Aquí hay un formato predeterminado sensato, pero use su mejor criterio:
# [Título del Análisis]
## Resumen ejecutivo
[Resumen]
## Hallazgos clave
[Adapte las secciones según lo que descubra]
## Recomendaciones
[Adapte al contexto específico]
Ajuste las secciones según sea necesario para el tipo de análisis específico.
```
## Patrón de Ejemplos
Para habilidades donde la calidad de la salida depende de ver ejemplos, proporcione pares de entrada/salida:
```markdown
## Formato de mensaje de commit
Genere mensajes de commit siguiendo estos ejemplos:
**Ejemplo 1:**
Entrada: Se agregó autenticación de usuario con tokens JWT
Salida:
```
feat(auth): implementar autenticación basada en JWT
Agregar endpoint de inicio de sesión y middleware de validación de tokens
```
**Ejemplo 2:**
Entrada: Se corrigió error donde las fechas se mostraban incorrectamente en informes
Salida:
```
fix(reports): corregir formato de fecha en conversión de zona horaria
Usar marcas de tiempo UTC de manera consistente en la generación de informes
```
Siga este estilo: tipo(alcance): descripción breve, luego explicación detallada.
```
Los ejemplos ayudan a Claude a comprender el estilo deseado y el nivel de detalle más claramente que las descripciones solas.
FILE:scripts/quick_validate.py
#!/usr/bin/env python3
"""
Script de validación rápida para habilidades - versión mínima
"""
import sys
import os
import re
import yaml
from pathlib import Path
def validate_skill(skill_path):
"""Validación básica de una habilidad"""
skill_path = Path(skill_path)
# Verificar que SKILL.md exista
skill_md = skill_path / 'SKILL.md'
if not skill_md.exists():
return False, "SKILL.md no encontrado"
# Leer y validar frontmatter
content = skill_md.read_text()
if not content.startswith('---'):
return False, "No se encontró frontmatter YAML"
# Extraer frontmatter
match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
if not match:
return False, "Formato de frontmatter inválido"
frontmatter_text = match.group(1)
# Analizar frontmatter YAML
try:
frontmatter = yaml.safe_load(frontmatter_text)
if not isinstance(frontmatter, dict):
return False, "El frontmatter debe ser un diccionario YAML"
except yaml.YAMLError as e:
return False, f"YAML inválido en frontmatter: {e}"
# Definir propiedades permitidas
ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata'}
# Verificar propiedades inesperadas (excluyendo claves anidadas bajo metadata)
unexpected_keys = set(frontmatter.keys()) - ALLOWED_PROPERTIES
if unexpected_keys:
return False, (
f"Clave(s) inesperada(s) en frontmatter de SKILL.md: {', '.join(sorted(unexpected_keys))}. "
f"Las propiedades permitidas son: {', '.join(sorted(ALLOWED_PROPERTIES))}"
)
# Verificar campos requeridos
if 'name' not in frontmatter:
return False, "Falta 'name' en frontmatter"
if 'description' not in frontmatter:
return False, "Falta 'description' en frontmatter"
# Extraer nombre para validación
name = frontmatter.get('name', '')
if not isinstance(name, str):
return False, f"El nombre debe ser una cadena, se obtuvo {type(name).__name__}"
name = name.strip()
if name:
# Verificar convención de nomenclatura (hyphen-case: minúsculas con guiones)
if not re.match(r'^[a-z0-9-]+$', name):
return False, f"El nombre '{name}' debe estar en hyphen-case (solo letras minúsculas, dígitos y guiones)"
if name.startswith('-') or name.endswith('-') or '--' in name:
return False, f"El nombre '{name}' no puede comenzar/terminar con guion ni contener guiones consecutivos"
# Verificar longitud del nombre (máximo 64 caracteres según especificación)
if len(name) > 64:
return False, f"El nombre es demasiado largo ({len(name)} caracteres). El máximo es 64 caracteres."
# Extraer y validar descripción
description = frontmatter.get('description', '')
if not isinstance(description, str):
return False, f"La descripción debe ser una cadena, se obtuvo {type(description).__name__}"
description = description.strip()
if description:
# Verificar corchetes angulares
if '<' in description or '>' in description:
return False, "La descripción no puede contener corchetes angulares (< o >)"
# Verificar longitud de la descripción (máximo 1024 caracteres según especificación)
if len(description) > 1024:
return False, f"La descripción es demasiado larga ({len(description)} caracteres). El máximo es 1024 caracteres."
return True, "¡La habilidad es válida!"
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Uso: python quick_validate.py <directorio_de_habilidad>")
sys.exit(1)
valid, message = validate_skill(sys.argv[1])
print(message)
sys.exit(0 if valid else 1)
FILE:scripts/init_skill.py
#!/usr/bin/env python3
"""
Inicializador de Habilidades - Crea una nueva habilidad a partir de plantilla
Uso:
init_skill.py <skill-name> --path <ruta>
Ejemplos:
init_skill.py my-new-skill --path skills/public
init_skill.py my-api-helper --path skills/private
init_skill.py custom-skill --path /custom/location
"""
import sys
from pathlib import Path
SKILL_TEMPLATE = """---
name: {skill_name}
description: [TODO: Explicación completa e informativa de qué hace la habilidad y cuándo usarla. Incluya CUÁNDO usar esta habilidad - escenarios específicos, tipos de archivo o tareas que la activan.]
---
# {skill_title}
## Resumen
[TODO: 1-2 oraciones explicando qué permite esta habilidad]
## Recursos
Esta habilidad incluye directorios de recursos de ejemplo que demuestran cómo organizar diferentes tipos de recursos empaquetados:
### scripts/
Código ejecutable (Python/Bash/etc.) que se puede ejecutar directamente para realizar operaciones específicas.
### references/
Documentación y material de referencia destinados a cargarse en el contexto para informar el proceso y pensamiento de Claude.
### assets/
Archivos que no están destinados a cargarse en el contexto, sino que se utilizan dentro de la salida que Claude produce.
---
**Cualquier directorio innecesario puede eliminarse.** No todas las habilidades requieren los tres tipos de recursos.
"""
EXAMPLE_SCRIPT = '''#!/usr/bin/env python3
"""
Script auxiliar de ejemplo para {skill_name}
Este es un script de marcador de posición que se puede ejecutar directamente.
Reemplácelo con la implementación real o elimínelo si no es necesario.
"""
def main():
print("Este es un script de ejemplo para {skill_name}")
# TODO: Agregar lógica real del script aquí
if __name__ == "__main__":
main()
'''
EXAMPLE_REFERENCE = """# Documentación de Referencia para {skill_title}
Este es un marcador de posición para documentación de referencia detallada.
Reemplácelo con contenido de referencia real o elimínelo si no es necesario.
"""
EXAMPLE_ASSET = """# Archivo de Activo de Ejemplo
Este marcador de posición representa dónde se almacenarían los archivos de activos.
Reemplácelo con archivos de activos reales (plantillas, imágenes, fuentes, etc.) o elimínelo si no es necesario.
"""
def title_case_skill_name(skill_name):
"""Convertir nombre de habilidad con guiones a Title Case para visualización."""
return ' '.join(word.capitalize() for word in skill_name.split('-'))
def init_skill(skill_name, path):
"""Inicializar un nuevo directorio de habilidad con SKILL.md de plantilla."""
skill_dir = Path(path).resolve() / skill_name
if skill_dir.exists():
print(f"❌ Error: El directorio de habilidad ya existe: {skill_dir}")
return None
try:
skill_dir.mkdir(parents=True, exist_ok=False)
print(f"✅ Directorio de habilidad creado: {skill_dir}")
except Exception as e:
print(f"❌ Error al crear directorio: {e}")
return None
skill_title = title_case_skill_name(skill_name)
skill_content = SKILL_TEMPLATE.format(skill_name=skill_name, skill_title=skill_title)
skill_md_path = skill_dir / 'SKILL.md'
try:
skill_md_path.write_text(skill_content)
print("✅ SKILL.md creado")
except Exception as e:
print(f"❌ Error al crear SKILL.md: {e}")
return None
try:
scripts_dir = skill_dir / 'scripts'
scripts_dir.mkdir(exist_ok=True)
example_script = scripts_dir / 'example.py'
example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
example_script.chmod(0o755)
print("✅ scripts/example.py creado")
references_dir = skill_dir / 'references'
references_dir.mkdir(exist_ok=True)
example_reference = references_dir / 'api_reference.md'
example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
print("✅ references/api_reference.md creado")
assets_dir = skill_dir / 'assets'
assets_dir.mkdir(exist_ok=True)
example_asset = assets_dir / 'example_asset.txt'
example_asset.write_text(EXAMPLE_ASSET)
print("✅ assets/example_asset.txt creado")
except Exception as e:
print(f"❌ Error al crear directorios de recursos: {e}")
return None
print(f"\n✅ Habilidad '{skill_name}' inicializada exitosamente en {skill_dir}")
return skill_dir
def main():
if len(sys.argv) < 4 or sys.argv[2] != '--path':
print("Uso: init_skill.py <skill-name> --path <ruta>")
sys.exit(1)
skill_name = sys.argv[1]
path = sys.argv[3]
print(f"🚀 Inicializando habilidad: {skill_name}")
print(f" Ubicación: {path}")
print()
result = init_skill(skill_name, path)
sys.exit(0 if result else 1)
if __name__ == "__main__":
main()
FILE:scripts/package_skill.py
#!/usr/bin/env python3
"""
Empaquetador de Habilidades - Crea un archivo .skill distribuible de una carpeta de habilidad
Uso:
python utils/package_skill.py <ruta/a/carpeta-de-habilidad> [directorio-de-salida]
Ejemplo:
python utils/package_skill.py skills/public/my-skill
python utils/package_skill.py skills/public/my-skill ./dist
"""
import sys
import zipfile
from pathlib import Path
from quick_validate import validate_skill
def package_skill(skill_path, output_dir=None):
"""Empaquetar una carpeta de habilidad en un archivo .skill."""
skill_path = Path(skill_path).resolve()
if not skill_path.exists():
print(f"❌ Error: Carpeta de habilidad no encontrada: {skill_path}")
return None
if not skill_path.is_dir():
print(f"❌ Error: La ruta no es un directorio: {skill_path}")
return None
skill_md = skill_path / "SKILL.md"
if not skill_md.exists():
print(f"❌ Error: SKILL.md no encontrado en {skill_path}")
return None
print("🔍 Validando habilidad...")
valid, message = validate_skill(skill_path)
if not valid:
print(f"❌ Validación fallida: {message}")
print(" Corrija los errores de validación antes de empaquetar.")
return None
print(f"✅ {message}\n")
skill_name = skill_path.name
if output_dir:
output_path = Path(output_dir).resolve()
output_path.mkdir(parents=True, exist_ok=True)
else:
output_path = Path.cwd()
skill_filename = output_path / f"{skill_name}.skill"
try:
with zipfile.ZipFile(skill_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
for file_path in skill_path.rglob('*'):
if file_path.is_file():
arcname = file_path.relative_to(skill_path.parent)
zipf.write(file_path, arcname)
print(f" Agregado: {arcname}")
print(f"\n✅ Habilidad empaquetada exitosamente en: {skill_filename}")
return skill_filename
except Exception as e:
print(f"❌ Error al crear archivo .skill: {e}")
return None
def main():
if len(sys.argv) < 2:
print("Uso: python utils/package_skill.py <ruta/a/carpeta-de-habilidad> [directorio-de-salida]")
sys.exit(1)
skill_path = sys.argv[1]
output_dir = sys.argv[2] if len(sys.argv) > 2 else None
print(f"📦 Empaquetando habilidad: {skill_path}")
if output_dir:
print(f" Directorio de salida: {output_dir}")
print()
result = package_skill(skill_path, output_dir)
sys.exit(0 if result else 1)
if __name__ == "__main__":
main()
Iniciá sesión para ver el prompt completo
Continuar con:
Al iniciar sesión, aceptás nuestros Términos de uso y Política de privacidad
Uso
Este prompt está diseñado para usarse con coding. Copiá el contenido de arriba y pegalo en tu herramienta de IA preferida.
Para mejores resultados, personalizá los marcadores (indicados con corchetes o mayúsculas) con tus requisitos específicos.
Discusión
0 comentarios