Skip to Content
HooksHooks 体系

Hooks 体系

概述

Claude Code 中有两种 “Hook” 概念:

  1. React Hooks:70+ 自定义 Hook,管理组件逻辑和副作用
  2. Shell Hooks:用户配置的外部命令,在特定事件触发时执行

React Hooks

核心交互 Hooks

Hook文件说明
useTextInputhooks/useTextInput.ts文本输入管理
useVimInputhooks/useVimInput.tsVim 模式输入
usePasteHandlerhooks/usePasteHandler.ts粘贴处理
useSearchInputhooks/useSearchInput.ts搜索输入
usePromptSuggestionhooks/usePromptSuggestion.ts提示建议
useInputBufferhooks/useInputBuffer.ts输入缓冲

工具相关 Hooks

Hook文件说明
useCanUseToolhooks/useCanUseTool.ts工具权限判断
useMergedToolshooks/useMergedTools.ts合并内置+MCP+插件工具
useMergedCommandshooks/useMergedCommands.ts合并斜杠命令
useMergedClientshooks/useMergedClients.ts合并 MCP 客户端
useManagePluginshooks/useManagePlugins.ts插件管理

对话/查询 Hooks

Hook文件说明
useMainLoopModelhooks/useMainLoopModel.ts主循环模型选择
useAssistantHistoryhooks/useAssistantHistory.ts助手历史
useHistorySearchhooks/useHistorySearch.ts历史搜索
useCommandQueuehooks/useCommandQueue.ts命令队列

任务/Agent Hooks

Hook文件说明
useTasksV2hooks/useTasksV2.ts任务系统 V2
useTaskListWatcherhooks/useTaskListWatcher.ts任务列表监听
useSwarmInitializationhooks/useSwarmInitialization.tsSwarm 初始化
useSwarmPermissionPollerhooks/useSwarmPermissionPoller.tsSwarm 权限轮询
useRemoteSessionhooks/useRemoteSession.ts远程会话
useSSHSessionhooks/useSSHSession.tsSSH 会话

IDE/桥接 Hooks

Hook文件说明
useIdeConnectionStatushooks/useIdeConnectionStatus.tsIDE 连接状态
useIdeSelectionhooks/useIdeSelection.tsIDE 选中内容
useIdeAtMentionedhooks/useIdeAtMentioned.tsIDE @提及
useIdeLogginghooks/useIdeLogging.tsIDE 日志
useDirectConnecthooks/useDirectConnect.ts直连模式
useDiffInIDEhooks/useDiffInIDE.tsIDE Diff 展示

UI/渲染 Hooks

Hook文件说明
useVirtualScrollhooks/useVirtualScroll.ts虚拟滚动
useTerminalSizehooks/useTerminalSize.ts终端尺寸
useBlinkhooks/useBlink.ts光标闪烁
useElapsedTimehooks/useElapsedTime.ts计时器
useCopyOnSelecthooks/useCopyOnSelect.ts选中复制

设置/配置 Hooks

Hook文件说明
useSettingshooks/useSettings.ts设置读写
useSettingsChangehooks/useSettingsChange.ts设置变更监听
useDynamicConfighooks/useDynamicConfig.ts动态配置

定时/调度 Hooks

Hook文件说明
useScheduledTaskshooks/useScheduledTasks.ts定时任务
useTimeouthooks/useTimeout.ts超时处理
useNotifyAfterTimeouthooks/useNotifyAfterTimeout.ts超时通知
useMinDisplayTimehooks/useMinDisplayTime.ts最小展示时间

其他 Hooks

Hook说明
useCancelRequest取消请求
useClipboardImageHint剪贴板图片提示
useDiffDataDiff 数据
useDoublePress双击检测
useExitOnCtrlCDCtrl+C/D 退出
useFileHistorySnapshotInit文件历史快照
useAwaySummary离线摘要
useBackgroundTaskNavigation后台任务导航
useInboxPoller收件箱轮询
useMailboxBridge邮箱桥接
useMemoryUsage内存使用
usePrStatusPR 状态
useSessionBackgrounding会话后台化
useTeammateViewAutoExit队友视图自动退出
useUpdateNotification更新通知
useVoice语音输入
useVoiceEnabled语音启用状态
useLogMessages日志消息
useIssueFlagBannerIssue 标记横幅
useSkillImprovementSurvey技能改进调查
useSkillsChange技能变更
useDeferredHookMessages延迟 Hook 消息

Shell Hooks

用户可以在 .claude/settings.json 中配置 Shell Hooks:

{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "command": "echo 'Running: $COMMAND'", "timeout": 5000 } ], "PostToolUse": [ { "matcher": "FileEditTool", "command": "npx eslint $FILE_PATH", "timeout": 10000 } ], "Notification": [ { "command": "osascript -e 'display notification \"Claude Code 完成\"'" } ], "Stop": [ { "command": "echo 'Session ended'" } ] } }

Hook 事件类型

事件触发时机可用变量
PreToolUse工具执行前$TOOL_NAME, $INPUT
PostToolUse工具执行后$TOOL_NAME, $RESULT
Notification通知时$MESSAGE
Stop会话结束时

Hook 执行流程

1. 事件触发 2. 匹配 matcher(工具名/正则) 3. 执行 command 4. 超时检查 5. 返回结果 - exit 0: 继续 - exit 2: 阻止操作(仅 PreToolUse) - 其他: 警告但继续

Hooks 设计模式

状态聚合模式

// useMergedTools: 合并多个来源的工具 function useMergedTools() { const builtInTools = useBuiltInTools() const mcpTools = useMcpTools() const pluginTools = usePluginTools() return useMemo(() => [ ...builtInTools, ...mcpTools, ...pluginTools, ], [builtInTools, mcpTools, pluginTools]) }

轮询模式

// useInboxPoller: 定期轮询收件箱 function useInboxPoller() { useEffect(() => { const interval = setInterval(async () => { const messages = await fetchInbox() if (messages.length > 0) { setMessages(messages) } }, 5000) return () => clearInterval(interval) }, []) }

事件监听模式

// useSettingsChange: 监听配置变更 function useSettingsChange(callback: (settings: Settings) => void) { useEffect(() => { const watcher = watchSettings(callback) return () => watcher.close() }, [callback]) }
Last updated on