Claude Code는 때때로 AskUserQuestion 툴을 사용하여 선택형 질문을 합니다. (예: '어떤 프레임워크를 사용하시겠습니까?') 터미널 앞에 있지 않으면 그 자리에서 멈추게 됩니다.
Hook 문서에는 -p 모드에서 답변하는 방법( PreToolUse Hook이 allow와 함께 답변한 updatedInput을 반환)이 나와 있습니다. 일반적인 대화 세션에서도 PermissionRequest Hook으로 같은 것이 가능한지 Claude Code 2.1.283 버전으로 테스트해 본 결과, 가능했습니다.
Hook이 받는 것
대화 세션에서 Claude가 AskUserQuestion을 호출하면, PermissionRequest Hook의 표준 입력에 다음과 같이 도착합니다 (발췌).
{
"hook_event_name": "PermissionRequest",
"tool_name": "AskUserQuestion",
...
}
Hook이 반환하는 것
tool_input을 그대로 사용하고, 질문 문구와 선택한 라벨의 answers를 추가하여 (다중 선택은 쉼표로 구분), behavior: "allow"인 updatedInput으로 반환합니다.
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
...
}
그러면 Claude Code는 다음과 같이 표시하고, 질문 화면을 띄우지 않은 채 계속 진행됩니다.
⏺ User answered Claude's questions:
⎿ · 어떤 색으로 하시겠습니까? → Blue
⎿ Allowed by PermissionRequest hook
테스트를 위한 최소 Hook
#!/bin/sh
python3 -c '
...
설정 파일의 hooks.PermissionRequest에 등록하고 claude --settings test-settings.json으로 테스트할 수 있습니다.
주의할 점
- 승인용 Hook(또는 승인 앱)이 단순히
allow만으로는 질문에 답변한 것으로 간주되지 않습니다. AskUserQuestion에 allow만 반환하면, 질문은 미답변 상태로 남아 세션이 대기하게 됩니다. 제 앱도 처음에는 스마트폰의 '허용' 버튼만 있었고, 눌러도 계속 기다리는 상태였습니다. - Hook은 값을 반환할 때까지 멈춥니다. 다른 곳에서 답변하려면, Hook은 그 답변을 기다려야 하며, 터미널 확인 화면이 사용 가능하도록 Hook의 타임아웃보다 먼저 포기해야 합니다.
스마트폰에서 답변하기
Claude Code나 Codex가 작업하는 동안 Mac을 깨워주는 메뉴바 앱 Lidnight를 만들었습니다. 1.7.79 버전부터 이 메커니즘을 사용하여, Claude가 질문하면 선택지가 스마트폰의 상태 페이지(종단 간 암호화)와 메뉴바에 나타나고, 터치한 답변이 Hook을 통해 Claude에게 전달됩니다. 터미널에서 답변해도 괜찮지만, 먼저 답변하는 것이 사용됩니다.
Discussion