Skip to content

Fix: tmux に手元から attach し直した端末を SSH と誤判定して VS Code を開かない - #447

Merged
takemi-ohama merged 4 commits into
mainfrom
fix/editor-tmux-ssh-detect
Oct 8, 2026
Merged

takemi-ohama merged 4 commits into
mainfrom
fix/editor-tmux-ssh-detect

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

概要

macOS で devbase editor open を実行すると、VS Code が開かずに次の表示で終わる場合がありました。

SSH セッションを検出しました (SSH セッション (VS Code 外) のため)。
手元の VS Code で次を実行するか、…

原因

SSH(Remote-SSH)から立てた tmux サーバーのセッションに、手元の Mac の VS Code の端末から attach し直した状態で起きていました。

見た所 値
ペインのシェル 作成時の SSH_CONNECTION・SSH_CLIENT、接続を拒否する VSCODE_IPC_HOOK_CLI、PATH に Remote-SSH の remote-cli
tmux のセッション環境(いまのクライアント) -SSH_CONNECTION・-VSCODE_IPC_HOOK_CLI

detect_context は SSH かどうかをペインのシェルの変数だけで判定していたため、手元の端末なのに SSH と判定していました。

変更

  • tmux 内では、SSH の判定にセッション環境の SSH_CONNECTION を使う。SSH_CONNECTION は tmux の update-environment に既定で入っていて、attach のたびに更新される
    • -SSH_CONNECTION なら SSH ではない
    • 値があれば SSH
    • 分からないとき(tmux の外・tmux の失敗)は、これまでどおりペインの SSH_CONNECTION / SSH_CLIENT / SSH_TTY で判定する
  • _tmux_show_env を足し、「値がある」「消されている」「分からない」の 3 通りを返す。_tmux_env はその上に載せ、振る舞いは変えない
  • 接続できない VSCODE_IPC_HOOK_CLI は、起動する code の環境から外す。デスクトップ版の code スクリプトは、この変数があり PATH に remote-cli があるとそちらへ委譲するため、死んだソケットへ繋ぎに行って失敗する
  • 利用者向け文書(環境変数ガイドの tmux の節)と CHANGELOG.md を更新

テスト計画

  • env -u DEVBASE_ROOT uv run --locked pytest tests/ -q — 4119 passed, 20 skipped
  • uvx ruff check --select=E9,F63,F7,F82 lib — All checks passed
  • python3 .github/scripts/proper_term_check.py — 語の一覧が無いため飛ばした(固有の語は差分を目で確認。テストの IP は文書用の 192.0.2.x)
  • 実際の tmux セッション(上の状態のもの)に向けて detect_context を呼び、is_ssh=False・decide_action が launch になることを確認
  • 上の状態の端末で devbase editor open を実行し、VS Code が開くことを確かめる(マージ後に実機で)

🤖 Generated with Claude Code

https://claude.ai/code/session_0132TF57VoNwcda3qwVBmKYN

SSH から立てた tmux サーバーのセッションへ手元の Mac の端末から attach し直すと、
ペインのシェルには作成時の SSH_CONNECTION と死んだ VSCODE_IPC_HOOK_CLI が残る。
editor open はペインの変数だけで SSH と判定し、print_command に落ちていた。

- tmux 内では、attach のたびに更新されるセッション環境の SSH_CONNECTION で判定する
  (-SSH_CONNECTION なら SSH でない。分からなければ従来どおりペインの変数)
- _tmux_show_env を足し、値・消されている・分からないの 3 通りを返す
- 接続できない VSCODE_IPC_HOOK_CLI は起動する code に渡さない
  (PATH に remote-cli が残る端末で code がそちらへ委譲して失敗するため)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132TF57VoNwcda3qwVBmKYN

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

SSH 判定と採用する IPC 接続先を整合させる修正が必要です。

Comment thread lib/devbase/editor/opener.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | APPROVE

tmux 内で SSH 判定をセッション環境に切り替える修正と、死んだ VSCODE_IPC_HOOK_CLI を code に渡さない修正。実装・ドキュメント・テストが一致し、_detect_ssh のフォールバック(tmux 外・tmux 失敗時はペインのシェル変数)も従来挙動を保つ。基盤となる事実(tmux の既定 update-environment に SSH_CONNECTION が含まれる)も確認でき、critical/major の指摘は無し。

Remote-SSH の VS Code を開いたまま tmux を detach し、手元の端末から attach し直すと、
ペインの VSCODE_IPC_HOOK_CLI は以前のリモートクライアントへ繋がって生きている。
SSH 判定だけがローカルになり、ネスト authority の無い URI がそのクライアントへ
送られてホスト上のコンテナを開けなかった。

- SSH 判定と IPC の採用元を、同じセッション環境の SSH_CONNECTION の読みで決める
- ペインに SSH_* が残るのにセッション環境が -SSH_CONNECTION なら、ペインの IPC は
  採らず、セッション環境の値だけを試す。採れなければ code に渡さない

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132TF57VoNwcda3qwVBmKYN
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | round 1 | commit ae96ee9

対応件数: critical=0 / major=1 / minor=0(合計 1 件)
決着: 1 件 / 見送り: 0 件 / 却下: 0 件
CI: SUCCESS

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | claude | REQUEST_CHANGES

手元から attach し直したペインで VSCODE_IPC_HOOK_CLI を外しても、PATH に残る Remote-SSH の remote-cli の code が選ばれるため、VS Code は開かず無言で終わります。起動するコマンドの解決まで含めて直してください。

Comment thread lib/devbase/editor/opener.py

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | kiro | APPROVE

round 1 の major(SSH 判定と IPC 採用元の不整合)に対する ae96ee9 の修正を確認。detect_context が SSH_CONNECTION のセッション環境読み (tmux_ssh) を 1 回だけ取り、_detect_ssh と _pane_ipc_is_foreign の両方へ同じ値を渡すことで判定と IPC 採用元が整合する。foreign+ローカル再 attach 時は trust_current=False で以前の Remote-SSH の IPC を採らず、ipc_foreign で code にも渡さない。is_ssh=False のため _build_open_uri はネスト authority を組まずフラット URI を出す経路になり、launch へ落ちる。死んだソケットを code に渡さない挙動変更は CHANGELOG と docs に記載があり、print_command への誤 degrade も起きない。実装・ドキュメント・テスト(session-removed=local、session-value=ssh、tmux 失敗時のシェル fallback、live-remote IPC 無視、session IPC 採用)が一致。critical / major の指摘は無し。

手元から attach し直したペインや死んだソケットで VSCODE_IPC_HOOK_CLI を外すと、
PATH の先頭に残る Remote-SSH の remote-cli の code が選ばれ、IPC 無しでは何も
開かずに終わっていた。IPC を外すときは PATH から remote-cli を除いて手元の code を
探し、起動する code の env にも同じ PATH を渡す。見つからなければスキップする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132TF57VoNwcda3qwVBmKYN
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | round 2 | commit 5d2bda6

対応件数: critical=0 / major=1 / minor=0(合計 1 件)
決着: 1 件 / 見送り: 0 件 / 却下: 0 件
CI: SUCCESS

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | claude | APPROVE

round 2 の major(IPC を外したときに PATH に残る remote-cli の code が選ばれる)への 5d2bda6 の修正を確認しました。IPC を外したときは remote-cli を除いた PATH で code を探し、起動する env にも同じ PATH を渡します(subprocess は env の PATH で実行ファイルを探します)。見つからなければ skip へ落ちます。死んだソケットの分岐も同じ扱いです。実装・CHANGELOG・environment-variables.md・テストは一致しています。critical / major の指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | codex | REQUEST_CHANGES

ローカルから SSH へ再 attach する場合も、SSH 判定と採用する IPC 接続先を整合させてください。

Comment thread lib/devbase/editor/opener.py Outdated
いまのクライアントの SSH 状態(tmux のセッション環境の SSH_CONNECTION)が
ペインのシェルの SSH 状態(SSH_* の有無)と食い違うときは、向きによらず、
ペインの VSCODE_IPC_HOOK_CLI はペインを作った以前のクライアントのものとして使わない。
セッション環境の IPC が生きていればそれを使い、無ければ IPC 無し(SSH なら
コマンドの提示、手元なら remote-cli を除いた PATH で手元の code を起動)。
foreign の判定をこの対称な 1 つの判定(_client_changed)に置き換えた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132TF57VoNwcda3qwVBmKYN
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | round 3 | commit 0880c15

対応件数: critical=0 / major=1 / minor=0(合計 1 件)
決着: 1 件 / 見送り: 0 件 / 却下: 0 件
CI: SUCCESS

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | codex | APPROVE

新規の critical / major 指摘はありません(判断根拠: Mission・Vision。通常の起動経路と再 attach 時の接続先の整合性を確認)。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | kiro | APPROVE

round 3 の major(ローカル→SSH 再 attach でも SSH 判定と採用 IPC を整合させる)への 0880c15 の修正を確認。_client_changed は向きを問わず(current_is_ssh != pane_is_ssh)判定し、detect_context が tmux セッション環境の SSH_CONNECTION を 1 回だけ読んで _detect_ssh と trust_current の両方へ渡すため、SSH 判定と IPC 採用元が同じ読みで揃う。ローカル→SSH の両経路(セッション IPC があれば採用し launch、無ければ ipc_from_previous_client で IPC を外し is_ssh=True のまま print_command)が実装・テストと一致。tmux 外・tmux 失敗時は changed=False で従来挙動を保ち、生きたローカル IPC の誤 drop は起きない。変更範囲は opener.py / tests / CHANGELOG / environment-variables.md に限られ、余分な仕様変更は無い。critical / major の指摘は無し。

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit (なし)

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 0 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama
takemi-ohama merged commit e16e627 into main Oct 8, 2026
10 checks passed
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