Files
repo_Claude/.claude/skills/dagu-auto/SKILL.md
T
egutierrez cf71067dc6 Fix dagu-auto skill: add common errors table for Dagu v2.3+
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>
2026-03-27 02:20:58 +01:00

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.
descripción de la automatización
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/ con chmod +x
  • Validar siempre antes de activar schedule
  • Usar type: graph cuando hay dependencias
  • Usar retry_policy en 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_dir para el directorio de trabajo de un step (NO dir)
  • SIEMPRE usar type: graph cuando algún step tiene depends
  • SIEMPRE usar snake_case en step IDs (mi_paso, no mi-paso)
  • NUNCA crear crontabs — usar Dagu schedule en su lugar
  • NUNCA usar rutas relativas en commands — usar rutas absolutas
  • NUNCA hardcodear secretos — usar secrets: o env: con referencias
  • Si el usuario pide "programar algo" o "ejecutar periódicamente", usar Dagu