Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add hooks/steve-magne/hookstack/pre-tool-usegit clone --depth 1 https://github.com/steve-magne/hookstackGrade A, and why
PreToolUse scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the commands this hook runs, not an audit. A hook is shell that executes on your machine at the event it names, which is why every command in it is printed with what was found.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/block-curl-pipe-sh.mjs" This is a copy
44% identical to SessionStart — 120 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 123 lines — stays where its author put it; the contents beside it link to each section on GitHub.
{
"PreToolUse": [
{
"hooks": [
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/detect-secrets.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/block-destructive.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/enforce-package-managers.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/block-push-closed-pr.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/block-curl-pipe-sh.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/guard-force-push-any.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/warn-sudo.mjs"
}
],
"matcher": "Bash"
},
{
"hooks": [
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/protect-paths.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/protect-lockfiles.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/pre-write-main-guard.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/pre-write-secret-detection.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/block-generated-paths.mjs"
},
{
"type": "command",
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/env-gitignore-guard.mjs"
}
],
"matcher": "Write|Edit"
},
{
"hooks": [
{
"type": "command",
"command": "node $CWhat this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 123 lines scan A 0b448a8f9116
PreToolUse is a hook published in the GitHub repository steve-magne/hookstack (7 stars, last pushed 8d ago), licensed MIT. Its token cost is not measured: a hook is shell that never enters the context. A static security scan graded it A with 1 finding (makes network calls). It is 44% identical to SessionStart, differing in 120 lines, and is treated as a copy.
Other hooks, from other repositories
PostToolUse
Runs after a tool call finishes for Write and Edit tool calls, executing format_and_lint.sh. From supabase/supabase.
SessionStart
Runs when a session starts on startup, executing install_pkgs.sh. From supabase/supabase.
SessionStart
Runs when a session starts, executing on-start.js via node. From google-gemini/gemini-cli.
PreToolUse
Runs before the agent uses a tool, executing pre-write.sh and pre-bash.sh (2 commands). From anthropics/claude-cookbooks.
SessionStart
Runs when a session starts, executing session-start.sh. From anthropics/claude-cookbooks.
SessionStart
Runs when a session starts on startup, clear and compact, executing run-hook.cmd. From obra/superpowers.