Uh oh!
There was an error while loading. Please reload this page.
feat(editor): IPC ソケットが死んでいたら tmux セッション環境から拾い直す - #102
Conversation
tmux サーバーはセッション作成時の環境変数を保持し続けるが、update-environment に 登録された変数は attach のたびに接続元クライアントの値へ更新される。そのため 「ペインのシェルは古い値、tmux のセッション環境は新しい値」という状態が日常的に 起きる。これまではシェル側のプロンプトフックを入れていない限り、devbase up --open が毎回 print_command へ degrade していた。 - _tmux_env() を追加。TMUX 未設定なら tmux を起動しない。`-NAME` (削除済み) や tmux 不在・非ゼロ終了は None へ倒す。タイムアウト 2 秒で up を止めない - resolve_ipc_socket() を追加。env の値が生きていればそれを使い、死んでいて tmux 内なら セッション環境の値を試す - EditorContext に ipc_socket を追加し、open_editor は拾い直した値を起動する code の env にも渡す。ここを差し替えないと code 自身が古いソケットへ繋ぎに行って失敗する - 接続確認を _socket_connectable() としてパス単位に切り出し - 実環境で検証: 死んだ 53b8ca02 を tmux 側の 8dd26478 へ解決し in_vscode=True になる tmux 外の挙動は変わらない (tmux を一切起動せず、従来どおり警告して degrade)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01622CAKyYfonYuZ6AqRJvDg
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正必須の指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
ベストエフォートであるべき tmux show-environment 呼び出しにおいて、非 UTF-8 出力による UnicodeDecodeError での全体クラッシュリスクや、環境変数の引き継ぎ漏れがあります。インラインコメントの 2 点を確認してください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- `TMUX` を environ で判定しているのに subprocess へ env を渡しておらず、
暗黙に os.environ の TMUX で tmux クライアントが起動していた。
`env={**os.environ, **environ}` を明示して同じ tmux サーバーを見るようにする
(PATH 等を失わないよう os.environ に合成する)。
- `text=True` の decode 失敗 (UnicodeDecodeError) は OSError/SubprocessError の
どちらでもないため素通りし、best-effort のはずの経路で `up` 全体が落ち得た。
同ファイル他箇所と同じ `except Exception` に揃える。
- 回帰テスト 1 件追加 (非 UTF-8 出力) + env 引き継ぎのアサーション追加。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01622CAKyYfonYuZ6AqRJvDgtakemi-ohama
commented
Aug 19, 2026
🔧 /ndf:fix サマリ対応件数: critical=0 / major=1 / minor=1 (合計 2 件) 詳細
検証
|
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正必須の指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | APPROVE
変更内容について確認しました。特に修正を要する点はありません。
Uh oh!
There was an error while loading. Please reload this page.
概要
tmux 内で
VSCODE_IPC_HOOK_CLIが古くなっていても、tmux のセッション環境から生きた値を拾い直して VS Code を自動で開くようにします。#100(孤児ソケットの検出)と #101(ドキュメントのフック修正)で「無言の失敗」は無くなりましたが、実際に自動で開くかどうかはシェル側のプロンプトフックが正しく入っているかに依存したままでした。そこを devbase 側で吸収します。
なぜ tmux を見れば確実なのか
tmux サーバーはセッション作成時の環境変数を保持し続けますが、
update-environmentに登録した変数は attach のたびに接続元クライアントの値へ更新されます。つまり次の状態が日常的に起きます。実際に報告のあった環境がこの状態でした。
$TMPDIRを走査して生きたソケットを選ぶ案も検討しましたが、生きたソケットが複数ある場合(報告環境では 3 本)にどのウィンドウが開くか決められないため採りませんでした。tmux のセッション環境なら tmux が attach 時に記録した正しい値が入っており、曖昧さがありません。変更点
_tmux_env(name, environ)を追加TMUX未設定なら tmux を一切起動しないtmux show-environmentが未設定変数を返す形式-NAMEを値として扱わないNoneへ倒すupを止めないresolve_ipc_socket(environ)を追加。env の値が生きていればそれを使い、死んでいて tmux 内ならセッション環境の値を試すEditorContextにipc_socketを追加。open_editorは拾い直した値を起動するcodeの env にも渡すcode自身が古いソケットへ繋ぎに行って失敗するため、判定だけ直しても意味がない_socket_connectable(path)としてパス単位に切り出し(_ipc_socket_aliveは委譲)tmux 外の挙動は変わりません。
TMUXが無ければ tmux を起動せず、従来どおり警告して degrade します。動作確認
uv run pytest— 1243 件 green(新規 9 件を含む / 変更前 1234 件)ruff check --select=E9,F63,F7,F82 lib(CI と同じ引数)— All checks passedpython -m compileall -q lib bin(CI と同じ)— OK新規テストで押さえた挙動:
test_tmux_env_returns_none_outside_tmuxsubprocess.runを 1 度も呼ばないtest_tmux_env_treats_removed_marker_as_unset-NAMEを値として扱わないtest_tmux_env_survives_tmux_failureOSError)/非ゼロ終了でNonetest_resolve_ipc_socket_prefers_live_env_valuetest_resolve_ipc_socket_falls_back_to_tmuxtest_resolve_ipc_socket_none_when_tmux_value_also_deadNonetest_open_editor_passes_recovered_socket_to_launchertest_open_editor_without_tmux_does_not_recoverドキュメント
update-environmentの設定だけでdevbase upには十分であることを明記codeを手で叩く、git askpass 等)のためのものと位置づけを整理