transcript.jsonlãçŽæ¥ããŒã¹ããŠãäœãåŒã°ããŠãããããå¯èŠåãã
ååããšãŒãžã§ã³ãã®æäœãã°ãå¯èŠåããè©±ãæžããŸãããä»åã¯ãã®é£æ¥é åã§ããäœãåŒã°ããŠãããããéèšãã話ã§ãã
Claude Codeã®/usageã¯ã³ã¹ãïŒ$ïŒãèŠããŠãããŸããããã©ã®SkillãäœååŒãã ãããã©ã®Agentã®subagent_typeãéããããã©ã®MCPãµãŒããŒãå©ããŸãã£ãŠããããã¯åºãŠããŸããããã®æ
å ±ã¯å®ã¯~/.claude/projects/é
äžã®transcript.jsonlã«å
šéšæžããŠãããŸãããããPythonã§çŽæ¥ããŒã¹ããŠéèšããusage-breakdown.shãäœã£ã話ã§ãã
å°ãããšïŒã³ã¹ãã¯èŠãããå èš³ãèŠããªã
/usageãtoken-budget-advisor.shã¯ãä»ã©ãã ã䜿ã£ãããã®æ°åã¯åºããŸãããããã¯åèšå€ã§ããå®éã«è¥å€§åã®åå ãæœ°ãã«ã¯ã
- ã©ã®SkillãåŒã°ããããŠãããïŒä¹±é ããŠããªããïŒ
- ã©ã®AgentïŒ
subagent_typeïŒãéãã¿ã¹ã¯ãç¹°ãè¿ããŠããã - ã©ã®MCPãµãŒããŒãžã®åŒã³åºããæ¯é çã
ãšããå èš³ãèŠããŸãããããç¥ãææ®µããªãã£ãã®ã§ãtranscript.jsonlãçŽæ¥èªãããšã«ããŸããã
transcript.jsonlã®äžèº«ïŒè¡ããšã«åãéã
ãŸãåæãšããŠã1ã»ãã·ã§ã³ã®transcript.jsonlã¯1è¡1ã¬ã³ãŒãã®JSONLã§ãããã¬ã³ãŒãã®typeã¯äžæ§ã§ã¯ãããŸãããå®ãã¡ã€ã«ã®å
é æ°è¡ãèŠããšã
last-prompt ['type', 'leafUuid', 'sessionId']
mode ['type', 'mode', 'sessionId']
permission-mode ['type', 'permissionMode', 'sessionId']
attachment ['parentUuid', 'isSidechain', 'attachment', 'type', 'uuid', 'timestamp', 'userType', 'entrypoint']
attachment ['parentUuid', 'isSidechain', 'attachment', 'type', 'uuid', 'timestamp', 'userType', 'entrypoint']
ã®ããã«last-promptã»modeã»permission-modeã»attachmentãæ··ãã£ãŠããŸããæ¬²ããã®ã¯type: "assistant"ã®ã¬ã³ãŒãã«ããmessage.contenté
åã®äžã®tool_useãããã¯ã ãã§ããå®éã®SkillåŒã³åºãã¯ããèšé²ãããŠããŸãã
{
"type": "tool_use",
"id": "toolu_01Q8hr6CBx1g9TcTxRcJHD7N",
"name": "Skill",
"input": {
"skill": "artifact-design"
},
"caller": {
"type": "direct"
}
}
AgentåŒã³åºãã¯name: "Agent"ã§input.subagent_typeã«ãµããšãŒãžã§ã³ãçš®å¥ãå
¥ããŸãã
{
"type": "tool_use",
"id": "toolu_016fshGyeB3cK5awgqMn6dQK",
"name": "Agent",
"input": {
"description": "æ¢åã®ã¡ã¢ãªç£èŠæ©æ§ã調æ»",
"subagent_type": "Explore",
"prompt": "..."
}
}
MCPããŒã«ã¯nameãmcp__<server>__<tool>ã®åœ¢åŒã§å
¥ã£ãŠããŸãïŒäŸ: mcp__claude-in-chrome__computerïŒããã®3ãã¿ãŒã³ãtool_useãããã¯ããæŸãã°ãSkillã»Agentã»MCPãµãŒããŒããšã®åŒã³åºãåæ°ãåãããŸãã
å®è£ ïŒBashãã¢ããã¥ã¡ã³ãã«åã蟌ãã Python
usage-breakdown.shæ¬äœã¯ã·ã§ã«ã®åŒæ°åŠçã ãæ
åœããéèšããžãã¯ã¯äžžããšPythonã®ãã¢ããã¥ã¡ã³ãã«åã蟌ãã§ããŸãã
ARG="${1:-7d}"
TR_DIR="$HOME/.claude/projects/-Users-matsubara"
[ -d "$TR_DIR" ] || { echo "(no transcript dir)"; exit 0; }
python3 - "$TR_DIR" "$ARG" <<'PY'
...
PY
PythonåŽã®éèšã³ã¢ã¯ãããªã£ãŠããŸããisinstanceã¬ãŒããå€ãã®ã¯ãäžã§èŠãéãã¬ã³ãŒãåãæã£ãŠããªãããã§ãã
for path in glob.glob(f"{tr_dir}/*.jsonl"):
try:
mtime = os.path.getmtime(path)
if mtime < cutoff_ts: continue
total_files += 1
with open(path, "r", encoding="utf-8", errors="replace") as f:
for line in f:
try:
rec = json.loads(line)
except: continue
msg = rec.get("message", {}) if isinstance(rec.get("message"), dict) else {}
content = msg.get("content") if isinstance(msg, dict) else None
if not isinstance(content, list): continue
for block in content:
if not isinstance(block, dict): continue
if block.get("type") != "tool_use": continue
name = block.get("name", "")
inp = block.get("input") or {}
tool_calls[name] += 1
if name == "Skill":
skill_name = inp.get("skill", "?") if isinstance(inp, dict) else "?"
if ":" in skill_name:
plugin_skill_calls[skill_name.split(":", 1)[0]] += 1
skill_calls[skill_name] += 1
elif name == "Agent":
st = inp.get("subagent_type", "?") if isinstance(inp, dict) else "?"
agent_calls[st] += 1
elif name.startswith("mcp__"):
parts = name.split("__")
if len(parts) >= 2:
mcp_calls[parts[1]] += 1
except Exception:
continue
ãã¡ã€ã«åäœã®ãã£ã«ã¿ã¯os.path.getmtimeãã€ãŸãã»ãã·ã§ã³ã®æçµæŽæ°æ¥æã§åã£ãŠããŸããè¡ããšã®ã¿ã€ã ã¹ã¿ã³ãã¯èŠãŠããŸãããæ¥æ°æå®ïŒ7d/30dïŒã¯ããã§ããå¹ããŸããã
å®è¡çµæïŒçŽè¿30æ¥ã§20755åã®tool_use
~/.claude/projects/-Users-matsubara/ã¯çŸåš199ãã¡ã€ã«ã»çŽ1.0GBã§ããããã«å¯ŸããŠusage-breakdown.sh 30dãå®éã«èµ°ãããçµæãããã§ãã
=== usage breakdown (last 30d, 199 transcripts) ===
total tool_use: 20755
--- top tools ---
13340 Bash
2088 Read
1956 Edit
832 Write
597 mcp__claude-in-chrome__computer
218 TaskUpdate
196 ToolSearch
184 mcp__claude-in-chrome__navigate
149 mcp__claude-in-chrome__javascript_tool
136 TaskCreate
--- top skills (10 unique) ---
7 artifact-design
2 superpowers:brainstorming
1 deep-research
1 frontend-design:frontend-design
1 harness-audit
1 pre-completion-self-audit
1 frontend-design
1 dataviz
1 claude-api
1 remotion-video-creation
--- top agents (7 unique) ---
68 general-purpose
21 Explore
4 ?
3 reviewer
2 fork
1 code-reviewer
1 security-reviewer
--- top MCP servers (5 unique) ---
1293 claude-in-chrome
79 plugin_playwright_playwright
54 computer-use
28 claude_ai_Gmail
22 claude_ai_Google_Calendar
30æ¥ã§Bashã13340åãšããŒã«åŒã³åºãå
šäœã®6å²ãå ããŠããŸããAgentã¯general-purposeã68åã§ãã³ãããExploreã21åã§ç¶ããŸãããã®2ã€ã§å
šAgentåŒã³åºãã®å€§åãé£ã£ãŠããããšãæ°åã§åãããŸããMCPã¯claude-in-chromeã1293åã§ä»ãå§åããŠãããmcp__claude-in-chrome__computerïŒ597åïŒåäœã§ãããããŒã«ã®5äœã«é£ã蟌ãã§ããŸãããã©ãŠã¶æäœç³»ã®MCPåŒã³åºããããŒã¯ã³æ¶è²»ã®äž»å ã«ãªã£ãŠãããã ããšããã®ããã®å
èš³ããç«ãŠããã仮説ã§ãã
é¢çœãã®ã¯top skillsã«frontend-design:frontend-designãšfrontend-designãå¥ãšã³ããªã§äž¡æ¹åºãŠããããšã§ããåè
ã¯ãã©ã°ã€ã³åå空éã€ãã®åŒã³åºãïŒskill: "frontend-design:frontend-design"ïŒãåŸè
ã¯çŽ ã®ååã§ã®åŒã³åºãã§ãéèšã³ãŒãã":"ã®æç¡ã§åå²ããŠãããããåãã¹ãã«ã§ãåŒã³æ¹ã«ãã£ãŠå¥ã«ãŠã³ããããŸãã
--shortã¢ãŒãïŒstatuslineãžã®1è¡åã蟌ã¿
--shortãæž¡ããšãå
èš³ãåºããã«åèšã ã1è¡ã§è¿ããŸãã
if SHORT:
total = sum(tool_calls.values())
print(f"{total} tool_use across {total_files} sessions ({days}d)")
sys.exit(0)
å®è¡ãããšãããªããŸãã
$ usage-breakdown.sh --short
5010 tool_use across 41 sessions (7d)
--shortã®ããã©ã«ãã¯arg = "--short"ã®ãšãdays=7ã«åºå®ãããäœããªã®ã§ãstatuslineã«åã蟌ãçšéã§ã¯åžžã«çŽè¿7æ¥åºå®ã§ãã1è¡ã§è¿ãã®ã§statuslineã®ä»ã®é
ç®ïŒ5h/7dã®ãã©ã³äœ¿çšçãªã©ïŒãšäžŠã¹ãŠåºããŠã厩ããŸããã
èžãã èœãšã穎
- ã¬ã³ãŒãåãäžæ§ã§ãªã â
last-prompt/mode/permission-mode/attachmentãªã©message.contentãæããªãè¡ãæ··ãããisinstanceã¬ãŒããmessageã»contentã»åblockã®3段ã§å ¥ããªããšãã©ããã§AttributeErrorãKeyErrorã§èœã¡ã - æ¥æ°ãã£ã«ã¿ã¯ãã¡ã€ã«mtimeåºæº â è¡ããšã®ã¿ã€ã ã¹ã¿ã³ãã§ã¯ãªã
os.path.getmtimeã§åã£ãŠãããé·æéã»ãã·ã§ã³ã®ãã¡ã€ã«ã¯ãéå§ãäœæ¥åã§ããæåŸã«è§Šã£ãæ¥ãã§ããå€å®ãããªã - ãã©ã°ã€ã³Skillã¯åå空éã€ãæåå â
"frontend-design:frontend-design"ã®ããã«:åºåãã§å ¥ãã®ã§ãsplit(":", 1)ããªããšåãSkillãåå空éããšã«ãã©ãã - MCPããŒã«åã¯
mcp__<server>__<tool>ã ããµãŒããŒåèªäœã«_ãå ¥ã âplugin_playwright_playwrightã®ããã«parts[1]ã ãã§ã¯åºå¥ãã¥ããååãåºãŠãããsplit("__")åæã厩ãããµãŒããŒåã«ã¯æªå¯Ÿå¿ set -uo pipefailã ãPythonåŽã®äŸå€ã¯æ¡ãã€ã¶ãèšèš â ãã¡ã€ã«åäœã®try/except Exception: continueãªã®ã§ã1ãã¡ã€ã«å£ããŠããŠãå šäœã¯æ¢ãŸããªã代ããã«ãéèšæŒãããµã€ã¬ã³ãã«èµ·ããã
ãŸãšã
/usageãèŠããªãSkillã»Agentã»MCPã®åŒã³åºãå èš³ã¯ãtranscript.jsonlã®tool_useãããã¯ããçŽæ¥éèšã§ãã- JSONLã¯è¡ããšã«åãéãïŒ
attachment/modeãªã©ïŒã®ã§ãããŒã¹ã¯isinstanceã®å€æ®µã¬ãŒããèŠã - 宿ž¬30æ¥ã§
Bash13340åã»general-purposeAgent 68åã»claude-in-chromeMCP 1293åããšæ¯é çãªåŒã³åºãå ãæ°åã§èŠãã --shortã§åèš1è¡ã«æœ°ãã°ãstatuslineã«ãã®ãŸãŸåã蟌ãã- éèšã¯call countããŒã¹ã§ãtokenæ°ãã®ãã®ã§ã¯ãªãããã©ããéãããã®äžæ¬¡ã¹ã¯ãªãŒãã³ã°ãšããŠäœ¿ã
次åã¯ããã®å
èš³ã§èŠããclaude-in-chromeMCPã®åŒã³åºãéå€ãã©ãåã£ããããšããè©±ãæžãäºå®ã§ãã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ