cc-safe-setup 28.4.9 → 28.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/COOKBOOK.md ADDED
@@ -0,0 +1,153 @@
1
+ # Cookbook — cc-safe-setup Recipes
2
+
3
+ Real-world recipes for common safety scenarios. Each recipe is a single command.
4
+
5
+ ## Getting Started
6
+
7
+ | I want to... | Command |
8
+ |---|---|
9
+ | Install basic safety | `npx cc-safe-setup` |
10
+ | Maximum protection | `npx cc-safe-setup --shield` |
11
+ | Check my setup | `npx cc-safe-setup --doctor` |
12
+ | See my safety score | `npx cc-safe-setup --audit` |
13
+
14
+ ## Blocking Dangerous Commands
15
+
16
+ ### Block rm -rf on home/root
17
+ Already included in the default install. To verify:
18
+ ```bash
19
+ npx cc-safe-setup --simulate "rm -rf ~"
20
+ # Expected: BLOCKED
21
+ ```
22
+
23
+ ### Block database wipes
24
+ ```bash
25
+ npx cc-safe-setup --install-example block-database-wipe
26
+ ```
27
+ Blocks: `prisma migrate reset`, `rails db:drop`, `DROP TABLE`, etc.
28
+
29
+ ### Block npm publish accidents
30
+ ```bash
31
+ npx cc-safe-setup --install-example npm-publish-guard
32
+ ```
33
+
34
+ ## Auto-Approving Safe Commands
35
+
36
+ ### Approve read-only commands (cat, ls, grep)
37
+ ```bash
38
+ npx cc-safe-setup --install-example auto-approve-readonly
39
+ ```
40
+
41
+ ### Approve test runners
42
+ ```bash
43
+ npx cc-safe-setup --install-example auto-approve-test
44
+ ```
45
+ Covers: `npm test`, `pytest`, `go test`, `cargo test`, `jest`, `vitest`
46
+
47
+ ### Approve git read commands (status, log, diff)
48
+ ```bash
49
+ npx cc-safe-setup --install-example auto-approve-git-read
50
+ ```
51
+
52
+ ## File Protection
53
+
54
+ ### Protect .env files from edits
55
+ ```bash
56
+ npx cc-safe-setup --protect .env
57
+ ```
58
+
59
+ ### Protect CLAUDE.md from unauthorized changes
60
+ ```bash
61
+ npx cc-safe-setup --install-example protect-claudemd
62
+ ```
63
+
64
+ ### Protect dotfiles (~/.bashrc, ~/.aws/)
65
+ ```bash
66
+ npx cc-safe-setup --install-example protect-dotfiles
67
+ ```
68
+
69
+ ## YAML Rules (No Coding)
70
+
71
+ Write rules in YAML, compile to hooks:
72
+
73
+ ```yaml
74
+ # rules.yaml
75
+ - block: "rm -rf on root"
76
+ pattern: "rm\s+-rf\s+(\/$|~)"
77
+
78
+ - approve: "read-only commands"
79
+ commands: [cat, ls, grep, head, tail]
80
+
81
+ - protect: ".env"
82
+ ```
83
+
84
+ ```bash
85
+ npx cc-safe-setup --rules rules.yaml
86
+ ```
87
+
88
+ ## Monitoring & Recovery
89
+
90
+ ### Auto-save checkpoint before compaction
91
+ ```bash
92
+ npx cc-safe-setup --install-example auto-compact-prep
93
+ ```
94
+
95
+ ### Track context window usage
96
+ ```bash
97
+ npx cc-safe-setup --install-example compact-reminder
98
+ ```
99
+
100
+ ### Fix hook permissions on Windows/plugins
101
+ ```bash
102
+ npx cc-safe-setup --install-example hook-permission-fixer
103
+ ```
104
+
105
+ ### Prevent tool call loops
106
+ ```bash
107
+ npx cc-safe-setup --install-example response-budget-guard
108
+ ```
109
+
110
+ ## Diagnosing Problems
111
+
112
+ ### Why isn't my hook working?
113
+ ```bash
114
+ npx cc-safe-setup --doctor
115
+ ```
116
+ Checks: jq, settings.json, file existence, permissions, shebangs, exit codes.
117
+
118
+ ### Test a specific hook
119
+ ```bash
120
+ npx cc-safe-setup --test-hook destructive-guard
121
+ ```
122
+
123
+ ### Preview how hooks react to a command
124
+ ```bash
125
+ npx cc-safe-setup --simulate "git push --force origin main"
126
+ ```
127
+
128
+ ## Web Tools
129
+
130
+ All browser-based, nothing leaves your machine:
131
+
132
+ - [Safety Hub](https://yurukusa.github.io/cc-safe-setup/hub.html) — All 23 tools
133
+ - [Validator](https://yurukusa.github.io/cc-safe-setup/validator.html) — Paste settings.json, get score
134
+ - [Permission Checker](https://yurukusa.github.io/cc-safe-setup/permission-checker.html) — Find broken paths
135
+ - [Playground](https://yurukusa.github.io/cc-safe-setup/playground.html) — Write and test hooks
136
+ - [Hook Builder](https://yurukusa.github.io/cc-safe-setup/builder.html) — Generate hooks from English
137
+
138
+ ## 27. Bypass Protected Directory Prompts (PermissionRequest)
139
+
140
+ PreToolUse hooks can't bypass built-in protected-directory checks — they run *before* those checks. Use PermissionRequest instead:
141
+
142
+ ```bash
143
+ npx cc-safe-setup --install-example allow-git-hooks-dir
144
+ ```
145
+
146
+ Or manually: create a PermissionRequest hook that outputs `permissionDecision: "allow"`. See [Troubleshooting](TROUBLESHOOTING.md#pretooluse-allow-doesnt-bypass-protected-directory-prompts) for details.
147
+
148
+ ## Further Reading
149
+
150
+ - [Getting Started](https://yurukusa.github.io/cc-safe-setup/getting-started.html)
151
+ - [Common Mistakes](https://yurukusa.github.io/cc-safe-setup/common-mistakes.html)
152
+ - [Troubleshooting](TROUBLESHOOTING.md)
153
+ - [Settings Reference](SETTINGS_REFERENCE.md)
package/README.md CHANGED
@@ -87,7 +87,7 @@ Each hook exists because a real incident happened without it.
87
87
  | `--scan [--apply]` | Tech stack detection |
88
88
  | `--export / --import` | Team config sharing |
89
89
  | `--verify` | Test each hook |
90
- | `--install-example <name>` | Install from 316 examples |
90
+ | `--install-example <name>` | Install from 331 examples |
91
91
  | `--examples [filter]` | Browse examples by keyword |
92
92
  | `--full` | All-in-one setup |
93
93
  | `--status` | Check installed hooks |
@@ -356,6 +356,7 @@ See [Issue #1](https://github.com/yurukusa/cc-safe-setup/issues/1) for details.
356
356
 
357
357
  ## Learn More
358
358
 
359
+ - [Cookbook](COOKBOOK.md) — 26 practical recipes (block, approve, protect, monitor, diagnose)
359
360
  - [Official Hooks Reference](https://docs.anthropic.com/en/docs/claude-code/hooks) — Claude Code hooks documentation
360
361
  - [Hooks Cookbook](https://github.com/yurukusa/claude-code-hooks/blob/main/COOKBOOK.md) — 25 recipes from real GitHub Issues ([interactive version](https://yurukusa.github.io/claude-code-hooks/))
361
362
  - [Japanese guide (Qiita)](https://qiita.com/yurukusa/items/a9714b33f5d974e8f1e8) — この記事の日本語解説
@@ -132,6 +132,34 @@ jq -n '...'
132
132
 
133
133
  Auto-approve JSON must go to stdout.
134
134
 
135
+ ## "PreToolUse allow doesn't bypass protected directory prompts"
136
+
137
+ This is expected behavior, not a bug.
138
+
139
+ **Execution order:**
140
+ 1. PreToolUse hooks run
141
+ 2. Built-in protected-directory checks run (`.claude/`, `.git/`, etc.)
142
+ 3. PermissionRequest hooks run
143
+
144
+ PreToolUse's `permissionDecision: "allow"` gets overridden by the built-in checks in step 2. To bypass protected directory prompts, use **PermissionRequest** hooks instead:
145
+
146
+ ```bash
147
+ #!/bin/bash
148
+ # Save as: ~/.claude/hooks/allow-protected-dir.sh
149
+ # Trigger: PermissionRequest (not PreToolUse)
150
+ INPUT=$(cat)
151
+ PATH_TARGET=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.command // empty')
152
+
153
+ # Allow writes to a specific protected directory
154
+ if echo "$PATH_TARGET" | grep -q '/my-project/.git/hooks'; then
155
+ jq -n '{hookSpecificOutput: {hookEventName: "PermissionRequest", permissionDecision: "allow", permissionDecisionReason: "Allowed: git hooks directory"}}'
156
+ exit 0
157
+ fi
158
+ exit 0
159
+ ```
160
+
161
+ **Rule of thumb:** PreToolUse = block dangerous actions. PermissionRequest = allow trusted actions that trigger built-in prompts.
162
+
135
163
  ## "Permission prompts still appear for compound commands"
136
164
 
137
165
  This is a known Claude Code limitation, not a hook issue. `Bash(git:*)` doesn't match `cd /path && git log`.
@@ -0,0 +1,29 @@
1
+ #!/bin/bash
2
+ # allow-git-hooks-dir.sh — PermissionRequest hook
3
+ # Trigger: PermissionRequest
4
+ # Matcher: Edit|Write
5
+ #
6
+ # Bypasses the built-in protected-directory prompt for .git/hooks/.
7
+ # PreToolUse hooks can't do this — they run before built-in checks.
8
+ # PermissionRequest runs after, so it can override the prompt.
9
+ #
10
+ # WARNING: Only allow specific subdirectories you trust.
11
+ # Never blanket-allow all of .git/ — that exposes HEAD, config, etc.
12
+
13
+ INPUT=$(cat)
14
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
15
+ [ -z "$FILE_PATH" ] && exit 0
16
+
17
+ # Only allow .git/hooks/ writes (e.g., pre-commit, pre-push)
18
+ if echo "$FILE_PATH" | grep -qE '\.git/hooks/[^/]+$'; then
19
+ jq -n '{
20
+ hookSpecificOutput: {
21
+ hookEventName: "PermissionRequest",
22
+ permissionDecision: "allow",
23
+ permissionDecisionReason: "Allowed: git hooks directory"
24
+ }
25
+ }'
26
+ exit 0
27
+ fi
28
+
29
+ exit 0
package/index.mjs CHANGED
@@ -601,9 +601,12 @@ async function installExample(name) {
601
601
  let matcher = 'Bash';
602
602
 
603
603
  // Detect trigger from header comments
604
- if (content.includes('PostToolUse')) trigger = 'PostToolUse';
605
- if (content.includes('Notification')) trigger = 'Notification';
606
- if (content.includes('Stop')) trigger = 'Stop';
604
+ if (content.includes('TRIGGER: PostToolUse') || content.includes('PostToolUse')) trigger = 'PostToolUse';
605
+ if (content.includes('TRIGGER: Notification') || content.includes('Notification')) trigger = 'Notification';
606
+ if (content.includes('TRIGGER: Stop') || content.includes('Stop')) trigger = 'Stop';
607
+ if (content.includes('TRIGGER: SessionStart') || content.includes('SessionStart')) trigger = 'SessionStart';
608
+ if (content.includes('TRIGGER: PreCompact') || content.includes('PreCompact')) trigger = 'PreCompact';
609
+ if (content.includes('TRIGGER: SessionEnd') || content.includes('SessionEnd')) trigger = 'SessionEnd';
607
610
 
608
611
  // Detect matcher from header
609
612
  const matcherMatch = content.match(/"matcher":\s*"([^"]*)"/);
@@ -5350,7 +5353,7 @@ async function main() {
5350
5353
  console.log(' ' + c.blue + ' --simulate "cmd"' + c.reset + ' Test how hooks react');
5351
5354
  console.log(' ' + c.blue + ' --shield' + c.reset + ' Maximum safety (recommended)');
5352
5355
  console.log();
5353
- console.log(' ' + c.dim + '22 web tools: https://yurukusa.github.io/cc-safe-setup/hub.html' + c.reset);
5356
+ console.log(' ' + c.dim + '23 web tools: https://yurukusa.github.io/cc-safe-setup/hub.html' + c.reset);
5354
5357
  console.log();
5355
5358
  }
5356
5359
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cc-safe-setup",
3
- "version": "28.4.9",
4
- "description": "One command to make Claude Code safe. 336 hooks (8 built-in + 330 examples). 49 CLI commands. 988 tests. 5 languages.",
3
+ "version": "28.6.0",
4
+ "description": "One command to make Claude Code safe. 337 hooks (8 built-in + 331 examples). 49 CLI commands. 996 tests. 5 languages.",
5
5
  "main": "index.mjs",
6
6
  "bin": {
7
7
  "cc-safe-setup": "index.mjs"