All skills
Skillintermediate

AI Coding Assistant Hook System Comparison

A comprehensive comparison of hook/extensibility features across Claude Code, Cursor, Gemini CLI, and Codex CLI.

Claude Code Knowledge Pack7/10/2026

Overview

AI Coding Assistant Hook System Comparison

A comprehensive comparison of hook/extensibility features across Claude Code, Cursor, Gemini CLI, and Codex CLI.

Last Updated: January 2026


Hook Event Support

Event TypeClaude CodeCursorGemini CLICodex CLI
Pre-tool execution✅ PreToolUse✅ beforeShellExecution, beforeMCPExecution, beforeReadFile✅ BeforeTool
Post-tool execution✅ PostToolUse✅ afterShellExecution, afterMCPExecution, afterFileEdit✅ AfterTool
Tool failure✅ PostToolUseFailure
Permission request✅ PermissionRequest❌ (use beforeShell)✅ Notification (ToolPermission)
User prompt submit✅ UserPromptSubmit✅ beforeSubmitPrompt (beta)✅ BeforeAgent
Agent stop✅ Stop✅ stop✅ AfterAgent
Subagent start✅ SubagentStart
Subagent stop✅ SubagentStop
Session start✅ SessionStart✅ SessionStart
Session end✅ SessionEnd✅ SessionEnd
Pre-compaction✅ PreCompact✅ PreCompress
Notification✅ Notification✅ Notification✅ notify (limited)
Pre-model (LLM request)✅ BeforeModel
Post-model (LLM response)✅ AfterModel
Tool selection✅ BeforeToolSelection
Agent thought/reasoning✅ afterAgentThought
Tab completions✅ beforeTabFileRead, afterTabFileEdit

Total Events: Claude Code: 11 | Cursor: 10 | Gemini CLI: 11 | Codex CLI: 1


Hook Capabilities

CapabilityClaude CodeCursorGemini CLICodex CLI
Block operations✅ Exit 2 or JSON deny✅ permission: deny✅ Exit 2 or JSON deny
Allow operations✅ permissionDecision: allow✅ permission: allow✅ decision: allow
Prompt user✅ permissionDecision: ask✅ permission: ask✅ decision: ask
Modify tool input✅ updatedInput✅ (via deny + reason)
Inject context to agent✅ additionalContext (UserPromptSubmit)✅ agent_message✅ additionalContext
Message to user only✅ systemMessage✅ user_message✅ systemMessage
Force agent continuation✅ Stop hook block✅ followup_message✅ AfterAgent block
Modify LLM request✅ llm_request
Modify LLM response✅ llm_response
Filter available tools✅ toolConfig

Configuration

AspectClaude CodeCursorGemini CLICodex CLI
Config formatJSONJSONJSONTOML
User config~/.claude/settings.json~/.cursor/hooks.json~/.gemini/settings.json~/.codex/config.toml
Project config.claude/settings.json.cursor/hooks.json.gemini/settings.json.codex/config.toml
Hook type: command✅ (notify only)
Hook type: prompt (LLM)✅ (Haiku)
Tool matchers✅ Regex (`Write\Edit`)❌ Global only✅ Regex (`write_file\
Timeout config✅ Per-hook✅ Per-hookN/A
Hot reload❌ Restart required❌ Restart requiredN/A

Communication Protocol

AspectClaude CodeCursorGemini CLICodex CLI
Input methodstdin JSONstdin JSONstdin JSONstdin JSON
Output methodstdout JSONstdout JSONstdout JSONN/A
Exit 0Success, parse JSONSuccess, parse JSONSuccess, parse JSONN/A
Exit 2Block with stderr messageNot documentedBlock with stderr messageN/A
Other exitNon-blocking warningNot documentedNon-blocking warningN/A
Invalid JSON fallbackTreat as plain textTreat as plain textTreat as systemMessageN/A

Input JSON Schema (Common Fields)

FieldClaude CodeCursorGemini CLICodex CLI
session_id✅ conversation_id
hook_event_name
cwd✅ (may be empty)
tool_name✅ (in specific hooks)
tool_input
tool_result✅ (PostToolUse)✅ result_json✅ tool_response
transcript_path
timestamp
user_prompt✅ (UserPromptSubmit)✅ prompt✅ prompt

Output JSON Schema

FieldClaude CodeCursorGemini CLICodex CLI
Permission decisionhookSpecificOutput.permissionDecisionpermissiondecisionN/A
Reason for agentpermissionDecisionReasonagent_messagereasonN/A
Message for usersystemMessageuser_messagesystemMessageN/A
Modified inputhookSpecificOutput.updatedInputN/A
Context injectionhookSpecificOutput.additionalContextagent_messagehookSpecificOutput.additionalContextN/A
Stop processingcontinue: falsecontinue: falsecontinue: falseN/A
Suppress outputsuppressOutput: truesuppressOutput: trueN/A

Tool Names

Tool TypeClaude CodeCursorGemini CLICodex CLI
ShellBashN/A (beforeShellExecution)run_shell_commandshell_tool
Read fileReadN/A (beforeReadFile)read_file, read_many_filesBuilt-in
Write fileWriteN/A (afterFileEdit)write_fileBuilt-in
Edit fileEdit, MultiEditN/A (afterFileEdit)replaceapply_patch
Search filesGlobN/AglobBuilt-in
Search contentGrepN/Asearch_file_contentBuilt-in
Web fetchWebFetchN/Aweb_fetchBuilt-in
Web searchWebSearchN/Agoogle_web_searchweb_search
MCP toolsmcp__<server>__<tool><server>__<tool>mcp__<server>__<tool>mcp__<server>__<tool>

Execution Model

AspectClaude CodeCursorGemini CLICodex CLI
ExecutionParallel (all matching)Sequential (first only*)SynchronousN/A
Hook orderingNon-deterministicFirst in arrayConcatenated by priorityN/A
Conflicting decisionsLast write wins (undefined)N/ANot documentedN/A
Default timeout60s (command), 30s (prompt)Not documented60sN/A
Max timeoutConfigurableNot documentedConfigurableN/A

*Cursor has a known bug where only the first hook in an array executes.


Platform Support

PlatformClaude CodeCursorGemini CLICodex CLI
macOS✅ Full✅ Full✅ Full✅ Full
Linux✅ Full✅ Full✅ Full✅ Full
Windows✅ Full⚠️ Issues (Git Bash, PowerShell)✅ Full⚠️ Experimental

Known Issues Summary

Issue TypeClaude CodeCursorGemini CLICodex CLI
Hook not firingRegression v2.0.27-v2.0.31Multiple hooks bugIssue #13155N/A (no hooks)
Race conditionsPermissionRequest dialogN/AN/AN/A
Field name changesLegacy decisionpermissionDecisioncamelCase→snake_case (v2.0)N/AN/A
Windows issuesNone majorGit Bash/PowerShell injectionNone majorWSL recommended
PerformanceHooks stop after ~2.5h (log growth)beforeTabFileRead slow on WindowsN/ALD_LIBRARY_PATH regression (fixed)

Unique Features

FeatureClaude CodeCursorGemini CLICodex CLI
LLM-evaluated hooks✅ type: prompt
Subagent hooks✅ SubagentStart/Stop
Model request hooks✅ BeforeModel/AfterModel
Tool selection hooks