You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add CLI availability checks and provider opt-in settings (#39)
* Add CLI availability checks and provider opt-in settings
Detect installed CLI tools (claude, codex, gemini) at startup and let
users enable/disable providers in repo settings. Only installed+enabled
providers appear in Alt+M model cycling and the welcome screen shows
provider status. Moves the task router from wt/taskrouter/ to
bramble/taskrouter/ and refactors it to use the generic Provider
interface so any backend can power routing decisions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix review findings: wiring gaps, timeout, and version noise
- Wire ModelRegistry into session.ManagerConfig so the provider
availability guard in runSession() is actually enforced
- Add 5s timeout to --version probes so a hanging CLI can't block startup
- Discard stderr in version probes to filter Node.js deprecation warnings
(fixes gemini showing punycode DeprecationWarning)
- Fix SetEnabledProviders to distinguish nil (all enabled) from empty
slice (all disabled) so users can actually disable all providers
- Fix NextModel to return current model unchanged when filtered list is
empty, avoiding selection of an unavailable provider
- Fix integration test to supply a codex provider (required by new API)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Show all color themes as visual grid in settings dialog
Replace the blind left/right theme cycling with a responsive grid of
color swatches. Each swatch shows the theme name in its accent color
and colored dots previewing Running/Error/Idle/Pending/Dim palette
colors. Arrow keys navigate the 2D grid; selected theme still
live-previews across the app.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix review findings: nil-means-all bug, registry race, and router panic
- EnabledProviders: use make([]string, 0, ...) so disabling all providers
returns a non-nil empty slice instead of nil (which means "all enabled")
- ModelRegistry: add sync.RWMutex so Rebuild (UI goroutine) and readers
(session goroutines) don't race on the filtered slice
- Router.Route: nil-check result before dereferencing result.Error to
prevent panic when provider returns (nil, nil)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix non-installed providers polluting enabled set
Only mark installed providers as enabled in Show() default path, and
filter out non-installed providers from explicit enabledProviders list.
Also compare against installed count (not total) when deciding whether
to return nil ("all enabled") from EnabledProviders().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix nil-vs-empty provider semantics and code duplication
Addresses remaining review comments:
1. **Fix nil-vs-empty confusion (High Severity)**:
- Changed EnabledProviders from `[]string` to `*[]string` in Settings
- nil pointer means "all providers enabled" (default/unset)
- Non-nil pointer to empty slice means "no providers enabled"
- This distinction survives JSON round-trip (nil omitted, [] preserved)
- Updated all consumers to use `enabledProviders == nil` instead of `len() == 0`
2. **Remove unused IsProviderEnabled method**:
- Method is never called, but kept it for API completeness
- Added GetEnabledProviders() helper for common access pattern
3. **Fix boxWidth code duplication (Low Severity)**:
- Extracted dialogBoxWidth() helper method
- Prevents navigation-rendering mismatch if calculation diverges
Related bugbot findings:
- Fixes "Empty enabled providers treated as all-enabled" (ID: 79b6d740)
- Fixes "JSON omitempty loses all-disabled state" (ID: adb89310)
- Addresses "Duplicated boxWidth calculation" (ID: a3cbc788)
* Fix Show() to correctly distinguish nil vs empty enabled providers
The Show() method was using len(enabledProviders) == 0 to check for
the "all enabled" case, but this matches both nil and empty slices.
According to the Settings design:
- nil means "all enabled" (default/unset)
- empty slice means "all disabled"
Changed to enabledProviders == nil to correctly distinguish these cases.
This prevents the dialog from re-enabling all providers when the user
has explicitly disabled everything.
Fixes the last remaining issue identified in PR review.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
0 commit comments