Skip documentation navigation

Host features

Used by the manifests

FeatureClaude CodeCodexWhere
statusMessage on a command handleryesyesEvery handler in hooks/hooks.json and hooks/codex.json
SessionStart matcher forkyesno: startup, resume, clear, compacthooks/hooks.json
if on a handleryesnohooks/hooks.json shell hooks only
if with a permission rule per handler, such as Bash(cat *), matched against each subcommandyesnohooks/hooks.json: the heredoc-write handlers of check-edit, the jj handlers of check-bash, and the PowerShell handlers
NotebookEdit input: notebook_path, cell_id, new_source, cell_type, edit_modeyesnohooks/hooks.json PreToolUse, read by check-edit.mjs
PowerShell tool with tool_input.commandyesnohooks/hooks.json PreToolUse, read by check-bash.mjs
A matcher with characters outside letters, digits, _, -, |, and , is a regex, so mcp__.* matches every mcp__<server>__<tool> callyesyes: every matcher is a regex, and PreToolUse fires for MCP toolsPreToolUse in both manifests, read by check-tool-text.mjs
PreToolUse on ExitPlanMode (plan, which Claude Code fills from the plan file), on TaskCreate and TaskUpdate (subject, description, activeForm) and on AskUserQuestion (questions[].question, options[].label, options[].description)yesnohooks/hooks.json, read by check-tool-text.mjs
PostToolUse input with duration_ms, and decision: "block", which adds the reason next to the tool resultyesnot usedhooks/hooks.json PostToolUse on Bash|PowerShell, read by check-shell-writes.mjs
PostToolUse updatedToolOutput replaces the Bash output (stdout, stderr, interrupted, isImage, noOutputExpected) that Claude sees; a passing run fires PostToolUse and a failed run fires PostToolUseFailure (checked live with Claude Code 2.1.304 on 2026-10-21)yesnot usedhooks/hooks.json PostToolUse on Bash, read by post-test-filter.mjs
SubagentHandback tool carries the subagent report in tool_input.message (auto mode, v2.1.271 or later)yesnohooks/hooks.json PreToolUse
SubagentStop fires for internal agents, with an empty agent_type when the session has no --agentyesnocheck-reply.mjs skips them
Plugin MCP server file with ${CLAUDE_PLUGIN_ROOT} in argsyesno: see below.mcp.json (Claude Code), .codex-mcp.json (Codex)
${CLAUDE_PLUGIN_ROOT} in plugin skill textyesnot documentedskills/*/SKILL.md, with a relative path for Codex
interface.composerIcon and interface.logon/ayes.codex-plugin/plugin.json
displayName, homepage, repository, and keywordsyesn/a.claude-plugin/plugin.json
Directory listing fields icon, documentationUrl, supportUrl, and privacyPolicyUrl, which Anthropic’s directory reads and Claude Code ignores (checked 2026-10-21)yesn/a.claude-plugin/plugin.json
Marketplace descriptionyesn/a.claude-plugin/marketplace.json

The hooks docs say a handler defined in more than one settings file runs once. They do not say whether two handlers in one plugin with the same command and different if rules both run for one call. When their rules can overlap, check-edit and check-bash claim the call’s tool_use_id, so a second run exits without output.