/hooks:permission-request-hook Generate a hook that auto-approves safe operations, auto-denies dangerous ones, and passes everything else through for user decision. A safer, project-aware alternative to . When to Use This Skill | Use this skill when... | Use instead when... | |---|---| | You want auto-approve/deny rules for Claude Code permissions | Configuring other hook types (PreToolUse, Stop, SessionStart) | | Replacing with targeted rules | Need general hooks knowledge or debugging | | Setting up project-specific permission automation | Writing entirely custom hook logic from scratch | |…

; then\n approve \"Build command\"\nfi\n{{ endif }}\n\n{{ if category includes 'gh' or all categories }}\n# ── GitHub CLI: read operations ──\nif echo \"$COMMAND\" | grep -Eq '^\\s*gh\\s+(pr\\s+(view|checks|list|diff)|issue\\s+(view|list)|run\\s+(view|list))\\b'; then\n approve \"GitHub CLI read operation\"\nfi\n{{ endif }}\n\n# ── Package info queries ──\n{{ if Node.js detected }}\nif echo \"$COMMAND\" | grep -Eq '^\\s*npm\\s+ls\\b'; then\n approve \"Package info query\"\nfi\n{{ endif }}\n{{ if Rust detected }}\nif echo \"$COMMAND\" | grep -Eq '^\\s*cargo\\s+tree\\b'; then\n approve \"Package info query\"\nfi\n{{ endif }}\n{{ if Go detected }}\nif echo \"$COMMAND\" | grep -Eq '^\\s*go\\s+list\\b'; then\n approve \"Package info query\"\nfi\n{{ endif }}\n{{ if Python detected }}\nif echo \"$COMMAND\" | grep -Eq '^\\s*(pip\\s+list|pip\\s+show)\\b'; then\n approve \"Package info query\"\nfi\n{{ endif }}\n\n# ══════════════════════════════════════════════════════════════\n# AUTO-DENY: Dangerous operations\n# ══════════════════════════════════════════════════════════════\n\n{{ if category includes 'deny' or all categories }}\n# Destructive filesystem operations on root or home\n# shellcheck disable=SC2016\nif echo \"$COMMAND\" | grep -Eq 'rm\\s+(-[a-zA-Z]*f[a-zA-Z]*\\s+)(/\\s|/\\*|~/|\\$HOME)'; then\n deny \"Destructive operation on root or home directory\"\nfi\n\n# Force push to protected branches\nif echo \"$COMMAND\" | grep -Eq 'git\\s+push\\s+.*--force.*\\s(main|master)\\b'; then\n deny \"Force push to protected branch\"\nfi\n\n# Insecure permissions\nif echo \"$COMMAND\" | grep -Eq 'chmod\\s+777\\b'; then\n deny \"Insecure permissions (chmod 777)\"\nfi\n\n# Piped network execution\nif echo \"$COMMAND\" | grep -Eq '(curl|wget)\\s.*\\|\\s*(bash|sh|zsh)'; then\n deny \"Piped network execution (curl|bash)\"\nfi\n\n# Fork bombs\nif echo \"$COMMAND\" | grep -Eq ':\\(\\)\\s*\\{.*:\\|:.*\\}'; then\n deny \"Fork bomb detected\"\nfi\n\n# Block device writes\nif echo \"$COMMAND\" | grep -Eq '(dd\\s+.*of=/dev/|>\\s*/dev/sd)'; then\n deny \"Direct block device write\"\nfi\n\n# Filesystem formatting\nif echo \"$COMMAND\" | grep -Eq '^\\s*mkfs\\b'; then\n deny \"Filesystem format operation\"\nfi\n\n# Destructive git clean at repo root\nif echo \"$COMMAND\" | grep -Eq '^\\s*git\\s+clean\\s+-[a-zA-Z]*f[a-zA-Z]*d'; then\n deny \"Destructive git clean\"\nfi\n\n# Database destructive operations\nif echo \"$COMMAND\" | grep -Eiq '(psql|mysql|sqlite3).*\\b(DROP\\s+(DATABASE|TABLE)|TRUNCATE)\\b'; then\n deny \"Database destructive operation\"\nfi\n{{ endif }}\n\n{{ if --strict }}\n# ══════════════════════════════════════════════════════════════\n# STRICT MODE: Deny unrecognized Bash commands\n# ══════════════════════════════════════════════════════════════\ndeny \"Unrecognized command (strict mode). Disable with CLAUDE_HOOKS_DISABLE_PERMISSION_REQUEST=1\"\n{{ endif }}\n\n# ══════════════════════════════════════════════════════════════\n# PASS THROUGH: Everything else requires user decision\n# ══════════════════════════════════════════════════════════════\nexit 0\n```\n\n## Test Script Specification\n\nThe test script must include:\n\n1. A `test_case` function that:\n - Takes `expected_decision`, `description`, `tool_name`, `tool_input_json`\n - Constructs PermissionRequest JSON with `jq -n`\n - Pipes to the hook script, captures stdout\n - Parses decision (empty output = `\"passthrough\"`)\n - Prints PASS/FAIL with color codes and tracks counts\n\n2. Test cases for each included category:\n\n| Category | Approve Tests | Deny Tests |\n|---|---|---|\n| Always | `Read` tool, `Glob` tool, `Grep` tool | — |\n| `git` | `git status`, `git log`, `git diff`, `git branch`, `git fetch`, `git stash list` | — |\n| `test` | Per detected stack (e.g., `npm test`, `pytest`, `cargo test`) | — |\n| `lint` | Per detected stack (e.g., `npx biome check`, `ruff check`) | — |\n| `build` | Per detected stack (e.g., `npm run build`, `cargo build`) | — |\n| `gh` | `gh pr view 123`, `gh issue list` | — |\n| `deny` | — | `rm -rf /`, `rm -rf ~/`, `rm -rf $HOME`, `git push --force origin main`, `chmod 777`, `curl \\| bash`, `wget \\| sh`, `dd of=/dev/sda`, `mkfs`, `git clean -fdx`, `DROP DATABASE` |\n| Always | — | — |\n| Passthrough | — | `npm install express`, `echo hello`, `Write` tool |\n| `--strict` | — | `some-unknown-cmd --flag` (deny in strict mode) |\n\n3. A summary line: `N passed, N failed, N total` with `exit 1` on any failure\n\nSet `HOOK_SCRIPT` to the actual generated hook script path. Include test cases only for detected stacks and selected categories.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9442,"content_sha256":"ae73ac85c6d9db80150619a7d7a94952b2e18654b23b8746455b2de0be0179c1"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"/hooks:permission-request-hook","type":"text"}]},{"type":"paragraph","content":[{"text":"Generate a ","type":"text"},{"text":"PermissionRequest","type":"text","marks":[{"type":"code_inline"}]},{"text":" hook that auto-approves safe operations, auto-denies dangerous ones, and passes everything else through for user decision. A safer, project-aware alternative to ","type":"text"},{"text":"--dangerouslySkipPermissions","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use This Skill","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use this skill when...","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"/hooks:hooks-configuration","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead when...","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"You want auto-approve/deny rules for Claude Code permissions","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Configuring other hook types (PreToolUse, Stop, SessionStart)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Replacing ","type":"text"},{"text":"--dangerouslySkipPermissions","type":"text","marks":[{"type":"code_inline"}]},{"text":" with targeted rules","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Need general hooks knowledge or debugging","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Setting up project-specific permission automation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Writing entirely custom hook logic from scratch","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"You need a test harness to validate approve/deny behavior","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Understanding hook lifecycle events","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Auto Mode vs ","type":"text"},{"text":"PermissionRequest","type":"text","marks":[{"type":"code_inline"}]},{"text":" Hook","type":"text"}]},{"type":"paragraph","content":[{"text":"Auto mode (Claude Code 2.1.83+) routes most approve/deny decisions through a classifier model. It overlaps with — but does not replace — a ","type":"text"},{"text":"PermissionRequest","type":"text","marks":[{"type":"code_inline"}]},{"text":" hook. Choose this skill when you need any of:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Deterministic, auditable rules","type":"text","marks":[{"type":"strong"}]},{"text":" — the classifier's probabilistic answer is unsuitable for compliance contexts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Project-specific deny lists","type":"text","marks":[{"type":"strong"}]},{"text":" that go beyond the default trust set","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hard 0% false-positive guarantees","type":"text","marks":[{"type":"strong"}]},{"text":" for specific commands (the hook is exact, the classifier is not)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pre-approve narrow patterns","type":"text","marks":[{"type":"strong"}]},{"text":" so they skip the classifier round-trip and avoid latency/token cost","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Hooks coexist with auto mode — they fire alongside the classifier. See ","type":"text"},{"text":".claude/rules/auto-mode.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for the full auto-mode model and how it interacts with allow rules and subagents.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Context","type":"text"}]},{"type":"paragraph","content":[{"text":"Detect project stack:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lockfiles: !","type":"text"},{"text":"find . -maxdepth 1 \\( -name 'package-lock.json' -o -name 'yarn.lock' -o -name 'pnpm-lock.yaml' -o -name 'bun.lockb' -o -name 'poetry.lock' -o -name 'uv.lock' -o -name 'Cargo.lock' -o -name 'go.sum' -o -name 'Gemfile.lock' \\)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Project files: !","type":"text"},{"text":"find . -maxdepth 1 \\( -name 'package.json' -o -name 'pyproject.toml' -o -name 'requirements.txt' -o -name 'Cargo.toml' -o -name 'go.mod' -o -name 'Gemfile' \\)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing settings: !","type":"text"},{"text":"find .claude -maxdepth 1 -name 'settings.json' -type f","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing hooks dir: !","type":"text"},{"text":"find . -maxdepth 2 -type d -name 'scripts'","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"jq available: !","type":"text"},{"text":"jq --version","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing PermissionRequest hooks: !","type":"text"},{"text":"jq -r '.hooks.PermissionRequest // empty' .claude/settings.json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Parameters","type":"text"}]},{"type":"paragraph","content":[{"text":"Parse these from ","type":"text"},{"text":"$ARGUMENTS","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Flag","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--strict","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"off","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deny unrecognized Bash commands by default instead of passing through to user","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--category \u003cname>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"all","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Include only specific rule categories. Repeatable. Values: ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"test","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"lint","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"build","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"gh","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deny","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Execution","type":"text"}]},{"type":"paragraph","content":[{"text":"Execute this workflow:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Detect project stack","type":"text"}]},{"type":"paragraph","content":[{"text":"Identify languages and tooling from the context above.","type":"text"}]},{"type":"paragraph","content":[{"text":"Language detection:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File Present","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Language","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Package Manager (from lockfile)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"package.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Node.js","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"npm (","type":"text"},{"text":"package-lock.json","type":"text","marks":[{"type":"code_inline"}]},{"text":"), yarn (","type":"text"},{"text":"yarn.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":"), pnpm (","type":"text"},{"text":"pnpm-lock.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":"), bun (","type":"text"},{"text":"bun.lockb","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"pyproject.toml","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"requirements.txt","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Python","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"poetry (","type":"text"},{"text":"poetry.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":"), uv (","type":"text"},{"text":"uv.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":"), pip (fallback)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cargo.toml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rust","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"cargo","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"go.mod","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Go","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"go modules","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Gemfile","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ruby","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bundler","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Report detected stack to user before generating.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Generate the hook script","type":"text"}]},{"type":"paragraph","content":[{"text":"Create the script at ","type":"text"},{"text":"scripts/permission-request.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or ","type":"text"},{"text":".claude/hooks/permission-request.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" if no ","type":"text"},{"text":"scripts/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory exists).","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the ","type":"text"},{"text":"Script Template","type":"text","marks":[{"type":"strong"}]},{"text":" from ","type":"text"},{"text":"REFERENCE.md","type":"text","marks":[{"type":"link","attrs":{"href":"REFERENCE.md","title":null}}]},{"text":". Adapt it by:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Including only sections for detected languages (remove ","type":"text"},{"text":"{{ if ... }}","type":"text","marks":[{"type":"code_inline"}]},{"text":" markers)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Including only selected categories if ","type":"text"},{"text":"--category","type":"text","marks":[{"type":"code_inline"}]},{"text":" flags were provided","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Removing all template comments (","type":"text"},{"text":"{{ ... }}","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"--strict","type":"text","marks":[{"type":"code_inline"}]},{"text":" is set, include the strict mode catch-all deny at the end","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Generate the test script","type":"text"}]},{"type":"paragraph","content":[{"text":"Create ","type":"text"},{"text":"scripts/test-permission-hook.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" (or ","type":"text"},{"text":".claude/hooks/test-permission-hook.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" to match the hook location).","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the ","type":"text"},{"text":"Test Script Specification","type":"text","marks":[{"type":"strong"}]},{"text":" from ","type":"text"},{"text":"REFERENCE.md","type":"text","marks":[{"type":"link","attrs":{"href":"REFERENCE.md","title":null}}]},{"text":". Include test cases only for detected stacks and selected categories. Remove all ","type":"text"},{"text":"{{ ... }}","type":"text","marks":[{"type":"code_inline"}]},{"text":" template markers.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Configure ","type":"text"},{"text":".claude/settings.json","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"Read existing ","type":"text"},{"text":".claude/settings.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" if it exists. ","type":"text"},{"text":"Merge","type":"text","marks":[{"type":"strong"}]},{"text":" the PermissionRequest hook — preserve all existing configuration.","type":"text"}]},{"type":"paragraph","content":[{"text":"If a ","type":"text"},{"text":"PermissionRequest","type":"text","marks":[{"type":"code_inline"}]},{"text":" hook already exists, ask the user whether to:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace","type":"text","marks":[{"type":"strong"}]},{"text":" the existing PermissionRequest hook","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add alongside","type":"text","marks":[{"type":"strong"}]},{"text":" the existing hook (both will run)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Abort","type":"text","marks":[{"type":"strong"}]},{"text":" and keep existing configuration","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Configuration to merge:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"hooks\": {\n \"PermissionRequest\": [\n {\n \"matcher\": \"\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \"bash \\\"$CLAUDE_PROJECT_DIR/scripts/permission-request.sh\\\"\",\n \"timeout\": 10\n }\n ]\n }\n ]\n }\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"timeout: 10","type":"text","marks":[{"type":"code_inline"}]},{"text":" (10 seconds). Use empty matcher ","type":"text"},{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" to match all tools. Adjust path if script is in ","type":"text"},{"text":".claude/hooks/","type":"text","marks":[{"type":"code_inline"}]},{"text":" instead of ","type":"text"},{"text":"scripts/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: Finalize","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Make both scripts executable: ","type":"text"},{"text":"chmod +x \u003chook-path> \u003ctest-path>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create ","type":"text"},{"text":".claude/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory if needed for settings.json","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run the test script to verify all test cases pass","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report summary:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"List files created/modified","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Show number of approve rules, deny rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Show test results (pass/fail count)","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-Actions","type":"text"}]},{"type":"paragraph","content":[{"text":"After generating the hook:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Suggest committing the new files:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"scripts/permission-request.sh\nscripts/test-permission-hook.sh\n.claude/settings.json","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"--strict","type":"text","marks":[{"type":"code_inline"}]},{"text":" was NOT used, mention the flag for environments where unknown commands should be denied","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Explain how to add custom rules — edit the APPROVE/DENY sections of the generated script","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remind about ","type":"text"},{"text":"CLAUDE_HOOKS_DISABLE_PERMISSION_REQUEST=1","type":"text","marks":[{"type":"code_inline"}]},{"text":" to toggle the hook off temporarily","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Note that empty matcher ","type":"text"},{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" catches all tools; suggest narrowing to ","type":"text"},{"text":"\"Bash\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" if only Bash commands need filtering","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"PermissionRequest Schema","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Input (via stdin)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Field","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"session_id","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"string","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Current session ID","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tool_name","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"string","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool being invoked (","type":"text"},{"text":"Bash","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Write","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Edit","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Read","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc.)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tool_input","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"object","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool-specific input (","type":"text"},{"text":".command","type":"text","marks":[{"type":"code_inline"}]},{"text":" for Bash, ","type":"text"},{"text":".file_path","type":"text","marks":[{"type":"code_inline"}]},{"text":" for Write/Edit)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"permission_type","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"string","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Always ","type":"text"},{"text":"\"tool_use\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"description","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"string","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Human-readable description of the operation","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Output (via stdout)","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Decision","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"JSON","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Effect","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Approve","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{\"decision\":\"approve\",\"reason\":\"...\"}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool runs without user prompt","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deny","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"{\"decision\":\"deny\",\"reason\":\"...\"}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool blocked, reason shown to Claude","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Passthrough","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Exit 0 with no output","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User prompted as normal","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Agentic Optimizations","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Context","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Approach","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quick setup, all categories","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/hooks:permission-request-hook","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Strict mode (deny unknown commands)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/hooks:permission-request-hook --strict","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Only git and test rules","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/hooks:permission-request-hook --category git --category test","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Only deny rules (block dangerous ops)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/hooks:permission-request-hook --category deny","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Test the hook manually","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"echo '{\"tool_name\":\"Bash\",\"tool_input\":{\"command\":\"git status\"}}' | bash scripts/permission-request.sh","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Disable hook temporarily","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CLAUDE_HOOKS_DISABLE_PERMISSION_REQUEST=1","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Item","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Value","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Hook event","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PermissionRequest","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Script location","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/permission-request.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":".claude/hooks/permission-request.sh","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Test script","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/test-permission-hook.sh","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Settings location","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":".claude/settings.json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Timeout","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10 seconds","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Matcher","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" (all tools)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Toggle","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CLAUDE_HOOKS_DISABLE_PERMISSION_REQUEST=1","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Decisions","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"approve, deny, passthrough (no output)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Categories","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"test","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"lint","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"build","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"gh","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"deny","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"args":"[--strict] [--category \u003cname>...]","date":"2026-06-05","name":"hooks-permission-request-hook","author":"@skillopedia","source":{"stars":35,"repo_name":"claude-plugins","origin_url":"https://github.com/laurigates/claude-plugins/blob/HEAD/hooks-plugin/skills/hooks-permission-request-hook/SKILL.md","repo_owner":"laurigates","body_sha256":"bf083a54b1f8f44df8a91522fef3242d8b99b4cfaafb32f59bbed641769084cc","cluster_key":"47aacb4f146d8626ad3b6ffd1f7005588beaa67c83dfa38ef74799d2458570f7","clean_bundle":{"format":"clean-skill-bundle-v1","source":"laurigates/claude-plugins/hooks-plugin/skills/hooks-permission-request-hook/SKILL.md","attachments":[{"id":"f76ff45c-ee38-5ce9-b1dd-0234563f7ded","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f76ff45c-ee38-5ce9-b1dd-0234563f7ded/attachment.md","path":"REFERENCE.md","size":9442,"sha256":"ae73ac85c6d9db80150619a7d7a94952b2e18654b23b8746455b2de0be0179c1","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"f8ae9cd362230814e331ea2f19aa07ca3c39ed5ad2a4c8536da972136e3db2c1","attachment_count":1,"text_attachments":1,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"hooks-plugin/skills/hooks-permission-request-hook/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"general","category_label":"General"},"exact_dupes_collapsed_into_this":0},"created":"2026-03-13T00:00:00.000Z","version":"v1","category":"general","modified":"2026-05-11T00:00:00.000Z","reviewed":"2026-04-29T00:00:00.000Z","import_tag":"clean-skills-v1","description":"Generate a PermissionRequest hook with auto-approve/deny rules. Use when needing a safer alternative to --dangerouslySkipPermissions tailored to your project stack.","allowed-tools":"Read, Write, Edit, Glob, Grep, Bash, TodoWrite","argument-hint":"--strict to deny unknown commands, --category git|test|lint|build|gh|deny","disable-model-invocation":true}},"renderedAt":1782980683591}

/hooks:permission-request-hook Generate a hook that auto-approves safe operations, auto-denies dangerous ones, and passes everything else through for user decision. A safer, project-aware alternative to . When to Use This Skill | Use this skill when... | Use instead when... | |---|---| | You want auto-approve/deny rules for Claude Code permissions | Configuring other hook types (PreToolUse, Stop, SessionStart) | | Replacing with targeted rules | Need general hooks knowledge or debugging | | Setting up project-specific permission automation | Writing entirely custom hook logic from scratch | |…