Skill Tracer
Skills › gstack › careful

careful

skill · 103 lines · MIT · careful/SKILL.md

The facts

Its description

Safety guardrails for destructive commands. (gstack) Triggers: be careful; warn before destructive; safety mode

The description the agent reads to decide when to use it. Phrases the author says should start it.

From its settingsline 4 line 5

When it starts

The agent picks this skill when the person asks it to be careful about destructive commands, to warn before running anything dangerous, or to turn on a safety mode for the session. It is a session-scoped guardrail that hooks every Bash and PowerShell command.

Things a person might say (the model's guesses)

  • “be careful with destructive commands from here on”
  • “warn me before you run anything destructive”
  • “turn on safety mode for this session”

A model's summary of when it is used.

A model's reading

Tools it may use, or may not

allowed-tools: Bash, Read

Tools it may use while it runs without asking you first.

From its settingsline 9

Runs scripts

bin/gstack-paths

Scripts the text names. Found by matching words, so treat them as pointers.

Found by matching wordsline 35

Runs automatically at certain moments

Runs commands automatically at set moments

Hooks run commands at moments such as before a tool is used. The linked line shows them as written.

From its settingsline 12

What leads to it

Other skills that hand off to this one, call it, require it or offer it instead, as a model read them.

A model's reading

Licence

MIT, from LICENSE

The terms its author shares it under, which let it be shown here.

From the repositorylicence text

Other settings

version: 0.1.0

More settings at the top of the file, shown as written.

From its settingsline 3
Other files in this skill (2) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: careful
3version: 0.1.0
4description: Safety guardrails for destructive commands. (gstack)
5triggers:
6 - be careful
7 - warn before destructive
8 - safety mode
9allowed-tools:
10 - Bash
11 - Read
12hooks:
13 PreToolUse:
14 - matcher: "Bash"
15 hooks:
16 - type: command
17 command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/careful/bin/check-careful.sh\""'
18 statusMessage: "Checking for destructive commands..."
19 - matcher: "PowerShell"
20 hooks:
21 - type: command
22 command: 'bash -c "exec bash \"$HOME/.claude/skills/gstack/careful/bin/check-careful.sh\""'
23 statusMessage: "Checking for destructive commands..."
24---
25<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
26<!-- Regenerate: bun run gen:skill-docs -->
28# /careful — Destructive Command Guardrails
30Safety mode is now **active**. Every Bash and PowerShell command will be checked
31for destructive patterns before running. If a destructive command is detected, you'll be warned
32and can choose to proceed or cancel.
34```bash
35GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /gstack-upgrade}"
36mkdir -p "$GSTACK_STATE_ROOT"/analytics
37echo '{"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
38```

<!-- 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.

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
Raw lines 1 to 39
Names a skill gstack :17
Runs code bin/gstack-paths :35
Names a skill gstack-upgrade :35
40## What's protected
42| Pattern | Example | Risk |
43|---------|---------|------|
44| `rm -rf` / `rm -r` / `rm --recursive` | `rm -rf /var/data` | Recursive delete |
45| `DROP TABLE` / `DROP DATABASE` | `DROP TABLE users;` | Data loss |
46| `TRUNCATE` | `TRUNCATE orders;` | Data loss |
47| `git push --force` / `-f` | `git push -f origin main` | History rewrite |
48| `git reset --hard` | `git reset --hard HEAD~3` | Uncommitted work loss |
49| `git checkout .` / `git restore .` | `git checkout .` | Uncommitted work loss |
50| `kubectl delete` | `kubectl delete pod` | Production impact |
51| `docker rm -f` / `docker system prune` | `docker system prune -a` | Container/image loss |

What's protected

PatternExampleRisk
rm -rf / rm -r / rm --recursiverm -rf /var/dataRecursive delete
DROP TABLE / DROP DATABASEDROP TABLE users;Data loss
TRUNCATETRUNCATE orders;Data loss
git push --force / -fgit push -f origin mainHistory rewrite
git reset --hardgit reset --hard HEAD~3Uncommitted work loss
git checkout . / git restore .git checkout .Uncommitted work loss
kubectl deletekubectl delete podProduction impact
docker rm -f / docker system prunedocker system prune -aContainer/image loss
Raw lines 40 to 52
53## PowerShell and cmd (Windows)
55The hook also checks the PowerShell tool (Claude Code's main Windows shell)
56and any `pwsh`/`powershell`/`cmd` launched from Bash. Matching ignores case,
57covers aliases in command position, accepts parameter prefixes (`-r`, `-fo`)
58and strips cmd `^` escapes. All rows above apply there too.
60| Pattern | Example |
61|---------|---------|
62| `Remove-Item`/`rm`/`ri`/`del`/`erase`/`rd`/`rmdir` + `-Recurse` or `-Force` | `gci \| ri -r -fo` |
63| cmd `rd /s`, `rmdir /s`, `del /s`, `erase /s` | `cmd /c rd /s /q C:\proj` |
64| `Format-Volume`, `Clear-Disk`, `Clear-Content`, `[IO.Directory]::Delete`, `[IO.File]::Delete` | `Clear-Disk -Number 1` |
65| `-EncodedCommand`, `iex`, `Start-Process` of a shell, `& $cmd` (can't be inspected) | `irm $url \| iex` |
67**Best-effort on PowerShell.** String matching can't see a command built at
68runtime. For a hard stop, add Claude Code permission deny rules, which parse
69PowerShell and its aliases: `"deny": ["PowerShell(Remove-Item *)"]` in
70`.claude/settings.json`. The hook runs through `bash`, so Windows needs Git Bash.

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.

PatternExample
Remove-Item/rm/ri/del/erase/rd/rmdir + -Recurse or -Force`gci \ri -r -fo`
cmd rd /s, rmdir /s, del /s, erase /scmd /c rd /s /q C:\proj
Format-Volume, Clear-Disk, Clear-Content, [IO.Directory]::Delete, [IO.File]::DeleteClear-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.

Raw lines 53 to 71
72## Safe exceptions
74These patterns are allowed without warning:
75- `rm -rf node_modules` / `.next` / `dist` / `__pycache__` / `.cache` / `build` / `.turbo` / `coverage`

Safe exceptions

These patterns are allowed without warning:

  • rm -rf node_modules / .next / dist / __pycache__ / .cache / build / .turbo / coverage
Raw lines 72 to 76
77## How it works
79The hook reads `tool_name` and the command from the tool input JSON, checks it against the
80patterns above, and returns a `hookSpecificOutput` payload with
81`permissionDecision: "ask"` and a warning reason if a match is found (the
82decision must be nested under `hookSpecificOutput` — Claude Code ignores a
83top-level `permissionDecision`). You can always override a MEDIUM warning and
84proceed.

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.

Raw lines 77 to 85
86## HIGH tier (hard deny)
88Two catastrophic shapes are **denied**, not asked: `rm -r`/`-R` of exactly
89`/`, `~`, or `$HOME`, and force-push to the repo's **default branch**. SIMPLE
90commands only (no `;`, `&&`, `||`, `|`, newline) — compound shapes fall
91through to the MEDIUM ask; `--force-with-lease` is never HIGH. A best-effort
92advisory hard-stop, not a policy boundary: the escape hatch is ending the
93opt-in, session-scoped /careful session.

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.

Raw lines 86 to 94
95## Project patterns (additive only)
97Add warn rules — one POSIX ERE per line, `#` comments OK — in
98`~/.gstack/careful-patterns.txt` (global) or
99`~/.gstack/projects/<slug>/careful-patterns.txt` (per-project). Consulted
100after the built-in families, so config can only ADD rules, never suppress a
101baseline warning. Invalid regex lines are skipped.
103To deactivate, end the conversation or start a new one. Hooks are session-scoped.

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.

Raw lines 95 to 103

From garrytan/gstack at 3f79d81, 2026-11-01. Skills read by DeepSeek V4.1 Flash on 2026-11-04. Summary and techniques by Claude Opus 5.5 on 2026-11-06.