Conectar un Hook
Los hooks de ciclo de vida permiten reaccionar a eventos de RaiSE — inicio de sesión, construcción del graph, patrón agregado, ciclo de vida de trabajo, y más. Siguen el mismo modelo de extensión que los adaptadores: un contrato Python Protocol descubierto via entry points.
El Protocol LifecycleHook¶
Cada hook implementa este contrato:
from typing import ClassVar, Protocol, runtime_checkable
from rai_cli.hooks.events import HookEvent
from rai_cli.hooks.protocol import HookResult
@runtime_checkable
class LifecycleHook(Protocol):
events: ClassVar[list[str]] # Eventos a suscribir
priority: ClassVar[int] # Mayor número = ejecuta primero (default 0)
def handle(self, event: HookEvent) -> HookResult: ...
Los hooks son @runtime_checkable — no se necesita herencia explícita, solo implementa la interfaz.
Eventos Disponibles¶
RaiSE emite 18 eventos tipados como dataclasses frozen:
| Evento | Se dispara cuando |
|---|---|
session:start |
Comienza la sesión |
session:close |
Termina la sesión |
graph:build |
Se reconstruye el knowledge graph |
pattern:added |
Se registra un nuevo patrón |
discover:scan |
Completa el escaneo del código |
init:complete |
Proyecto inicializado |
adapter:loaded / adapter:failed |
Descubrimiento de adaptadores |
release:publish |
Release publicado |
work:start / work:close |
Ciclo de vida de story/epic |
mcp:call |
Invocación de herramienta MCP |
before:session:close |
Antes del cierre de sesión (puede abortar) |
before:release:publish |
Antes del release (puede abortar) |
Los eventos before: pueden retornar HookResult.abort("reason") para cancelar la operación.
Ejemplo: Un Hook Personalizado¶
# my_package/hooks.py
from typing import ClassVar
from rai_cli.hooks.events import HookEvent, PatternAddedEvent
from rai_cli.hooks.protocol import HookResult
class NotifyOnPatternHook:
"""Envía una notificación cuando se agrega un nuevo patrón."""
events: ClassVar[list[str]] = ["pattern:added"]
priority: ClassVar[int] = 0
def handle(self, event: HookEvent) -> HookResult:
if isinstance(event, PatternAddedEvent):
print(f"Nuevo patrón: {event.pattern_id}")
return HookResult.ok()
Registro por Entry Points¶
Registra tu hook en pyproject.toml:
RaiSE descubre hooks en tiempo de ejecución desde el grupo de entry points rai.hooks — el mismo mecanismo usado para adaptadores.
Hooks Built-in¶
RaiSE incluye 5 hooks built-in:
| Hook | Eventos | Propósito |
|---|---|---|
TelemetryHook |
Todos los 9 eventos post-acción | Registra señales CommandUsage |
MemoryMdSyncHook |
graph:build |
Regenera MEMORY.md |
JiraSyncHook |
work:start, work:close |
Transiciona issues de Jira automáticamente |
BacklogHook |
Ciclo de vida de trabajo | Crea/transiciona ítems del backlog |
GateBridgeHook |
before:release:publish |
Ejecuta quality gates antes del release |
Aislamiento de Errores¶
Los hooks siguen aislamiento estricto de errores:
- Un hook que falla nunca hace crashear el CLI
- Las excepciones se capturan, registran y omiten
- Cada hook tiene un timeout de 5 segundos (configurable)
- Aunque un hook aborte, todos los demás siguen ejecutándose (semántica all-notify)
Validación¶
Verifica que tu hook es descubierto:
Ver también: rai adapter check, Crear un Adaptador Personalizado