{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-tool-use/check_line_number_limit.sh",
            "timeout": 30
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-tool-use/ensure_executable.sh",
            "timeout": 10
          },
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-tool-use/format_code.sh",
            "timeout": 60
          },
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-tool-use/run_lint.sh",
            "timeout": 60
          },
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-tool-use/run_tests.sh",
            "timeout": 120
          }
        ]
      }
    ],
    "Notification": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notification/notify_voice.sh",
            "timeout": 10
          },
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notification/notify_email.sh",
            "timeout": 30
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop/check_local_rules.sh",
            "timeout": 30
          },
          {
            "type": "prompt",
            "prompt": "Read and follow the instruction in `\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop/ON_STOP.md`, when it exists."
          },
          {
            "type": "prompt",
            "prompt": "Check whether any tasks remain unfinished (todo list / plan / errors). If anything remains, respond with JSON {\"decision\":\"block\",\"reason\":\"Continue with the next unfinished task.\"}. Otherwise approve. Input: $ARGUMENTS"
          }
        ]
      }
    ]
  }
}
