워크스페이스 & 터미널

레이아웃 저장 & 복원

브라우저를 닫거나 서버를 재부팅해도 탭이 정확히 그 자리에 돌아오는 이유.

purplemux는 "브라우저 탭을 닫는 것이 세션을 끝내는 것이어선 안 된다"는 전제로 설계됐습니다. 두 축이 함께 동작합니다 — tmux가 쉘을 살려두고, ~/.purplemux/workspaces.json이 레이아웃을 기억합니다.

저장되는 것

워크스페이스에서 눈에 보이는 모든 것:

  • 탭과 그 순서
  • 창 분할과 분할 비율
  • 각 탭의 패널 타입 — Terminal, Claude, Diff, Web browser
  • 모든 쉘의 작업 디렉토리
  • 워크스페이스 그룹, 이름, 순서

workspaces.json은 레이아웃 변경 때마다 트랜잭션 단위로 업데이트되므로 파일은 항상 현재 상태를 반영합니다. 디스크 파일 구조는 데이터 디렉토리를 참고하세요.

브라우저 닫기

탭을 닫든, 새로고침하든, 노트북을 덮든 — 세션이 끝나지 않습니다.

모든 쉘은 전용 purple 소켓의 tmux 세션 안에 살아있습니다. 사용자의 ~/.tmux.conf와 완전히 격리됩니다. 한 시간 뒤에 http://localhost:8022를 다시 열면 WebSocket이 동일한 tmux 세션에 재연결되고, 스크롤백을 재생한 뒤 살아있는 PTY를 xterm.js로 넘겨줍니다.

복원이 아니라 재연결입니다.

모바일도 똑같이
휴대폰에서도 동일합니다. PWA를 닫고, 기기를 잠그고, 다음 날 다시 열어도 — 대시보드는 모든 것을 그대로 둔 채 재연결합니다.

서버 재부팅 후 복구

재부팅은 tmux 프로세스를 종료시킵니다 — 결국은 OS 프로세스니까요. purplemux는 다음 시작 시 이 상황을 처리합니다.

  1. 레이아웃 읽기workspaces.json이 모든 워크스페이스, 창, 탭을 기술합니다.
  2. 세션 병렬 재생성 — 각 탭마다 저장된 작업 디렉토리에서 새 tmux 세션이 생성됩니다.
  3. Claude 자동 재개 — Claude 세션이 돌고 있던 탭은 claude --resume {sessionId}로 다시 시작되어 대화가 끊긴 지점에서 이어집니다.

"병렬"이라는 점이 중요합니다 — 탭이 10개라면 10개 tmux 세션이 한 번에 올라옵니다. 차례대로가 아니라 동시에. 브라우저를 열 때쯤에는 이미 레이아웃이 준비되어 있습니다.

돌아오지 않는 것

몇 가지는 저장이 불가능합니다.

  • 인메모리 쉘 상태 — 직접 설정한 환경변수, 백그라운드 잡, 진행 중이던 REPL
  • 응답 대기 중이던 권한 프롬프트 — 서버가 죽을 때 Claude가 권한 결정을 기다리고 있었다면, 재개 시 같은 프롬프트가 다시 보입니다
  • claude 외의 포어그라운드 프로세스vim 버퍼, htop, docker logs -f. 쉘은 같은 디렉토리에 있지만 그 안에서 돌던 프로세스는 없습니다

이건 표준 tmux 계약입니다 — 쉘은 살아남지만 그 안의 프로세스는 반드시 그렇진 않습니다.

수동 제어

평소엔 건드릴 일이 없지만 호기심을 위해:

  • tmux 소켓 이름은 purple입니다. tmux -L purple ls로 직접 확인할 수 있습니다.
  • 세션 이름 형식은 pt-{workspaceId}-{paneId}-{tabId}입니다.
  • 서버 실행 중에 workspaces.json을 직접 편집하는 것은 안전하지 않습니다 — 서버가 파일을 잡고 있고 변경을 즉시 써내려갑니다.

이진 프로토콜, 백프레셔, JSONL 워처 같은 더 깊은 이야기는 랜딩의 How it works 섹션을 참고하세요.

다음으로