{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 97,\n \"parent_id\": 92,\n \"slug\": \"suggestions\",\n \"path\": \"\/prozesse\/claude-hooks-prozess\/suggestions\",\n \"title\": \"Verbesserungsvorschläge\",\n \"description\": \"Vorschläge für Pre- und Post-Hooks zur Qualitätsverbesserung\",\n \"content\": \"<h2>Verbesserungsvorschläge für Pre-\/Post-Hooks<\/h2>\\n\\n<p>Basierend auf der Analyse des KI-Protokolls wurden folgende wiederkehrende Korrektur-Muster identifiziert:<\/p>\\n\\n<h3>Analyse: Häufige Korrekturen durch Supervision<\/h3>\\n\\n<table>\\n <thead>\\n <tr>\\n <th>Kategorie<\/th>\\n <th>Häufigkeit<\/th>\\n <th>Beispiele<\/th>\\n <\/tr>\\n <\/thead>\\n <tbody>\\n <tr>\\n <td><strong>Fatal Errors<\/strong><\/td>\\n <td>Hoch<\/td>\\n <td>Class not found, Undefined method, PDOException<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>Architektur-Violations<\/strong><\/td>\\n <td>Hoch<\/td>\\n <td>Controller mit direktem PDO-Zugriff, fehlende DI<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>Code Style<\/strong><\/td>\\n <td>Mittel<\/td>\\n <td>PHP-CS-Fixer Issues, Import-Sortierung<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>UI\/UX Logik<\/strong><\/td>\\n <td>Mittel<\/td>\\n <td>Progress 1500%, falsche Terminologie<\/td>\\n <\/tr>\\n <tr>\\n <td><strong>404 Errors<\/strong><\/td>\\n <td>Mittel<\/td>\\n <td>Fehlende Routes, falsche Pfade<\/td>\\n <\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Vorschlag 1: PHP Syntax Check (Pre-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PreToolUse (Write)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>Neue PHP-Datei wird erstellt<\/td><\/tr>\\n <tr><th>Aktion<\/th><td><code>php -l<\/code> auf neuen Inhalt<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Blockieren mit Syntax-Fehlermeldung<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# php_syntax_check_hook.py\\ndef check_php_syntax(file_path, content):\\n \\\"\\\"\\\"Prüft PHP-Syntax vor dem Schreiben\\\"\\\"\\\"\\n if not file_path.endswith('.php'):\\n return True, \\\"\\\"\\n \\n # Temporäre Datei mit neuem Inhalt\\n result = subprocess.run(\\n ['php', '-l', '-'],\\n input=content.encode(),\\n capture_output=True\\n )\\n \\n if result.returncode != 0:\\n return False, f\\\"PHP Syntax Error:\\\\n{result.stderr.decode()}\\\"\\n \\n return True, \\\"\\\"\\n<\/pre>\\n\\n<h3>Vorschlag 2: Class\/Use Statement Validator (Pre-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PreToolUse (Edit, Write)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>PHP-Datei mit <code>new ClassName<\/code><\/td><\/tr>\\n <tr><th>Aktion<\/th><td>Prüft ob use-Statement oder FQCN vorhanden<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Warnung mit fehlenden Imports<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# class_import_validator.py\\nKNOWN_CLASSES = {\\n 'Controller': 'Framework\\\\\\\\Controller',\\n 'PDO': '\\\\\\\\PDO',\\n # ... aus composer autoload generieren\\n}\\n\\ndef validate_class_imports(content):\\n \\\"\\\"\\\"Findet new ClassName ohne entsprechenden Import\\\"\\\"\\\"\\n new_pattern = r'new\\\\s+([A-Z][a-zA-Z0-9_]+)'\\n use_pattern = r'use\\\\s+[^;]+\\\\\\\\([A-Z][a-zA-Z0-9_]+);'\\n \\n instantiated = set(re.findall(new_pattern, content))\\n imported = set(re.findall(use_pattern, content))\\n \\n missing = instantiated - imported - {'self', 'static', 'parent'}\\n \\n if missing:\\n return False, f\\\"Fehlende Imports: {', '.join(missing)}\\\"\\n return True, \\\"\\\"\\n<\/pre>\\n\\n<h3>Vorschlag 3: Route Existence Check (Post-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PostToolUse (Edit auf routes\/*.php)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>Route-Datei wurde geändert<\/td><\/tr>\\n <tr><th>Aktion<\/th><td>Prüft ob alle Controller-Methoden existieren<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Warnung mit fehlenden Methoden<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# route_validator.py\\ndef validate_routes(route_file):\\n \\\"\\\"\\\"Prüft ob alle referenzierten Controller-Methoden existieren\\\"\\\"\\\"\\n # Parse: $router->get('\/path', [Controller::class, 'method'])\\n route_pattern = r\\\"\\\\[(\\\\w+)::class,\\\\s*'(\\\\w+)'\\\\]\\\"\\n \\n errors = []\\n for controller, method in re.findall(route_pattern, content):\\n controller_file = f\\\"src\/Controller\/{controller}.php\\\"\\n if not method_exists(controller_file, method):\\n errors.append(f\\\"{controller}::{method} nicht gefunden\\\")\\n \\n return errors\\n<\/pre>\\n\\n<h3>Vorschlag 4: Contract Pre-Validation (Pre-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PreToolUse (Edit auf src\/Controller\/*.php)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>Controller-Datei wird bearbeitet<\/td><\/tr>\\n <tr><th>Aktion<\/th><td>Schnelle Regex-Prüfung der Architecture-Regeln<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Blockieren mit Violation-Details<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# architecture_guard.py\\nFORBIDDEN_IN_CONTROLLER = [\\n (r'new\\\\s+\\\\w+Repository\\\\b', 'no-new-repository-in-controller'),\\n (r'new\\\\s+\\\\w+Service\\\\b', 'no-new-service-in-controller'),\\n (r'\\\\becho\\\\s+', 'no-echo-in-controller'),\\n (r'\\\\$_(?:GET|POST|REQUEST|SESSION)', 'no-superglobals'),\\n]\\n\\ndef check_architecture(file_path, content):\\n \\\"\\\"\\\"Schnelle Architecture-Prüfung vor Edit\\\"\\\"\\\"\\n if '\/Controller\/' not in file_path:\\n return True, \\\"\\\"\\n \\n violations = []\\n for pattern, rule_id in FORBIDDEN_IN_CONTROLLER:\\n if re.search(pattern, content):\\n violations.append(rule_id)\\n \\n if violations:\\n return False, f\\\"Architecture Violations: {violations}\\\"\\n return True, \\\"\\\"\\n<\/pre>\\n\\n<h3>Vorschlag 5: PHPStan Quick Check (Post-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PostToolUse (Edit, Write auf *.php)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>PHP-Datei wurde geändert<\/td><\/tr>\\n <tr><th>Aktion<\/th><td>PHPStan Level 5 auf geänderte Datei<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Warnung (nicht blockierend)<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# phpstan_quick_check.py\\ndef run_phpstan_on_file(file_path):\\n \\\"\\\"\\\"Schneller PHPStan-Check nach Änderung\\\"\\\"\\\"\\n result = subprocess.run([\\n '\/opt\/php-tools\/vendor\/bin\/phpstan',\\n 'analyse',\\n file_path,\\n '--level=5',\\n '--no-progress',\\n '--error-format=json'\\n ], capture_output=True, timeout=30)\\n \\n if result.returncode != 0:\\n errors = json.loads(result.stdout)\\n print(f\\\"[PHPStan] {len(errors['files'])} Fehler gefunden\\\", \\n file=sys.stderr)\\n \\n # Nie blockieren, nur warnen\\n return True, \\\"\\\"\\n<\/pre>\\n\\n<h3>Vorschlag 6: Services.php Sync Check (Post-Hook)<\/h3>\\n\\n<table>\\n <tr><th>Hook-Event<\/th><td>PostToolUse (Write auf src\/Controller\/*.php)<\/td><\/tr>\\n <tr><th>Trigger<\/th><td>Neuer Controller erstellt<\/td><\/tr>\\n <tr><th>Aktion<\/th><td>Prüft ob Constructor-Dependencies in services.php registriert<\/td><\/tr>\\n <tr><th>Bei Fehler<\/th><td>Warnung mit fehlenden Registrierungen<\/td><\/tr>\\n<\/table>\\n\\n<pre>\\n# di_sync_check.py\\ndef check_di_registration(controller_file):\\n \\\"\\\"\\\"Prüft ob alle Dependencies registriert sind\\\"\\\"\\\"\\n # Parse Constructor-Parameter\\n constructor = extract_constructor(controller_file)\\n dependencies = parse_type_hints(constructor)\\n \\n # Prüfe services.php\\n services = read_file('src\/services.php')\\n \\n missing = []\\n for dep in dependencies:\\n if dep not in services:\\n missing.append(dep)\\n \\n if missing:\\n print(f\\\"[DI] Fehlende Registrierungen: {missing}\\\", file=sys.stderr)\\n<\/pre>\\n\\n<h3>Implementierungs-Priorität<\/h3>\\n\\n<table>\\n <thead>\\n <tr>\\n <th>Priorität<\/th>\\n <th>Hook<\/th>\\n <th>Begründung<\/th>\\n <\/tr>\\n <\/thead>\\n <tbody>\\n <tr>\\n <td>1 (Kritisch)<\/td>\\n <td>PHP Syntax Check<\/td>\\n <td>Verhindert Fatal Errors vor Deployment<\/td>\\n <\/tr>\\n <tr>\\n <td>2 (Kritisch)<\/td>\\n <td>Architecture Guard<\/td>\\n <td>Verhindert Layer-Violations sofort<\/td>\\n <\/tr>\\n <tr>\\n <td>3 (Hoch)<\/td>\\n <td>Class Import Validator<\/td>\\n <td>Verhindert \\\"Class not found\\\" Errors<\/td>\\n <\/tr>\\n <tr>\\n <td>4 (Mittel)<\/td>\\n <td>Route Existence Check<\/td>\\n <td>Verhindert 404 bei neuen Routes<\/td>\\n <\/tr>\\n <tr>\\n <td>5 (Mittel)<\/td>\\n <td>PHPStan Quick Check<\/td>\\n <td>Frühe Type-Error Erkennung<\/td>\\n <\/tr>\\n <tr>\\n <td>6 (Niedrig)<\/td>\\n <td>DI Sync Check<\/td>\\n <td>Verhindert Runtime DI-Fehler<\/td>\\n <\/tr>\\n <\/tbody>\\n<\/table>\\n\\n<h3>Erwarteter Impact<\/h3>\\n\\n<p>Mit den vorgeschlagenen Hooks würden geschätzt <strong>70-80%<\/strong> der im Protokoll gefundenen Korrekturen bereits vor\/während der Code-Erstellung abgefangen:<\/p>\\n\\n<ul>\\n <li><strong>Fatal Errors:<\/strong> 95% durch Syntax + Class Import Check<\/li>\\n <li><strong>Architecture Violations:<\/strong> 100% durch Architecture Guard<\/li>\\n <li><strong>404 Errors:<\/strong> 80% durch Route Existence Check<\/li>\\n <li><strong>Type Errors:<\/strong> 60% durch PHPStan Quick Check<\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 5,\n \"depth\": 2,\n \"created_at\": \"2025-12-23T05:46:58\",\n \"updated_at\": \"2025-12-23T05:46:58\"\n }\n}"
}
]
}