cc-safe-setup 1.9.4 → 1.9.6

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
@@ -151,11 +151,13 @@ Or browse all available examples in [`examples/`](examples/):
151
151
  - **scope-guard.sh** — Block file operations outside project directory — absolute paths, home, parent escapes ([#36233](https://github.com/anthropics/claude-code/issues/36233))
152
152
  - **auto-checkpoint.sh** — Auto-commit after every edit for rollback protection ([#34674](https://github.com/anthropics/claude-code/issues/34674))
153
153
  - **git-config-guard.sh** — Block `git config --global` modifications without consent ([#37201](https://github.com/anthropics/claude-code/issues/37201))
154
+ - **deploy-guard.sh** — Block deploy commands when uncommitted changes exist ([#37314](https://github.com/anthropics/claude-code/issues/37314))
155
+ - **network-guard.sh** — Warn on suspicious network commands sending file contents ([#37420](https://github.com/anthropics/claude-code/issues/37420))
154
156
 
155
157
  ## Learn More
156
158
 
157
159
  - [Official Hooks Reference](https://code.claude.com/docs/en/hooks) — Claude Code hooks documentation
158
- - [Hooks Cookbook](https://github.com/yurukusa/claude-code-hooks/blob/main/COOKBOOK.md) — 15 ready-to-use recipes from real GitHub Issues
160
+ - [Hooks Cookbook](https://github.com/yurukusa/claude-code-hooks/blob/main/COOKBOOK.md) — 16 ready-to-use recipes from real GitHub Issues
159
161
  - [Japanese guide (Qiita)](https://qiita.com/yurukusa/items/a9714b33f5d974e8f1e8) — この記事の日本語解説
160
162
  - [The incident that inspired this tool](https://github.com/anthropics/claude-code/issues/36339) — NTFS junction rm -rf
161
163
 
@@ -17,9 +17,11 @@ Custom hooks beyond the 8 built-in ones. Copy any file to `~/.claude/hooks/` and
17
17
  | **edit-guard.sh** | Block Edit/Write to protected files | [#37210](https://github.com/anthropics/claude-code/issues/37210) |
18
18
  | **enforce-tests.sh** | Warn when source changes without test changes | |
19
19
  | **git-config-guard.sh** | Block git config --global modifications | [#37201](https://github.com/anthropics/claude-code/issues/37201) |
20
+ | **network-guard.sh** | Warn on suspicious network commands (data exfiltration) | [#37420](https://github.com/anthropics/claude-code/issues/37420) |
20
21
  | **notify-waiting.sh** | Desktop notification when Claude waits for input | |
21
22
  | **protect-dotfiles.sh** | Block modifications to ~/.bashrc, ~/.aws/, ~/.ssh/ | [#37478](https://github.com/anthropics/claude-code/issues/37478) |
22
23
  | **scope-guard.sh** | Block file operations outside project directory | [#36233](https://github.com/anthropics/claude-code/issues/36233) |
24
+ | **test-before-push.sh** | Block git push when tests haven't passed | [#36970](https://github.com/anthropics/claude-code/issues/36970) |
23
25
 
24
26
  ## Quick Start
25
27
 
@@ -0,0 +1,53 @@
1
+ #!/bin/bash
2
+ # network-guard.sh — Warn on network commands that send file contents
3
+ #
4
+ # Solves: Prompt injection causing data exfiltration via curl/wget (#37420)
5
+ # This is a warning hook (exit 0), not a blocker (exit 2),
6
+ # because legitimate commands like gh pr create also match.
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/network-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
+ # Skip safe network commands
25
+ if echo "$COMMAND" | grep -qE '^\s*(gh\s|git\s|npm\s|pip\s|curl\s+-s\s+https://api\.|wget\s+-q)'; then
26
+ exit 0
27
+ fi
28
+
29
+ # Warn on commands that POST file contents to external URLs
30
+ if echo "$COMMAND" | grep -qE 'curl\s.*(-d\s+@|-F\s+file=|--data-binary\s+@|--upload-file)'; then
31
+ echo "" >&2
32
+ echo "⚠ SECURITY: curl sending file contents to external URL" >&2
33
+ echo "Command: $COMMAND" >&2
34
+ echo "$(date -Iseconds) NETWORK-WARN: $COMMAND" >> "${HOME}/.claude/security-audit.log" 2>/dev/null
35
+ fi
36
+
37
+ # Warn on wget/curl POST to non-standard domains
38
+ if echo "$COMMAND" | grep -qE 'curl\s.*-X\s*POST' && ! echo "$COMMAND" | grep -qE '(github\.com|api\.anthropic|localhost|127\.0\.0\.1)'; then
39
+ echo "" >&2
40
+ echo "⚠ SECURITY: POST request to external domain" >&2
41
+ echo "Command: $COMMAND" >&2
42
+ echo "$(date -Iseconds) NETWORK-WARN: $COMMAND" >> "${HOME}/.claude/security-audit.log" 2>/dev/null
43
+ fi
44
+
45
+ # Warn on piping sensitive files to network commands
46
+ if echo "$COMMAND" | grep -qE '(cat|base64)\s+.*(\.env|credentials|\.pem|\.key|id_rsa).*\|.*(curl|wget|nc|ncat)'; then
47
+ echo "" >&2
48
+ echo "⚠ SECURITY: Sensitive file piped to network command" >&2
49
+ echo "Command: $COMMAND" >&2
50
+ echo "$(date -Iseconds) NETWORK-WARN: $COMMAND" >> "${HOME}/.claude/security-audit.log" 2>/dev/null
51
+ fi
52
+
53
+ exit 0
@@ -0,0 +1,55 @@
1
+ #!/bin/bash
2
+ # test-before-push.sh — Block git push when tests haven't passed
3
+ #
4
+ # Solves: Claude pushing code that hasn't been tested (#36970)
5
+ #
6
+ # Checks for a test result marker file. If tests haven't been run
7
+ # (or failed), blocks the push.
8
+ #
9
+ # Usage: Add to settings.json as a PreToolUse hook
10
+ #
11
+ # {
12
+ # "hooks": {
13
+ # "PreToolUse": [{
14
+ # "matcher": "Bash",
15
+ # "hooks": [{ "type": "command", "command": "~/.claude/hooks/test-before-push.sh" }]
16
+ # }]
17
+ # }
18
+ # }
19
+
20
+ INPUT=$(cat)
21
+ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null)
22
+
23
+ [[ -z "$COMMAND" ]] && exit 0
24
+
25
+ # Only check git push commands
26
+ if ! echo "$COMMAND" | grep -qE '^\s*git\s+push\b'; then
27
+ exit 0
28
+ fi
29
+
30
+ # Skip if no test framework is detected
31
+ HAS_TESTS=0
32
+ [ -f "package.json" ] && grep -q '"test"' package.json 2>/dev/null && HAS_TESTS=1
33
+ [ -f "pytest.ini" ] || [ -f "pyproject.toml" ] && HAS_TESTS=1
34
+ [ -f "Makefile" ] && grep -q "^test:" Makefile 2>/dev/null && HAS_TESTS=1
35
+
36
+ if (( HAS_TESTS == 0 )); then
37
+ exit 0 # No test framework detected, allow push
38
+ fi
39
+
40
+ # Check for test result marker
41
+ MARKER="/tmp/cc-tests-passed-$(pwd | md5sum | cut -c1-8)"
42
+ if [ -f "$MARKER" ]; then
43
+ # Tests passed within the last hour
44
+ MARKER_AGE=$(( $(date +%s) - $(stat -c %Y "$MARKER" 2>/dev/null || echo 0) ))
45
+ if (( MARKER_AGE < 3600 )); then
46
+ exit 0 # Tests passed recently
47
+ fi
48
+ fi
49
+
50
+ echo "BLOCKED: Run tests before pushing." >&2
51
+ echo "Tests haven't been run (or results are stale)." >&2
52
+ echo "" >&2
53
+ echo "Run your test suite, then try pushing again." >&2
54
+ echo "The test runner should create: $MARKER" >&2
55
+ exit 2
package/index.mjs CHANGED
@@ -292,6 +292,8 @@ function examples() {
292
292
  'auto-checkpoint.sh': 'Auto-commit after edits for rollback protection',
293
293
  'git-config-guard.sh': 'Block git config --global modifications',
294
294
  'deploy-guard.sh': 'Block deploy when uncommitted changes exist',
295
+ 'network-guard.sh': 'Warn on suspicious network commands (data exfiltration)',
296
+ 'test-before-push.sh': 'Block git push when tests have not passed',
295
297
  };
296
298
 
297
299
  console.log();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cc-safe-setup",
3
- "version": "1.9.4",
4
- "description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks + 16 installable examples. Destructive blocker, branch guard, database wipe protection, dotfile guard, and more.",
3
+ "version": "1.9.6",
4
+ "description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks + 18 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"