stop.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/env python3
  2. """Stop hook executor for hookify plugin.
  3. This script is called by Claude Code when agent wants to stop.
  4. It reads .claude/hookify.*.local.md files and evaluates stop rules.
  5. """
  6. import os
  7. import sys
  8. import json
  9. # Add plugin root to Python path for imports
  10. PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
  11. if PLUGIN_ROOT and PLUGIN_ROOT not in sys.path:
  12. sys.path.insert(0, PLUGIN_ROOT)
  13. try:
  14. from core.config_loader import load_rules
  15. from core.rule_engine import RuleEngine
  16. except ImportError as e:
  17. error_msg = {"systemMessage": f"Hookify import error: {e}"}
  18. print(json.dumps(error_msg), file=sys.stdout)
  19. sys.exit(0)
  20. def main():
  21. """Main entry point for Stop hook."""
  22. try:
  23. # Read input from stdin
  24. input_data = json.load(sys.stdin)
  25. # Load stop rules
  26. rules = load_rules(event='stop')
  27. # Evaluate rules
  28. engine = RuleEngine()
  29. result = engine.evaluate_rules(rules, input_data)
  30. # Always output JSON (even if empty)
  31. print(json.dumps(result), file=sys.stdout)
  32. except Exception as e:
  33. # On any error, allow the operation
  34. error_output = {
  35. "systemMessage": f"Hookify error: {str(e)}"
  36. }
  37. print(json.dumps(error_output), file=sys.stdout)
  38. finally:
  39. # ALWAYS exit 0
  40. sys.exit(0)
  41. if __name__ == '__main__':
  42. main()