DeepDojo.AI发布 2026-11-12English
Claude Code 等你确认时,自动弹出通知
你给 Claude Code 交代完一个任务,切到浏览器去查资料。二十分钟后回来,发现它刚开始没多久就停在一个权限确认上,一直在等你点“允许”,后面的活一点没动。
Claude Code 需要你的时候,终端界面会显示提示,可你不在终端前就看不到。用 Hook 配一个桌面通知,可以解决这个问题:Claude 在等权限确认、或者回答完等你下一条输入时,电脑右上角弹出一条提醒。
配置本身只有十几行 JSON,容易出问题的是几处细节:
- 通知是你个人的习惯,应该写进用户配置,不进团队仓库;
- 只监听“等权限确认”和“等下一条输入”两类通知,免得什么事都弹;
- 用
args直接调用通知程序,省去 Shell 引号的麻烦; idle_prompt要等一段时间才弹出,刚配好没看到,可能只是时间还没到。
下面给出 macOS 的完整配置,再讲怎样确认它真的能弹出来。
01 写进用户配置
通知属于个人工作习惯,适合写在 ~/.claude/settings.json。团队共享的 .claude/settings.json 管项目自动化,个人试验放 .claude/settings.local.json,桌面通知这类“只关乎你自己怎么工作”的东西,放用户配置对所有项目生效,也不会打扰同事。
Hooks 入门指南的第一个示例就是这样一个桌面通知:写在 ~/.claude/settings.json,用 osascript 弹窗,Linux 和 Windows 的命令也在同一页。
02 一份 macOS 的完整配置
下面的 macOS 配置只监听权限请求和等待下一条输入两类通知:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [
{
"type": "command",
"command": "osascript",
"args": [
"-e",
"display notification \"Claude Code needs your attention\" with title \"Claude Code\""
],
"timeout": 10
}
]
}
]
}
}通知工具依赖操作系统和桌面权限。先在普通终端验证,再连接 Hook。
Matcher 里的两个值分别对应两种情况。Claude Code 的 Hooks 参考文档对它们的说明是:
| 通知类型 | 什么时候触发 |
|---|---|
permission_prompt | Claude 需要你批准一次工具调用,且提示已经等了大约六秒 |
idle_prompt | Claude 回答完大约 60 秒,你一直没有输入 |
Notification 事件还有登录成功、表单请求等其他类型,Matcher 只写这两个,就只在这两种情况下弹出。
03 为什么用 args 直接调用
这个通知只需启动 osascript 并传参数,所以选带 args 的 exec form。每个字符串直接交给程序,Shell 不再拆词,路径和引号也容易核对。若以后确实需要管道、重定向或 &&,再选不带 args 的 shell form。先看命令需要什么能力,再决定调用方式。
Hooks 文档对两种形式的区分是:设置了 args,命令以 exec form 运行;省略 args,以 shell form 运行。官方建议只要 Hook 引用了路径占位符就设置 args,因为每个元素都作为一个参数原样传入,不需要处理引号;需要管道或 && 这类 Shell 功能时再省略。
timeout 的单位是秒,这里给了 10 秒。通知程序启动很快,用不了这么久,留出余量即可。
04 怎样确认它真的会弹
保存后,先用 /hooks 查事件、Matcher、来源和命令,再制造一次权限请求,看通知是否出现。JSON 能解析后,还要实际触发才知道链路通不通。
测试时有个容易误判的地方。官方文档说明,这几类通知和桌面通知共用一套计时,在终端会话里只有你看起来“离开了终端”时才会出现:
permission_prompt要等你大约六秒没敲键盘才触发,每次按键都会推迟它;想在 Claude 一请求权限就立刻运行 Hook,要改用PermissionRequest事件。idle_prompt要等 Claude 回答完大约 60 秒、你没输入、也没有后台子代理还在运行时才触发。
所以测试时,制造一次权限请求后把手离开键盘等一会儿。idle_prompt 未立即弹窗还不能判断失效。等够时间仍没出现,再按注册、触发、输入、结果四层排查,方法见Claude Code Hook 不触发怎么排查。
05 通知可以放到后台运行
通知、日志这类不影响当前决定的 command handler,可以加上 "async": true,让前台继续:
{
"type": "command",
"command": "osascript",
"args": ["-e", "display notification \"Claude Code needs your attention\" with title \"Claude Code\""],
"async": true
}Hooks 文档对异步的说明是:默认情况下,Hook 会阻塞 Claude 直到执行完;设为 async 后在后台运行,Claude 继续工作,但它的返回字段不再起作用,也就没法阻止或控制 Claude 的行为。通知本来就不需要拦什么,放后台正合适;要拦截操作的 Hook 则必须保持同步。
在 Linux 或 Windows 上,把 osascript 换成系统对应的通知工具,同样先在普通终端里确认它能弹出,再接进 Hook。配好以后,交代完任务就可以放心去做别的事,Claude 需要你时,屏幕角落会告诉你。