.claude/settings.json

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-write-style.sh",
            "timeout": 20,
            "statusMessage": "Checking dbatools style..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-edit-read-check.sh",
            "timeout": 10,
            "statusMessage": "Checking Read-before-Edit..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-write-snapshot-baseline.sh",
            "timeout": 10,
            "statusMessage": "Snapshotting pre-write baseline..."
          }
        ]
      },
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-bash-guard.sh",
            "timeout": 10,
            "statusMessage": "Checking for destructive commands..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-bash-commit-do.sh",
            "timeout": 10,
            "statusMessage": "Checking commit message (do ...) pattern..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/pre-bash-pwsh-script.sh",
            "timeout": 10,
            "statusMessage": "Checking inline PowerShell usage..."
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Read",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-read-track.sh",
            "timeout": 10,
            "statusMessage": "Tracking Read for Read-before-Edit..."
          }
        ]
      },
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/post-write-track-session-files.sh",
            "timeout": 10,
            "statusMessage": "Tracking session writes..."
          }
        ]
      }
    ],
    "SessionStart": [
      {
        "matcher": "compact|resume",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-compact-reset-reads.sh",
            "timeout": 10,
            "statusMessage": "Resetting Read tracker post-compaction..."
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-registration-check.sh",
            "timeout": 15,
            "statusMessage": "Checking psd1/psm1 registration for new commands..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-todo-report.sh",
            "timeout": 15,
            "statusMessage": "Scanning changed files for TODO/FIXME..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-no-deflection.sh",
            "timeout": 15,
            "statusMessage": "Checking for deflection language..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-verify.sh",
            "timeout": 15,
            "statusMessage": "Quality gate checklist..."
          },
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/stop-codex-review.sh",
            "timeout": 660,
            "statusMessage": "Running codex auto-review — tail -f ~/.codex-review.live.log to watch"
          }
        ]
      }
    ]
  }
}