{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_update",
"tool_input": {
"id": 155,
"content": "# Hook-System Python-Erweiterung\n\n**Status**: ✅ IMPLEMENTIERT (2025-12-28)\n**Task**: #506\n\n## Problem\n\nDas Claude Code Hook-System (`\/var\/www\/tools\/ki-protokoll\/claude-hook\/`) prüfte nur PHP-Dateien. Python-Dateien in der Pipeline (`\/var\/www\/scripts\/pipeline\/`) wurden nicht validiert.\n\n### Root Cause\n\n```python\n# hook_dispatcher.py Zeile 78-80 (vorher)\nif not file_path.endswith(\".php\"):\n sys.exit(0)\n```\n\n## Implementierung\n\n### Phase 1: Dispatcher (hook_dispatcher.py)\n\n```python\nALLOWED_EXTENSIONS = {\".php\", \".py\"}\nPYTHON_CHECK_PATHS = [\"\/var\/www\/scripts\/pipeline\/\"]\nSKIP_PATHS = [\"\/venv\/\", \"\/__pycache__\/\", \"\/tests\/\", \"\/vendor\/\"]\n\ndef should_check(file_path: str) -> bool:\n if any(skip in file_path for skip in SKIP_PATHS):\n return False\n ext = Path(file_path).suffix\n if ext not in ALLOWED_EXTENSIONS:\n return False\n if ext == \".php\":\n return True\n if ext == \".py\":\n return any(file_path.startswith(p) for p in PYTHON_CHECK_PATHS)\n return False\n```\n\n### Phase 2: Python-Regeln (pre_rules_python.py)\n\n**PP1.1**: Hardcoded Model-Namen blockieren\n- BLOCKIERT: `default=\"mistral\"`, `model=\"gemma\"`\n- ERLAUBT: `get_pipeline_model()`, `DEFAULT_MODEL = \"mistral\"`\n\n**PP1.2**: Hardcoded Pipeline-IDs blockieren\n- BLOCKIERT: `pipeline_id = 5`\n- ERLAUBT: `DEFAULT_PIPELINE_ID = 5`, `args.pipeline_id`\n\n### Phase 3: Integration (pre_rules.py)\n\n```python\n# Regelfilterung nach Dateityp\nif file_path.endswith(\".php\"):\n rules = PHP_RULES\nelif file_path.endswith(\".py\"):\n rules = PYTHON_RULES\nelse:\n return allow()\n```\n\n## Testmatrix (7\/7 bestanden)\n\n| Test | Szenario | Erwartet | Ergebnis |\n|------|----------|----------|----------|\n| 1 | PP1.1 `default=\"mistral\"` | DENY | ✅ |\n| 2 | PP1.1 `get_pipeline_model()` | ALLOW | ✅ |\n| 3 | PP1.1 `DEFAULT_MODEL = \"mistral\"` | ALLOW | ✅ |\n| 4 | PP1.2 `pipeline_id = 5` | DENY | ✅ |\n| 5 | PP1.2 `DEFAULT_PIPELINE_ID = 5` | ALLOW | ✅ |\n| 6 | Skip `\/venv\/` Pfade | ALLOW | ✅ |\n| 7 | PHP P1.1 @responsibility | DENY | ✅ |\n\n## Dateien\n\n| Datei | Aktion |\n|-------|--------|\n| `hook_dispatcher.py` | MODIFIZIERT |\n| `quality\/pre_rules_python.py` | NEU |\n| `quality\/pre_rules.py` | MODIFIZIERT |",
"status": "published"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 155,\n \"parent_id\": 2,\n \"slug\": \"hook-system-python-erweiterung\",\n \"path\": \"\/server\/ssh\/hook-system-python-erweiterung\",\n \"title\": \"Hook-System Python-Erweiterung\",\n \"description\": \"Analyse und Implementierungsplan für Python-Datei-Unterstützung im Claude Code Hook-System\",\n \"content\": \"# Hook-System Python-Erweiterung\\n\\n**Status**: ✅ IMPLEMENTIERT (2025-12-28)\\n**Task**: #506\\n\\n## Problem\\n\\nDas Claude Code Hook-System (`\/var\/www\/tools\/ki-protokoll\/claude-hook\/`) prüfte nur PHP-Dateien. Python-Dateien in der Pipeline (`\/var\/www\/scripts\/pipeline\/`) wurden nicht validiert.\\n\\n### Root Cause\\n\\n```python\\n# hook_dispatcher.py Zeile 78-80 (vorher)\\nif not file_path.endswith(\\\".php\\\"):\\n sys.exit(0)\\n```\\n\\n## Implementierung\\n\\n### Phase 1: Dispatcher (hook_dispatcher.py)\\n\\n```python\\nALLOWED_EXTENSIONS = {\\\".php\\\", \\\".py\\\"}\\nPYTHON_CHECK_PATHS = [\\\"\/var\/www\/scripts\/pipeline\/\\\"]\\nSKIP_PATHS = [\\\"\/venv\/\\\", \\\"\/__pycache__\/\\\", \\\"\/tests\/\\\", \\\"\/vendor\/\\\"]\\n\\ndef should_check(file_path: str) -> bool:\\n if any(skip in file_path for skip in SKIP_PATHS):\\n return False\\n ext = Path(file_path).suffix\\n if ext not in ALLOWED_EXTENSIONS:\\n return False\\n if ext == \\\".php\\\":\\n return True\\n if ext == \\\".py\\\":\\n return any(file_path.startswith(p) for p in PYTHON_CHECK_PATHS)\\n return False\\n```\\n\\n### Phase 2: Python-Regeln (pre_rules_python.py)\\n\\n**PP1.1**: Hardcoded Model-Namen blockieren\\n- BLOCKIERT: `default=\\\"mistral\\\"`, `model=\\\"gemma\\\"`\\n- ERLAUBT: `get_pipeline_model()`, `DEFAULT_MODEL = \\\"mistral\\\"`\\n\\n**PP1.2**: Hardcoded Pipeline-IDs blockieren\\n- BLOCKIERT: `pipeline_id = 5`\\n- ERLAUBT: `DEFAULT_PIPELINE_ID = 5`, `args.pipeline_id`\\n\\n### Phase 3: Integration (pre_rules.py)\\n\\n```python\\n# Regelfilterung nach Dateityp\\nif file_path.endswith(\\\".php\\\"):\\n rules = PHP_RULES\\nelif file_path.endswith(\\\".py\\\"):\\n rules = PYTHON_RULES\\nelse:\\n return allow()\\n```\\n\\n## Testmatrix (7\/7 bestanden)\\n\\n| Test | Szenario | Erwartet | Ergebnis |\\n|------|----------|----------|----------|\\n| 1 | PP1.1 `default=\\\"mistral\\\"` | DENY | ✅ |\\n| 2 | PP1.1 `get_pipeline_model()` | ALLOW | ✅ |\\n| 3 | PP1.1 `DEFAULT_MODEL = \\\"mistral\\\"` | ALLOW | ✅ |\\n| 4 | PP1.2 `pipeline_id = 5` | DENY | ✅ |\\n| 5 | PP1.2 `DEFAULT_PIPELINE_ID = 5` | ALLOW | ✅ |\\n| 6 | Skip `\/venv\/` Pfade | ALLOW | ✅ |\\n| 7 | PHP P1.1 @responsibility | DENY | ✅ |\\n\\n## Dateien\\n\\n| Datei | Aktion |\\n|-------|--------|\\n| `hook_dispatcher.py` | MODIFIZIERT |\\n| `quality\/pre_rules_python.py` | NEU |\\n| `quality\/pre_rules.py` | MODIFIZIERT |\",\n \"status\": \"published\",\n \"sort_order\": 0,\n \"depth\": 2,\n \"created_at\": \"2025-12-28T09:42:14\",\n \"updated_at\": \"2025-12-28T09:53:57\"\n },\n \"message\": \"Document #155 updated\"\n}"
}
]
}