e481cb8783
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.
95 lines
2.5 KiB
Bash
Executable File
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>"
|