소개
텔레그램 메시지 하나로 실제 프로젝트 코드를 AI가 직접 수정하고, 맥 (로컬pc) 없이 폰에서 바로 결 과를 확인하는 환경을 만들고 싶었습니다.
외출 중이거나 출근하고 나서 등 맥이 없는 환경에서도 프로젝트 코드에서 수정하고 싶을때 텔레그램으로 단단한 자연어 요청을 하는 것으로 코드가 수정되고 결과까지 확인할 수 있는 워크플로우를 만드는 것을 목표로 했습니다.
진행 방법
어떤 도구를 사용했고, 어떻게 활용하셨나요?
- Claude Code CLI — 실제 파일 수정
- python-telegram-bot — 텔레그램 봇
- Tailscale — 맥 ↔ 폰 내부 네트워크 연결
- Vite — React 개발 서버
Step 1. 텔레그램 → Claude Code 연동
텔레그램에서 /code 로 명령어를 입력하면 subprocess로 claude -p를 실행하여 파일을 수정하도록 구현했습니다.
핵심 코드
def run_claude(prompt: str, cwd: str) -> str:
full_prompt = (
"설명하지 말고 실제로 파일을 직접 읽고 편집해줘. "
"너는 이 프로젝트의 코드를 직접 수정하는 역할이야.\n"
"1. 먼저 프로젝트 파일 구조를 파악해.\n"
"2. 요청과 관련된 파일을 스스로 찾아서 읽어봐.\n"
"3. 설명이나 예시 코드 없이, Edit/Write 툴로 파일을 직접 수정해.\n"
"4. 완료 후 어떤 파일을 어떻게 수정했는지 한 줄로만 알려줘.\n\n"
f"요청: {prompt}"
)
result = subprocess.run(
["claude", "-p", full_prompt,
"--dangerously-skip-permissions",
"--output-format", "text"],
cwd=cwd,
capture_output=True,
text=True,
timeout=180,
)
return result.stdout.strip()** subprocess는 파이썬에서 다른 프로그램을 실행시키는 도구
** 터미널에서 claude -p를 입력하는 것과 같은 원리
claude-p : Claude Code CLI의 비대화형 실행 모드
claude
터미널에서 대화형으로 주고 받음
claude -p "..."
프롬프트 한 번 보내고 결과만 받고 종료
텔레그램 사용 예시
/setproject /Users/saerok-portfolio
/code 강의경력에 삼성생명 AI 과정 2026.05~08 추가해줘
Step 2. 시행착오 — 파일 수정이 안 되던 문제
처음엔 /code 요청을 보내도 Claude가 코드를 설명하는 텍스트만 반환했습니다.
문제 1: 권한 차단
- claude -p 비대화형 모드에서 파일 수정 권한이 막혀 있었음
- 해결: --dangerously-skip-permissions 플래그 추가
문제 2: 설명만 반환
- 플래그를 추가해도 Claude가 "방법을 설명"하는 텍스트만 반환
- 해결: 프롬프트에 "설명하지 말고 직접 수정해"라는 강제 지시문 추가하여 프롬프트 수정
문제 3: 파일명을 정확히 입력해야 하는 불편함
- /code src/App.jsx 의 CAREER_LECTURE 배열에... 처럼 입력해야 했음
- 해결: "파일 구조를 먼저 파악하고 스스로 찾아서 수정해"라는 지시 추가
- 이후 /code 강의경력에 추가해줘 같은 자연어 요청으로 수정 가능해짐
---
Step 3. Tailscale로 폰에서 결과 확인
vite.config.js 설정
export default defineConfig({
plugins: [react()],
server: {
host: '0.0.0.0',
port: 5173,
allowedHosts: true,
},
})
vite의 역할 : 코드를 실시간으로 화면에 보여주는 로컬 웹 서버
Vite 설정 파일(vite.config.js)에서 host: '0.0.0.0'과 allowedHosts:
true를 추가해서 맥 외부(폰)에서도 접근 가능하도록 열어줌
Tailscale IP 자동 감지 코드
def get_tailscale_ip() -> str:
try:
result = subprocess.run(["ifconfig"], capture_output=True, text=True, timeout=5)
for line in result.stdout.splitlines():
if "inet " in line:
ip = line.strip().split()[1]
if ip.startswith("100."): # Tailscale은 100.x.x.x 대역
return ip
except Exception:
pass
return None
텔레그램 /devserver 응답 예시
✅ dev 서버 실행 중!
🖥️ 로컬: http://localhost:5173
🌐 Tailscale: http://100.79.187.20:5173
완성된 워크플로우
텔레그램: /code 강의경력에 삼성생명 추가해줘
↓
Claude Code가 프로젝트 탐색 → App.jsx 수정
↓
폰 브라우저에서 Tailscale URL로 접속하여 수정된 결과 확인
결과와 배운 점
배운 점
- claude -p 단독으로는 파일 수정이 안 되고, --dangerously-skip-permissions가 반드시 필요함
- Vite 6.x는 외부 호스트 접근을 기본으로 차단 → allowedHosts: true 필수
- Tailscale은 맥과 폰 양쪽 다 앱이 켜져 있어야 통신됨
앞으로의 계획
- 봇이 꺼지면 수정이 불가능한 문제 → 맥 부팅 시 자동 실행(launchd) 설정
- /screenshot 으로 수정 전/후 비교 자동화