{
"event": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "python3 << 'PYEOF'\nimport os\nimport sys\nfrom collections import Counter\n\nsys.path.insert(0, '\/var\/www\/tools\/ki-protokoll\/claude-hook')\n\nfrom quality import post_rules\n\nSRC_PATH = \"\/var\/www\/dev.campus.systemische-tools.de\/src\"\n\nrule_counts = Counter()\ntotal_warnings = 0\nfiles_checked = 0\n\nfor root, dirs, files in os.walk(SRC_PATH):\n dirs[:] = [d for d in dirs if d not in ['vendor', 'tests', 'Test']]\n \n for file in files:\n if not file.endswith('.php'):\n continue\n \n file_path = os.path.join(root, file)\n try:\n with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:\n content = f.read()\n except Exception:\n continue\n \n files_checked += 1\n result = post_rules.check(file_path, content)\n \n for w in result['warnings']:\n total_warnings += 1\n # Extract rule ID (e.g., W1.1, W9.2)\n if ': ' in w:\n rule_id = w.split(':')[0]\n rule_counts[rule_id] += 1\n\nprint(\"=\" * 60)\nprint(\"VOLLSTÄNDIGER POST-HOOK TEST (50 Regeln)\")\nprint(\"=\" * 60)\nprint(f\"Dateien geprüft: {files_checked}\")\nprint(f\"Warnungen gesamt: {total_warnings}\")\nprint()\nprint(\"Nach Regel-Kategorie:\")\n\n# Group by category\ncategories = {}\nfor rule, count in rule_counts.items():\n if rule.startswith('W1'):\n cat = 'W1.x SRP\/Metriken'\n elif rule.startswith('W2'):\n cat = 'W2.x MVC'\n elif rule.startswith('W3'):\n cat = 'W3.x Types'\n elif rule.startswith('W4'):\n cat = 'W4.x OOP'\n elif rule.startswith('W5'):\n cat = 'W5.x DRY'\n elif rule.startswith('W6'):\n cat = 'W6.x SOLID'\n elif rule.startswith('W7'):\n cat = 'W7.x Constants'\n elif rule.startswith('W8'):\n cat = 'W8.x Fail Fast'\n elif rule.startswith('W9'):\n cat = 'W9.x Fail Safe (Phase 3)'\n elif rule.startswith('W10'):\n cat = 'W10.x Trade-offs (Phase 3)'\n elif rule.startswith('W14'):\n cat = 'W14.x Test Isolation'\n elif rule.startswith('W15'):\n cat = 'W15.x Least Surprise'\n else:\n cat = 'Andere'\n \n if cat not in categories:\n categories[cat] = 0\n categories[cat] += count\n\nfor cat in sorted(categories.keys()):\n print(f\" {cat}: {categories[cat]}\")\n\nprint()\nprint(\"Top 15 Regeln:\")\nfor rule, count in rule_counts.most_common(15):\n print(f\" {rule}: {count}\")\nPYEOF",
"timeout": 120000,
"description": "Full post-hook test on codebase"
}
}
{
"tool_response": {
"stdout": "============================================================\nVOLLSTÄNDIGER POST-HOOK TEST (50 Regeln)\n============================================================\nDateien geprüft: 354\nWarnungen gesamt: 531\n\nNach Regel-Kategorie:\n W1.x SRP\/Metriken: 258\n W2.x MVC: 5\n W3.x Types: 3\n W4.x OOP: 52\n W5.x DRY: 68\n W6.x SOLID: 23\n W7.x Constants: 68\n W8.x Fail Fast: 28\n W9.x Fail Safe (Phase 3): 26\n\nTop 15 Regeln:\n W15.3: 80\n W7.1: 65\n W1.1: 46\n W1.2: 44\n W15.1: 42\n W5.2: 40\n W1.3: 29\n W5.1: 28\n W6.1: 23\n W4.3: 20\n W8.4: 17\n W9.3: 15\n W4.1: 15\n W4.2: 15\n W9.2: 11",
"stderr": "",
"interrupted": false,
"isImage": false
}
}