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

79 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# apply.sh <name> <agent-id>
# Añade la automatización <name> al config.yaml del agente <agent-id>.
# Usa yq si está disponible; en caso contrario imprime el bloque YAML para copiar a mano.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
if [[ $# -ne 2 ]]; then
echo "Uso: $0 <nombre-automatizacion> <agent-id>" >&2
echo "Ejemplo: $0 good-morning assistant-bot" >&2
exit 1
fi
NAME="$1"
AGENT_ID="$2"
SCHEDULE_FILE="$REPO_ROOT/crons/$NAME/schedule.yaml"
AGENT_CONFIG="$REPO_ROOT/agents/$AGENT_ID/config.yaml"
if [[ ! -f "$SCHEDULE_FILE" ]]; then
echo "Error: no existe crons/$NAME/schedule.yaml" >&2
echo "Usa ./dev-scripts/cron/list.sh para ver las automatizaciones disponibles." >&2
exit 1
fi
if [[ ! -f "$AGENT_CONFIG" ]]; then
echo "Error: no existe agents/$AGENT_ID/config.yaml" >&2
exit 1
fi
# Parse schedule.yaml fields
kind=""
template=""
cron_expr=""
while IFS= read -r line; do
case "$line" in
" kind:"*) kind="${line#*kind:}"; kind="${kind// /}" ;;
" template:"*) template="${line#*template:}"; template="${template# }" ;;
default_cron:*) cron_expr="${line#default_cron:}"; cron_expr="${cron_expr# }"; cron_expr="${cron_expr//\"/}" ;;
esac
done < "$SCHEDULE_FILE"
if [[ -z "$kind" || -z "$template" || -z "$cron_expr" ]]; then
echo "Error: schedule.yaml incompleto (falta kind, template o default_cron)." >&2
exit 1
fi
# Build YAML block
YAML_BLOCK=" - name: $NAME
cron: \"$cron_expr\"
output_room: \"\" # TODO: reemplaza con la sala real del agente
action:
kind: $kind
template: \"$template\""
# Try yq first
if command -v yq &>/dev/null; then
# Check if schedules key already has this entry
existing=$(yq ".schedules // [] | .[] | select(.name == \"$NAME\") | .name" "$AGENT_CONFIG" 2>/dev/null || true)
if [[ -n "$existing" ]]; then
echo "Advertencia: el agente $AGENT_ID ya tiene un schedule llamado '$NAME'. No se añade de nuevo."
exit 0
fi
# Append using yq
yq -i ".schedules += [{\"name\": \"$NAME\", \"cron\": \"$cron_expr\", \"output_room\": \"\", \"action\": {\"kind\": \"$kind\", \"template\": \"$template\"}}]" "$AGENT_CONFIG"
echo "✓ Añadido schedule '$NAME' a agents/$AGENT_ID/config.yaml"
echo "→ Edita output_room en agents/$AGENT_ID/config.yaml para apuntar a la sala correcta."
else
echo "yq no está disponible. Añade manualmente el siguiente bloque a agents/$AGENT_ID/config.yaml:"
echo ""
echo "schedules:"
echo "$YAML_BLOCK"
echo ""
echo "→ Edita output_room para apuntar a la sala correcta del agente."
fi