지하철에서 막 자리를 잡았는데 메신저 알림이 옵니다. "배포한 거 에러 나는 것 같은데요?" 출근길 버스 안에서는 "오전 회의 전에 이것 좀 고쳐 줄 수 있어요?"라는 요청이 오기도 합니다. 저한테는 이런 일이 생각보다 자주 생깁니다.
예전 같으면 내려서 카페를 찾고 노트북을 열었을 겁니다. 그런데 요즘 코드는 대부분 제 맥에서 돌고 있는 Claude Code가 씁니다. 저는 무엇을 할지 말하고 결과만 확인하면 되는데, 그 "말하기"를 하려고 노트북 앞에 앉아야 한다는 게 이상하게 느껴졌습니다.
그래서 만든 게 cliclaw입니다. 결론부터 말하면 이런 도구입니다.
맥에서 데몬 하나가 돌면서, 텔레그램 채팅을 Claude Code · Codex · Pi · Gemini의 리모컨으로 바꿔 줍니다.
폰에서 메시지를 보내면 맥의 CLI 에이전트가 작업하고, 답은 다시 텔레그램으로 옵니다.
위험한 명령은 실행 전에 폰으로 "허용할까요?"를 묻습니다.
퇴근길에 갑자기 오류가 터졌을 때. 에러 로그를 붙여 보내고 "원인 찾아서 고쳐 줘"라고 하면 됩니다. 사진도 보낼 수 있어서, 에러 화면 캡처를 그대로 넘겨도 됩니다. 사진은 맥으로 자동으로 내려받아 에이전트에게 경로와 함께 전달합니다.
출근길에 누군가 작업을 요청했을 때. 도착하기 전에 미리 시켜 두고, 진행 상황은 텔레그램에서 실시간으로 봅니다. Claude는 답이 만들어지는 대로 메시지가 계속 갱신됩니다.
긴 작업을 걸어 두고 자리를 비울 때. 에이전트가 y/n 확인을 기다리며 멈춰 있어도, 폰으로 버튼 하나 누르면 다시 진행됩니다.
에이전트 네 개를 오가다 보면 "지금 이 답을 누가 했지?"가 헷갈립니다. 그래서 모든 답장 앞에 에이전트 이름이 붙습니다.
[claude] 로그를 보니 원인은 .../status를 보내면 지금 어떤 에이전트를 쓰는 중인지, 에이전트별로 몇 턴째 대화 중인지, 진행 중인 작업이 있는지 한 번에 나옵니다. 아래는 화면 예시입니다.
현재: claude
claude: 턴=3 세션=a1b2c3d4 마지막=08:42
모드: 헤드리스 + 안전모드 ON ...
codex: (세션 없음) 모드: sandbox=workspace-write ...
🏃 진행 중: claude (42초) — /stop 으로 취소명령이 기억나지 않으면 /help를 보내면 됩니다. 현재 에이전트, 쓸 수 있는 명령 전체, 작업 디렉토리, 안전모드 상태까지 보여 줍니다. 맥 쪽에서 봇이 이상하면 터미널에서 cliclaw doctor를 실행하세요. 봇 토큰, 자동 실행(launchd), 설치된 에이전트, 회사망 인증서 설정을 바로 점검합니다.
명령 하나로 에이전트를 바꿉니다.
/claude /codex /pi /gemini설치하지 않은 에이전트는 목록에서 알아서 빠집니다. 중요한 건 바꿔도 이전 대화가 사라지지 않는다는 점입니다. 채팅마다, 에이전트마다 세션을 따로 들고 있어서 Codex로 갔다가 Claude로 돌아오면 하던 대화가 그대로 이어집니다.
✅ claude로 전환됨 (이어가기, 3턴)한 번 묻고 끝나는 게 아니라 턴마다 앞 대화를 기억합니다. "아까 그 파일에서 테스트도 추가해 줘"처럼 이어서 말할 수 있습니다. 각 CLI가 가진 이어가기 기능을 그대로 씁니다(Claude·Pi는 --continue, Codex는 resume --last, Gemini는 -r latest). 대화가 너무 길어지면 정해진 턴 수에서 자동으로 초기화되고(설정 예시 기준 Claude 100턴, 나머지 50턴), 직접 비우고 싶을 때는 이렇게 합니다.
/reset — 지금 쓰는 에이전트 세션만 초기화
/reset all — 이 채팅의 모든 에이전트 세션 초기화
/stop — 진행 중인 작업 취소 (에이전트가 띄운 하위 프로세스까지 같이 정리)
이 밖에도 /model로 에이전트별 모델을 바꾸고, /plan on으로 Claude가 파일을 직접 고치지 않고 계획만 제안하게 할 수 있습니다. //compact처럼 슬래시를 두 번 쓰면 각 CLI의 자체 명령을 그대로 넘깁니다.
폰으로 맥에 명령을 내린다는 건, 봇 토큰이 곧 내 맥의 원격 셸이라는 뜻입니다. 그래서 기본값을 보수적으로 잡았습니다.
안전모드(기본 ON): rm -rf, git push --force, DROP, kubectl delete, sudo 같은 위험 명령은 실행 전에 텔레그램에 [✅ 허용] [❌ 거부] 버튼이 뜹니다. 답하지 않으면 자동으로 거부됩니다.
민감 파일 차단: Claude가 ~/.ssh, ~/.aws, .env, *.pem 같은 파일을 읽지 못하게 막습니다.
허락된 사람만: 등록한 텔레그램 계정 외의 메시지는 전부 거부합니다. 목록이 비어 있으면 아무도 못 씁니다.
로그 마스킹: 봇 토큰, npm 토큰, GitHub 토큰은 로그에 남기 전에 가려집니다.
이미 다른 가드를 쓰고 있어서 확인 버튼이 번거롭다면 /safety off 한 줄로 끌 수 있습니다. 그래도 모든 요청은 감사 로그에 남습니다.
준비물은 macOS, Bun 1.x, 그리고 로그인된 코딩 CLI 하나 이상입니다. 네 개를 다 깔 필요는 없습니다.
# 설치 (npm도 됩니다: npm install -g @younggichoi/cliclaw)
bun add -g @younggichoi/cliclaw
# 대화형 설정
cliclaw initcliclaw init이 다섯 단계를 안내합니다. 텔레그램 @BotFather에서 받은 봇 토큰 입력 → 설치된 에이전트 자동 탐지 → 내 텔레그램 계정 등록 → (회사망이면) 인증서 설정 → 로그인 시 자동 실행. 끝나면 텔레그램에서 /status를 보내 보세요. 맥이 재부팅돼도 봇은 알아서 다시 뜹니다.
아직 아쉬운 점도 있습니다. macOS 전용이고, 1:1 채팅에서만 동작하고, 첨부는 사진만 됩니다. 실시간으로 답이 갱신되는 스트리밍도 지금은 Claude만 지원합니다. 위험 명령 판별은 정규식 기반이라 완벽하지 않습니다.
그래도 "노트북을 열 수 없는 순간에도 맥은 일하고 있다"는 감각은 꽤 큽니다. 퇴근길에 오류 알림을 받고 조마조마해 본 적이 있다면 한 번 써 보세요.
👉 저장소: github.com/choiyounggi/cliclaw (MIT) · npm: @younggichoi/cliclaw
써 보고 불편한 점이나 원하는 기능이 있으면 이슈로 남겨 주세요. Star도 큰 힘이 됩니다.
관련 글:
이 글은 제 벨로그에 먼저 올린 글입니다. 원문: 퇴근길에 오류가 터져도 노트북을 열지 않습니다