Protokoll #28153

ID28153
Zeitstempel2025-12-28 12:55:15.811901
Clientroot
IP145.224.72.140
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens855 (Input: 33, Output: 822)
Dauer97 ms
Request-Zeit2025-12-28 12:55:15.811901
Response-Zeit2025-12-28 12:55:15.909245

Request

{
    "event": "PreToolUse",
    "tool_name": "Read",
    "tool_input": {
        "file_path": "\/var\/www\/mcp-servers\/mcp_tasks\/tools\/task_tools\/base.py"
    }
}

Response

{
    "tool_response": {
        "type": "text",
        "file": {
            "filePath": "\/var\/www\/mcp-servers\/mcp_tasks\/tools\/quality_tools.py",
            "content": "\"\"\"Quality Tools für MCP-Tasks Server\"\"\"\nimport sys\nimport time\nimport json\nimport subprocess\nfrom typing import Optional\n\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/mcp_tasks\")\nsys.path.insert(0, \"\/var\/www\/mcp-servers\/shared\")\n\nfrom constants import LOG_ENTRY_MAX_LENGTH, LOG_QUERY_MAX_LENGTH, LLM_TIMEOUT, MS_PER_SECOND, SEMGREP_TIMEOUT\n\nfrom config import Config\nfrom domain.contracts import LogEntry, QualityCheckResult\nfrom infrastructure.protokoll_logger import get_logger\n\n\ndef register_quality_tools(mcp):\n    \"\"\"Registriert alle Quality-Tools\"\"\"\n\n    logger = get_logger()\n\n    # ==================== quality_check ====================\n    @mcp.tool()\n    def quality_check(\n        path: str = \"\/var\/www\/dev.campus.systemische-tools.de\",\n        checks: str = \"all\",\n        fix: bool = False,\n    ) -> dict:\n        \"\"\"\n        Führt PHP-Quality-Prüfungen aus.\n\n        Args:\n            path: Zu prüfender Pfad\n            checks: Welche Checks (phpstan, cs-fixer, semgrep, all)\n            fix: Style-Probleme automatisch korrigieren (nur cs-fixer)\n\n        Returns:\n            Ergebnis aller Checks mit Details\n        \"\"\"\n        start = time.time()\n        request_str = json.dumps({\"path\": path, \"checks\": checks, \"fix\": fix})\n\n        try:\n            results = {}\n            overall_passed = True\n\n            check_list = [\"phpstan\", \"cs-fixer\", \"semgrep\"] if checks == \"all\" else [checks]\n\n            for check_name in check_list:\n                check_result = QualityCheckResult(check_name=check_name)\n\n                if check_name == \"phpstan\":\n                    try:\n                        result = subprocess.run(\n                            [Config.PHPSTAN_BIN, \"analyse\", path, \"--level=5\", \"--no-progress\", \"--error-format=json\"],\n                            capture_output=True,\n                            text=True,\n                            timeout=LLM_TIMEOUT,\n                        )\n                        if result.returncode == 0:\n                            check_result.passed = True\n                            check_result.issues = 0\n                        else:\n                            check_result.passed = False\n                            try:\n                                phpstan_output = json.loads(result.stdout)\n                                check_result.issues = phpstan_output.get(\"totals\", {}).get(\"errors\", 0)\n                            except Exception:\n                                check_result.issues = 1\n                            check_result.details = result.stdout[:500]\n                    except subprocess.TimeoutExpired:\n                        check_result.passed = False\n                        check_result.details = \"PHPStan timeout\"\n                    except Exception as e:\n                        check_result.passed = False\n                        check_result.details = str(e)[:LOG_QUERY_MAX_LENGTH]\n\n                elif check_name == \"cs-fixer\":\n                    try:",
            "numLines": 80,
            "startLine": 1,
            "totalLines": 226
        }
    }
}
← Vorheriger Zur Liste Nächster →