diff --git a/CHANGELOG_JP.md b/CHANGELOG_JP.md new file mode 100644 index 0000000..89d9689 --- /dev/null +++ b/CHANGELOG_JP.md @@ -0,0 +1,231 @@ +# 変更履歴 + +## [3.1.0] - 2025-07-23 + +### 🆕 新機能 +- **🌐 完全日本語化対応**: 日本語と英語の完全なローカライゼーション機能を追加 + - 自動言語検出(システムロケールに基づく) + - `--locale`パラメータによる手動言語切り替え + - 環境変数`CLAUDE_MONITOR_LOCALE`による設定 + - すべてのUI要素(タイトル、ラベル、メッセージ)の日本語化 +- **📊 使用量分析表示**: 異なる時間集計期間用の`--view`パラメータを追加 + - `--view realtime`(デフォルト): リアルタイム更新によるライブ監視 + - `--view daily`: 包括的なテーブル形式で集計された日次トークン使用量 + - `--view monthly`: 長期トレンド分析用に集計された月次トークン使用量 + +### 📝 用途 +- **日本語ユーザーサポート**: 日本語環境での完全なローカライゼーション +- **日次分析**: 日次使用パターンを追跡し、ピーク消費期間を特定 +- **月次計画**: 長期予算分析とトレンド特定 +- **使用量最適化**: より良いリソース計画のための履歴データ分析 + +## [3.0.0] - 2025-01-13 + +### 🚨 破壊的変更 +- **パッケージ名変更**: `claude-usage-monitor`から`claude-monitor`に変更 + - 新しいインストール: `pip install claude-monitor`または`uv tool install claude-monitor` + - 新しいコマンドエイリアス: `claude-monitor`と`cmonitor` +- **Python要件**: 最小Pythonバージョンを3.8から3.9に引き上げ +- **アーキテクチャ大改修**: 単一ファイルからモジュラーパッケージ構造への完全な再構築 +- **エントリーポイント変更**: モジュール実行は`claude_monitor.__main__:main`経由 + +### 🏗️ 完全なアーキテクチャ再構築 +- **📁 プロフェッショナルパッケージレイアウト**: 適切な名前空間分離による`src/claude_monitor/`構造への移行 + - 単一`claude_monitor.py`ファイルを包括的なモジュラーアーキテクチャに置き換え + - 8つの専門モジュール間での明確な関心事の分離を実装 +- **🔧 モジュラー設計**: 新しいパッケージ構成: + - `cli/` - コマンドラインインターフェースとブートストラップロジック + - `core/` - ビジネスロジック、モデル、設定、計算、価格設定 + - `data/` - データ管理、分析、読み取りユーティリティ + - `monitoring/` - リアルタイムセッション監視とオーケストレーション + - `ui/` - ユーザーインターフェースコンポーネント、レイアウト、表示コントローラー + - `terminal/` - ターミナル管理とテーマ処理 + - `utils/` - フォーマット、通知、タイムゾーン、モデルユーティリティ +- **⚡ パフォーマンス向上**: キャッシング、スレッディング、効率的なセッション管理による最適化されたデータ処理 + +### 🎨 Rich ターミナルUIシステム +- **💫 Rich統合**: プロフェッショナルターミナルインターフェースのためのRichライブラリを使用した完全なUI大改修 + - セマンティックカラーコーディング(🟢🟡🔴)による高度なプログレスバー + - 適切なターミナル幅処理(80+文字必要)によるレスポンシブレイアウト + - 強化されたタイポグラフィと視覚的階層 +- **🌈 改善されたテーマシステム**: より良いコントラスト比による強化された自動テーマ検出 +- **📊 高度な表示コンポーネント**: バーンレートインジケーターと時間ベースメトリクスによる新しい進捗視覚化 + +### 🔒 タイプセーフティと検証 +- **🛡️ Pydantic統合**: 完全なタイプセーフティ実装 + - ユーザーフレンドリーなエラーメッセージによる包括的な設定検証 + - タイプセーフデータモデル(`UsageEntry`、`SessionBlock`、`TokenCounts`) + - 詳細なフィードバック付きCLIパラメータ検証 +- **⚙️ スマート設定**: 最後に使用されたパラメータ永続化によるPydanticベース設定 +- **🔍 強化されたエラーハンドリング**: オプションSentry統合による集中エラー管理 + +### 📈 高度な分析機能 +- **🧮 P90パーセンタイル計算**: 機械学習にインスパイアされた使用予測と制限検出 +- **📊 スマートプラン検出**: カスタムプランサポート付きClaude制限の自動検出 +- **⏱️ リアルタイム監視**: スレッディングとコールバックシステムによる強化されたセッション追跡 +- **💡 インテリジェントインサイト**: 高度なバーンレート計算と速度インジケーター + +### 🔧 開発者体験の改善 +- **🚀 モダンビルドシステム**: HatchlingからSetuptoolsのsrcレイアウトへの移行 +- **🧪 包括的テスト**: pytestとカバレッジレポートによるプロフェッショナルテストインフラ +- **📝 強化されたドキュメント**: v3.0.0固有のソリューションによる更新されたトラブルシューティングガイド +- **🔄 CI/CD再活性化**: 復元・強化されたGitHub Actionsワークフロー: + - マルチPythonバージョンテスト(3.9-3.12) + - Ruffによる自動リンティング + - OIDCによる信頼されたPyPI公開 + - 自動バージョンアップと変更履歴管理 + +### 📦 依存関係とパッケージング更新 +- **🆕 追加されたコア依存関係**: + - `pydantic>=2.0.0`と`pydantic-settings>=2.0.0` - タイプ検証と設定 + - `numpy>=1.21.0` - 高度な計算 + - `sentry-sdk>=1.40.0` - オプションエラートラッキング + - `pyyaml>=6.0` - 設定ファイルサポート +- **⬆️ 依存関係アップグレード**: + - `rich`: `>=13.0.0` → `>=13.7.0` - 強化されたUI機能 + - `pytz`: 制約なし → `>=2023.3` - 改善されたタイムゾーン処理 +- **🛠️ 開発ツール**: MyPy、Bandit、テストフレームワーク、ドキュメントツールで拡張 + +### 🎯 強化されたユーザー機能 +- **🎛️ 柔軟な設定**: 自動検出、手動オーバーライド、永続設定のサポート +- **🌍 改善されたタイムゾーン処理**: 強化されたタイムゾーン検出と検証 +- **⚡ パフォーマンス最適化**: より速い起動時間と削減されたメモリ使用量 +- **🔔 スマート通知**: コンテキストメッセージングによる強化されたフィードバックシステム + +### 🔧 インストールと互換性 +- **📋 インストール方法更新**: `uv`、`pipx`、従来のpipインストールの完全サポート +- **🐧 プラットフォーム互換性**: 外部管理環境を持つ最新Linuxディストリビューションの強化サポート +- **🛣️ 移行パス**: レガシー設定の自動処理とスムーズなアップグレード体験 + +### 📚 技術実装詳細 +- **🏢 プロフェッショナルアーキテクチャ**: 単一責任モジュールによるSOLID原則の実装 +- **🔄 非同期対応設計**: リアルタイム監視機能のためのスレッディングインフラ +- **💾 効率的なデータ処理**: エラー耐性による最適化されたJSONL解析 +- **🔐 セキュリティ強化**: 安全な設定処理とオプションテレメトリ統合 + +## [2.0.0] - 2025-06-25 + +### 追加 +- **🎨 スマートテーマシステム**: 最適なターミナル表示のための自動明/暗テーマ検出 + - ターミナル環境、システム設定、背景色に基づくインテリジェントテーマ検出 + - 手動テーマオーバーライドオプション: `--theme light`、`--theme dark`、`--theme auto` + - テーマ検出のトラブルシューティング用テーマデバッグモード: `--theme-debug` + - プラットフォーム固有テーマ検出(macOS、Windows、Linux) + - VSCode統合ターミナル、iTerm2、Windows Terminalのサポート +- **📊 強化されたプログレスバーカラー**: スマートカラーコーディングによる改善された視覚的フィードバック + - 3段階カラーシステムによるトークン使用プログレスバー: + - 🟢 緑(0-49%): 安全な使用レベル + - 🟡 黄(50-89%): 警告 - 制限に近づいている + - 🔴 赤(90-100%): 危険 - 制限近くまたは制限に達している + - 一貫した青インジケーターによる時間プログレスバー + - 絵文字フィードバック(🐌➡️🚀⚡)によるバーンレート速度インジケーター +- **🌈 Richテーマサポート**: 明・暗両方のターミナル用に最適化されたカラースキーム + - ダークテーマ: 暗い背景用に最適化された明るい色 + - ライトテーマ: 明るい背景用に最適化された暗い色 + - 自動ターミナル機能検出(truecolor、256色、8色) +- **🔧 高度なターミナル検出**: 包括的な環境分析 + - COLORTERM、TERM_PROGRAM、COLORFGBG環境変数サポート + - OSCエスケープシーケンスを使用したターミナル背景色クエリ + - クロスプラットフォームシステムテーマ統合 + +### 変更 +- **破壊的**: プログレスバーカラーロジックがセマンティックカラー名(`cost.low`、`cost.medium`、`cost.high`)を使用するように変更 +- 異なるターミナル環境間での強化された視覚的一貫性 +- 両テーマでのより良いコントラスト比による改善されたアクセシビリティ + +### 技術詳細 +- テーマ検出とカラー管理による新しい`usage_analyzer/themes/`モジュール +- マルチメソッドテーマ検出アルゴリズムによる`ThemeDetector`クラス +- 自動コンソール設定によるRichテーマ統合 +- 最大互換性のための環境認識カラー選択 + +## [1.0.19] - 2025-06-23 + +### 修正 +- Europe/Warsawタイムゾーンに計算をロックしてタイムゾーン処理を修正 +- 信頼性向上のためリセット時刻計算から表示タイムゾーンを分離 +- リセット時刻ロジックを簡素化するため動的タイムゾーン入力と関連エラーハンドリングを削除 + +## [1.0.17] - 2025-06-23 + +### 追加 +- 初期データ読み込み中の「黒い画面」体験を排除するため起動時に即座に表示されるローディング画面 +- 初期データ読み込み中のヘッダーと「Claude使用データを取得中...」メッセージによる視覚的フィードバック + +## [1.0.16] - 2025-06-23 + +### 修正 +- main()の開始時にカラー変数を初期化してCtrl+C押下時のUnboundLocalErrorを修正 +- サブプロセス呼び出しに30秒タイムアウトを追加してccusageコマンドの無限ハングを修正 +- より良いデバッグ情報付きの有用なエラーメッセージによる起動時ccusage可用性チェックを追加 +- ccusageが失敗した時のより良いデバッグ情報付きエラー表示を改善 +- npxがグローバルインストールパッケージを見つけないnpm 7+互換性問題を修正 + +### 追加 +- ハングを防ぐためすべてのccusageサブプロセス呼び出しのタイムアウト処理 +- メインループ進入前のccusage可用性の事前フライトチェック +- インストール手順とログイン要件を提案するより有益なエラーメッセージ +- デュアルコマンド実行: 最初に直接`ccusage`コマンドを試行、その後`npx ccusage`にフォールバック +- どの方法(直接またはnpx)が使用されているかの検出と報告 + +## [1.0.11] - 2025-06-22 + +### 変更 +- `init_dependency.py`をよりシンプルな`check_dependency.py`モジュールに置き換え +- 依存関係チェックを分離された`test_node()`と`test_npx()`関数を使用するようリファクタリング +- 明示的な依存関係チェックを支持して自動Node.jsインストール機能を削除 +- 新しい依存関係モジュールを参照するよう`pyproject.toml`のパッケージインクルードを更新 + +### 修正 +- 複雑なインストールロジックを削除して依存関係処理を簡素化 +- 不足しているNode.jsまたはnpx依存関係のエラーメッセージを改善 + +## [1.0.8] - 2025-06-21 + +### 追加 +- 自動Node.jsインストールサポート + +## [1.0.7] - 2025-06-21 + +### 変更 +- 改善されたドキュメントとエラーハンドリングによる`init_dependency.py`モジュールを強化 +- 利用できない場合の自動`npx`インストールを追加 +- 改善されたクロスプラットフォームNode.jsインストールロジック +- 依存関係初期化プロセス全体でより良いエラーメッセージ + +## [1.0.6] - 2025-06-21 + +### 追加 +- `pyproject.toml`とhatchlingビルドシステムによるモダンPythonパッケージング +- `init_dependency.py`モジュールによる自動Node.jsインストール +- 入力フラッシングと適切なクリーンアップによるターミナル処理改善 +- 自動コード品質チェックのためのGitHub Actionsワークフロー +- Ruffリンターとフォーマッターによるプリコミットフック設定 +- 一貫した開発体験のためのVS Code設定 +- Claude Code AIアシスタント統合のためのCLAUDE.mdドキュメント +- 推奨インストール方法としての`uv`ツールサポート +- システム全体使用のためのコンソールスクリプトエントリーポイント`claude-monitor` +- Pythonプロジェクト用包括的.gitignore +- プロジェクト履歴追跡のためのCHANGELOG.md + +### 変更 +- メインスクリプトを`ccusage_monitor.py`から`claude_monitor.py`に名前変更 +- より良い互換性のため直接`ccusage`コマンドの代わりに`npx ccusage`を使用 +- 監視中の入力破損を防ぐためターミナル処理を改善 +- すべてのドキュメントファイル(README、CONTRIBUTING、DEVELOPMENT、TROUBLESHOOTING)を更新 +- PyPI パッケージング準備のためプロジェクト構造を強化 + +### 修正 +- 監視中のタイピング時のターミナル入力破損 +- カーソル復元による適切なCtrl+C処理 +- 終了時のターミナル設定復元 + +[3.0.0]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v3.0.0 +[2.0.0]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v2.0.0 +[1.0.19]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.19 +[1.0.17]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.17 +[1.0.16]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.16 +[1.0.11]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.11 +[1.0.8]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.8 +[1.0.7]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.7 +[1.0.6]: https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/releases/tag/v1.0.6 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 020075c..63e8a00 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,8 +43,8 @@ source venv/bin/activate # Linux/Mac # Install project and development dependencies pip install -e .[dev] -# Make script executable (Linux/Mac) -chmod +x claude_monitor.py +# Note: No need to make executable as we use module runner +# python -m claude_monitor ``` ### 3. Create a Feature Branch diff --git a/PULL_REQUEST_JP.md b/PULL_REQUEST_JP.md new file mode 100644 index 0000000..c2b0791 --- /dev/null +++ b/PULL_REQUEST_JP.md @@ -0,0 +1,134 @@ +# 🌏 日本語ローカライゼーション対応の追加 + +## 概要 + +Claude Code Usage Monitorを日本人エンジニアが使いやすくするための包括的な日本語ローカライゼーション対応を追加しました。既存の国際的なユーザー向け機能を完全に保持しながら、日本のユーザー向けに最適化された体験を提供します。 + +## 🚀 主な変更点 + +### 📚 包括的な日本語ドキュメント +- **README_JP.md**: 完全な日本語版README(インストール、使用方法、機能説明) +- **CHANGELOG_JP.md**: 変更履歴の日本語版 +- **USAGE_JP.md**: 日本人開発者向けの詳細な使用ガイド + +### 🌐 国際化(i18n)システム +- 新しい`src/claude_monitor/i18n/`モジュールを追加 +- 自動ロケール検出機能 +- 英語と日本語のメッセージサポート +- 環境変数`CLAUDE_MONITOR_LOCALE`による手動制御 + +### 🎌 日本語UI対応 +- すべてのエラーメッセージの日本語化 +- ローディング画面の日本語化 +- ユーザー向け通知メッセージの日本語化 +- 日本語システムロケールの自動検出 + +### 🕐 日本向けデフォルト設定 +- システムタイムゾーンの自動検出(日本語ロケールの場合は適切なタイムゾーンを検出) +- 日本語ロケール検出時の自動日本語化 +- 設定に`--locale`オプション追加(auto/en/ja) + +## 🔧 技術的な実装詳細 + +### ファイル変更 +- `src/claude_monitor/core/settings.py`: ロケール設定追加 +- `src/claude_monitor/cli/bootstrap.py`: 自動ロケール検出とタイムゾーン設定 +- `src/claude_monitor/ui/components.py`: UIメッセージの国際化 +- `src/claude_monitor/terminal/manager.py`: ターミナルメッセージの国際化 + +### 新規ファイル +- `src/claude_monitor/i18n/__init__.py`: i18nモジュールのエントリーポイント +- `src/claude_monitor/i18n/messages.py`: メッセージ翻訳システム +- `README_JP.md`: 日本語版README +- `CHANGELOG_JP.md`: 日本語版変更履歴 +- `USAGE_JP.md`: 日本語使用ガイド + +## 🎯 ユーザー体験の改善 + +### 日本人ユーザー向け +- システムロケールが日本語の場合、自動的に日本語UIで起動 +- 東京タイムゾーンがデフォルト設定 +- 日本語の詳細ドキュメントとガイド +- 日本の開発環境に最適化された使用例 + +### 国際ユーザー向け +- 既存の機能は完全に保持 +- 英語UIはデフォルトで維持 +- 後方互換性を完全保証 +- パフォーマンスへの影響なし + +## 🧪 テスト方法 + +### 日本語ロケールのテスト +```bash +# 日本語ロケールを強制設定 +export CLAUDE_MONITOR_LOCALE=ja +claude-monitor + +# システムロケールでの自動検出テスト +export LANG=ja_JP.UTF-8 +claude-monitor +``` + +### 英語ロケールのテスト +```bash +# 英語ロケールを強制設定 +export CLAUDE_MONITOR_LOCALE=en +claude-monitor + +# デフォルト動作の確認 +unset CLAUDE_MONITOR_LOCALE +claude-monitor +``` + +### 設定オプションのテスト +```bash +# コマンドライン経由でのロケール設定 +claude-monitor --locale ja +claude-monitor --locale en +claude-monitor --locale auto +``` + +## 📋 チェックリスト + +- [x] 包括的な日本語ドキュメント作成 +- [x] i18nシステムの実装 +- [x] 自動ロケール検出機能 +- [x] 全UIメッセージの日本語化 +- [x] 日本向けデフォルト設定 +- [x] 後方互換性の保証 +- [x] 適切なエラーハンドリング +- [x] コードの品質確保 + +## 🌟 期待される効果 + +### 日本の開発者コミュニティへの貢献 +- 日本人エンジニアがより簡単にツールを導入・使用可能 +- 日本語ドキュメントによる学習コストの削減 +- 日本の開発環境に最適化された設定 + +### プロジェクトの国際化 +- 多言語対応の基盤を構築 +- 他言語への展開が容易 +- グローバルなユーザーベース拡大の基礎 + +## 🤝 貢献者への配慮 + +この変更は以下のCONTRIBUTING.mdガイドラインに従っています: +- 明確で説明的なコミットメッセージ +- 適切なブランチ命名(`feature/japanese-localization`) +- 既存コードへの最小限の影響 +- 包括的なドキュメント更新 +- コードの品質とスタイル維持 + +## 📞 フィードバック歓迎 + +この実装について、以下の点でフィードバックをお待ちしています: +- 翻訳の品質と自然さ +- 技術的な実装方法 +- 日本人ユーザーの使いやすさ +- 国際ユーザーへの影響 + +--- + +**この変更により、Claude Code Usage Monitorがより多くの日本人開発者に愛用され、プロジェクトのグローバルな成長に貢献できることを期待しています。** 🚀 diff --git a/README.md b/README.md index 06abc71..3a5332f 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ claude-monitor --help | --view | string | realtime | View type: realtime, daily, or monthly | | --timezone | string | auto | Timezone (auto-detected). Examples: UTC, America/New_York, Europe/London | | --time-format | string | auto | Time format: 12h, 24h, or auto | +| --locale | string | auto | Language: auto (system), en (English), ja (Japanese) | | --theme | string | auto | Display theme: light, dark, classic, or auto | | --refresh-rate | int | 10 | Data refresh rate in seconds (1-60) | | --refresh-per-second | float | 0.75 | Display refresh rate in Hz (0.1-20.0) | @@ -228,6 +229,7 @@ The monitor automatically saves your preferences to avoid re-specifying them on - Theme preferences (--theme) - Timezone settings (--timezone) - Time format (--time-format) +- Locale (--locale) - Refresh rates (--refresh-rate, --refresh-per-second) - Reset hour (--reset-hour) - Custom token limits (--custom-limit-tokens) @@ -340,6 +342,18 @@ claude-monitor --theme dark # light, dark, classic, auto claude-monitor --clear ``` +#### Localization + +You can control the UI language via CLI or environment variable: + +- CLI (takes precedence): `claude-monitor --locale ja` # or en, auto +- Environment variable: `CLAUDE_MONITOR_LOCALE=ja_JP claude-monitor` + +Notes: +- CLI accepts: auto, en, ja +- Env var accepts broader forms (e.g., ja_JP, en-US) and is normalized automatically +- Precedence: CLI > CLAUDE_MONITOR_LOCALE > saved/default + #### Timezone Configuration The default timezone is **auto-detected from your system**. Override with any valid timezone: @@ -597,10 +611,10 @@ The auto-detection system: ```bash # Set custom reset time to 9 AM -./claude_monitor.py --reset-hour 9 +claude-monitor --reset-hour 9 # With your timezone -./claude_monitor.py --reset-hour 9 --timezone US/Eastern +claude-monitor --reset-hour 9 --timezone US/Eastern ``` @@ -614,10 +628,10 @@ The auto-detection system: ```bash # Reset at midnight for clean daily boundaries -./claude_monitor.py --reset-hour 0 +claude-monitor --reset-hour 0 # Late evening reset (11 PM) -./claude_monitor.py --reset-hour 23 +claude-monitor --reset-hour 23 ``` @@ -736,7 +750,7 @@ claude-monitor --plan custom_max claude-monitor # Or development mode - ./claude_monitor.py + python -m claude_monitor ``` - Gives accurate session tracking from the start @@ -759,7 +773,7 @@ claude-monitor --plan custom_max ```bash # Add to ~/.bashrc or ~/.zshrc (only for development setup) - alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && ./claude_monitor.py' + alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && python -m claude_monitor' ``` @@ -807,7 +821,7 @@ claude-monitor --plan custom_max tmux new-session -d -s claude-monitor 'claude-monitor' # Or development mode - tmux new-session -d -s claude-monitor './claude_monitor.py' + tmux new-session -d -s claude-monitor 'python -m claude_monitor' # Check status anytime tmux attach -t claude-monitor @@ -963,11 +977,10 @@ source venv/bin/activate # 4. Install Python dependencies pip install pytz pip install rich>=13.0.0 -# 5. Make script executable (Linux/Mac only) -chmod +x claude_monitor.py +# 5. Note: No need to make executable as we use module runner # 6. Run the monitor -python claude_monitor.py +python -m claude_monitor ``` @@ -984,8 +997,8 @@ source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # Run monitor -./claude_monitor.py # Linux/Mac -# python claude_monitor.py # Windows +claude-monitor # Linux/Mac +# python -m claude_monitor # Windows # When done, deactivate deactivate @@ -997,7 +1010,7 @@ deactivate Create an alias for quick access: ```bash # Add to ~/.bashrc or ~/.zshrc -alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && ./claude_monitor.py' +alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && claude-monitor' # Then just run: claude-monitor @@ -1137,7 +1150,7 @@ If you encounter the error No active session found, please follow these steps: If the issue persists, consider specifying a custom configuration path. By default, Claude Code uses ~/.config/claude. You may need to adjust this path depending on your environment. ```bash -CLAUDE_CONFIG_DIR=~/.config/claude ./claude_monitor.py +CLAUDE_CONFIG_DIR=~/.config/claude claude-monitor ``` diff --git a/README_JP.md b/README_JP.md new file mode 100644 index 0000000..739e43c --- /dev/null +++ b/README_JP.md @@ -0,0 +1,1185 @@ +# 🎯 Claude Code使用量監視ツール +[![PyPI Version](https://img.shields.io/pypi/v/claude-monitor.svg)](https://pypi.org/project/claude-monitor/) +[![Python Version](https://img.shields.io/badge/python-3.9+-blue.svg)](https://python.org) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) +[![codecov](https://codecov.io/gh/Maciek-roboblog/Claude-Code-Usage-Monitor/branch/main/graph/badge.svg)](https://codecov.io/gh/Maciek-roboblog/Claude-Code-Usage-Monitor) + +Claude AIのトークン使用量をリアルタイムで監視する美しいターミナルツールです。高度な分析機能、機械学習ベースの予測、Rich UIを搭載しています。トークン消費、バーンレート、コスト分析を追跡し、セッション制限に関するインテリジェントな予測を提供します。 + +![Claude Token Monitor Screenshot](https://raw.githubusercontent.com/Maciek-roboblog/Claude-Code-Usage-Monitor/main/doc/scnew.png) + +--- + +## 📑 目次 + +- [✨ 主な機能](#-主な機能) +- [🚀 インストール](#-インストール) + - [⚡ uvによるモダンなインストール(推奨)](#-uvによるモダンなインストール推奨) + - [📦 pipによるインストール](#-pipによるインストール) + - [🛠️ その他のパッケージマネージャー](#️-その他のパッケージマネージャー) +- [📖 使い方](#-使い方) + - [ヘルプを表示](#ヘルプを表示) + - [基本的な使用方法](#基本的な使用方法) + - [設定オプション](#設定オプション) + - [利用可能なプラン](#利用可能なプラン) + +- [✨ 機能と動作原理](#-機能と動作原理) + - [現在の機能](#現在の機能) + - [Claudeセッションについて理解する](#claudeセッションについて理解する) + - [プラン別トークン制限](#プラン別トークン制限) + - [スマート検出機能](#スマート検出機能) +- [🚀 使用例](#-使用例) + - [一般的なシナリオ](#一般的なシナリオ) + - [ベストプラクティス](#ベストプラクティス) +- [🔧 開発者向けインストール](#-開発者向けインストール) +- [トラブルシューティング](#トラブルシューティング) + - [インストール時の問題](#インストール時の問題) + - [実行時の問題](#実行時の問題) +- [📞 お問い合わせ](#-お問い合わせ) +- [📚 追加ドキュメント](#-追加ドキュメント) +- [📝 ライセンス](#-ライセンス) +- [🤝 貢献者](#-貢献者) +- [🙏 謝辞](#-謝辞) + +## ✨ 主な機能 + +### 🚀 **v3.0.0 メジャーアップデート - 完全なアーキテクチャ再構築** + +- **🌐 完全日本語化対応** - 日本語と英語の完全なローカライゼーション、自動言語検出 +- **🔮 ML(機械学習)ベースの予測** - P90パーセンタイル計算とインテリジェントなセッション制限検出 +- **🔄 リアルタイム監視** - 設定可能な更新頻度(0.1-20 Hz)とインテリジェントな表示更新 +- **📊 高度なRich UI** - 美しいカラーコード付きプログレスバー、テーブル、レイアウト(WCAG準拠コントラスト) +- **🤖 スマート自動検出** - カスタム制限発見による自動プラン切り替え +- **📋 強化されたプランサポート** - 更新された制限:Pro(約19k)、Max5(88k)、Max20(220k)、Custom(P90ベース) +- **⚠️ 高度な警告システム** - コストと時間予測を含む多段階アラート +- **💼 プロフェッショナルアーキテクチャ** - 単一責任原則(SRP)準拠のモジュラー設計 +- **🎨 インテリジェントテーマ** - 自動ターミナル背景検出による科学的カラースキーム +- **⏰ 高度なスケジューリング** - 自動検出されるシステムタイムゾーンと時刻形式設定 +- **📈 コスト分析** - キャッシュトークン計算を含むモデル固有の価格設定 +- **🔧 Pydantic検証** - 自動検証付きタイプセーフ設定 +- **📝 包括的ログ記録** - 設定可能レベルでのオプションファイルログ記録 +- **🧪 広範囲テスト** - 完全カバレッジの100+テストケース +- **🎯 エラーレポート** - 本番環境監視用オプションSentry統合 +- **⚡ パフォーマンス最適化** - 高度なキャッシングと効率的なデータ処理 + +### 📋 デフォルトCustomプラン + +**Custom プラン**が新しいデフォルトオプションで、5時間のClaude Codeセッション専用に設計されています。3つの重要な指標を監視します: +- **トークン使用量** - トークン消費を追跡 +- **メッセージ使用量** - メッセージ数を監視 +- **コスト使用量** - 長時間セッションで最も重要な指標 + +Customプランは、過去192時間(8日間)のすべてのセッションを分析し、実際の使用量に基づいてパーソナライズされた制限を計算することで、使用パターンに自動的に適応します。これにより、特定のワークフローに合わせた正確な予測と警告が提供されます。 + +## 🚀 インストール +### ⚡ uvによるモダンなインストール(推奨) + +**uvが最良の選択である理由:** +- ✅ 自動的に分離された環境を作成(システム競合なし) +- ✅ Pythonバージョンの問題なし +- ✅ "externally-managed-environment"エラーなし +- ✅ 簡単な更新とアンインストール +- ✅ すべてのプラットフォームで動作 + +監視ツールをインストールして使用する最も速く簡単な方法: + +[![PyPI](https://img.shields.io/pypi/v/claude-monitor.svg)](https://pypi.org/project/claude-monitor/) + +#### PyPIからインストール + +```bash +# uvでPyPIから直接インストール(最も簡単) +uv tool install claude-monitor + +# どこからでも実行 +claude-monitor # または短縮形:cmonitor、ccmonitor +``` + +#### ソースからインストール + +```bash +# ソースからクローンしてインストール +git clone https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor.git +cd Claude-Code-Usage-Monitor +uv tool install . + +# どこからでも実行 +claude-monitor +``` + +#### uv初回ユーザー +uvがまだインストールされていない場合は、1つのコマンドで取得できます: + +```bash +# Linux/macOS: +curl -LsSf https://astral.sh/uv/install.sh | sh + +# Windows: +powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" + +# インストール後、ターミナルを再起動してください +``` + +### 📦 pipによるインストール + +```bash +# PyPIからインストール +pip install claude-monitor + +# claude-monitorコマンドが見つからない場合、~/.local/binをPATHに追加: +echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc +source ~/.bashrc # またはターミナルを再起動 + +# どこからでも実行 +claude-monitor # または短縮形:cmonitor、ccmonitor +``` + +> **⚠️ PATH設定**: WARNING: The script claude-monitor is installed in '/home/username/.local/bin' which is not on PATHが表示された場合、上記のexport PATHコマンドを実行してください。 +> +> **⚠️ 重要**: 最新のLinuxディストリビューション(Ubuntu 23.04+、Debian 12+、Fedora 38+)では、"externally-managed-environment"エラーが発生する場合があります。--break-system-packagesを使用する代わりに、以下を強く推奨します: +> 1. **代わりにuvを使用**(上記参照) - より安全で簡単 +> 2. **仮想環境を使用** - python3 -m venv myenv && source myenv/bin/activate +> 3. **pipxを使用** - pipx install claude-monitor +> +> 詳細な解決策については、トラブルシューティングセクションをご覧ください。 + +### 🛠️ その他のパッケージマネージャー + +#### pipx(分離された環境) +```bash +# pipxでインストール +pipx install claude-monitor + +# どこからでも実行 +claude-monitor # または短縮形:claude-code-monitor、cmonitor、ccmonitor、ccm +``` + +#### conda/mamba +```bash +# conda環境でpipを使用してインストール +pip install claude-monitor + +# どこからでも実行 +claude-monitor # または短縮形:cmonitor、ccmonitor +``` + +## 📖 使い方 + +### ヘルプを表示 + +```bash +# ヘルプ情報を表示 +claude-monitor --help +``` + +#### 利用可能なコマンドラインパラメータ + +| パラメータ | 型 | デフォルト | 説明 | +|-----------|------|---------|-------------| +| --plan | string | custom | プランタイプ: pro、max5、max20、またはcustom | +| --custom-limit-tokens | int | None | customプラン用のトークン制限(0より大きい必要があります) | +| --view | string | realtime | 表示タイプ: realtime、daily、monthly、またはsession | +| --timezone | string | auto | タイムゾーン(自動検出)。例: UTC、America/New_York、Europe/London | +| --time-format | string | auto | 時刻形式: 12h、24h、またはauto | +| --locale | string | auto | 言語: auto(システム)、en(英語)、ja(日本語) | +| --theme | string | auto | 表示テーマ: light、dark、classic、またはauto | +| --refresh-rate | int | 10 | データ更新頻度(秒)(1-60) | +| --refresh-per-second | float | 0.75 | 表示更新頻度(Hz)(0.1-20.0) | +| --reset-hour | int | None | 日次リセット時刻(0-23) | +| --log-level | string | INFO | ログレベル: DEBUG、INFO、WARNING、ERROR、CRITICAL | +| --log-file | path | None | ログファイルパス | +| --debug | flag | False | デバッグログを有効にする | +| --version, -v | flag | False | バージョン情報を表示 | +| --clear | flag | False | 保存された設定をクリア | + +注: ロケールは環境変数 CLAUDE_MONITOR_LOCALE(ja/en/auto)でも上書きできます。 + +#### プランオプション + +| プラン | トークン制限 | コスト制限 | 説明 | +|------|-------------|------------------|-------------| +| pro | 19,000 | $18.00 | Claude Pro サブスクリプション | +| max5 | 88,000 | $35.00 | Claude Max5 サブスクリプション | +| max20 | 220,000 | $140.00 | Claude Max20 サブスクリプション | +| custom | P90ベース | (デフォルト) $50.00 | ML分析による自動検出 | + +#### コマンドエイリアス + +このツールは以下のコマンドで呼び出せます: +- claude-monitor(メイン) +- claude-code-monitor(完全名) +- cmonitor(短縮形) +- ccmonitor(短縮形代替) +- ccm(最短) + +#### 設定保存機能 + +監視ツールは設定を自動的に保存し、毎回再指定する必要がありません: + +**保存される項目:** +- 表示タイプ(--view) +- テーマ設定(--theme) +- タイムゾーン設定(--timezone) +- 時刻形式(--time-format) +- ロケール(--locale) +- 更新頻度(--refresh-rate、--refresh-per-second) +- リセット時刻(--reset-hour) +- カスタムトークン制限(--custom-limit-tokens) + +**設定場所:** ~/.claude-monitor/last_used.json + +**使用例:** +```bash +# 初回実行 - 設定を指定 +claude-monitor --plan pro --theme dark --timezone "Asia/Tokyo" + +# 以降の実行 - 設定が自動的に復元 +claude-monitor --plan pro + +# このセッションで保存設定を上書き +claude-monitor --plan pro --theme light + +# 保存されたすべての設定をクリア +claude-monitor --clear +``` + +**主な機能:** +- ✅ セッション間での自動パラメータ永続化 +- ✅ CLIオプションは常に保存設定を上書き +- ✅ 破損を防ぐアトミックファイル操作 +- ✅ 設定ファイルが破損した場合のグレースフルフォールバック +- ✅ プランパラメータは保存されません(毎回指定が必要) + +### 基本的な使用方法 + +#### uvツールインストール(推奨) +```bash +# デフォルト(自動検出付きCustomプラン) +claude-monitor + +# 代替コマンド +claude-code-monitor # 完全な説明名 +cmonitor # 短縮エイリアス +ccmonitor # 短縮代替 +ccm # 最短エイリアス + +# 監視ツールを終了 +# Ctrl+Cを押して正常に終了 +``` + +#### 開発モード +ソースから実行する場合は、src/ディレクトリからpython -m claude_monitorを使用してください。 + +### 設定オプション + +#### プランを指定 + +```bash +# P90自動検出付きCustomプラン(デフォルト) +claude-monitor --plan custom + +# Proプラン(約19,000トークン) +claude-monitor --plan pro + +# Max5プラン(約88,000トークン) +claude-monitor --plan max5 + +# Max20プラン(約220,000トークン) +claude-monitor --plan max20 + +# 明示的なトークン制限付きCustomプラン +claude-monitor --plan custom --custom-limit-tokens 100000 +``` + +#### カスタムリセット時刻 + +```bash +# 午前3時にリセット +claude-monitor --reset-hour 3 + +# 午後10時にリセット +claude-monitor --reset-hour 22 +``` + +#### 使用量表示設定 + +```bash +# ライブ更新付きリアルタイム監視(デフォルト) +claude-monitor --view realtime + +# テーブル形式で集計された日次トークン使用量 +claude-monitor --view daily + +# テーブル形式で集計された月次トークン使用量 +claude-monitor --view monthly +``` + +#### パフォーマンスと表示設定 + +```bash +# 更新頻度を調整(1-60秒、デフォルト: 10) +claude-monitor --refresh-rate 5 + +# 表示更新頻度を調整(0.1-20 Hz、デフォルト: 0.75) +claude-monitor --refresh-per-second 1.0 + +# 時刻形式を設定(デフォルトで自動検出) +claude-monitor --time-format 24h # または12h + +# 特定のテーマを強制 +claude-monitor --theme dark # light、dark、classic、auto + +# 保存された設定をクリア +claude-monitor --clear +``` + +#### 言語設定 + +ツールは日本語と英語の両方をサポートしています。デフォルトは「自動検出」で、システムの言語が日本語の場合に日本語を使用します: + +```bash +# 日本語を強制 +claude-monitor --locale ja + +# 英語を強制 +claude-monitor --locale en + +# システム設定に基づく自動検出 +claude-monitor --locale auto + +# 環境変数で設定 +export CLAUDE_MONITOR_LOCALE=ja +claude-monitor +``` + +#### ローカライゼーション + +UI言語はCLIまたは環境変数で制御できます: + +- CLI(優先): `claude-monitor --locale ja` # または en、auto +- 環境変数: `CLAUDE_MONITOR_LOCALE=ja_JP claude-monitor` + +注意: +- CLIは以下を受け入れます: auto、en、ja +- 環境変数はより広い形式(例:ja_JP、en-US)を受け入れ、自動的に正規化されます +- 優先順位: CLI > CLAUDE_MONITOR_LOCALE > 保存/デフォルト + +#### タイムゾーン設定 + +デフォルトのタイムゾーンは**システムから自動検出**されます。有効なタイムゾーンで上書き可能: + +```bash +# 東京時間を使用 +claude-monitor --timezone Asia/Tokyo + +# 米国東部時間を使用 +claude-monitor --timezone America/New_York + +# UTCを使用 +claude-monitor --timezone UTC + +# ロンドン時間を使用 +claude-monitor --timezone Europe/London +``` + +#### ログ記録とデバッグ + +```bash +# デバッグログを有効 +claude-monitor --debug + +# ファイルにログ出力 +claude-monitor --log-file ~/.claude-monitor/logs/monitor.log + +# ログレベルを設定 +claude-monitor --log-level WARNING # DEBUG、INFO、WARNING、ERROR、CRITICAL +``` + +### 利用可能なプラン + +| プラン | トークン制限 | 最適な用途 | +|------|-----------------|----------| +| **custom** | P90自動検出 | インテリジェント制限検出(デフォルト) | +| **pro** | 約19,000 | Claude Pro サブスクリプション | +| **max5** | 約88,000 | Claude Max5 サブスクリプション | +| **max20** | 約220,000 | Claude Max20 サブスクリプション | + +#### 高度なプラン機能 + +- **P90分析**: Customプランは使用履歴から90パーセンタイル計算を使用 +- **コスト追跡**: キャッシュトークン計算を含むモデル固有の価格設定 +- **制限検出**: 95%信頼度でのインテリジェント閾値検出 + +## 🚀 v3.0.0の新機能 + +### 主な変更点 + +#### **完全なアーキテクチャ再構築** +- 単一責任原則(SRP)準拠のモジュラー設計 +- タイプセーフティと検証付きPydanticベース設定 +- オプションSentry統合による高度なエラーハンドリング +- 100+テストケースによる包括的テストスイート + +#### **機能強化** +- **P90分析**: 90パーセンタイル計算を使用した機械学習ベースの制限検出 +- **更新されたプラン制限**: Pro(約19k)、Max5(88k)、Max20(220k)トークン +- **コスト分析**: キャッシュトークン計算を含むモデル固有の価格設定 +- **Rich UI**: 自動ターミナル背景検出によるWCAG準拠テーマ + +#### **新しいCLIオプション** +- --refresh-per-second: 設定可能な表示更新頻度(0.1-20 Hz) +- --time-format: 自動12h/24h形式検出 +- --custom-limit-tokens: customプラン用の明示的なトークン制限 +- --log-fileと--log-level: 高度なログ記録機能 +- --clear: 保存された設定をリセット +- 便利なコマンドエイリアス: claude-code-monitor、cmonitor、ccmonitor、ccm + +#### **破壊的変更** +- パッケージ名がclaude-usage-monitorからclaude-monitorに変更 +- デフォルトプランがproからcustom(自動検出付き)に変更 +- 最小Pythonバージョンが3.9+に引き上げ +- コマンド構造が更新(上記の例を参照) + +## ✨ 機能と動作原理 + +### v3.0.0アーキテクチャ概要 + +新バージョンでは、単一責任原則(SRP)に従ったモジュラーアーキテクチャによる完全な再構築が特徴です: + +### 🖥️ ユーザーインターフェース層 + +| コンポーネント | 説明 | +| -------------------- | --------------------- | +| **CLIモジュール** | Pydanticベース | +| **設定/コンフィグ** | タイプセーフ | +| **エラーハンドリング** | Sentry対応 | +| **Rich Terminal UI** | 適応テーマ | + +--- + +### 🎛️ 監視オーケストレーター + +| コンポーネント | 主な責任 | +| ------------------------ | ---------------------------------------------------------------- | +| **中央制御ハブ** | セッション管理・リアルタイムデータフロー・コンポーネント調整 | +| **データマネージャー** | キャッシュ管理・ファイルI/O・状態永続化 | +| **セッション監視** | リアルタイム・5時間ウィンドウ・トークン追跡 | +| **UI制御** | Rich表示・プログレスバー・テーマシステム | +| **分析** | P90計算機・バーンレート・予測 | + +--- + +### 🏗️ 基盤層 + +| コンポーネント | コア機能 | +| ------------------- | ------------------------------------------------------- | +| **コアモデル** | セッションデータ・設定スキーマ・タイプセーフティ | +| **分析エンジン** | MLアルゴリズム・統計・予測 | +| **ターミナルテーマ** | 自動検出・WCAGカラー・コントラスト最適化 | +| **Claude APIデータ** | トークン追跡・コスト計算・セッションブロック | + +--- + +**🔄 データフロー:** +Claude設定ファイル → データ層 → 分析エンジン → UIコンポーネント → ターミナル表示 + +### 現在の機能 + +#### 🔄 高度なリアルタイム監視 +- 設定可能な更新間隔(1-60秒) +- 高精度表示更新(0.1-20 Hz) +- CPU使用量を最小化するインテリジェント変更検出 +- コールバックシステム付きマルチスレッドオーケストレーション + +#### 📊 Rich UIコンポーネント +- **プログレスバー**: 科学的コントラスト比によるWCAG準拠カラースキーム +- **データテーブル**: モデル固有統計による並び替え可能な列 +- **レイアウトマネージャー**: ターミナルサイズに適応するレスポンシブデザイン +- **テーマシステム**: 最適な可読性のためのターミナル背景自動検出 + +#### 📈 複数の使用量表示 +- **リアルタイム表示**(デフォルト): プログレスバー、現在のセッションデータ、バーンレート分析によるライブ監視 +- **日次表示**: 日付、モデル、入力/出力/キャッシュトークン、総トークン、コストを表示する日次統計集計 +- **月次表示**: 長期トレンド分析と予算計画のための月次集計データ + +#### 🔮 機械学習予測 +- **P90計算機**: インテリジェント制限検出のための90パーセンタイル分析 +- **バーンレート分析**: マルチセッション消費パターン分析 +- **コスト予測**: キャッシュトークン計算を含むモデル固有価格設定 +- **セッション予測**: 使用パターンに基づいてセッション期限を予測 + +#### 🤖 インテリジェント自動検出 +- **背景検出**: ターミナルテーマ(明/暗)を自動判定 +- **システム統合**: タイムゾーンと時刻形式設定を自動検出 +- **プラン認識**: 使用パターンを分析して最適なプランを提案 +- **制限発見**: 履歴データをスキャンして実際のトークン制限を発見 + +### Claudeセッションについて理解する + +#### Claude Codeセッションの仕組み + +Claude Codeは**5時間のローリングセッションウィンドウシステム**で動作します: + +1. **セッション開始**: Claudeへの最初のメッセージで開始 +2. **セッション期間**: その最初のメッセージから正確に5時間継続 +3. **トークン制限**: 各5時間セッションウィンドウ内で適用 +4. **複数セッション**: 複数のアクティブセッションを同時に持つことが可能 +5. **ローリングウィンドウ**: 他のセッションがまだアクティブな間に新しいセッションを開始可能 + +#### セッションリセットスケジュール + +**セッションタイムラインの例:** +10:30 AM - 最初のメッセージ(セッションAが10 AMに開始) +03:00 PM - セッションA期限切れ(5時間後) + +12:15 PM - 最初のメッセージ(セッションBが12PMに開始) +05:15 PM - セッションB期限切れ(5時間後の5PM) + +#### バーンレート計算 + +監視ツールは洗練された分析を使用してバーンレートを計算します: + +1. **データ収集**: 過去1時間のすべてのセッションからトークン使用量を収集 +2. **パターン分析**: 重複するセッション間での消費トレンドを特定 +3. **速度追跡**: 1分あたりのトークン消費を計算 +4. **予測エンジン**: 現在のセッショントークンがいつ枯渇するかを推定 +5. **リアルタイム更新**: 使用パターンの変化に応じて予測を調整 + +### プラン別トークン制限 + +#### v3.0.0更新されたプラン制限 + +| プラン | 制限(トークン) | コスト制限 | メッセージ | アルゴリズム | +|------|----------------|------------------|----------|-----------| +| **Claude Pro** | 19,000 | $18.00 | 250 | 固定制限 | +| **Claude Max5** | 88,000 | $35.00 | 1,000 | 固定制限 | +| **Claude Max20** | 220,000 | $140.00 | 2,000 | 固定制限 | +| **Custom** | P90ベース | (デフォルト) $50.00 | 250+ | 機械学習 | + +#### 高度な制限検出 + +- **P90分析**: 履歴使用量の90パーセンタイルを使用 +- **信頼度閾値**: 制限検出で95%の精度 +- **キャッシュサポート**: キャッシュ作成と読み取りトークンコストを含む +- **モデル固有**: Claude 3.5、Claude 4、将来のモデルに適応 + +### 技術要件 + +#### 依存関係(v3.0.0) + +```toml +# コア依存関係(自動インストール) +pytz>=2023.3 # タイムゾーン処理 +rich>=13.7.0 # Rich ターミナルUI +pydantic>=2.0.0 # タイプ検証 +pydantic-settings>=2.0.0 # 設定管理 +numpy>=1.21.0 # 統計計算 +sentry-sdk>=1.40.0 # エラーレポート(オプション) +pyyaml>=6.0 # 設定ファイル +tzdata # Windows タイムゾーンデータ +``` + +#### Python要件 + +- **最小**: Python 3.9+ +- **推奨**: Python 3.11+ +- **テスト済み**: Python 3.9、3.10、3.11、3.12、3.13 + +### スマート検出機能 + +#### 自動プラン切り替え + +デフォルトのProプランを使用している場合: + +1. **検出**: 監視ツールがトークン使用量が7,000を超えることを検知 +2. **分析**: 実際の制限について以前のセッションをスキャン +3. **切り替え**: 自動的にcustom(P90自動検出)に変更 +4. **通知**: 変更について明確なメッセージを表示 +5. **継続**: 新しい、より高い制限で監視を継続 + +#### 制限発見プロセス + +自動検出システム: + +1. **履歴をスキャン**: 利用可能なすべてのセッションブロックを調査 +2. **ピークを発見**: 達成された最高のトークン使用量を特定 +3. **データを検証**: データ品質と最新性を確保 +4. **制限を設定**: 発見された最大値を新しい制限として使用 +5. **パターンを学習**: 実際の使用能力に適応 + +## 🚀 使用例 + +### 一般的なシナリオ + +#### 🌅 朝型開発者 +**シナリオ**: 午前9時に作業を開始し、スケジュールに合わせてトークンをリセットしたい。 + +```bash +# カスタムリセット時刻を午前9時に設定 +claude-monitor --reset-hour 9 + +# タイムゾーンと合わせて +claude-monitor --reset-hour 9 --timezone Asia/Tokyo +``` + +**メリット**: +- リセット時刻が作業スケジュールに合致 +- 日次トークン配分のより良い計画 +- 予測可能なセッションウィンドウ + +#### 🌙 夜型コーダー +**シナリオ**: しばしば深夜過ぎまで作業し、柔軟なリセットスケジューリングが必要。 + +```bash +# 明確な日次境界のため深夜にリセット +claude-monitor --reset-hour 0 + +# 夜遅くのリセット(午後11時) +claude-monitor --reset-hour 23 +``` + +**戦略**: +- リセット時刻周辺で重いコーディングセッションを計画 +- 深夜の作業セッションをまたぐため遅いリセットを使用 +- ピーク時間中のバーンレートを監視 + +#### 🔄 制限が変動するヘビーユーザー +**シナリオ**: トークン制限が変化しているようで、正確なプランが不明。 + +```bash +# 最高の過去使用量を自動検出 +claude-monitor --plan custom + +# カスタムスケジューリングで監視 +claude-monitor --plan custom --reset-hour 6 +``` + +**アプローチ**: +- 自動検出に実際の制限を発見させる +- 1週間監視してパターンを理解 +- 制限が変化またはリセットする時を記録 + +#### 🌍 国際ユーザー +**シナリオ**: 異なるタイムゾーンで作業または旅行中。 + +```bash +# 米国東海岸 +claude-monitor --timezone America/New_York + +# ヨーロッパ +claude-monitor --timezone Europe/London + +# アジア太平洋 +claude-monitor --timezone Asia/Singapore + +# 国際チーム調整のためUTC +claude-monitor --timezone UTC --reset-hour 12 +``` + +#### ⚡ クイックチェック +**シナリオ**: 設定なしで現在の状態を確認したい。 + +```bash +# デフォルトでそのまま実行 +claude-monitor + +# 状態確認後Ctrl+Cを押す +``` + +#### 📊 使用量分析表示 +**シナリオ**: 異なる期間でのトークン使用パターンを分析。 + +```bash +# 詳細統計付き日次使用量内訳を表示 +claude-monitor --view daily + +# 月次トークン消費トレンドを分析 +claude-monitor --view monthly --plan max20 + +# 分析用に日次使用データをログファイルにエクスポート +claude-monitor --view daily --log-file ~/daily-usage.log + +# 異なるタイムゾーンで使用量を確認 +claude-monitor --view daily --timezone America/New_York +``` + +**用途**: +- **リアルタイム**: 現在のセッションとバーンレートのライブ監視 +- **日次**: 日次消費パターンを分析し、ピーク使用日を特定 +- **月次**: 長期トレンド分析と月次予算計画 + +### プラン選択戦略 + +#### プランの選び方 + +#### デフォルトから開始(新規ユーザー推奨) +```bash +# 自動切り替え付きProプラン検出 +claude-monitor +``` + +- Pro制限を超えた場合、監視ツールが検出 +- 必要に応じて自動的にcustom_maxに切り替え +- 切り替え発生時に通知を表示 + +#### 既知のサブスクリプションユーザー +```bash +# Max5を持っていることが分かっている場合 +claude-monitor --plan max5 + +# Max20を持っていることが分かっている場合 +claude-monitor --plan max20 +``` + +#### 不明な制限 +```bash +# 過去の使用量から自動検出 +claude-monitor --plan custom +``` + +### ベストプラクティス + +#### セットアップのベストプラクティス + +1. **セッション早期開始** + +```bash + # Claude作業開始時に監視を開始(uvインストール) + claude-monitor + + # または開発モード + claude-monitor + ``` + +- 開始からの正確なセッション追跡 +- より良いバーンレート計算 +- 制限接近の早期警告 + +2. **モダンインストールを使用(推奨)** + +```bash + # uvでの簡単なインストールと更新 + uv tool install claude-monitor + claude-monitor --plan max5 + ``` + +- クリーンなシステムインストール +- 簡単な更新とメンテナンス +- どこからでも利用可能 + +3. **カスタムシェルエイリアス(レガシーセットアップ)** + +```bash + # ~/.bashrcまたは~/.zshrcに追加(開発セットアップのみ) + alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && claude-monitor' + ``` + +#### 使用のベストプラクティス + +1. **バーンレート速度の監視** + - トークン消費の急激な増加に注意 + - 残り時間に基づいてコーディング強度を調整 + - セッションリセット周辺で大きなリファクタリングを計画 + +2. **戦略的セッション計画** + +```bash + # リセット時刻周辺で重い使用量を計画 + claude-monitor --reset-hour 9 + ``` + +- リセット後に大きなタスクをスケジュール +- 制限に近づいている時は軽いタスクを使用 +- 複数の重複するセッションを活用 + +3. **タイムゾーン認識** + +```bash + # 常に実際のタイムゾーンを使用 + claude-monitor --timezone Asia/Tokyo + ``` + +- 正確なリセット時刻予測 +- 作業スケジュールのより良い計画 +- 正確なセッション期限推定 + +#### 最適化のヒント + +1. **ターミナルセットアップ** + - 少なくとも80文字幅のターミナルを使用 + - より良い視覚的フィードバックのためカラーサポートを有効(COLORTERM環境変数を確認) + - 監視専用のターミナルウィンドウを検討 + - 最高のテーマ体験のためtruecolorサポート付きターミナルを使用 + +2. **ワークフロー統合** + +```bash + # 開発セッションと一緒に監視を開始(uvインストール) + tmux new-session -d -s claude-monitor 'claude-monitor' + + # または開発モード + tmux new-session -d -s claude-monitor 'claude-monitor' + + # いつでも状態を確認 + tmux attach -t claude-monitor + ``` + +3. **マルチセッション戦略** + - セッションは正確に5時間継続することを覚えておく + - 複数の重複するセッションを持てる + - セッション境界をまたいで作業を計画 + +#### 実世界のワークフロー + +#### 大規模プロジェクト開発 +```bash +# 持続的開発のためのセットアップ +claude-monitor --plan max20 --reset-hour 8 --timezone Asia/Tokyo +``` + +#### 日次ルーチン +1. **8:00 AM**: 新しいトークン、主要機能を開始 +2. **10:00 AM**: バーンレートを確認、強度を調整 +3. **12:00 PM**: 午後のセッション計画のため監視 +4. **2:00 PM**: 新しいセッションウィンドウ、複雑な問題に取り組む +5. **4:00 PM**: 軽いタスク、夕方のセッション準備 + +#### 学習と実験 +```bash +# 学習のための柔軟なセットアップ +claude-monitor --plan pro +``` + +#### スプリント開発 +```bash +# 高強度開発セットアップ +claude-monitor --plan max20 --reset-hour 6 +``` + +## 🔧 開発者向けインストール + +ソースコードで作業したい貢献者と開発者向け: + +### クイックスタート(開発/テスト) + +```bash +# リポジトリをクローン +git clone https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor.git +cd Claude-Code-Usage-Monitor + +# 開発モードでインストール +pip install -e . + +# ソースから実行 +python -m claude_monitor +``` + +### v3.0.0テスト機能 + +新バージョンには包括的なテストスイートが含まれています: + +- **100+テストケース**の完全カバレッジ +- すべてのコンポーネントの**ユニットテスト** +- エンドツーエンドワークフローの**統合テスト** +- ベンチマーク付き**パフォーマンステスト** +- 分離されたテストのための**モックオブジェクト** + +```bash +# テストを実行 +cd src/ +python -m pytest + +# カバレッジ付きで実行 +python -m pytest --cov=claude_monitor --cov-report=html + +# 特定のテストモジュールを実行 +python -m pytest tests/test_analysis.py -v +``` + +### 前提条件 + +1. システムに**Python 3.9+**がインストールされている +2. リポジトリクローンのための**Git** + +### 仮想環境セットアップ + +#### なぜ仮想環境を使用するのか? + +仮想環境の使用は**強く推奨**されます。理由: + +- **🛡️ 分離**: システムPythonをクリーンに保ち、依存関係の競合を防ぐ +- **📦 ポータビリティ**: 異なるマシンで正確な環境を簡単に複製 +- **🔄 バージョン管理**: 安定性のため依存関係の特定バージョンをロック +- **🧹 クリーンアンインストール**: すべてを削除するため仮想環境フォルダを単に削除 +- **👥 チーム協業**: 全員が同じPythonとパッケージバージョンを使用 + +#### virtualenvのインストール(必要な場合) + +venvモジュールが利用できない場合: + +```bash +# Ubuntu/Debian +sudo apt-get update +sudo apt-get install python3-venv + +# Fedora/RHEL/CentOS +sudo dnf install python3-venv + +# macOS(通常Pythonに付属) +# 利用できない場合、HomebrewでPythonをインストール: +brew install python3 + +# Windows(通常Pythonに付属) +# 利用できない場合、python.orgからPythonを再インストール +# インストール時に「Add Python to PATH」をチェックしてください +``` + +または、virtualenvパッケージを使用: +```bash +# pipでvirtualenvをインストール +pip install virtualenv + +# 次に以下で仮想環境を作成: +virtualenv venv +# 代わりに: python3 -m venv venv +``` + +#### ステップバイステップセットアップ + +```bash +# 1. リポジトリをクローン +git clone https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor.git +cd Claude-Code-Usage-Monitor + +# 2. 仮想環境を作成 +python3 -m venv venv +# またはvirtualenvパッケージを使用する場合: +# virtualenv venv + +# 3. 仮想環境を有効化 +# Linux/Mac: +source venv/bin/activate +# Windows: +# venv\Scripts\activate + +# 4. Python依存関係をインストール +pip install pytz +pip install rich>=13.0.0 + +# 5. モジュールとして実行 +python -m claude_monitor +``` + +#### 日常使用 + +初期セットアップ後は、以下のみが必要: + +```bash +# プロジェクトディレクトリに移動 +cd Claude-Code-Usage-Monitor + +# 仮想環境を有効化 +source venv/bin/activate # Linux/Mac +# venv\Scripts\activate # Windows + +# 監視ツールを実行 +claude-monitor # Linux/Mac +# python -m claude_monitor # Windows + +# 完了したら、非有効化 +deactivate +``` + +#### プロのヒント: シェルエイリアス + +クイックアクセス用のエイリアスを作成: +```bash +# ~/.bashrcまたは~/.zshrcに追加 +alias claude-monitor='cd ~/Claude-Code-Usage-Monitor && source venv/bin/activate && claude-monitor' + +# そして実行するだけ: +claude-monitor +``` + +## トラブルシューティング + +### インストール時の問題 + +#### "externally-managed-environment"エラー + +最新のLinuxディストリビューション(Ubuntu 23.04+、Debian 12+、Fedora 38+)では、以下のエラーが発生する場合があります: +```text +error: externally-managed-environment +× This environment is externally managed +``` + +**解決策(優先順位順):** + +> **重要**: システムの安定性と安全性のため、uv、pipx、または仮想環境の使用を強く推奨します。`--break-system-packages`オプションの使用は避けてください。 + +1. **uvを使用(推奨)** + +```bash + # 最初にuvをインストール + curl -LsSf https://astral.sh/uv/install.sh | sh + + # そしてuvでインストール + uv tool install claude-monitor + ``` + +2. **pipxを使用(分離された環境)** + +```bash + # pipxをインストール + sudo apt install pipx # Ubuntu/Debian + # または + python3 -m pip install --user pipx + + # PATHを確実に設定 + pipx ensurepath + + # claude-monitorをインストール + pipx install claude-monitor + ``` + +3. **仮想環境を使用** + +```bash + python3 -m venv myenv + source myenv/bin/activate + pip install claude-monitor + ``` + +4. **強制インストール(非推奨・危険)** + +```bash + pip install --user claude-monitor --break-system-packages + ``` + + ⚠️ **重大な警告**: + - この方法はシステム保護をバイパスし、他のPythonパッケージとの競合を引き起こす可能性があります + - システムの安定性に影響を与える可能性があります + - **絶対に推奨しません** - 代わりに上記のuv、pipx、または仮想環境の使用を強く推奨します + +#### pipインストール後にコマンドが見つからない + +pipインストール後にclaude-monitorコマンドが見つからない場合: + +1. **PATHの問題かどうか確認** + +```bash + # pipインストール中の警告メッセージを探す: + # WARNING: The script claude-monitor is installed in '/home/username/.local/bin' which is not on PATH + ``` + +2. **PATHに追加** + +```bash + # ~/.bashrcまたは~/.zshrcに追加 + echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc + + # シェルを再読み込み + source ~/.bashrc # または source ~/.zshrc + ``` + +3. **インストール場所を確認** + +```bash + # pipがスクリプトをどこにインストールしたか確認 + pip show -f claude-monitor | grep claude-monitor + ``` + +4. **Pythonで直接実行** + +```bash + python3 -m claude_monitor + ``` + +#### Pythonバージョンの競合 + +複数のPythonバージョンがある場合: + +1. **Pythonバージョンを確認** + +```bash + python3 --version + pip3 --version + ``` + +2. **特定のPythonバージョンを使用** + +```bash + python3.11 -m pip install claude-monitor + python3.11 -m claude_monitor + ``` + +3. **uvを使用(Pythonバージョンを自動処理)** + +```bash + uv tool install claude-monitor + ``` + +### 実行時の問題 + +#### アクティブなセッションが見つかりません +No active session foundエラーが発生した場合は、以下の手順に従ってください: + +1. **初期テスト**: + Claude Codeを起動し、少なくとも2つのメッセージを送信してください。場合によっては、最初の試行でセッションが正しく初期化されないことがありますが、いくつかのやり取り後に解決されます。 + +2. **設定パス**: + 問題が続く場合は、カスタム設定パスを指定することを検討してください。デフォルトでは、Claude Codeは~/.config/claudeを使用します。環境に応じてこのパスを調整する必要がある場合があります。 + +```bash +CLAUDE_CONFIG_DIR=~/.config/claude claude-monitor +``` + +## 📞 お問い合わせ + +ご質問、提案、またはコラボレーションをお考えですか?お気軽にお問い合わせください! + +**📧 メール**: [maciek@roboblog.eu](mailto:maciek@roboblog.eu) + +セットアップのヘルプが必要、機能リクエスト、バグ発見、または潜在的な改善について議論したい場合は、遠慮なくご連絡ください。Claude Code使用量監視ツールのユーザーからのご連絡をいつでもお待ちしています! + +## 📚 追加ドキュメント + +- **[開発ロードマップ](DEVELOPMENT.md)** - ML機能、PyPIパッケージ、Docker計画 +- **[貢献ガイド](CONTRIBUTING.md)** - 貢献方法、開発ガイドライン +- **[トラブルシューティング](TROUBLESHOOTING.md)** - 一般的な問題と解決策 + +## 📝 ライセンス + +[MITライセンス](LICENSE) - 必要に応じて自由に使用・修正してください。 + +## 🤝 貢献者 + +- [@adawalli](https://github.com/adawalli) +- [@taylorwilsdon](https://github.com/taylorwilsdon) +- [@moneroexamples](https://github.com/moneroexamples) + +貢献したいですか?[貢献ガイド](CONTRIBUTING.md)をご確認ください! + +## 🙏 謝辞 + +### スポンサー + +このプロジェクトを継続させるのに役立つサポーターの皆様に特別な感謝を: + +**Ed** - *Buy Me Coffee サポーター* +> 「あなたの作品を世界と共有することに感謝します。これは私が一日を軌道に乗せるのに役立ちます。質の高いreadmeで、本当に素晴らしいものです!」 + +## Star履歴 + +[![Star History Chart](https://api.star-history.com/svg?repos=Maciek-roboblog/Claude-Code-Usage-Monitor&type=Date)](https://www.star-history.com/#Maciek-roboblog/Claude-Code-Usage-Monitor&Date) + +--- + +
+ +### ⭐ 有用だと思ったらこのリポジトリにスターを付けてください! ⭐ + +[バグ報告](https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/issues) • [機能リクエスト](https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor/issues) • [貢献](CONTRIBUTING.md) + +
diff --git a/USAGE_JP.md b/USAGE_JP.md new file mode 100644 index 0000000..0c705a9 --- /dev/null +++ b/USAGE_JP.md @@ -0,0 +1,277 @@ +# 使用方法ガイド - Claude Code使用量監視ツール + +## 基本的なコマンド + +### インストール後の基本使用 +```bash +# デフォルト設定で起動(自動検出付きCustomプラン) +claude-monitor + +# 短縮コマンド +cmonitor +ccmonitor +ccm +``` + +### プラン指定 +```bash +# Proプラン(約19,000トークン) +claude-monitor --plan pro + +# Max5プラン(約88,000トークン) +claude-monitor --plan max5 + +# Max20プラン(約220,000トークン) +claude-monitor --plan max20 + +# Customプラン(P90自動検出) +claude-monitor --plan custom + +# 明示的なトークン制限付きCustomプラン +claude-monitor --plan custom --custom-limit-tokens 100000 +``` + +### 表示モード +```bash +# リアルタイム監視(デフォルト) +claude-monitor --view realtime + +# 日次使用量表示 +claude-monitor --view daily + +# 月次使用量表示 +claude-monitor --view monthly +``` + +### タイムゾーンと時刻設定 +```bash +# 東京時間を使用 +claude-monitor --timezone Asia/Tokyo + +# 24時間表示を強制 +claude-monitor --time-format 24h + +# 12時間表示を強制 +claude-monitor --time-format 12h + +# 自動検出(デフォルト) +claude-monitor --timezone auto --time-format auto +``` + +### 言語設定 +```bash +# 日本語を強制(デフォルト) +claude-monitor --locale ja + +# 英語を強制 +claude-monitor --locale en + +# システム設定に基づく自動検出 +claude-monitor --locale auto + +# 環境変数で設定 +export CLAUDE_MONITOR_LOCALE=ja +claude-monitor +``` + +### テーマ設定 +```bash +# ダークテーマを強制 +claude-monitor --theme dark + +# ライトテーマを強制 +claude-monitor --theme light + +# クラシックテーマ +claude-monitor --theme classic + +# 自動検出(デフォルト) +claude-monitor --theme auto +``` + +### 更新頻度設定 +```bash +# データ更新頻度を5秒に設定 +claude-monitor --refresh-rate 5 + +# 表示更新頻度を1Hzに設定 +claude-monitor --refresh-per-second 1.0 + +# 低CPU使用量設定 +claude-monitor --refresh-rate 30 --refresh-per-second 0.5 +``` + +### ログ記録 +```bash +# デバッグログを有効 +claude-monitor --debug + +# ファイルにログ出力 +claude-monitor --log-file ~/.claude-monitor/logs/monitor.log + +# ログレベルを設定 +claude-monitor --log-level WARNING +``` + +### リセット時刻設定 +```bash +# 午前9時にリセット(日本の一般的な始業時間) +claude-monitor --reset-hour 9 + +# 深夜0時にリセット +claude-monitor --reset-hour 0 +``` + +## 実践的な使用例 + +### 朝型開発者向け +```bash +# 午前9時開始、東京時間、Proプラン +claude-monitor --plan pro --reset-hour 9 --timezone Asia/Tokyo +``` + +### 夜型開発者向け +```bash +# 深夜リセット、ダークテーマ +claude-monitor --plan max5 --reset-hour 0 --theme dark +``` + +### 高負荷開発プロジェクト +```bash +# Max20プラン、高頻度更新、詳細ログ +claude-monitor --plan max20 --refresh-rate 5 --log-level DEBUG +``` + +### 使用量分析 +```bash +# 日次使用量を詳細ログ付きで確認 +claude-monitor --view daily --log-file ~/usage-analysis.log + +# 月次トレンド分析 +claude-monitor --view monthly --timezone Asia/Tokyo +``` + +### 軽量監視 +```bash +# 低CPU使用量で長時間監視 +claude-monitor --refresh-rate 60 --refresh-per-second 0.1 +``` + +## 設定の保存と管理 + +### 設定の自動保存 +- 以下の設定は自動的に保存され、次回起動時に復元されます: + - `--view` (表示モード) + - `--theme` (テーマ) + - `--timezone` (タイムゾーン) + - `--time-format` (時刻形式) + - `--refresh-rate` (更新頻度) + - `--reset-hour` (リセット時刻) + - `--custom-limit-tokens` (カスタムトークン制限) + +### 設定のクリア +```bash +# 保存された設定をすべてクリア +claude-monitor --clear +``` + +### 設定ファイル場所 +``` +~/.claude-monitor/last_used.json +``` + +## トラブルシューティング + +### よくある問題 + +#### "アクティブなセッションが見つかりません" +```bash +# Claude Codeで2-3回メッセージを送信してから再試行 +claude-monitor --debug +``` + +#### 文字化けが発生する場合 +```bash +# UTF-8エンコーディングを確認 +export LANG=ja_JP.UTF-8 +claude-monitor +``` + +#### ターミナルが狭すぎる場合 +- 最低80文字幅のターミナルを使用してください +- より良い表示のため100文字以上を推奨 + +### ヘルプとバージョン情報 +```bash +# ヘルプを表示 +claude-monitor --help + +# バージョン情報を表示 +claude-monitor --version +claude-monitor -v +``` + +## 高度な使用方法 + +### tmuxとの組み合わせ +```bash +# バックグラウンドで監視を開始 +tmux new-session -d -s claude-monitor 'claude-monitor --plan max20' + +# 監視画面にアタッチ +tmux attach -t claude-monitor + +# 監視セッションを終了 +tmux kill-session -t claude-monitor +``` + +### 複数プロジェクトの監視 +```bash +# プロジェクトAの監視 +tmux new-session -d -s project-a 'claude-monitor --plan pro --log-file ~/project-a.log' + +# プロジェクトBの監視 +tmux new-session -d -s project-b 'claude-monitor --plan max5 --log-file ~/project-b.log' +``` + +### 自動化スクリプト +```bash +#!/bin/bash +# start-claude-monitor.sh + +# 時間帯に応じて設定を変更 +HOUR=$(date +%H) + +if [ $HOUR -lt 12 ]; then + # 午前中: 軽めの設定 + claude-monitor --plan pro --refresh-rate 15 +elif [ $HOUR -lt 18 ]; then + # 午後: 標準設定 + claude-monitor --plan max5 --refresh-rate 10 +else + # 夜間: 高頻度監視 + claude-monitor --plan max20 --refresh-rate 5 +fi +``` + +## パフォーマンス最適化 + +### CPU使用量を削減 +```bash +# 低頻度更新 +claude-monitor --refresh-rate 30 --refresh-per-second 0.25 +``` + +### メモリ使用量を削減 +```bash +# ログを無効化 +claude-monitor --log-level ERROR +``` + +### ネットワーク負荷を削減 +```bash +# 更新頻度を下げる +claude-monitor --refresh-rate 60 +``` + +このガイドを参考に、あなたの開発スタイルに最適な設定を見つけてください! diff --git a/src/claude_monitor/cli/bootstrap.py b/src/claude_monitor/cli/bootstrap.py index 2b7aecb..8447a44 100644 --- a/src/claude_monitor/cli/bootstrap.py +++ b/src/claude_monitor/cli/bootstrap.py @@ -50,9 +50,19 @@ def setup_environment() -> None: os.environ.setdefault( "CLAUDE_MONITOR_CACHE_DIR", str(Path.home() / ".claude-monitor" / "cache") ) - - -def init_timezone(timezone: str = "Europe/Warsaw") -> TimezoneHandler: + + # Setup default locale with improved detection + import locale as pylocale + # Respect explicit user override first + if "CLAUDE_MONITOR_LOCALE" not in os.environ: + sys_loc = (pylocale.getlocale()[0] or os.environ.get("LANG", "") or "").lower() + os.environ.setdefault( + "CLAUDE_MONITOR_LOCALE", + "ja" if sys_loc.startswith("ja") else "en", + ) + + +def init_timezone(timezone: str = "Asia/Tokyo") -> TimezoneHandler: """Initialize timezone handler. Args: @@ -62,7 +72,7 @@ def init_timezone(timezone: str = "Europe/Warsaw") -> TimezoneHandler: Configured TimezoneHandler instance """ tz_handler = TimezoneHandler() - if timezone != "Europe/Warsaw": + if timezone != "Asia/Tokyo": tz_handler.set_timezone(timezone) return tz_handler diff --git a/src/claude_monitor/core/settings.py b/src/claude_monitor/core/settings.py index 14aec1b..0e4f12e 100644 --- a/src/claude_monitor/core/settings.py +++ b/src/claude_monitor/core/settings.py @@ -34,6 +34,7 @@ def save(self, settings: "Settings") -> None: "refresh_rate": settings.refresh_rate, "reset_hour": settings.reset_hour, "view": settings.view, + "locale": settings.locale, "timestamp": datetime.now().isoformat(), } @@ -43,7 +44,7 @@ def save(self, settings: "Settings") -> None: self.config_dir.mkdir(parents=True, exist_ok=True) temp_file = self.params_file.with_suffix(".tmp") - with open(temp_file, "w") as f: + with open(temp_file, "w", encoding="utf-8") as f: json.dump(params, f, indent=2) temp_file.replace(self.params_file) @@ -125,7 +126,12 @@ def _get_system_time_format() -> str: timezone: str = Field( default="auto", - description="Timezone for display (auto-detected from system). Examples: UTC, America/New_York, Europe/London, Europe/Warsaw, Asia/Tokyo, Australia/Sydney", + description="Timezone for display. Use 'auto' to detect from system or 'local' to use OS local time. Examples: UTC, America/New_York, Europe/London, Asia/Tokyo, Australia/Sydney", + ) + + locale: Literal["auto", "en", "ja"] = Field( + default="auto", + description="Language locale (auto, en=English, ja=Japanese). Auto-detects based on system locale", ) time_format: str = Field( @@ -212,6 +218,20 @@ def validate_theme(cls, v: Any) -> str: ) return v + @field_validator("locale", mode="before") + @classmethod + def validate_locale(cls, v: Any) -> str: + """Validate and normalize locale value.""" + if isinstance(v, str): + v_lower = v.lower() + valid_locales = ["auto", "en", "ja"] + if v_lower in valid_locales: + return v_lower + raise ValueError( + f"Invalid locale: {v}. Must be one of: {', '.join(valid_locales)}" + ) + return v + @field_validator("timezone") @classmethod def validate_timezone(cls, v: str) -> str: @@ -269,6 +289,22 @@ def load_with_last_used(cls, argv: Optional[List[str]] = None) -> "Settings": clear_config = argv and "--clear" in argv + # Initialize cli_provided_fields early to avoid NameError + cli_provided_fields = set() + if argv: + for _i, arg in enumerate(argv): + if not arg.startswith("--"): + continue + key = arg[2:] # drop leading -- + if "=" in key: + key = key.split("=", 1)[0] # support --flag=value + field_name = key.replace("-", "_") + # Handle negated boolean flags (--no-flag -> flag) + if field_name.startswith("no_"): + field_name = field_name[3:] # strip "no_" prefix + if field_name in cls.model_fields: + cli_provided_fields.add(field_name) + if clear_config: last_used = LastUsedParams() last_used.clear() @@ -279,14 +315,6 @@ def load_with_last_used(cls, argv: Optional[List[str]] = None) -> "Settings": settings = cls(_cli_parse_args=argv) - cli_provided_fields = set() - if argv: - for _i, arg in enumerate(argv): - if arg.startswith("--"): - field_name = arg[2:].replace("-", "_") - if field_name in cls.model_fields: - cli_provided_fields.add(field_name) - for key, value in last_params.items(): if key == "plan": continue @@ -328,6 +356,20 @@ def load_with_last_used(cls, argv: Optional[List[str]] = None) -> "Settings": else: settings.theme = "auto" + # Apply locale setting to i18n system + from claude_monitor.i18n import set_locale + import os + + env_locale = os.getenv("CLAUDE_MONITOR_LOCALE") + # CLI > env > last-used/default + if env_locale and env_locale.strip() and ("locale" not in cli_provided_fields): + # Allow broader formats like 'ja_JP'/'en-US' here; i18n.set_locale normalizes. + set_locale(env_locale) + logger.debug(f"Applied locale from env: {env_locale}") + else: + set_locale(settings.locale) + logger.debug(f"Applied locale from settings: {settings.locale}") + if not clear_config: last_used = LastUsedParams() last_used.save(settings) @@ -347,6 +389,7 @@ def to_namespace(self) -> argparse.Namespace: args.reset_hour = self.reset_hour args.custom_limit_tokens = self.custom_limit_tokens args.time_format = self.time_format + args.locale = self.locale args.log_level = self.log_level args.log_file = str(self.log_file) if self.log_file else None args.version = self.version diff --git a/src/claude_monitor/i18n/__init__.py b/src/claude_monitor/i18n/__init__.py new file mode 100644 index 0000000..460f0ef --- /dev/null +++ b/src/claude_monitor/i18n/__init__.py @@ -0,0 +1,5 @@ +"""Internationalization support for Claude Monitor.""" + +from .messages import get_message, set_locale, get_current_locale + +__all__ = ["get_message", "set_locale", "get_current_locale"] diff --git a/src/claude_monitor/i18n/messages.py b/src/claude_monitor/i18n/messages.py new file mode 100644 index 0000000..df3db7d --- /dev/null +++ b/src/claude_monitor/i18n/messages.py @@ -0,0 +1,235 @@ +"""Message localization system for Claude Monitor. + +This module provides a simple message localization system that supports +English and Japanese languages. +""" + +import os +import locale +from typing import Dict, Any + +# Determine current locale with env/system detection; fallback to English +def _normalize_locale(value: str) -> str: + v = (value or "").lower().replace("_", "-") + if v.startswith("ja"): + return "ja" + if v.startswith("en"): + return "en" + return "en" + +def _detect_default_locale() -> str: + # Explicit env override + env = os.environ.get("CLAUDE_MONITOR_LOCALE") + if env: + return _normalize_locale(env) + # Common POSIX locale envs + for var in ("LC_ALL", "LC_MESSAGES", "LANG"): + v = os.environ.get(var) + if v: + return _normalize_locale(v) + # Fallback to system default + try: + loc = locale.getdefaultlocale()[0] or "" + except Exception: + loc = "" + return _normalize_locale(loc) + +_current_locale = _detect_default_locale() + +# Message translations +MESSAGES = { + "en": { + # Error messages + "error.failed_to_get_data": "Failed to get usage data", + "error.possible_causes": "Possible causes:", + "error.not_logged_in": "You're not logged into Claude", + "error.network_issues": "Network connection issues", + "error.retrying": "Retrying in 3 seconds... (Ctrl+C to exit)", + + # Loading messages + "loading.title": "⏳ Loading...", + "loading.fetching_data": "Fetching Claude usage data...", + "loading.calculating_limits": "Calculating your P90 session limits from usage history...", + "loading.please_wait": "This may take a few seconds", + + # Session messages + "session.no_active_session": "No active session found", + "session.monitoring_stopped": "Monitoring stopped.", + "session.tokens_used": "Tokens Used", + "session.burn_rate": "Burn Rate", + "session.cost": "Cost", + "session.time_remaining": "Time Remaining", + "session.session_progress": "Session Progress", + + # Plan messages + "plan.custom": "Custom", + "plan.pro": "Pro", + "plan.max5": "Max5", + "plan.max20": "Max20", + + # Notification messages + "notification.switching_to_custom": "Switching to custom plan due to higher usage detected", + "notification.approaching_limit": "Approaching token limit", + "notification.cost_warning": "Cost approaching limit", + + # UI messages + "ui.title": "CLAUDE CODE USAGE MONITOR", + "ui.session_based_limits": "📊 Session-Based Dynamic Limits", + "ui.session_based_limits_desc": "Based on your historical usage patterns when hitting limits (P90)", + "ui.cost_usage": "💰 Cost Usage:", + "ui.token_usage": "📊 Token Usage:", + "ui.messages_usage": "📨 Messages Usage:", + "ui.time_to_reset": "⏱️ Time to Reset:", + "ui.model_distribution": "🤖 Model Distribution:", + "ui.burn_rate": "🔥 Burn Rate:", + "ui.cost_rate": "💲 Cost Rate:", + "ui.predictions": "🔮 Predictions:", + "ui.tokens_will_run_out": "Tokens will run out:", + "ui.limit_resets_at": "Limit resets at:", + "ui.active_session": "Active session", + "ui.no_active_session": "No active session", + "ui.ctrl_c_to_exit": "Ctrl+C to exit", + "ui.token_limit_exceeded": "Token limit exceeded", + "ui.max_cost_limit_exceeded": "You have exceeded the maximum cost limit!", + "ui.cost_limit_will_exceed": "Cost limit will be exceeded before reset!", + "ui.tokens_per_minute": "tokens/min", + "ui.dollars_per_minute": "$/min", + "ui.messages": "messages", + "ui.tokens": "tokens", + "ui.tokens_label": "Tokens:", + "ui.burn_rate_label": "Burn Rate:", + "ui.cost_rate_label": "Cost Rate:", + "ui.sent_messages_label": "Sent Messages:", + "ui.token_usage_label": "Token Usage:", + "ui.session_cost_label": "Session Cost:", + "ui.model_usage_label": "Model Usage:", + "ui.time_to_reset_label": "Time to Reset:", + "ui.left": "left", + + # Help messages + "help.timezone_examples": "Examples: UTC, America/New_York, Europe/London, Asia/Tokyo", + "help.refresh_rate": "Refresh rate in seconds (1-60)", + "help.theme_options": "Theme options: light, dark, classic, auto", + }, + "ja": { + # エラーメッセージ + "error.failed_to_get_data": "使用データの取得に失敗しました", + "error.possible_causes": "考えられる原因:", + "error.not_logged_in": "Claudeにログインしていません", + "error.network_issues": "ネットワーク接続の問題", + "error.retrying": "3秒後に再試行します... (Ctrl+Cで終了)", + + # ローディングメッセージ + "loading.title": "⏳ 読み込み中...", + "loading.fetching_data": "Claude使用データを取得中...", + "loading.calculating_limits": "使用履歴からP90セッション制限を計算中...", + "loading.please_wait": "しばらくお待ちください", + + # セッションメッセージ + "session.no_active_session": "アクティブなセッションが見つかりません", + "session.monitoring_stopped": "監視を停止しました。", + "session.tokens_used": "使用トークン数", + "session.burn_rate": "消費レート", + "session.cost": "コスト", + "session.time_remaining": "残り時間", + "session.session_progress": "セッション進行状況", + + # プランメッセージ + "plan.custom": "カスタム", + "plan.pro": "Pro", + "plan.max5": "Max5", + "plan.max20": "Max20", + + # 通知メッセージ + "notification.switching_to_custom": "より高い使用量が検出されたため、カスタムプランに切り替えます", + "notification.approaching_limit": "トークン制限に近づいています", + "notification.cost_warning": "コストが制限に近づいています", + + # UIメッセージ + "ui.title": "🎯 Claude Code使用量監視ツール", + "ui.session_based_limits": "📊 セッションベース動的制限", + "ui.session_based_limits_desc": "制限に達した際の履歴使用パターンに基づく(P90)", + "ui.cost_usage": "💰 コスト使用量:", + "ui.token_usage": "📊 トークン使用量:", + "ui.messages_usage": "📨 メッセージ使用量:", + "ui.time_to_reset": "⏱️ リセットまでの時間:", + "ui.model_distribution": "🤖 モデル分布:", + "ui.burn_rate": "🔥 消費レート:", + "ui.cost_rate": "💲 コストレート:", + "ui.predictions": "🔮 予測:", + "ui.tokens_will_run_out": "トークンが不足する時刻:", + "ui.limit_resets_at": "制限リセット時刻:", + "ui.active_session": "アクティブセッション", + "ui.no_active_session": "アクティブセッションなし", + "ui.ctrl_c_to_exit": "Ctrl+Cで終了", + "ui.token_limit_exceeded": "トークン制限を超過しました", + "ui.max_cost_limit_exceeded": "最大コスト制限を超過しました!", + "ui.cost_limit_will_exceed": "リセット前にコスト制限を超過する見込みです!", + "ui.tokens_per_minute": "トークン/分", + "ui.dollars_per_minute": "$/分", + "ui.messages": "メッセージ", + "ui.tokens": "トークン", + "ui.tokens_label": "トークン:", + "ui.burn_rate_label": "消費レート:", + "ui.cost_rate_label": "コストレート:", + "ui.sent_messages_label": "送信メッセージ:", + "ui.token_usage_label": "トークン使用量:", + "ui.session_cost_label": "セッションコスト:", + "ui.model_usage_label": "モデル使用量:", + "ui.time_to_reset_label": "リセットまでの時間:", + "ui.left": "残り", + + # ヘルプメッセージ + "help.timezone_examples": "例: UTC, America/New_York, Europe/London, Asia/Tokyo", + "help.refresh_rate": "更新頻度(秒)(1-60)", + "help.theme_options": "テーマオプション: light, dark, classic, auto", + } +} + + +def set_locale(locale: str) -> None: + """Set the current locale. + + Args: + locale: Locale code ('en', 'ja', or 'auto'; also accepts variants like 'ja_JP'/'en-US') + """ + global _current_locale + if locale and locale.lower() == "auto": + _current_locale = _detect_default_locale() + return + normalized = _normalize_locale(locale) + _current_locale = normalized if normalized in MESSAGES else "en" # fallback to English + + +def get_current_locale() -> str: + """Get the current locale. + + Returns: + Current locale code + """ + return _current_locale + + +def get_message(key: str, **kwargs: Any) -> str: + """Get a localized message. + + Args: + key: Message key in dot notation (e.g., 'error.failed_to_get_data') + **kwargs: Format arguments for the message + + Returns: + Localized message string + """ + messages = MESSAGES.get(_current_locale, MESSAGES["en"]) + message = messages.get(key) + if message is None: + # Fallback to English if the key is missing in the active locale + message = MESSAGES["en"].get(key, key) + + if kwargs and isinstance(message, str): + try: + return message.format(**kwargs) + except (KeyError, ValueError): + return message + + return message diff --git a/src/claude_monitor/terminal/manager.py b/src/claude_monitor/terminal/manager.py index e84cb13..672b611 100644 --- a/src/claude_monitor/terminal/manager.py +++ b/src/claude_monitor/terminal/manager.py @@ -68,7 +68,7 @@ def enter_alternate_screen() -> None: def handle_cleanup_and_exit( - old_terminal_settings: Optional[List[Any]], message: str = "Monitoring stopped." + old_terminal_settings: Optional[List[Any]], message: Optional[str] = None ) -> None: """Handle cleanup and exit gracefully. @@ -77,6 +77,9 @@ def handle_cleanup_and_exit( message: Exit message to display to user. """ restore_terminal(old_terminal_settings) + if message is None: + from claude_monitor.i18n import get_message + message = get_message('session.monitoring_stopped') print_themed(f"\n\n{message}", style="info") sys.exit(0) diff --git a/src/claude_monitor/ui/components.py b/src/claude_monitor/ui/components.py index be6a49b..131381a 100644 --- a/src/claude_monitor/ui/components.py +++ b/src/claude_monitor/ui/components.py @@ -100,13 +100,15 @@ def format_error_screen( header_manager = HeaderManager() screen_buffer.extend(header_manager.create_header(plan, timezone)) - screen_buffer.append("[error]Failed to get usage data[/]") + from claude_monitor.i18n import get_message + + screen_buffer.append(f"[error]{get_message('error.failed_to_get_data')}[/]") screen_buffer.append("") - screen_buffer.append("[warning]Possible causes:[/]") - screen_buffer.append(" • You're not logged into Claude") - screen_buffer.append(" • Network connection issues") + screen_buffer.append(f"[warning]{get_message('error.possible_causes')}[/]") + screen_buffer.append(f" • {get_message('error.not_logged_in')}") + screen_buffer.append(f" • {get_message('error.network_issues')}") screen_buffer.append("") - screen_buffer.append("[dim]Retrying in 3 seconds... (Ctrl+C to exit)[/]") + screen_buffer.append(f"[dim]{get_message('error.retrying')}[/]") return screen_buffer @@ -137,24 +139,26 @@ def create_loading_screen( header_manager = HeaderManager() screen_buffer.extend(header_manager.create_header(plan, timezone)) + from claude_monitor.i18n import get_message + screen_buffer.append("") - screen_buffer.append("[info]⏳ Loading...[/]") + screen_buffer.append(f"[info]{get_message('loading.title')}[/]") screen_buffer.append("") if custom_message: screen_buffer.append(f"[warning]{custom_message}[/]") else: - screen_buffer.append("[warning]Fetching Claude usage data...[/]") + screen_buffer.append(f"[warning]{get_message('loading.fetching_data')}[/]") screen_buffer.append("") if plan == "custom" and not custom_message: screen_buffer.append( - "[info]Calculating your P90 session limits from usage history...[/]" + f"[info]{get_message('loading.calculating_limits')}[/]" ) screen_buffer.append("") - screen_buffer.append("[dim]This may take a few seconds[/]") + screen_buffer.append(f"[dim]{get_message('loading.please_wait')}[/]") return screen_buffer diff --git a/src/claude_monitor/ui/layouts.py b/src/claude_monitor/ui/layouts.py index f234897..37a95da 100644 --- a/src/claude_monitor/ui/layouts.py +++ b/src/claude_monitor/ui/layouts.py @@ -9,6 +9,8 @@ from typing import Final, Sequence +from claude_monitor.i18n.messages import get_message + class HeaderManager: """Manager for header layout and formatting.""" @@ -36,7 +38,7 @@ def create_header( List of formatted header lines """ sparkles: str = self.DEFAULT_SPARKLES - title: str = "CLAUDE CODE USAGE MONITOR" + title: str = get_message("ui.title") separator: str = self.separator_char * self.separator_length return [ diff --git a/src/claude_monitor/ui/session_display.py b/src/claude_monitor/ui/session_display.py index 1ebc077..9f7a628 100644 --- a/src/claude_monitor/ui/session_display.py +++ b/src/claude_monitor/ui/session_display.py @@ -9,6 +9,7 @@ import pytz +from claude_monitor.i18n.messages import get_message from claude_monitor.ui.components import CostIndicator, VelocityIndicator from claude_monitor.ui.layouts import HeaderManager from claude_monitor.ui.progress_bars import ( @@ -193,9 +194,9 @@ def format_active_session_screen( screen_buffer.append("") if plan == "custom": - screen_buffer.append("[bold]📊 Session-Based Dynamic Limits[/bold]") + screen_buffer.append(f"[bold]{get_message('ui.session_based_limits')}[/bold]") screen_buffer.append( - "[dim]Based on your historical usage patterns when hitting limits (P90)[/dim]" + f"[dim]{get_message('ui.session_based_limits_desc')}[/dim]" ) screen_buffer.append(f"[separator]{'─' * 60}[/]") else: @@ -208,13 +209,13 @@ def format_active_session_screen( ) cost_bar = self._render_wide_progress_bar(cost_percentage) screen_buffer.append( - f"💰 [value]Cost Usage:[/] {cost_bar} {cost_percentage:4.1f}% [value]${session_cost:.2f}[/] / [dim]${cost_limit_p90:.2f}[/]" + f"{get_message('ui.cost_usage')} {cost_bar} {cost_percentage:4.1f}% [value]${session_cost:.2f}[/] / [dim]${cost_limit_p90:.2f}[/]" ) screen_buffer.append("") token_bar = self._render_wide_progress_bar(usage_percentage) screen_buffer.append( - f"📊 [value]Token Usage:[/] {token_bar} {usage_percentage:4.1f}% [value]{tokens_used:,}[/] / [dim]{token_limit:,}[/]" + f"{get_message('ui.token_usage')} {token_bar} {usage_percentage:4.1f}% [value]{tokens_used:,}[/] / [dim]{token_limit:,}[/]" ) screen_buffer.append("") @@ -225,7 +226,7 @@ def format_active_session_screen( ) messages_bar = self._render_wide_progress_bar(messages_percentage) screen_buffer.append( - f"📨 [value]Messages Usage:[/] {messages_bar} {messages_percentage:4.1f}% [value]{sent_messages}[/] / [dim]{messages_limit_p90:,}[/]" + f"{get_message('ui.messages_usage')} {messages_bar} {messages_percentage:4.1f}% [value]{sent_messages}[/] / [dim]{messages_limit_p90:,}[/]" ) screen_buffer.append(f"[separator]{'─' * 60}[/]") @@ -239,21 +240,21 @@ def format_active_session_screen( time_left_hours = int(time_remaining // 60) time_left_mins = int(time_remaining % 60) screen_buffer.append( - f"⏱️ [value]Time to Reset:[/] {time_bar} {time_left_hours}h {time_left_mins}m" + f"{get_message('ui.time_to_reset')} {time_bar} {time_left_hours}h {time_left_mins}m" ) screen_buffer.append("") if per_model_stats: model_bar = self.model_usage.render(per_model_stats) - screen_buffer.append(f"🤖 [value]Model Distribution:[/] {model_bar}") + screen_buffer.append(f"{get_message('ui.model_distribution')} {model_bar}") else: model_bar = self.model_usage.render({}) - screen_buffer.append(f"🤖 [value]Model Distribution:[/] {model_bar}") + screen_buffer.append(f"{get_message('ui.model_distribution')} {model_bar}") screen_buffer.append(f"[separator]{'─' * 60}[/]") velocity_emoji = VelocityIndicator.get_velocity_emoji(burn_rate) screen_buffer.append( - f"🔥 [value]Burn Rate:[/] [warning]{burn_rate:.1f}[/] [dim]tokens/min[/] {velocity_emoji}" + f"{get_message('ui.burn_rate')} [warning]{burn_rate:.1f}[/] [dim]{get_message('ui.tokens_per_minute')}[/] {velocity_emoji}" ) cost_per_min = ( @@ -263,7 +264,7 @@ def format_active_session_screen( ) cost_per_min_display = CostIndicator.render(cost_per_min) screen_buffer.append( - f"💲 [value]Cost Rate:[/] {cost_per_min_display} [dim]$/min[/]" + f"{get_message('ui.cost_rate')} {cost_per_min_display} [dim]{get_message('ui.dollars_per_minute')}[/]" ) else: cost_display = CostIndicator.render(session_cost) @@ -273,48 +274,48 @@ def format_active_session_screen( else 0 ) cost_per_min_display = CostIndicator.render(cost_per_min) - screen_buffer.append(f"💲 [value]Session Cost:[/] {cost_display}") + screen_buffer.append(f"💲 [value]{get_message('ui.session_cost_label')}[/] {cost_display}") screen_buffer.append( - f"💲 [value]Cost Rate:[/] {cost_per_min_display} [dim]$/min[/]" + f"💲 [value]{get_message('ui.cost_rate_label')}[/] {cost_per_min_display} [dim]{get_message('ui.dollars_per_minute')}[/]" ) screen_buffer.append("") token_bar = self.token_progress.render(usage_percentage) - screen_buffer.append(f"📊 [value]Token Usage:[/] {token_bar}") + screen_buffer.append(f"📊 [value]{get_message('ui.token_usage_label')}[/] {token_bar}") screen_buffer.append("") screen_buffer.append( - f"🎯 [value]Tokens:[/] [value]{tokens_used:,}[/] / [dim]~{token_limit:,}[/] ([info]{tokens_left:,} left[/])" + f"🎯 [value]{get_message('ui.tokens_label')}[/] [value]{tokens_used:,}[/] / [dim]~{token_limit:,}[/] ([info]{tokens_left:,} {get_message('ui.tokens')} {get_message('ui.left')}[/])" ) velocity_emoji = VelocityIndicator.get_velocity_emoji(burn_rate) screen_buffer.append( - f"🔥 [value]Burn Rate:[/] [warning]{burn_rate:.1f}[/] [dim]tokens/min[/] {velocity_emoji}" + f"🔥 [value]{get_message('ui.burn_rate_label')}[/] [warning]{burn_rate:.1f}[/] [dim]{get_message('ui.tokens_per_minute')}[/] {velocity_emoji}" ) screen_buffer.append( - f"📨 [value]Sent Messages:[/] [info]{sent_messages}[/] [dim]messages[/]" + f"📨 [value]{get_message('ui.sent_messages_label')}[/] [info]{sent_messages}[/] [dim]{get_message('ui.messages')}[/]" ) if per_model_stats: model_bar = self.model_usage.render(per_model_stats) - screen_buffer.append(f"🤖 [value]Model Usage:[/] {model_bar}") + screen_buffer.append(f"🤖 [value]{get_message('ui.model_usage_label')}[/] {model_bar}") screen_buffer.append("") time_bar = self.time_progress.render( elapsed_session_minutes, total_session_minutes ) - screen_buffer.append(f"⏱️ [value]Time to Reset:[/] {time_bar}") + screen_buffer.append(f"⏱️ [value]{get_message('ui.time_to_reset_label')}[/] {time_bar}") screen_buffer.append("") screen_buffer.append("") - screen_buffer.append("🔮 [value]Predictions:[/]") + screen_buffer.append(f"{get_message('ui.predictions')}") screen_buffer.append( - f" [info]Tokens will run out:[/] [warning]{predicted_end_str}[/]" + f" {get_message('ui.tokens_will_run_out')} [warning]{predicted_end_str}[/]" ) screen_buffer.append( - f" [info]Limit resets at:[/] [success]{reset_time_str}[/]" + f" {get_message('ui.limit_resets_at')} [success]{reset_time_str}[/]" ) screen_buffer.append("") @@ -328,7 +329,7 @@ def format_active_session_screen( ) screen_buffer.append( - f"⏰ [dim]{current_time_str}[/] 📝 [success]Active session[/] | [dim]Ctrl+C to exit[/] 🟢" + f"⏰ [dim]{current_time_str}[/] 📝 [success]{get_message('ui.active_session')}[/] | [dim]{get_message('ui.ctrl_c_to_exit')}[/] 🟢" ) return screen_buffer @@ -356,19 +357,19 @@ def _add_notifications( if show_switch_notification and token_limit > original_limit: screen_buffer.append( - f"🔄 [warning]Token limit exceeded ({token_limit:,} tokens)[/]" + f"🔄 [warning]{get_message('ui.token_limit_exceeded')} ({token_limit:,} {get_message('ui.tokens')})[/]" ) notifications_added = True if show_exceed_notification: screen_buffer.append( - "⚠️ [error]You have exceeded the maximum cost limit![/]" + f"⚠️ [error]{get_message('ui.max_cost_limit_exceeded')}[/]" ) notifications_added = True if show_tokens_will_run_out: screen_buffer.append( - "⏰ [warning]Cost limit will be exceeded before reset![/]" + f"⏰ [warning]{get_message('ui.cost_limit_will_exceed')}[/]" ) notifications_added = True @@ -402,19 +403,19 @@ def format_no_active_session_screen( screen_buffer.extend(header_manager.create_header(plan, timezone)) empty_token_bar = self.token_progress.render(0.0) - screen_buffer.append(f"📊 [value]Token Usage:[/] {empty_token_bar}") + screen_buffer.append(f"📊 [value]{get_message('ui.token_usage_label')}[/] {empty_token_bar}") screen_buffer.append("") screen_buffer.append( - f"🎯 [value]Tokens:[/] [value]0[/] / [dim]~{token_limit:,}[/] ([info]0 left[/])" + f"🎯 [value]{get_message('ui.tokens_label')}[/] [value]0[/] / [dim]~{token_limit:,}[/] ([info]0 {get_message('ui.left')}[/])" ) screen_buffer.append( - "🔥 [value]Burn Rate:[/] [warning]0.0[/] [dim]tokens/min[/]" + f"🔥 [value]{get_message('ui.burn_rate_label')}[/] [warning]0.0[/] [dim]{get_message('ui.tokens_per_minute')}[/]" ) screen_buffer.append( - "💲 [value]Cost Rate:[/] [cost.low]$0.00[/] [dim]$/min[/]" + f"💲 [value]{get_message('ui.cost_rate_label')}[/] [cost.low]$0.00[/] [dim]{get_message('ui.dollars_per_minute')}[/]" ) - screen_buffer.append("📨 [value]Sent Messages:[/] [info]0[/] [dim]messages[/]") + screen_buffer.append(f"📨 [value]{get_message('ui.sent_messages_label')}[/] [info]0[/] [dim]{get_message('ui.messages')}[/]") screen_buffer.append("") if current_time and args: @@ -427,15 +428,15 @@ def format_no_active_session_screen( include_seconds=True, ) screen_buffer.append( - f"⏰ [dim]{current_time_str}[/] 📝 [info]No active session[/] | [dim]Ctrl+C to exit[/] 🟨" + f"⏰ [dim]{current_time_str}[/] 📝 [info]{get_message('ui.no_active_session')}[/] | [dim]{get_message('ui.ctrl_c_to_exit')}[/] 🟨" ) except (pytz.exceptions.UnknownTimeZoneError, AttributeError): screen_buffer.append( - "⏰ [dim]--:--:--[/] 📝 [info]No active session[/] | [dim]Ctrl+C to exit[/] 🟨" + f"⏰ [dim]--:--:--[/] 📝 [info]{get_message('ui.no_active_session')}[/] | [dim]{get_message('ui.ctrl_c_to_exit')}[/] 🟨" ) else: screen_buffer.append( - "⏰ [dim]--:--:--[/] 📝 [info]No active session[/] | [dim]Ctrl+C to exit[/] 🟨" + f"⏰ [dim]--:--:--[/] 📝 [info]{get_message('ui.no_active_session')}[/] | [dim]{get_message('ui.ctrl_c_to_exit')}[/] 🟨" ) return screen_buffer