{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/tools\/ki-protokoll\/claude-hook\/quality\/pre_rules.py",
"old_string": "from . import pre_rules_guard\nfrom . import pre_rules_mvc\nfrom . import pre_rules_layers\nfrom . import pre_rules_validation\nfrom . import pre_rules_htmx\nfrom . import pre_rules_constants\nfrom . import pre_rules_python\nfrom .rule_base import allow\n\n\n# =============================================================================\n# MAIN CHECK FUNCTION\n# =============================================================================\n\n# Alle aktiven Regeln in Prüfungsreihenfolge\nRULES = [\n # Prüfung 1: SRP + KISS + Prüfung 4: OOP\n *pre_rules_guard.RULES,\n\n # Prüfung 2: MVC + CRUD\n *pre_rules_mvc.RULES,\n\n # Prüfung 3: PSR + Types\n *pre_rules_validation.RULES,\n\n # Prüfung 6: SOLID + DIP + H-Regeln\n *pre_rules_layers.RULES,\n\n # HTMX Contract (Contract #14)\n *pre_rules_htmx.RULES,\n\n # Prüfung 7: Constants + Magic Numbers\n *pre_rules_constants.RULES,\n\n # Python Pipeline Rules (PP1.x)\n *pre_rules_python.RULES,\n]\n\n\ndef check(file_path: str, content: str) -> dict:\n \"\"\"\n Führt alle Pre-Hook-Regeln aus.\n Stoppt beim ersten Verstoß.\n \"\"\"\n for rule in RULES:\n result = rule(file_path, content)\n if result is not None:\n return result\n\n return allow()",
"new_string": "from . import pre_rules_guard\nfrom . import pre_rules_mvc\nfrom . import pre_rules_layers\nfrom . import pre_rules_validation\nfrom . import pre_rules_htmx\nfrom . import pre_rules_constants\nfrom . import pre_rules_python\nfrom .rule_base import allow\n\n\n# =============================================================================\n# REGEL-SAMMLUNGEN NACH DATEITYP\n# =============================================================================\n\n# PHP-Regeln (nur für .php Dateien)\nPHP_RULES = [\n # Prüfung 1: SRP + KISS + Prüfung 4: OOP\n *pre_rules_guard.RULES,\n\n # Prüfung 2: MVC + CRUD\n *pre_rules_mvc.RULES,\n\n # Prüfung 3: PSR + Types\n *pre_rules_validation.RULES,\n\n # Prüfung 6: SOLID + DIP + H-Regeln\n *pre_rules_layers.RULES,\n\n # HTMX Contract (Contract #14)\n *pre_rules_htmx.RULES,\n\n # Prüfung 7: Constants + Magic Numbers\n *pre_rules_constants.RULES,\n]\n\n# Python-Regeln (nur für .py Dateien)\nPYTHON_RULES = [\n # PP1.x: Hardcoded Values\n *pre_rules_python.RULES,\n]\n\n# Legacy: Alle Regeln für Kompatibilität\nRULES = PHP_RULES + PYTHON_RULES\n\n\n# =============================================================================\n# MAIN CHECK FUNCTION\n# =============================================================================\n\ndef check(file_path: str, content: str) -> dict:\n \"\"\"\n Führt Pre-Hook-Regeln basierend auf Dateityp aus.\n Stoppt beim ersten Verstoß.\n \"\"\"\n # Regeln nach Dateityp auswählen\n if file_path.endswith(\".php\"):\n rules = PHP_RULES\n elif file_path.endswith(\".py\"):\n rules = PYTHON_RULES\n else:\n # Unbekannter Typ: durchlassen\n return allow()\n\n for rule in rules:\n result = rule(file_path, content)\n if result is not None:\n return result\n\n return allow()"
}
}
{
"tool_response": {
"filePath": "\/var\/www\/tools\/ki-protokoll\/claude-hook\/quality\/pre_rules.py",
"oldString": "from . import pre_rules_guard\nfrom . import pre_rules_mvc\nfrom . import pre_rules_layers\nfrom . import pre_rules_validation\nfrom . import pre_rules_htmx\nfrom . import pre_rules_constants\nfrom . import pre_rules_python\nfrom .rule_base import allow\n\n\n# =============================================================================\n# MAIN CHECK FUNCTION\n# =============================================================================\n\n# Alle aktiven Regeln in Prüfungsreihenfolge\nRULES = [\n # Prüfung 1: SRP + KISS + Prüfung 4: OOP\n *pre_rules_guard.RULES,\n\n # Prüfung 2: MVC + CRUD\n *pre_rules_mvc.RULES,\n\n # Prüfung 3: PSR + Types\n *pre_rules_validation.RULES,\n\n # Prüfung 6: SOLID + DIP + H-Regeln\n *pre_rules_layers.RULES,\n\n # HTMX Contract (Contract #14)\n *pre_rules_htmx.RULES,\n\n # Prüfung 7: Constants + Magic Numbers\n *pre_rules_constants.RULES,\n\n # Python Pipeline Rules (PP1.x)\n *pre_rules_python.RULES,\n]\n\n\ndef check(file_path: str, content: str) -> dict:\n \"\"\"\n Führt alle Pre-Hook-Regeln aus.\n Stoppt beim ersten Verstoß.\n \"\"\"\n for rule in RULES:\n result = rule(file_path, content)\n if result is not None:\n return result\n\n return allow()",
"newString": "from . import pre_rules_guard\nfrom . import pre_rules_mvc\nfrom . import pre_rules_layers\nfrom . import pre_rules_validation\nfrom . import pre_rules_htmx\nfrom . import pre_rules_constants\nfrom . import pre_rules_python\nfrom .rule_base import allow\n\n\n# =============================================================================\n# REGEL-SAMMLUNGEN NACH DATEITYP\n# =============================================================================\n\n# PHP-Regeln (nur für .php Dateien)\nPHP_RULES = [\n # Prüfung 1: SRP + KISS + Prüfung 4: OOP\n *pre_rules_guard.RULES,\n\n # Prüfung 2: MVC + CRUD\n *pre_rules_mvc.RULES,\n\n # Prüfung 3: PSR + Types\n *pre_rules_validation.RULES,\n\n # Prüfung 6: SOLID + DIP + H-Regeln\n *pre_rules_layers.RULES,\n\n # HTMX Contract (Contract #14)\n *pre_rules_htmx.RULES,\n\n # Prüfung 7: Constants + Magic Numbers\n *pre_rules_constants.RULES,\n]\n\n# Python-Regeln (nur für .py Dateien)\nPYTHON_RULES = [\n # PP1.x: Hardcoded Values\n *pre_rules_python.RULES,\n]\n\n# Legacy: Alle Regeln für Kompatibilität\nRULES = PHP_RULES + PYTHON_RULES\n\n\n# =============================================================================\n# MAIN CHECK FUNCTION\n# =============================================================================\n\ndef check(file_path: str, content: str) -> dict:\n \"\"\"\n Führt Pre-Hook-Regeln basierend auf Dateityp aus.\n Stoppt beim ersten Verstoß.\n \"\"\"\n # Regeln nach Dateityp auswählen\n if file_path.endswith(\".php\"):\n rules = PHP_RULES\n elif file_path.endswith(\".py\"):\n rules = PYTHON_RULES\n else:\n # Unbekannter Typ: durchlassen\n return allow()\n\n for rule in rules:\n result = rule(file_path, content)\n if result is not None:\n return result\n\n return allow()",
"originalFile": "#!\/usr\/bin\/env python3\n\"\"\"\nPre-Hook Regeln (BLOCK) - Modular und erweiterbar ohne Claude-Neustart.\n\nAlle P-Regeln aus dem Quality Gate Plan.\nImportiert Regeln aus spezialisierten Modulen.\n\"\"\"\n\nfrom . import pre_rules_guard\nfrom . import pre_rules_mvc\nfrom . import pre_rules_layers\nfrom . import pre_rules_validation\nfrom . import pre_rules_htmx\nfrom . import pre_rules_constants\nfrom . import pre_rules_python\nfrom .rule_base import allow\n\n\n# =============================================================================\n# MAIN CHECK FUNCTION\n# =============================================================================\n\n# Alle aktiven Regeln in Prüfungsreihenfolge\nRULES = [\n # Prüfung 1: SRP + KISS + Prüfung 4: OOP\n *pre_rules_guard.RULES,\n\n # Prüfung 2: MVC + CRUD\n *pre_rules_mvc.RULES,\n\n # Prüfung 3: PSR + Types\n *pre_rules_validation.RULES,\n\n # Prüfung 6: SOLID + DIP + H-Regeln\n *pre_rules_layers.RULES,\n\n # HTMX Contract (Contract #14)\n *pre_rules_htmx.RULES,\n\n # Prüfung 7: Constants + Magic Numbers\n *pre_rules_constants.RULES,\n\n # Python Pipeline Rules (PP1.x)\n *pre_rules_python.RULES,\n]\n\n\ndef check(file_path: str, content: str) -> dict:\n \"\"\"\n Führt alle Pre-Hook-Regeln aus.\n Stoppt beim ersten Verstoß.\n \"\"\"\n for rule in RULES:\n result = rule(file_path, content)\n if result is not None:\n return result\n\n return allow()\n",
"structuredPatch": [
{
"oldStart": 17,
"oldLines": 11,
"newStart": 17,
"newLines": 11,
"lines": [
" ",
" ",
" # =============================================================================",
"-# MAIN CHECK FUNCTION",
"+# REGEL-SAMMLUNGEN NACH DATEITYP",
" # =============================================================================",
" ",
"-# Alle aktiven Regeln in Prüfungsreihenfolge",
"-RULES = [",
"+# PHP-Regeln (nur für .php Dateien)",
"+PHP_RULES = [",
" # Prüfung 1: SRP + KISS + Prüfung 4: OOP",
" *pre_rules_guard.RULES,",
" "
]
},
{
"oldStart": 39,
"oldLines": 18,
"newStart": 39,
"newLines": 37,
"lines": [
" ",
" # Prüfung 7: Constants + Magic Numbers",
" *pre_rules_constants.RULES,",
"+]",
" ",
"- # Python Pipeline Rules (PP1.x)",
"+# Python-Regeln (nur für .py Dateien)",
"+PYTHON_RULES = [",
"+ # PP1.x: Hardcoded Values",
" *pre_rules_python.RULES,",
" ]",
" ",
"+# Legacy: Alle Regeln für Kompatibilität",
"+RULES = PHP_RULES + PYTHON_RULES",
" ",
"+",
"+# =============================================================================",
"+# MAIN CHECK FUNCTION",
"+# =============================================================================",
"+",
" def check(file_path: str, content: str) -> dict:",
" \"\"\"",
"- Führt alle Pre-Hook-Regeln aus.",
"+ Führt Pre-Hook-Regeln basierend auf Dateityp aus.",
" Stoppt beim ersten Verstoß.",
" \"\"\"",
"- for rule in RULES:",
"+ # Regeln nach Dateityp auswählen",
"+ if file_path.endswith(\".php\"):",
"+ rules = PHP_RULES",
"+ elif file_path.endswith(\".py\"):",
"+ rules = PYTHON_RULES",
"+ else:",
"+ # Unbekannter Typ: durchlassen",
"+ return allow()",
"+",
"+ for rule in rules:",
" result = rule(file_path, content)",
" if result is not None:",
" return result"
]
}
],
"userModified": false,
"replaceAll": false
}
}