Files
egutierrez e481cb8783 feat: catálogo crons/ + scripts dev-scripts/cron/ + Fire() en scheduler
Implementa issue 0025: catálogo central de automatizaciones cron y scaffolder.

- crons/: directorio de automatizaciones nombradas con README explicando la
  convención. Incluye dos ejemplos listos para usar:
    · good-morning (send_message, 0 9 * * *) — saludo diario
    · daily-summary (llm_prompt, 0 18 * * *)  — resumen generado por LLM

- dev-scripts/cron/new.sh: scaffolder interactivo — pregunta nombre,
  descripción, tipo de acción y cron expression; crea schedule.yaml +
  archivo de prompt vacío; imprime el bloque YAML para copiar en config.yaml.

- dev-scripts/cron/list.sh: lista todas las automatizaciones del catálogo
  con nombre, tipo, cron y descripción en formato tabular.

- dev-scripts/cron/apply.sh: añade la automatización al config.yaml del
  agente indicado usando yq si está disponible; si no, imprime el bloque
  YAML para copiar a mano (sin dependencias obligatorias).

- shell/cron/scheduler.go: exporta Fire(ctx, sc) para disparo inmediato
  de un schedule sin esperar al timer cron — útil en tests y CLI.

- shell/cron/scheduler_test.go: cuatro tests nuevos para Fire()
  (send_message inline, llm_prompt, sin output_room, sin LLM).
  TestScheduler_SkipsInvalidSchedule y TestFire_LLMPrompt_NoLLM_Skips
  reemplazados por versiones instantáneas usando Fire en lugar de
  @every 100ms + sleep, eliminando ~700ms de tiempo de test.
2026-03-08 20:01:02 +00:00

48 lines
1.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# list.sh — Lista todas las automatizaciones del catálogo crons/ con nombre, tipo y descripción.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
CRONS_DIR="$REPO_ROOT/crons"
if [[ ! -d "$CRONS_DIR" ]]; then
echo "No se encontró el directorio crons/." >&2
exit 1
fi
# Collect entries: name, kind, default_cron, description
entries=()
while IFS= read -r -d '' schedule_file; do
name=""
description=""
kind=""
cron_expr=""
while IFS= read -r line; do
case "$line" in
name:*) name="${line#name:}"; name="${name// /}" ;;
description:*) description="${line#description:}"; description="${description# }"; description="${description#\"}"; description="${description%\"}" ;;
" kind:"*) kind="${line#*kind:}"; kind="${kind// /}" ;;
default_cron:*) cron_expr="${line#default_cron:}"; cron_expr="${cron_expr# }"; cron_expr="${cron_expr//\"/}" ;;
esac
done < "$schedule_file"
if [[ -n "$name" ]]; then
entries+=("$name|$kind|$cron_expr|$description")
fi
done < <(find "$CRONS_DIR" -name "schedule.yaml" -print0 | sort -z)
if [[ ${#entries[@]} -eq 0 ]]; then
echo "No hay automatizaciones en crons/."
exit 0
fi
# Print header
printf "%-22s %-15s %-15s %s\n" "NOMBRE" "TIPO" "CRON" "DESCRIPCIÓN"
printf "%-22s %-15s %-15s %s\n" "------" "----" "----" "-----------"
for entry in "${entries[@]}"; do
IFS='|' read -r name kind cron_expr description <<< "$entry"
printf "%-22s %-15s %-15s %s\n" "$name" "$kind" "$cron_expr" "$description"
done