diff --git a/cmd/opencodereview/provider_tui.go b/cmd/opencodereview/provider_tui.go index 4075360..0b7e27a 100644 --- a/cmd/opencodereview/provider_tui.go +++ b/cmd/opencodereview/provider_tui.go @@ -124,6 +124,14 @@ func collectCustomProviders(cfg *Config) []customProviderListItem { func newProviderTUI(cfg *Config) providerTUIModel { providers := llm.ListProviders() + sort.SliceStable(providers, func(i, j int) bool { + left := strings.ToLower(providers[i].DisplayName) + right := strings.ToLower(providers[j].DisplayName) + if left == right { + return providers[i].Name < providers[j].Name + } + return left < right + }) mi := textinput.New() mi.Placeholder = "model name" diff --git a/cmd/opencodereview/provider_tui_test.go b/cmd/opencodereview/provider_tui_test.go index 2dc6ab4..12f4422 100644 --- a/cmd/opencodereview/provider_tui_test.go +++ b/cmd/opencodereview/provider_tui_test.go @@ -1,6 +1,8 @@ package main import ( + "sort" + "strings" "testing" tea "charm.land/bubbletea/v2" @@ -136,6 +138,21 @@ func TestProviderTUI_TabSwitchOnlyOnStepProvider(t *testing.T) { // --- Official tab tests (updated from original) --- +func TestProviderTUI_OfficialProvidersSortedByDisplayName(t *testing.T) { + m := newProviderTUI(&Config{}) + + displayNames := make([]string, len(m.providers)) + normalized := make([]string, len(m.providers)) + for i, p := range m.providers { + displayNames[i] = p.DisplayName + normalized[i] = strings.ToLower(p.DisplayName) + } + + if !sort.StringsAreSorted(normalized) { + t.Errorf("provider display names are not sorted: %v", displayNames) + } +} + func TestProviderTUI_EscFromModelGoesBackToProvider(t *testing.T) { m := newProviderTUI(&Config{})