cc-safe-setup 2.0.1 → 2.0.3

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/README.md CHANGED
@@ -155,11 +155,13 @@ Or browse all available examples in [`examples/`](examples/):
155
155
  - **network-guard.sh** — Warn on suspicious network commands sending file contents ([#37420](https://github.com/anthropics/claude-code/issues/37420))
156
156
  - **test-before-push.sh** — Block `git push` when tests haven't been run ([#36970](https://github.com/anthropics/claude-code/issues/36970))
157
157
  - **large-file-guard.sh** — Warn when Write tool creates files over 500KB
158
+ - **commit-message-check.sh** — Warn on non-conventional commit messages (feat:, fix:, docs:, etc.)
159
+ - **env-var-check.sh** — Block hardcoded API keys (sk-, ghp_, glpat-) in export commands
158
160
 
159
161
  ## Learn More
160
162
 
161
163
  - [Official Hooks Reference](https://code.claude.com/docs/en/hooks) — Claude Code hooks documentation
162
- - [Hooks Cookbook](https://github.com/yurukusa/claude-code-hooks/blob/main/COOKBOOK.md) — 16 ready-to-use recipes from real GitHub Issues
164
+ - [Hooks Cookbook](https://github.com/yurukusa/claude-code-hooks/blob/main/COOKBOOK.md) — 17 ready-to-use recipes from real GitHub Issues
163
165
  - [Japanese guide (Qiita)](https://qiita.com/yurukusa/items/a9714b33f5d974e8f1e8) — この記事の日本語解説
164
166
  - [The incident that inspired this tool](https://github.com/anthropics/claude-code/issues/36339) — NTFS junction rm -rf
165
167
 
@@ -19,11 +19,13 @@ npx cc-safe-setup --examples
19
19
  | **allowlist.sh** | Block everything not explicitly approved | [#37471](https://github.com/anthropics/claude-code/issues/37471) |
20
20
  | **block-database-wipe.sh** | Block migrate:fresh, DROP DATABASE, Prisma reset | [#37405](https://github.com/anthropics/claude-code/issues/37405) |
21
21
  | **deploy-guard.sh** | Block deploy with uncommitted changes | [#37314](https://github.com/anthropics/claude-code/issues/37314) |
22
+ | **env-var-check.sh** | Block hardcoded API keys in export commands | |
22
23
  | **git-config-guard.sh** | Block git config --global | [#37201](https://github.com/anthropics/claude-code/issues/37201) |
23
24
  | **network-guard.sh** | Warn on suspicious network commands | [#37420](https://github.com/anthropics/claude-code/issues/37420) |
24
25
  | **protect-dotfiles.sh** | Block changes to ~/.bashrc, ~/.aws/, ~/.ssh/ | [#37478](https://github.com/anthropics/claude-code/issues/37478) |
25
26
  | **scope-guard.sh** | Block operations outside project directory | [#36233](https://github.com/anthropics/claude-code/issues/36233) |
26
27
  | **test-before-push.sh** | Block git push without tests | [#36970](https://github.com/anthropics/claude-code/issues/36970) |
28
+ | **timeout-guard.sh** | Warn before long-running commands (servers, watchers) | |
27
29
 
28
30
  ## Auto-Approve
29
31
 
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+ # env-var-check.sh — Warn when setting environment variables with secrets
3
+ #
4
+ # Solves: Claude hardcoding API keys or passwords into export commands
5
+ # that end up in shell history and process environment.
6
+ #
7
+ # Usage: Add to settings.json as a PreToolUse hook
8
+ #
9
+ # {
10
+ # "hooks": {
11
+ # "PreToolUse": [{
12
+ # "matcher": "Bash",
13
+ # "hooks": [{ "type": "command", "command": "~/.claude/hooks/env-var-check.sh" }]
14
+ # }]
15
+ # }
16
+ # }
17
+
18
+ INPUT=$(cat)
19
+ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
20
+
21
+ [[ -z "$COMMAND" ]] && exit 0
22
+
23
+ # Check for export/set with sensitive-looking values
24
+ if echo "$COMMAND" | grep -qiE 'export\s+(API_KEY|SECRET|TOKEN|PASSWORD|CREDENTIALS|AUTH)='; then
25
+ echo "" >&2
26
+ echo "⚠ SECURITY: Setting sensitive environment variable in shell" >&2
27
+ echo "This will appear in shell history. Use .env files or secret managers instead." >&2
28
+ echo "Command: $COMMAND" >&2
29
+ fi
30
+
31
+ # Check for hardcoded key patterns (sk-, pk-, ghp_, etc.)
32
+ if echo "$COMMAND" | grep -qE 'export\s+\w+=.*(sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|gho_[a-zA-Z0-9]{36}|glpat-[a-zA-Z0-9]{20,})'; then
33
+ echo "BLOCKED: Hardcoded API key detected in export command" >&2
34
+ echo "Use: export VAR=\$(cat ~/.credentials/key)" >&2
35
+ exit 2
36
+ fi
37
+
38
+ exit 0
@@ -0,0 +1,63 @@
1
+ #!/bin/bash
2
+ # timeout-guard.sh — Warn before long-running commands
3
+ #
4
+ # Solves: Claude running commands that hang indefinitely
5
+ # (e.g., servers, watchers, interactive tools) without
6
+ # using run_in_background.
7
+ #
8
+ # Usage: Add to settings.json as a PreToolUse hook
9
+ #
10
+ # {
11
+ # "hooks": {
12
+ # "PreToolUse": [{
13
+ # "matcher": "Bash",
14
+ # "hooks": [{ "type": "command", "command": "~/.claude/hooks/timeout-guard.sh" }]
15
+ # }]
16
+ # }
17
+ # }
18
+
19
+ INPUT=$(cat)
20
+ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
21
+
22
+ [[ -z "$COMMAND" ]] && exit 0
23
+
24
+ # Detect commands that typically run forever
25
+ FOREVER_PATTERNS=(
26
+ "npm start"
27
+ "npm run dev"
28
+ "npm run serve"
29
+ "yarn start"
30
+ "yarn dev"
31
+ "python -m http.server"
32
+ "python manage.py runserver"
33
+ "flask run"
34
+ "uvicorn"
35
+ "nodemon"
36
+ "webpack serve"
37
+ "vite"
38
+ "next dev"
39
+ "ng serve"
40
+ "rails server"
41
+ "rails s"
42
+ "php artisan serve"
43
+ "cargo watch"
44
+ "go run.*server"
45
+ "docker-compose up$"
46
+ "tail -f"
47
+ "watch "
48
+ "inotifywait"
49
+ )
50
+
51
+ for pattern in "${FOREVER_PATTERNS[@]}"; do
52
+ if echo "$COMMAND" | grep -qiE "$pattern"; then
53
+ RUN_BG=$(echo "$INPUT" | jq -r '.tool_input.run_in_background // false' 2>/dev/null)
54
+ if [[ "$RUN_BG" != "true" ]]; then
55
+ echo "" >&2
56
+ echo "WARNING: This command may run indefinitely: $pattern" >&2
57
+ echo "Consider using run_in_background: true" >&2
58
+ fi
59
+ break
60
+ fi
61
+ done
62
+
63
+ exit 0
package/index.mjs CHANGED
@@ -183,7 +183,7 @@ function status() {
183
183
  const exampleFiles = [
184
184
  'allowlist.sh', 'auto-approve-build.sh', 'auto-approve-docker.sh',
185
185
  'auto-approve-git-read.sh', 'auto-approve-python.sh', 'auto-approve-ssh.sh',
186
- 'auto-checkpoint.sh', 'auto-snapshot.sh', 'block-database-wipe.sh',
186
+ 'auto-checkpoint.sh', 'auto-snapshot.sh', 'block-database-wipe.sh', 'commit-message-check.sh', 'env-var-check.sh',
187
187
  'deploy-guard.sh', 'edit-guard.sh', 'enforce-tests.sh', 'git-config-guard.sh',
188
188
  'large-file-guard.sh', 'network-guard.sh', 'notify-waiting.sh',
189
189
  'protect-dotfiles.sh', 'scope-guard.sh', 'test-before-push.sh',
@@ -281,10 +281,12 @@ function examples() {
281
281
  'allowlist.sh': 'Block everything not in allowlist (inverse permission model)',
282
282
  'block-database-wipe.sh': 'Block destructive DB commands (migrate:fresh, DROP DATABASE, Prisma)',
283
283
  'deploy-guard.sh': 'Block deploy when uncommitted changes exist',
284
+ 'env-var-check.sh': 'Block hardcoded API keys in export commands',
284
285
  'network-guard.sh': 'Warn on suspicious network commands (data exfiltration)',
285
286
  'protect-dotfiles.sh': 'Block modifications to ~/.bashrc, ~/.aws/, ~/.ssh/',
286
287
  'scope-guard.sh': 'Block file operations outside project directory',
287
288
  'test-before-push.sh': 'Block git push when tests have not passed',
289
+ 'timeout-guard.sh': 'Warn before long-running commands (servers, watchers)',
288
290
  'git-config-guard.sh': 'Block git config --global modifications',
289
291
  },
290
292
  'Auto-Approve': {
@@ -311,7 +313,7 @@ function examples() {
311
313
 
312
314
  console.log();
313
315
  console.log(c.bold + ' cc-safe-setup --examples' + c.reset);
314
- console.log(c.dim + ' 19 hooks beyond the 8 built-in ones' + c.reset);
316
+ console.log(c.dim + ' 22 hooks beyond the 8 built-in ones' + c.reset);
315
317
  console.log();
316
318
 
317
319
  for (const [cat, hooks] of Object.entries(CATEGORIES)) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cc-safe-setup",
3
- "version": "2.0.1",
4
- "description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks + 20 installable examples. Destructive blocker, branch guard, database wipe protection, dotfile guard, and more.",
3
+ "version": "2.0.3",
4
+ "description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks + 22 installable examples. Destructive blocker, branch guard, database wipe protection, dotfile guard, and more.",
5
5
  "main": "index.mjs",
6
6
  "bin": {
7
7
  "cc-safe-setup": "index.mjs"