Files
Agent Zero 8de35a24a7
Check Cross-Plugin Imports / check (push) Has been cancelled
fix(hooks): 9 hook wiring fixes — DMS/Calendar name mismatch, Mail/Contact missing triggers
2026-08-17 07:21:39 +02:00

83 lines
3.0 KiB
Python

#!/usr/bin/env python3
"""Trace Hooks — Find orphan hooks (registered but never triggered) and orphan triggers (triggered but never received)."""
from __future__ import annotations
import re, sys, json
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent.parent
APP = ROOT / "app"
# Simplified patterns — match either single or double quotes separately
PATTERNS_REG = [
r'register_(?:action|filter)s?\s*\(\s*"([^"]+)"',
r"register_(?:action|filter)s?\s*\(\s*'([^']+)'",
r'register_actions_by_owner\s*\(\s*"([^"]+)"',
r"register_actions_by_owner\s*\(\s*'([^']+)'",
]
PATTERNS_TRIG = [
r'do_action\s*\(\s*"([^"]+)"',
r"do_action\s*\(\s*'([^']+)'",
r'apply_filters?\s*\(\s*"([^"]+)"',
r"apply_filters?\s*\(\s*'([^']+)'",
r'trigger\s*\(\s*"([^"]+)"',
r"trigger\s*\(\s*'([^']+)'",
]
def find_hook_registrations():
regs = []
for py in APP.rglob("*.py"):
try:
content = py.read_text()
except Exception:
continue
rel = str(py.relative_to(ROOT))
for pat in PATTERNS_REG:
for m in re.finditer(pat, content):
regs.append({"file": rel, "hook_name": m.group(1)})
return regs
def find_hook_triggers():
triggers = []
for py in APP.rglob("*.py"):
try:
content = py.read_text()
except Exception:
continue
rel = str(py.relative_to(ROOT))
for pat in PATTERNS_TRIG:
for m in re.finditer(pat, content):
triggers.append({"file": rel, "hook_name": m.group(1)})
return triggers
def main():
print("=" * 70)
print("TRACE HOOKS — Orphan Hooks & Triggers")
print("=" * 70)
regs = find_hook_registrations()
triggers = find_hook_triggers()
reg_names = {r["hook_name"] for r in regs}
trig_names = {t["hook_name"] for t in triggers}
orphans_reg = [r for r in regs if r["hook_name"] not in trig_names]
orphans_trig = [t for t in triggers if t["hook_name"] not in reg_names]
print(f"\nHook registrations: {len(regs)}")
print(f"Hook triggers: {len(triggers)}")
print(f"\nISSUES: {len(orphans_reg) + len(orphans_trig)}")
print(f" Registered but never triggered: {len(orphans_reg)}")
print(f" Triggered but never received: {len(orphans_trig)}")
if orphans_reg:
print("\n--- Registered but never triggered ---")
for o in orphans_reg[:20]:
print(f" {o['hook_name']} (in {o['file']})")
if orphans_trig:
print("\n--- Triggered but never received ---")
for o in orphans_trig[:20]:
print(f" {o['hook_name']} (in {o['file']})")
results = {"registrations": regs, "triggers": triggers, "orphan_registrations": orphans_reg, "orphan_triggers": orphans_trig}
with open(ROOT / "scripts" / "test_suite" / "results_trace_hooks.json", "w") as f:
json.dump(results, f, indent=2, default=str)
return len(orphans_reg) + len(orphans_trig)
if __name__ == "__main__":
sys.exit(main())