Khi Claude Code cần bạn chọn giữa các phương án, nó gọi một tool tên AskUserQuestion và chờ bạn chọn. Một hook PreToolUse khớp với AskUserQuestion có thể trả lời thay bạn bằng cách trả về câu hỏi kèm trường answers đã điền sẵn. Đó là cách bạn trả lời câu hỏi của Claude Code từ điện thoại: hook gửi câu hỏi và các lựa chọn đến điện thoại, chờ bạn chọn rồi chuyển kết quả lại. Claude Code Notifier làm việc này trên Mac, Windows và Linux bằng công cụ ccn và app điện thoại.
01AskUserQuestion là gì
Đôi khi Claude gặp ngã rẽ mà nó không nên tự quyết. Dùng framework nào? Giữ API cũ hay bỏ? Sửa test hay sửa code? Thay vì đoán, nó hỏi một câu trắc nghiệm ngắn. Trong terminal, bạn thấy câu hỏi, vài lựa chọn có nhãn và mô tả, rồi chọn một cái bằng bàn phím.
Như mọi tool call khác, AskUserQuestion đi qua các hook của Claude Code trước. Đó chính là chỗ để trả lời từ xa.
Câu hỏi khác với permission prompt. Permission prompt hỏi có hay không cho một thao tác, và hook PermissionRequest trả lời nó (xem Phê duyệt yêu cầu cấp quyền của Claude Code từ điện thoại). Còn câu hỏi yêu cầu bạn lựa chọn, và câu trả lời là một nhãn chứ không phải "có".
02Hook cung cấp câu trả lời như thế nào
Hook PreToolUse nhận input của tool dưới dạng JSON qua standard input. Với AskUserQuestion, input chứa mảng questions. Mỗi câu hỏi có question (nội dung), header (nhãn ngắn), options (mỗi cái có label và description) và multiSelect.
Chỉ trả về "allow" là không đủ với tool này, vì câu trả lời phải đến từ đâu đó. Tài liệu tham khảo về hook của Anthropic nói rằng hook phải trả lại questions trong updatedInput và thêm một object answers ánh xạ nội dung từng câu hỏi tới nhãn đã chọn:
{
"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" }
}
}
}
Với câu hỏi chọn nhiều, hãy nối các nhãn đã chọn bằng dấu phẩy. Nếu hook không in gì ra, câu hỏi sẽ hiện trong terminal như bình thường.
Đăng ký hook
{
"hooks": {
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [
{ "type": "command", "command": "/path/to/your-answer-script" }
]
}
]
}
}
Đặt đoạn này vào ~/.claude/settings.json để áp dụng cho mọi project. Để xem tất cả hook event và công dụng của từng cái, hãy đọc Giải thích về hook trong Claude Code.
Lưu ý về các lần chạy non-interactive
Với claude -p, tài liệu của Anthropic cho biết AskUserQuestion chỉ được cung cấp khi lần chạy có permission host để nhận prompt, chẳng hạn callback canUseTool của Agent SDK. Trong một lần chạy bằng script thông thường, Claude có thể đơn giản là không hỏi. Hướng dẫn này dành cho các session interactive.
03Thế nào là trả lời tốt trên điện thoại
JSON là phần dễ. Các vấn đề thiết kế cũng giống như với permission prompt:
- Hiển thị toàn bộ câu hỏi. Header, câu hỏi và mô tả từng lựa chọn đều quan trọng. Chỉ một nhãn ("Option B") thì chẳng giúp gì trên màn hình khóa.
- Giữ terminal dùng được. Nếu bạn đang ngồi ở máy tính, bạn nên trả lời được ngay tại đó, thay vì chờ một hook đang chờ điện thoại.
- Bỏ cuộc gọn gàng. Nếu không có câu trả lời, hook nên trả về rỗng trước khi hết timeout để prompt hiện trong terminal.
- Khớp chính xác nội dung. Các key trong
answersphải là nội dung câu hỏi đúng như Claude viết, và value phải là nhãn của lựa chọn.
04Dùng Claude Code Notifier
Claude Code Notifier là công cụ độc lập của TouchTap Ltd, không phải do Anthropic phát triển. Công cụ dòng lệnh ccn của nó cài một hook PreToolUse cho AskUserQuestion cùng các hook khác. Khi Claude đặt câu hỏi lúc bạn vắng mặt, điện thoại sẽ hiện câu hỏi và các lựa chọn. Chạm vào một lựa chọn, hook sẽ cung cấp câu trả lời và Claude tiếp tục làm việc.
Cài đặt trên Mac hoặc Linux:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
hoặc trên Windows bằng PowerShell (beta):
irm https://claudecodenotifier.com/install.ps1 | iex
Sau đó ghép nối điện thoại bằng cách quét mã QR hoặc nhập mã 6 chữ số của app. Bài Kết nối điện thoại với Claude Code hướng dẫn chi tiết cho từng hệ điều hành.
Sự hiện diện quyết định nơi bạn trả lời
ccn áp dụng cùng quy tắc hiện diện cho câu hỏi như với quyền. Nếu bạn gõ phím trong 30 giây gần nhất, terminal sẽ hỏi như bình thường và điện thoại cùng lắm chỉ nhận một thông báo. Nếu bạn vắng mặt, terminal sẽ chờ điện thoại, tối đa theo mức bạn chọn (hold_ceiling_seconds, từ 30 đến 3600, mặc định 600), và ngừng chờ ngay khi bạn chạm bàn phím.
Chọn những gì được gửi đến điện thoại
Câu hỏi có setting riêng là notify_on_question, tách biệt với notify_on_permission và notify_on_done, nên bạn có thể giữ loại này và tắt loại khác. ccn config show liệt kê các setting đang có hiệu lực, và hầu hết setting cũng có thể đổi riêng cho từng máy tính ngay trên app điện thoại.
Giờ yên lặng cũng được áp dụng, ví dụ ccn config set quiet_hours 22:00-08:00. Xem Giờ yên lặng và Không làm phiền.
Dù chưa ghép nối điện thoại, ccn vẫn hiển thị thông báo desktop miễn phí trên máy tính khi Claude đặt câu hỏi, để bạn biết mà quay lại. Muốn trả lời từ điện thoại thì cần app, tải miễn phí nhưng cần đăng ký hoặc mua trọn đời để sử dụng. Xem bảng giá.
05Câu hỏi, yêu cầu tiếp theo và khi hoàn tất
Câu hỏi là một trong ba thời điểm Claude chờ bạn. Hai thời điểm còn lại là permission prompt và khi kết thúc một lượt. Ngay sau khi Claude xong, Claude Code Notifier còn cho bạn gửi chỉ dẫn tiếp theo từ điện thoại, và hook Stop sẽ trả nó về cho Claude làm chỉ dẫn kế tiếp. Kết hợp lại, chúng xử lý gần hết những lúc khiến một tác vụ dài phải chờ. Để Claude Code chạy và rời khỏi máy gộp tất cả thành một quy trình.
06Câu hỏi thường gặp
Tôi có thể gõ câu trả lời tự do thay vì chọn một lựa chọn không?
Cách dùng hook được tài liệu hóa trả lời bằng nhãn lựa chọn qua trường answers. Trong Claude Code Notifier, bạn chọn trong các lựa chọn trên điện thoại. Nếu không có lựa chọn nào phù hợp, hãy để câu hỏi lại cho terminal, hoặc định hướng Claude bằng một yêu cầu tiếp theo khi nó xong.
Vì sao "allow" từ hook PreToolUse của tôi không trả lời được câu hỏi?
Vì AskUserQuestion cần một câu trả lời, không chỉ là quyền. Hãy trả về updatedInput kèm questions gốc và một object answers, như ví dụ ở trên.
Nếu Claude hỏi nhiều câu cùng lúc thì sao?
Mảng questions có thể chứa nhiều câu hỏi. Object answers cần một mục cho mỗi câu hỏi, với key là đúng nguyên văn câu hỏi đó.
Có dùng được trong VS Code, Cursor hoặc JetBrains không?
Hook thuộc về Claude Code, không phải terminal, nên nó vẫn chạy trong terminal tích hợp của IDE. Xem Thông báo Claude Code trong terminal của VS Code, Cursor và JetBrains.