claude code で claude code のコスト集計コマンドを作成

# 概要
claude code(cc) + claude 4 sonnet の実力の片鱗を知るために claude code で command (python)を作成してみました




# 題材
claude code のログからコストの集計をする




# 環境
- mac M3
- sequoia 15.1
- claude code 1.0.7
- claude sonnet 4
- python 3.13




# 結果
- 成果
    - 大きな問題も出ず、期待の成果物を cc のみで作成できた
- 所要時間
    - pip package として公開するまで約12時間
    - 100$ max plan で api limit にかからない程度に使用
- 費用
    - 約120$ 換算  // 今回作成したツールで集計





# 成果物
claude code cost collector

https://github.com/Satoshi-Numasawa-RubyDev/claude_code_cost_collector




# 所管
## claude max plan 
- claude max は定額利用なので存分に試せる
- 100ドル / 月 ですが、1日で100$以上は消費し、特に ralte limit にかかりませんでした
- 肌感覚を得られたのでよかったです

## 速度
- 人間より 5 ~ 10倍早い
- Review で人間がボトルネックになる
    - Review も LLM に任せると良さそうだが．．．微妙な Review 結果も多い
    - 小さくタスクを切り出すと良さそう

## 追従性の向上
- CLAUDE.md に記述しておけば大筋踏襲して動作する
- 説明が矛盾、曖昧、論理的に変な記述だと混乱する事もある

## 綺麗に保つルールが必用
- ドキュメント生成
    - 都度ドキュメントへ高速に反映してくれるので有り難い
    - 明示しておくと agent の判断材料になる
- コーディングルールを敷く
    - linter、formatter、test など一式、修正毎に必ず走らせ rail を敷くと安心
- test は必須
    - 意図から外れないための rail になる
    - 大量の test を書いてくれるので有り難い
- リファクタリングが必用
    - コードベースが汚れていく  // 未使用関数が残置するなど
    - ガベージコレクションのルールを敷いた方が良さそう
- 非公開情報の混入
    - ローカル情報が若干漏れでる可能性もある
    - 網羅するためには、様々観点を CLAUDE.md に記述しておくと良さそう
    - ランダム性もあるので、cc を並列動作させると良さそう
    - think harder などの強い thinking mode で幅広く確認する必用がある
    - 最後は怖いので目視で確認
- 最初は対話形式が良さそう
    - 上記の様にルールを敷くべき所が明確化してくるため




# 開発の過程

- 要件定義
    - 自身の欲しいものを自分でざっと記述
    - gemini に喰わせ不足機能や細かい点を話し合い、ブラッシュアップ
- 設計
    - gemini に要件定義から基本設計を記述してもらう
- タスク化
    - 設計から作成手順を起こし小さな単位でタスク化




## 要件定義、詳細設計
### 欲しい内容を gemini へ入力する


```
以下の様なソフトをつくりたいと思っています
コーディングは不要です
全体の実装計画を作成してください
以下の定義の中で不明確になっている dir 探索やデータ構造の解析も加味すること


# 要件定義
## 目的
claude code が用いたコストを日ごとにまとめて表示する

## 利用形態
- linux command の様にコマンド形式で実行できるのが望ましい
- option によって動作が変わるのが望ましい
    - default は日毎の動作
    - 月毎
    - 日毎などにまとめずにすべて個別に出力する
    - session, project 毎に算出
- 出力形式
    - 以下の format の形式が default
    - option で json, yaml, csv 形式での出力に対応する
- ドル, 円
    - 円は option で


## format
┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ Date        │ Input       │ Output      │ Total       │ Cost USD    │
├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤
│ 2025-05-30  │         787 │      51,384 │      52,171 │       $2.34 │
│ 2025-05-29  │     158,565 │       1,031 │     159,596 │       $0.92 │
│ 2025-05-28  │      88,999 │         157 │      89,156 │       $0.27 │
├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤
│ Total       │  10,277,006 │     433,733 │  10,710,739 │     $134.82 │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘


## 解析対象ファイルの所在
以下の辺りにあるので, コマンドはディレクトリを内をくまなく探して該当のデータを収集する必用がある
~/.claude/projects/dummy_project_path/


## データ構造
以下実際の構造を添付する

{
  "uuid": "xxxxxxxxxxxxx",
  "parentUuid": "xxxxxxxxxx",
  "sessionId": "xxxxxxxxxxxx",
  "timestamp": "2025-05-09T12:03:20.000Z",
  "type": "assistant",
  "cwd": "yyyyyyyyyyyyyyyyyyy",
  "originalCwd": "yyyyyyyyyyyyyyyyyyyyyyyyyy",
  "userType": "external",
  "version": "0.2.104",
  "isSidechain": false,
  "costUSD": 0.09317325,
  "durationMs": 7085,
  "message": {
    "id": "msg_bdrk_zzzzzzzzzzzzzzzzzzzzzzzzzzz",
    "type": "message",
    "role": "assistant",
    "model": "claude-3-7-sonnet-20250219",
    "content": [
      {
        "type": "text",
        "text": "dummy text"
      },
      {
        "type": "tool_use",
        "id": "toolu_bdrk_zzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
        "name": "Read",
        "input": {
          "file_path": "/Dummy/Path"
        }
      }
    ],
    "stop_reason": "tool_use",
    "stop_sequence": null,
    "usage": {
      "input_tokens": 4,
      "cache_creation_input_tokens": 24399,
      "cache_read_input_tokens": 0,
      "output_tokens": 111
    }
  },
  "isApiErrorMessage": false,
  "model": "claude-3-7-sonnet-20250219"
}


## コストの算出
- costUSD column から値を取得し集計する
- ドルから円に変換する場合は, 為替情報の取得も必用となる


## 使用する言語
python 3.13
```

### gemini と相談
以下の様な要件清書と基本設計が出力される
不明点などを gemini と相談し、仕様や実装方針をブラッシュアップする
ここでは言語での定義で十分としましたが、詳細設計まで落とし込めばブレが減ると思います

![スクリーンショット 2025-06-03 13.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/ed968d50-8354-45d2-aa76-dfbc060dd230.png)



## タスク化
### 並列処理向けのタスクリストを作成
以下のプロンプトを入力し、gemini にタスクリストを作成して貰います

```
ではこれまでの要件と設計を元にした task list を作成しましょう

この task list を元に coding agent が作業を実施します
複数の関数、ファイルに分けるなど小さく分割し、並列処理を行える単位にしましょう


# フォーマットは以下に準ずる事
----
todos:
  Task management for Claude Cost Visualization Project
  Format:
  - id: unique_id
    title: "Task title"
    status: "pending|in_progress|completed"
    description: "Detailed description"
    file_ref: "bank/issues/filename.md" # if applicable
    dependencies: [required taks ids]
    extra: any other info
  
# Example:
# - id: "１.0"
#   title: "Initial project setup and architecture design"
#   status: "pending"
#   description: "Create initial project structure and define architecture"
#   file_ref: "bank/issues/initial_setup.md"
#   extra:
```

### 以下、生成された task list の一部
```
 - id: "6.1"
    title: "テキストテーブル出力の実装 (formatter.py)"
    status: "pending"
    description: |
      `formatter.py` に、`rich` または `tabulate` ライブラリを使用してテキストテーブル出力用のヘルパー関数を実装する。
      集計タイプに基づいて動的に列を作成する（例: '日付', 'プロジェクト', 'セッションID'）。
      標準列: `Input`, `Output`, `Total tokens`, `Cost $USD`。オプションで `Cost ¥JPY`。
      数値の3桁区切りを実装する。最後に「合計」行を含める。
      指示：このタスク用にフィーチャーブランチ（例: feature/6.1-text-table-formatter）を作成してください。
    file_ref: "bank/issues/6.1_text_table_formatter.md"
    dependencies: ["6.0", "5.1"] # データソースの例として集計タスクに依存
    extra: { git_branch_suggestion: "feature/6.1-text-table-formatter" }

  - id: "6.2"
    title: "JSON出力の実装 (formatter.py)"
    status: "pending"
    description: |
      `formatter.py` に、JSON出力用のヘルパー関数を実装する。
      可読性のために適切なインデントを付けて `json.dumps()` を使用する。
      データ構造は、各辞書がデータ行を表す辞書のリストとする。
      指示：このタスク用にフィーチャーブランチ（例: feature/6.2-json-formatter）を作成してください。
    file_ref: "bank/issues/6.2_json_formatter.md"
    dependencies: ["6.0", "5.1"]
    extra: { git_branch_suggestion: "feature/6.2-json-formatter" }
```



### タスクリストと設計の保存
タスクリスト、設計をプロジェクト内の bank ディレクトリに書き出し管理します




## 実装
以下の様に cc を複数稼働、対話し、タスクを全て消化します
なお、git worktree を用いてブランチ事の各ディレクトリ内部で cc を実行しています

- 統括
    - 並列処理の指示やタスクリストの状況確認
    - 全体状況の把握
- coding
    - 4 ~ 5 ほど cc を起動し実行するタスクの番号を与え、実装を行う


![スクリーンショット 2025-06-03 13.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/c2ef9680-638c-4e17-b7c3-820158401b97.png)




## 並列の問題点
タスクの関連図を可視化しましたが...解りづらい

claude code にタスクリストを読み込ませ、手順を指示してもらうという手法にしました
自分の脳を使わなくなっているのが実感できます

![スクリーンショット 2025-06-03 13.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/b4724d48-a834-44eb-aad2-99eb296d1ece.png)




## 並列化による精錬
上述の作成手順は人の手を介しゆっくりと進めました
agent の動作はランダム性があるため、要件定義、設計なども複数の agent に記述して貰い、それらを纏め精錬すると良いと思います

大量の並列化と試行は、進化アルゴリズムや強化学習などでも用いられるので、コストが許せば coding にも有用かもしれません


以上となります