当 Claude Code 需要你在几个选项中做选择时,它会调用名为 AskUserQuestion 的工具,然后等你选。匹配 AskUserQuestion 的 PreToolUse hook 可以替你作答,方法是返回填好 answers 字段的问题。在手机上回答 Claude Code 的问题正是这样实现的:hook 把问题和选项发到手机,等你选择后再交回去。Claude Code Notifier 通过 ccn 工具和手机应用,在 Mac、Windows 和 Linux 上实现了这一点。
01AskUserQuestion 是什么
有时 Claude 会遇到不该自己拍板的岔路口。用哪个框架?保留旧 API 还是删掉?改测试还是改代码?它不会瞎猜,而是提一个简短的选择题。在 terminal 里你会看到问题和几个带说明的选项,用键盘选一个即可。
和其他工具调用一样,AskUserQuestion 会先经过 Claude Code 的 hook。远程作答正是从这里切入的。
问题和权限 prompt 不一样。权限 prompt 针对某个操作问你是或否,由 PermissionRequest hook 来回答(见在手机上批准 Claude Code 的权限请求)。问题则是让你做选择,答案是一个选项标签,而不是“是”。
02hook 如何提供答案
PreToolUse hook 通过标准输入以 JSON 形式接收工具的输入。对于 AskUserQuestion,输入中包含一个 questions 数组。每个问题都有 question(问题文本)、header(简短标签)、options(每项含 label 和 description)以及 multiSelect。
对这个工具来说,只返回 "allow" 是不够的,因为答案总得有个来源。Anthropic 的 hooks 参考文档指出,hook 必须在 updatedInput 中原样回传 questions,并添加一个 answers 对象,把每个问题的文本映射到所选的标签:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"updatedInput": {
"questions": [
{
"question": "Which framework?",
"header": "Framework",
"options": [
{ "label": "React", "description": "Component library" },
{ "label": "Vue", "description": "Progressive framework" }
],
"multiSelect": false
}
],
"answers": { "Which framework?": "React" }
}
}
}
对于多选题,用逗号连接所选标签。如果 hook 没有输出任何内容,问题会照常出现在 terminal 中。
注册 hook
{
"hooks": {
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [
{ "type": "command", "command": "/path/to/your-answer-script" }
]
}
]
}
}
把下面的配置放进 ~/.claude/settings.json,即可对所有项目生效。各个 hook 事件及其适用场景,见Claude Code hooks 详解。
关于非交互式运行
Anthropic 的文档提到,在 claude -p 运行中,只有当存在接收 prompt 的权限宿主(例如 Agent SDK 的 canUseTool 回调)时,才会提供 AskUserQuestion。在普通脚本运行中,Claude 可能根本不会提问。本文讨论的是交互式会话。
03怎样才算好的手机端作答
JSON 是最简单的部分。设计上要考虑的问题和权限 prompt 一样:
- 展示完整的问题。标题、问题本身和每个选项的说明都很重要。锁屏上只显示一个标签(“Option B”)毫无帮助。
- 保持 terminal 可用。如果你就在电脑前,应该能直接在那里回答,而不是干等一个正在等手机的 hook。
- 干净地放弃。如果一直没有答案,hook 应在超时前不返回任何内容,让 terminal prompt 正常出现。
- 文本必须完全一致。
answers的键必须是 Claude 写出的原始问题文本,值必须是选项标签。
04使用 Claude Code Notifier
Claude Code Notifier 是 TouchTap Ltd 开发的独立工具,并非 Anthropic 出品。它的命令行工具 ccn 在安装其他 hook 的同时,也会在 AskUserQuestion 上安装一个 PreToolUse hook。当 Claude 提问而你不在电脑前时,手机会显示问题和选项。点一个,hook 就会提交答案,Claude 随即继续工作。
在 Mac 或 Linux 上安装:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
或在 Windows 的 PowerShell 中安装(beta):
irm https://claudecodenotifier.com/install.ps1 | iex
然后扫描二维码或输入应用中的 6 位数字代码来配对手机。将手机连接到 Claude Code介绍了各个操作系统上的具体步骤。
在场状态决定在哪里作答
ccn 对问题和权限请求使用相同的在场规则。如果你在过去 30 秒内敲过键盘,terminal 会照常提问,手机最多收到一条通知。如果你不在,terminal 会等待手机回应,最长等到你设定的上限(hold_ceiling_seconds,30 到 3600,默认 600),而且一碰键盘就立即停止等待。
选择哪些内容推送到手机
提问有单独的设置项 notify_on_question,与 notify_on_permission 和 notify_on_done 相互独立,所以可以只保留某一类通知、关掉另一类。ccn config show 会列出当前生效的配置,大多数设置也可以在手机 App 里按电脑分别修改。
免打扰时段同样适用,例如 ccn config set quiet_hours 22:00-08:00。详见免打扰时段与勿扰模式。
即使没有配对手机,Claude 提问时 ccn 也会在电脑上弹出免费的桌面通知,提醒你回来处理。要在手机上回答则需要 App:下载免费,使用需订阅或一次性买断。详见价格。
05提问、后续指令与完成
提问是 Claude 等你操作的三种时刻之一,另外两种是权限 prompt 和一轮对话结束。Claude 刚完成时,Claude Code Notifier 还能让你从手机发送下一条指令,由 Stop hook 交给 Claude 作为下一步指令。这几项加起来,基本覆盖了长任务卡住等人的情况。让 Claude Code 继续跑,你可以走开把它们串成了一套流程。
06常见问题
可以输入自由文本回答,而不是选择选项吗?
官方文档中的 hook 方式是通过 answers 字段用选项标签来回答。在 Claude Code Notifier 里,你在手机上从选项中选择。如果都不合适,就留到 terminal 里回答,或者等 Claude 完成后再发一条后续指令来引导它。
为什么我的 PreToolUse hook 返回 "allow" 却没有回答问题?
因为 AskUserQuestion 需要的是答案,而不只是许可。按上文所示,返回包含原始 questions 和 answers 对象的 updatedInput。
如果 Claude 一次问了好几个问题怎么办?
questions 数组可以包含多个问题。answers 对象里每个问题都要有一项,键名为该问题的原文。
在 VS Code、Cursor 或 JetBrains 里能用吗?
hook 属于 Claude Code 而不是 terminal,所以在 IDE 内置 terminal 里同样会触发。详见在 VS Code、Cursor 和 JetBrains terminal 中使用 Claude Code 通知。