{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/mcp-servers\/mcp_code\/tools\/impact.py",
"content": "\"\"\"code_impact - Impact-Analyse bei Klassenaenderung.\"\"\"\n\nfrom db import execute_query\n\n\ndef register_impact_tool(mcp):\n \"\"\"Registriert code_impact Tool.\"\"\"\n\n @mcp.tool()\n def code_impact(fqcn: str) -> dict:\n \"\"\"\n Analysiert den Impact bei Aenderung einer Klasse.\n\n Args:\n fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, direct_dependents, risk_level, affected_namespaces, recommendation\n \"\"\"\n # Dependents laden (gleiche Query wie code_dependents)\n sql = \"\"\"\n SELECT ca.id as file_id, ca.file_name, ca.namespace, cd.dependency_type\n FROM code_dependencies cd\n JOIN code_analysis ca ON cd.analysis_id = ca.id\n WHERE cd.target_fqcn = %s\n ORDER BY ca.file_name\n \"\"\"\n dependents = execute_query(sql, (fqcn,))\n count = len(dependents)\n\n # Risk Level berechnen\n if count == 0:\n risk_level = \"low\"\n recommendation = \"Keine Abhaengigkeiten. Aenderungen sicher.\"\n elif count <= 5:\n risk_level = \"medium\"\n recommendation = f\"Moderate Abhaengigkeiten ({count}). Aenderungen mit Vorsicht.\"\n elif count <= 15:\n risk_level = \"high\"\n recommendation = f\"Viele Abhaengigkeiten ({count}). Gruendliche Tests empfohlen.\"\n else:\n risk_level = \"critical\"\n recommendation = f\"Kritisch viele Abhaengigkeiten ({count}). Breaking Changes vermeiden!\"\n\n # Betroffene Namespaces sammeln\n affected_namespaces = list(set(\n d[\"namespace\"] for d in dependents if d[\"namespace\"]\n ))\n affected_namespaces.sort()\n\n # Dependency-Typen gruppieren\n by_type = {}\n for d in dependents:\n t = d[\"dependency_type\"]\n if t not in by_type:\n by_type[t] = 0\n by_type[t] += 1\n\n return {\n \"fqcn\": fqcn,\n \"direct_dependents\": count,\n \"risk_level\": risk_level,\n \"affected_namespaces\": affected_namespaces,\n \"dependents_by_type\": by_type,\n \"recommendation\": recommendation,\n }\n"
}
}
{
"tool_response": {
"type": "update",
"filePath": "\/var\/www\/mcp-servers\/mcp_code\/tools\/impact.py",
"content": "\"\"\"code_impact - Impact-Analyse bei Klassenaenderung.\"\"\"\n\nfrom db import execute_query\n\n\ndef register_impact_tool(mcp):\n \"\"\"Registriert code_impact Tool.\"\"\"\n\n @mcp.tool()\n def code_impact(fqcn: str) -> dict:\n \"\"\"\n Analysiert den Impact bei Aenderung einer Klasse.\n\n Args:\n fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, direct_dependents, risk_level, affected_namespaces, recommendation\n \"\"\"\n # Dependents laden (gleiche Query wie code_dependents)\n sql = \"\"\"\n SELECT ca.id as file_id, ca.file_name, ca.namespace, cd.dependency_type\n FROM code_dependencies cd\n JOIN code_analysis ca ON cd.analysis_id = ca.id\n WHERE cd.target_fqcn = %s\n ORDER BY ca.file_name\n \"\"\"\n dependents = execute_query(sql, (fqcn,))\n count = len(dependents)\n\n # Risk Level berechnen\n if count == 0:\n risk_level = \"low\"\n recommendation = \"Keine Abhaengigkeiten. Aenderungen sicher.\"\n elif count <= 5:\n risk_level = \"medium\"\n recommendation = f\"Moderate Abhaengigkeiten ({count}). Aenderungen mit Vorsicht.\"\n elif count <= 15:\n risk_level = \"high\"\n recommendation = f\"Viele Abhaengigkeiten ({count}). Gruendliche Tests empfohlen.\"\n else:\n risk_level = \"critical\"\n recommendation = f\"Kritisch viele Abhaengigkeiten ({count}). Breaking Changes vermeiden!\"\n\n # Betroffene Namespaces sammeln\n affected_namespaces = list(set(\n d[\"namespace\"] for d in dependents if d[\"namespace\"]\n ))\n affected_namespaces.sort()\n\n # Dependency-Typen gruppieren\n by_type = {}\n for d in dependents:\n t = d[\"dependency_type\"]\n if t not in by_type:\n by_type[t] = 0\n by_type[t] += 1\n\n return {\n \"fqcn\": fqcn,\n \"direct_dependents\": count,\n \"risk_level\": risk_level,\n \"affected_namespaces\": affected_namespaces,\n \"dependents_by_type\": by_type,\n \"recommendation\": recommendation,\n }\n",
"structuredPatch": [
{
"oldStart": 1,
"oldLines": 7,
"newStart": 1,
"newLines": 5,
"lines": [
"-\"\"\"code_impact - Impact-Analyse bei Klassenänderung.\"\"\"",
"-import sys",
"+\"\"\"code_impact - Impact-Analyse bei Klassenaenderung.\"\"\"",
" ",
"-sys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp_code\")",
" from db import execute_query",
" ",
" "
]
},
{
"oldStart": 11,
"oldLines": 10,
"newStart": 9,
"newLines": 10,
"lines": [
" @mcp.tool()",
" def code_impact(fqcn: str) -> dict:",
" \"\"\"",
"- Analysiert den Impact bei Änderung einer Klasse.",
"+ Analysiert den Impact bei Aenderung einer Klasse.",
" ",
" Args:",
"- fqcn: Vollständiger Klassenname (z.B. Controller\\\\HomeController)",
"+ fqcn: Vollstaendiger Klassenname (z.B. Controller\\\\HomeController)",
" ",
" Returns:",
" Dict mit fqcn, direct_dependents, risk_level, affected_namespaces, recommendation"
]
},
{
"oldStart": 33,
"oldLines": 16,
"newStart": 31,
"newLines": 16,
"lines": [
" # Risk Level berechnen",
" if count == 0:",
" risk_level = \"low\"",
"- recommendation = \"Keine Abhängigkeiten. Änderungen sicher.\"",
"+ recommendation = \"Keine Abhaengigkeiten. Aenderungen sicher.\"",
" elif count <= 5:",
" risk_level = \"medium\"",
"- recommendation = f\"Moderate Abhängigkeiten ({count}). Änderungen mit Vorsicht.\"",
"+ recommendation = f\"Moderate Abhaengigkeiten ({count}). Aenderungen mit Vorsicht.\"",
" elif count <= 15:",
" risk_level = \"high\"",
"- recommendation = f\"Viele Abhängigkeiten ({count}). Gründliche Tests empfohlen.\"",
"+ recommendation = f\"Viele Abhaengigkeiten ({count}). Gruendliche Tests empfohlen.\"",
" else:",
" risk_level = \"critical\"",
"- recommendation = f\"Kritisch viele Abhängigkeiten ({count}). Breaking Changes vermeiden!\"",
"+ recommendation = f\"Kritisch viele Abhaengigkeiten ({count}). Breaking Changes vermeiden!\"",
" ",
" # Betroffene Namespaces sammeln",
" affected_namespaces = list(set("
]
}
],
"originalFile": "\"\"\"code_impact - Impact-Analyse bei Klassenänderung.\"\"\"\nimport sys\n\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp_code\")\nfrom db import execute_query\n\n\ndef register_impact_tool(mcp):\n \"\"\"Registriert code_impact Tool.\"\"\"\n\n @mcp.tool()\n def code_impact(fqcn: str) -> dict:\n \"\"\"\n Analysiert den Impact bei Änderung einer Klasse.\n\n Args:\n fqcn: Vollständiger Klassenname (z.B. Controller\\\\HomeController)\n\n Returns:\n Dict mit fqcn, direct_dependents, risk_level, affected_namespaces, recommendation\n \"\"\"\n # Dependents laden (gleiche Query wie code_dependents)\n sql = \"\"\"\n SELECT ca.id as file_id, ca.file_name, ca.namespace, cd.dependency_type\n FROM code_dependencies cd\n JOIN code_analysis ca ON cd.analysis_id = ca.id\n WHERE cd.target_fqcn = %s\n ORDER BY ca.file_name\n \"\"\"\n dependents = execute_query(sql, (fqcn,))\n count = len(dependents)\n\n # Risk Level berechnen\n if count == 0:\n risk_level = \"low\"\n recommendation = \"Keine Abhängigkeiten. Änderungen sicher.\"\n elif count <= 5:\n risk_level = \"medium\"\n recommendation = f\"Moderate Abhängigkeiten ({count}). Änderungen mit Vorsicht.\"\n elif count <= 15:\n risk_level = \"high\"\n recommendation = f\"Viele Abhängigkeiten ({count}). Gründliche Tests empfohlen.\"\n else:\n risk_level = \"critical\"\n recommendation = f\"Kritisch viele Abhängigkeiten ({count}). Breaking Changes vermeiden!\"\n\n # Betroffene Namespaces sammeln\n affected_namespaces = list(set(\n d[\"namespace\"] for d in dependents if d[\"namespace\"]\n ))\n affected_namespaces.sort()\n\n # Dependency-Typen gruppieren\n by_type = {}\n for d in dependents:\n t = d[\"dependency_type\"]\n if t not in by_type:\n by_type[t] = 0\n by_type[t] += 1\n\n return {\n \"fqcn\": fqcn,\n \"direct_dependents\": count,\n \"risk_level\": risk_level,\n \"affected_namespaces\": affected_namespaces,\n \"dependents_by_type\": by_type,\n \"recommendation\": recommendation,\n }\n"
}
}