careful — Claude Code skill: what it does, how to install
Intercepts Bash and PowerShell commands before execution to catch destructive actions like forced git pushes or database drops. Useful when giving agents terminal access.
npx skills add garrytan/gstack --skill careful -a claude-codeWhat careful does
The skill attaches a PreToolUse hook to Bash and PowerShell calls, executing check-careful.sh before any command runs. It scans commands against dangerous patterns such as DROP TABLE, TRUNCATE, git reset --hard, kubectl delete, and rm -rf. When a match appears, Claude Code prompts you to confirm or cancel. Safe build artifacts like node_modules, .next, dist, and build pass through without warnings.
Two catastrophic actions face a hard block instead of a confirmation prompt: deleting /, ~, or $HOME, and force-pushing to the default repository branch. You can also add project-specific regex rules to ~/.gstack/careful-patterns.txt.
Do not treat this hook as an unbreakable boundary on PowerShell because static string matching misses commands built dynamically at runtime. On Windows, running the hook requires Git Bash.
What it helps with
- Stop accidental file deletion through
rm -rfin the terminal - Block destructive database queries like
DROP TABLEandTRUNCATE - Prevent loss of uncommitted work from
git reset --hardand forced pushes - Halt risky container cleanup via
docker system pruneorkubectl delete
Example prompts for the agent
- Turn on safety mode before running shell commands
- Run `/careful` to guard against destructive actions
- Warn me before running any destructive commands in the terminal
How to install careful
1Skills CLI (Vercel)
npx skills add garrytan/gstack --skill careful -a claude-code2Manually: put the files in place
~/.claude/skills/careful/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/careful/
1Skills CLI (Vercel)
npx skills add garrytan/gstack --skill careful -a codex2Manually: put the files in place
.agents/skills/careful/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add garrytan/gstack --skill careful -a cursor2Manually: put the files in place
.cursor/skills/careful/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install garrytan/gstack careful2Manually: put the files in place
.github/skills/careful/SKILL.md1Skills CLI (Vercel)
npx skills add garrytan/gstack --skill careful -a gemini-cli2Platform CLI
gemini skills install https://github.com/garrytan/gstack --path carefulManually: put the files in place
.devin/skills/careful/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add garrytan/gstack --skill careful -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set12
The whole set →Similar
Questions about careful
How do I install careful in Claude Code?
Run npx skills add garrytan/gstack --skill careful -a claude-code in your terminal.
What does the careful skill do?
It inspects Bash and PowerShell commands before execution and prompts for approval whenever a command risks data loss, file deletion, or Git history overwrites.
Does careful work on Windows?
Yes, but it requires Git Bash to run the hook script. For reliable enforcement against PowerShell commands, configure explicit deny rules in .claude/settings.json.
Source text
SKILL.md · MIT
---
name: careful
version: 0.1.0
description: Safety guardrails for destructive commands. (gstack)
triggers:
- be careful
- warn before destructive
- safety mode
allowed-tools:
- Bash
- Read
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/careful/bin/check-careful.sh\""'
statusMessage: "Checking for destructive commands..."
- matcher: "PowerShell"
hooks:
- type: command
command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/careful/bin/check-careful.sh\""'
statusMessage: "Checking for destructive commands..."
---
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->
# /careful — Destructive Command Guardrails
Safety mode is now **active**. Every Bash and PowerShell command will be checked
for destructive patterns before running. If a destructive command is detected, you'll be warned
and can choose to proceed or cancel.
```bash
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /gstack-upgrade}"
mkdir -p "$GSTACK_STATE_ROOT"/analytics
echo '{"skill":"careful","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> "$GSTACK_STATE_ROOT"/analytics/skill-usage.jsonl 2>/dev/null || true
```
## What's protected
| Pattern | Example | Risk |
|---------|---------|------|
| `rm -rf` / `rm -r` / `rm --recursive` | `rm -rf /var/data` | Recursive delete |
| `DROP TABLE` / `DROP DATABASE` | `DROP TABLE users;` | Data loss |
| `TRUNCATE` | `TRUNCATE orders;` | Data loss |
| `git push --force` / `-f` | `git push -f origin main` | History rewrite |
| `git reset --hard` | `git reset --hard HEAD~3` | Uncommitted work loss |
| `git checkout .` / `git restore .` | `git checkout .` | Uncommitted work loss |
| `kubectl delete` | `kubectl delete pod` | Production impact |
| `docker rm -f` / `docker system prune` | `docker system prune -a` | Container/image loss |
## PowerShell and cmd (Windows)
The hook also checks the PowerShell tool (Claude Code's main Windows shell)
and any `pwsh`/`powershell`/`cmd` launched from Bash. Matching ignores case,
covers aliases in command position, accepts parameter prefixes (`-r`, `-fo`)
and strips cmd `^` escapes. All rows above apply there too.
| Pattern | Example |
|---------|---------|
| `Remove-Item`/`rm`/`ri`/`del`/`erase`/`rd`/`rmdir` + `-Recurse` or `-Force` | `gci \| ri -r -fo` |
| cmd `rd /s`, `rmdir /s`, `del /s`, `erase /s` | `cmd /c rd /s /q C:\proj` |
| `Format-Volume`, `Clear-Disk`, `Clear-Content`, `[IO.Directory]::Delete`, `[IO.File]::Delete` | `Clear-Disk -Number 1` |
| `-EncodedCommand`, `iex`, `Start-Process` of a shell, `& $cmd` (can't be inspected) | `irm $url \| iex` |
**Best-effort on PowerShell.** String matching can't see a command built at
runtime. For a hard stop, add Claude Code permission deny rules, which parse
PowerShell and its aliases: `"deny": ["PowerShell(Remove-Item *)"]` in
`.claude/settings.json`. The hook runs through `bash`, so Windows needs Git Bash.
## Safe exceptions
These patterns are allowed without warning:
- `rm -rf node_modules` / `.next` / `dist` / `__pycache__` / `.cache` / `build` / `.turbo` / `coverage`
## How it works
The hook reads `tool_name` and the command from the tool input JSON, checks it against the
patterns above, and returns a `hookSpecificOutput` payload with
`permissionDecision: "ask"` and a warning reason if a match is found (the
decision must be nested under `hookSpecificOutput` — Claude Code ignores a
top-level `permissionDecision`). You can always override a MEDIUM warning and
proceed.
## HIGH tier (hard deny)
Two catastrophic shapes are **denied**, not asked: `rm -r`/`-R` of exactly
`/`, `~`, or `$HOME`, and force-push to the repo's **default branch**. SIMPLE
commands only (no `;`, `&&`, `||`, `|`, newline) — compound shapes fall
through to the MEDIUM ask; `--force-with-lease` is never HIGH. A best-effort
advisory hard-stop, not a policy boundary: the escape hatch is ending the
opt-in, session-scoped /careful session.
## Project patterns (additive only)
Add warn rules — one POSIX ERE per line, `#` comments OK — in
`~/.gstack/careful-patterns.txt` (global) or
`~/.gstack/projects/<slug>/careful-patterns.txt` (per-project). Consulted
after the built-in families, so config can only ADD rules, never suppress a
baseline warning. Invalid regex lines are skipped.
To deactivate, end the conversation or start a new one. Hooks are session-scoped.
© garrytan · MIT · garrytan/gstack