【ai-usage-menubar】
メニューバーの残量を
計測するツールのフォーク

  • GitHubで公開されているmacOSのメニューバーアプリをcloneして、自分の使い方に合わせて作り替えました。元のアプリは「いまの残量」を出すところまで完成していました。
  • 表示していたのは5時間で戻る短期の枠でした。先に尽きるのは週間枠のほうなので、参照先を入れ替えています。
  • Claude側の数字は、こちらがメッセージを送ったときしか更新されない仕組みでした。開いたら3日前の値が出ていました。
  • 残量の推移を、6時間ごと28本の棒グラフにしました。手本はiPhoneの「電力使用状況」です。

関連記事

1. 使い切るのは5時間枠ではなく週間枠だった

最近、CodexとClaude Codeの利用率をメニューバーに出すアプリを使っています。
GitHubで見つけた ai-usage-menubar というMITライセンスのアプリを、8月25日にcloneしました1
Objective-CとAppKitだけで書かれていて、make build と打つとCodex版とClaude版が別々の .app として出てきます。

数日そのまま使って、最初に引っかかったのが数字の選び方でした。
Codex版はメニューバーに Codex 61% のように数字を1つだけ出します2
これは5時間で戻る短期の枠の数字でした3

では、実際に手が止まるのはどちらの枠か。
週間枠です。
5時間枠は昼ごはんを挟めば戻ってきますが、週間枠を使い切ると次のリセットまで数日あります4
メニューバーの数値、状態を表す色、VoiceOverの読み上げ文言を、まとめて週間枠のほうへ向け直しました。
「残量で表示」という共通設定はそのまま残してあるので、オンなら週間残量、オフなら週間使用率が出ます。

週間枠の値が取れなかったときに、5時間枠の値で穴埋めはしません。
そこは --% と出します。
0%まで使い切ったのか、単に取れていないのか。数字が出ているのに意味が違うのが、一番困るからです。

2. statusLineは、こちらが話しかけたときしか動かない

2.1. ログを読むだけで済むほうと、読むものがないほう

そもそも、この2つのアプリは数字をどこから取っているのか。
Codex側は簡単で、~/.codex/sessions の下に溜まっていくJSONLから token_count のイベントを読むだけです5
表示のための通信はしていません。

Claude側にはそういうログがありません。
代わりに使っていたのがstatusLineでした6
Claude Codeがプロンプトの下に出す1行は、外部コマンドに任せられます。そのコマンドには、利用率を含むJSONが渡ってきます。

インストーラは ~/.claude/settings.json のstatusLineを差し替えて、渡ってきたJSONを横取りしてキャッシュへ書き出します。
もともとstatusLineを設定していた人のために、元の内容はバックアップしてあって、スクリプト1本で戻せるようになっていました。
表示のためにわざわざ問い合わせるのではなく、すでに流れている情報の脇に受け皿を置く。うまいこと考えるものです。

2.2. 3日前の値が表示されていた

ただ、statusLineはフックです。
Claude Codeがメッセージを処理したときにしか動きません。
ターミナルを開かない日は、キャッシュも更新されないままになります。

8月30日の朝にポップオーバーを開いたら、最終更新が8月27日の20時11分でした。
セッション枠のカードは「使用率を取得できません」。

2.2. 3日前の値が表示されていた

しかもClaudeの利用枠は、Claude Desktopでもウェブでも同じところを消費します7
Claude Codeを触っていない日も残量は減っていく。
減っているのに数字は止まっている、という一番よくない状態でした。

そこで、能動的に取りにいく経路を足しました。
Claude Codeが自分のログイン情報を置いているキーチェーンの項目、なければ ~/.claude/.credentials.json からアクセストークンを読んで、利用量を問い合わせます8
動かすのはキャッシュが古いときと、更新ボタンを押したときだけ。ふだんは今までどおりstatusLineのキャッシュを読みます。

3. 減り方は、iPhoneのバッテリー画面で見たことがある

3.1. 6時間ごとに28本

残量が分かっても、減り方は分かりません。
残り65%と言われて、それが昨日一気に減った結果なのか、毎日少しずつ削れた結果なのかで、今日やることが変わります。

形はすぐ思いつきました。
iPhoneの設定にあるバッテリーの画面、あの「電力使用状況」の棒グラフです9

3.1. 6時間ごとに28本

直近7日を6時間で区切ると、ちょうど28本になります。1日あたり4本。
日付の境目に区切り線を入れて曜日を振り、棒の高さは使用率ではなく残量にしました。
上限に近づくほど棒が短くなるので、減っていく向きと見た目の向きが揃います。

3.2. 観測がない区間に線を引かない

やっかいなのは、観測が飛び飛びになることです。
アプリが動いていない時間の値は、どこにもありません。

埋め方は2つ考えられます。
前後の実測値を線でつなぐか、直前の値をそのまま横へ伸ばすか。
つないだほうがグラフはきれいになりますが、それは「その間もこのペースで減っていました」という嘘です10
直前の値を維持するほうを選びました。
ただし観測と観測のあいだにリセット時刻を跨いでいれば、その境界で100%へ戻します。
そうやって埋めた棒は薄い色にして、実測の棒と見分けられるようにしました。

入れた直後のグラフは、当然ながら棒が1本しかありません。

3.2. 観測がない区間に線を引かない

Codexのほうは、この空白を後から埋められます。
過去のセッションJSONLに token_count のメタデータが残っているので、そこから遡って書き戻せる11
会話の中身には触らず、集計に使う数値だけを見ます。

Claudeにはそれがありません。
残っているのは最新のキャッシュ1つだけなので、遡る材料がない。
インストールした日から観測を積んで育てるしかありません。
同じ見た目のグラフでも、左端のほうの出どころが2つのアプリで違います。

3.2. 観測がない区間に線を引かない

4. 他人のアプリを、自分の使い方へ寄せる

2つのアプリを別々に触っているうちに、ポップオーバーの幅や余白が少しずつずれてきました。
そこで共通の土台へ切り出して、幅、左右の余白、項目の間隔、ボタンの並び、中身に合わせた高さの調整を両方で共有しました。
サービスごとに違うカードや補足だけを、それぞれのアプリ側から渡します。

ついでに、別のアプリへフォーカスが移ったらポップオーバーが自動で閉じるようにしました12
確認したいのは一瞬だけなので、開きっぱなしになるのが地味に邪魔だったからです。

変更のたびに make check を回しています。
28本のバケットができること、リセット位置で100%へ戻ること、欠損区間で直前の値が維持されること。この3つはテストに入れました。
自分しか使わないものは、数えて確かめてくれる相手も自分しかいません。

forkもしていませんし、変更を送り返してもいません13
元のアプリは「いまの残量を正しく出す」というところで完成していて、足したのは自分の使い方に寄せた分だから。
読んで、直して、また使う。この往復ができるのが楽しいです。

  1. MITライセンスは、著作権表示とライセンス文を残しさえすれば、使用・複製・改変・再配布を制限なく許可する短いライセンスです。 – The MIT License
  2. メニューバーに居座る項目はAppKitのNSStatusItemで作ります。システム全体のメニューバーを管理するNSStatusBarから受け取り、表示する文字や画像を差し替えます。 – NSStatusItem | Apple Developer Documentation
  3. Codexの利用枠は5時間の枠と週間の枠の2本立てで、上限はChatGPTのプランごとに変わります。 – Using Codex with your ChatGPT plan
  4. Claudeも同じ形で、セッションの枠は5時間ごとに戻り、週間の枠はアカウントごとに決められた時刻に週1回リセットされます。 – What is the Pro plan?
  5. Codex CLIは会話の記録を ~/.codex/sessions/年/月/日/rollout-*.jsonl へ1行1JSONの形で書き出していて、その中にトークン数を伝える token_count イベントが混ざっています。 – Reverse engineering Codex CLI rollout traces
  6. statusLineは ~/.claude/settings.json に登録する外部コマンドで、Claude Codeが更新のたびにJSONを標準入力へ流し込み、コマンドの標準出力をそのまま1行として表示します。 – Customize your status line
  7. ProとMaxの利用枠はClaudeとClaude Codeで共有され、どちらでの利用も同じ枠へ加算されるとAnthropicは説明しています。 – Use Claude Code with your Pro or Max plan
  8. Claude Codeの認証情報は、macOSでは暗号化されたキーチェーンへ、LinuxやWindowsでは権限を絞った .credentials.json へ保存されます。 – Authentication – Claude Code Docs
  9. iPhoneの設定にあるバッテリー画面では、その日の残量の推移と、直近8日ぶんの使用率を棒グラフで見られます。 – Check battery usage on your iPhone
  10. 直前の値をそのまま横へ伸ばす埋め方はLOCFと呼ばれ、段階的に変わる値には直線でつなぐ補間より合うとされています。 – Last observation carried forward
  11. ただし非対話モードで動かしたセッションのファイルには token_count が入らないという報告もあり、遡れる範囲はログの書かれ方に左右されます。 – Include token_count events in non-interactive session files
  12. NSPopoverのtransientという挙動を選ぶと、ポップオーバーの外にある要素を操作した時点でシステム側が閉じてくれます。 – NSPopover.Behavior.transient
  13. forkはGitHub上に自分名義のコピーを作る操作で、そこからプルリクエストを出して元のリポジトリへ変更を提案できます。手元へcloneしただけの状態とは別のものです。 – Fork a repository