|
58 | 58 | | <img width="48px" src=".github/assets/client-claude.jpg" alt="Claude" /> | [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | `~/.claude/projects/` | ✅ 지원 | |
59 | 59 | | <img width="48px" src=".github/assets/client-openclaw.jpg" alt="OpenClaw" /> | [OpenClaw](https://openclaw.ai/) | `~/.openclaw/agents/` (+ 레거시: `.clawdbot`, `.moltbot`, `.moldbot`) | ✅ 지원 | |
60 | 60 | | <img width="48px" src=".github/assets/client-openai.jpg" alt="Codex" /> | [Codex CLI](https://github.com/openai/codex) | `~/.codex/sessions/` | ✅ 지원 | |
| 61 | +| <img width="48px" src=".github/assets/client-copilot.jpg" alt="Copilot" /> | [GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-the-github-copilot-coding-agent-in-cli) | `~/.copilot/otel/*.jsonl` (+ `COPILOT_OTEL_FILE_EXPORTER_PATH`) | ✅ 지원 | |
61 | 62 | | <img width="48px" src=".github/assets/client-hermes.png" alt="Hermes Agent" /> | [Hermes Agent](https://github.com/NousResearch/hermes-agent) | `$HERMES_HOME/state.db` (폴백: `~/.hermes/state.db`) | ✅ 지원 | |
62 | 63 | | <img width="48px" src=".github/assets/client-gemini.png" alt="Gemini" /> | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `~/.gemini/tmp/*/chats/*.json` | ✅ 지원 | |
63 | 64 | | <img width="48px" src=".github/assets/client-cursor.jpg" alt="Cursor" /> | [Cursor IDE](https://cursor.com/) | `~/.config/tokscale/cursor-cache/`를 통한 API 동기화 | ✅ 지원 | |
@@ -140,7 +141,7 @@ AI 지원 개발 시대에 **토큰은 새로운 에너지**입니다. 토큰은 |
140 | 141 | - 9가지 테마의 GitHub 스타일 기여 그래프 |
141 | 142 | - 실시간 필터링 및 정렬 |
142 | 143 | - 깜빡임 없는 렌더링 |
143 | | -- **멀티 플랫폼 지원** - OpenCode, Claude Code, Codex CLI, Cursor IDE, Gemini CLI, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimi CLI, Qwen CLI, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Synthetic 사용량 통합 추적 |
| 144 | +- **멀티 플랫폼 지원** - OpenCode, Claude Code, Codex CLI, Copilot CLI, Cursor IDE, Gemini CLI, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimi CLI, Qwen CLI, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Synthetic 사용량 통합 추적 |
144 | 145 | - **실시간 가격 반영** - LiteLLM에서 최신 가격을 가져와(디스크 캐시 1시간) 비용 계산; OpenRouter 자동 폴백 및 신규 모델용 Cursor 가격 지원 |
145 | 146 | - **상세 분석** - 입력, 출력, 캐시 읽기/쓰기, 추론 토큰까지 추적 |
146 | 147 | - **네이티브 Rust 코어** - 모든 파싱과 집계를 Rust로 처리해 최대 10배 빠른 성능 |
@@ -579,7 +580,7 @@ tokscale sources --json |
579 | 580 | - **인터랙티브 툴팁**: 호버 시 상세 일별 분석 표시 |
580 | 581 | - **일별 분석 패널**: 클릭하여 소스별, 모델별 세부사항 확인 |
581 | 582 | - **연도 필터링**: 연도 간 탐색 |
582 | | -- **소스 필터링**: 플랫폼별 필터 (OpenCode, Claude, Codex, Cursor, Gemini, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimi, Qwen, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Synthetic) |
| 583 | +- **소스 필터링**: 플랫폼별 필터 (OpenCode, Claude, Codex, Copilot, Cursor, Gemini, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimi, Qwen, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Synthetic) |
583 | 584 | - **통계 패널**: 총 비용, 토큰, 활동 일수, 연속 기록 |
584 | 585 | - **FOUC 방지**: React 하이드레이션 전 테마 적용 (깜빡임 없음) |
585 | 586 |
|
@@ -872,6 +873,7 @@ AI 코딩 도구들은 크로스 플랫폼 위치에 세션 데이터를 저장 |
872 | 873 | | Claude Code | `~/.claude/` | `%USERPROFILE%\.claude\` | 모든 플랫폼에서 동일한 경로 | |
873 | 874 | | OpenClaw | `~/.openclaw/` (+ 레거시: `.clawdbot`, `.moltbot`, `.moldbot`) | `%USERPROFILE%\.openclaw\` (+ 레거시 경로) | 모든 플랫폼에서 동일한 경로 | |
874 | 875 | | Codex CLI | `~/.codex/` | `%USERPROFILE%\.codex\` | `CODEX_HOME` 환경변수로 설정 가능 ([소스](https://github.com/openai/codex)) | |
| 876 | +| Copilot CLI | `~/.copilot/otel/ ` | `%USERPROFILE%\.copilot\otel\` | OTEL 파일 내보내기 필요; `COPILOT_OTEL_FILE_EXPORTER_PATH`도 자동 수집 | |
875 | 877 | | Hermes Agent | `~/.hermes/` | `%USERPROFILE%\.hermes\` | `HERMES_HOME` 환경변수로 설정 가능 ([소스](https://github.com/NousResearch/hermes-agent/blob/main/website/docs/developer-guide/session-storage.md)) | |
876 | 878 | | Gemini CLI | `~/.gemini/` | `%USERPROFILE%\.gemini\` | 모든 플랫폼에서 동일한 경로 | |
877 | 879 | | Amp | `~/.local/share/amp/` | `%USERPROFILE%\.local\share\amp\` | OpenCode와 동일하게 `xdg-basedir` 사용 | |
@@ -1013,6 +1015,39 @@ OpenCode는 빌드된 릴리스 채널에 따라 DB 파일명을 결정합니다 |
1013 | 1015 | {"type": "event_msg", "payload": {"type": "token_count", "info": {"last_token_usage": {"input_tokens": 1234, "output_tokens": 567}}}} |
1014 | 1016 | ``` |
1015 | 1017 |
|
| 1018 | +### Copilot CLI |
| 1019 | + |
| 1020 | +위치: `~/.copilot/otel/*.jsonl` 또는 `COPILOT_OTEL_FILE_EXPORTER_PATH`에 명시된 경로 |
| 1021 | + |
| 1022 | +Copilot 지원은 파일로 내보낸 OpenTelemetry JSONL을 읽습니다. Copilot을 실행하기 전에 활성화하세요: |
| 1023 | + |
| 1024 | +```bash |
| 1025 | +export COPILOT_OTEL_ENABLED=true |
| 1026 | +export COPILOT_OTEL_EXPORTER_TYPE=file |
| 1027 | +mkdir -p "$HOME/.copilot/otel" |
| 1028 | +export COPILOT_OTEL_FILE_EXPORTER_PATH="$HOME/.copilot/otel/copilot-otel-$(date +%Y%m%d-%H%M%S).jsonl" |
| 1029 | +``` |
| 1030 | + |
| 1031 | +PowerShell: |
| 1032 | + |
| 1033 | +```powershell |
| 1034 | +$otelDir = "$HOME/.copilot/otel" |
| 1035 | +New-Item -ItemType Directory -Force -Path $otelDir | Out-Null |
| 1036 | +$env:COPILOT_OTEL_ENABLED = "true" |
| 1037 | +$env:COPILOT_OTEL_EXPORTER_TYPE = "file" |
| 1038 | +$env:COPILOT_OTEL_FILE_EXPORTER_PATH = Join-Path $otelDir ("copilot-otel-{0}.jsonl" -f (Get-Date -Format "yyyyMMdd-HHmmss")) |
| 1039 | +``` |
| 1040 | + |
| 1041 | +타임스탬프가 포함된 파일명을 사용하면 각 Copilot 세션이 하나의 거대한 OTEL 로그에 누적되지 않고 새 파일에 기록됩니다. |
| 1042 | + |
| 1043 | +Tokscale은 `chat` span을 토큰 집계의 출처로 취급하고, 도구 span과 누적 메트릭은 1단계에서 무시합니다: |
| 1044 | + |
| 1045 | +```json |
| 1046 | +{"type":"span","name":"chat gpt-5.4-mini","attributes":{"gen_ai.operation.name":"chat","gen_ai.response.model":"gpt-5.4-mini","gen_ai.conversation.id":"session-id","gen_ai.usage.input_tokens":1234,"gen_ai.usage.output_tokens":567,"gen_ai.usage.cache_read.input_tokens":890,"gen_ai.usage.reasoning.output_tokens":123}} |
| 1047 | +``` |
| 1048 | + |
| 1049 | +> Copilot의 OTEL 페이로드는 현재 안정적인 워크스페이스 메타데이터를 노출하지 않으므로, Copilot 행은 워크스페이스 속성 없이 표시될 수 있습니다. Tokscale은 가능한 경우 보고된 모델로부터 해당 행의 가격을 책정하며, `github.copilot.cost`를 직접 신뢰하지 않습니다. |
| 1050 | +
|
1016 | 1051 | ### Gemini CLI |
1017 | 1052 |
|
1018 | 1053 | 위치: `~/.gemini/tmp/{projectHash}/chats/*.json` |
|
0 commit comments