cf71067dc6
Added explicit rules for working_dir (not dir), type: graph with depends, and snake_case step IDs. These caused validation failures in practice. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6.3 KiB
6.3 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools | |
|---|---|---|---|---|
| dagu-auto | Genera automatizaciones Dagu (DAGs YAML) - crea workflows, schedules y scripts en ~/dagu/. Usar en vez de cron para cualquier tarea programada. |
|
Bash, Read, Write, Edit, Glob, Grep |
dagu-auto
Genera una automatización completa en Dagu: DAG YAML + scripts necesarios.
Preferimos Dagu sobre cron para TODA programación de tareas.
Sintaxis
/dagu-auto backup diario de base de datos
/dagu-auto ETL pipeline cada hora
/dagu-auto limpiar logs viejos cada domingo
/dagu-auto monitorear API cada 5 minutos
O Claude puede invocar esta skill cuando detecte que el usuario necesita programar/automatizar algo.
Precondiciones
- Dagu instalado (
which dagu) - Directorio
~/dagu/dags/existe - Servicio dagu corriendo (
systemctl --user is-active dagu.service)
Si no se cumplen, instalar y configurar primero:
# Instalar
curl -fsSL https://raw.githubusercontent.com/dagu-org/dagu/main/scripts/installer.sh | bash -s -- --install-dir ~/.local/bin
# Crear estructura
mkdir -p ~/dagu/{dags,scripts,logs,data}
# Configurar servicio
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/dagu.service << 'SVCEOF'
[Unit]
Description=Dagu Workflow Scheduler
After=network.target
[Service]
Type=simple
ExecStart=%h/.local/bin/dagu start-all --config=%h/dagu/dagu-config.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
SVCEOF
systemctl --user daemon-reload
systemctl --user enable --now dagu.service
Flujo
1. Analizar la solicitud
Determinar del input ($ARGUMENTS o descripción del usuario):
- Qué automatizar: la tarea concreta
- Frecuencia: cron expression (si aplica)
- Dependencias: pasos secuenciales o paralelos
- Scripts necesarios: bash, python, go, etc.
- Variables/Parámetros: configuración dinámica
2. Elegir tipo de DAG
| Situación | Tipo |
|---|---|
| Pasos secuenciales simples | type: chain (default) |
| Pasos con dependencias complejas | type: graph |
| Pasos paralelos | type: graph + max_active_steps |
| Sub-workflows reutilizables | call: + archivo separado |
3. Generar nombre del DAG
# Convención: snake_case, descriptivo, corto
backup_postgres_diario
etl_ventas_hora
limpieza_logs_semanal
monitor_api_health
4. Crear scripts auxiliares (si necesario)
Si el step requiere lógica compleja, crear script en ~/dagu/scripts/:
# ~/dagu/scripts/nombre_script.sh
#!/bin/bash
set -euo pipefail
# Lógica aquí
Siempre dar permisos de ejecución: chmod +x ~/dagu/scripts/nombre_script.sh
5. Generar el DAG YAML
Crear en ~/dagu/dags/nombre.yaml:
name: nombre-descriptivo
description: Qué hace este workflow
tags: [categoria]
# Schedule (si aplica)
schedule: "expresion_cron"
# Variables de entorno
env:
- VAR_NECESARIA: valor
# Parámetros (si necesita configuración)
params:
- name: PARAM
type: string
default: valor
# Handlers
handler_on:
failure:
command: echo "FALLÓ: ${DAG_NAME}" >> ~/dagu/logs/failures.log
steps:
- id: paso_1
description: Qué hace este paso
command: echo "ejecutando"
- id: paso_2
command: bash ~/dagu/scripts/mi_script.sh
depends: [paso_1]
retry_policy:
limit: 3
interval_sec: 10
6. Validar
dagu validate ~/dagu/dags/nombre.yaml
Si falla, corregir y re-validar.
7. Probar ejecución
dagu start ~/dagu/dags/nombre.yaml
# O con parámetros:
dagu start ~/dagu/dags/nombre.yaml -- PARAM=valor
8. Confirmar resultado
Mostrar al usuario:
DAG creado: ~/dagu/dags/nombre.yaml
Schedule: cada día a las 2:00 AM
Steps: 3 pasos (graph mode)
Scripts: ~/dagu/scripts/nombre_script.sh
Web UI: http://localhost:8090
Validación: OK
Test: OK
Referencia rápida de cron
| Expresión | Significado |
|---|---|
"*/5 * * * *" |
Cada 5 minutos |
"0 * * * *" |
Cada hora |
"0 */2 * * *" |
Cada 2 horas |
"0 9 * * *" |
Cada día a las 9:00 |
"0 2 * * *" |
Cada día a las 2:00 AM |
"0 9 * * MON-FRI" |
Lunes a viernes a las 9:00 |
"0 0 * * SUN" |
Cada domingo a medianoche |
"0 0 1 * *" |
Primer día de cada mes |
"CRON_TZ=America/Argentina/Buenos_Aires 0 9 * * *" |
Con timezone |
Referencia rápida de tipos de step
| Tipo | Uso |
|---|---|
command: |
Comando shell (default) |
type: http |
Petición HTTP (GET/POST/PUT/DELETE) |
type: ssh |
Ejecutar en servidor remoto |
type: jq |
Procesar JSON |
type: mail |
Enviar email |
type: chat |
LLM (OpenAI/Anthropic) |
type: router |
Condicional/branching |
type: archive |
Comprimir/descomprimir |
call: |
Sub-workflow |
Convenciones
- Nombres de DAG en snake_case
- Siempre incluir
name,description,tags - Un handler_on.failure mínimo para logging
- Scripts en
~/dagu/scripts/conchmod +x - Validar siempre antes de activar schedule
- Usar
type: graphcuando hay dependencias - Usar
retry_policyen steps que pueden fallar (HTTP, SSH) - Usar
output:para pasar datos entre steps
Errores comunes (Dagu v2.3+)
| Error | Causa | Solución |
|---|---|---|
use snake_case keys (dir -> working_dir) |
Usaste dir: en un step |
Cambiar a working_dir: |
depends field is not allowed for DAGs with type 'chain' |
Usaste depends: sin declarar el tipo de DAG |
Añadir type: graph al nivel raíz del DAG |
invalid step ID format: must match ^[a-zA-Z][a-zA-Z0-9_]*$ |
Guiones medios en step IDs | Usar solo snake_case en IDs: git_push, no git-push |
Regla de oro: SIEMPRE usar working_dir (no dir), type: graph si hay depends, y snake_case en step IDs.
Reglas
- SIEMPRE verificar que Dagu está instalado antes de crear DAGs
- SIEMPRE validar el DAG después de crearlo
- SIEMPRE usar
working_dirpara el directorio de trabajo de un step (NOdir) - SIEMPRE usar
type: graphcuando algún step tienedepends - SIEMPRE usar snake_case en step IDs (
mi_paso, nomi-paso) - NUNCA crear crontabs — usar Dagu schedule en su lugar
- NUNCA usar rutas relativas en commands — usar rutas absolutas
- NUNCA hardcodear secretos — usar
secrets:oenv:con referencias - Si el usuario pide "programar algo" o "ejecutar periódicamente", usar Dagu