From 40aa15cc95a0a8b41f94d91263c2f8642758d6f2 Mon Sep 17 00:00:00 2001 From: Claude Lin & Lay Date: Fri, 21 Aug 2026 12:10:14 +0900 Subject: [PATCH] fix(session): let the person answer the cli and choose the working directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 窓は開き部屋ソケットも立ったが、セッションが CLI の信頼確認プロンプトで 止まり先へ進めなかった。原因は二つ。 一つ目、セッションへ入力する経路が無かった。write_pty は Rust 側に存在し invoke_handler にも登録されていたが、フロントエンドはどれも呼んでおらず、 PTY は出力専用の一方通行だった。Claude Code はフォルダごとに初回の信頼確認を 出すため、この経路が無い限りどの作業ディレクトリでもセッションは起動せず、 部屋が立ち上がること自体が構造的に不可能だった。 診断面にセッションへの入力欄と Enter / ↑ / ↓ / Esc / Ctrl+C を追加した。 セッション起動時に診断面を自動で開く。最初に出るのが質問である以上、答えを 運ぶ面が一緒に開いていないと意味がないため。 信頼確認をアプリ側で自動的に答えることはしない。セキュリティ上の確認であり 判断は人間が行う。アプリが負うのは人間が答えられる経路を用意することであって、 代わりに答えることではない。 二つ目、作業ディレクトリがアプリ自身のプロセス cwd になっていた。tab.cwd が None のとき std::env::current_dir() へフォールバックしており、tauri dev では それが src-tauri/ になる。セッションは src-tauri/ で起動し .mcp.json もそこへ 書かれた。作業ディレクトリはユーザーの選択であって、アプリのプロセスがたまたま 居た場所ではない。 暗黙のフォールバックを削除し、未設定ならエラーで止めるようにした。あわせて 画面に入力欄を出し、初回はホームディレクトリを prefill する。prefill であって 既定値ではない。画面に出ていないディレクトリでセッションを起動しない。値は 起動成功時にタブ設定として保存する。 実行で生成される .mcp.json を .gitignore へ追加した。 #20 --- .gitignore | 3 ++ README.md | 4 +- docs/0-requirements.md | 15 +++++- index.html | 31 +++++++++++-- src-tauri/src/config.rs | 12 +++++ src-tauri/src/lib.rs | 1 + src-tauri/src/session.rs | 15 ++++-- src/main.ts | 98 +++++++++++++++++++++++++++++++++++++++- src/styles.css | 83 ++++++++++++++++++++++++++++++++++ 9 files changed, 251 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 96d47e8..2bedac4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ dist/ src-tauri/target/ crates/*/target/ +# Written by a session launched from this directory (see src-tauri/src/session.rs) +.mcp.json + # Environment .env .env.* diff --git a/README.md b/README.md index 737b424..d9aec01 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,9 @@ npm run tauri dev 起動すると Tauri の窓が開き、部屋ソケットが待ち受けを始めます。フロントエンドの dev サーバは `vite.config.ts` で 1420 番に固定しています(`src-tauri/tauri.conf.json` の `devUrl` と一致させる必要があるため)。 -タイトルバーの「診断」で、部屋ソケットの待受状態、セッションの生死、CLI の出力が確認できます。起動に失敗したときは自動で開きます。 +タブの下に作業ディレクトリの入力欄があります。初回はホームディレクトリが入っているので、セッションを動かしたいディレクトリへ変更してください。この値はタブ設定として保存されます。 + +「診断」を開くと、部屋ソケットの待受状態、セッションの生死、CLI の出力が確認できます。ここにはセッションへの入力欄もあります。CLI はフォルダごとに初回の信頼確認を出すため、**最初の一回はここから答える必要があります**。Enter / ↑ / ↓ / Esc / Ctrl+C のボタンも用意しています。 タイトルバーでセッションを選び「セッション参加」を押すと、次の 2 つが行われます。 diff --git a/docs/0-requirements.md b/docs/0-requirements.md index 8df3f5a..5a3c662 100644 --- a/docs/0-requirements.md +++ b/docs/0-requirements.md @@ -143,6 +143,7 @@ liplus-desktop の `stream_parser.rs` および `spawn_stream_pty` / `spawn_stre - サーバの `.mcp.json` 登録(既存内容はマージして保持)と、成立条件を満たす CLI 起動フラグの適用 - 部屋の作法(`instructions`)の初版 - チャットルーム UI(メッセージ一覧、発言者表示、入力欄、参加者表示) +- 診断面(部屋ソケットの待受状態、セッションの生死と終了コード、CLI 出力、セッションへの入力路) - Windows CI(`npm ci` と Rust コンパイル確認)、Release 公開時の CD ### 未検証 @@ -164,6 +165,18 @@ liplus-desktop の `stream_parser.rs` および `spawn_stream_pty` / `spawn_stre これは「ターミナルエミュレータを置かない」制約と衝突しない。会話面に CLI の生出力を流さないという制約は、何が発言かという axis の話であり、診断面は「部屋の下の機構が生きているか」という別の問いに答える。部屋が沈黙しているとき、その沈黙が正常な待機なのか機構の停止なのかは、会話面だけからは区別できない。 +診断面はセッションへの入力路も持つ。文字入力に加えて Enter / ↑ / ↓ / Esc / Ctrl+C を送れる。 + +これも会話面とは別の axis にある。CLI はフォルダごとに初回の信頼確認を出すため、この経路が無いとどの作業ディレクトリでもセッションは起動せず、部屋が立ち上がること自体が構造的に不可能になる。 + +信頼確認や権限確認をアプリが自動で答えることはしない。それらはセキュリティ上の確認であり、判断は人間が行う。アプリが負うのは、人間が答えられる経路を用意することであって、代わりに答えることではない。 + +### 作業ディレクトリ + +セッションの作業ディレクトリは画面に表示し、変更でき、タブ設定として保存する。未設定のままアプリのプロセス cwd へ暗黙にフォールバックしない。 + +`npm run tauri dev` ではアプリのプロセス cwd が `src-tauri/` になるため、暗黙のフォールバックはセッションを `src-tauri/` で起動させ、`.mcp.json` もそこへ書く。作業ディレクトリはユーザーの選択であって、アプリのプロセスがたまたま居た場所ではない。初回はホームディレクトリを prefill するが、これは既定値ではなく prefill である。画面に出ていないディレクトリでセッションを起動しない。 + ## テストの配置 `.mcp.json` への登録と起動フラグの検査は、`crates/mcp-config/` という tauri 非依存の crate に置く。 @@ -187,7 +200,7 @@ CI が実行するもの: 上流から順に確認する。各段は下流の前提であるため、順序を飛ばさない。 1. **部屋ソケットが待ち受けているか。** タイトルバーの「診断」を開き、部屋ソケットの行を見る。`127.0.0.1: で待受中` でなければ以降はすべて不成立。 -2. **セッションが生きているか。** 同じ診断のセッション行を見る。`終了(終了コード N)` なら CLI が落ちている。直下のセッション出力に理由が残る。 +2. **セッションが生きているか。** 同じ診断のセッション行を見る。`終了(終了コード N)` なら CLI が落ちている。直下のセッション出力に理由が残る。CLI が確認プロンプトで止まっている場合は、診断面の入力路から答える。 3. **サイドカーが接続したか。** 参加者表示にセッション名が出る。出ない場合はセッション出力に `room socket: connected as ""` があるかを見る。 4. **サイドカー単体が壊れていないか。** `npm run sidecar:test` を実行する。偽の部屋ソケットを立てて両面を駆動するため、通ればサイドカーではなくアプリ側の問題に絞れる。 5. **`.mcp.json` の登録が効いているか。** セッションの作業ディレクトリの `.mcp.json` に `liplus-chat-room` が入っているかを見る。`--mcp-config` によるファイル渡しでは channel 側が名前を解決できないため、正式登録以外の経路は成立しない。 diff --git a/index.html b/index.html index 4a728b6..61051d1 100644 --- a/index.html +++ b/index.html @@ -16,16 +16,23 @@ 名前 - - +
+ + + +
+
+ this shows whether the machinery under it is alive, and carries the + keyboard the CLI needs before it will start at all. -->