ワークスペース & ターミナル

レイアウトの保存と復元

ブラウザを閉じてもサーバを再起動しても、タブが正確に元の場所に戻ってくる仕組み。

purplemux は、ブラウザのタブを閉じてもセッションが終わってはいけないという発想で作られています。2 つのピースが連携します: tmux がシェルを動かし続け、~/.purplemux/workspaces.json がレイアウトを記憶します。

何が永続化されるか

ワークスペースで見えるものすべて:

  • タブとその順序
  • ペインの分割と比率
  • 各タブのパネルタイプ — Terminal、Claude、Diff、Web ブラウザ
  • 各シェルの作業ディレクトリ
  • ワークスペースグループ、名前、順序

workspaces.json はレイアウトの変化があるたびにトランザクション的に更新されるため、常に現在の状態を反映します。ディスク上のファイルマップは データディレクトリ を参照してください。

ブラウザを閉じる

タブを閉じる、リフレッシュする、ノートパソコンの蓋を閉じる — どれもセッションを kill しません。

各シェルは専用の purple ソケット上の tmux セッションで動作します — 個人の ~/.tmux.conf から完全に分離されています。1 時間後に http://localhost:8022 を再度開くと、WebSocket が同じ tmux セッションに再アタッチし、スクロールバックを再生して、ライブな PTY を xterm.js に渡し直します。

何かを復元するのではなく、再接続するのです。

モバイルでも同じ
スマートフォンでも同じです。PWA を閉じる、デバイスをロックする、翌日戻ってくる — ダッシュボードはすべて元の状態で再アタッチします。

サーバ再起動からの復旧

再起動すると tmux プロセスは kill されます — 単なる OS プロセスなので。purplemux は次回起動時にこれを処理します:

  1. レイアウト読込workspaces.json がすべてのワークスペース、ペイン、タブを記述しています。
  2. セッションを並列再生成 — 各タブについて、保存された作業ディレクトリで新しい tmux セッションが起動されます。
  3. Claude を自動再開 — Claude セッションが動いていたタブは claude --resume {sessionId} で再起動され、会話を中断したところから再開します。

「並列」が重要です: 10 個のタブがあったら、10 個の tmux セッションが順番ではなく一斉に立ち上がります。ブラウザを開く頃にはレイアウトはすでに整っています。

復元できないもの

いくつかのものは永続化できません:

  • インメモリのシェル状態 — 設定した環境変数、バックグラウンドジョブ、考え途中の REPL。
  • 進行中の権限プロンプト — サーバが死んだとき Claude が権限判断を待っていた場合、再開時にプロンプトが再表示されます。
  • claude 以外のフォアグラウンドプロセスvim のバッファ、htopdocker logs -f。シェルは同じディレクトリに戻りますが、プロセスは戻りません。

これは tmux の標準的な契約です: シェルは生き残るが、その中のプロセスは必ずしも生き残らない。

手動操作

通常は触る必要はありませんが、興味があれば:

  • tmux ソケット名は purpletmux -L purple ls で確認可能。
  • セッション名は pt-{workspaceId}-{paneId}-{tabId}
  • purplemux 起動中に workspaces.json を編集するのは安全ではありません — サーバがファイルを開いて書き込み続けています。

より深い話 (バイナリプロトコル、バックプレッシャー、JSONL ウォッチング) は、ランディングページの 仕組み を参照してください。

次のステップ