usage-cli 0.33.3__tar.gz → 0.33.5__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 (267) hide show
  1. {usage_cli-0.33.3/usage_cli.egg-info → usage_cli-0.33.5}/PKG-INFO +92 -73
  2. {usage_cli-0.33.3 → usage_cli-0.33.5}/README.md +91 -72
  3. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/session_hooks.py +1 -1
  4. {usage_cli-0.33.3 → usage_cli-0.33.5}/pyproject.toml +1 -1
  5. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_pricing.py +1 -1
  6. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_project_resolver.py +4 -1
  7. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_session_resume.py +170 -0
  8. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_taskbar_menu.py +35 -1
  9. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_wintray.py +302 -4
  10. {usage_cli-0.33.3 → usage_cli-0.33.5/usage_cli.egg-info}/PKG-INFO +92 -73
  11. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/pricing.py +2 -2
  12. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_session_resume.py +79 -1
  13. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/app.py +92 -24
  14. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/taskbar_menu.py +18 -3
  15. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/watch.py +44 -32
  16. {usage_cli-0.33.3 → usage_cli-0.33.5}/LICENSE +0 -0
  17. {usage_cli-0.33.3 → usage_cli-0.33.5}/THIRD_PARTY_NOTICES.md +0 -0
  18. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/__init__.py +0 -0
  19. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/agy.py +0 -0
  20. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/claude.py +0 -0
  21. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/codex.py +0 -0
  22. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/grok.py +0 -0
  23. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/muse.py +0 -0
  24. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/rate_limits.py +0 -0
  25. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/registry.py +0 -0
  26. {usage_cli-0.33.3 → usage_cli-0.33.5}/adapters/types.py +0 -0
  27. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/__init__.py +0 -0
  28. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/aggregator.py +0 -0
  29. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/blocks.py +0 -0
  30. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/diagnoser.py +0 -0
  31. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/diagnosis_snapshot.py +0 -0
  32. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/dispatch_ledger.py +0 -0
  33. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/insights.py +0 -0
  34. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/persona_loader.py +0 -0
  35. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/reporter.py +0 -0
  36. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/subscription.py +0 -0
  37. {usage_cli-0.33.3 → usage_cli-0.33.5}/analyzer/usage_snapshot.py +0 -0
  38. {usage_cli-0.33.3 → usage_cli-0.33.5}/i18n.json +0 -0
  39. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/__init__.py +0 -0
  40. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/claude_pane.py +0 -0
  41. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/codex_hook_trust.py +0 -0
  42. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/login_item.py +0 -0
  43. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/setup_hook.py +0 -0
  44. {usage_cli-0.33.3 → usage_cli-0.33.5}/installer/statusline_settings.py +0 -0
  45. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/__init__.py +0 -0
  46. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/_shared_cache_file.py +0 -0
  47. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/agy_disk_cache.py +0 -0
  48. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/agy_loader.py +0 -0
  49. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/agy_quota_probe.py +0 -0
  50. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/cache_quarantine.py +0 -0
  51. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/chromium_cache.py +0 -0
  52. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/claude_desktop.py +0 -0
  53. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/claude_paths.py +0 -0
  54. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/claude_usage.py +0 -0
  55. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/codex_disk_cache.py +0 -0
  56. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/codex_events.py +0 -0
  57. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/codex_fork_replay.py +0 -0
  58. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/codex_loader.py +0 -0
  59. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/codex_paths.py +0 -0
  60. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/disk_cache_common.py +0 -0
  61. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/disk_cache_lifecycle.py +0 -0
  62. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/grok_loader.py +0 -0
  63. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/grok_quota_probe.py +0 -0
  64. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/history_disk_cache.py +0 -0
  65. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/history_loader.py +0 -0
  66. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/jsonl_limits.py +0 -0
  67. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/jsonl_utils.py +0 -0
  68. {usage_cli-0.33.3 → usage_cli-0.33.5}/loaders/muse_loader.py +0 -0
  69. {usage_cli-0.33.3 → usage_cli-0.33.5}/main.py +0 -0
  70. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/__init__.py +0 -0
  71. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/actions.py +0 -0
  72. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/agy.py +0 -0
  73. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/app.py +0 -0
  74. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/chrome.py +0 -0
  75. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/fsevents_watch.py +0 -0
  76. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/grok.py +0 -0
  77. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/manual_refresh.py +0 -0
  78. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/menu.py +0 -0
  79. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/new_badge.py +0 -0
  80. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/notify.py +0 -0
  81. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/popover.py +0 -0
  82. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/prefs.py +0 -0
  83. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/refresh.py +0 -0
  84. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/state.py +0 -0
  85. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/title.py +0 -0
  86. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/update.py +0 -0
  87. {usage_cli-0.33.3 → usage_cli-0.33.5}/menubar/whats_new.py +0 -0
  88. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/__init__.py +0 -0
  89. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/base.py +0 -0
  90. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/catalog.py +0 -0
  91. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/dynamic_height.py +0 -0
  92. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/panel_scale.py +0 -0
  93. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/panel_window.py +0 -0
  94. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/panel_window_state.py +0 -0
  95. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/payload.py +0 -0
  96. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/web_panel.py +0 -0
  97. {usage_cli-0.33.3 → usage_cli-0.33.5}/panels/window_drag.py +0 -0
  98. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/__init__.py +0 -0
  99. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/agy_window_keeper.py +0 -0
  100. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/burn_rate.py +0 -0
  101. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/codex_window_keeper.py +0 -0
  102. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/keeper_outcome.py +0 -0
  103. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/notifications.py +0 -0
  104. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/quota_snapshot.py +0 -0
  105. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/status_payload.py +0 -0
  106. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/usage_rate.py +0 -0
  107. {usage_cli-0.33.3 → usage_cli-0.33.5}/quota/window_keeper.py +0 -0
  108. {usage_cli-0.33.3 → usage_cli-0.33.5}/setup.cfg +0 -0
  109. {usage_cli-0.33.3 → usage_cli-0.33.5}/setup_app.py +0 -0
  110. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_adapters_claude.py +0 -0
  111. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_adapters_codex.py +0 -0
  112. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_adapters_rate_limits.py +0 -0
  113. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_aggregator.py +0 -0
  114. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_agy_adapter.py +0 -0
  115. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_agy_disk_cache.py +0 -0
  116. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_agy_loader.py +0 -0
  117. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_agy_quota_probe.py +0 -0
  118. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_agy_window_keeper.py +0 -0
  119. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_analyzer_blocks.py +0 -0
  120. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_analyzer_pipeline.py +0 -0
  121. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_app_version.py +0 -0
  122. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_burn_rate.py +0 -0
  123. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_cache_quarantine.py +0 -0
  124. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_check_upstream.py +0 -0
  125. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_chromium_cache.py +0 -0
  126. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_claude_desktop.py +0 -0
  127. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_claude_pane.py +0 -0
  128. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_claude_paths.py +0 -0
  129. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_codex_consistency.py +0 -0
  130. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_codex_hook_trust.py +0 -0
  131. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_codex_loader.py +0 -0
  132. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_codex_window_keeper.py +0 -0
  133. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_desktop_fresh_cache.py +0 -0
  134. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_desktop_quota_display.py +0 -0
  135. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_desktop_quota_review.py +0 -0
  136. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_diagnoser.py +0 -0
  137. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_disk_cache_shards.py +0 -0
  138. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_dispatch_ledger.py +0 -0
  139. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_doctor.py +0 -0
  140. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_dynamic_height.py +0 -0
  141. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_fsevents_watch.py +0 -0
  142. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_grok_loader.py +0 -0
  143. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_grok_quota_probe.py +0 -0
  144. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_history_loader.py +0 -0
  145. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_hook_scripts_are_standalone.py +0 -0
  146. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_html_report_snapshot.py +0 -0
  147. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_i18n_format_fallback.py +0 -0
  148. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_i18n_key_parity.py +0 -0
  149. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_i18n_packaged_path.py +0 -0
  150. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_insights.py +0 -0
  151. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_jsonl_utils.py +0 -0
  152. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_keeper_menu.py +0 -0
  153. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_keeper_outcome.py +0 -0
  154. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_login_item.py +0 -0
  155. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_main.py +0 -0
  156. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_manual_refresh.py +0 -0
  157. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar.py +0 -0
  158. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_agy.py +0 -0
  159. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_grok.py +0 -0
  160. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_notify.py +0 -0
  161. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_prefs.py +0 -0
  162. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_state.py +0 -0
  163. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_menubar_update.py +0 -0
  164. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_muse_loader.py +0 -0
  165. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_new_badge.py +0 -0
  166. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_packaged_resources.py +0 -0
  167. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_packaging.py +0 -0
  168. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_panel_footer_layout.py +0 -0
  169. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_panel_scale.py +0 -0
  170. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_panel_window_state.py +0 -0
  171. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_panels.py +0 -0
  172. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_panels_lazy_import.py +0 -0
  173. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_persona_loader.py +0 -0
  174. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_quota_aware.py +0 -0
  175. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_quota_label.py +0 -0
  176. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_report_daily_chart.py +0 -0
  177. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_report_filter_js.py +0 -0
  178. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_reporter_build_data.py +0 -0
  179. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_service_status.py +0 -0
  180. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_setup_app.py +0 -0
  181. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_setup_hook.py +0 -0
  182. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_setup_hook_coexistence.py +0 -0
  183. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_setup_hook_resume.py +0 -0
  184. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_setup_hook_terse.py +0 -0
  185. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_subprocess_utils.py +0 -0
  186. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_subscription.py +0 -0
  187. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_time_utils.py +0 -0
  188. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_tui.py +0 -0
  189. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_tui_sprite.py +0 -0
  190. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_ui_tables.py +0 -0
  191. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_update_checker.py +0 -0
  192. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_update_gate.py +0 -0
  193. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_update_release_notes.py +0 -0
  194. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_cli.py +0 -0
  195. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_client.py +0 -0
  196. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_diagnosis_snapshot.py +0 -0
  197. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_dir_sweeper.py +0 -0
  198. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_lang.py +0 -0
  199. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_logging.py +0 -0
  200. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_notifications.py +0 -0
  201. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_rate.py +0 -0
  202. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_snapshot.py +0 -0
  203. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_snapshot_replay.py +0 -0
  204. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_statusline.py +0 -0
  205. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_statusline_agy.py +0 -0
  206. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_statusline_forwarder.py +0 -0
  207. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_statusline_grok.py +0 -0
  208. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_terse_mode.py +0 -0
  209. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_usage_terse_reminder.py +0 -0
  210. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_web_panel_payload.py +0 -0
  211. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_whats_new.py +0 -0
  212. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_wheel_packaging.py +0 -0
  213. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_win_login_item.py +0 -0
  214. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_window_keeper.py +0 -0
  215. {usage_cli-0.33.3 → usage_cli-0.33.5}/tests/test_windows_manifest.py +0 -0
  216. {usage_cli-0.33.3 → usage_cli-0.33.5}/tui/__init__.py +0 -0
  217. {usage_cli-0.33.3 → usage_cli-0.33.5}/tui/app.py +0 -0
  218. {usage_cli-0.33.3 → usage_cli-0.33.5}/tui/sprite.py +0 -0
  219. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/__init__.py +0 -0
  220. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/html_report.py +0 -0
  221. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_charts.py +0 -0
  222. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_daily_chart.py +0 -0
  223. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_filter.py +0 -0
  224. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_ledger.py +0 -0
  225. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_scripts.py +0 -0
  226. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/report_styles.py +0 -0
  227. {usage_cli-0.33.3 → usage_cli-0.33.5}/ui/tables.py +0 -0
  228. {usage_cli-0.33.3 → usage_cli-0.33.5}/updates/__init__.py +0 -0
  229. {usage_cli-0.33.3 → usage_cli-0.33.5}/updates/checker.py +0 -0
  230. {usage_cli-0.33.3 → usage_cli-0.33.5}/updates/gate.py +0 -0
  231. {usage_cli-0.33.3 → usage_cli-0.33.5}/updates/release_notes.py +0 -0
  232. {usage_cli-0.33.3 → usage_cli-0.33.5}/updates/whats_new.py +0 -0
  233. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_app/__init__.py +0 -0
  234. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_app/cli.py +0 -0
  235. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_app/doctor.py +0 -0
  236. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_cli.egg-info/SOURCES.txt +0 -0
  237. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_cli.egg-info/dependency_links.txt +0 -0
  238. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_cli.egg-info/entry_points.txt +0 -0
  239. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_cli.egg-info/requires.txt +0 -0
  240. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_cli.egg-info/top_level.txt +0 -0
  241. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/__init__.py +0 -0
  242. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/app_version.py +0 -0
  243. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/i18n.py +0 -0
  244. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/prefs.py +0 -0
  245. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/project_resolver.py +0 -0
  246. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/service_status.py +0 -0
  247. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/subprocess_utils.py +0 -0
  248. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/time_utils.py +0 -0
  249. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/usage_dir_sweeper.py +0 -0
  250. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/usage_lang.py +0 -0
  251. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_common/usage_logging.py +0 -0
  252. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/__init__.py +0 -0
  253. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_quota_aware.py +0 -0
  254. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_statusline.py +0 -0
  255. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_statusline_agy.py +0 -0
  256. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_statusline_forwarder.py +0 -0
  257. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_statusline_grok.py +0 -0
  258. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_terse_mode.py +0 -0
  259. {usage_cli-0.33.3 → usage_cli-0.33.5}/usage_hooks/usage_terse_reminder.py +0 -0
  260. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/__init__.py +0 -0
  261. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/login_item.py +0 -0
  262. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/menu.py +0 -0
  263. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/prefs.py +0 -0
  264. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/quota_label.py +0 -0
  265. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/taskbar_obstacles.py +0 -0
  266. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/taskbar_overlay.py +0 -0
  267. {usage_cli-0.33.3 → usage_cli-0.33.5}/wintray/whats_new.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.33.3
3
+ Version: 0.33.5
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
@@ -32,6 +32,8 @@ Dynamic: license-file
32
32
 
33
33
  [繁體中文](docs/README.zh-TW.md) · [简体中文](docs/README.zh-CN.md) · English · [日本語](docs/README.ja.md) · [한국어](docs/README.ko.md)  |  [Discussions](https://github.com/aqua5230/usage/discussions)  |  [Landing page](https://aqua5230.github.io/usage/)
34
34
 
35
+ [Install](#install) · [Features](#what-you-get) · [Themes](#theme-gallery) · [Comparison](#comparison) · [Troubleshooting](#troubleshooting)
36
+
35
37
  [![GitHub stars](https://img.shields.io/github/stars/aqua5230/usage?style=flat)](https://github.com/aqua5230/usage/stargazers)
36
38
  [![CI](https://github.com/aqua5230/usage/actions/workflows/check.yml/badge.svg)](https://github.com/aqua5230/usage/actions/workflows/check.yml)
37
39
  [![Latest Release](https://img.shields.io/github/v/release/aqua5230/usage)](https://github.com/aqua5230/usage/releases/latest)
@@ -55,19 +57,36 @@ Dynamic: license-file
55
57
 
56
58
  Runs on macOS 12 or newer and Windows 10/11.
57
59
 
58
- **macOS, with Homebrew (recommended):**
60
+ ### macOS (Homebrew, recommended)
59
61
 
60
62
  ```bash
61
63
  brew install --cask aqua5230/usage/usage
62
64
  ```
63
65
 
64
- It lands in your Applications folder, and `brew upgrade --cask usage` keeps it current. Prefer a direct download? Get `usage.app.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and drag `usage.app` into Applications.
66
+ `brew upgrade --cask usage` keeps it current. Prefer a direct download? Get `usage.app.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and drag `usage.app` into Applications.
67
+
68
+ ### Windows (portable)
69
+
70
+ Download `usage-windows.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and run `usage.exe`. No installer is needed. See [Windows Support](#windows-support).
71
+
72
+ ### Linux and terminal only (uvx)
73
+
74
+ ```bash
75
+ uvx usage-cli
76
+ ```
77
+
78
+ Opens the terminal interface with nothing to install; uv prepares Python 3.13 by itself. For a persistent `usage` command, run `uv tool install usage-cli`. On Linux, `usage setup` installs the Claude Code status line too. This path has no menu bar or tray app.
65
79
 
66
- **First launch on macOS:** if macOS 15 or later blocks it, open System Settings → Privacy & Security, scroll down, and click **Open Anyway**. On macOS 14 or earlier, right-click `usage.app` in Finder → **Open** once. Then click the menu bar icon.
80
+ <details>
81
+ <summary>First launch blocked by macOS Gatekeeper or Windows SmartScreen?</summary>
82
+
83
+ - **macOS 15 or later:** open System Settings → Privacy & Security, scroll down, and click **Open Anyway**.
84
+ - **macOS 14 or earlier:** right-click `usage.app` in Finder → **Open** once.
85
+ - **Windows:** if SmartScreen shows **Windows protected your PC**, click **More info** → **Run anyway**.
67
86
 
68
- **Windows:** download `usage-windows.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and run `usage.exe`. No installer is needed. If SmartScreen shows **Windows protected your PC**, click **More info** → **Run anyway**. See [Windows Support](#windows-support).
87
+ Then click the menu bar or tray icon.
69
88
 
70
- **Terminal only, any OS (Linux included):** `uvx usage-cli` opens the terminal interface with nothing to install; uv prepares Python 3.13 by itself. For a persistent `usage` command, run `uv tool install usage-cli`. On Linux, `usage setup` installs the Claude Code status line too. This path has no menu bar or tray app.
89
+ </details>
71
90
 
72
91
  `usage` needs data from at least one of Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app.
73
92
 
@@ -98,13 +117,15 @@ Once set up, the bottom of the Claude Code window will show a status line like t
98
117
 
99
118
  ### Inside Claude Code
100
119
 
101
- - **Progress Concierge:** A new session starts with your last request, uncommitted changes, and unfinished todos already handed to the AI. No `/resume`, no recap. Off by default.
102
- - **Token Saver:** Asks Claude Code and Codex for shorter, plainer replies while keeping code and error messages byte-exact. In an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
103
- - **Side pane:** Quotas, other conversations, and background jobs next to your work. [See the side pane](#claude-code-side-pane).
104
- - **Beginner Mode:** Explains up to three technical terms from each answer in one plain line, then brings them back for review. Off by default; uses a little Claude quota.
105
- - **Quota-Aware Mode:** When a quota runs low, Claude tells you before a big task that would use it, and lets you do a smaller part or wait for the reset. Off by default; makes no extra model calls.
106
- - **Auto-start 5-hour session:** Right after a 5-hour quota resets, sends each tool one tiny message so the next window starts counting right away. Off by default.
107
- - **Token-waste health check:** A daily scan of your logs for repeated file reads and noisy output. Say "show me" and the AI walks you through fixes.
120
+ | Feature | What it does | Default · quota use |
121
+ |---------|--------------|---------------------|
122
+ | **Progress Concierge** | A new session starts with your last request, uncommitted changes, and unfinished todos already handed to the AI. No `/resume`, no recap. | Off · no extra model calls |
123
+ | **Token Saver** | Asks Claude Code and Codex for shorter, plainer replies while keeping code and error messages byte-exact. In an A/B test on real sessions, late replies stayed **~40% shorter** instead of drifting 84% longer. | Off · no extra model calls |
124
+ | **Side pane** | Quotas, other conversations, and background jobs next to your work. [See the side pane](#claude-code-side-pane). | Off · no extra model calls |
125
+ | **Beginner Mode** | Explains up to three technical terms from each answer in one plain line, then brings them back for review. | Off · a little Claude quota |
126
+ | **Quota-Aware Mode** | When a quota runs low, Claude tells you before a big task that would use it, and lets you do a smaller part or wait for the reset. | Off · no extra model calls |
127
+ | **Auto-start 5-hour session** | Right after a 5-hour quota resets, sends each tool one tiny message so the next window starts counting right away. | Off · negligible quota |
128
+ | **Token-waste health check** | A daily scan of your logs for repeated file reads and noisy output. Say "show me" and the AI walks you through fixes. | Comes with Progress Concierge · no extra model calls |
108
129
 
109
130
  ### Reports and More
110
131
 
@@ -138,7 +159,7 @@ Once set up, the bottom of the Claude Code window will show a status line like t
138
159
 
139
160
  See your quota, other conversations, and background jobs without leaving Claude Code. Available on macOS and Windows.
140
161
 
141
- <p align="center"><img src="docs/side-pane.png" alt="Claude Code side pane showing quotas, conversations, and background jobs" width="637"></p>
162
+ <p align="center"><img src="docs/side-pane.en.png" alt="Claude Code side pane showing quotas, conversations, and background jobs" width="637"></p>
142
163
 
143
164
  **What you’ll see**
144
165
 
@@ -164,49 +185,6 @@ See your quota, other conversations, and background jobs without leaving Claude
164
185
 
165
186
  </details>
166
187
 
167
- ## Privacy & Data Sources
168
-
169
- - **Local logs:** Claude Code, Codex, Grok CLI, and Muse Code numbers are read from log files on your machine. Their contents are never uploaded.
170
- - **Claude Desktop:** Without the Claude Code CLI or a status line, keep Claude Desktop open and `usage` reads its local plan-usage history. No cookies, login tokens, or API calls are needed. Reset times appear only when its local cache confirms them; they are never estimated.
171
- - **Antigravity**, only if you use it, needs network access: quota is fetched from Google's official quota endpoint with 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` never writes that credential back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
172
- - **Other background network activity:** Public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (built-in prices are used offline), and an occasional GitHub check for a new version.
173
- - **Beginner Mode**, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
174
-
175
- <details>
176
- <summary>How Claude Desktop quota is read</summary>
177
-
178
- When Claude Code quota files are unavailable, `usage` reads Claude Desktop's 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.
179
-
180
- 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. 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.
181
-
182
- </details>
183
-
184
- ## Windows Support
185
-
186
- Windows has the full core experience: the system-tray UI with the same 16 themes as macOS, the Claude Code status-line hook, and Codex history parsing all work natively. The tray UI requires Microsoft Edge WebView2 Runtime, which is normally included with Windows 10 and 11.
187
-
188
- <details>
189
- <summary>Tray icon, taskbar label, and other differences</summary>
190
-
191
- 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 quota themes 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.
192
-
193
- 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.
194
-
195
- The panel opens at the bottom-right of the working area rather than next to the tray icon, and update prompts use a system Yes/No dialog.
196
-
197
- </details>
198
-
199
- ### Code signing policy
200
-
201
- Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/).
202
-
203
- Team roles:
204
-
205
- - Committers and reviewers: [aqua5230](https://github.com/aqua5230)
206
- - Approvers: [aqua5230](https://github.com/aqua5230)
207
-
208
- Privacy policy: this program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. See [Privacy & Data Sources](#privacy--data-sources) for the network calls `usage` makes on your behalf and how to avoid them.
209
-
210
188
  ## Theme Gallery
211
189
 
212
190
  Switch between **16 visual themes** directly from the UI:
@@ -238,22 +216,6 @@ Switch between **16 visual themes** directly from the UI:
238
216
 
239
217
  </details>
240
218
 
241
- ## Troubleshooting
242
-
243
- If the menu bar shows `--`, it's usually not broken — there's just no local data yet.
244
-
245
- | Symptom | Likely cause | Fix |
246
- |---------|--------------|-----|
247
- | Menu bar shows `--` | No data yet, or Claude Code hook not refreshed | Run one Codex conversation. For Claude Code, click "Set Up Status Line" (from source: `python3 main.py --setup`) |
248
- | `ImportError` from `main.py` inside `usage.app` | The bundled `main.py` needs the bundle's own interpreter and cannot be run by hand | Don't run that copy. Click "Set Up Status Line" in the app, or clone the repo to run from source |
249
- | Accidentally hit "Quit" | Process terminated | Relaunch `usage.app` from Spotlight or Applications. (`launchctl start com.lollapalooza.usage` only works if you enabled Launch at Login.) |
250
- | Status says "N minutes stale" | Claude Code isn't running | Open Claude Code and let it run |
251
- | Codex section is empty | No Codex history found | Run a Codex conversation to generate logs |
252
- | Today's cost shows $0.00 | Model pricing missing | Delete `~/.usage/pricing_cache.json` or check `USAGE_DEBUG=1` |
253
- | Antigravity card is missing | Antigravity CLI not installed or not signed in | Install and sign in to the Antigravity CLI; the card appears automatically once a background quota fetch succeeds |
254
- | App won't open | macOS Gatekeeper blocked it | See [First launch on macOS](#install) |
255
- | Windows shows "Windows protected your PC" | SmartScreen doesn't recognize the download yet | Click More info → Run anyway |
256
-
257
219
  ## Comparison
258
220
 
259
221
  | Feature | usage | ccusage | TokenTracker |
@@ -276,6 +238,63 @@ If the menu bar shows `--`, it's usually not broken — there's just no local da
276
238
  - You don't use Claude Code, Codex, Antigravity, Grok CLI, or Claude Desktop — there's no usage data for `usage` to read.
277
239
  - You want a menu bar on Linux. Only macOS and Windows have one today, though the terminal interface (`uvx usage-cli`) runs on Linux.
278
240
 
241
+ ## Windows Support
242
+
243
+ Windows has the full core experience: the system-tray UI with the same 16 themes as macOS, the Claude Code status-line hook, and Codex history parsing all work natively. The tray UI requires Microsoft Edge WebView2 Runtime, which is normally included with Windows 10 and 11.
244
+
245
+ <details>
246
+ <summary>Tray icon, taskbar label, and other differences</summary>
247
+
248
+ 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 quota themes 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.
249
+
250
+ 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.
251
+
252
+ The panel opens at the bottom-right of the working area rather than next to the tray icon, and update prompts use a system Yes/No dialog.
253
+
254
+ </details>
255
+
256
+ ## Troubleshooting
257
+
258
+ If the menu bar shows `--`, it's usually not broken — there's just no local data yet.
259
+
260
+ | Symptom | Likely cause | Fix |
261
+ |---------|--------------|-----|
262
+ | Menu bar shows `--` | No data yet, or Claude Code hook not refreshed | Run one Codex conversation. For Claude Code, click "Set Up Status Line" (from source: `python3 main.py --setup`) |
263
+ | `ImportError` from `main.py` inside `usage.app` | The bundled `main.py` needs the bundle's own interpreter and cannot be run by hand | Don't run that copy. Click "Set Up Status Line" in the app, or clone the repo to run from source |
264
+ | Accidentally hit "Quit" | Process terminated | Relaunch `usage.app` from Spotlight or Applications. (`launchctl start com.lollapalooza.usage` only works if you enabled Launch at Login.) |
265
+ | Status says "N minutes stale" | Claude Code isn't running | Open Claude Code and let it run |
266
+ | Codex section is empty | No Codex history found | Run a Codex conversation to generate logs |
267
+ | Today's cost shows $0.00 | Model pricing missing | Delete `~/.usage/pricing_cache.json` or check `USAGE_DEBUG=1` |
268
+ | Antigravity card is missing | Antigravity CLI not installed or not signed in | Install and sign in to the Antigravity CLI; the card appears automatically once a background quota fetch succeeds |
269
+
270
+ ## Privacy & Data Sources
271
+
272
+ - **Local logs:** Claude Code, Codex, Grok CLI, and Muse Code numbers are read from log files on your machine. Their contents are never uploaded.
273
+ - **Claude Desktop:** Without the Claude Code CLI or a status line, keep Claude Desktop open and `usage` reads its local plan-usage history. No cookies, login tokens, or API calls are needed. Reset times appear only when its local cache confirms them; they are never estimated.
274
+ - **Antigravity**, only if you use it, needs network access: quota is fetched from Google's official quota endpoint with 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` never writes that credential back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
275
+ - **Other background network activity:** Public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (built-in prices are used offline), and an occasional GitHub check for a new version.
276
+ - **Beginner Mode**, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
277
+
278
+ <details>
279
+ <summary>How Claude Desktop quota is read</summary>
280
+
281
+ When Claude Code quota files are unavailable, `usage` reads Claude Desktop's 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.
282
+
283
+ 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. 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.
284
+
285
+ </details>
286
+
287
+ ### Code signing policy
288
+
289
+ Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/).
290
+
291
+ Team roles:
292
+
293
+ - Committers and reviewers: [aqua5230](https://github.com/aqua5230)
294
+ - Approvers: [aqua5230](https://github.com/aqua5230)
295
+
296
+ Privacy policy: this program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. See [Privacy & Data Sources](#privacy--data-sources) for the network calls `usage` makes on your behalf and how to avoid them.
297
+
279
298
  ## Development
280
299
 
281
300
  Building from source, configuring custom agents, or running the terminal TUI? See the **[development docs](docs/DEVELOPMENT.md)**.
@@ -10,6 +10,8 @@
10
10
 
11
11
  [繁體中文](docs/README.zh-TW.md) · [简体中文](docs/README.zh-CN.md) · English · [日本語](docs/README.ja.md) · [한국어](docs/README.ko.md) &nbsp;|&nbsp; [Discussions](https://github.com/aqua5230/usage/discussions) &nbsp;|&nbsp; [Landing page](https://aqua5230.github.io/usage/)
12
12
 
13
+ [Install](#install) · [Features](#what-you-get) · [Themes](#theme-gallery) · [Comparison](#comparison) · [Troubleshooting](#troubleshooting)
14
+
13
15
  [![GitHub stars](https://img.shields.io/github/stars/aqua5230/usage?style=flat)](https://github.com/aqua5230/usage/stargazers)
14
16
  [![CI](https://github.com/aqua5230/usage/actions/workflows/check.yml/badge.svg)](https://github.com/aqua5230/usage/actions/workflows/check.yml)
15
17
  [![Latest Release](https://img.shields.io/github/v/release/aqua5230/usage)](https://github.com/aqua5230/usage/releases/latest)
@@ -33,19 +35,36 @@
33
35
 
34
36
  Runs on macOS 12 or newer and Windows 10/11.
35
37
 
36
- **macOS, with Homebrew (recommended):**
38
+ ### macOS (Homebrew, recommended)
37
39
 
38
40
  ```bash
39
41
  brew install --cask aqua5230/usage/usage
40
42
  ```
41
43
 
42
- It lands in your Applications folder, and `brew upgrade --cask usage` keeps it current. Prefer a direct download? Get `usage.app.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and drag `usage.app` into Applications.
44
+ `brew upgrade --cask usage` keeps it current. Prefer a direct download? Get `usage.app.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and drag `usage.app` into Applications.
45
+
46
+ ### Windows (portable)
47
+
48
+ Download `usage-windows.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and run `usage.exe`. No installer is needed. See [Windows Support](#windows-support).
49
+
50
+ ### Linux and terminal only (uvx)
51
+
52
+ ```bash
53
+ uvx usage-cli
54
+ ```
55
+
56
+ Opens the terminal interface with nothing to install; uv prepares Python 3.13 by itself. For a persistent `usage` command, run `uv tool install usage-cli`. On Linux, `usage setup` installs the Claude Code status line too. This path has no menu bar or tray app.
43
57
 
44
- **First launch on macOS:** if macOS 15 or later blocks it, open System Settings → Privacy & Security, scroll down, and click **Open Anyway**. On macOS 14 or earlier, right-click `usage.app` in Finder → **Open** once. Then click the menu bar icon.
58
+ <details>
59
+ <summary>First launch blocked by macOS Gatekeeper or Windows SmartScreen?</summary>
60
+
61
+ - **macOS 15 or later:** open System Settings → Privacy & Security, scroll down, and click **Open Anyway**.
62
+ - **macOS 14 or earlier:** right-click `usage.app` in Finder → **Open** once.
63
+ - **Windows:** if SmartScreen shows **Windows protected your PC**, click **More info** → **Run anyway**.
45
64
 
46
- **Windows:** download `usage-windows.zip` from the [latest release](https://github.com/aqua5230/usage/releases/latest), unzip it, and run `usage.exe`. No installer is needed. If SmartScreen shows **Windows protected your PC**, click **More info** → **Run anyway**. See [Windows Support](#windows-support).
65
+ Then click the menu bar or tray icon.
47
66
 
48
- **Terminal only, any OS (Linux included):** `uvx usage-cli` opens the terminal interface with nothing to install; uv prepares Python 3.13 by itself. For a persistent `usage` command, run `uv tool install usage-cli`. On Linux, `usage setup` installs the Claude Code status line too. This path has no menu bar or tray app.
67
+ </details>
49
68
 
50
69
  `usage` needs data from at least one of Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app.
51
70
 
@@ -76,13 +95,15 @@ Once set up, the bottom of the Claude Code window will show a status line like t
76
95
 
77
96
  ### Inside Claude Code
78
97
 
79
- - **Progress Concierge:** A new session starts with your last request, uncommitted changes, and unfinished todos already handed to the AI. No `/resume`, no recap. Off by default.
80
- - **Token Saver:** Asks Claude Code and Codex for shorter, plainer replies while keeping code and error messages byte-exact. In an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
81
- - **Side pane:** Quotas, other conversations, and background jobs next to your work. [See the side pane](#claude-code-side-pane).
82
- - **Beginner Mode:** Explains up to three technical terms from each answer in one plain line, then brings them back for review. Off by default; uses a little Claude quota.
83
- - **Quota-Aware Mode:** When a quota runs low, Claude tells you before a big task that would use it, and lets you do a smaller part or wait for the reset. Off by default; makes no extra model calls.
84
- - **Auto-start 5-hour session:** Right after a 5-hour quota resets, sends each tool one tiny message so the next window starts counting right away. Off by default.
85
- - **Token-waste health check:** A daily scan of your logs for repeated file reads and noisy output. Say "show me" and the AI walks you through fixes.
98
+ | Feature | What it does | Default · quota use |
99
+ |---------|--------------|---------------------|
100
+ | **Progress Concierge** | A new session starts with your last request, uncommitted changes, and unfinished todos already handed to the AI. No `/resume`, no recap. | Off · no extra model calls |
101
+ | **Token Saver** | Asks Claude Code and Codex for shorter, plainer replies while keeping code and error messages byte-exact. In an A/B test on real sessions, late replies stayed **~40% shorter** instead of drifting 84% longer. | Off · no extra model calls |
102
+ | **Side pane** | Quotas, other conversations, and background jobs next to your work. [See the side pane](#claude-code-side-pane). | Off · no extra model calls |
103
+ | **Beginner Mode** | Explains up to three technical terms from each answer in one plain line, then brings them back for review. | Off · a little Claude quota |
104
+ | **Quota-Aware Mode** | When a quota runs low, Claude tells you before a big task that would use it, and lets you do a smaller part or wait for the reset. | Off · no extra model calls |
105
+ | **Auto-start 5-hour session** | Right after a 5-hour quota resets, sends each tool one tiny message so the next window starts counting right away. | Off · negligible quota |
106
+ | **Token-waste health check** | A daily scan of your logs for repeated file reads and noisy output. Say "show me" and the AI walks you through fixes. | Comes with Progress Concierge · no extra model calls |
86
107
 
87
108
  ### Reports and More
88
109
 
@@ -116,7 +137,7 @@ Once set up, the bottom of the Claude Code window will show a status line like t
116
137
 
117
138
  See your quota, other conversations, and background jobs without leaving Claude Code. Available on macOS and Windows.
118
139
 
119
- <p align="center"><img src="docs/side-pane.png" alt="Claude Code side pane showing quotas, conversations, and background jobs" width="637"></p>
140
+ <p align="center"><img src="docs/side-pane.en.png" alt="Claude Code side pane showing quotas, conversations, and background jobs" width="637"></p>
120
141
 
121
142
  **What you’ll see**
122
143
 
@@ -142,49 +163,6 @@ See your quota, other conversations, and background jobs without leaving Claude
142
163
 
143
164
  </details>
144
165
 
145
- ## Privacy & Data Sources
146
-
147
- - **Local logs:** Claude Code, Codex, Grok CLI, and Muse Code numbers are read from log files on your machine. Their contents are never uploaded.
148
- - **Claude Desktop:** Without the Claude Code CLI or a status line, keep Claude Desktop open and `usage` reads its local plan-usage history. No cookies, login tokens, or API calls are needed. Reset times appear only when its local cache confirms them; they are never estimated.
149
- - **Antigravity**, only if you use it, needs network access: quota is fetched from Google's official quota endpoint with 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` never writes that credential back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
150
- - **Other background network activity:** Public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (built-in prices are used offline), and an occasional GitHub check for a new version.
151
- - **Beginner Mode**, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
152
-
153
- <details>
154
- <summary>How Claude Desktop quota is read</summary>
155
-
156
- When Claude Code quota files are unavailable, `usage` reads Claude Desktop's 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.
157
-
158
- 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. 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.
159
-
160
- </details>
161
-
162
- ## Windows Support
163
-
164
- Windows has the full core experience: the system-tray UI with the same 16 themes as macOS, the Claude Code status-line hook, and Codex history parsing all work natively. The tray UI requires Microsoft Edge WebView2 Runtime, which is normally included with Windows 10 and 11.
165
-
166
- <details>
167
- <summary>Tray icon, taskbar label, and other differences</summary>
168
-
169
- 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 quota themes 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.
170
-
171
- 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.
172
-
173
- The panel opens at the bottom-right of the working area rather than next to the tray icon, and update prompts use a system Yes/No dialog.
174
-
175
- </details>
176
-
177
- ### Code signing policy
178
-
179
- Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/).
180
-
181
- Team roles:
182
-
183
- - Committers and reviewers: [aqua5230](https://github.com/aqua5230)
184
- - Approvers: [aqua5230](https://github.com/aqua5230)
185
-
186
- Privacy policy: this program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. See [Privacy & Data Sources](#privacy--data-sources) for the network calls `usage` makes on your behalf and how to avoid them.
187
-
188
166
  ## Theme Gallery
189
167
 
190
168
  Switch between **16 visual themes** directly from the UI:
@@ -216,22 +194,6 @@ Switch between **16 visual themes** directly from the UI:
216
194
 
217
195
  </details>
218
196
 
219
- ## Troubleshooting
220
-
221
- If the menu bar shows `--`, it's usually not broken — there's just no local data yet.
222
-
223
- | Symptom | Likely cause | Fix |
224
- |---------|--------------|-----|
225
- | Menu bar shows `--` | No data yet, or Claude Code hook not refreshed | Run one Codex conversation. For Claude Code, click "Set Up Status Line" (from source: `python3 main.py --setup`) |
226
- | `ImportError` from `main.py` inside `usage.app` | The bundled `main.py` needs the bundle's own interpreter and cannot be run by hand | Don't run that copy. Click "Set Up Status Line" in the app, or clone the repo to run from source |
227
- | Accidentally hit "Quit" | Process terminated | Relaunch `usage.app` from Spotlight or Applications. (`launchctl start com.lollapalooza.usage` only works if you enabled Launch at Login.) |
228
- | Status says "N minutes stale" | Claude Code isn't running | Open Claude Code and let it run |
229
- | Codex section is empty | No Codex history found | Run a Codex conversation to generate logs |
230
- | Today's cost shows $0.00 | Model pricing missing | Delete `~/.usage/pricing_cache.json` or check `USAGE_DEBUG=1` |
231
- | Antigravity card is missing | Antigravity CLI not installed or not signed in | Install and sign in to the Antigravity CLI; the card appears automatically once a background quota fetch succeeds |
232
- | App won't open | macOS Gatekeeper blocked it | See [First launch on macOS](#install) |
233
- | Windows shows "Windows protected your PC" | SmartScreen doesn't recognize the download yet | Click More info → Run anyway |
234
-
235
197
  ## Comparison
236
198
 
237
199
  | Feature | usage | ccusage | TokenTracker |
@@ -254,6 +216,63 @@ If the menu bar shows `--`, it's usually not broken — there's just no local da
254
216
  - You don't use Claude Code, Codex, Antigravity, Grok CLI, or Claude Desktop — there's no usage data for `usage` to read.
255
217
  - You want a menu bar on Linux. Only macOS and Windows have one today, though the terminal interface (`uvx usage-cli`) runs on Linux.
256
218
 
219
+ ## Windows Support
220
+
221
+ Windows has the full core experience: the system-tray UI with the same 16 themes as macOS, the Claude Code status-line hook, and Codex history parsing all work natively. The tray UI requires Microsoft Edge WebView2 Runtime, which is normally included with Windows 10 and 11.
222
+
223
+ <details>
224
+ <summary>Tray icon, taskbar label, and other differences</summary>
225
+
226
+ 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 quota themes 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.
227
+
228
+ 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.
229
+
230
+ The panel opens at the bottom-right of the working area rather than next to the tray icon, and update prompts use a system Yes/No dialog.
231
+
232
+ </details>
233
+
234
+ ## Troubleshooting
235
+
236
+ If the menu bar shows `--`, it's usually not broken — there's just no local data yet.
237
+
238
+ | Symptom | Likely cause | Fix |
239
+ |---------|--------------|-----|
240
+ | Menu bar shows `--` | No data yet, or Claude Code hook not refreshed | Run one Codex conversation. For Claude Code, click "Set Up Status Line" (from source: `python3 main.py --setup`) |
241
+ | `ImportError` from `main.py` inside `usage.app` | The bundled `main.py` needs the bundle's own interpreter and cannot be run by hand | Don't run that copy. Click "Set Up Status Line" in the app, or clone the repo to run from source |
242
+ | Accidentally hit "Quit" | Process terminated | Relaunch `usage.app` from Spotlight or Applications. (`launchctl start com.lollapalooza.usage` only works if you enabled Launch at Login.) |
243
+ | Status says "N minutes stale" | Claude Code isn't running | Open Claude Code and let it run |
244
+ | Codex section is empty | No Codex history found | Run a Codex conversation to generate logs |
245
+ | Today's cost shows $0.00 | Model pricing missing | Delete `~/.usage/pricing_cache.json` or check `USAGE_DEBUG=1` |
246
+ | Antigravity card is missing | Antigravity CLI not installed or not signed in | Install and sign in to the Antigravity CLI; the card appears automatically once a background quota fetch succeeds |
247
+
248
+ ## Privacy & Data Sources
249
+
250
+ - **Local logs:** Claude Code, Codex, Grok CLI, and Muse Code numbers are read from log files on your machine. Their contents are never uploaded.
251
+ - **Claude Desktop:** Without the Claude Code CLI or a status line, keep Claude Desktop open and `usage` reads its local plan-usage history. No cookies, login tokens, or API calls are needed. Reset times appear only when its local cache confirms them; they are never estimated.
252
+ - **Antigravity**, only if you use it, needs network access: quota is fetched from Google's official quota endpoint with 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` never writes that credential back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
253
+ - **Other background network activity:** Public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (built-in prices are used offline), and an occasional GitHub check for a new version.
254
+ - **Beginner Mode**, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
255
+
256
+ <details>
257
+ <summary>How Claude Desktop quota is read</summary>
258
+
259
+ When Claude Code quota files are unavailable, `usage` reads Claude Desktop's 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.
260
+
261
+ 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. 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.
262
+
263
+ </details>
264
+
265
+ ### Code signing policy
266
+
267
+ Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/).
268
+
269
+ Team roles:
270
+
271
+ - Committers and reviewers: [aqua5230](https://github.com/aqua5230)
272
+ - Approvers: [aqua5230](https://github.com/aqua5230)
273
+
274
+ Privacy policy: this program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it. See [Privacy & Data Sources](#privacy--data-sources) for the network calls `usage` makes on your behalf and how to avoid them.
275
+
257
276
  ## Development
258
277
 
259
278
  Building from source, configuring custom agents, or running the terminal TUI? See the **[development docs](docs/DEVELOPMENT.md)**.
@@ -59,7 +59,7 @@ CODEX_CONFIG = setup_hook.CODEX_CONFIG
59
59
  # session. Off by default: enabled only via the menu toggle, never by self_heal.
60
60
  RESUME_HOOK_TARGET = Path(os.path.expanduser("~/.claude/usage-session-resume.py"))
61
61
  RESUME_PROMPT_SIDECAR = Path(os.path.expanduser("~/.claude/usage-resume-prompt.json"))
62
- RESUME_HOOK_VERSION = "1.10"
62
+ RESUME_HOOK_VERSION = "1.11"
63
63
  RESUME_MATCHER = "startup|clear|resume"
64
64
  RESUME_LANGS = ("zh-TW", "zh-CN", "en", "ja", "ko")
65
65
  _RESUME_MARKER = "usage-session-resume"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usage-cli"
3
- version = "0.33.3"
3
+ version = "0.33.5"
4
4
  description = "usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -383,7 +383,7 @@ def test_fallback_pricing_contains_expected_models() -> None:
383
383
  "input_cost_per_token": 2e-6,
384
384
  "output_cost_per_token": 10e-6,
385
385
  "cache_creation_input_token_cost": 2.5e-6,
386
- "cache_read_input_token_cost": 0.2e-6,
386
+ "cache_read_input_token_cost": 0.1e-6,
387
387
  }
388
388
  assert pricing._resolve_model_key("claude-sonnet-5", fallback) == "claude-sonnet-5"
389
389
  assert fallback["claude-haiku-5-5"] == {
@@ -214,7 +214,10 @@ def test_project_from_encoded_path_matches_names_claude_flattens(tmp_path: Path,
214
214
  def test_project_from_encoded_path_matches_truncated_long_path(tmp_path: Path) -> None:
215
215
  # Claude Code keeps the first 200 encoded characters and appends "-<hash>".
216
216
  projects_dir = tmp_path / "projects"
217
- name = "long-project-" + "x" * 220
217
+ # Size the path below Windows' MAX_PATH limit while keeping it over 200.
218
+ prefix = "long-project-"
219
+ padding = 220 - len(_claude_encode(tmp_path / "work")) - len(prefix) - 1
220
+ name = prefix + "x" * padding
218
221
  real_project = tmp_path / "work" / name
219
222
  real_project.mkdir(parents=True)
220
223
  encoded = _claude_encode(real_project)