Files
agents_and_robots/crons
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
..

crons/ — Catálogo de automatizaciones

Directorio central de automatizaciones nombradas para los agentes. Cada subdirectorio es una automatización reutilizable que puede aplicarse a uno o más agentes.

Estructura de una automatización

crons/<nombre>/
  schedule.yaml          # spec: descripción, cron por defecto, acción
  prompts/
    message.md           # plantilla de mensaje (send_message)
    prompt.md            # prompt para el LLM (llm_prompt)

Convención de schedule.yaml

# Metadata
name: nombre-de-la-automatizacion
description: "Descripción breve"

# Cron por defecto (el agente puede sobreescribir en su config.yaml)
default_cron: "0 9 * * *"

# Acción
action:
  kind: send_message          # send_message | llm_prompt
  template: prompts/message.md  # relativo a la raíz del proyecto

# Sala por defecto (opcional; el agente debe sobreescribir con output_room)
default_output_room: ""

Nota: template es relativo a la raíz del proyecto, no a la carpeta de la automatización. Usa siempre la ruta completa desde la raíz: crons/<nombre>/prompts/message.md.

Automatizaciones disponibles

Nombre Tipo Cron por defecto Descripción
good-morning send_message 0 9 * * * Saludo de buenos días
daily-summary llm_prompt 0 18 * * * Resumen diario del equipo

Scripts de gestión

# Crear nueva automatización (interactivo)
./dev-scripts/cron/new.sh

# Listar todas las automatizaciones con descripción
./dev-scripts/cron/list.sh

# Aplicar automatización a un agente (parchea config.yaml)
./dev-scripts/cron/apply.sh <nombre> <agent-id>

Cómo añadir manualmente a un agente

En agents/<id>/config.yaml:

schedules:
  - name: good-morning
    cron: "0 9 * * *"
    output_room: "!TUROOM:matrix-af2f3d.organic-machine.com"
    action:
      kind: send_message
      template: "crons/good-morning/prompts/message.md"

Ajusta output_room con la sala real del agente. El campo cron puede sobreescribir el default_cron del catálogo.