SuperMovie Editor の右ドック「AIタブ」に、claude を起動する埋め込み端末を実装しました。別ターミナルで Claude Code を起動する「2窓運用」が不要になります。
このページの目的はひとつだけです。この「エディタに端末を埋め込む」という方式そのものについて、蓮さんの意見が欲しい。賛成でも反対でも「こうした方がいい」でも構いません。技術的な詳細は後半に置いています。まず末尾の「聞きたいこと4点」だけ見ていただければ要点はつかめます。
実際の画面です。右端の「AI」タブの中で claude が動いています。下の 「待機を開始(編集指示を受け付ける)」 を押すと待機プロンプトが端末に自動で入り、「指示待ちに入りました」まで進んだ状態です。
--settings のインライン注入で Claude 側の配色も合わせているAI タブだけを拡大したものです。指示入力欄は廃止し、端末だけにしました(この判断への意見も聞きたいところです)。最下部が「待機を開始」ボタンです。
SuperMovie Editor(Vite dev サーバがそのまま製品として動くブラウザアプリ)の AI タブの中に、claude を pty で起動する埋め込みターミナルを実装しました。
npm install --prefix <エディタ>/.claude-runtime @anthropic-ai/claude-code@2.1.220・グローバル導入はしない)当初は Eclipse Theia で Electron アプリ化し、公式の Claude Code VS Code 拡張(チャット UI)を載せる案でした。競合の AKARI Video がこの方式です。取り下げた理由は2つあります。
claude.ai/install.sh を叩いているだけ。@anthropic-ai/claude-code は npm 公開されているので、ブラウザ版のままでも導入は実現できるxattr -d com.apple.quarantine が必要だった)。解消には Apple 開発者登録(年$99)と Windows コード署名証明書が要る。「黒い画面が怖い」を直すために「アプリが開けない」を招く懸念があるサーバ側4ファイル・クライアント側2ファイルの新規追加のみで、既存の plugin.ts(814行)には一切触っていません。独立した Vite プラグイン smeClaude() に束ね、vite.config.ts の plugins 配列で smeServer() の前に置いています。
| ファイル | 役割 |
|---|---|
claudeBin.ts | claude の検出(グローバル優先→エディタ管理ディレクトリ) |
claudeInstallJob.ts | ローカル導入ジョブ(版固定・進捗ポーリング) |
ptySession.ts | node-pty で claude を起動。エディタ全体で1セッション |
ptyApi.ts | WebSocket。接続制御 |
ClaudeTerminal.tsx | xterm クライアント |
claude --mcp-config '<JSON>' --strict-mcp-config)。ユーザーの ~/.claude/settings.json を汚さない。従来必要だった手動2コマンド(claude mcp add とプロンプト貼り付け)が不要になったSME_PROJECT_ROOT(動画が並ぶ親フォルダ)--settings '{"theme":"light"}')。エディタのライト/ダークに端末が追従するANTHROPIC_API_KEY 等)を pty 環境から既定除去(SME_ALLOW_API_KEY=1 で解除可)typecheck 0 / unit 2618件 全緑 / e2e(実ブラウザ・偽 claude)7件 全緑。ただし「テストが全部緑なのに壊れていた」実バグをレビューで6件潰しています。
| # | 内容 |
|---|---|
| 1 | ws.close() が相手の応答まで最大30秒つながったままで、その間 takeover 後の旧タブが pty に書き込めた |
| 2 | 旧 WebSocket の onclose が新接続の参照を潰し、再起動すると誤エラー表示 or キー入力が消えた |
| 3 | flex-basis:auto の兄弟が肥大し、履歴が溜まるとターミナルが 0px に消えた(子の min-height は外側配分で効かない) |
| 4 | Origin にポートを決め打ちしていたため、別ポート起動で無言で壊れた |
| 5 | MCP URL が実ポートに追随せず、別ポート起動時に別インスタンスの受け箱へ指示が流れる汚染経路があった |
| 6 | xterm に fontFamily 未指定で、罫線・記号が別フォントへフォールバックし桁がずれた(実測: 英数字7.20px に対し ─/▶/⚠ が12.00px=幅3種類 → 修正後は全て7.22px=1種類) |
最初は AI タブに「在席表示+指示履歴+指示入力欄+端末」を積んでいましたが、たきが実機で見て「初心者には渋滞している・黒い端末が怖い」と判断。端末だけに簡素化し、エディタのテーマに追従(白背景可)させました。
指示入力欄は削除しましたが、サーバ側の受け箱・MCP は1行も消していないので、別ターミナルで Claude Code を動かす従来の並列運用は今まで通り使えます。
今の実装では起動できません。 ptySession.ts は claude に固定しています。これは意図的な安全設計で、任意のコマンドを起動できる口にすると pty が汎用のリモートシェルになってしまうためです。
一方で Codex 側の受け入れ体制は揃っています(codex --help で実測確認)。エディタの MCP は HTTP(http://127.0.0.1:<ポート>/mcp)ですが、Codex は "streamable HTTP MCP server" に対応しているため直接つながります。stdio 専用ならブリッジが必要でしたが、その心配はありません。
| Claude Code | Codex | |
|---|---|---|
| HTTP MCP | ○ | ○(codex mcp add <名前> --url <URL>) |
| 設定のインライン注入 | --mcp-config '<JSON>' | -c mcp_servers.…=…(ドット記法・TOML 値) |
| ユーザー設定を汚さない厳格モード | --strict-mcp-config | --strict-config |
待機プロンプトを端末に打ち込む仕組みは特定のツールに依存していない(pty に文字列を書くだけ)ので、「起動できる対象の許可リストに codex を足す」という変更が中心になります。
--settings '{"theme":"light"}' は claude の仕組みで、Codex に同等の手段があるかは未確認。無ければ端末の背景だけ追従し、文字色は Codex 側の既定になるつまり「一箇所直せば両対応」ではなく、ツールごとの薄いアダプタを1枚ずつ書く形になります。土台(pty・接続制御・導入ジョブ・テーマ)は共有できるので、2つ目からは軽くなります。
参考: 競合の AKARI Video も Claude と Codex の両対応で、同じくツールごとの分岐を持っています。