usage-cli 0.33.4__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.
- {usage_cli-0.33.4/usage_cli.egg-info → usage_cli-0.33.5}/PKG-INFO +91 -72
- {usage_cli-0.33.4 → usage_cli-0.33.5}/README.md +90 -71
- {usage_cli-0.33.4 → usage_cli-0.33.5}/pyproject.toml +1 -1
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_taskbar_menu.py +35 -1
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_wintray.py +298 -2
- {usage_cli-0.33.4 → usage_cli-0.33.5/usage_cli.egg-info}/PKG-INFO +91 -72
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/app.py +84 -23
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/taskbar_menu.py +18 -3
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/watch.py +44 -32
- {usage_cli-0.33.4 → usage_cli-0.33.5}/LICENSE +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/THIRD_PARTY_NOTICES.md +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/agy.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/claude.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/codex.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/grok.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/muse.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/rate_limits.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/registry.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/adapters/types.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/aggregator.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/blocks.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/diagnoser.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/diagnosis_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/dispatch_ledger.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/insights.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/persona_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/reporter.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/subscription.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/analyzer/usage_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/i18n.json +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/claude_pane.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/codex_hook_trust.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/login_item.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/session_hooks.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/setup_hook.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/installer/statusline_settings.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/_shared_cache_file.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/agy_disk_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/agy_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/agy_quota_probe.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/cache_quarantine.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/chromium_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/claude_desktop.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/claude_paths.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/claude_usage.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/codex_disk_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/codex_events.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/codex_fork_replay.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/codex_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/codex_paths.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/disk_cache_common.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/disk_cache_lifecycle.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/grok_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/grok_quota_probe.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/history_disk_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/history_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/jsonl_limits.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/jsonl_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/loaders/muse_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/main.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/actions.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/agy.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/app.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/chrome.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/fsevents_watch.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/grok.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/manual_refresh.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/menu.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/new_badge.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/notify.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/popover.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/prefs.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/refresh.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/state.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/title.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/update.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/menubar/whats_new.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/base.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/catalog.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/dynamic_height.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/panel_scale.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/panel_window.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/panel_window_state.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/payload.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/web_panel.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/panels/window_drag.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/agy_window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/burn_rate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/codex_window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/keeper_outcome.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/notifications.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/quota_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/status_payload.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/usage_rate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/quota/window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/setup.cfg +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/setup_app.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_adapters_claude.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_adapters_codex.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_adapters_rate_limits.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_aggregator.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_agy_adapter.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_agy_disk_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_agy_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_agy_quota_probe.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_agy_window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_analyzer_blocks.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_analyzer_pipeline.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_app_version.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_burn_rate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_cache_quarantine.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_check_upstream.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_chromium_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_claude_desktop.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_claude_pane.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_claude_paths.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_codex_consistency.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_codex_hook_trust.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_codex_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_codex_window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_desktop_fresh_cache.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_desktop_quota_display.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_desktop_quota_review.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_diagnoser.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_disk_cache_shards.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_dispatch_ledger.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_doctor.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_dynamic_height.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_fsevents_watch.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_grok_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_grok_quota_probe.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_history_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_hook_scripts_are_standalone.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_html_report_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_i18n_format_fallback.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_i18n_key_parity.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_i18n_packaged_path.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_insights.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_jsonl_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_keeper_menu.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_keeper_outcome.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_login_item.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_main.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_manual_refresh.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_agy.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_grok.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_notify.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_prefs.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_state.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_menubar_update.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_muse_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_new_badge.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_packaged_resources.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_packaging.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_panel_footer_layout.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_panel_scale.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_panel_window_state.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_panels.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_panels_lazy_import.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_persona_loader.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_pricing.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_project_resolver.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_quota_aware.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_quota_label.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_report_daily_chart.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_report_filter_js.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_reporter_build_data.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_service_status.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_session_resume.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_setup_app.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_setup_hook.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_setup_hook_coexistence.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_setup_hook_resume.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_setup_hook_terse.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_subprocess_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_subscription.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_time_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_tui.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_tui_sprite.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_ui_tables.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_update_checker.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_update_gate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_update_release_notes.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_cli.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_client.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_diagnosis_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_dir_sweeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_lang.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_logging.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_notifications.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_rate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_snapshot.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_snapshot_replay.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_statusline.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_statusline_agy.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_statusline_forwarder.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_statusline_grok.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_terse_mode.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_usage_terse_reminder.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_web_panel_payload.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_whats_new.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_wheel_packaging.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_win_login_item.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_window_keeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tests/test_windows_manifest.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tui/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tui/app.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/tui/sprite.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/html_report.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_charts.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_daily_chart.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_filter.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_ledger.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_scripts.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/report_styles.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/ui/tables.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/updates/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/updates/checker.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/updates/gate.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/updates/release_notes.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/updates/whats_new.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_app/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_app/cli.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_app/doctor.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_cli.egg-info/SOURCES.txt +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_cli.egg-info/dependency_links.txt +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_cli.egg-info/entry_points.txt +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_cli.egg-info/requires.txt +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_cli.egg-info/top_level.txt +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/app_version.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/i18n.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/prefs.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/pricing.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/project_resolver.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/service_status.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/subprocess_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/time_utils.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/usage_dir_sweeper.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/usage_lang.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_common/usage_logging.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_quota_aware.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_session_resume.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_statusline.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_statusline_agy.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_statusline_forwarder.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_statusline_grok.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_terse_mode.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/usage_hooks/usage_terse_reminder.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/__init__.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/login_item.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/menu.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/prefs.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/quota_label.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/taskbar_obstacles.py +0 -0
- {usage_cli-0.33.4 → usage_cli-0.33.5}/wintray/taskbar_overlay.py +0 -0
- {usage_cli-0.33.4 → 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
|
+
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
|
[](https://github.com/aqua5230/usage/stargazers)
|
|
36
38
|
[](https://github.com/aqua5230/usage/actions/workflows/check.yml)
|
|
37
39
|
[](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
|
-
|
|
60
|
+
### macOS (Homebrew, recommended)
|
|
59
61
|
|
|
60
62
|
```bash
|
|
61
63
|
brew install --cask aqua5230/usage/usage
|
|
62
64
|
```
|
|
63
65
|
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
+
Then click the menu bar or tray icon.
|
|
69
88
|
|
|
70
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|
|
@@ -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) | [Discussions](https://github.com/aqua5230/usage/discussions) | [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
|
[](https://github.com/aqua5230/usage/stargazers)
|
|
14
16
|
[](https://github.com/aqua5230/usage/actions/workflows/check.yml)
|
|
15
17
|
[](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
|
-
|
|
38
|
+
### macOS (Homebrew, recommended)
|
|
37
39
|
|
|
38
40
|
```bash
|
|
39
41
|
brew install --cask aqua5230/usage/usage
|
|
40
42
|
```
|
|
41
43
|
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
65
|
+
Then click the menu bar or tray icon.
|
|
47
66
|
|
|
48
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
|
|
@@ -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)**.
|
|
@@ -122,12 +122,34 @@ def test_popup_handles_shutdown_without_touching_native_functions() -> None:
|
|
|
122
122
|
taskbar_menu._show_tray_menu(SimpleNamespace(_menu_handle=(456, []), _menu_hwnd=None))
|
|
123
123
|
|
|
124
124
|
|
|
125
|
+
@pytest.mark.parametrize("notification", [0x202, 0x203, 0x205, 0x200])
|
|
126
|
+
def test_tray_right_click_uses_taskbar_safe_popup_and_preserves_other_notifications(
|
|
127
|
+
monkeypatch: pytest.MonkeyPatch, notification: int
|
|
128
|
+
) -> None:
|
|
129
|
+
calls: list[object] = []
|
|
130
|
+
native = SimpleNamespace(WM_NOTIFY=0x400, WM_RBUTTONUP=0x205)
|
|
131
|
+
icon = SimpleNamespace(
|
|
132
|
+
_message_handlers={0x400: lambda wparam, lparam: calls.append(("original", wparam, lparam))}
|
|
133
|
+
)
|
|
134
|
+
monkeypatch.setattr(importlib, "import_module", lambda _: native)
|
|
135
|
+
monkeypatch.setattr(taskbar_menu, "_show_tray_menu", lambda target: calls.append(target))
|
|
136
|
+
|
|
137
|
+
taskbar_menu.install_tray_menu(icon)
|
|
138
|
+
icon._message_handlers[native.WM_NOTIFY](7, notification)
|
|
139
|
+
|
|
140
|
+
assert calls == (
|
|
141
|
+
[icon] if notification == native.WM_RBUTTONUP else [("original", 7, notification)]
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
125
145
|
@pytest.mark.skipif(
|
|
126
146
|
sys.platform != "win32" or os.environ.get("USAGE_TEST_NATIVE_MENU") != "1",
|
|
127
147
|
reason="opt-in Windows interactive native menu placement test",
|
|
128
148
|
)
|
|
149
|
+
@pytest.mark.parametrize("origin", ["label", "tray"])
|
|
129
150
|
def test_native_popup_does_not_overlap_taskbar_and_dismisses(
|
|
130
151
|
monkeypatch: pytest.MonkeyPatch,
|
|
152
|
+
origin: str,
|
|
131
153
|
) -> None:
|
|
132
154
|
"""Exercise the real TrackPopupMenuEx; inspect only this test's own menu."""
|
|
133
155
|
if sys.platform != "win32":
|
|
@@ -144,7 +166,16 @@ def test_native_popup_does_not_overlap_taskbar_and_dismisses(
|
|
|
144
166
|
Image.new("RGBA", (16, 16)),
|
|
145
167
|
menu=Menu(*(MenuItem(f"Test item {i}", lambda *_: None) for i in range(6))),
|
|
146
168
|
)
|
|
169
|
+
taskbar_menu.install_tray_menu(icon)
|
|
147
170
|
ready, entered, closed = threading.Event(), threading.Event(), threading.Event()
|
|
171
|
+
|
|
172
|
+
def cursor(pointer: Any) -> None:
|
|
173
|
+
point = C.cast(pointer, C.POINTER(W.POINT)).contents
|
|
174
|
+
left, top, right, bottom = layout.tray
|
|
175
|
+
point.x, point.y = (left + right) // 2, (top + bottom) // 2
|
|
176
|
+
|
|
177
|
+
# Both clicks originate inside the taskbar, regardless of the user's mouse.
|
|
178
|
+
monkeypatch.setattr(win32, "GetCursorPos", cursor)
|
|
148
179
|
real_popup = win32.TrackPopupMenuEx
|
|
149
180
|
|
|
150
181
|
def track(*args: Any) -> int:
|
|
@@ -162,7 +193,10 @@ def test_native_popup_does_not_overlap_taskbar_and_dismisses(
|
|
|
162
193
|
tray_thread.start()
|
|
163
194
|
try:
|
|
164
195
|
assert ready.wait(3)
|
|
165
|
-
|
|
196
|
+
if origin == "label":
|
|
197
|
+
taskbar_menu.request_tray_menu(icon)
|
|
198
|
+
else:
|
|
199
|
+
assert win32.PostMessage(icon._hwnd, win32.WM_NOTIFY, 0, win32.WM_RBUTTONUP)
|
|
166
200
|
assert entered.wait(3)
|
|
167
201
|
first, last = W.RECT(), W.RECT()
|
|
168
202
|
deadline = time.monotonic() + 3
|