Conversation
파란 고양이 캐릭터 이미지를 앱 아이콘으로 설정 - 모든 macOS 앱 아이콘 사이즈 생성 (16x16 ~ 1024x1024) - Contents.json 업데이트하여 아이콘 파일 연결 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…er support - ProviderProtocol: async fetch interface for all providers - ProviderType enum: payAsYouGo vs quotaBased billing models - ProviderIdentifier enum: copilot, claude, codex, geminiCLI - ProviderUsage enum: supports both billing model variants - Computed properties: usagePercentage, isWithinLimit, statusMessage - Full Codable support for serialization - Equatable conformance for testing Follows existing CopilotUsage pattern with proper error handling.
Implement TokenManager singleton to read and manage authentication tokens from: - OpenCode auth file (~/.local/share/opencode/auth.json) - Antigravity accounts file (~/.config/opencode/antigravity-accounts.json) Features: - Codable structs for JSON parsing (OpenCodeAuth, AntigravityAccounts) - Token accessors for Anthropic, OpenAI, and GitHub Copilot - Gemini OAuth token refresh implementation - Proper error handling with graceful fallbacks - Logging for debugging Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Add CopilotMonitorTests target to Xcode project - Create ProviderUsageTests.swift with fixture loading tests - Add mock JSON responses for Claude, Codex, Copilot, and Gemini providers - All 4 tests pass successfully - Test command: xcodebuild test -scheme CopilotMonitor -destination 'platform=macOS' Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Create CodexProvider conforming to ProviderProtocol - Fetch usage from https://chatgpt.com/backend-api/wham/usage - Parse primary_window.used_percent as utilization percentage - Calculate reset time from reset_after_seconds - Use TokenManager for OpenAI access token and account ID - Return payAsYouGo model with utilization and reset time - Add comprehensive unit tests with fixture-based validation Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Create ClaudeProvider conforming to ProviderProtocol - Implement API call to https://api.anthropic.com/api/oauth/usage - Parse seven_day.utilization into remaining quota percentage - Handle 401 authentication errors - Use TokenManager for auth token access - Add comprehensive unit tests for response parsing
- Custom NSView for multi-provider menu bar display - Shows total overage cost + provider alert icons - Dynamic width calculation based on content - Red-tinted icons for providers <20% remaining - Supports dark mode > Co-authored-by: Claude (oMo, vibe-kanban) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…anager - Extract CopilotProvider from StatusBarController with protocol conformance - Implement GeminiCLIProvider with OAuth token refresh - Add ProviderManager for coordinated multi-provider fetching - Add test coverage for both providers > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Add provider enable/disable toggles in Settings section - Store enabled state in UserDefaults per provider - Add helper functions for provider management - Default all providers to enabled This is Phase 1 of Task 10 & 11: menu structure only. Phase 2 will populate with real provider data. > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
…n menu - Add fetchMultiProviderData() to fetch enabled providers - Add updateMultiProviderMenu() to display Pay-as-you-go and Quota sections - Add helper functions for menu item creation - Add provider-specific SF Symbol icons - Tint icons red when quota <20% - Update project.pbxproj to include provider files > Co-authored-by: Claude (Atlas, Sisyphus, oMo) <no-reply@claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Update title to 'AI Usage Monitor' - Add multi-provider features section - Document 4 supported providers (Copilot, Claude, Codex, Gemini CLI) - Add provider data sources table - Update menu structure documentation - Add OpenCode auth token requirement > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
Codex API returns used_percent (rate limit %), which is quota-based, not pay-as-you-go. Updated: - CodexProvider.type: .payAsYouGo → .quotaBased - CodexProvider.fetch(): Return .quotaBased(remaining, entitlement, overagePermitted) - ProviderProtocol comments: Updated provider classification examples > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
CodexProvider correctly implements quota-based pricing model, but the test was expecting pay-as-you-go. Updated test to match the actual implementation. > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Replace CopilotIcon with SF Symbol 'gauge.medium' for a cleaner, system-native appearance in the menu bar. The gauge icon better represents usage monitoring functionality. > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Add APIKey struct to OpenCodeAuth for API key-based authentication - Add openrouter and opencode fields to OpenCodeAuth - Add getOpenRouterAPIKey() and getOpenCodeAPIKey() accessor methods - Add .openRouter and .openCode cases to iconForProvider() switch - Add .openRouter and .openCode cases to drawProviderAlert() switch - Prevent compile breaks with exhaustive switch statement handling > Co-authored-by: Claude (oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Add OpenRouterProvider.swift implementing ProviderProtocol - Fetch usage data from /api/v1/credits endpoint - Calculate utilization percentage with zero-division protection - Support /api/v1/key endpoint for future rate limit features - Register provider in ProviderManager Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Replace SF Symbols with NSImage(named:) for provider icons - Copilot, Claude, Codex, Gemini CLI, OpenCode now use asset images - Keep OpenRouter as SF Symbol (arrow.triangle.branch) - no asset available - Maintains existing tintedImage() logic for color tinting > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Created OpenCodeProvider.swift with ProviderProtocol implementation - Registered in ProviderManager providers array - Uses TokenManager.getOpenCodeAPIKey() for authentication - Throws authenticationFailed on missing API key or unavailable API (401/403/404) - Handles edge case: API returns 'Not Found' text with HTTP 200 - Zero-division protection for utilization calculation - Added to Xcode project with 4 pbxproj references > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Created ProviderResult.swift with ProviderResult and DetailedUsage structs - ProviderResult contains usage (ProviderUsage) and optional details - DetailedUsage contains 8 optional fields for usage breakdown - Added hasAnyValue computed property for conditional submenu display - Registered in Xcode project with 4 pbxproj entries - Part of Task 6: ProviderResult architecture change (Step 1 of 5) > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… details (Task 6) **Architecture Change (Steps 2-5):** - Changed ProviderProtocol.fetch() -> ProviderResult - Updated ALL 6 Providers to return ProviderResult: - ClaudeProvider, CodexProvider, GeminiCLIProvider, CopilotProvider: details: nil - OpenRouterProvider: details with daily/weekly/monthly usage, credits, limits - OpenCodeProvider: details: nil (API not available) - Updated ProviderManager: all cache types changed to ProviderResult - Added .usage accessor throughout ProviderManager **Submenu Implementation:** - Added createDetailSubmenu() method in StatusBarController - Submenu shows: Daily, Weekly, Monthly usage, Credits, Limits, Reset period - Uses SF Symbols for icons (calendar, creditcard, chart.bar, clock) - Conditional display: only shows submenu if details.hasAnyValue - OpenRouter now displays detailed usage breakdown on hover **Files Modified (10):** - Models/ProviderProtocol.swift - All 6 Providers/*.swift - Services/ProviderManager.swift - App/StatusBarController.swift > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
**Copilot Dual Display:**
- Copilot now appears in BOTH sections when appropriate:
1. Pay-as-you-go: Shows 'Copilot Add-on $X.XX' when netBilledAmount > 0
2. Quota: Shows Copilot quota using dynamic userPremiumRequestEntitlement
**Guard Condition Fix:**
- Changed guard to allow Copilot-only display
- Before: guard !providerResults.isEmpty else { return }
- After: guard !providerResults.isEmpty || hasCopilotData else { return }
**Implementation Details:**
- Copilot Add-on inserted BEFORE providerResults loop in Pay-as-you-go section
- Copilot Quota inserted BEFORE providerResults loop in Quota section
- Both update hasPayAsYouGo/hasQuota flags appropriately
- Uses dynamic userPremiumRequestEntitlement from API (not hardcoded)
- Calculates percentage: (remaining / limit) * 100
**Files Modified:**
- App/StatusBarController.swift
> Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai>
> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
**Test Coverage:** - Created OpenRouterProviderTests.swift with 7 test methods - Tests provider identifier and type validation - Tests JSON fixture decoding for both API responses - Tests utilization calculation logic (97.96% from sample data) - Tests zero-division protection edge case - Tests ProviderUsage model creation **Fixtures Created:** - openrouter_credits_response.json: Credits API response structure - openrouter_key_response.json: Key API response with rate limits **Test Results:** - OpenRouterProviderTests: 7/7 passed ✅ - Total Test Suite: 19/19 passed ✅ - All existing tests still passing **Files Added:** - CopilotMonitorTests/OpenRouterProviderTests.swift - CopilotMonitorTests/Fixtures/openrouter_credits_response.json - CopilotMonitorTests/Fixtures/openrouter_key_response.json > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
**Rebranding Changes:** - Updated Info.plist: CFBundleName and CFBundleDisplayName - Changed Logger subsystem in 10 files: com.copilotmonitor → com.opencodeproviders - Translated Korean UI text: "GitHub 로그인" → "GitHub Login" - Updated README.md with new app name and descriptions **Files Modified (12):** - Info.plist: Bundle names updated - README.md: App name, paths, and descriptions - 10 Swift files: Logger subsystem strings **Scope:** - ✅ Changed: Bundle names, Logger subsystems, Korean UI text, README - ✅ Unchanged: Bundle Identifier (com.copilotmonitor.CopilotMonitor) - ✅ Unchanged: Log messages, code comments, folder names - ⏳ Deferred: Xcode scheme/target rename (manual user action) **Build Status:** BUILD SUCCEEDED ✅ > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Task 2 work was completed in commit 9550944 (changed menu bar icon to SF Symbol gauge.medium), but the checkbox wasn't marked during execution. This commit updates the plan to reflect the actual completion status. All 10 tasks (0-9) are now complete: - Task 0: Test fix ✓ - Task 1: ProviderIdentifier + TokenManager ✓ - Task 2: Menu bar icon SF Symbol ✓ - Task 3: OpenRouterProvider ✓ - Task 4: Assets icons ✓ - Task 5: OpenCodeProvider ✓ - Task 6: ProviderResult architecture ✓ - Task 7: Copilot dual display ✓ - Task 8: Tests ✓ - Task 9: Rebranding ✓ > Co-authored-by: Atlas (oMo) <no-reply@opencode.ai>
Verified and marked complete: - Definition of Done (5/5 items) - Final Checklist (11/11 items) All implementation verified: ✅ Tests: 19/19 passing ✅ Menu bar icon: SF Symbol gauge.medium ✅ Provider icons: Assets.xcassets (5 providers) ✅ Submenu: Detailed usage with SF Symbols ✅ OpenRouter/OpenCode: Registered and functional ✅ Copilot dual display: Quota + Pay-as-you-go ✅ Rebranding: OpencodeProvidersMonitor complete ✅ README: Updated with new branding Manual steps remaining (Xcode GUI only): - Rename scheme: CopilotMonitor → OpencodeProvidersMonitor - Rename target display name > Co-authored-by: Atlas (oMo) <no-reply@opencode.ai>
… DetailedUsage - Add .antigravity and .openCodeZen cases to ProviderIdentifier enum - Add iconName computed property to ProviderIdentifier for SF Symbol names - Extend ProviderUsage.payAsYouGo with optional cost parameter - Add cost computed property to ProviderUsage - Extend DetailedUsage with 24 new optional fields for provider-specific data: - Claude 5h/7d windows and model breakdown - Codex multiple windows and plan info - OpenCode Zen stats (sessions, messages, avgCostPerDay) - Antigravity user email - History and cost tracking (dailyHistory, monthlyCost, credits) - Add memberwise initializer to DetailedUsage - Implement custom Codable for DetailedUsage with all optional fields - Update all .payAsYouGo() call sites with cost parameter - Update StatusBarController.iconForProvider() for new provider cases - Update test cases to include cost parameter Build: ✅ SUCCEEDED > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Implement AntigravityProvider connecting to local language_server_macos - Process detection via ps + grep for language_server_macos + antigravity - Extract CSRF token from process arguments - Port discovery via lsof -nP -iTCP -sTCP:LISTEN - HTTPS API call to /exa.language_server_pb.LanguageServerService/GetUserStatus - Custom URLSessionDelegate for self-signed localhost certificates - Parse response: email, plan, models with quota percentages - Return minimum remaining quota across all models - Graceful failure when Antigravity not running - Register provider in ProviderManager > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Implement OpenCodeZenProvider that parses opencode CLI stats - Execute `opencode stats --days N` to fetch usage data - Parse Total Cost, Avg Cost/Day, Sessions, Messages, Model costs using regex - Calculate daily history by running stats for days 1-7 with cumulative differences - Return pay-as-you-go usage with monthly cost tracking - Graceful failure when opencode CLI not found at ~/.opencode/bin/opencode - Register provider in ProviderManager > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
메뉴 아이템 텍스트에서 ' ' (4개 공백) 패턴을 제거하고 괄호 형식으로 변경: - 'Pay-as-you-go $X' → 'Pay-as-you-go: $X' - 'Copilot Add-on $X' → 'Copilot Add-on ($X)' - 'Provider $X' → 'Provider ($X)' - 'Provider Loading...' → 'Provider (Loading...)' - 'Provider X% remaining' → 'Provider (X% remaining)' - 'Gemini CLI (#N) X%' → 'Gemini CLI #N (X%)' > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- 모든 변수 참조에 double quote 추가 (SC2086) - softprops/action-gh-release@v1 -> v2 업데이트 > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- SwiftLint 경로 수정: 루트에서 실행하여 .swiftlint.yml 설정 적용 - .swiftlint.yml disabled_rules 추가 (force_cast, large_tuple 등) - opt_in_rules에서 sorted_imports, implicit_return 제거 - 코드 수정: count > 0 -> !isEmpty, 불필요한 괄호 제거 > Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- nonisolated(unsafe) 추가하여 Swift Concurrency 오류 해결 - readabilityHandler에서 outputData 변수 mutation 허용 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- nonisolated(unsafe) 추가하여 Swift Concurrency 오류 해결 - runCommandAsync 함수의 readabilityHandler에서 outputData mutation 허용 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Wave 1 - Foundation: - Add MenuBarExtraAccess SPM dependency (v1.0.0+) - Create MenuDesignToken enum for centralized layout constants - Implement MenuResultBuilder for declarative NSMenu construction Wave 2 - SwiftUI Shell: - Create ModernApp.swift with MenuBarExtra entry point - Add ModernStatusBarIconView.swift (SwiftUI version) - Create ProviderViewModel for SwiftUI state management Wave 3 - Integration: - Integrate MenuBarExtraAccess bridge in StatusBarController - Add attachTo() method to connect SwiftUI MenuBarExtra with existing NSMenu - Preserve all keyboard shortcuts (⌘R, ⌘Q, ⌘U) All tests passing. Build verified. > Co-authored-by: Claude (oMo, vibe-kanban) <no-reply@claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Replace hardcoded CGFloat = 22 with MenuDesignToken.Dimension.itemHeight - Files: MultiProviderStatusBarIconView.swift, StatusBarIconView.swift - Completes Task 8: All hardcoded values now use centralized design tokens > Co-authored-by: Claude (Atlas) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Changed ProviderManager from final class to actor - Updated all call sites to use async/await pattern - Converted ViewModel computed properties to @published stored properties - Added nonisolated modifiers for utilities and factories - Verified with Thread Sanitizer: NO data races detected Task 9 complete - All acceptance criteria met: - ✅ Build succeeds - ✅ Tests pass (19/19) - ✅ TSan clean (no data races) - ✅ Performance maintained (< 2s) > Co-authored-by: Claude (Atlas, oMo) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Added @main to ModernApp.swift (SwiftUI entry point) - Removed old CopilotMonitorApp.swift (git rm) - Updated Xcode project references - Documented architecture patterns in AGENTS.md: - SwiftUI Shell with AppKit Core - Actor-Based Provider Architecture - MenuDesignToken Usage - MenuBuilder Pattern Build and tests verified: - ✅ BUILD SUCCEEDED - ✅ All tests passed - ⏳ Manual QA pending (app launch, providers, shortcuts) > Co-authored-by: Claude (Atlas, oMo, vibe-kanban) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Added detailed logging to investigate 'loading...' issue: Logging Added: - ProviderManager.fetchAll(): Entry/exit, per-provider results - StatusBarController.fetchMultiProviderData(): Full flow tracking - ProviderViewModel.refresh(): State updates Investigation Results: ✅ App working correctly - loads data in ~5 seconds ✅ All providers fetch in parallel successfully ✅ UI updates with real data after fetch ✅ 'Loading...' only shows during fetch (expected) Debug logs: /tmp/provider_debug.log Color-coded: 🔵 start, 🟡 progress, 🟢 success, 🔴 error Build: ✅ SUCCESS Tests: ✅ 19/19 PASS > Co-authored-by: Claude (Atlas, oMo, vibe-kanban) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Added logging to all keyboard shortcut handlers: - ⌘R (Refresh): Logs before fetchUsage() - ⌘Q (Quit): Logs before NSApp.terminate() - ⌘U (Check Updates): Logs before Sparkle check Log Format: ⌨️ [Keyboard] ⌘<key> <action> triggered Verification Method: log stream --predicate 'subsystem == "com.opencodeproviders"' --level debug # Or: cat /tmp/provider_debug.log | grep "⌨️" Files Modified: - App/StatusBarController.swift: refreshClicked(), quitClicked() - App/AppDelegate.swift: checkForUpdatesClicked() + logger setup Build: ✅ SUCCESS Tests: ✅ 19/19 PASS > Co-authored-by: Claude (Atlas, oMo, vibe-kanban) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Added logMenuStructure() helper function: - Logs total items, separators, actions, submenus - Called at end of setupMenu() for initial validation - Provides detailed menu structure in debug log Log Output: 📋 [Menu] Items: N (sep:X, actions:Y, submenus:Z) Plus detailed structure in /tmp/provider_debug.log Verification: Can now confirm menu completeness via logs without manual inspection Build: ✅ SUCCESS Tests: ✅ 19/19 PASS > Co-authored-by: Claude (Atlas, oMo, vibe-kanban) <no-reply@Claude.ai> > Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Kimi 프로바이더 추가 (KimiProvider.swift) - 5h/7d 윈도우 기반 quota 모니터링 - TokenManager에 kimi-for-coding 토큰 지원 추가 - 메뉴 및 상태바 아이콘 통합 - Copilot 히스토리 30일치 표시로 확장 (기존 7일) - Copilot 히스토리 병합 로직 개선 - period=3 (현재 월) + period=5 (이전 월) 결합 - 월 경계 시 데이터 누락 방지 - ProviderMenuBuilder에서 MenuDesignToken 상수 사용으로 통일 - AGENTS.md 학습 내용 업데이트 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- AGENTS.md에 Build & Run Commands 섹션 추가 - .vscode/tasks.json에서 앱 경로 와일드카드(*.app) 통일 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- SwiftUI MenuBarExtra를 isInserted=false로 숨김 - StatusBarController가 자체 NSStatusItem으로 메뉴바 관리 - AGENTS.md 업데이트: - Menu Item Layout Constants → MenuDesignToken 참조로 변경 - SwiftUI + AppKit 중복 문제 reflection 추가 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- Update CFBundleDisplayName to 'OpenCode Bar' (user-facing name) - Update CFBundleName to 'OpencodeBar' (internal name, no spaces) - Keep CFBundleIdentifier unchanged for auto-update compatibility - Update all README.md references (5 occurrences) > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
- Update DMG volume names from 'OpenCode Usage Monitor' to 'OpenCode Bar' - Update Appcast XML channel titles - Update GitHub Release names - Total 9 occurrences updated across 2 workflow files > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
…de-bar - Update all GitHub URLs in README.md (badges, releases, clone) - Update Sparkle auto-update feed URL in Info.plist - Update release URLs in GitHub Actions workflows - Update directory name in clone instructions This ensures auto-updates continue working after repository rename. > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
Features: - Version menu item now shows 'OpenCode Bar vX.X.X' (clickable) - Click version to open GitHub repo in browser - First-launch GitHub star prompt (max 3 times) - Checks gh CLI authentication status - Checks if repo is already starred - Prompts user with NSAlert dialog - Runs async to avoid blocking startup - Caches prompt count in UserDefaults Implementation: - openGitHub(): Opens https://github.com/kargnas/opencode-bar - checkAndPromptGitHubStar(): Smart star prompt with conditions - gh CLI path detection (/opt/homebrew/bin, /usr/local/bin, /usr/bin) - gh auth status check - gh api user/starred check (204 = starred, 404 = not) - UserDefaults 'githubStarPromptCount' (max 3) - Task.detached for async execution > Co-authored-by: Claude (Atlas, oMo) <no-reply@claude.ai>
- ProviderUsage.swift: 미사용 'used' 변수 제거 - StatusBarIconView.swift: 미사용 colorForPercentage() 함수 제거 - MultiProviderStatusBarIconView.swift: SF Symbol 로딩 버그 수정 (NSImage(systemSymbolName:) 사용) - browser_cookies.py: 빈 except 블록에 의도 설명 주석 추가 - AI_USAGE_API_REFERENCE.md: OAuth 클라이언트 ID가 공개 값임을 명시 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
- gh CLI 의존성 제거 - 확인 버튼 클릭시 브라우저로 GitHub 페이지 열기 - 한 번 응답하면 다시 띄우지 않음 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@Claude.ai> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
stats --days 명령 실패해도 캐시에서 totalCost 계산하여 표시 - stats 로드를 try-catch로 감싸서 실패해도 throw하지 않음 - calculateTotalCostFromCache() 메서드 추가 - 히스토리 progressive 로딩과 stats 조회 완전 분리 - authSource에 [stats: cached] 표시로 fallback 상태 알림 Co-authored-by: Claude (Sisyphus, oMo) <no-reply@anthropic.com> Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
OpenCode Bar v2.0.0
Major release with complete rebranding, new provider support, and modern UI architecture!
🎯 Rebranding
opencode-barfor consistency📊 9 AI Providers Supported
✨ What's New
🆕 Kimi Provider Support
🎨 Modern UI Architecture
MenuBarExtraMenuDesignTokenfor consistent spacing/typography🐛 Bug Fixes
🏗️ Technical Improvements
nonisolated(unsafe)for Process handlers📸 Screenshots
🔄 Breaking Changes
copilot-usage-monitortoopencode-bar🚀 Migration
No action required! Auto-updates will handle the transition seamlessly (bundle ID unchanged).
📝 Notable Commits
6bcec84rebrand: update GitHub Actions workflows to use OpenCode Bar9357e05rebrand: change app name from OpenCode Usage Monitor to OpenCode Barf6b9e26feat: Kimi provider + Copilot history extended to 30 days38f4b10feat: modernize UI architecture with SwiftUI shell and design tokensee6a12frefactor: convert ProviderManager to actor for thread safetyFull Changelog: See all commits for detailed changes