mirror of
https://github.com/anthropics/claude-code.git
synced 2025-11-28 08:40:27 +08:00
Adds the hookify plugin to public marketplace. Enables users to create custom hooks using simple markdown configuration files instead of editing JSON. Key features: - Define rules with regex patterns to warn/block operations - Create rules from explicit instructions or conversation analysis - Pattern-based matching for bash commands, file edits, prompts, stop events - Enable/disable rules dynamically without editing code - Conversation analyzer agent finds problematic behaviors Changes from internal version: - Removed non-functional SessionStart hook (not registered in hooks.json) - Removed all sessionstart documentation and examples - Fixed restart documentation to consistently state "no restart needed" - Changed license from "Internal Anthropic use only" to "MIT License" - Kept test blocks in core modules (useful for developers) Plugin provides: - 4 commands: /hookify, /hookify:list, /hookify:configure, /hookify:help - 1 agent: conversation-analyzer - 1 skill: writing-rules - 4 hook types: PreToolUse, PostToolUse, Stop, UserPromptSubmit - 4 example rules ready to use All features functional and suitable for public use. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
58 lines
1.5 KiB
Python
Executable file
58 lines
1.5 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""UserPromptSubmit hook executor for hookify plugin.
|
|
|
|
This script is called by Claude Code when user submits a prompt.
|
|
It reads .claude/hookify.*.local.md files and evaluates rules.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
|
|
# CRITICAL: Add plugin root to Python path for imports
|
|
PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
|
|
if PLUGIN_ROOT:
|
|
parent_dir = os.path.dirname(PLUGIN_ROOT)
|
|
if parent_dir not in sys.path:
|
|
sys.path.insert(0, parent_dir)
|
|
if PLUGIN_ROOT not in sys.path:
|
|
sys.path.insert(0, PLUGIN_ROOT)
|
|
|
|
try:
|
|
from hookify.core.config_loader import load_rules
|
|
from hookify.core.rule_engine import RuleEngine
|
|
except ImportError as e:
|
|
error_msg = {"systemMessage": f"Hookify import error: {e}"}
|
|
print(json.dumps(error_msg), file=sys.stdout)
|
|
sys.exit(0)
|
|
|
|
|
|
def main():
|
|
"""Main entry point for UserPromptSubmit hook."""
|
|
try:
|
|
# Read input from stdin
|
|
input_data = json.load(sys.stdin)
|
|
|
|
# Load user prompt rules
|
|
rules = load_rules(event='prompt')
|
|
|
|
# Evaluate rules
|
|
engine = RuleEngine()
|
|
result = engine.evaluate_rules(rules, input_data)
|
|
|
|
# Always output JSON (even if empty)
|
|
print(json.dumps(result), file=sys.stdout)
|
|
|
|
except Exception as e:
|
|
error_output = {
|
|
"systemMessage": f"Hookify error: {str(e)}"
|
|
}
|
|
print(json.dumps(error_output), file=sys.stdout)
|
|
|
|
finally:
|
|
# ALWAYS exit 0
|
|
sys.exit(0)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|