Kairo-Jinkendo/backend/steering/hooks/registry.py
Lars 95feba6204
All checks were successful
Deploy Development / deploy (push) Successful in 44s
Test Suite / pytest-backend (push) Successful in 1m19s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 11s
AP1.0: Steering Foundation — Lifecycle, Context, Signal Engine
Persistierter Standard Lifecycle pro Initiative, backend/steering/ Skeleton, Attention-Refactor und Hook-Dispatch als Basis für Method Registry.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 17:09:20 +02:00

64 lines
2.1 KiB
Python

"""Hook Registry — stabile Einhängepunkte (AP1.0 definitions only)."""
from __future__ import annotations
from dataclasses import dataclass
_HOOKS: dict[str, "HookDefinition"] = {}
@dataclass(frozen=True)
class HookDefinition:
slug: str
lifecycle_step: str
description: str
since_version: str = "0.11.0"
def register_hook(defn: HookDefinition) -> None:
if defn.slug in _HOOKS:
raise ValueError(f"Hook already registered: {defn.slug}")
_HOOKS[defn.slug] = defn
def get_hook(slug: str) -> HookDefinition | None:
return _HOOKS.get(slug)
def list_hooks() -> tuple[HookDefinition, ...]:
return tuple(_HOOKS.values())
def clear_hooks_for_tests() -> None:
_HOOKS.clear()
def register_builtin_hooks() -> None:
"""Slugs aus Target Architecture §7.3 — Handler folgen in AP1.3."""
builtins = (
("on_goal_captured", "intake", "Ziel erfasst"),
("on_method_selected", "method_selection", "Methode gewählt"),
("on_structure_required", "structure_setup", "Struktur erforderlich"),
("on_backlog_required", "structure_setup", "Backlog erforderlich"),
("on_next_action_requested", "action_selection", "Nächste Aktion angefragt"),
("on_assignment_required", "assignment", "Zuweisung erforderlich"),
("on_blocker_open", "waiting", "Blocker gemeldet"),
("on_blocker_resolved", "action_selection", "Blocker geschlossen"),
("on_wait_started", "waiting", "Warten begonnen"),
("on_result_received", "result_intake", "Ergebnis eingegangen"),
("on_evidence_required", "validation", "Nachweis erforderlich"),
("on_review_due", "review", "Review fällig"),
("on_review_completed", "review", "Review abgeschlossen"),
("on_replan_required", "adaptation", "Anpassung nötig"),
("on_closure_requested", "closure", "Abschluss angefragt"),
)
for slug, step, desc in builtins:
if slug not in _HOOKS:
register_hook(
HookDefinition(
slug=slug,
lifecycle_step=step,
description=desc,
)
)