usage-cli 0.33.0__tar.gz → 0.33.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. {usage_cli-0.33.0 → usage_cli-0.33.2}/PKG-INFO +14 -8
  2. {usage_cli-0.33.0 → usage_cli-0.33.2}/README.md +12 -7
  3. usage_cli-0.33.2/THIRD_PARTY_NOTICES.md +96 -0
  4. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/agy.py +1 -1
  5. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/claude.py +1 -1
  6. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/grok.py +1 -1
  7. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/muse.py +1 -1
  8. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/rate_limits.py +23 -2
  9. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/aggregator.py +1 -1
  10. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/blocks.py +1 -1
  11. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/persona_loader.py +1 -1
  12. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/reporter.py +1 -1
  13. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/usage_snapshot.py +1 -1
  14. {usage_cli-0.33.0 → usage_cli-0.33.2}/i18n.json +20 -35
  15. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/claude_pane.py +7 -6
  16. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/session_hooks.py +10 -10
  17. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/setup_hook.py +8 -12
  18. usage_cli-0.33.2/loaders/_shared_cache_file.py +67 -0
  19. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/agy_loader.py +1 -1
  20. usage_cli-0.33.2/loaders/chromium_cache.py +215 -0
  21. usage_cli-0.33.2/loaders/claude_desktop.py +160 -0
  22. usage_cli-0.33.0/usage_client.py → usage_cli-0.33.2/loaders/claude_usage.py +59 -16
  23. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/codex_loader.py +1 -1
  24. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/grok_loader.py +1 -1
  25. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/history_loader.py +1 -1
  26. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/muse_loader.py +1 -1
  27. {usage_cli-0.33.0 → usage_cli-0.33.2}/main.py +6 -112
  28. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/actions.py +1 -1
  29. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/agy.py +1 -1
  30. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/app.py +7 -23
  31. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/grok.py +1 -1
  32. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/manual_refresh.py +1 -1
  33. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/menu.py +1 -1
  34. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/new_badge.py +3 -3
  35. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/notify.py +1 -1
  36. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/prefs.py +1 -1
  37. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/refresh.py +2 -2
  38. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/state.py +16 -5
  39. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/update.py +5 -8
  40. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/whats_new.py +1 -1
  41. usage_cli-0.33.2/panels/__init__.py +50 -0
  42. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/base.py +2 -2
  43. usage_cli-0.33.2/panels/catalog.py +225 -0
  44. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/payload.py +2 -23
  45. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/web_panel.py +1 -1
  46. {usage_cli-0.33.0 → usage_cli-0.33.2}/pyproject.toml +14 -32
  47. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/agy_window_keeper.py +0 -5
  48. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/codex_window_keeper.py +1 -1
  49. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/keeper_outcome.py +1 -1
  50. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/quota_snapshot.py +1 -1
  51. usage_cli-0.33.2/quota/status_payload.py +161 -0
  52. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/window_keeper.py +1 -1
  53. {usage_cli-0.33.0 → usage_cli-0.33.2}/setup_app.py +9 -13
  54. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_adapters_claude.py +2 -2
  55. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_agy_adapter.py +1 -1
  56. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_agy_window_keeper.py +2 -1
  57. usage_cli-0.33.2/tests/test_app_version.py +28 -0
  58. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_check_upstream.py +23 -0
  59. usage_cli-0.33.2/tests/test_chromium_cache.py +249 -0
  60. usage_cli-0.33.2/tests/test_claude_desktop.py +166 -0
  61. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_claude_pane.py +21 -9
  62. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_claude_paths.py +1 -1
  63. usage_cli-0.33.2/tests/test_desktop_quota_display.py +234 -0
  64. usage_cli-0.33.2/tests/test_desktop_quota_review.py +269 -0
  65. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_doctor.py +5 -5
  66. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_fsevents_watch.py +1 -1
  67. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_history_loader.py +2 -2
  68. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_hook_scripts_are_standalone.py +1 -2
  69. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_i18n_format_fallback.py +1 -1
  70. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_i18n_packaged_path.py +1 -1
  71. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_main.py +2 -2
  72. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_manual_refresh.py +1 -1
  73. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar.py +9 -9
  74. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_agy.py +1 -1
  75. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_grok.py +1 -1
  76. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_prefs.py +1 -1
  77. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_state.py +2 -2
  78. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_update.py +3 -7
  79. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_muse_loader.py +2 -2
  80. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_new_badge.py +1 -1
  81. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_packaging.py +1 -1
  82. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_panels.py +1 -1
  83. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_persona_loader.py +1 -1
  84. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_pricing.py +14 -14
  85. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_project_resolver.py +58 -17
  86. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_quota_aware.py +4 -4
  87. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_quota_label.py +115 -9
  88. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_reporter_build_data.py +1 -1
  89. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_service_status.py +1 -1
  90. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_session_resume.py +1 -1
  91. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_setup_hook.py +10 -10
  92. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_setup_hook_coexistence.py +2 -94
  93. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_setup_hook_resume.py +1 -1
  94. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_setup_hook_terse.py +6 -6
  95. usage_cli-0.33.2/tests/test_taskbar_menu.py +189 -0
  96. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_tui.py +6 -5
  97. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_update_checker.py +8 -6
  98. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_cli.py +31 -31
  99. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_client.py +17 -17
  100. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_diagnosis_snapshot.py +1 -1
  101. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_notifications.py +1 -1
  102. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_statusline.py +1 -1
  103. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_statusline_agy.py +3 -3
  104. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_statusline_forwarder.py +1 -1
  105. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_statusline_grok.py +2 -2
  106. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_terse_mode.py +1 -1
  107. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_terse_reminder.py +1 -1
  108. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_web_panel_payload.py +1 -1
  109. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_wheel_packaging.py +1 -1
  110. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_wintray.py +151 -33
  111. {usage_cli-0.33.0 → usage_cli-0.33.2}/tui/app.py +6 -19
  112. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/html_report.py +1 -20
  113. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_ledger.py +1 -1
  114. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/tables.py +1 -1
  115. {usage_cli-0.33.0 → usage_cli-0.33.2}/updates/checker.py +0 -4
  116. {usage_cli-0.33.0 → usage_cli-0.33.2}/updates/whats_new.py +1 -1
  117. usage_cli-0.33.0/usage_cli.py → usage_cli-0.33.2/usage_app/cli.py +3 -150
  118. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_app}/doctor.py +2 -18
  119. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_cli.egg-info/PKG-INFO +14 -8
  120. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_cli.egg-info/SOURCES.txt +34 -19
  121. usage_cli-0.33.2/usage_cli.egg-info/entry_points.txt +3 -0
  122. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_cli.egg-info/requires.txt +1 -0
  123. usage_cli-0.33.2/usage_cli.egg-info/top_level.txt +16 -0
  124. usage_cli-0.33.2/usage_common/app_version.py +24 -0
  125. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_common}/i18n.py +8 -6
  126. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_common}/pricing.py +0 -5
  127. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_common}/project_resolver.py +49 -32
  128. usage_cli-0.33.2/usage_hooks/__init__.py +0 -0
  129. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_quota_aware.py +8 -4
  130. usage_cli-0.33.2/wintray/__init__.py +0 -0
  131. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/app.py +126 -85
  132. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/menu.py +16 -1
  133. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/prefs.py +1 -1
  134. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/quota_label.py +13 -3
  135. usage_cli-0.33.2/wintray/taskbar_menu.py +86 -0
  136. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/watch.py +0 -3
  137. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/whats_new.py +1 -1
  138. usage_cli-0.33.0/THIRD_PARTY_NOTICES.md +0 -28
  139. usage_cli-0.33.0/panels/__init__.py +0 -231
  140. usage_cli-0.33.0/usage_cli.egg-info/entry_points.txt +0 -3
  141. usage_cli-0.33.0/usage_cli.egg-info/top_level.txt +0 -33
  142. {usage_cli-0.33.0 → usage_cli-0.33.2}/LICENSE +0 -0
  143. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/__init__.py +0 -0
  144. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/codex.py +0 -0
  145. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/registry.py +0 -0
  146. {usage_cli-0.33.0 → usage_cli-0.33.2}/adapters/types.py +0 -0
  147. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/__init__.py +0 -0
  148. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/diagnoser.py +0 -0
  149. /usage_cli-0.33.0/usage_diagnosis_snapshot.py → /usage_cli-0.33.2/analyzer/diagnosis_snapshot.py +0 -0
  150. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/dispatch_ledger.py +0 -0
  151. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/insights.py +0 -0
  152. {usage_cli-0.33.0 → usage_cli-0.33.2}/analyzer/subscription.py +0 -0
  153. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/__init__.py +0 -0
  154. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/codex_hook_trust.py +0 -0
  155. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/login_item.py +0 -0
  156. {usage_cli-0.33.0 → usage_cli-0.33.2}/installer/statusline_settings.py +0 -0
  157. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/__init__.py +0 -0
  158. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/agy_disk_cache.py +0 -0
  159. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/agy_quota_probe.py +0 -0
  160. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/cache_quarantine.py +0 -0
  161. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/claude_paths.py +0 -0
  162. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/codex_disk_cache.py +0 -0
  163. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/codex_events.py +0 -0
  164. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/codex_fork_replay.py +0 -0
  165. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/codex_paths.py +0 -0
  166. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/disk_cache_common.py +0 -0
  167. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/disk_cache_lifecycle.py +0 -0
  168. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/grok_quota_probe.py +0 -0
  169. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/history_disk_cache.py +0 -0
  170. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/jsonl_limits.py +0 -0
  171. {usage_cli-0.33.0 → usage_cli-0.33.2}/loaders/jsonl_utils.py +0 -0
  172. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/__init__.py +0 -0
  173. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/chrome.py +0 -0
  174. {usage_cli-0.33.0 → usage_cli-0.33.2/menubar}/fsevents_watch.py +0 -0
  175. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/popover.py +0 -0
  176. {usage_cli-0.33.0 → usage_cli-0.33.2}/menubar/title.py +0 -0
  177. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/dynamic_height.py +0 -0
  178. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/panel_scale.py +0 -0
  179. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/panel_window.py +0 -0
  180. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/panel_window_state.py +0 -0
  181. {usage_cli-0.33.0 → usage_cli-0.33.2}/panels/window_drag.py +0 -0
  182. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/__init__.py +0 -0
  183. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/burn_rate.py +0 -0
  184. /usage_cli-0.33.0/usage_notifications.py → /usage_cli-0.33.2/quota/notifications.py +0 -0
  185. {usage_cli-0.33.0 → usage_cli-0.33.2}/quota/usage_rate.py +0 -0
  186. {usage_cli-0.33.0 → usage_cli-0.33.2}/setup.cfg +0 -0
  187. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_adapters_codex.py +0 -0
  188. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_adapters_rate_limits.py +0 -0
  189. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_aggregator.py +0 -0
  190. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_agy_disk_cache.py +0 -0
  191. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_agy_loader.py +0 -0
  192. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_agy_quota_probe.py +0 -0
  193. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_analyzer_blocks.py +0 -0
  194. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_analyzer_pipeline.py +0 -0
  195. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_burn_rate.py +0 -0
  196. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_cache_quarantine.py +0 -0
  197. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_codex_consistency.py +0 -0
  198. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_codex_hook_trust.py +0 -0
  199. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_codex_loader.py +0 -0
  200. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_codex_window_keeper.py +0 -0
  201. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_diagnoser.py +0 -0
  202. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_disk_cache_shards.py +0 -0
  203. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_dispatch_ledger.py +0 -0
  204. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_dynamic_height.py +0 -0
  205. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_grok_loader.py +0 -0
  206. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_grok_quota_probe.py +0 -0
  207. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_html_report_snapshot.py +0 -0
  208. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_i18n_key_parity.py +0 -0
  209. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_insights.py +0 -0
  210. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_jsonl_utils.py +0 -0
  211. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_keeper_menu.py +0 -0
  212. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_keeper_outcome.py +0 -0
  213. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_login_item.py +0 -0
  214. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_menubar_notify.py +0 -0
  215. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_packaged_resources.py +0 -0
  216. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_panel_footer_layout.py +0 -0
  217. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_panel_scale.py +0 -0
  218. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_panel_window_state.py +0 -0
  219. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_panels_lazy_import.py +0 -0
  220. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_report_daily_chart.py +0 -0
  221. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_report_filter_js.py +0 -0
  222. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_setup_app.py +0 -0
  223. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_subprocess_utils.py +0 -0
  224. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_subscription.py +0 -0
  225. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_time_utils.py +0 -0
  226. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_tui_sprite.py +0 -0
  227. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_ui_tables.py +0 -0
  228. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_update_gate.py +0 -0
  229. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_update_release_notes.py +0 -0
  230. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_dir_sweeper.py +0 -0
  231. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_lang.py +0 -0
  232. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_logging.py +0 -0
  233. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_rate.py +0 -0
  234. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_snapshot.py +0 -0
  235. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_usage_snapshot_replay.py +0 -0
  236. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_whats_new.py +0 -0
  237. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_win_login_item.py +0 -0
  238. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_window_keeper.py +0 -0
  239. {usage_cli-0.33.0 → usage_cli-0.33.2}/tests/test_windows_manifest.py +0 -0
  240. {usage_cli-0.33.0 → usage_cli-0.33.2}/tui/__init__.py +0 -0
  241. {usage_cli-0.33.0 → usage_cli-0.33.2}/tui/sprite.py +0 -0
  242. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/__init__.py +0 -0
  243. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_charts.py +0 -0
  244. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_daily_chart.py +0 -0
  245. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_filter.py +0 -0
  246. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_scripts.py +0 -0
  247. {usage_cli-0.33.0 → usage_cli-0.33.2}/ui/report_styles.py +0 -0
  248. {usage_cli-0.33.0 → usage_cli-0.33.2}/updates/__init__.py +0 -0
  249. {usage_cli-0.33.0 → usage_cli-0.33.2}/updates/gate.py +0 -0
  250. {usage_cli-0.33.0 → usage_cli-0.33.2}/updates/release_notes.py +0 -0
  251. {usage_cli-0.33.0/usage_common → usage_cli-0.33.2/usage_app}/__init__.py +0 -0
  252. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_cli.egg-info/dependency_links.txt +0 -0
  253. {usage_cli-0.33.0/wintray → usage_cli-0.33.2/usage_common}/__init__.py +0 -0
  254. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_common}/prefs.py +0 -0
  255. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_common}/service_status.py +0 -0
  256. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_common/subprocess_utils.py +0 -0
  257. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_common/time_utils.py +0 -0
  258. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_common/usage_dir_sweeper.py +0 -0
  259. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_common/usage_lang.py +0 -0
  260. {usage_cli-0.33.0 → usage_cli-0.33.2}/usage_common/usage_logging.py +0 -0
  261. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_session_resume.py +0 -0
  262. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_statusline.py +0 -0
  263. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_statusline_agy.py +0 -0
  264. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_statusline_forwarder.py +0 -0
  265. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_statusline_grok.py +0 -0
  266. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_terse_mode.py +0 -0
  267. {usage_cli-0.33.0 → usage_cli-0.33.2/usage_hooks}/usage_terse_reminder.py +0 -0
  268. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/login_item.py +0 -0
  269. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/taskbar_obstacles.py +0 -0
  270. {usage_cli-0.33.0 → usage_cli-0.33.2}/wintray/taskbar_overlay.py +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.33.0
3
+ Version: 0.33.2
4
4
  Summary: usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)
5
5
  License-Expression: AGPL-3.0-only
6
6
  Requires-Python: >=3.13
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
9
  License-File: THIRD_PARTY_NOTICES.md
10
+ Requires-Dist: zstandard<1.0.0,>=0.25.0
10
11
  Requires-Dist: pyobjc-framework-Cocoa>=11.0; sys_platform == "darwin"
11
12
  Requires-Dist: pyobjc-framework-Quartz>=11.0; sys_platform == "darwin"
12
13
  Requires-Dist: pyobjc-framework-UserNotifications>=11.0; sys_platform == "darwin"
@@ -69,7 +70,7 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
69
70
  - **Grok CLI Support:** A fourth card reads Grok CLI's weekly credit percentage straight from its own local debug log. Grok CLI doesn't expose session or burn-rate data, so the card shows a single weekly bar; its per-request token usage still counts toward today's cost and project totals like Claude Code and Codex.
70
71
  - **Muse Code Spending:** Muse Code's per-request tokens and cost count toward today's cost, project totals, the HTML report, and the `usage` CLI, read from its own local session logs. Muse keeps no local quota data, so there is no Muse quota card.
71
72
  - **Service Status Alerts:** An orange-red banner appears when Claude Code, Claude API, or Codex API has an outage or degraded performance, read from their public Statuspage.io pages. Antigravity isn't covered; it has no public status page.
72
- - **Context Nudges & Notifications:** When your context window hits 70% — or earlier when it is filling fast — the status line nudges you to `/clear` or `/compact` to prevent token waste. You can also opt-in to system notifications for quota limits and recoveries.
73
+ - **Context Nudges & Notifications:** When your context window hits 70% — or earlier when it is filling fast — the status line nudges you to `/clear` or `/compact` to prevent token waste. You can also opt-in to system notifications for quota limits and recoveries. The context figure turns yellow at 50% or 200K tokens and red at 80% or 400K tokens, whichever comes first. When it changes color, the status line shows the image count and the estimated share of files and command output.
73
74
  - **Prompt Cache Health:** The status line shows Claude Code's prompt cache hit rate. For 10 minutes after the cache misses, it also says why — the model changed, the tools changed, you sat idle past the 5-minute TTL, and so on — so you can tell whether the extra tokens came from something you did. The hit rate needs Claude Code 2.1.251 or newer and the reason needs 2.1.260 or newer; on older versions those parts simply don't appear.
74
75
  - **Hide Sections:** Only use one or two of the tools? Hide the Claude Code, Codex, Grok CLI, or Antigravity section from the menu bar and panels completely with a single click.
75
76
 
@@ -78,15 +79,16 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
78
79
  - **Progress Concierge:** Open a new Claude Code session and `usage` hands your last progress straight to the AI, including your last request, uncommitted changes, and unfinished todos. No `/resume`, no recap. When you do `/resume` a conversation that sat long enough for its cache to expire, it warns you how many tokens the next message will re-send and suggests `/compact` first. Off by default.
79
80
  - **Token Saver:** A menu-bar toggle asks Claude Code and Codex to answer more tersely and in plainer language, saving output tokens while keeping code and error messages byte-exact. A light reminder keeps long conversations from drifting back to verbose — in an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
80
81
  - **Claude Code side pane (macOS and Windows):** Quotas, conversations, and background jobs inside Claude Code. [See the side pane](#claude-code-side-pane).
81
- - **Beginner Mode (macOS):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
82
- - **Quota-Aware Mode (macOS):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
83
- - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.5 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
82
+ - **Beginner Mode (macOS and Windows):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
83
+ - **Quota-Aware Mode (macOS and Windows):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
84
+ - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.8 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
84
85
  - **Terminal Integration:** `usage status --json` hands your Claude Code, Codex, Antigravity, and Grok quota to any tool that can run a command — Starship, tmux, or your own scripts. Reads the same local files as the menu bar. [Ready-made snippets](docs/DEVELOPMENT.md#quota-status-for-other-tools-usage-status).
85
86
  - **Token-waste Health Check:** A daily background diagnosis scans your logs for waste, including repeated file reads, polluter directories, and noisy Bash output. If it finds issues, a one-line heads-up appears; say "show me" and the AI walks you through fixes.
86
87
 
87
88
  ### Stay Current
88
89
 
89
90
  - **AI Update Daily:** Opens a daily-updated public [page](https://aqua5230.github.io/ai-updates/) covering Claude Code, Codex, and Antigravity, with the full history kept. Reviewed items get a plain-language summary in all five UI languages; unreviewed ones show the original source text.
91
+ - **Release Notes After an Update:** The first launch after an update shows what changed in that version in your UI language, once. Fresh installs skip it.
90
92
 
91
93
  ### Reporting & Insight
92
94
 
@@ -101,6 +103,8 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
101
103
 
102
104
  ## Privacy & Data Sources
103
105
 
106
+ Claude Desktop chat quota is also supported without installing the standalone Claude Code CLI or configuring a status line. Keep Claude Desktop open: when Claude Code quota files are unavailable, usage reads its local `plan-usage-history.json` (including Microsoft Store installations on Windows). When a recent response in its local Chromium block-file HTTP cache matches the organization, usage also reads the exact session and weekly reset times. Newer cached observations take precedence over throttled history samples; older cache must match the percentages. Missing, unsupported, expired, or inconsistent cache data leaves the countdown unknown; times are never estimated. Desktop samples normally update every 5–15 minutes. The panel shows the observation age, marks it stale after 30 minutes, and stops displaying it after two hours. The most recent organization sample is used; custom desktop profiles are not discovered. No cookies, login tokens, or API calls are needed. These quota caches contain no per-project token counts. Desktop sessions that also write compatible Claude Code logs under `~/.claude/projects/` are counted by the existing project/token reports.
107
+
104
108
  - Claude Code and Codex numbers are read from local log files on your machine.
105
109
  - Antigravity quota requires network access, and only if you use it: quota is fetched from Google's official quota endpoint using the OAuth credential the Antigravity CLI already stored after sign-in — read from macOS Keychain, Windows Credential Manager, or a local token file depending on CLI version. `usage` reads that credential without writing it back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
106
110
  - Background network activity: the Antigravity quota/token endpoints above, public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (falls back to built-in prices offline), and occasionally checking GitHub for a new version. Claude Code and Codex log contents are never uploaded.
@@ -109,7 +113,7 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
109
113
  ## Requirements
110
114
 
111
115
  - macOS 12 (Monterey) or newer, or Windows 10/11
112
- - Claude Code, Codex, Antigravity, or Grok CLI has been used at least once (so local usage data exists).
116
+ - Local usage data from Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app with plan-usage history.
113
117
  - (Source runs only) Python 3.13.
114
118
 
115
119
  ## Install
@@ -161,11 +165,13 @@ See your quota, other conversations, and background jobs without leaving Claude
161
165
 
162
166
  - **Quotas:** Your 5-hour and weekly limits.
163
167
  - **Claude conversations:** Conversations waiting for your permission or MCP input are marked in yellow.
168
+ - **Conversation notifications:** A notification appears when another Claude conversation finishes or starts waiting for you.
169
+ - **Latest reply:** Each conversation row shows the latest assistant reply on its second line.
164
170
  - **Background jobs:** Includes subagents started by Claude with the Agent tool and their status.
165
171
 
166
172
  **How to enable**
167
173
 
168
- 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**. On macOS it sits under the **Claude Code** submenu as **Side pane**.
174
+ 1. In the usage menu bar menu (macOS) or system-tray menu (Windows), open the **Claude Code** submenu and check **Side pane**.
169
175
  2. Open a new conversation or run `/reload-plugins`.
170
176
  3. At terminal widths ≥144 columns, the pane opens on the right automatically. In narrower terminals, enter `/usage-dash`.
171
177
 
@@ -185,7 +191,7 @@ Windows has the full core experience: the system-tray UI, Claude Code status-lin
185
191
 
186
192
  The system-tray icon shows the remaining session quota percentage for Claude or Codex. Choose **Tray Display Source → Claude Code / Codex** in the right-click menu or panel menu; the change applies immediately and survives restarts (default: Claude). If Codex has no session window, the icon uses its weekly quota instead and the tooltip identifies that window. Missing quota data shows `--`. The tooltip summarizes both tools, with the selected source first. Left-click opens the same 16 quota themes available on macOS (Default plus the other fifteen) in WebView2. Right-click also provides Reset Panel Position and Quit; panel switching, refresh, launch at login, and update checks are in the panel menu.
187
193
 
188
- Enable **Show Taskbar Quota** in either menu for a transparent `Codex: 92%` label inside the taskbar, immediately left of the notification area. It follows taskbar position, scaling, and light/dark theme, and hides during fullscreen use or taskbar auto-hide. Click the label to open the panel. If buttons leave insufficient space, it moves just outside the taskbar. The normal app icon remains as a menu entry point; the label follows the selected source and quota window.
194
+ Enable **Show Taskbar Quota** in either menu for a transparent `Codex: 92%` label inside the taskbar, immediately left of the notification area. It follows taskbar position, scaling, and light/dark theme, and hides during fullscreen use or taskbar auto-hide. Click the label to open the panel. If buttons leave insufficient space, it moves just outside the taskbar. The normal app icon remains as a menu entry point; the label follows the selected source and quota window. Right-click the label to open the same menu as the tray icon.
189
195
 
190
196
  Windows differences: the panel opens at the bottom-right of the working area rather than next to the tray icon; update prompts use a system Yes/No dialog.
191
197
 
@@ -48,7 +48,7 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
48
48
  - **Grok CLI Support:** A fourth card reads Grok CLI's weekly credit percentage straight from its own local debug log. Grok CLI doesn't expose session or burn-rate data, so the card shows a single weekly bar; its per-request token usage still counts toward today's cost and project totals like Claude Code and Codex.
49
49
  - **Muse Code Spending:** Muse Code's per-request tokens and cost count toward today's cost, project totals, the HTML report, and the `usage` CLI, read from its own local session logs. Muse keeps no local quota data, so there is no Muse quota card.
50
50
  - **Service Status Alerts:** An orange-red banner appears when Claude Code, Claude API, or Codex API has an outage or degraded performance, read from their public Statuspage.io pages. Antigravity isn't covered; it has no public status page.
51
- - **Context Nudges & Notifications:** When your context window hits 70% — or earlier when it is filling fast — the status line nudges you to `/clear` or `/compact` to prevent token waste. You can also opt-in to system notifications for quota limits and recoveries.
51
+ - **Context Nudges & Notifications:** When your context window hits 70% — or earlier when it is filling fast — the status line nudges you to `/clear` or `/compact` to prevent token waste. You can also opt-in to system notifications for quota limits and recoveries. The context figure turns yellow at 50% or 200K tokens and red at 80% or 400K tokens, whichever comes first. When it changes color, the status line shows the image count and the estimated share of files and command output.
52
52
  - **Prompt Cache Health:** The status line shows Claude Code's prompt cache hit rate. For 10 minutes after the cache misses, it also says why — the model changed, the tools changed, you sat idle past the 5-minute TTL, and so on — so you can tell whether the extra tokens came from something you did. The hit rate needs Claude Code 2.1.251 or newer and the reason needs 2.1.260 or newer; on older versions those parts simply don't appear.
53
53
  - **Hide Sections:** Only use one or two of the tools? Hide the Claude Code, Codex, Grok CLI, or Antigravity section from the menu bar and panels completely with a single click.
54
54
 
@@ -57,15 +57,16 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
57
57
  - **Progress Concierge:** Open a new Claude Code session and `usage` hands your last progress straight to the AI, including your last request, uncommitted changes, and unfinished todos. No `/resume`, no recap. When you do `/resume` a conversation that sat long enough for its cache to expire, it warns you how many tokens the next message will re-send and suggests `/compact` first. Off by default.
58
58
  - **Token Saver:** A menu-bar toggle asks Claude Code and Codex to answer more tersely and in plainer language, saving output tokens while keeping code and error messages byte-exact. A light reminder keeps long conversations from drifting back to verbose — in an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
59
59
  - **Claude Code side pane (macOS and Windows):** Quotas, conversations, and background jobs inside Claude Code. [See the side pane](#claude-code-side-pane).
60
- - **Beginner Mode (macOS):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
61
- - **Quota-Aware Mode (macOS):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
62
- - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.5 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
60
+ - **Beginner Mode (macOS and Windows):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
61
+ - **Quota-Aware Mode (macOS and Windows):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
62
+ - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.8 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
63
63
  - **Terminal Integration:** `usage status --json` hands your Claude Code, Codex, Antigravity, and Grok quota to any tool that can run a command — Starship, tmux, or your own scripts. Reads the same local files as the menu bar. [Ready-made snippets](docs/DEVELOPMENT.md#quota-status-for-other-tools-usage-status).
64
64
  - **Token-waste Health Check:** A daily background diagnosis scans your logs for waste, including repeated file reads, polluter directories, and noisy Bash output. If it finds issues, a one-line heads-up appears; say "show me" and the AI walks you through fixes.
65
65
 
66
66
  ### Stay Current
67
67
 
68
68
  - **AI Update Daily:** Opens a daily-updated public [page](https://aqua5230.github.io/ai-updates/) covering Claude Code, Codex, and Antigravity, with the full history kept. Reviewed items get a plain-language summary in all five UI languages; unreviewed ones show the original source text.
69
+ - **Release Notes After an Update:** The first launch after an update shows what changed in that version in your UI language, once. Fresh installs skip it.
69
70
 
70
71
  ### Reporting & Insight
71
72
 
@@ -80,6 +81,8 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
80
81
 
81
82
  ## Privacy & Data Sources
82
83
 
84
+ Claude Desktop chat quota is also supported without installing the standalone Claude Code CLI or configuring a status line. Keep Claude Desktop open: when Claude Code quota files are unavailable, usage reads its local `plan-usage-history.json` (including Microsoft Store installations on Windows). When a recent response in its local Chromium block-file HTTP cache matches the organization, usage also reads the exact session and weekly reset times. Newer cached observations take precedence over throttled history samples; older cache must match the percentages. Missing, unsupported, expired, or inconsistent cache data leaves the countdown unknown; times are never estimated. Desktop samples normally update every 5–15 minutes. The panel shows the observation age, marks it stale after 30 minutes, and stops displaying it after two hours. The most recent organization sample is used; custom desktop profiles are not discovered. No cookies, login tokens, or API calls are needed. These quota caches contain no per-project token counts. Desktop sessions that also write compatible Claude Code logs under `~/.claude/projects/` are counted by the existing project/token reports.
85
+
83
86
  - Claude Code and Codex numbers are read from local log files on your machine.
84
87
  - Antigravity quota requires network access, and only if you use it: quota is fetched from Google's official quota endpoint using the OAuth credential the Antigravity CLI already stored after sign-in — read from macOS Keychain, Windows Credential Manager, or a local token file depending on CLI version. `usage` reads that credential without writing it back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
85
88
  - Background network activity: the Antigravity quota/token endpoints above, public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (falls back to built-in prices offline), and occasionally checking GitHub for a new version. Claude Code and Codex log contents are never uploaded.
@@ -88,7 +91,7 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
88
91
  ## Requirements
89
92
 
90
93
  - macOS 12 (Monterey) or newer, or Windows 10/11
91
- - Claude Code, Codex, Antigravity, or Grok CLI has been used at least once (so local usage data exists).
94
+ - Local usage data from Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app with plan-usage history.
92
95
  - (Source runs only) Python 3.13.
93
96
 
94
97
  ## Install
@@ -140,11 +143,13 @@ See your quota, other conversations, and background jobs without leaving Claude
140
143
 
141
144
  - **Quotas:** Your 5-hour and weekly limits.
142
145
  - **Claude conversations:** Conversations waiting for your permission or MCP input are marked in yellow.
146
+ - **Conversation notifications:** A notification appears when another Claude conversation finishes or starts waiting for you.
147
+ - **Latest reply:** Each conversation row shows the latest assistant reply on its second line.
143
148
  - **Background jobs:** Includes subagents started by Claude with the Agent tool and their status.
144
149
 
145
150
  **How to enable**
146
151
 
147
- 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**. On macOS it sits under the **Claude Code** submenu as **Side pane**.
152
+ 1. In the usage menu bar menu (macOS) or system-tray menu (Windows), open the **Claude Code** submenu and check **Side pane**.
148
153
  2. Open a new conversation or run `/reload-plugins`.
149
154
  3. At terminal widths ≥144 columns, the pane opens on the right automatically. In narrower terminals, enter `/usage-dash`.
150
155
 
@@ -164,7 +169,7 @@ Windows has the full core experience: the system-tray UI, Claude Code status-lin
164
169
 
165
170
  The system-tray icon shows the remaining session quota percentage for Claude or Codex. Choose **Tray Display Source → Claude Code / Codex** in the right-click menu or panel menu; the change applies immediately and survives restarts (default: Claude). If Codex has no session window, the icon uses its weekly quota instead and the tooltip identifies that window. Missing quota data shows `--`. The tooltip summarizes both tools, with the selected source first. Left-click opens the same 16 quota themes available on macOS (Default plus the other fifteen) in WebView2. Right-click also provides Reset Panel Position and Quit; panel switching, refresh, launch at login, and update checks are in the panel menu.
166
171
 
167
- Enable **Show Taskbar Quota** in either menu for a transparent `Codex: 92%` label inside the taskbar, immediately left of the notification area. It follows taskbar position, scaling, and light/dark theme, and hides during fullscreen use or taskbar auto-hide. Click the label to open the panel. If buttons leave insufficient space, it moves just outside the taskbar. The normal app icon remains as a menu entry point; the label follows the selected source and quota window.
172
+ Enable **Show Taskbar Quota** in either menu for a transparent `Codex: 92%` label inside the taskbar, immediately left of the notification area. It follows taskbar position, scaling, and light/dark theme, and hides during fullscreen use or taskbar auto-hide. Click the label to open the panel. If buttons leave insufficient space, it moves just outside the taskbar. The normal app icon remains as a menu entry point; the label follows the selected source and quota window. Right-click the label to open the same menu as the tray icon.
168
173
 
169
174
  Windows differences: the panel opens at the bottom-right of the working area rather than next to the tray icon; update prompts use a system Yes/No dialog.
170
175
 
@@ -0,0 +1,96 @@
1
+ # Third-party notices
2
+
3
+ The Windows taskbar label anchoring in `wintray/taskbar_overlay.py` is adapted
4
+ from [Codex Usage Widget](https://github.com/ognjeeen/codex-usage-widget),
5
+ commit `940d722d4044242bbe73f8056014449c2ef827a7`, particularly
6
+ `Infrastructure/Windows/TaskbarWindowInterop.cs`.
7
+
8
+ MIT License
9
+
10
+ Copyright (c) 2026 Ognjen Marinković
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
29
+
30
+
31
+ ## Python Zstandard
32
+
33
+ The local Claude HTTP cache reader uses python-zstandard, including its bundled
34
+ Zstandard library, under their BSD licenses.
35
+
36
+ Copyright (c) 2016, Gregory Szorc
37
+ All rights reserved.
38
+
39
+ Redistribution and use in source and binary forms, with or without modification,
40
+ are permitted provided that the following conditions are met:
41
+
42
+ 1. Redistributions of source code must retain the above copyright notice, this
43
+ list of conditions and the following disclaimer.
44
+
45
+ 2. Redistributions in binary form must reproduce the above copyright notice,
46
+ this list of conditions and the following disclaimer in the documentation
47
+ and/or other materials provided with the distribution.
48
+
49
+ 3. Neither the name of the copyright holder nor the names of its contributors
50
+ may be used to endorse or promote products derived from this software without
51
+ specific prior written permission.
52
+
53
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
54
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
56
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
57
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
58
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
59
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
60
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
61
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
62
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
63
+
64
+
65
+ ## Zstandard
66
+
67
+ BSD License
68
+
69
+ For Zstandard software
70
+
71
+ Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
72
+
73
+ Redistribution and use in source and binary forms, with or without modification,
74
+ are permitted provided that the following conditions are met:
75
+
76
+ * Redistributions of source code must retain the above copyright notice, this
77
+ list of conditions and the following disclaimer.
78
+
79
+ * Redistributions in binary form must reproduce the above copyright notice,
80
+ this list of conditions and the following disclaimer in the documentation
81
+ and/or other materials provided with the distribution.
82
+
83
+ * Neither the name Facebook, nor Meta, nor the names of its contributors may
84
+ be used to endorse or promote products derived from this software without
85
+ specific prior written permission.
86
+
87
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
88
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
89
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
90
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
91
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
92
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
93
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
94
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
95
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
96
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  from loaders import agy_loader as shared_agy_loader
10
10
 
11
- from i18n import t
11
+ from usage_common.i18n import t
12
12
 
13
13
  from .types import AgentInfo, UsageEntry
14
14
 
@@ -15,7 +15,7 @@ from typing import Any
15
15
 
16
16
  from loaders.claude_paths import claude_config_dirs
17
17
  from loaders.jsonl_utils import iter_jsonl_dicts
18
- from project_resolver import resolve_project_name
18
+ from usage_common.project_resolver import resolve_project_name
19
19
 
20
20
  from .types import AgentInfo
21
21
 
@@ -9,7 +9,7 @@ from __future__ import annotations
9
9
  from loaders import grok_loader as shared_grok_loader
10
10
  from loaders.history_loader import UsageEntry as GrokUsageEntry
11
11
 
12
- from i18n import t
12
+ from usage_common.i18n import t
13
13
 
14
14
  from .types import AgentInfo, UsageEntry
15
15
 
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
  from loaders import muse_loader
7
7
  from loaders.history_loader import UsageEntry as MuseUsageEntry
8
8
 
9
- from i18n import t
9
+ from usage_common.i18n import t
10
10
 
11
11
  from .types import AgentInfo, UsageEntry
12
12
 
@@ -10,6 +10,8 @@ import os
10
10
  from datetime import datetime, timezone
11
11
  from typing import Any
12
12
 
13
+ from loaders import claude_usage as usage_client
14
+
13
15
  from .types import RateLimits
14
16
 
15
17
  STATUS_FILE = os.path.expanduser("~/.claude/usage-status.json")
@@ -42,8 +44,12 @@ def _read_status() -> dict[str, Any] | None:
42
44
 
43
45
  def load_rate_limits() -> RateLimits | None:
44
46
  data = _read_status()
45
- if data is None:
46
- return None
47
+ if data is None or not usage_client._has_complete_rate_limits(data):
48
+ snapshot = usage_client.read_quota_fallback()
49
+ if snapshot is not None:
50
+ return _snapshot_rate_limits(snapshot)
51
+ if data is None:
52
+ return None
47
53
 
48
54
  rl = data.get("rate_limits") or {}
49
55
  five = rl.get("five_hour") or {}
@@ -74,3 +80,18 @@ def load_rate_limits() -> RateLimits | None:
74
80
  model=model_name,
75
81
  updated_at=data.get("_received_at", ""),
76
82
  )
83
+
84
+
85
+ def _snapshot_rate_limits(quota: usage_client.UsageSnapshot) -> RateLimits:
86
+ return RateLimits(
87
+ five_hour_pct=quota.current_percent,
88
+ seven_day_pct=quota.weekly_percent,
89
+ five_hour_resets_at=int(quota.current_reset_at)
90
+ if quota.current_reset_at is not None
91
+ else None,
92
+ seven_day_resets_at=int(quota.weekly_reset_at)
93
+ if quota.weekly_reset_at is not None
94
+ else None,
95
+ model="",
96
+ updated_at=datetime.fromtimestamp(quota.polled_at, timezone.utc).isoformat(),
97
+ )
@@ -7,7 +7,7 @@
7
7
  from collections import defaultdict
8
8
 
9
9
  from adapters.types import DailyStats, MonthlyStats, SessionStats, UsageEntry, WeeklyStats
10
- from pricing import calculate_cost
10
+ from usage_common.pricing import calculate_cost
11
11
 
12
12
 
13
13
  def aggregate_daily(entries: list[UsageEntry]) -> list[DailyStats]:
@@ -8,7 +8,7 @@ from collections.abc import Sequence
8
8
  from datetime import datetime, timedelta, timezone
9
9
 
10
10
  from adapters.types import DailyStats, P90Limits, SessionBlock, UsageEntry
11
- from pricing import calculate_cost
11
+ from usage_common.pricing import calculate_cost
12
12
 
13
13
  BLOCK_DURATION = timedelta(hours=5)
14
14
 
@@ -17,7 +17,7 @@ from typing import Any
17
17
 
18
18
  from loaders.claude_paths import claude_config_dirs
19
19
  from loaders.jsonl_utils import iter_jsonl_dicts
20
- from project_resolver import project_from_encoded_path, resolve_project_name
20
+ from usage_common.project_resolver import project_from_encoded_path, resolve_project_name
21
21
  from usage_common.time_utils import parse_optional_iso8601_utc
22
22
 
23
23
  logger = logging.getLogger(__name__)
@@ -24,7 +24,7 @@ from analyzer import persona_loader
24
24
  from analyzer import subscription
25
25
  from adapters import agy, claude, codex, grok, muse
26
26
  from adapters.types import AgentInfo, UsageEntry
27
- from pricing import calculate_cost, is_model_priced
27
+ from usage_common.pricing import calculate_cost, is_model_priced
28
28
 
29
29
  from .aggregator import aggregate_sessions
30
30
  from . import diagnoser, dispatch_ledger, usage_snapshot
@@ -27,7 +27,7 @@ from typing import NotRequired, TypeGuard, TypedDict
27
27
 
28
28
  from adapters.types import UsageEntry
29
29
  from loaders import cache_quarantine
30
- from pricing import calculate_cost
30
+ from usage_common.pricing import calculate_cost
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
@@ -52,11 +52,6 @@
52
52
  "hook_installed_restart": "已安裝完成,請重開 Claude Code 一次",
53
53
  "hook_install_failed": "安裝 hook 失敗",
54
54
  "hook_install_failed_default": "setup_hook.setup() 回傳失敗",
55
- "repair_dialog_title": "狀態列設定衝突",
56
- "repair_dialog_message": "偵測到其他工具佔用了 Claude Code 狀態列。\n要切換成共存模式嗎?usage app 與其他工具可以同時運作。",
57
- "repair_dialog_repair": "立即修復",
58
- "repair_dialog_skip": "稍後再說",
59
- "repair_dialog_never": "不要再問",
60
55
  "alert_forwarder_title": "啟用共存模式?",
61
56
  "alert_forwarder_body": "偵測到其他 Claude Code 狀態列工具。啟用共存模式後,usage 會透過轉發器與現有工具一起運作。",
62
57
  "alert_forwarder_enable": "啟用共存模式",
@@ -69,7 +64,7 @@
69
64
  "awaiting_rate_limits": "請對 Claude Code 發送一句訊息以同步配額",
70
65
  "hook_broken_not_installed": "⚠ 狀態列沒在更新,請按「設定狀態列」重新安裝",
71
66
  "hook_broken_restart": "⚠ 狀態列沒在運作,請重開一次 Claude Code",
72
- "usage_status_missing": "⚠ 找不到狀態檔,請按「設定狀態列」,再打開一次 Claude Code",
67
+ "usage_status_missing": "尚無額度資料。請保持 Claude 桌面版開啟,或設定狀態列後啟動終端機的 Claude Code。",
73
68
  "usage_status_missing_active": "⚠ 配額資料只能靠終端機的狀態列同步,桌面版/背景工作階段不會觸發,請開一次終端機的 Claude Code 來同步",
74
69
  "usage_status_no_quota": "⚠ 狀態檔尚無配額資料,等 Claude Code 再刷新一次 statusLine",
75
70
  "status_error": "錯誤 ({message})",
@@ -542,7 +537,9 @@
542
537
  "quota_aware_enabled_msg": "已開啟額度感知模式。請重啟 Claude Code 套用。",
543
538
  "quota_aware_disabled_msg": "已關閉額度感知模式。請重啟 Claude Code 套用。",
544
539
  "quota_aware_action_failed": "無法切換額度感知模式。",
545
- "claude_beginner_error": "新手模式:{error}"
540
+ "claude_beginner_error": "新手模式:{error}",
541
+ "claude_desktop_updated": "Claude 桌面版 · {minutes} 分鐘前更新",
542
+ "claude_desktop_stale": "Claude 桌面版 · 資料過期 · {minutes} 分鐘前更新"
546
543
  },
547
544
  "en": {
548
545
  "panel_default_name": "Default",
@@ -597,11 +594,6 @@
597
594
  "hook_installed_restart": "Hook installed. Restart Claude Code once.",
598
595
  "hook_install_failed": "Hook installation failed",
599
596
  "hook_install_failed_default": "setup_hook.setup() returned failure",
600
- "repair_dialog_title": "Status Line Conflict",
601
- "repair_dialog_message": "Another tool is using the Claude Code status line.\nSwitch to coexistence mode? usage app can run alongside other tools.",
602
- "repair_dialog_repair": "Repair Now",
603
- "repair_dialog_skip": "Later",
604
- "repair_dialog_never": "Do Not Ask Again",
605
597
  "alert_forwarder_title": "Enable coexistence mode?",
606
598
  "alert_forwarder_body": "Another Claude Code status line tool was detected. In coexistence mode, usage runs through a forwarder alongside your existing tool.",
607
599
  "alert_forwarder_enable": "Enable Coexistence Mode",
@@ -614,7 +606,7 @@
614
606
  "awaiting_rate_limits": "Send a message in Claude Code to sync your quota",
615
607
  "hook_broken_not_installed": "⚠ Status line is not updating. Click \"Set Up Status Line\" to reinstall it.",
616
608
  "hook_broken_restart": "⚠ Status line hook is not running. Restart Claude Code once.",
617
- "usage_status_missing": "⚠ Status file not found. Click \"Set Up Status Line\", then open Claude Code once.",
609
+ "usage_status_missing": "No quota data yet. Keep Claude Desktop open, or set up the status line and start Claude Code in a terminal.",
618
610
  "usage_status_missing_active": "⚠ Quota data only syncs via the terminal status line — the desktop app and headless sessions don't trigger it. Open Claude Code in a terminal once to sync.",
619
611
  "usage_status_no_quota": "⚠ Status file has no quota data yet. Wait for Claude Code to refresh statusLine once.",
620
612
  "status_error": "Error ({message})",
@@ -1087,7 +1079,9 @@
1087
1079
  "quota_aware_enabled_msg": "Quota-Aware Mode enabled. Restart Claude Code to apply.",
1088
1080
  "quota_aware_disabled_msg": "Quota-Aware Mode disabled. Restart Claude Code to apply.",
1089
1081
  "quota_aware_action_failed": "Could not change Quota-Aware Mode.",
1090
- "claude_beginner_error": "Beginner Mode: {error}"
1082
+ "claude_beginner_error": "Beginner Mode: {error}",
1083
+ "claude_desktop_updated": "Claude Desktop · updated {minutes}m ago",
1084
+ "claude_desktop_stale": "Claude Desktop · stale · updated {minutes}m ago"
1091
1085
  },
1092
1086
  "zh-CN": {
1093
1087
  "panel_default_name": "默认",
@@ -1142,11 +1136,6 @@
1142
1136
  "hook_installed_restart": "已安装完成,请重开 Claude Code 一次",
1143
1137
  "hook_install_failed": "安装 hook 失败",
1144
1138
  "hook_install_failed_default": "setup_hook.setup() 返回失败",
1145
- "repair_dialog_title": "状态栏设置冲突",
1146
- "repair_dialog_message": "检测到其他工具占用了 Claude Code 状态栏。\n要切换成共存模式吗?usage app 可以和其他工具同时运行。",
1147
- "repair_dialog_repair": "立即修复",
1148
- "repair_dialog_skip": "稍后再说",
1149
- "repair_dialog_never": "不要再问",
1150
1139
  "alert_forwarder_title": "启用共存模式?",
1151
1140
  "alert_forwarder_body": "检测到其他 Claude Code 状态栏工具。启用共存模式后,usage 会通过转发器和现有工具一起运行。",
1152
1141
  "alert_forwarder_enable": "启用共存模式",
@@ -1159,7 +1148,7 @@
1159
1148
  "awaiting_rate_limits": "请对 Claude Code 发送一句消息以同步配额",
1160
1149
  "hook_broken_not_installed": "⚠ 状态栏没有更新,请点「设置状态栏」重新安装",
1161
1150
  "hook_broken_restart": "⚠ 状态栏没有运行,请重开一次 Claude Code",
1162
- "usage_status_missing": "⚠ 找不到状态文件,请点「设置状态栏」,再打开一次 Claude Code",
1151
+ "usage_status_missing": "尚无额度数据。请保持 Claude 桌面版打开,或设置状态栏后启动终端中的 Claude Code。",
1163
1152
  "usage_status_missing_active": "⚠ 配额数据只能靠终端的状态栏同步,桌面版/后台会话不会触发,请打开一次终端的 Claude Code 来同步",
1164
1153
  "usage_status_no_quota": "⚠ 状态文件还没有配额数据,等 Claude Code 再刷新一次 statusLine",
1165
1154
  "status_error": "错误 ({message})",
@@ -1632,7 +1621,9 @@
1632
1621
  "quota_aware_enabled_msg": "已开启额度感知模式。请重启 Claude Code 应用。",
1633
1622
  "quota_aware_disabled_msg": "已关闭额度感知模式。请重启 Claude Code 应用。",
1634
1623
  "quota_aware_action_failed": "无法切换额度感知模式。",
1635
- "claude_beginner_error": "新手模式:{error}"
1624
+ "claude_beginner_error": "新手模式:{error}",
1625
+ "claude_desktop_updated": "Claude 桌面版 · {minutes} 分钟前更新",
1626
+ "claude_desktop_stale": "Claude 桌面版 · 数据过期 · {minutes} 分钟前更新"
1636
1627
  },
1637
1628
  "ja": {
1638
1629
  "panel_default_name": "デフォルト",
@@ -1687,11 +1678,6 @@
1687
1678
  "hook_installed_restart": "フックをインストールしました。Claude Code を一度再起動してください。",
1688
1679
  "hook_install_failed": "フックのインストールに失敗しました",
1689
1680
  "hook_install_failed_default": "setup_hook.setup() が失敗を返しました",
1690
- "repair_dialog_title": "ステータスライン設定の競合",
1691
- "repair_dialog_message": "別のツールが Claude Code のステータスラインを使用しています。\n共存モードに切り替えますか?usage app と他のツールを同時に動かせます。",
1692
- "repair_dialog_repair": "今すぐ修復",
1693
- "repair_dialog_skip": "あとで",
1694
- "repair_dialog_never": "今後表示しない",
1695
1681
  "alert_forwarder_title": "共存モードを有効にしますか?",
1696
1682
  "alert_forwarder_body": "他の Claude Code ステータスラインツールを検出しました。共存モードでは、usage はフォワーダー経由で既存のツールと一緒に動作します。",
1697
1683
  "alert_forwarder_enable": "共存モードを有効化",
@@ -1704,7 +1690,7 @@
1704
1690
  "awaiting_rate_limits": "Claude Code にメッセージを送信してクォータを同期してください",
1705
1691
  "hook_broken_not_installed": "⚠ ステータスラインが更新されていません。「ステータスラインを設定」を押して再インストールしてください。",
1706
1692
  "hook_broken_restart": "⚠ ステータスライン hook が動作していません。Claude Code を一度再起動してください。",
1707
- "usage_status_missing": "⚠ ステータスファイルが見つかりません。「ステータスラインを設定」を押してから、Claude Code を一度起動してください。",
1693
+ "usage_status_missing": "利用枠データがありません。Claude デスクトップを開いたままにするか、ステータスラインを設定してターミナルの Claude Code を起動してください。",
1708
1694
  "usage_status_missing_active": "⚠ クォータ情報はターミナルのステータスラインでのみ同期されます。デスクトップアプリやヘッドレスセッションでは同期されません。ターミナルで Claude Code を一度開いてください。",
1709
1695
  "usage_status_no_quota": "⚠ ステータスファイルにクォータデータがまだありません。Claude Code が statusLine をもう一度更新するまでお待ちください。",
1710
1696
  "status_error": "エラー ({message})",
@@ -2177,7 +2163,9 @@
2177
2163
  "quota_aware_enabled_msg": "クォータ認識モードを有効にしました。Claude Code を再起動してください。",
2178
2164
  "quota_aware_disabled_msg": "クォータ認識モードを無効にしました。Claude Code を再起動してください。",
2179
2165
  "quota_aware_action_failed": "クォータ認識モードを切り替えられませんでした。",
2180
- "claude_beginner_error": "初心者モード:{error}"
2166
+ "claude_beginner_error": "初心者モード:{error}",
2167
+ "claude_desktop_updated": "Claude デスクトップ · {minutes}分前に更新",
2168
+ "claude_desktop_stale": "Claude デスクトップ · 古いデータ · {minutes}分前に更新"
2181
2169
  },
2182
2170
  "ko": {
2183
2171
  "panel_default_name": "기본",
@@ -2232,11 +2220,6 @@
2232
2220
  "hook_installed_restart": "훅 설치가 완료되었습니다. Claude Code를 한 번 다시 시작하세요.",
2233
2221
  "hook_install_failed": "훅 설치에 실패했습니다",
2234
2222
  "hook_install_failed_default": "setup_hook.setup()가 실패를 반환했습니다",
2235
- "repair_dialog_title": "상태 표시줄 설정 충돌",
2236
- "repair_dialog_message": "다른 도구가 Claude Code 상태 표시줄을 사용 중입니다.\n공존 모드로 전환할까요? usage app과 다른 도구를 함께 실행할 수 있습니다.",
2237
- "repair_dialog_repair": "지금 복구",
2238
- "repair_dialog_skip": "나중에",
2239
- "repair_dialog_never": "다시 묻지 않기",
2240
2223
  "alert_forwarder_title": "공존 모드를 활성화할까요?",
2241
2224
  "alert_forwarder_body": "다른 Claude Code 상태 표시줄 도구를 감지했습니다. 공존 모드에서는 usage가 포워더를 통해 기존 도구와 함께 실행됩니다.",
2242
2225
  "alert_forwarder_enable": "공존 모드 활성화",
@@ -2249,7 +2232,7 @@
2249
2232
  "awaiting_rate_limits": "Claude Code에 메시지를 보내 할당량을 동기화하세요",
2250
2233
  "hook_broken_not_installed": "⚠ 상태 표시줄이 업데이트되지 않습니다. \"상태 표시줄 설정\"을 눌러 다시 설치하세요.",
2251
2234
  "hook_broken_restart": "⚠ 상태 표시줄 hook이 작동하지 않습니다. Claude Code를 한 번 다시 시작하세요.",
2252
- "usage_status_missing": "⚠ 상태 파일을 찾을 수 없습니다. \"상태 표시줄 설정\"을 누른 뒤 Claude Code를 한 번 여세요.",
2235
+ "usage_status_missing": "사용 한도 데이터가 없습니다. Claude 데스크톱을 열어 두거나 상태 표시줄을 설정한 뒤 터미널에서 Claude Code를 실행하세요.",
2253
2236
  "usage_status_missing_active": "⚠ 할당량 데이터는 터미널 상태 표시줄로만 동기화됩니다. 데스크톱 앱이나 헤드리스 세션에서는 동기화되지 않습니다. 터미널에서 Claude Code를 한 번 열어주세요.",
2254
2237
  "usage_status_no_quota": "⚠ 상태 파일에 아직 할당량 데이터가 없습니다. Claude Code가 statusLine을 한 번 더 새로 고칠 때까지 기다리세요.",
2255
2238
  "status_error": "오류 ({message})",
@@ -2722,6 +2705,8 @@
2722
2705
  "quota_aware_enabled_msg": "할당량 인식 모드를 켰습니다. Claude Code를 다시 시작해 주세요.",
2723
2706
  "quota_aware_disabled_msg": "할당량 인식 모드를 껐습니다. Claude Code를 다시 시작해 주세요.",
2724
2707
  "quota_aware_action_failed": "할당량 인식 모드를 변경할 수 없습니다.",
2725
- "claude_beginner_error": "초보자 모드: {error}"
2708
+ "claude_beginner_error": "초보자 모드: {error}",
2709
+ "claude_desktop_updated": "Claude 데스크톱 · {minutes}분 전 업데이트",
2710
+ "claude_desktop_stale": "Claude 데스크톱 · 오래된 데이터 · {minutes}분 전 업데이트"
2726
2711
  }
2727
2712
  }
@@ -9,8 +9,8 @@ import shutil
9
9
  import sys
10
10
  from pathlib import Path
11
11
 
12
- from i18n import t as _t
13
12
  from installer import setup_hook
13
+ from usage_common.i18n import t as _t
14
14
  from usage_common.usage_lang import detect_lang
15
15
 
16
16
  INSTALL_DIR = Path.home() / ".usage" / "claude-pane" / "usage-dash"
@@ -62,7 +62,7 @@ def _status_argv() -> list[str]:
62
62
  f"import sys;sys.path[:0]=[{resources!r}+'/lib/python{major}{minor}.zip',"
63
63
  f"{resources!r}+'/lib/python{major}.{minor}',"
64
64
  f"{resources!r}+'/lib/python{major}.{minor}/lib-dynload',{resources!r}];"
65
- "import usage_cli;sys.argv=['usage','status','--json'];usage_cli.main()"
65
+ "from usage_app import cli;sys.argv=['usage','status','--json'];cli.main()"
66
66
  )
67
67
  return [
68
68
  "/usr/bin/env",
@@ -72,16 +72,17 @@ def _status_argv() -> list[str]:
72
72
  "-c",
73
73
  bootstrap,
74
74
  ]
75
+ root = str(Path(__file__).resolve().parent.parent)
75
76
  return [
76
77
  sys.executable,
77
- str(Path(__file__).resolve().parent.parent / "usage_cli.py"),
78
- "status",
79
- "--json",
78
+ "-c",
79
+ f"import sys;sys.path.insert(0,{root!r});from usage_app import cli;"
80
+ "sys.argv=['usage','status','--json'];cli.main()",
80
81
  ]
81
82
 
82
83
 
83
84
  def _sidecar_text(mod: str = "usage-dash") -> str:
84
- from i18n import I18N_PATH
85
+ from usage_common.i18n import I18N_PATH
85
86
 
86
87
  bundle = json.loads(I18N_PATH.read_text(encoding="utf-8"))
87
88
  english = bundle["en"]