Skip to content

feat(list): devbase list の対話選択を simple-term-menu で TUI 化 (i29)#42

Merged
takemi-ohama merged 7 commits into
mainfrom
feat/list-tui-simple-term-menu-impl
Jun 8, 2026
Merged

feat(list): devbase list の対話選択を simple-term-menu で TUI 化 (i29)#42
takemi-ohama merged 7 commits into
mainfrom
feat/list-tui-simple-term-menu-impl

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

概要

devbase list(TTY 時の対話選択)を simple-term-menu ベースの TUI 化し、矢印キー移動・[1-9] 番号ジャンプ・/ インクリメンタル検索で起動プロジェクトを選べるようにします。設計書 issues/i29_list-tui-simple-term-menu.md / 実装プラン issues/i29_list-tui-plan.md に基づきます。

変更は lib/devbase/commands/project.py の対話選択ロジックに限定し、非 TTY 判定(cmd_project_list の isatty ガード)と一覧テーブル出力は現状維持です。simple_term_menu 未導入環境では従来の番号入力方式へフォールバックします。

関連 Issue

変更点

  • 依存追加: simple-term-menu>=1.6(Unix 専用の任意依存。pyproject.toml / uv.lock
  • TUI 選択の実装 (lib/devbase/commands/project.py):
    • _build_menu_entries / _color_status: rows → メニュー表示文字列生成。先頭 9 件に [1-9] ショートカット付与、STATUS の色付け(running=緑 / stopped=灰、_STATUS_COLOR で無効化可)
    • _show_menu / _tui_select_and_up / _start_project_up: TerminalMenu 起動と project up 委譲
    • _interactive_select_and_up: _HAVE_TERMINAL_MENU の import 可否で TUI / 番号入力を分岐するディスパッチャに変更(旧本体は _fallback_select_and_up へ改名・温存)
  • テスト (tests/cli/test_project_list.py): TUI 経路・中止・fallback のテストを追加。既存 input ベース 6 件は _HAVE_TERMINAL_MENU=False 固定で fallback テストとして成立化
  • ドキュメント: CHANGELOG / README 更新

動作確認

  • uv run pytest tests/cli/test_project_list.py -q → 40 passed(既存 34 + 新規 6)
  • uv run pytest -q → 439 passed, 1 skipped
  • uv run python -m compileall -q lib bin → エラーなし
  • uvx ruff check --select=E9,F63,F7,F82 lib → All checks passed
  • 実機 TTY 検証(要手動): ./bin/devbase list で ↑↓ 移動(端で循環)/ 1-9 ジャンプ / / 検索 / Enter 起動 / Esc 中止 / STATUS 色で桁ずれ・検索崩れがないこと
  • 非 TTY 確認(要手動): ./bin/devbase list | cat がプレーンテーブルを出すこと

補足

  • 非対象(YAGNI): 複数選択 / 一括 up、preview pane、Windows ネイティブ対応、多桁番号の任意行直接ジャンプ
  • 実機で STATUS 色により桁ずれ等が出る場合は _STATUS_COLOR = False でプレーン表示にデグレード可能

@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

ANSI 色付き menu entry による TUI 表示幅崩れは修正してください。

Comment thread lib/devbase/commands/project.py Outdated
Comment thread lib/devbase/commands/project.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 | gemini | APPROVE

The implementation correctly introduces the TUI interactive project selector using simple-term-menu according to the plan. I have reviewed the code and everything looks solid. No further changes required.

- _STATUS_COLOR を False に: menu entry に ANSI を埋め込むと
  simple_term_menu の wcswidth() が -1 を返し表示幅計算/ハイライト消去が
  崩れるため、実機検証まで色付けを無効化 (機能 > 装飾)
- _build_menu_entries: ショートカット無し行 (10件目以降) の手動 4 スペース
  字下げを除去。simple_term_menu はショートカット定義時に全行へ 4 文字
  ガターを自前描画するため、二重インデントになっていた
- test: 上記に合わせて 10件目の期待値を body 先頭 (字下げ無し) に更新

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🛠 cross-review fix | round 1 | 対応サマリ

codex (REQUEST_CHANGES) の 2 件をコードを読んで再判定のうえ、いずれも妥当と確認し修正しました。gemini は APPROVE (指摘 0)。

対応コミット: 41de921

重要度 件数 内容
major 1 _STATUS_COLORFalse に変更。menu entry の ANSI で wcswidth() が -1 となり表示幅計算/ハイライト消去が崩れるため、実機検証まで色付けを無効化
minor 1 _build_menu_entries: 10 件目以降の手動 4 スペース字下げを除去。simple_term_menu はショートカット定義時に全行へ 4 文字ガターを自前描画するため二重インデントになっていた
  • 修正: 2 件 (major 1 / minor 1)
  • deferred: 0 件
  • rejected: 0 件
  • テスト: uv run pytest 全 439 passed / 1 skipped (test_project_list.py の 10 件目期待値も更新)
  • CI: push 前スナップショットは全 SUCCESS (Python syntax 3.10-3.12 / Ruff / ShellCheck)

両スレッドへ個別 reply 済み・Resolve 済みです。再レビューをお願いします。

@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 | gemini | APPROVE

設計・実装ともに要件を過不足なく満たしており、TUI導入時のエッジケース(ANSI表示幅の不具合回避や、自動ガター付与時の二重インデント防止)にも適切に対応されています。未対応環境へのフォールバック等も堅牢で問題ありません。

@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 | codex | APPROVE

修正必須の追加指摘はありません。

@takemi-ohama takemi-ohama merged commit d385fcf into main Jun 8, 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