Skip to content

feat: 端末ペインのタブ化と Claude セッションのタブ別自動 resume#86

Merged
sasagar merged 4 commits into
devfrom
feature/pane-tabs-session-resume
Jul 12, 2026
Merged

feat: 端末ペインのタブ化と Claude セッションのタブ別自動 resume#86
sasagar merged 4 commits into
devfrom
feature/pane-tabs-session-resume

Conversation

@sasagar

@sasagar sasagar commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

概要

3 つの機能追加をまとめた PR です(コミット単位で分割済み)。

1. UI アニメーションの整備(fbaa62e)

  • モーショントークン LaboTheme.Motion(feedback 150ms / move 180ms / tint 200ms)を導入し統一
  • 円形ボタンの押下即時・解放アニメ、ツリーのシェブロン回転、Diff⇄全文ピルのスライド、コピー通知、変更数の数字ロール、状態色クロスフェード、sparkles の symbolEffect
  • WindowVisibilityReader(occlusionState 監視)でウィンドウ非表示中は継続アニメを停止、Reduce Motion 対応

2. 端末ペインのタブ化とフォーカス制御(91349f7)

  • タイル木のリーフを「タブグループ」に拡張。中央ドロップで合流 / 端ドロップで分割(swap は廃止)。チップ単位のドラッグ移動も可能
  • 非表示タブは isHidden + setSurfaceVisible で描画だけ停止し、pty/スクロールバックを温存。タブ切替は木を再構築しない(チラつき防止)
  • 選択・移動・分割・クローズ・新規端末で「新しく前面になった端末」へキーフォーカスを移動
  • 保存形式は後方互換(単一タブは旧形式で書き出し)
  • ペイン別 config で LABOLABO_PANE(ペイン UUID)をシェル環境へ注入(ユーザー config はインライン取り込み・command 設定は意図的に無視)

3. Claude セッションのタブ別記憶と自動 resume・終了時保存(8962e12)

  • hook フォワーダがペイン ID をイベントに付与 → 手打ちの claude も含めてタブと session_id が対応付く
  • タブごとに(セッション ID, transcript パス)を保存し、復元セッションの初回表示時に各タブへそれぞれの claude --resume を自動入力(設定 > 一般でオフ可)
  • transcript が実在しない空セッションはスキップ/プリセット・既定配置には ID を持ち込まない
  • willTerminate で全セッションの最終レイアウト(divider ratio 含む)を同期保存
  • サイドバーのエージェントドットを PhaseAnimator 駆動へ(実行中=ピング / 入力待ち=呼吸ハロー。旧実装は初回挿入時にアニメが始まらないことがあった)

検証

  • swift test 99 件(新規: hook イベントの pane id パーステスト)全パス
  • Debug / Release 両ビルド成功(各コミット単体でもビルド確認済み)
  • 実機確認済み: タブ構成・選択の保存/復元(新旧フォーマット混在含む)、タブ別 auto-resume(4 会話が各タブに復帰)、空セッションのスキップ、対応付けの self-healing、フォント/テーマの読み込み、ウィンドウ被覆時のアニメ停止
  • 未検証: CI ツールチェーン(Xcode 16.4 / Swift 6.0)でのアプリビルド — ローカルは 6.2 のため要 CI 確認

備考

  • plans/(アニメーション監査ドキュメント)はコミットに含めていません
  • libghostty-spm の C API は env 注入(ghostty_surface_config_s.env_vars)を持つため、将来 upstream に TerminalSurfaceOptions.envVars を追加する PR を出せば、ペイン別 config 方式を置き換えられます

sasagar added 4 commits July 12, 2026 23:42
- LaboTheme.Motion(feedback/move/tint)を導入し曲線と時間を統一
- 円形ボタンを押下即時・解放 150ms の非対称アニメに(縮み 0.95)
- ファイルツリーの開閉シェブロンを 180ms で回転(行の出入りは即時のまま)
- Diff⇄全文ピルの選択カプセルを matchedGeometryEffect でスライド
- コピー通知のフェードを 150ms ease-out に
- ステータスピル: 変更数の数字ロール・状態色のクロスフェード・
  実行中/入力待ちを示す sparkles の symbolEffect
- WindowVisibilityReader を追加し、ウィンドウ非表示中は継続アニメを停止
- リーフを「タブグループ(複数ペイン + 選択)」に拡張。中央ドロップで合流、
  端ドロップは従来どおり分割(swap は廃止)。チップのドラッグでタブ単位の移動も可能
- 非表示タブは isHidden + setSurfaceVisible で描画だけ止め、pty/スクロールバックを温存
- タブ切替は木を再構築せず isHidden 張り替えのみ(チラつき防止)。選択・移動・分割・
  クローズ・新規端末のいずれでも「新しく前面になった端末」へキーフォーカスを渡す
- 保存形式は panes/selectedIndex を追加しつつ、単一タブは旧形式で書いて後方互換
- ペイン別 config で LABOLABO_PANE(ペイン UUID)をシェル環境へ注入
  (ユーザー config は内容をインライン取り込み。command 設定は意図的に無視)
- hook フォワーダが LABOLABO_PANE を labolabo_pane_id としてイベントへ付与し、
  エンジンが AgentStatusEvent.paneID として解釈(手打ちの claude も対応付く)
- タブごとに(セッション ID, transcript パス)をレイアウトへ保存。プリセット・
  既定配置への保存時は除去
- 復元セッションの初回表示時、各タブへそれぞれの claude --resume を自動入力
  (設定でオフ可・transcript が実在しない空セッションはスキップ・
  旧 claude の遅延 SessionEnd で status が ended になっていても resume する)
- サイドバーのエージェントドットを PhaseAnimator 駆動に(実行中=ピング、
  入力待ち=呼吸ハロー)。ホバーの × はスペース常時確保でレイアウト不動に
- willTerminate で全セッションの最終レイアウト(divider ratio 含む)を同期保存
- 旧 API(TileNode.pane / swap)への参照を selectedPane / move(center) に更新
- 追加: 中央ドロップ合流・端ドロップ分割独立・タブ単位クローズ・
  タブグループの snapshot 往復(セッション ID / transcript パス込み)・
  単一タブの旧形式書き出しと旧データ読み込み(後方互換)・
  strippingAgentSessions の除去確認
@sasagar sasagar marked this pull request as ready for review July 12, 2026 15:03
@sasagar sasagar merged commit 2ed2556 into dev Jul 12, 2026
2 checks passed
@sasagar sasagar deleted the feature/pane-tabs-session-resume branch July 12, 2026 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant