文件 v1.1.1

TUI 設計取捨

·

TUI 為何以 bubbletea 單一 package 實作,以及何時該重新檢討。

引 pardn chiu:「bubbletea 的設計不是要拆成互相 reference 的獨立模組——拆了會讓 lifecycle 一團亂。我現在沒餘力處理它。」 此模組刻意保持不切分。

TUI 住在單一 package(internal/runtime/tui),不拆成子 package。internal/runtime/tui/ 底下每個檔案都遵循此原則。

為何選 bubbletea(而非 tview / tcell)

先前的 TUI 用 rivo/tview,被替換的原因:

代價是 bubbletea 為 The Elm Architecture 的 Go port——其 tea.Model 介面設計上即為 monolithic。

為何單一 package

tea.Model 要求 Update(tea.Msg) (tea.Model, tea.Cmd) 為 model type 上的 method。Method 必須與 type 住在同一 package。這強制:

真正 Go 風格的 TUI 會建 per-domain widget package(各自持有 state struct、render method 與 event handler),bubbletea 僅作為 event loop。該重構為 600-800 LOC 的重寫,切成 4 個 phase。對目前約 11.2k 非測試 LOC(internal/runtime/tui)、由單一開發者維護的 TUI,收益不足以正當化成本。

何時重新檢視

當任一條件成立時,切換為 per-domain widget package:


[!NOTE] 本文件由 Claude 讀完完整原始碼後自動生成。

EN