cc-safe-setup 2.0.4 → 2.0.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 +2 -0
- package/examples/README.md +2 -0
- package/examples/path-traversal-guard.sh +44 -0
- package/examples/todo-check.sh +49 -0
- package/index.mjs +5 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -158,6 +158,8 @@ Or browse all available examples in [`examples/`](examples/):
|
|
|
158
158
|
- **commit-message-check.sh** — Warn on non-conventional commit messages (feat:, fix:, docs:, etc.)
|
|
159
159
|
- **env-var-check.sh** — Block hardcoded API keys (sk-, ghp_, glpat-) in export commands
|
|
160
160
|
- **timeout-guard.sh** — Warn before long-running commands (npm start, rails s, docker-compose up)
|
|
161
|
+
- **branch-name-check.sh** — Warn on non-conventional branch names (feature/, fix/, etc.)
|
|
162
|
+
- **todo-check.sh** — Warn when committing files with TODO/FIXME/HACK markers
|
|
161
163
|
|
|
162
164
|
## Learn More
|
|
163
165
|
|
package/examples/README.md
CHANGED
|
@@ -22,6 +22,7 @@ npx cc-safe-setup --examples
|
|
|
22
22
|
| **env-var-check.sh** | Block hardcoded API keys in export commands | |
|
|
23
23
|
| **git-config-guard.sh** | Block git config --global | [#37201](https://github.com/anthropics/claude-code/issues/37201) |
|
|
24
24
|
| **network-guard.sh** | Warn on suspicious network commands | [#37420](https://github.com/anthropics/claude-code/issues/37420) |
|
|
25
|
+
| **path-traversal-guard.sh** | Block Edit/Write with ../ path traversal | |
|
|
25
26
|
| **protect-dotfiles.sh** | Block changes to ~/.bashrc, ~/.aws/, ~/.ssh/ | [#37478](https://github.com/anthropics/claude-code/issues/37478) |
|
|
26
27
|
| **scope-guard.sh** | Block operations outside project directory | [#36233](https://github.com/anthropics/claude-code/issues/36233) |
|
|
27
28
|
| **test-before-push.sh** | Block git push without tests | [#36970](https://github.com/anthropics/claude-code/issues/36970) |
|
|
@@ -46,6 +47,7 @@ npx cc-safe-setup --examples
|
|
|
46
47
|
| **edit-guard.sh** | Block Edit/Write to protected files | [#37210](https://github.com/anthropics/claude-code/issues/37210) |
|
|
47
48
|
| **enforce-tests.sh** | Warn when source changes without tests | |
|
|
48
49
|
| **large-file-guard.sh** | Warn when Write creates files >500KB | |
|
|
50
|
+
| **todo-check.sh** | Warn when committing files with TODO/FIXME | |
|
|
49
51
|
|
|
50
52
|
## Recovery
|
|
51
53
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# path-traversal-guard.sh — Block path traversal in Edit/Write operations
|
|
3
|
+
#
|
|
4
|
+
# Solves: Claude writing files using ../../../ to escape the project
|
|
5
|
+
# directory via Edit/Write tools (not caught by scope-guard which
|
|
6
|
+
# only watches Bash commands).
|
|
7
|
+
#
|
|
8
|
+
# Usage: Add to settings.json as a PreToolUse hook
|
|
9
|
+
#
|
|
10
|
+
# {
|
|
11
|
+
# "hooks": {
|
|
12
|
+
# "PreToolUse": [{
|
|
13
|
+
# "matcher": "Edit|Write",
|
|
14
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/path-traversal-guard.sh" }]
|
|
15
|
+
# }]
|
|
16
|
+
# }
|
|
17
|
+
# }
|
|
18
|
+
|
|
19
|
+
INPUT=$(cat)
|
|
20
|
+
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
|
|
21
|
+
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
|
|
22
|
+
|
|
23
|
+
[[ "$TOOL" != "Edit" && "$TOOL" != "Write" ]] && exit 0
|
|
24
|
+
[[ -z "$FILE" ]] && exit 0
|
|
25
|
+
|
|
26
|
+
# Block path traversal patterns
|
|
27
|
+
if echo "$FILE" | grep -qE '\.\./\.\./|/\.\.\./'; then
|
|
28
|
+
echo "BLOCKED: Path traversal detected: $FILE" >&2
|
|
29
|
+
exit 2
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Block writing to system directories
|
|
33
|
+
if echo "$FILE" | grep -qE '^/(etc|usr|bin|sbin|var|boot|proc|sys)/'; then
|
|
34
|
+
echo "BLOCKED: Cannot write to system directory: $FILE" >&2
|
|
35
|
+
exit 2
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Block writing to other users' home directories
|
|
39
|
+
if echo "$FILE" | grep -qE '^/home/[^/]+/' && ! echo "$FILE" | grep -qE "^$HOME/"; then
|
|
40
|
+
echo "BLOCKED: Cannot write to another user's directory: $FILE" >&2
|
|
41
|
+
exit 2
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
exit 0
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# todo-check.sh — Warn when committing files with TODO/FIXME/HACK comments
|
|
3
|
+
#
|
|
4
|
+
# PostToolUse hook that checks after git commit for remaining
|
|
5
|
+
# TODO/FIXME/HACK markers in the committed files.
|
|
6
|
+
#
|
|
7
|
+
# Usage: Add to settings.json as a PostToolUse hook
|
|
8
|
+
#
|
|
9
|
+
# {
|
|
10
|
+
# "hooks": {
|
|
11
|
+
# "PostToolUse": [{
|
|
12
|
+
# "matcher": "Bash",
|
|
13
|
+
# "hooks": [{ "type": "command", "command": "~/.claude/hooks/todo-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
|
+
# Only check after git commit
|
|
24
|
+
if ! echo "$COMMAND" | grep -qE '^\s*git\s+commit\b'; then
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Must be in a git repo
|
|
29
|
+
git rev-parse --git-dir &>/dev/null || exit 0
|
|
30
|
+
|
|
31
|
+
# Check committed files for TODO/FIXME/HACK
|
|
32
|
+
COMMITTED_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD 2>/dev/null)
|
|
33
|
+
[[ -z "$COMMITTED_FILES" ]] && exit 0
|
|
34
|
+
|
|
35
|
+
TODO_COUNT=0
|
|
36
|
+
while IFS= read -r file; do
|
|
37
|
+
if [ -f "$file" ]; then
|
|
38
|
+
MATCHES=$(grep -cnE '\bTODO\b|\bFIXME\b|\bHACK\b|\bXXX\b' "$file" 2>/dev/null || echo 0)
|
|
39
|
+
TODO_COUNT=$((TODO_COUNT + MATCHES))
|
|
40
|
+
fi
|
|
41
|
+
done <<< "$COMMITTED_FILES"
|
|
42
|
+
|
|
43
|
+
if (( TODO_COUNT > 0 )); then
|
|
44
|
+
echo "" >&2
|
|
45
|
+
echo "NOTE: $TODO_COUNT TODO/FIXME/HACK markers in committed files." >&2
|
|
46
|
+
echo "Run: git diff-tree --no-commit-id --name-only -r HEAD | xargs grep -n 'TODO\|FIXME\|HACK'" >&2
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
exit 0
|
package/index.mjs
CHANGED
|
@@ -183,10 +183,10 @@ 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', 'commit-message-check.sh', 'env-var-check.sh',
|
|
186
|
+
'auto-checkpoint.sh', 'auto-snapshot.sh', 'block-database-wipe.sh', 'branch-name-check.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
|
-
'protect-dotfiles.sh', 'scope-guard.sh', 'test-before-push.sh', 'timeout-guard.sh',
|
|
189
|
+
'protect-dotfiles.sh', 'scope-guard.sh', 'test-before-push.sh', 'timeout-guard.sh', 'todo-check.sh',
|
|
190
190
|
];
|
|
191
191
|
const installedExamples = exampleFiles.filter(f => existsSync(join(HOOKS_DIR, f)));
|
|
192
192
|
if (installedExamples.length > 0) {
|
|
@@ -283,6 +283,7 @@ function examples() {
|
|
|
283
283
|
'deploy-guard.sh': 'Block deploy when uncommitted changes exist',
|
|
284
284
|
'env-var-check.sh': 'Block hardcoded API keys in export commands',
|
|
285
285
|
'network-guard.sh': 'Warn on suspicious network commands (data exfiltration)',
|
|
286
|
+
'path-traversal-guard.sh': 'Block Edit/Write with path traversal (../../)',
|
|
286
287
|
'protect-dotfiles.sh': 'Block modifications to ~/.bashrc, ~/.aws/, ~/.ssh/',
|
|
287
288
|
'scope-guard.sh': 'Block file operations outside project directory',
|
|
288
289
|
'test-before-push.sh': 'Block git push when tests have not passed',
|
|
@@ -302,6 +303,7 @@ function examples() {
|
|
|
302
303
|
'edit-guard.sh': 'Block Edit/Write to protected files (.env, credentials)',
|
|
303
304
|
'enforce-tests.sh': 'Warn when source files change without test files',
|
|
304
305
|
'large-file-guard.sh': 'Warn when Write creates files over 500KB',
|
|
306
|
+
'todo-check.sh': 'Warn when committing files with TODO/FIXME markers',
|
|
305
307
|
},
|
|
306
308
|
'Recovery': {
|
|
307
309
|
'auto-checkpoint.sh': 'Auto-commit after edits for rollback protection',
|
|
@@ -314,7 +316,7 @@ function examples() {
|
|
|
314
316
|
|
|
315
317
|
console.log();
|
|
316
318
|
console.log(c.bold + ' cc-safe-setup --examples' + c.reset);
|
|
317
|
-
console.log(c.dim + '
|
|
319
|
+
console.log(c.dim + ' 25 hooks beyond the 8 built-in ones' + c.reset);
|
|
318
320
|
console.log();
|
|
319
321
|
|
|
320
322
|
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.
|
|
4
|
-
"description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks +
|
|
3
|
+
"version": "2.0.6",
|
|
4
|
+
"description": "One command to make Claude Code safe for autonomous operation. 8 built-in hooks + 25 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"
|