{
"event": "PreToolUse",
"tool_name": "Task",
"tool_input": {
"description": "Check hook format",
"prompt": "Ich brauche Informationen über das korrekte Format für Claude Code PreToolUse Hooks:\n\n1. Welches JSON-Format muss ein Pre-Hook zurückgeben um eine Aktion zu blockieren?\n2. Ist es `message` oder `reason` als Feld für die Fehlermeldung?\n3. Gibt es andere erforderliche Felder?\n\nBitte suche in der offiziellen Claude Code Dokumentation.",
"subagent_type": "claude-code-guide"
}
}
{
"tool_response": {
"status": "completed",
"prompt": "Ich brauche Informationen über das korrekte Format für Claude Code PreToolUse Hooks:\n\n1. Welches JSON-Format muss ein Pre-Hook zurückgeben um eine Aktion zu blockieren?\n2. Ist es `message` oder `reason` als Feld für die Fehlermeldung?\n3. Gibt es andere erforderliche Felder?\n\nBitte suche in der offiziellen Claude Code Dokumentation.",
"agentId": "ae6ce3c",
"content": [
{
"type": "text",
"text": "Perfekt! Ich habe die offizielle Claude Code Dokumentation für PreToolUse Hooks gefunden. Hier sind die genauen Antworten auf Ihre Fragen:\n\n## PreToolUse Hook JSON-Response Format\n\n### 1. Format zum Blockieren einer Aktion\n\nUm eine Aktion zu blockieren, muss das Hook-Script mit **Exit Code 0** und folgendem JSON in `stdout` antworten:\n\n```json\n{\n \"hookSpecificOutput\": {\n \"hookEventName\": \"PreToolUse\",\n \"permissionDecision\": \"deny\",\n \"permissionDecisionReason\": \"Ihre Fehlermeldung hier\"\n }\n}\n```\n\n### 2. Feldname für Fehlermeldung\n\nDas korrekte Feld ist **`permissionDecisionReason`** (nicht `message` oder `reason`).\n\nEs gibt drei mögliche Werte für `permissionDecision`:\n- **`\"allow\"`** - Tool wird ausgeführt (umgeht das Berechtigungssystem)\n- **`\"deny\"`** - Tool wird blockiert\n- **`\"ask\"`** - Benutzer wird gefragt, den Tool-Aufruf zu bestätigen\n\n### 3. Weitere erforderliche Felder\n\nDie wichtigsten zusätzlichen Felder sind:\n\n| Feld | Typ | Beschreibung |\n|------|-----|-------------|\n| `permissionDecision` | String | `\"allow\"`, `\"deny\"` oder `\"ask\"` |\n| `permissionDecisionReason` | String | Nachricht für Claude oder den Benutzer |\n| `updatedInput` | Object | Optional: Modifiziert Tool-Input vor Ausführung |\n| `continue` | Boolean | Optional: `false` stoppt Claude vollständig |\n| `stopReason` | String | Optional: Nachricht wenn `continue: false` |\n| `systemMessage` | String | Optional: Warnung für den Benutzer |\n\n### 4. Praktische Beispiele\n\n**Beispiel 1: Tool blockieren mit Grund (Exit Code 0)**\n```python\n#!\/usr\/bin\/env python3\nimport json\nimport sys\n\n# Hook-Input lesen\ninput_data = json.load(sys.stdin)\n\nif input_data.get(\"tool_name\") == \"Bash\":\n command = input_data.get(\"tool_input\", {}).get(\"command\", \"\")\n \n if \"rm -rf\" in command:\n output = {\n \"hookSpecificOutput\": {\n \"hookEventName\": \"PreToolUse\",\n \"permissionDecision\": \"deny\",\n \"permissionDecisionReason\": \"Gefährlicher Befehl blockiert: rm -rf ist nicht erlaubt\"\n }\n }\n print(json.dumps(output))\n sys.exit(0)\n\nsys.exit(0)\n```\n\n**Beispiel 2: Tool mit modifiziertem Input genehmigen**\n```python\noutput = {\n \"hookSpecificOutput\": {\n \"hookEventName\": \"PreToolUse\",\n \"permissionDecision\": \"allow\",\n \"permissionDecisionReason\": \"Bash-Befehl automatisch genehmigt\",\n \"updatedInput\": {\n \"command\": \"safe-command-here\"\n }\n }\n}\nprint(json.dumps(output))\nsys.exit(0)\n```\n\n### Wichtige Hinweise\n\n- **Exit Code 2** blockiert auch, aber verwendet nur `stderr` (keine JSON-Verarbeitung)\n- Die deprecated Felder `\"approve\"` und `\"block\"` werden noch akzeptiert, sollten aber nicht mehr verwendet werden\n- `permissionDecisionReason` wird Claude angezeigt, damit Claude versteht, warum die Action blockiert wurde\n\nQuelle: [Claude Code Hooks Reference - PreToolUse Decision Control](https:\/\/code.claude.com\/docs\/en\/hooks.md#pretooluse-decision-control)"
}
],
"totalDurationMs": 14969,
"totalTokens": "[REDACTED]",
"totalToolUseCount": 2,
"usage": {
"input_tokens": "[REDACTED]",
"cache_creation_input_tokens": "[REDACTED]",
"cache_read_input_tokens": "[REDACTED]",
"cache_creation": {
"ephemeral_5m_input_tokens": "[REDACTED]",
"ephemeral_1h_input_tokens": "[REDACTED]"
},
"output_tokens": "[REDACTED]",
"service_tier": "standard"
}
}
}