{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_create",
"tool_input": {
"title": "Post-Hook Ablauf",
"slug": "post-hook-ablauf",
"parent_id": 92,
"description": "Was passiert NACH der Tool-Ausführung",
"content": "<h2>Post-Hook Ablauf<\/h2>\n\n<p>Der Post-Hook wird <strong>nach<\/strong> jeder Tool-Ausführung aufgerufen und führt Aufräumarbeiten sowie Logging durch.<\/p>\n\n<h3>Trigger<\/h3>\n<p>Post-Hooks werden bei folgenden Tools ausgelöst:<\/p>\n<ul>\n <li><code>Edit<\/code> - Nach Datei-Bearbeitung<\/li>\n <li><code>Write<\/code> - Nach Datei-Erstellung<\/li>\n <li>Alle anderen Tools (generisches Response-Logging)<\/li>\n<\/ul>\n\n<h3>Ablauf bei Edit\/Write<\/h3>\n\n<h4>1. Berechtigungskorrektur<\/h4>\n<p>Nach jeder Edit\/Write-Operation:<\/p>\n\n<pre>\nfix-permissions.sh\n├── chown -R www-data:www-data \/var\/www\/dev.campus...\n├── chown -R www-data:www-data \/var\/www\/prod.campus...\n├── chmod -R 755 \/var\/www\/dev.campus...\n└── chmod -R 755 \/var\/www\/prod.campus...\n<\/pre>\n\n<p><strong>Warum?<\/strong> Claude Code läuft als root. Ohne Korrektur hätten die Dateien falschen Owner und Apache könnte sie nicht lesen.<\/p>\n\n<h4>2. Response-Logging<\/h4>\n<p>Für alle Tools wird die Response protokolliert:<\/p>\n\n<pre>\nlog_to_db.py\n├── Sucht: Matching PreToolUse-Request\n│ └── Über: session_id + tool_name\n│\n├── Extrahiert: tool_response\n├── Sanitized: Sensible Daten\n├── Schätzt: tokens_output\n│\n└── UPDATE protokoll SET\n ├── response (JSON)\n ├── response_timestamp\n ├── tokens_output\n ├── tokens_total = tokens_input + tokens_output\n ├── duration_ms (berechnet aus Timestamps)\n └── status: 'completed'\n<\/pre>\n\n<h3>Request\/Response-Pairing<\/h3>\n<p>Das Logging-System verbindet Pre- und Post-Hook-Events:<\/p>\n\n<pre>\nPreToolUse (Edit \"file.php\")\n├── INSERT protokoll → ID=123\n└── Speichert: \/tmp\/claude_hooks\/{session}_{tool}_PreToolUse.json\n └── {\"db_id\": 123, \"timestamp\": \"...\"}\n\n[Tool-Ausführung]\n\nPostToolUse (Edit \"file.php\")\n├── Lädt: \/tmp\/claude_hooks\/{session}_{tool}_PreToolUse.json\n├── Findet: db_id=123\n├── UPDATE protokoll WHERE id=123\n│ └── SET response, duration_ms, status='completed'\n└── Löscht: Tracking-Datei\n<\/pre>\n\n<h3>Duration-Berechnung<\/h3>\n<p>Die Dauer wird präzise aus den Timestamps berechnet:<\/p>\n<pre>\nduration_ms = TIMESTAMPDIFF(MICROSECOND, request_timestamp, response_timestamp) \/ 1000\n<\/pre>\n<p>Damit ist die exakte Tool-Ausführungszeit in Millisekunden erfasst.<\/p>\n\n<h3>Fail-Open Prinzip<\/h3>\n<p>Bei Fehlern im Post-Hook:<\/p>\n<ul>\n <li>Hook gibt trotzdem <code>exit(0)<\/code> zurück<\/li>\n <li>Fehler wird zu stderr geloggt<\/li>\n <li>Claude Code arbeitet normal weiter<\/li>\n<\/ul>\n<p>Post-Hooks sind nie blockierend, da die Aktion bereits abgeschlossen ist.<\/p>",
"status": "published",
"sort_order": 2
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 94,\n \"parent_id\": 92,\n \"slug\": \"post-hook-ablauf\",\n \"path\": \"\/prozesse\/claude-hooks-prozess\/post-hook-ablauf\",\n \"title\": \"Post-Hook Ablauf\",\n \"description\": \"Was passiert NACH der Tool-Ausführung\",\n \"content\": \"<h2>Post-Hook Ablauf<\/h2>\\n\\n<p>Der Post-Hook wird <strong>nach<\/strong> jeder Tool-Ausführung aufgerufen und führt Aufräumarbeiten sowie Logging durch.<\/p>\\n\\n<h3>Trigger<\/h3>\\n<p>Post-Hooks werden bei folgenden Tools ausgelöst:<\/p>\\n<ul>\\n <li><code>Edit<\/code> - Nach Datei-Bearbeitung<\/li>\\n <li><code>Write<\/code> - Nach Datei-Erstellung<\/li>\\n <li>Alle anderen Tools (generisches Response-Logging)<\/li>\\n<\/ul>\\n\\n<h3>Ablauf bei Edit\/Write<\/h3>\\n\\n<h4>1. Berechtigungskorrektur<\/h4>\\n<p>Nach jeder Edit\/Write-Operation:<\/p>\\n\\n<pre>\\nfix-permissions.sh\\n├── chown -R www-data:www-data \/var\/www\/dev.campus...\\n├── chown -R www-data:www-data \/var\/www\/prod.campus...\\n├── chmod -R 755 \/var\/www\/dev.campus...\\n└── chmod -R 755 \/var\/www\/prod.campus...\\n<\/pre>\\n\\n<p><strong>Warum?<\/strong> Claude Code läuft als root. Ohne Korrektur hätten die Dateien falschen Owner und Apache könnte sie nicht lesen.<\/p>\\n\\n<h4>2. Response-Logging<\/h4>\\n<p>Für alle Tools wird die Response protokolliert:<\/p>\\n\\n<pre>\\nlog_to_db.py\\n├── Sucht: Matching PreToolUse-Request\\n│ └── Über: session_id + tool_name\\n│\\n├── Extrahiert: tool_response\\n├── Sanitized: Sensible Daten\\n├── Schätzt: tokens_output\\n│\\n└── UPDATE protokoll SET\\n ├── response (JSON)\\n ├── response_timestamp\\n ├── tokens_output\\n ├── tokens_total = tokens_input + tokens_output\\n ├── duration_ms (berechnet aus Timestamps)\\n └── status: 'completed'\\n<\/pre>\\n\\n<h3>Request\/Response-Pairing<\/h3>\\n<p>Das Logging-System verbindet Pre- und Post-Hook-Events:<\/p>\\n\\n<pre>\\nPreToolUse (Edit \\\"file.php\\\")\\n├── INSERT protokoll → ID=123\\n└── Speichert: \/tmp\/claude_hooks\/{session}_{tool}_PreToolUse.json\\n └── {\\\"db_id\\\": 123, \\\"timestamp\\\": \\\"...\\\"}\\n\\n[Tool-Ausführung]\\n\\nPostToolUse (Edit \\\"file.php\\\")\\n├── Lädt: \/tmp\/claude_hooks\/{session}_{tool}_PreToolUse.json\\n├── Findet: db_id=123\\n├── UPDATE protokoll WHERE id=123\\n│ └── SET response, duration_ms, status='completed'\\n└── Löscht: Tracking-Datei\\n<\/pre>\\n\\n<h3>Duration-Berechnung<\/h3>\\n<p>Die Dauer wird präzise aus den Timestamps berechnet:<\/p>\\n<pre>\\nduration_ms = TIMESTAMPDIFF(MICROSECOND, request_timestamp, response_timestamp) \/ 1000\\n<\/pre>\\n<p>Damit ist die exakte Tool-Ausführungszeit in Millisekunden erfasst.<\/p>\\n\\n<h3>Fail-Open Prinzip<\/h3>\\n<p>Bei Fehlern im Post-Hook:<\/p>\\n<ul>\\n <li>Hook gibt trotzdem <code>exit(0)<\/code> zurück<\/li>\\n <li>Fehler wird zu stderr geloggt<\/li>\\n <li>Claude Code arbeitet normal weiter<\/li>\\n<\/ul>\\n<p>Post-Hooks sind nie blockierend, da die Aktion bereits abgeschlossen ist.<\/p>\",\n \"status\": \"published\",\n \"sort_order\": 2,\n \"depth\": 2,\n \"created_at\": \"2025-12-23T05:39:59\",\n \"updated_at\": \"2025-12-23T05:39:59\"\n },\n \"message\": \"Dokument 'Post-Hook Ablauf' erstellt mit ID 94\"\n}"
}
]
}