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