観測(Master 報告、2026-08-21)
往復の手前まで到達し、セッションは動いている。ただし診断面のセッション出力が制御コードの羅列になって読めない。
原因は表示方式。現在の実装は「制御シーケンスを除去して行を追記する」という行指向の扱いをしている。Claude Code はフルスクリーンの TUI であり、カーソル移動・画面消去・部分再描画・代替スクリーンバッファを前提に出力する。行の連なりではないため、除去して追記すると再描画の断片が積み上がるだけになる。
除去の精度の問題ではない。行指向の表示器で TUI を映そうとしていること自体が誤り。
直し方
診断面のセッション出力を xterm.js の端末に置き換える。
@xterm/xterm + @xterm/addon-fit(liplus-desktop で実績のある構成)
pty-data-{id} → terminal.write
terminal.onData → write_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 で読み取れる。
観測(Master 報告、2026-08-21)
往復の手前まで到達し、セッションは動いている。ただし診断面のセッション出力が制御コードの羅列になって読めない。
原因は表示方式。現在の実装は「制御シーケンスを除去して行を追記する」という行指向の扱いをしている。Claude Code はフルスクリーンの TUI であり、カーソル移動・画面消去・部分再描画・代替スクリーンバッファを前提に出力する。行の連なりではないため、除去して追記すると再描画の断片が積み上がるだけになる。
除去の精度の問題ではない。行指向の表示器で TUI を映そうとしていること自体が誤り。
直し方
診断面のセッション出力を xterm.js の端末に置き換える。
@xterm/xterm+@xterm/addon-fit(liplus-desktop で実績のある構成)pty-data-{id}→terminal.writeterminal.onData→write_ptyresize_pty現在の入力欄と Enter / ↑ / ↓ / Esc / Ctrl+C のボタンは不要になる。端末が直接キーを受けるため。制御シーケンス除去のコードも丸ごと消える。
仕様との関係
docs/0-requirements.mdの制約節に「ターミナルエミュレータを置かない」という条項は無い。あるのは CLI の出力パースを会話の情報源としないという条項であり、これは維持される。部屋に並ぶ発言は channel とsay_to_roomからのみ来る。区別すべき二つ:
stream_parser.rsのモデル)。現在 docs 175 行目に「ターミナルエミュレータを置かない制約と衝突しない」という一文があり、読み手によっては前者の禁止と後者の禁止を混同しうる。axis を明示する形に書き換える。
制約
#room)には端末を置かない。端末は診断面側のみ。@xterm/xtermと@xterm/addon-fit以外の依存を増やさない。対象ファイル
package.jsonsrc/main.ts,index.html,src/styles.cssdocs/0-requirements.md,README.md完了条件