맥락을 잃지 않고 Claude Code, Codex, OpenCode 세션을 포크하는 방법
특정 메시지나 세션의 최신 지점에서 포크하고, 이전 맥락을 유지하며, 공급자가 네이티브로 포크할 수 없을 때는 리플레이를 쓰는 방법.
- CLI
- 0.2.17
- 프리뷰 ref
- a2c45c8
포크는 확신이 없을 때 유용합니다.
"코딩을 어떻게 해야 할지 모르겠다"는 뜻이 아니라 이런 경우입니다.
- 이 접근 방식을 계속 가져가고 싶은지 확신이 없을 때.
- 에이전트의 현재 계획이 안전한지 확신이 없을 때.
- 이미 잘 돌아가는 세션을 망치지 않고 다른 방향을 시도하고 싶을 때.
목표는 잘 돌아가는 흐름을 버리지 않고, 세션을 쓸모 있게 만드는 맥락도 잃지 않으면서 다른 접근을 시도하는 것입니다.
포크가 없으면 보통 같은 일을 어설프게 하게 됩니다(새 세션에 맥락을 복사하거나, 요약을 쓰거나, 그 자리에서 계속하며 엉망이 되지 않기를 바라거나).
Happier는 코딩 에이전트를 크로스 디바이스로 실행하고 오케스트레이션하는 오픈 소스 앱으로, "포크" 동작 하나를 제공하고 지원되는 전략을 고릅니다(가능하면 공급자 네이티브, 아니면 리플레이).
요약
- 어디서 갈라질지 정하세요.
- 특정 메시지에서 포크해 더 이전 지점에서 갈라지거나,
- 세션 메뉴에서 포크해 최신 지점에서 갈라집니다
- 세션과 작업 공간을 가진 머신에 Happier를 설정하고 휴대폰을 연결하세요.
- 세션을 포크하세요.
- 그 지점에서 공급자가 네이티브로 포크할 수 없다면 Happier는 리플레이(숨겨진 리플레이 시드)로 대체해 자식 세션도 맥락을 갖게 합니다.
문제
오래 실행되는 코딩 세션은 많은 추진력을 쌓습니다.
좋은 일이죠. 위험한 일을 하고 싶어지기 전까지는요.
- 코드 덩어리를 다시 쓰기
- API 표면 바꾸기
- 다른 형태의 리팩터링 시도하기
그걸 그 자리에서 하면 "잘 되던" 흐름으로 돌아가기 어렵습니다.
포크는 사람의 문제를 해결합니다. "이걸 시도해 보고 싶지만 이미 되는 것을 잃고 싶지 않다"는 문제입니다.
흔한 방법과 트레이드오프
- 마지막 프롬프트를 새 세션에 복사해 붙여넣기: 되긴 하지만 미묘한 맥락을 잃습니다.
- "현재 상태는 이렇다"는 긴 요약 쓰기: 되긴 하지만 시간이 많이 듭니다.
- 같은 세션에서 그냥 계속하며 잘되길 바라기: 빠르지만 나중에 대가를 치릅니다.
- Happier 세션 포크: 이전 맥락을 가진 진짜 분기를 만들고, 공급자 네이티브 포크를 쓸 수 없을 때의 대체 경로도 제공합니다.
Happier가 처음이라면 (무엇이고 어디서 받는지)
Happier는 Claude Code, Codex, OpenCode 같은 AI 코딩 에이전트를 위한 오픈 소스 컴패니언 앱(모바일, 웹, 데스크톱)입니다.
여기서의 흐름은, 실제 세션과 실행 환경은 그것을 가진 머신에 두고, 휴대폰에서 Happier로 안전하게 분기하며 맥락을 유지하는 것입니다.
설정하기:
- 휴대폰에서 Happier 사용하기
- GitHub: https://github.com/happier-dev/happier
- 설치 및 다운로드: https://github.com/happier-dev/happier#how-it-works
- Discord(커뮤니티 및 지원): https://discord.gg/W6Pb8KuHfg
잘 통하는 워크플로 (단계별)
1) 어떤 포크를 원하는지 정하기
Happier는 두 가지 "포크 의도"를 지원합니다.
- 특정 메시지에서 포크(더 이전 지점에서 분기)
- 최신 대화를 포크(세션의 최신 지점에서 분기)
어디서 일이 어긋났는지 정확히 안다면 그 메시지에서 포크하세요.
"지금부터" 병렬 흐름이 필요할 뿐이라면 세션 메뉴에서 포크하세요.
2) 메시지에서 포크하기 (더 이전 지점에서 분기)
대화 기록에서 확정된 메시지에 마우스를 올리거나 탭하고 Fork를 고르세요.
유용한 점: 사용자 메시지에서 포크하면 Happier가 그 메시지를 자식 세션의 입력창에 미리 채워 주므로, 편집해서 더 깔끔한 버전으로 다시 보낼 수 있습니다.
3) 세션의 최신 지점에서 포크하기
세션 동작(헤더 메뉴나 명령 팔레트)의 Fork session으로 확정된 최신 대화 상태에서 포크합니다.
"지금부터 새 분기를 시작하고 싶다"일 때의 동작입니다.
4) Happier가 내부에서 무엇을 하는지 알기 (네이티브 포크 vs 리플레이)
문서는 명확한 선택 순서를 설명합니다.
- 특정 메시지에서 포크할 때는 공급자 네이티브 메시지 지점 포크(OpenCode 서버).
- 세션의 최신 지점에서 포크할 때는 공급자 네이티브 최신 지점 포크(Codex app-server와
session/fork를 노출하는 ACP 백엔드). - 네이티브 포크를 쓸 수 없을 때는 Happier 리플레이 포크.
실질적인 요점은 UI에서 "포크" 동작 하나만 쓰면 Happier가 지원되는 방식을 골라 준다는 것입니다.
5) 리플레이 이해하기 (대화 기록을 어지럽히지 않고 맥락 유지)
리플레이는 안전망입니다.
리플레이가 쓰이면 Happier는:
- 포크 지점까지의 대화 기록으로 리플레이 시드를 만들고
- 자식 세션에서 보내는 첫 사용자 메시지에 한 번만 적용하며
- 시드를 숨겨 둡니다(모델에만 전송되고 대화 기록에는 절대 표시되지 않음)
"숨겨진 시드"라는 점이 중요합니다. 자식 대화 기록을 깔끔하게 유지하면서도 모델이 같은 작업을 이어 가는 것처럼 행동할 만큼의 맥락을 줍니다.
6) 포크된 세션에서 보이는 것
자식 세션에서는:
- 이전 메시지가 읽기 전용 맥락으로 인라인 표시되고
- 위로 스크롤하면 부모의 더 오래된 부분이 자동으로 로드되며
- 자식 세션 자체의 메시지는 평소처럼 상호작용할 수 있습니다
그래서 전체 대화 기록을 복제하지 않고도 방향을 잃지 않습니다.
알아 둘 만한 공급자별 참고
Codex 동작 (포크와 롤백)
Codex app-server가 지원하는 것:
- 세션 수준 포크 동작을 통한 네이티브 최신 지점 포크
- 특정 지점으로 롤백(확정된 사용자 메시지 이전으로 롤백)
하지만 네이티브 메시지 지점 포크는 지원하지 않습니다. 그 경우 리플레이가 대체 수단입니다.
OpenCode 동작
OpenCode 서버는 네이티브로 메시지 지점 포크를 지원합니다(이 기능이 깔끔하게 동작하는 형태입니다).
OpenCode에는 네이티브 포크가 "최선의 노력" 수준일 수 있는 ACP 대체 경로도 있습니다. 쓸 수 없을 때는 리플레이가 사용됩니다.
왜 효과가 있는지 (그리고 무엇이 깨지는지)
포크가 효과를 보는 경우:
- 메인 흐름을 망가뜨리지 않고 다른 접근을 시도하고 싶을 때
- 큰 요약을 쓰지 않고 자식 세션이 맥락을 물려받게 하고 싶을 때
주로 "깨지는" 경우는 리플레이가 꺼져 있거나(또는 시드 예산이 너무 낮거나) 공급자가 시도하는 방식으로 네이티브 포크를 할 수 없을 때입니다.
그 경우 포크 UI를 쓸 수 없거나(일부 포크 유형), 자식 세션이 더 적은 맥락으로 시작합니다.
흔한 실수
- 재개하고 싶었을 뿐인데 포크를 쓰기 → 포크는 분기용이고, 재개는 이어 가기용입니다.
- 너무 늦게 포크하기 → 계획이 어긋난 메시지를 정확히 안다면 거기서 포크하세요.
- 포크된 이전 메시지가 읽기 전용이라는 걸 잊기 → 복사는 할 수 있지만, 이전 부분에서 동작이나 승인이 실행되지는 않습니다.