{ "$schema": "https://json.schemastore.org/claude-code-settings.json", "permissions": { "allow": [ "Bash(npm run lint *)", "Bash(npm run test *)", "Bash(npm run typecheck)", "Bash(npm run build)", "Bash(git status)", "Bash(git diff *)", "Bash(git log *)", "Bash(git branch *)", "Bash(git stash *)", "Bash(git add *)", "Bash(git commit *)", "Bash(git fetch *)", "Bash(git checkout *)", "Bash(git switch *)", "Bash(gh pr *)", "Bash(gh issue *)", "Bash(gh run *)" ], "deny": [ "Read(**/.env)", "Read(**/.env.*)", "Read(**/secrets/**)", "Read(**/*.pem)", "Read(**/*.key)", "Write(**/.env)", "Write(**/.env.*)", "Write(**/secrets/**)", "Write(**/*.pem)", "Write(**/*.key)", "Edit(**/.env)", "Edit(**/.env.*)", "Edit(**/secrets/**)", "Edit(**/*.pem)", "Edit(**/*.key)" ] }, "hooks": { "PreToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/protect-files.sh", "timeout": 5000, "statusMessage": "Checking file protections..." }, { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/warn-large-files.sh", "timeout": 5000, "statusMessage": "Checking for build artifacts..." }, { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/scan-secrets.sh", "timeout": 5000, "statusMessage": "Scanning for secrets..." } ] }, { "matcher": "Bash", "hooks": [ { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/block-dangerous-commands.sh", "timeout": 5000, "statusMessage": "Checking command safety..." } ] } ], "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/format-on-save.sh", "timeout": 15000, "statusMessage": "Formatting..." } ] } ], "SessionStart": [ { "matcher": "", "hooks": [ { "type": "command", "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.sh", "timeout": 5000, "statusMessage": "Loading project context..." } ] } ], "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "which osascript >/dev/null 2>&1 && osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"' || which notify-send >/dev/null 2>&1 && notify-send 'Claude Code' 'Claude Code needs your attention' || true" } ] } ] } }