Skip to content

fix(tui): 環境変数メニュー再構成 + Esc/Ctrl-C 二重 exit クラッシュ修正#65

Merged
takemi-ohama merged 3 commits into
mainfrom
feature/tui-env-menu-restructure
Jun 13, 2026
Merged

fix(tui): 環境変数メニュー再構成 + Esc/Ctrl-C 二重 exit クラッシュ修正#65
takemi-ohama merged 3 commits into
mainfrom
feature/tui-env-menu-restructure

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

Pull Request

概要

devbase list TUI の改善 2 件(コミット単位で分離):

  1. 環境変数メニューの再構成: 「変数一覧 → スコープ選択 → プロジェクト選択 → 変数なし」と階層が深く混乱を招いていたメニューを、参照・対話系のみのフラットな構成に変更
  2. 実 TTY クラッシュ修正: Esc と Ctrl-C をほぼ同時に押す(または Ctrl-C 連打)と Return value already set. Application.exit() failed. のクラッシュ画面が出る問題を修正

関連 Issue

変更点

1. 環境変数メニューの再構成(a6a1976

新しいメニュー構成:

項目 動作
変数一覧 (グローバル) 中間プロンプトなしで即表示
エディタで編集 (edit) $EDITOR で .env を直接編集
認証情報の再同期 (sync) 即実行
プロジェクト変数の対話設定 (project) プロジェクト選択 → 対話設定
初期セットアップ (init) 即実行
  • プロジェクト単位の変数一覧は TUI から削除(CLI で実行)
  • get / set / delete / export / import を TUI から削除(CLI で実行。値の変更は editproject で代替)
  • 不要になったヘルパ(KEY=VALUE 収集・スコープ選択共通フロー・export/import 既定値テーブル)を削除し -615 行

2. Application.exit() 二重呼び出しの防止(94859fd

  • 原因: Esc バインドは矢印キーのシーケンスと区別するため eager=False(確定待ち)。Esc + Ctrl-C が同一入力バッチで届くと、prompt_toolkit は 1 回のキー処理内で「Esc ハンドラ(exit 確定)→ 残りバッファ再処理で questionary 組み込み Ctrl-C ハンドラ」を連続実行し exit が二重に呼ばれる。process_keysis_done ガードは入力キューにしか効かず、この経路は防げない
  • 修正: 全プロンプト共通の通過点 _ask_erased_guard_after_done を追加。アプリの key_bindings を ConditionalKeyBindings(kb, ~is_done) でラップし、回答確定後のキー処理を無効化する(確定後の Ctrl-C は無視され、1 回目の操作が正常に効く)

動作確認

  • pytest tests/ 全 682 件パス(skip 1 件は zsh 未インストールによる補完テストのみ)
  • pty 回帰テスト: Esc+Ctrl-C を 1 回の write で送出する実 TTY 再現テストを追加。ガードを外すと実際にクラッシュ出力を検出して失敗することを確認済み(再現条件の正確性を検証)
  • ホスト側の実 TTY で「環境変数 → 変数一覧 (グローバル)」と Esc/Ctrl-C 連打の手動確認

スクリーンショット・ログ(任意)

$ uv run pytest tests/ -q
682 passed, 1 skipped in 28.83s

補足

  • エラーログ末尾の RuntimeError: There is no current event loop in thread 'MainThread' は本クラッシュの後始末で出る二次ノイズで、根本原因は同一
  • クラッシュ修正は select だけでなく confirm/text/path を含む全プロンプトに適用される(_ask_erased が単一の適用点)

🤖 Generated with Claude Code

takemi-ohama and others added 3 commits June 13, 2026 00:45
devbase list の環境変数メニューが「変数一覧 → スコープ選択 → プロジェクト
選択」と深く、プロジェクトのみ表示は .env 未作成時に何も表示されない問題が
あった。メニューを参照・対話系のみに絞り、階層を浅くする。

- 変数一覧はグローバル一覧のみとし、中間プロンプトなしで即実行する
- プロジェクト単位の変数一覧は TUI から削除 (CLI で実行)
- get / set / delete / export / import を TUI から削除 (CLI で実行。
  値の変更は edit ($EDITOR) と project (対話設定) で代替)
- 不要になったヘルパ (_collect_assignment / _select_scoped_project /
  export・import 既定値テーブル) を削除

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
実 TTY で Esc と Ctrl-C をほぼ同時に押す (または Ctrl-C 連打) と
「Return value already set. Application.exit() failed.」のクラッシュ画面が
出る問題を修正する。

Esc バインドは矢印キーのエスケープシーケンスと区別するため eager=False
(確定待ち) で登録しており、Esc + Ctrl-C が同一入力バッチで届くと
prompt_toolkit は 1 回のキー処理内で「Esc ハンドラ (exit 確定) → 残り
バッファ再処理で questionary 組み込み Ctrl-C ハンドラ」を連続実行し、
exit が二重に呼ばれる。process_keys の is_done ガードは入力キューにしか
効かず、この同一バッファ再処理の経路は防げない。

全プロンプト共通の通過点 _ask_erased に _guard_after_done を追加し、
アプリの key_bindings (questionary 組み込み + 後付けの Esc/←) を
ConditionalKeyBindings(kb, ~is_done) でラップして回答確定後のキー処理を
無効化する。

pty 回帰テストは Esc+Ctrl-C を 1 回の write で送出して再現する (ガードを
外すと実際にクラッシュ出力を検出して失敗することを確認済み)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@takemi-ohama takemi-ohama merged commit 4e40925 into main Jun 13, 2026
5 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