당사(合同会社ジョインクラス)는 직원 제로 상태이며, launchd의 정기 작업 17개와 Claude Code로 업무 대부분을 처리하고 있습니다. 개발 역시 거의 Claude Code를 통해 이루어지며, PR은 Claude에게 만들게 하는 경우가 많습니다.
곤란했던 점은 다음 날 아침 리뷰 대응이었습니다. 리뷰 코멘트가 달린 PR을 수정하려고 할 때마다, 새로운 세션에서 '이 PR은 무엇을 위한 것이고, 어디까지 진행했으며, 왜 이 설계를 했는지'를 매번 다시 설명해야 했습니다. 설명이 부실하면 AI가 전날 거절했던 안건을 아무렇지 않게 재제안해 오곤 했습니다.
이를 해결하는 것이 claude --from-pr입니다. 본 기사에서는,
--from-pr의 기본과, 작동 조건 및 비작동 조건 - 당사의 실제 스크립트(GitHub 모니터링 작업)를 기반으로 한 '리뷰 대기 PR을 아침에 목록화하고, 재개 명령어까지 출력'하는 구현
- 막히는 부분과 검증 방법
을 정리합니다.
--from-pr은 GitHub의 PR에 연결된 Claude Code 세션을 재개하는 옵션입니다.
# PR 번호로 재개
claude --from-pr 123
# PR URL로도 가능
...
핵심은 '연결되어 있다(紐づいた)'는 부분입니다. Claude Code 세션 내에서 gh pr create를 실행하여 PR을 만들면, 해당 세션이 PR과 연결됩니다. --from-pr은 이 링크를 따라가서, PR을 만들었을 때의 대화 기록 전체를 복원합니다.
| 상황 | --from-pr의 동작 | |
|---|
Claude Code 세션 내에서 gh pr create한 PR | 생성 당시의 세션이 재개됨 | |
| 사람이 브라우저로 만든 PR | 연결된 세션이 없으므로 재개 불가 | |
| 다른 기기에서 만든 PR | 세션은 로컬 저장 방식이므로, 해당 기기가 아니면 재개 불가 | |
즉, 'PR은 Claude Code 안에서 만든다'를 운영 규칙으로 삼는 것이 전제입니다.
당사에서는 CLAUDE.md에 다음과 같이 작성하고 있습니다(발췌).
## Git 운용
- PR은 반드시 이 세션 내에서 `gh pr create`를 사용해 생성한다 (–from-pr로 재개하기 위해)
- PR 본문에 '설계 판단'과 '거절한 안건'을 반드시 작성한다
...
'거절한 안건'을 PR 본문에 남기는 이유는, --from-pr로 대화는 돌아와도 긴 대화의 후반부에서는 오래된 판단이 묻히기 쉽기 때문입니다. PR 본문은 인간 리뷰어에게도 효과적이므로 일석이조입니다.
git push --force 금지는, 과거 AI가 force push를 하여 브랜치를 삭제한 사고 재발 방지 목적입니다. --from-pr로 재개된 세션이 '기록을 깨끗하게 합시다'라며 rebase + force push를 제안해 올 수 있으므로, 이 부분은 명시하는 것이 안전합니다.
당사에는 매일 아침 8:00에 실행되는 auto-github-monitor.sh가 있으며, gh api로 Star/Fork/Issue의 증감분을 가져와 Slack으로 전송하고 있습니다. 이 골격(gh + jq + 이전 상태와의 비교 + Slack 알림)을 그대로 활용하여, 변경 요청이 붙은 자신의 PR을 수집하고, 재개 명령어와 함께 알림하는 작업을 추가했습니다.
Slack에는 다음과 같이 도착합니다.
🔁 [리뷰 대응 대기 PR]
#142 [CHANGES_REQUESTED] feat: 승인 큐의 기한 만료 자동 에스컬레이션
→ claude --from-pr 142
아침에는 이 한 줄을 복사 붙여넣기만 하면, 전날 대화의 연속부터 리뷰 대응을 시작할 수 있습니다.
macOS에서는 cron이 전체 디스크 접근 제약으로 인해 모두 실패한 경험이 있어, 당사의 정기 작업은 전부 launchd를 사용합니다.
세션은 프로젝트(디렉토리) 단위로 저장됩니다. PR을 만든 리포지토리의 루트에서 claude --from-pr
를 실행해 주세요. Slack 알림에 PROJECT_ROOT
를 넣는 것은 이 때문입니다. worktree로 작업한 경우에는, 해당 worktree의 경로에서 실행합니다.
launchd는 대화형 셸(interactive shell)의 PATH를 상속받지 않습니다. 스크립트 시작 부분에서 PATH
와 HOME
을 명시하지 않으면 gh: command not found가 발생하거나 인증되지 않은 것으로 간주되어, || true로 덮어씌워져 '대응 대기 PR 없음'으로 오판합니다. 로그가 매일 '없음'이라면, 먼저 다음을 의심해 보세요.
env -i HOME="$HOME" PATH="/opt/homebrew/bin:/usr/bin:/bin" gh auth status
브라우저에서 PR을 만들 경우 연결된 세션이 없습니다. 그럴 때는 평소처럼 claude
를 실행하고, 'PR #142의 리뷰 코멘트에 대응하여'라고 요청합니다 (gh pr view 142 --comments로 내용을 읽게 합니다).
전날부터 main 브랜치가 진행되어 있으면, 대화상의 전제와 코드 내용이 불일치하게 됩니다. 재개 직후에는 반드시 다음을 실행하도록 합니다.
git fetch origin && git status && gh pr view --comments
- Claude Code 내에서 작은 변경을 추가하고,
gh pr create
로 PR을 만듭니다 - 세션을 종료합니다
- GitHub 상에서 해당 PR에 'Request changes'를 추가합니다
bash auto-pr-resume.sh
를 수동으로 실행하여, Slack에 claude --from-pr <번호>가 나오는 것을 확인합니다 - 나온 명령어를 실행하고,
PR 생성 시의 대화 내용이 남아 있는지('아까 〇〇 안을 기각한 이유는?'이라고 물어보고 답할 수 있는지)를 확인합니다
5번 질문에서 올바르게 답변된다면, 문맥 전체가 복원된 것입니다.
도입 후 가장 크게 바뀐 것은 리뷰 대응의 '시작 과정'입니다. 이전에는 설명하는 데 매번 10분 정도 걸렸고, 게다가 설명이 빠지면 이미 기각된 안건이 재제안되곤 했습니다. --from-pr
- 아침 알림으로 사용한 이후로는, 명령어를 한 줄 붙여넣는 것만으로 계속 이어갈 수 있게 되었습니다.
1인 회사에서는 인간의 판단 시간이 가장 희소한 리소스입니다. AI에게 '지난 내용'을 기억하게 하는 시스템은, 지엽적이지만 효과가 좋습니다.
PR 생성-리뷰-재개까지 포함한, AI를 전제로 한 개발 프로세스 전체 설계는 서적 『AI 구동 개발 라이프사이클(AI-DLC)의 교과서』에 정리되어 있습니다.