κ°λ°μκ° μ¬μ©νλ AI μ½λ© μμ΄μ νΈμ ν¬λ λ§Β·κ΅¬λ μμ§μ¨(Burn Rate) μ macOS λ©λ΄λ°μμ νκ³³μ λͺ¨μ 보λ λ€μ΄ν°λΈ μνλ° μ±μ λλ€.
λ©λ΄λ° π₯ μμ΄μ½μ ν΄λ¦νλ©΄ λ―Έλ λμ보λκ° μ΄λ¦¬κ³ , μ°λλ μμ΄μ νΈλ³ μ¬μ©λκ³Ό μμΈ μΏΌν°λ₯Ό νμΈν μ μμ΅λλ€.
| μμ΄μ νΈ | μν | μ°λ λ°©μ |
|---|---|---|
| Antigravity | β μ§μ | Antigravity CLI μΈμ + Usage API |
| Cursor | β μ§μ | Cursor λ‘컬 μΈμ + Usage API |
| Claude Code | π§ μ€λΉ μ€ | β |
| Codex | π§ μ€λΉ μ€ | β |
| GitHub Copilot | π λ‘λλ§΅ | β |
macOS 13+ λ° Homebrewκ° νμν©λλ€. Xcode λλ Command Line Tools(Swift λΉλμ©)λ νμν©λλ€.
brew tap kwaneung/burnrate https://github.com/kwaneung/burnrate
brew install burnrate
burnrateμ€ν ν λ©λ΄λ° π₯ μμ΄μ½μ΄ νμλ©λλ€. Formulaλ CLI λ°μ΄λ리μ΄λ―λ‘ ν°λ―Έλμμ burnrateλ‘ μ€νν©λλ€.
μ λ°μ΄νΈ:
brew update
brew upgrade burnratev1.0.0 μμ : μλͺ λ
.appCask λ°°ν¬λ‘ Applicationsμμ μ€νΒ·λ‘κ·ΈμΈ νλͺ© λ±λ‘μ΄ κ°λ₯ν΄μ§ μμ μ λλ€.
- λ©λ΄λ° π₯ μμ΄μ½ ν΄λ¦
- μ€μ (βοΈ) β Antigravity / Cursor μ°λνκΈ°
- λμ보λμμ μλΉμ€ μ ν β μμΈ μ¬μ©λ νμΈ
- λμ보λ λ ΈμΆ μ€μ μμ νμν μμ΄μ νΈ on/off
μ€μ λ³κ²½μ μ¦μ λ°μλ©λλ€. λ³λ μ μ₯ λ²νΌμ μμ΅λλ€.
Antigravityμ Cursorλ λμΌν λ‘컬 μΈμ μ½κΈ° β Usage API ν΄λ§(15μ΄) β μ€μ νλ©΄ μν λ©μμ§ ν¨ν΄μ μ¬μ©ν©λλ€. BurnRateκ° μ§μ OAuthΒ·Keychain λ‘κ·ΈμΈμ νμ§ μμΌλ©°, κ° λꡬμ 미리 λ‘κ·ΈμΈλμ΄ μμ΄μΌ ν©λλ€.
Antigravity CLI(agy)μ Google κ³μ μΌλ‘ λ‘κ·ΈμΈλμ΄ μμ΄μΌ ν©λλ€. BurnRateλ CLIκ° μ μ₯ν λ‘컬 OAuth μΈμ
μΌλ‘ Usage APIλ₯Ό μ‘°νν©λλ€. access tokenμ refresh tokenμΌλ‘ μλ κ°±μ λ©λλ€.
| νλͺ© | λ΄μ© |
|---|---|
| μΈμ νμΌ | ~/.gemini/antigravity-cli/antigravity-oauth-token |
| OAuth μ격 μ¦λͺ | μ€μΉλ agy λ°μ΄λ리μμ λ°νμ μΆμΆ (λλ ANTIGRAVITY_CLIENT_ID / ANTIGRAVITY_CLIENT_SECRET νκ²½ λ³μ) |
| Usage API | POST https://daily-cloudcode-pa.googleapis.com/v1internal:retrieveUserQuotaSummary (15μ΄ ν΄λ§) |
| μΊμ νμΌ | ~/.gemini/antigravity-cli/api_usage.json (κ·Έλ£ΉΒ·λ²ν· μΏΌν° JSON μ μ₯) |
| μμΈ νλ©΄ | κ·Έλ£Ήλ³(Gemini / ClaudeΒ·GPT) WeeklyΒ·5-Hour μμ¬ %, κ°±μ μκ° (agy CLI TUIμ λμΌ νμ) |
| μΈμ λ§λ£ μ | μ€μ μ agyλ₯Ό μ€νν΄ λ€μ λ‘κ·ΈμΈν΄ μ£ΌμΈμ μλ΄ |
| μ°λ ν΄μ | μ€μ β Antigravity β μ°λ ν΄μ |
μ°Έκ³ : Usage APIλ Antigravity CLIκ° μ¬μ©νλ λΉκ³΅μ Google λ΄λΆ μλν¬μΈνΈμ λλ€. agy CLI μ λ°μ΄νΈμ λ°λΌ μλ΅ νμμ΄ λ°λ μ μμ΅λλ€.
Cursor μλν°μ λ‘κ·ΈμΈλμ΄ μμ΄μΌ ν©λλ€. μΈμ μ Cursorκ° μ μ₯ν λ‘컬 SQLite DBμμ μ½κ³ , μ¬μ©λμ Cursor μΉ APIλ‘ μ‘°νν©λλ€. Keychainμ μ½μ§ μμΌλ―λ‘ Keychain μ κ·Ό νμ μ΄ λ¨μ§ μμ΅λλ€. ν ν° κ°±μ μ Cursor μ±μ΄ λ΄λΉν©λλ€.
| νλͺ© | λ΄μ© |
|---|---|
| μΈμ νμΌ | ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb |
| μΈμ ν€ | cursorAuth/accessToken (JWT) |
| Usage API | GET https://cursor.com/api/usage-summary (15μ΄ ν΄λ§) |
| μμΈ νλ©΄ | Total / Auto+Composer / API μ¬μ©λ₯ , νλλͺ (Pro, Pro+ λ±) |
| μΈμ λ§λ£ μ | μ€μ μ Cursorλ₯Ό μ€νν΄ λ€μ λ‘κ·ΈμΈν΄ μ£ΌμΈμ μλ΄ |
| μ°λ ν΄μ | μ€μ β Cursor β μ°λ ν΄μ |
μ°Έκ³ : Cursor Usage APIλ λΉκ³΅μ μλν¬μΈνΈμ λλ€. Cursor μ λ°μ΄νΈμ λ°λΌ λμμ΄ λ°λ μ μμ΅λλ€.
Xcode μμ΄ ν°λ―Έλμμ μ€νν μ μμ΅λλ€.
git clone https://github.com/kwaneung/burnrate.git
cd burnrate
swift runRelease λΉλ:
swift build -c release --disable-sandbox
.build/release/burnrategraph TD
A[MenuBarExtra π₯] --> B[DashboardView]
B --> C[SettingsView]
B --> D[AntigravityDetailView]
B --> E[CursorDetailView]
F[ConfigManager] --> B
F -->|15μ΄ ν΄λ§| G["Antigravity retrieveUserQuotaSummary"]
G --> G1[AntigravitySessionReader]
G1 -->|refresh token| G2[OAuth token κ°±μ ]
F -->|15μ΄ ν΄λ§| I["cursor.com/api/usage-summary"]
I --> H[CursorSessionReader]
H -->|SQLite| H1[state.vscdb JWT]
burnrate/
βββ Package.swift
βββ Formula/
β βββ burnrate.rb # Homebrew Formula
βββ README.md
βββ Sources/BurnRate/
βββ Controllers/BurnRateApp.swift # @main, MenuBarExtra
βββ Models/
β βββ ConfigManager.swift # μνΒ·λκΈ°ν ν΅μ¬
β βββ AntigravitySessionReader.swift # Antigravity CLI μΈμ
μ½κΈ°
β βββ AntigravityQuotaClient.swift # Antigravity Usage API
β βββ CursorSessionReader.swift # Cursor JWT μΈμ
μ½κΈ°Β·λ§λ£ κ²μ¬
β βββ AIService.swift
β βββ UsageData.swift # AntigravityQuotaGroup / Bucket λͺ¨λΈ
βββ Views/
β βββ DashboardView.swift
β βββ SettingsView.swift
β βββ AntigravityDetailView.swift
β βββ CursorDetailView.swift
β βββ ServiceRowView.swift
βββ Resources/Info.plist
- μΈμ΄ / UI: Swift 5.8+, SwiftUI
- μ΅μ OS: macOS 13+
- λΉλ: Swift Package Manager (μΈλΆ μμ‘΄μ± μμ)
- λ°±κ·ΈλΌμ΄λ:
LSUIElement(Dock μμ΄μ½ μμ) - Info.plist: λ§μ»€
-sectcreateλ‘ μ€ν νμΌμ λ΄μ₯
- CursorΒ·Antigravity Usage APIλ λͺ¨λ λΉκ³΅μ μλν¬μΈνΈμ λλ€. κ° λꡬ μ λ°μ΄νΈμ λ°λΌ λμμ΄ λ°λ μ μμ΅λλ€.
- μΈμ μ΄ λ§λ£λλ©΄ BurnRateκ° μ€μ νλ©΄μ μ¬λ‘κ·ΈμΈ μλ΄λ₯Ό νμνμ§λ§, ν ν° κ°±μ μ κ° λꡬ(agy / Cursor)κ° μνν΄μΌ ν©λλ€.
- Antigravityλ refresh tokenμΌλ‘ access tokenμ μλ κ°±μ ν©λλ€. Cursorλ JWT λ§λ£Β·401 μ Cursor μ± μ¬μ€νμ΄ νμν μ μμ΅λλ€.
- Claude Code, Codex, GitHub Copilotμ μμ§ μ°λλμ§ μμμ΅λλ€.
- Claude Code / Codex / GitHub Copilot μ°λ
- Homebrew Formula λ°°ν¬ (
brew install burnrate) - Homebrew Cask λ°°ν¬ (v1.0.0 β Developer ID μλͺ
.app+ Notarization) - λ©λ΄λ° μμ΄μ½ Burn Rate μ λλ©μ΄μ
Issueμ Pull Requestλ₯Ό νμν©λλ€.