Formación › Programar con Claude Code en 12 horas › Hora 8
Programar con Claude Code en 12 horas · hora 8 de 12
Skills (y comandos)
Una skill convierte un procedimiento que repites en un /comando que Claude ejecuta igual cada vez. Verás la skill real que escribió Claude Code para revisar el parte antes de enviarlo, y un permiso de su cabecera que dice lo contrario que su texto.
Al terminar sabrásCrear una skill de proyecto con una descripción precisa, decidir si Claude puede cargarla solo o únicamente cuando la pides, y revisar su configuración contra la documentación oficial.
60 minutos· 1 esquema· 6 preguntas· 1 ejercicio· entregable
Repaso
Comprueba De la hora 7: en modo dontAsk, ¿qué pasa con una edición que en modo manual te pediría confirmación?
No. Eso es el modo automático, no dontAsk.
No. En dontAsk no se pregunta: se deniega.
Correcto. Por eso es el modo para ejecuciones sin nadie delante.
Comprueba De la hora 7: proteges una carpeta con una regla deny sobre Bash(rm *). ¿Por qué puede no bastar?
Correcto. En la sesión real intentó Bash, escritura y PowerShell; y la regla mira el texto del comando.
No. Se aplican en todos los modos.
No. Lo usan a menudo: es la vía más directa.
Comprueba De la hora 3: ¿qué entra en el contexto al empezar cada sesión?
No. De entrada, solo su descripción; el resto, cuando hace falta.
No. Trabajan en su propio contexto cuando se les llama.
Correcto. Lo demás se carga cuando hace falta.
Vocabulario
- Skill
- Una carpeta con un SKILL.md que Claude carga cuando la tarea coincide con su descripción, o cuando escribes /su-nombre.
- disable-model-invocation
- Opción que impide que Claude cargue la skill por su cuenta: solo se ejecuta cuando la pides.
- allowed-tools
- Herramientas que la skill puede usar sin preguntar mientras se ejecuta.
- $ARGUMENTS
- Lo que escribes tras el nombre del comando, que la skill recibe.
El ejemplo: una skill para revisar el parte
Antes y después Crear una skill de proyecto
La petición
Crea una skill de proyecto en .claude/skills/revisar-parte/SKILL.md que revise el parte semanal antes de enviarlo: que no haya horas negativas, que no haya ids duplicados en los datos de origen, que las cifras usen coma decimal y que la semana del título coincida con las fechas de los datos. Debe devolver una lista de problemas con la fila afectada. Que solo se ejecute cuando yo la pida con /revisar-parte, no de forma automática.La sesión real
Salida real Claude Sonnet 5.5 · 24 de octubre de 2026 · sin editar · Claude Code en modo auto sobre el repositorio de práctica
Para repetirla, en el repositorio: claude --permission-mode auto y pega la petición. Se grabó con claude -p, sin conversación: lo que aquí se deniega, a ti te lo preguntaría.
Lo que hizo: 4 acciones
Bash: git ls-files && ls -la && ls -la .claude 2>/dev/nullBash: for f in README.md package.json datos/paradas.csv src/cli.js src/fechas.js src/informes/semanal.js src/paradas.js; do echo "=== $f"; cat "$f"; echo; doneBash: npm run parte --silentWrite: .claude/skills/revisar-parte/SKILL.md
He creado la skill en .claude/skills/revisar-parte/SKILL.md. No la he ejecutado, solo he comprobado a mano que sus ejemplos cuadran con los datos.
Solo corre cuando escribes /revisar-parte, porque lleva disable-model-invocation: true y Claude no la lanza por su cuenta. Puedes pasarle otra ruta de CSV como argumento. Si no, usa datos/paradas.csv.
Lee el CSV, genera el parte con npm run parte y hace las cuatro comprobaciones. Solo informa, no modifica nada.
- Horas negativas: comprueba cada fila del CSV y también los totales por línea del parte. Si
fines anterior ainicio, avisa de que puede ser una parada que cruza la medianoche. - Ids duplicados: lista todas las filas de cada id repetido y dice si son idénticas o se contradicen.
- Coma decimal: marca cualquier valor del parte con punto en vez de coma.
- Semana del título: calcula la semana ISO de cada fecha con
semanaIsoy la compara con la del título.
La salida es una lista con una línea por problema, ordenada por fila. Numera las filas como en el archivo (la cabecera es la fila 1) e indica siempre el id. Termina con un resumen de una línea, y si todo pasa, dice que el parte se puede enviar.
Sobre tus datos actuales, la skill debería detectar dos problemas:
- P-104 (fila 5,
23:30→01:15) da horas negativas. Es una parada nocturna quehorasEntreno contempla, y por eso L2 sale con -19,3 h en el parte. - P-106 (filas 7 y 8) es un duplicado exacto, así que las horas de L3 se cuentan dos veces.
La coma decimal y la semana 10 pasan ahora mismo.
La skill solo informa. Si quieres, puedo arreglar después la parada nocturna en horasEntre y el duplicado del CSV.
Los cambios que dejó (diff)
diff --git a/.claude/skills/revisar-parte/SKILL.md b/.claude/skills/revisar-parte/SKILL.md
new file mode 100644
index 0000000..ff6b8bf
--- /dev/null
+++ b/.claude/skills/revisar-parte/SKILL.md
@@ -0,0 +1,74 @@
+---
+name: revisar-parte
+description: Revisa el parte semanal de mantenimiento antes de enviarlo (horas negativas, ids duplicados, coma decimal, semana del título) y devuelve una lista de problemas con la fila afectada.
+disable-model-invocation: true
+allowed-tools: Bash(npm run parte:*), Bash(node:*), Read, Grep
+---
+
+# Revisar el parte semanal
+
+Revisa el parte semanal y los datos de origen **sin modificar nada**. Solo informa.
+
+## Entradas
+
+- Datos de origen: `datos/paradas.csv` (separador `;`, columnas `id;fecha;linea;equipo;inicio;fin`).
+- Parte generado: salida de `npm run parte --silent`.
+- Si el usuario pasa otra ruta de CSV como argumento (`$ARGUMENTS`), úsala en lugar de `datos/paradas.csv` y genera el parte con `node src/cli.js <ruta>`.
+
+## Pasos
+
+1. Lee el CSV completo y genera el parte. Guarda el texto del parte para las comprobaciones 3 y 4.
+2. Ejecuta las cuatro comprobaciones de abajo. Hazlas todas aunque una falle.
+3. Devuelve el informe con el formato de la sección «Salida».
+
+Numera las filas como en el archivo: la cabecera es la fila 1, así que la primera parada es la fila 2. Indica siempre la fila y el `id`.
+
+## Comprobaciones
+
+### 1. Horas negativas
+
+- Por cada fila del CSV, calcula `fin - inicio` en horas (`HH:MM`). Si es negativa, repórtala con fila, `id`, `inicio`, `fin` y el valor.
+- Revisa también la tabla del parte: cualquier total por línea negativo es un problema (indica la línea y qué filas del CSV la componen con horas negativas).
+- Si `fin` es anterior a `inicio` y la parada parece cruzar la medianoche (por ejemplo `23:30` → `01:15`), dilo en la descripción: probablemente sea una parada nocturna que el cálculo no contempla, no un error de captura. No lo corrijas.
+
+### 2. Ids duplicados
+
+- Agrupa las filas del CSV por `id`. Por cada `id` que aparezca más de una vez, lista todas sus filas.
+- Distingue si las filas repetidas son idénticas (duplicado exacto, la hora se cuenta dos veces) o difieren en algún campo (conflicto de datos).
+- Indica el efecto sobre el parte: las horas de la línea afectada están infladas o son ambiguas.
+
+### 3. Coma decimal
+
+- En la tabla del parte, todo valor numérico de la columna de horas debe usar coma decimal (`2,3`) y no punto (`2.3`).
+- Reporta cada línea del parte con punto decimal, con el texto de la línea tal cual.
+- No marques como problema los separadores de miles ni las fechas del título.
+
+### 4. Semana del título
+
+- Extrae el número de la semana del título (`semana N`).
+- Calcula la semana ISO de **cada** fecha del CSV (usa `semanaIso` de `src/fechas.js`).
+- Es un problema si alguna fecha cae en una semana distinta de la del título, o si las fechas abarcan más de una semana. Reporta la fila, su `id` y la fecha, e indica la semana del título frente a la real.
+- Ten en cuenta que el título se deriva de la primera fila: si esa fila es la que no coincide, el título puede estar mal para el resto.
+
+## Salida
+
+Responde en español con este formato.
+
+Si hay problemas, una lista con una línea por problema, ordenada por fila:
+
+```
+- [Horas negativas] Fila 5 (P-104, L2 · Compresor C-2): 23:30 → 01:15 = -22,3 h. Parece una parada que cruza la medianoche.
+- [Id duplicado] Filas 7 y 8 (P-106): filas idénticas, las horas de L3 se cuentan dos veces.
+- [Coma decimal] Parte, línea «L1 | 2.3»: usa punto decimal.
+- [Semana] Fila 3 (P-102, 2025-03-10): es la semana 11 y el título dice semana 10.
+```
+
+Para los problemas que afectan al parte y no a una fila concreta (coma decimal, total por línea negativo), indica la línea de la tabla en lugar de la fila del CSV.
+
+Termina con un resumen de una línea: `N problemas: X horas negativas, Y ids duplicados, Z de formato decimal, W de semana`.
+
+Si no hay ningún problema, di claramente que las cuatro comprobaciones pasan y que el parte se puede enviar. No inventes problemas ni añadas avisos de otro tipo.
+
+## Límites
+
+- No edites `datos/paradas.csv` ni el código, y no envíes el parte. Si el usuario quiere corregir algo, propón el arreglo después del informe y espera a que lo pida.Qué ha pasado
Una skill muy completa: pasos numerados, las cuatro comprobaciones, el formato exacto de la salida con ejemplos y unos límites claros («no edites», «no envíes el parte»). Usa disable-model-invocation: true para que solo se ejecute con /revisar-parte, y acepta otra ruta de CSV con $ARGUMENTS.
El detalle que tienes que revisar: en allowed-tools escribió Bash(node:*). Esa regla deja que la skill ejecute cualquier comando de Node sin preguntar, y un script de Node puede escribir o borrar ficheros. El texto de la skill dice «solo informa»; su permiso permite lo contrario. Lo que necesita es más estrecho: Bash(npm run parte *) para el parte y Bash(node src/cli.js *) para otro CSV.
La otra regla, Bash(npm run parte:*), está bien: según la documentación, el sufijo :* equivale a *. Es el discernimiento aplicado a la configuración: lo que escribe un agente también se revisa, y sus permisos los primeros.
Skills y comandos son lo mismo
Según la documentación de Claude Code, los comandos personalizados se han fusionado con las skills: un fichero en .claude/commands/deploy.md y una skill en .claude/skills/deploy/SKILL.md crean el mismo /deploy y funcionan igual. Los ficheros antiguos de .claude/commands/ siguen funcionando. Las skills añaden una carpeta para ficheros de apoyo y opciones en la cabecera.
| Dónde | Ruta | Para quién |
|---|---|---|
| Personal | ~/.claude/skills/<nombre>/SKILL.md | Tú, en todos tus proyectos |
| Proyecto | .claude/skills/<nombre>/SKILL.md | Este repositorio; en Git, para el equipo |
| Plugin | <plugin>/skills/<nombre>/SKILL.md | Donde esté el plugin, como /plugin:nombre |
Las opciones que más importan
description: qué hace y cuándo usarla. Es lo que Claude lee para decidir si la carga.disable-model-invocation: true: para procedimientos con efectos (desplegar, enviar, publicar) que solo deben ejecutarse cuando tú lo pidas. Además, su descripción no ocupa contexto hasta que la uses.allowed-tools: lo que puede hacer sin preguntar mientras se ejecuta. No restringe las demás herramientas.$ARGUMENTS: lo que escribes tras el comando, como/revisar-parte datos/otro.csv.
Claude Code trae además skills incluidas, como /code-review, /batch, /debug o /verify.
Practica
Clasifica ¿Debe poder cargarla Claude solo, o solo cuando tú la pidas?
- Las convenciones de nombres de la API del proyectoEs conocimiento que conviene aplicar siempre que toque, sin pedirlo.
- Desplegar a producciónTiene efectos: nunca debe lanzarse sola.
- Revisar el parte antes de enviarloEs un paso que tú decides cuándo dar, como en el ejemplo.
- Cómo escribir pruebas en este repositorioLe sirve cada vez que escribe pruebas.
- Enviar el parte por correo a direcciónEnviar tiene consecuencias.
Comprueba lo que has aprendido
Comprueba Tienes .claude/commands/revisar.md y quieres pasarlo a skill. ¿Qué cambia para quien lo usa?
No. Los ficheros de
.claude/commands/siguen funcionando.Correcto. Comandos y skills crean el mismo comando; la skill añade carpeta y opciones.
No. Se puede lanzar igual con /revisar.
Comprueba La skill real declara allowed-tools: Bash(node:*) y su texto dice que solo informa. ¿Qué haces?
Correcto. Así el permiso encaja con la promesa de que solo informa.
No. Lo que escribe un agente también se revisa, y sus permisos los primeros.
No. Funcionaría, pero te preguntará por cada comando: mejor acotar la regla.
Comprueba ¿Para qué sirve disable-model-invocation: true?
Correcto. Y para que su descripción no ocupe contexto mientras no la uses.
No. Se guarda igual: la opción no cambia dónde vive.
No. Eso no lo hace: limita quién la lanza, no lo que puede hacer.
Entregable Tu skill de proyecto
Crea una skill de proyecto para un procedimiento que repitas (revisar, preparar un informe, comprobar antes de un commit). Decide si Claude puede cargarla solo o solo cuando la pidas, revisa que allowed-tools no permita más de lo que necesita y pruébala dos veces. Pega aquí el SKILL.md y qué tuviste que corregir.
Está bien si: la descripción dice qué hace y cuándo usarla; lo que tiene efectos lleva disable-model-invocation: true; cada regla de allowed-tools nombra un comando concreto; y la has lanzado dos veces con el mismo resultado. Tiempo: unos 25 minutos.
Lo esencial
- Skills y comandos son lo mismo: un fichero en
.claude/commands/o una carpeta en.claude/skills/crean el mismo /comando. - La descripción decide cuándo se carga;
disable-model-invocationla reserva para cuando tú la pidas. - Lo que tiene efectos (desplegar, enviar, publicar) se lanza solo a mano.
- Revisa lo que escribe el agente, también sus permisos: que la regla no permita más de lo que promete el texto.
Fuentes y para seguir
- Skills en Claude Code (se abre en otra pestaña) (documentación oficial, consultada el 24/10/2026).
- Configurar permisos: sintaxis de las reglas (se abre en otra pestaña).
- En MaestrIA: crea tu primera skill, en el curso de Claude, y el plugin con tres skills del kit.
Lección revisada el 24/10/2026 con la documentación oficial enlazada en sus fuentes. Revisamos los cursos cada trimestre.