Skip to content

feat(diagnostics): render the session as a real terminal #24

Description

@smileygames

観測(Master 報告、2026-08-21)

往復の手前まで到達し、セッションは動いている。ただし診断面のセッション出力が制御コードの羅列になって読めない。

原因は表示方式。現在の実装は「制御シーケンスを除去して行を追記する」という行指向の扱いをしている。Claude Code はフルスクリーンの TUI であり、カーソル移動・画面消去・部分再描画・代替スクリーンバッファを前提に出力する。行の連なりではないため、除去して追記すると再描画の断片が積み上がるだけになる。

除去の精度の問題ではない。行指向の表示器で TUI を映そうとしていること自体が誤り。

直し方

診断面のセッション出力を xterm.js の端末に置き換える。

  • @xterm/xterm + @xterm/addon-fit(liplus-desktop で実績のある構成)
  • pty-data-{id}terminal.write
  • terminal.onDatawrite_pty
  • fit addon + リサイズ監視 → resize_pty
  • Ctrl+V の貼り付けを clipboard plugin で橋渡し(webview は native paste を端末へ渡さない)

現在の入力欄と Enter / ↑ / ↓ / Esc / Ctrl+C のボタンは不要になる。端末が直接キーを受けるため。制御シーケンス除去のコードも丸ごと消える。

仕様との関係

docs/0-requirements.md の制約節に「ターミナルエミュレータを置かない」という条項は無い。あるのは CLI の出力パースを会話の情報源としないという条項であり、これは維持される。部屋に並ぶ発言は channel と say_to_room からのみ来る。

区別すべき二つ:

  • 却下されている設計: アプリが CLI の出力を解析して発言を取り出す(liplus-desktop の stream_parser.rs のモデル)。
  • 今回やること: 起動した CLI をそのまま映す。解析しない。発言の経路には一切関与しない。

現在 docs 175 行目に「ターミナルエミュレータを置かない制約と衝突しない」という一文があり、読み手によっては前者の禁止と後者の禁止を混同しうる。axis を明示する形に書き換える。

制約

  • 会話面(#room)には端末を置かない。端末は診断面側のみ。
  • 部屋のメッセージ経路は変更しない。CLI の出力を発言として扱わない。
  • @xterm/xterm@xterm/addon-fit 以外の依存を増やさない。

対象ファイル

  • package.json
  • src/main.ts, index.html, src/styles.css
  • docs/0-requirements.md, README.md

完了条件

  • CLI の TUI が崩れずに表示される。
  • 端末へ直接キー入力でき、確認プロンプトに答えられる。
  • ウィンドウのリサイズが CLI 側へ伝わる。
  • 制御シーケンス除去のコードと専用キーボタンが削除されている。
  • 部屋のメッセージ経路が channel 由来のみであることが docs で読み取れる。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions