Hook Creator

Caution

Hooks fail silently when the wrong output channel is used. additionalContext on a Stop event does nothing — Claude never sees it. decision:"block" on PostToolUse is not a valid field. Getting the event-to-channel mapping wrong means the hook runs and produces zero effect, with no error to debug.

Tip

hook-creator knows all 26 events, 4 hook types, and the full routing matrix. Describe what you want in plain language — it picks the right event, output channel, and schema, then delivers a working file with fail-safe error handling included.

Quick reference

FieldValue
Trigger”create hook”, “PreToolUse hook”, “Stop hook”, “hook doesn’t work”, “debug hook”
Modelopus
ToolsRead, Write, Edit, Glob, Grep, Bash, WebFetch, WebSearch
OutputHook file (.sh or .mjs) + config snippet + verification checklist

When to use

  • Create a new hook — you know what you want the hook to do, but not which event or output format to use
  • Debug a broken hook — the hook runs but Claude ignores it, or the session is stuck
  • Validate an existing hook — check routing, schema, fail-safe, and stop_hook_active guard
  • Choose a hook type — unsure whether to use command, http, prompt, or agent hook
  • Add context injection — inject project rules, mode state, or subagent instructions at session or tool boundaries

Examples

"Create a PreToolUse hook that blocks `rm -rf` commands"
"My Stop hook keeps blocking the session even after the task finishes.
 The hook checks a state file but the session never exits."
"Write a SessionStart hook that injects the contents of .project-rules.md
 into every new session as additionalContext"

Flow

  1. Clarify intent

    Asks which event, which behavior (block / inject / modify / log), and where the hook config should live (project settings, global settings, or plugin hooks.json). Skips questions when intent is unambiguous.

  2. Select event and channel

    Applies the routing matrix — picks the correct event from 26 options and the right output channel (additionalContext, updatedInput, permissionDecision, decision) for your goal. Wrong channel = silent failure, so this step is non-negotiable.

  3. Generate the hook file

    Writes a .sh (bash) or .mjs (Node.js) file from a production template. Always includes: stdin parsing, try/catch with output({}) fallback, stop_hook_active guard for Stop/SubagentStop hooks, and correct shebang.

  4. Generate the config snippet

    Produces the exact JSON block to paste into your target config file (settings.json, settings.local.json, or hooks.json). Includes matcher, hook type, and command path.

  5. Deliver verification checklist

    Lists what to confirm: shebang, fail-safe catch, schema validity, executable bit, performance (<1s for blocking hooks). For debugging sessions, runs the hook manually with test input and explains what each output field does.

Event catalogue and routing matrix (expand for reference)

Output channel by event

GoalChannelEvent
Inject context for ClaudeadditionalContextSessionStart, PreToolUse, UserPromptSubmit
Inject into subagent promptupdatedInput.promptPreToolUse (matcher: Task)
Block tool executionpermissionDecision:"deny"PreToolUse
Block session stopdecision:"block" + reasonStop
Post-tool feedbackadditionalContextPostToolUse
Modify tool parametersupdatedInputPreToolUse
Show user warning (Claude does NOT see)systemMessageAny
Auto-allow permissiondecision.behavior:"allow"PermissionRequest
Control teammates{continue, stopReason} JSONTeammateIdle, TaskCompleted, TaskCreated

All 26 events

EventBlocking?Key use
SessionStartNoContext injection on start/resume
UserPromptSubmitYesGate or modify user prompts
PreToolUseYesAllow / deny / modify tool calls
PermissionRequestYesAuto-allow or auto-deny permission dialogs
PostToolUseNoFeedback after tool completes
PostToolUseFailureNoReact to failed tool call
SubagentStartNoInject into subagent context
SubagentStopYesBlock subagent exit
StopYesBlock session exit until condition met
PreCompactNoWrite handoff before auto-compact
PostCompactNoReact after compact
NotificationNoLog or react to notifications
TeammateIdleYesControl agent team flow
TaskCompletedYesAccept or re-assign tasks
TaskCreatedYesIntercept new tasks
ConfigChangeYesReact to settings file changes
InstructionsLoadedNoTrack CLAUDE.md / rules file loads
FileChangedNoReact to file system changes
CwdChangedNoReact to directory changes
WorktreeCreateYesIntercept worktree creation
WorktreeRemoveNoReact to worktree removal
StopFailureNoReact to rate-limit / API errors
ElicitationYesAuto-fill MCP forms
ElicitationResultYesPost-elicitation hook
SessionEndNoCleanup on session close
PermissionDeniedYesRetry after auto-mode denial (v2.1.89+)

Hook types

TypeTimeoutWhen to use
command600sShell/Node script — deterministic, file I/O, external tools
http600sPOST JSON to external API or webhook (v2.1.63+)
prompt30sSingle Haiku LLM call for natural-language validation
agent60sMulti-step analysis with Read/Grep/Glob access

agent-type hooks spawn a subagent. The spawned subagent inherits the session’s permissionMode. Never configure the parent session with --dangerously-skip-permissions just to avoid hook permission prompts — use a narrow permissionMode: acceptEdits on the hook’s agent definition instead.

📄

Brewcode overview

All brewcode agents and skills — hooks live here in the plugin’s hooks/ directory.

🔗

GitHub source

Agent definition with full routing matrix, templates, and validation checklist.

🔧

BC Coordinator

The task coordination agent — uses hooks for phase gating and knowledge injection.

Updating plugins

Use /brewtools:plugin-update to check and update the brewcode plugin suite in one command. See the FAQ for details.