From 1e32a2568d1fa3c8174f9820cc80a738fe1a78da Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Sun, 14 Jun 2026 19:49:36 +0900 Subject: [PATCH] =?UTF-8?q?feat(tui):=20devbase=20list=20=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E6=99=82=E3=81=AB=E7=94=BB=E9=9D=A2=E3=82=92=E3=82=AF?= =?UTF-8?q?=E3=83=AA=E3=82=A2=E3=81=97=E3=81=A6=E3=83=97=E3=83=AD=E3=83=B3?= =?UTF-8?q?=E3=83=97=E3=83=88=E3=82=92=E5=85=88=E9=A0=AD=E8=A1=8C=E3=81=AB?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit トップ一覧の再描画前に `_clear_screen()` を呼び、表示領域とスクロール バックを消去してカーソルを先頭行へ戻す (CTRL+L 相当)。非 TTY 時は何も しない。 Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/devbase/tui/app.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/devbase/tui/app.py b/lib/devbase/tui/app.py index 038671d..1f00fa1 100644 --- a/lib/devbase/tui/app.py +++ b/lib/devbase/tui/app.py @@ -68,6 +68,20 @@ def _route(category: str, devbase_root: Path): return module.run(devbase_root) +def _clear_screen() -> None: + """端末をクリアしてカーソルを先頭行へ戻す。 + + トップ一覧 (メニュープロンプト) を画面の先頭行から表示するため、再描画の + 直前に呼ぶ。``\\033[2J`` で表示領域を消去、``\\033[3J`` でスクロールバック + も消去、``\\033[H`` でカーソルを左上へ移動する。stdout が非 TTY の場合は + 何もしない。 + """ + if not sys.stdout.isatty(): + return + sys.stdout.write("\033[3J\033[2J\033[H") + sys.stdout.flush() + + def _pause_for_review() -> bool: """操作出力を読めるよう、一覧の再表示前に Enter を待つ。 @@ -129,6 +143,7 @@ def _top_menu_loop(devbase_root: Path) -> int: last_rc = 0 projects_dir = Path(devbase_root) / "projects" while True: + _clear_screen() rows = list_projects(projects_dir) if not rows: # プロジェクト未作成でもカテゴリ操作 (env/plugin/...) は使えるため