Redact instead of block
Blocking a dangerous call is the obvious move. The more interesting one is rewriting it.
What follows is an alternative to the one you just built. A teammate ran a curl against the orders API with a live key pasted straight into the command, and it landed in the shell logs. You want commands like that to keep working, just without the key sitting in them.
A PreToolUse hook can return updatedInput to rewrite a call instead of refusing it. A fresh skeleton is waiting at hooks/redact-secrets.js: it already reads the tool call and spots the key, but it returns nothing. Your .claude/settings.json starts empty here, so you will wire this one up from scratch.
This exercise is part of the course
Claude Code in Action
Exercise instructions
- Start Claude Code with
claude. - Ask Claude to finish the skeleton at
hooks/redact-secrets.jsso it masks the key withupdatedInputand lets the command run, echoing back the fields it isn't changing. - Ask Claude to wire that script into
.claude/settings.jsonas aPreToolUsehook matchingBash. - Type
/exitto exit Claude Code.
Hands-on interactive exercise
Turn theory into action with one of our interactive exercises
Start Exercise