ShriD5/claude-mods/tree/main/phone-approve
phone-approve
Telegram에서 Claude Code 권한 프롬프트를 승인하고, 응답이 없으면 터미널 프롬프트를 대체 수단으로 사용합니다.
이 mod 소개
휴대폰에서 Claude Code의 권한 프롬프트를 승인하세요. Claude Code가 도구를 실행해도 되는지 묻기 직전에 요청이 Telegram으로 전송되고 ✅ Approve 및 ❌ Deny 버튼이 표시됩니다. 탭으로 결정하므로 자리를 비워도 긴 작업을 계속할 수 있습니다.
- 실제 프롬프트만 휴대폰으로 전송됩니다. 규칙, 모드 또는 설정 훅이 이미 허용하거나 거부한 항목은 Telegram에 도착하지 않습니다.
- 메시지에는 Bash 명령, 작성하거나 편집할 파일, URL, 그 밖의 도구라면 도구 입력 등 요청 내용이 표시됩니다.
- 타임아웃 안에 휴대폰이 응답하지 않으면 일반 터미널 프롬프트가 결정하며, Telegram 메시지에도 그렇게 표시됩니다.
- 터미널에서 먼저 답하면 플러그인이 대기를 멈추고 메시지를 "answered in the terminal"로 편집합니다.
- 대기 중에는 상태 줄에 📱 waiting for phone…이 표시됩니다.
설치
claude --plugin-dir ./phone-approve
또는 이 저장소를 marketplace로 추가한 다음 /plugin으로 설치하세요.
설정
-
@BotFather에 메시지를 보내고
/newbot을 전송한 다음 token을 복사하세요. 전용 bot을 사용하세요. 플러그인은getUpdates로 버튼 입력을 읽습니다. bot에 webhook이 설정되어 있으면 Telegram이 거부하며, 두 프로그램이 같은 bot을 폴링하면 서로의 업데이트를 빼앗습니다. -
새 bot에 아무 메시지나 보내고
https://api.telegram.org/bot<token>/getUpdates를 연 다음message.chat.id를 복사하세요. 이것이 chat id입니다. -
두 값을 저장하세요(token은 settings.json이 아니라 secure storage에 저장됩니다).
echo '{"botToken":"123456:ABC…","chatId":"987654321"}' | claude plugin configure phone-approve --values-stdin
옵션
| 옵션 | 기본값 | 설명 |
| --- | --- | --- |
| botToken | (없음) | bot의 token입니다. 민감 정보로 표시되어 secure storage에 보관되고 로그에는 기록되지 않습니다. |
| chatId | (없음) | 요청을 보낼 위치입니다. 다른 chat의 입력은 무시합니다. |
| timeoutSeconds | 120 | 터미널 프롬프트가 결정하기 전에 휴대폰을 기다리는 시간입니다. |
botToken과 chatId를 설정하기 전에는 플러그인이 작동하지 않습니다.
작동 방식
Claude Code가 질문하려 할 때 발생시키는 classic.PermissionRequest에 연결합니다. $.http.fetch로 요청을 보낸 뒤, 해당 요청의 일회성 nonce를 담은 버튼 입력을 getUpdates로 롱 폴링합니다. 제한 시간 내에 돌아오지 않으면 next(e)를 반환하여 터미널 프롬프트가 결정하게 합니다.
설치
먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.
claude plugin marketplace add ShriD5/claude-mods claude plugin install phone-approve
원문 / README
phone-approve
Approve Claude Code's permission prompts from your phone. When Claude Code is about to ask you whether it may run a tool, the request goes to Telegram with ✅ Approve and ❌ Deny buttons, and your tap decides it. Walk away from the desk and keep a long task moving.
- Only a real prompt goes to the phone. Anything your rules, mode or settings hooks already allow or deny never reaches Telegram.
- The message says what is asked: the Bash command, the file being written or edited, the URL, or the tool's input for anything else.
- If the phone doesn't answer within the timeout, the normal terminal prompt decides, and the Telegram message says so.
- If you answer in the terminal first, the plugin stops waiting and edits the message to "answered in the terminal".
- While it waits, the status line shows
📱 waiting for phone….
Install
claude --plugin-dir ./phone-approve
or add this repo as a marketplace and install it with /plugin.
Setup
-
Message @BotFather, send
/newbot, and copy the token. Use a dedicated bot. The plugin reads button presses withgetUpdates, which Telegram refuses while a bot has a webhook set, and two programs polling one bot steal each other's updates. -
Send your new bot any message, then open
https://api.telegram.org/bot<token>/getUpdatesand copymessage.chat.id. That's your chat id. -
Save both (the token goes to secure storage, not settings.json):
echo '{"botToken":"123456:ABC…","chatId":"987654321"}' | claude plugin configure phone-approve --values-stdin
Options
| Option | Default | What it does |
| --- | --- | --- |
| botToken | (none) | The bot's token. Marked sensitive, so it's kept in secure storage and never logged. |
| chatId | (none) | Where requests go. Presses from any other chat are ignored. |
| timeoutSeconds | 120 | How long to wait for the phone before the terminal prompt decides. |
The plugin does nothing until botToken and chatId are set.
How it works
It hooks classic.PermissionRequest, which Claude Code raises when it is about to ask you. It sends the request with $.http.fetch, then long-polls getUpdates for the button press carrying that request's one-time nonce. If nothing comes back in time, it returns next(e) so the terminal prompt decides.