Files
agents_and_robots/dev-scripts/cron/new.sh
T
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

95 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# new.sh — Scaffolder interactivo para automatizaciones cron
# Crea crons/<name>/schedule.yaml y el archivo de prompt/mensaje vacío.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
echo "=== Nueva automatización cron ==="
echo ""
# Nombre
read -rp "Nombre de la automatización (ej: weekly-report): " NAME
NAME="${NAME// /-}"
NAME="${NAME,,}" # lowercase
if [[ -z "$NAME" ]]; then
echo "Error: el nombre no puede estar vacío." >&2
exit 1
fi
if [[ -d "$REPO_ROOT/crons/$NAME" ]]; then
echo "Error: ya existe crons/$NAME/" >&2
exit 1
fi
# Descripción
read -rp "Descripción breve: " DESCRIPTION
if [[ -z "$DESCRIPTION" ]]; then
echo "Error: la descripción no puede estar vacía." >&2
exit 1
fi
# Tipo de acción
echo ""
echo "Tipo de acción:"
echo " 1) send_message — envía un mensaje estático o plantilla"
echo " 2) llm_prompt — llama al LLM con un prompt y envía la respuesta"
read -rp "Selecciona [1/2]: " ACTION_TYPE_NUM
case "$ACTION_TYPE_NUM" in
1) ACTION_KIND="send_message"; PROMPT_FILE="message.md" ;;
2) ACTION_KIND="llm_prompt"; PROMPT_FILE="prompt.md" ;;
*)
echo "Error: selección inválida. Usa 1 o 2." >&2
exit 1
;;
esac
# Cron expression
DEFAULT_CRON="0 9 * * *"
read -rp "Cron expression [default: $DEFAULT_CRON]: " CRON_EXPR
CRON_EXPR="${CRON_EXPR:-$DEFAULT_CRON}"
# Crear estructura
CRON_DIR="$REPO_ROOT/crons/$NAME"
PROMPTS_DIR="$CRON_DIR/prompts"
mkdir -p "$PROMPTS_DIR"
# schedule.yaml
cat > "$CRON_DIR/schedule.yaml" <<EOF
# Automatización: $NAME
name: $NAME
description: "$DESCRIPTION"
# Cron por defecto
default_cron: "$CRON_EXPR"
# Acción
action:
kind: $ACTION_KIND
# Relativo a la raíz del proyecto
template: crons/$NAME/prompts/$PROMPT_FILE
# Sala de salida por defecto (vacío = el agente debe configurar output_room)
default_output_room: ""
EOF
# Archivo de prompt/mensaje
touch "$PROMPTS_DIR/$PROMPT_FILE"
echo ""
echo "✓ Creado: crons/$NAME/schedule.yaml"
echo "✓ Creado: crons/$NAME/prompts/$PROMPT_FILE"
echo ""
echo "Edita crons/$NAME/prompts/$PROMPT_FILE con el contenido deseado."
echo ""
echo "Añade esto a agents/<id>/config.yaml:"
echo ""
echo " schedules:"
echo " - name: $NAME"
echo " cron: \"$CRON_EXPR\""
echo " output_room: \"!TUROOM:matrix-af2f3d.organic-machine.com\""
echo " action:"
echo " kind: $ACTION_KIND"
echo " template: \"crons/$NAME/prompts/$PROMPT_FILE\""
echo ""
echo "O usa: ./dev-scripts/cron/apply.sh $NAME <agent-id>"