#!/usr/bin/env python3 """Stellt sicher, dass ein Worker-Profil die Agent-Hooks kennt (Faden 8, 13.07.2026). Kanban-Worker laufen unter IHREM Profil (HERMES_HOME=~/.hermes/profiles/) und lesen dessen config.yaml — NICHT die Top-Level ~/.hermes/config.yaml. Die worker-relevanten Hooks (box-steckbrief-inject = Box-Wissen, tabu-pfade-guard = Schreibschutz) muessen also in JEDER Worker-Profil-config.yaml stehen, sonst feuern sie fuer Worker nie (Bug-Fund 13.07.). Idempotent + validiert + Backup. Setzt einen bestehenden `pre_verify`-Hook-Block als Anker voraus (haben alle von default/werkstatt geklonten Profile); fehlt er, wird sauber uebersprungen (exit 0), damit deploy.sh nicht bricht. Arg: Pfad zur Profil-config.yaml. """ import sys import os import datetime import shutil try: import yaml except Exception: print(" (PyYAML fehlt — ensure-profile-hooks uebersprungen)") sys.exit(0) AH = os.path.expanduser("~/.hermes/agent-hooks") WANT = { "pre_llm_call": f"{AH}/box-steckbrief-inject.sh", "pre_tool_call": f"{AH}/tabu-pfade-guard.py", } if len(sys.argv) < 2: print(" usage: ensure-profile-hooks.py ") sys.exit(0) p = sys.argv[1] if not os.path.isfile(p): sys.exit(0) txt = open(p, encoding="utf-8").read() anchor = (" pre_verify:\n" f" - command: {AH}/pre-verify-gates.sh\n" " timeout: 60\n") if txt.count(anchor) != 1: print(f" [{os.path.basename(os.path.dirname(p))}] kein eindeutiger pre_verify-Anker — SKIP") sys.exit(0) add = "" for event, cmd in WANT.items(): if cmd not in txt: add += f" {event}:\n - command: {cmd}\n timeout: 10\n" if not add: print(f" [{os.path.basename(os.path.dirname(p))}] Hooks schon registriert.") sys.exit(0) new = txt.replace(anchor, anchor + add, 1) try: d = yaml.safe_load(new) h = d["hooks"] for event, cmd in WANT.items(): assert any(cmd in x.get("command", "") for x in h.get(event, [])) assert any("pre-verify-gates.sh" in x.get("command", "") for x in h["pre_verify"]) except Exception as exc: print(f" [{p}] Validierung fehlgeschlagen ({exc}) — config UNVERAENDERT.") sys.exit(0) bak = p + ".bak-hooks-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") shutil.copy2(p, bak) tmp = p + ".tmp-hooks" open(tmp, "w", encoding="utf-8").write(new) os.replace(tmp, p) print(f" [{os.path.basename(os.path.dirname(p))}] Hooks ergaenzt (Backup {os.path.basename(bak)}).")