æå120äžãæ¯ããŠããã®ã¯ãAIãžã®æç€ºã®äžæãã§ã¯ãããŸããããå®çŸ©ããæ©èœãæ¬åœã«åããŠãããããèªåã§ç¢ºèªãç¶ããç°å¢èšèšã§ãã
ãªããã®ä»çµã¿ãå¹ãã®ã
Claude Codeã«ã¯ã~/.claude/agents/ ãã£ã¬ã¯ããªã« .md ãã¡ã€ã«ã眮ãããšã§ã«ã¹ã¿ã ãšãŒãžã§ã³ããå®çŸ©ã§ããŸããarchitectïŒã¢ãŒããã¯ãã£èšèšïŒãcode-reviewerïŒã³ãŒãã¬ãã¥ãŒïŒãsecurity-reviewerïŒã»ãã¥ãªãã£ç£æ»ïŒã®ãããªå°éãšãŒãžã§ã³ããå®çŸ©ããŠãClaude CodeãèªåŸçã«äœ¿ãåããŠãããããšãæåŸ
ããââããã¯èªç¶ãªçºæ³ã§ãã
ãšããããå®éã®ãã°ãéèšããŠã¿ããšé©ããããªçµæãåºãŸãã
ç§ã®ç°å¢ãäŸã«æããŸãã~/.claude/agents/ ã«ã¯çŸåš8ã€ã®ãšãŒãžã§ã³ãå®çŸ©ãã¡ã€ã«ããããŸãã
architect.md
code-reviewer.md
database-reviewer.md
INDEX.md
planner.md
python-reviewer.md
security-reviewer.md
typescript-reviewer.md
~/.claude/logs/agent-invocations.jsonl ã«èšé²ãããŠãã2026幎5æ28æ¥ãã8æ30æ¥ãŸã§ã®682ä»¶ã®ãã°ãéèšãããšãçŽè¿30æ¥éã®åŒã³åºãå
èš³ã¯ãããªããŸãã
=== Agent usage (last 30d) ===
total invocations: 23 unique types: 3
Top 10:
agent calls errors
Explore 19 0
general-purpose 3 0
code-reviewer 1 0
0-call agents (defined locally but not used in 30d): 7
- INDEX
- architect
- database-reviewer
- planner
- python-reviewer
- security-reviewer
- typescript-reviewer
å®çŸ©æžã¿8ãšãŒãžã§ã³ãã®ãã¡ã30æ¥éã§1åã§ãåŒã°ããã®ã¯ code-reviewer ã®1ä»¶ã®ã¿ã§ããæ®ã7ã€ã¯ãŒãåŒã³åºããå®çŸ©ãããšãŒãžã§ã³ãã®87.5%ããå®éã«ã¯ååšããŠããªããåç¶ã®ç¶æ
ã§ããã
çŽè¿7æ¥éã«çµããšããã«æ·±å»ã§ãcode-reviewer ãåå€ã«èœã¡ã0åãšãŒãžã§ã³ãã8ã€ã«å¢ããŸãã
=== Agent usage (last 7d) ===
total invocations: 3 unique types: 2
0-call agents (defined locally but not used in 7d): 8
- INDEX
- architect
- code-reviewer
- database-reviewer
- planner
- python-reviewer
- security-reviewer
- typescript-reviewer
ããã¯åãªãããã£ãããªããã®è©±ã§ã¯ãããŸãããClaude Codeã®ãšãŒãžã§ã³ãå®çŸ©ã¯ã·ã¹ãã ããã³ãããšããŠåžžææ³šå
¥ãããŸããarchitect.md ã®ãããªå€§åãšãŒãžã§ã³ããéããš220è¡ãè¶
ããå®çŸ©ãå
¥ã£ãŠããŸãã䜿ãããããªã7ã€ã®ãšãŒãžã§ã³ãå®çŸ©ãããŒã¯ã³ãæ¶è²»ããæšè«ã®ç²ŸåºŠã«åœ±é¿ãäžãç¶ããŠããããã§ãã
ãå®çŸ©ããïŒæ©èœããŠããããšããæã蟌ã¿
ãšãŒãžã§ã³ããå®çŸ©ããç¬éã®éææã¯æ¬ç©ã§ãããããã§æ¬¡ããã³ãŒããæžãããèªåã§ã¬ãã¥ãŒããŠããããããã¢ãŒããã¯ãã£ãèãããšãã«å°éå®¶ãåããââããä¿¡ãããŸãŸæ°é±éãçµéããŸãã
ãšãããçŸå®ã®Claudeã¯ããšãŒãžã§ã³ããæç€ºçã«æå®ããªãéãæ±çšã«ãŒãïŒgeneral-purposeïŒãExploreãéžã³ãŸããcode-reviewerã®å®çŸ©èª¬æã«ãMUST BE USED for all code changesããšæžãããŠããŠããããã¯å®çŸ©å
ã®æç« ã§ãããClaudeãèªåŸçã«ãã®æç€ºãèªãã§è¡åããããã§ã¯ãããŸãããåŒã³åºãåŽã®ããã³ããããåŒã³åºãå
ã®ããžãã¯ãååšããŠåããŠæ©èœããŸãã
æªäœ¿çšãšãŒãžã§ã³ãã¯2ã€ã®æå³ã§ã³ã¹ããçºçãããŸãã
ããŒã¯ã³ã³ã¹ãã ã·ã¹ãã ããã³ããã«åžžææ³šå ¥ããããšãŒãžã§ã³ãã«ã¿ãã°ã®é·ãã¯ãåŒã³åºãã®ãã³ã«æ¶è²»ãããŸããå®çŸ©ãã¡ã€ã«ãå¢ããã»ã©1ãªã¯ãšã¹ããããã®ããŒã¯ã³æ°ãå¢å ãã倧ããªã³ã³ããã¹ããŠã£ã³ããŠãé£ã朰ããŸãã
èªç¥ã³ã¹ãã ãã©ã®ãšãŒãžã§ã³ããå®éã«æ©èœããŠããããã人éãæåã§ææ¡ããã®ã¯é£ãããå®çŸ©ãã¡ã€ã«ãå¢ããã»ã©ç®¡çãè€éã«ãªããŸãã宿 ãåæ ããªãå®çŸ©ãç©ã¿éãªããšãç°å¢ã®ä¿¡é Œæ§ãäžãããŸããããã®ãšãŒãžã§ã³ãã¯æ¬åœã«åããŠããã®ãïŒããšããçããçãŸããç¬éãèªåŸç°å¢ãžã®ä¿¡é Œã¯æºãããŸãã
è§£æ±ºã®æ¹åæ§ïŒå®æž¬å€ã§å®çŸ©ãåã蟌ã
解決çã¯æèŠã§ã¯ãªã宿°å€ã§å€æããããšã§ãããã°ã«åºã¥ããŠãéå»30æ¥éã§äžåºŠãåŒã°ããŠããªããšãŒãžã§ã³ãããèªåçã«æŽãåºããåé€ãŸãã¯æŽçããéçšãµã€ã¯ã«ãäœããŸãã
ãã®çºæ³ã®ãã€ã³ãã¯äœæ¥ã§ã¯ãªãç°å¢ã«æè³ããããšã§ããã仿¥ãã®ãšãŒãžã§ã³ããåé€ããããšãã1åã®äœæ¥ã§ã¯ãªããããã€ã§ãæªäœ¿çšãšãŒãžã§ã³ããå³åº§ã«ç¢ºèªã§ããã¹ã¯ãªãããååšããŠããããšããç¶æ ãäœããŸããã¹ã¯ãªããã¯ææ¬¡ã§åãã鱿¬¡ã§åãããããã¯cronã§å®æå®è¡ããââéçšã®é »åºŠã¯ããšããæ±ºããããŸããéèŠãªã®ã¯ã宿ž¬å€ã«åºã¥ããŠå€æã§ããç¶æ ã«åžžæããããšã§ãã
ç§ãæå120äžã®èªåŸç°å¢ãåå¹Žã§æ§ç¯ã§ããã®ãããAIãè³¢ããªããããšãžã®æåŸ ã§ã¯ãªãããAIãééã£ãæ¹åã«åããŠããªããããåžžæç£èŠããä»çµã¿ãžã®æè³ãäžå¿ã«ãããŸãããšãŒãžã§ã³ã䜿çšçã®ç£èŠã¯ããã®äžäŸã§ãã
å šäœã®æµã
ä»çµã¿ã¯3å±€ã«åãããŠããŸãã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 1: èšé² â
â Claude Codeã®stop hookã â
â ãšãŒãžã§ã³ãåŒã³åºããJSONLãžæžãåºã â
â â
â ~/.claude/logs/agent-invocations.jsonl â
â â 1è¡1ã¬ã³ãŒã / tsã»session_idã»subagent_typeç â
ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 2: éèš â
â agent-usage-summary.sh ãæå®æéã®ã¬ã³ãŒããéèš â
â â
â - Bash倿®»ïŒåŒæ°ããŒã¹ã»ç°å¢å€æ°ã»ããïŒ â
â - Python3ãã¢ããã¥ã¡ã³ãïŒããžãã¯æ¬äœïŒ â
â â ãŠã£ã³ããŠæéã§ãã£ã«ã¿ â
â â subagent_typeå¥ã«ã«ãŠã³ã â
â â ~/.claude/agents/*.md ãšçªãåãã â
ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Layer 3: åºå â
â Top10åŒã³åºãã©ã³ãã³ã° ïŒ 0åãšãŒãžã§ã³ãäžèЧ â
â â
â â åé€ã»ã¢ãŒã«ã€ãã»åèšèšã®å€æææã«ãªã â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Layer 1: stop hookã«ããJSONLèšé²
Claude Codeã«ã¯ããšãŒãžã§ã³ãåŒã³åºããå®äºããã¿ã€ãã³ã°ã§ä»»æã®ã¹ã¯ãªãããå®è¡ã§ããstop hookããããŸãããã®hookã䜿ããåŒã³åºããããšãŒãžã§ã³ãã®æ
å ±ãJSONLãã¡ã€ã«ãžè¿œèšããŸãã
å®éã®ãã°ã¬ã³ãŒãã¯ãã®ãããªåœ¢åŒã§ãã
{"ts": "2026-08-25T01:32:02.235Z", "session_id": "d82e3fca-d397-4f40-8268-34bdeb9de46a", "cwd": "/dev/affiliate-fc2", "tool_use_id": "toolu_01HQ6HRVEgvnNjqDrmejPZ4S", "subagent_type": "general-purpose", "description": "Find CTA redirect click data for fc2 lane", "duration_ms": 3407, "status": "ok", "caller": {"type": "direct"}}
{"ts": "2026-08-30T08:55:08.361Z", "session_id": "36b40280-ff53-4f66-9582-aa09b7fbec80", "cwd": "/dev/note-autolike", "tool_use_id": "toolu_01RjC237NX1QwsWzVUMqHbvY", "subagent_type": "Explore", "description": "Survey note paid-article infra", "duration_ms": 236, "status": "ok", "caller": {"type": "direct"}}
tsïŒã¿ã€ã ã¹ã¿ã³ãïŒãsubagent_typeïŒãšãŒãžã§ã³ãçš®å¥ïŒãstatusïŒok/errorïŒãéèšã«äœ¿ãäž»èŠãã£ãŒã«ãã§ããduration_ms ããããããåŒã³åºãããšã®æèŠæéãããããŸããç§ã®ç°å¢ã§ã¯çŸåš682ä»¶ãèç©ãããŠããã2026幎5æ28æ¥ã®ååèšé²ãã3ã¶æåã®ãã©ããã³ã°ããŒã¿ã«ãªã£ãŠããŸãã
Layer 2: agent-usage-summary.sh ã®æ§é
éèšã¹ã¯ãªããã¯103è¡ã§ããBashã®å€æ®»ã§åŒæ°ãåãåããããžãã¯ã¯Python3ã®ãã¢ããã¥ã¡ã³ãã§æžããŠããŸããçç±ã¯2ã€ââBashã ãã§ã¯JSONLã®ããŒã¹ãç ©éã«ãªãããšãPythonã®ã¿ã§ã¯åŒæ°åŠçã®ã·ã§ã«çµ±åãé¢åãªããšã§ããäž¡æ¹ã®åŸæé åã䜿ãåããæ§æã§ãã
ã¹ã¯ãªããå šäœã瀺ããŸãã
#!/usr/bin/env bash
# agent-usage-summary.sh â Stop hook ãèšé²ãã agent åŒã³åºããéèš
#
# äœ¿ãæ¹:
# agent-usage-summary.sh # ããã©ã«ã 7d
# agent-usage-summary.sh 30d # 30æ¥
# agent-usage-summary.sh 7d 30d # äž¡æ¹
set -uo pipefail
LOG="$HOME/.claude/logs/agent-invocations.jsonl"
AGENTS_DIR="$HOME/.claude/agents"
WINDOWS=("$@")
if [ ${#WINDOWS[@]} -eq 0 ]; then
WINDOWS=("7d")
fi
if [ ! -f "$LOG" ]; then
echo "no log yet: $LOG"
exit 0
fi
export LOG_PATH="$LOG"
export AGENTS_DIR_PATH="$AGENTS_DIR"
export WINDOWS_CSV="$(IFS=,; echo "${WINDOWS[*]}")"
python3 - <<'PY'
import os, json, datetime, glob, sys
from collections import Counter
log_path = os.environ["LOG_PATH"]
agents_dir = os.environ["AGENTS_DIR_PATH"]
windows = os.environ["WINDOWS_CSV"].split(",")
def parse_window(s):
s = s.strip().lower()
if s.endswith("d"):
return datetime.timedelta(days=int(s[:-1]))
if s.endswith("h"):
return datetime.timedelta(hours=int(s[:-1]))
raise ValueError(f"bad window: {s}")
now = datetime.datetime.now(datetime.timezone.utc)
records = []
with open(log_path, "r", encoding="utf-8", errors="replace") as f:
for line in f:
try:
r = json.loads(line)
except Exception:
continue
ts = r.get("ts", "")
try:
dt = datetime.datetime.fromisoformat(ts.replace("Z", "+00:00"))
if dt.tzinfo is None:
dt = dt.replace(tzinfo=datetime.timezone.utc)
except Exception:
continue
r["_dt"] = dt
records.append(r)
# æ¢ç¥ agent äžèЧïŒããŒã«ã«å®çŸ©ã® md ãã¡ã€ã«åããæšå®ïŒ
known_agents = set()
if os.path.isdir(agents_dir):
for fp in glob.glob(os.path.join(agents_dir, "*.md")):
known_agents.add(os.path.splitext(os.path.basename(fp))[0])
for w in windows:
try:
td = parse_window(w)
except Exception as e:
print(f"[skip {w}]: {e}")
continue
cutoff = now - td
recent = [r for r in records if r["_dt"] >= cutoff]
counts = Counter(r.get("subagent_type", "") for r in recent if r.get("subagent_type"))
errors = Counter(r.get("subagent_type", "") for r in recent if r.get("status") == "error")
print(f"\n=== Agent usage (last {w}) ===")
print(f"total invocations: {len(recent)} unique types: {len(counts)}")
if counts:
print("\nTop 10:")
print(f" {'agent':<40} {'calls':>6} {'errors':>6}")
for name, n in counts.most_common(10):
err = errors.get(name, 0)
print(f" {name:<40} {n:>6} {err:>6}")
if known_agents:
used = set(counts.keys())
unused = sorted(known_agents - used)
print(f"\n0-call agents (defined locally but not used in {w}): {len(unused)}")
for name in unused[:30]:
print(f" - {name}")
if len(unused) > 30:
print(f" ... and {len(unused) - 30} more")
else:
print(f"\n(no local agents dir at {agents_dir}; cannot list 0-call agents)")
PY
èšèšã®ãã€ã³ãã3ã€æããŸãã
è€æ°ãŠã£ã³ããŠã1ã³ãã³ãã§æ¯èŒã§ããã agent-usage-summary.sh 7d 30d ãšå®è¡ãããšã7æ¥éãš30æ¥éã®çµæãé£ç¶ããŠåºåãããŸããã30æ¥ã§ã¯äœ¿ã£ãŠããã7æ¥ã§ã¯0åããšããåŸåå€åãäžç®ã§æŽããŸãã
æ¢ç¥ãšãŒãžã§ã³ãã®çªãåãã㯠glob ã§è¡ãã ~/.claude/agents/*.md ã®ãã¡ã€ã«åããæ¡åŒµåãé€ãããã®ããå®çŸ©æžã¿ãšãŒãžã§ã³ãããšããŠæ±ããŸããæ°ãããšãŒãžã§ã³ãã远å ããŠããã¹ã¯ãªããæ¬äœãä¿®æ£ããã«èªåã§æ€åºå¯Ÿè±¡ã«å ãããŸãã
ãšã©ãŒã«ãŠã³ããåæã«åºåããã status: "error" ã®ã¬ã³ãŒããå¥éèšããŠããããåŒã°ããŠã¯ãããæ¯å倱æããŠããããšãŒãžã§ã³ããå¯èŠåã§ããŸããåŒã³åºãæ°ã ãã§ãªãæåçãŸã§ææ¡ããããšã§ããåããŠãããå£ããŠããããšããå¥çš®ã®åé¡ãçºèŠã§ããŸãã
Layer 3: åºåã®èªã¿æ¹ãšå€æãããŒ
ã¹ã¯ãªããã®åºåã¯2ãããã¯ã«åãããŠããŸããTop 10ã©ã³ãã³ã°ãš0-callãªã¹ãã§ãã
=== Agent usage (last 30d) ===
total invocations: 23 unique types: 3
Top 10:
agent calls errors
Explore 19 0
general-purpose 3 0
code-reviewer 1 0
0-call agents (defined locally but not used in 30d): 7
- INDEX
- architect
- database-reviewer
- planner
- python-reviewer
- security-reviewer
- typescript-reviewer
ãã®ã©ã³ãã³ã°ããèªã¿åããäºå®ã¯ã·ã³ãã«ã§ãã23åã®åŒã³åºãã®ãã¡19åïŒ82.6%ïŒã¯Exploreã§ããExploreã¯ãã¡ã€ã«æ€çŽ¢ã»ã³ãŒã調æ»ã«ç¹åããæ±çšãšãŒãžã§ã³ãã§ãããã«ã¹ã¿ã å®çŸ©ã§ã¯ãªãClaude Codeçµã¿èŸŒã¿ã®æ©èœã§ããã€ãŸããã«ã¹ã¿ã ãšãŒãžã§ã³ãã7ã€ãå®çŸ©ããã®ã«ãå®éã«ã¯æ±çšæ©èœãã䜿ãããŠããªãããšããç¶æ
ã3ã¶æç¶ããŠããããšãæ°å€ã§ç¢ºèªã§ããŸãã
0-callãªã¹ãã«ååãåºããšãŒãžã§ã³ãã«å¯ŸããŠã倿ã¯3æã§ãã
åé€ããã æããã«äœ¿ãããŠããªãããã€åŒã³åºãä»çµã¿ãæ§ç¯ããŠããªãå Žåã¯åé€ããŸããã·ã¹ãã ããã³ããã®ããŒã¯ã³ç¯çŽãšãç°å¢ã®èŠéãã®è¯ããå³åº§ã«æ¹åãããŸãã
ã¢ãŒã«ã€ãããã å°æ¥äœ¿ãå¯èœæ§ããããä»ã¯äžèŠãªå Žå㯠~/.claude/agents/archive/ ã«ç§»åããŸããglob ã®ãã¹ã *.md ã§çµã£ãŠããããããµããã£ã¬ã¯ããªã«ç§»åããã ãã§èªåçã«éèšããé€å€ãããŸãã
åŒã³åºãå ãäœãã ãšãŒãžã§ã³ãã®æ©èœèªäœã¯äŸ¡å€ãããããåŒã°ããŠããªããã ãã®å Žåãstop hookãç¹å®ã®ããã³ãããã¿ãŒã³ã§ãã®ãšãŒãžã§ã³ããæç€ºçã«åŒã³åºãä»çµã¿ã远å ããŸãããã®å Žåãæ°å€ããªããã°ã䟡å€ããããšæã蟌ãã§ããã ããã®ç¶æ ãªã®ã§ãå®è£ åŸã«æ¹ããŠéèšããŠå¹æã確èªããŸãã
å®è£ ã®è©³çް
ååã§å šäœå³ã瀺ããŸãããããããã¯2ã€ã®ã¹ã¯ãªããââstop_agent_tracker.shïŒèšé²ïŒãšagent-usage-summary.shïŒéèšïŒââã®ã³ãŒããæ·±ãèªã¿ãŸããããªãããæžãã®ãããšãã©ããèãªã®ããã«çµããŸãã
stop_agent_tracker.shïŒ2ãã¹æ§é ãæ žå¿
stop hookãåãåãã®ã¯ãã»ãã·ã§ã³çµäºæã«Claude Codeãæšæºå ¥åãžæµããŠãã以äžã®ãããªJSONã§ãã
{"session_id":"36b40280-...","transcript_path":"/.../.claude/projects/.../transcript.jsonl","cwd":"/dev/note-autolike","hook_event_name":"Stop"}
transcript_path ã¯ãã®ã»ãã·ã§ã³å
šäœã®äŒè©±ãã°ãžã®ãã¹ã§ãããšãŒãžã§ã³ããäœãåŒãã ãã¯ããã«æžããŠãããŸãããã ãã1ä»¶ã®ãšãŒãžã§ã³ãåŒã³åºã㯠2ã€ã®å¥ã
ã®è¡ ã«åãããŠèšé²ãããŠããŸãââåŒã³åºããæç¹ã® tool_useïŒçš®å¥ã»åŒæ°ïŒãšãåŠçå®äºåŸã® tool_resultïŒæåŠã»åºåïŒã§ãããã®2è¡ãçªãåãããŠåããŠãäœãããã€ãæåãããããåãããŸãã
ã¹ã¯ãªããã¯ãã®ããã«2ãã¹åŠçãæ¡çšããŠããŸãã
# 第1ãã¹: å
š tool_use ãš tool_result ãã€ã³ããã¯ã¹å
uses = {} # tool_use_id -> (ts, name, input, caller)
results = {} # tool_use_id -> (ts, is_error)
with open(tp, "r", encoding="utf-8", errors="replace") as f:
for line in f:
rec = json.loads(line)
for b in content:
if btype == "tool_use" and b.get("name") == "Agent":
inp = b.get("input") or {}
if "subagent_type" not in inp:
continue
uses[uid] = (ts, b.get("name"), inp, b.get("caller"))
elif btype == "tool_result":
results[rid] = (ts, bool(b.get("is_error")))
1ãã¹ç®ã§transcriptå
šè¡ãèµ°æ»ããusesãšresultsãå¥ã
ã®èŸæžã«ç©ã¿ãŸãã2ãã¹ç®ã§ã¯usesã軞ã«resultsãåŒããŠãããã³ã°ããJSONLãæžãåºããŸãã
ããã§1ã€éèŠãªèšèšå€æããããŸãããããããªãã£ãïŒresultsã«ããŒããªãïŒtool_useã¯ãstatus: "pending" ãšããŠèšé²ããŸãã
res = results.get(uid)
if res:
res_ts, is_error = res
status = "error" if is_error else "ok"
else:
res_ts, status = None, "pending"
Claude CodeãhookãåŒã¶ã®ã¯ã»ãã·ã§ã³çµäºæã§ããã»ãã·ã§ã³éäžã§åŒ·å¶çµäºããå Žåããtool_resultãæžã蟌ãŸããåã«ã»ãã·ã§ã³ãåããå ŽåãpendingãšããŠæ®ããŸãããããããããšã§ãèšé²ãããŠãããå®äºããŠããªããåŒã³åºããåºå¥ã§ããŸãã
duration_ms ã®èšç®ã2ãã¹æ§é ã®æ©æµã§ãã
t0 = parse_ts(use_ts) # tool_use ã®ã¿ã€ã ã¹ã¿ã³ã
t1 = parse_ts(res_ts) # tool_result ã®ã¿ã€ã ã¹ã¿ã³ã
if t0 and t1:
duration_ms = int((t1 - t0).total_seconds() * 1000)
tool_useãštool_resultããããã®ã¿ã€ã ã¹ã¿ã³ãå·®ããšãŒãžã§ã³ãã®å®è¡æéã§ããå®éã®ãã°ã確èªãããšãExploreã®236msã«å¯ŸããŠgeneral-purposeã¯3407msã6830msããã£ãŠããŸãããã®å·®ããã®ãŸãŸããŒã¯ã³ã³ã¹ãã®å·®ã«è¿äŒŒããŸãã
éè€é²æ¢ããžãã¯ãèŠéããŸãããstop hookã¯1ã»ãã·ã§ã³ã§è€æ°åçºç«ããããšããããŸãïŒClaude Codeã®åèµ·åã»åŒ·å¶çµäºåŸã®åæ¥ç¶ãªã©ïŒãåãtool_use_idã2åæžããšéèšãçããŸãã
seen_ids = set()
if os.path.exists(out_path):
with open(out_path, "r", encoding="utf-8", errors="replace") as f:
for line in f:
r = json.loads(line)
if r.get("session_id") == sid and r.get("tool_use_id"):
seen_ids.add(r["tool_use_id"])
æžãåºãåã«JSONLãå
šè¡ã¹ãã£ã³ããåãsession_idå
ã®tool_use_idãSetã«ç©ãã§ãããŸããæžãåºãã«ãŒãã§ã¯seen_idsã«å«ãŸãããã®ãã¹ãããããŸãã682ä»¶ã®ãã°ã§äžåºŠãéè€ãåºãŠããªãã®ã¯ããã®åŠçãæ©èœããŠããããã§ãã
agent-usage-summary.shïŒBash倿®»ïŒPythonå æ žã®åå²çç±
ãã®èšèšãèŠãŠãPythonã ãã§æžãã°ããããšæã人ãããã¯ãã§ããç§ãæåã¯ããæããŸããã
Bash倿®»ãæ®ããçç±ã¯2ã€ãããŸãã
1ã€ç®ïŒåŒæ°åŠçã®æè»æ§ã "$@" ã䜿ãããšã§ã7d 30d ã®ãããªè€æ°åŒæ°ãèªç¶ã«æ±ããŸããPythonã ãš sys.argv ãèªåã§ããŒã¹ããå¿
èŠããããé
åã®æ±ããããç
©éã§ãã
2ã€ç®ïŒç°å¢å€æ°çµç±ã®ããŒã¿åãæž¡ãã ãã¢ããã¥ã¡ã³ãïŒ<<'PY'ïŒå
ã®Python㯠os.environ ã§BashåŽã®å€æ°ãåãåããŸãã
export LOG_PATH="$LOG"
export AGENTS_DIR_PATH="$AGENTS_DIR"
export WINDOWS_CSV="$(IFS=,; echo "${WINDOWS[*]}")"
WINDOWS_CSV ã®çæéšåââIFS=,; echo "${WINDOWS[*]}"ââãèã§ããBashé
åã,åºåãã®æååã«å€æããŠããPythonåŽã«æž¡ããPythonåŽã§.split(",")ããŠæ»ããŸããBashã®é
åã¯ãã¢ããã¥ã¡ã³ãå
ã«çŽæ¥æž¡ããªããããäžæŠæååã«ãšã³ã³ãŒãããæ©æž¡ããå¿
èŠã§ãã
PythonåŽã® parse_window ã¯æååã timedelta ã«å€æããŸãã
def parse_window(s):
s = s.strip().lower()
if s.endswith("d"):
return datetime.timedelta(days=int(s[:-1]))
if s.endswith("h"):
return datetime.timedelta(hours=int(s[:-1]))
raise ValueError(f"bad window: {s}")
çŸæç¹ã§ã¯dïŒæ¥ïŒãšhïŒæéïŒã ã察å¿ããŠããŸããwïŒé±ïŒãmïŒæïŒã远å ãããå Žåãããã®é¢æ°ã ã倿Žããã°å
šäœãåããŸãã
æ¢ç¥ãšãŒãžã§ã³ãã®èªåæ€åºãéèŠãªèšèšã§ãã
known_agents = set()
if os.path.isdir(agents_dir):
for fp in glob.glob(os.path.join(agents_dir, "*.md")):
known_agents.add(os.path.splitext(os.path.basename(fp))[0])
~/.claude/agents/ çŽäžã® *.md ãã¡ã€ã«åïŒæ¡åŒµåé€ãïŒãå
šéšSetã«å
¥ããŸããç§ã®ç°å¢ã§ã¯ archive/ ãµããã£ã¬ã¯ããªã«ãã¡ã€ã«ãç§»åããã ãã§ããã®ãšãŒãžã§ã³ãã¯éèšå¯Ÿè±¡ããå€ããŸããã¹ã¯ãªããåŽã®ä¿®æ£ã¯äžèŠã§ããçŸåš archive/ ãã£ã¬ã¯ããªïŒ2024幎8æ29æ¥äœæïŒã«ä»¥åã®ãšãŒãžã§ã³ãå®çŸ©ãç§»åãããŠããŸãã
ç§ãè©°ãŸã£ã話
å®éã«åããŸã§ã®çµç·¯ã3ã€æžããŸããã©ãããåãã¯ããªã®ã«ãªããèšé²ãããªããç³»ã®åé¡ã§ãçç¶ããåå ã«ãã©ãçããŸã§ã«æéãããããŸããã
è©°ãŸãâ ïŒãšãŒãžã§ã³ãã®ããŒã«åããTaskãã§ã¯ãªããAgentã
æåã«æžããã³ãŒãã¯transcriptãã name == "Task" ãæ¢ããŠããŸãããClaude Codeã®å€åãã®APIã§ã¯ãTaskããšããååã§ãšãŒãžã§ã³ãåŒã³åºãã玹ä»ãããŠããããã§ãã
ãããå®éã«transcriptãçŽæ¥éããŠäžèº«ã確èªãããšãå
šã¬ã³ãŒãã« "name": "Agent" ãšæžãããŠããŸããã
{"type": "tool_use", "name": "Agent", "input": {"subagent_type": "Explore", ...}}
name == "Task" ã§ãã£ã«ã¿ããŠãããããå
šä»¶ã¹ã«ãŒããŠäœãèšé²ãããªãç¶æ
ã2æ¥ç¶ããŸãããgrep '"name"' ~/.claude/projects/*/transcript.jsonl | head -5 ã§çŽæ¥ç¢ºèªããŠåããŠæ°ã¥ããŸããããã¥ã¡ã³ã衚èšãšå®ãã¡ã€ã«ã®ä¹é¢ã§ãã
ä¿®æ£ã¯1è¡ã§ããã
# ä¿®æ£å
if btype == "tool_use" and b.get("name") == "Task":
# ä¿®æ£åŸ
if btype == "tool_use" and b.get("name") == "Agent":
æèšã¯ãããã¥ã¡ã³ããä¿¡ããå®ãã¡ã€ã«ãèªãããtranscript.jsonlã¯æ®éã®JSONLãªã®ã§ãã€ã§ãçŽæ¥ç¢ºèªã§ããŸãã
è©°ãŸãâ¡ïŒsubagent_type ã input.subagent_type ã«ãã
tool_useã®æ§é ãæ£ç¢ºã«ææ¡ããªãã£ãããšã§çãŸããåé¡ã§ããæå㯠b.get("subagent_type") ã§åãããšããŠããŸãããããã§ã¯åžžã« None ãè¿ããŸãã
å®éã®transcriptã¬ã³ãŒããæ¹ããŠç¢ºèªãããšããããªã£ãŠããŸãã
{
"type": "tool_use",
"id": "toolu_01RjC237NX1QwsWzVUMqHbvY",
"name": "Agent",
"input": {
"subagent_type": "Explore",
"description": "Survey note paid-article infra",
"prompt": "..."
}
}
subagent_type 㯠input ã®äžã«ãããŸããåãæ¹ã¯ b.get("input", {}).get("subagent_type") ãæ£è§£ã§ããçŸåšã®ã³ãŒãã§ã¯ inp = b.get("input") or {} ãšããŠå
ã«inputãåãåºãããããã inp.get("subagent_type") ã§ååŸããŠããŸãã
åé¡ãèµ·ãããšãã682ä»¶ããã¯ãã®ãã°ãæåã¯0ä»¶ã§ãããif "subagent_type" not in inp: continue ãšããã¬ãŒãç¯ãå
šä»¶ã匟ããŠããããã§ãããããã°ã«ã¯ CC_AGENT_TRACKER_DEBUG=1 ç°å¢å€æ°ãèšå®ããŠdebugãã°ãæå¹åããŸããã
CC_AGENT_TRACKER_DEBUG=1 bash ~/.claude/hooks/stop_agent_tracker.sh <<< '...'
stop_agent_tracker.log ã« recorded=0 total_uses=0 ãåºãŠããtool_useã1ä»¶ãèªèãããŠããªããããšã確èªã§ããŸãããããã§transcriptã®raw JSONãçŽæ¥éããŠinputã®æ§é ã確èªãã1è¡ã§çŽããŸããã
è©°ãŸãâ¢ïŒset -uo pipefail ã§WINDOWSé
åã空ã®ãšãæ»ã¬
set -uo pipefail ã¯æªå®çŸ©å€æ°åç
§ãå³åº§ã«ãšã©ãŒã«ããŸããããèªäœã¯æ£ããèšå®ãªã®ã§ãããåŒæ°ãªãã§åŒãã ãšãã« ${#WINDOWS[@]} ã0ãè¿ãåã« ${WINDOWS[*]} ãåç
§ããããšããŠãšã©ãŒãåºãŸããã
å ·äœçã«ã¯æåã®ã³ãŒããããã§ããã
WINDOWS=("$@")
export WINDOWS_CSV="$(IFS=,; echo "${WINDOWS[*]}")" # 空é
åã§åé¡çºç
åŒæ°ãªãã§åŒã¶ãš WINDOWS ã空é
åã«ãªããŸãã-u ãã©ã°ãããç°å¢ã§ã¯ç©ºé
åã®å±éããšã©ãŒã«ãªãããšãããïŒzshãšbashã§æåã埮åŠã«ç°ãªããŸãïŒãWINDOWS_CSV ã空ã«ãªãããææªã¹ã¯ãªãããçµäºããŸãã
ä¿®æ£ã¯ãWINDOWS_CSV ã®ãšã¯ã¹ããŒãåã«ããã©ã«ãå€ãå
¥ããããšã§ãã
WINDOWS=("$@")
if [ ${#WINDOWS[@]} -eq 0 ]; then
WINDOWS=("7d")
fi
export WINDOWS_CSV="$(IFS=,; echo "${WINDOWS[*]}")"
空ãã§ãã¯ãå
ã«æžãŸããããã©ã«ãå€ã代å
¥ããŠãããšã¯ã¹ããŒããããset -u ç°å¢ã§ã¯ã倿°ã䜿ãåã«å¿
ãå€ã確å®ãããããšããåçŽãªèŠåãå®ãã ãã§ãã
ãã®åé¡ã¯cronã§èªåå®è¡ãããšãã«åããŠè¡šé¢åããŸãããæåå®è¡ã§ã¯åŒæ°ãæž¡ãã®ã§æ°ã¥ãããcronå®çŸ©ã«åŒæ°ãªãã§æžããŠãããããæ¯æ©ãµã€ã¬ã³ãã«å€±æãç¶ããŠãããšãã話ã§ããtail -20 /var/log/... ã確èªããŠåããŠã1ä»¶ãèšé²ãããŠããªãå€ãããããšæ°ã¥ããŸããã
ãã°ã«æ®ãæåã®ã¬ã³ãŒãã®ã»ãã·ã§ã³IDã TEST-AGENT-TRACKER-001 ãšããæååã«ãªã£ãŠããã®ãããããã°éçšã®ç£ç©ã§ããhookãæ£ããåããæåã§ãããŒããŒã¿ãæµããŠãã¹ãããéã®èšé²ããã®ãŸãŸ682ä»¶ã®å
é ã«å±
座ã£ãŠããŸããæ¬çªãã°ãšãã¹ãããŒã¿ãæ··åšããŠããã®ã¯äžæ Œå¥œã§ãããéèšããžãã¯ã¯ã¿ã€ã ã¹ã¿ã³ãã§æéãã£ã«ã¿ããã®ã§å®å®³ã¯ãããŸããã
è©°ãŸãâ£ïŒcode-reviewer ãå®çŸ©å
ã®ãMUST BE USEDããèªãŸãªã
ããã¯æè¡çãªãã°ã§ã¯ãªããããããã®èª€è§£ããããè©°ãŸãã§ãã
code-reviewer.md ã®åé ã®descriptionã«ã¯ MUST BE USED for all code changes ãšæžããŠãããŸãããšãŒãžã§ã³ããå®çŸ©ããåœåããããã§ã³ãŒã倿Žã®ãã³ã«èªåã§ã¬ãã¥ãŒãèµ°ãããšä¿¡ããŠããŸããã
ãšãããå®éã®30æ¥éèšã§ã¯ code-reviewer ã®åŒã³åºãã¯1åã ãã§ãã
ClaudeããšãŒãžã§ã³ããéžã¶ä»çµã¿ãæ¹ããŠç¢ºèªãããšãdescriptionã¯ãã©ã®ãšãŒãžã§ã³ããéžã¶ã倿ããããã®ãã³ããã§ãããããã®ãšãŒãžã§ã³ãã匷å¶çã«åŒã¶åœä»€ãã§ã¯ãããŸãããåŒã³åºãåŽã®ããã³ãããhookã§æç€ºçã«æå®ããªãéããClaudeã¯æ±çšã«ãŒããéžã³ãŸãã
MUST BE USED ãšãã匷ãæèšã¯ããšãŒãžã§ã³ããéžãã ããšã«ãã®äžã§å®ãã¹ãã«ãŒã«ãšããŠæ©èœããŸãããšãŒãžã§ã³ãå€éšããã®åŒ·å¶èµ·åã«ã¯å¹ããŸããã
ãããçè§£ããäžã§ããã¹ãããšã¯2æã§ããâ ãã³ãŒã倿ŽåŸã¯ code-reviewer ã䜿ãããšããæç€ºãstop hookãããã³ãããã³ãã¬ãŒãã«çµã¿èŸŒããâ¡ãŸãã¯ãã©ãã䜿ããªããªãæ¶ããã
ç§ã¯çŸæç¹ã§â¡ãéžãã§ããŸããcode-reviewer ã¯30æ¥éã§1åããåŒã°ããŠãããããã®1åã¯æåã§æç€ºããå Žåã§ããä»çµã¿ãäœããªãéãåŒã³åºãæ°ã¯å¢ããŸããã323è¡ã®å®çŸ©ãã¡ã€ã«ãã·ã¹ãã ããã³ãããå æãç¶ããã³ã¹ãã®ã»ããããå°æ¥äœ¿ãããããšããæåŸ
å€ãäžåããšå€æããŸããã
ãã®å€æãäžããã®ããæ°å€ããã£ãããã§ããã30æ¥1åããšããäºå®ããªããã°ããããããããåããŠãããããããªãããšããææ§ãªæåŸ ãæ®ãç¶ããŸããã
å®è£ ãšå€±æã®è©±ããŸãšããŸãã
ã¹ã¯ãªãã2æ¬ã§å®çµãããã®ä»çµã¿ã®èã¯ãã確èªããããšãã«ãã€ã§ã宿°å€ãåºãããšããç¶æ ãç¶æããããšã§ããæ°å€ãããã°å€æã§ããŸããæ°å€ããªããã°æåŸ ã§åãç¶ããç¡é§ãªããŒã¯ã³ãšã·ã¹ãã ããã³ããã®è¥å€§åãéãã«ç©ã¿éãªããŸãã
å®çŸ©ãã¡ã€ã«ãå¢ãããããåŒã°ããŠããããæž¬ãä»çµã¿ãå ã«äœãââãã®é åºããClaude CodeãèªåŸç°å¢ãšããŠè²ãŠããšãã®åºæ¬å§¿å¢ã§ãã
ã€ãŸãããã€ã³ã
ååã»äžæ®µã§4ã€ã®è©°ãŸããæžããŸãããããã§ã¯ãç°å¢åºæããéçšãã§ãŒãºããè§£éãã¹ããšããåãå£ã§ã远å ã®è©°ãŸããã€ã³ããåæããŸããå®éã«èžãã ãã®ã ãã§ãã
cronããå®è¡ãããšPATHãæ»ãã§ããã
æåå®è¡ã§ã¯åãã®ã«ãcronå®çŸ©ã§å®è¡ãããš python3: command not found ã§èœã¡ããcronã®å®è¡ç°å¢ã«ã¯ ~/.zshrc ã ~/.profile ãèªã¿èŸŒãŸãããPATH 㯠/usr/bin:/bin çšåºŠãããªãã/usr/local/bin/python3 ã nvm é
äžã® node ãèŠããªããªãã察çã¯2ã€ââã¹ã¯ãªããåé ã§ PATH ãããŒãã³ãŒãããããcronå®çŸ©ã®å
é è¡ã« PATH=/usr/local/bin:/usr/bin:/bin ãæžããç§ã¯åŸè
ãæ¡çšããŠããŸããHOME ãèšå®ãããŠããªãã±ãŒã¹ãããããã~/ ã§ã¯ãªã /Users/èªåã®ã¢ã«ãŠã³ã/ ã®çµ¶å¯Ÿãã¹ãcronã«æžãå¿
èŠããããŸãïŒã¹ã¯ãªããæ¬äœã® $HOME 㯠HOME ç°å¢å€æ°ãèšå®ãããŠããã°åãã®ã§åé¡ãªãïŒã
JSONL 1è¡ãå£ããŠããŠãã¹ã¯ãªããå šäœãæ¢ããªãã
682ä»¶ã®ãã°ãèç©ããŠãããšãéäžã«äžå®å
šãªJSONè¡ãæ··å
¥ããããšããããŸããClaude CodeãhookãåŒã³åºãéäžã§ã»ãã·ã§ã³ãåããå ŽåãæåŸã®ã¬ã³ãŒããäžéå端ã«ãªãããšããããŸããjson.loads ãtry/exceptã§å²ãŸãã«æžããšã1è¡ã®ç Žæã§ã¹ã¯ãªããå
šäœãæ»ã«ãŸããéèšã¹ã¯ãªããã®çŸè¡ã³ãŒãã§ã¯ except Exception: continue ã§ã¹ãããããŠãããå£ããè¡ãç¡èŠããŠæ®ããåŠçããŸããããããªå Žåã¯çµ¶å¯Ÿã«æ¥ãªãããšæãtry/exceptãçç¥ãããšã3ã¶æåŸã®ãã°ãå¢ããé ã«åããŠèœã¡ãŸãã
glob("*.md") ãã¢ãŒã«ã€ããã£ã¬ã¯ããªãæŸãã
glob.glob(os.path.join(agents_dir, "*.md")) 㯠~/.claude/agents/ çŽäžã® .md ãã¡ã€ã«ã ãã察象ã«ããŸããarchive/ ãµããã£ã¬ã¯ããªã«ç§»åãããã¡ã€ã«ã¯å«ãŸããŸããââããã¯æå³éãã§ãããšããã glob.glob(os.path.join(agents_dir, "**/*.md"), recursive=True) ã«æžãæãããšãã¢ãŒã«ã€ãæžã¿ã®ãšãŒãžã§ã³ãããå®çŸ©æžã¿ããšããŠæ±ããã0-callãªã¹ãã«åã³ååãåºãŸãããã¢ãŒã«ã€ãããã®ã«æ¶ããŠããªãããšããç¶æ
ã«ãªããŸããrecursive=True ã¯ä»ããªãã®ãæ£è§£ã§ãã
INDEX.md ããšãŒãžã§ã³ããšããŠèª€æ€åºãããã
ç§ã® ~/.claude/agents/INDEX.md ã¯ãšãŒãžã§ã³ãå®çŸ©ã§ã¯ãªãããã£ã¬ã¯ããªã®çŽ¢åŒãã¡ã€ã«ã§ããããã glob("*.md") ã¯æ¡åŒµåããèŠãªããããINDEX ãšããååããå®çŸ©æžã¿ãšãŒãžã§ã³ãããšããŠéèšã«å
¥ããŸããçµæã0-callãªã¹ãã«åžžã« INDEX ãåºãŸããå®å®³ã¯ãªããã®ã®ããªã¹ããèŠããã³ã«ãããã¯äœã ã£ãããšèããã³ã¹ããããããŸãã察çã¯INDEXãã¡ã€ã«ããµããã£ã¬ã¯ããªãžç§»ãããã¹ã¯ãªããåŽã«é€å€ãªã¹ããæã€ãããããã¯æåãããããããã¡ã€ã«ã眮ããªãããšã§ããçŸç¶ã¯ãã®ãŸãŸã«ããŠããINDEXã¯åžžã«0åã§æ£åžžããšé ã«å
¥ããŠããŸãã
Explore ã general-purpose 㯠0-callãªã¹ãã«åºãªãçç±ããããã«ããã
éèšã®0-callãªã¹ãã«åºãã®ã¯ã~/.claude/agents/ ã«ãã¡ã€ã«ãååšãããåŒã°ããŠããªããã®ãã ãã§ããExplore ã general-purpose ã¯Claude Codeçµã¿èŸŒã¿ã®ãšãŒãžã§ã³ãã§ãããããŒã«ã«ã« .md ãã¡ã€ã«ããããŸããããã®ãã known_agents ã«å«ãŸããã0-callãªã¹ãã«ã¯åºãŸãããããã¯ä»æ§éãã§ãããæåã¯ããªã Explore ã¯åºãªãã®ãããšæ··ä¹±ããŸãããéèšã®Top 10ã«çµã¿èŸŒã¿ãšãŒãžã§ã³ããäžäœãå ããæ§é ã«ãªã£ãŠããããšãææ¡ããäžã§ãªã¹ããèªãå¿
èŠããããŸãã
stop hookãèµ°ããªãã±ãŒã¹ãããã
stop hookã¯ã»ãã·ã§ã³æ£åžžçµäºæã«åŒã°ããŸããCtrl+Cã«ãã匷å¶çµäºãããã»ã¹ã®killãClaude Codeã®ã¯ã©ãã·ã¥ã§ã¯çºç«ããŸããããã®ããããã®é·ãã»ãã·ã§ã³ãèšé²ãããŠããªãããšããäºæ ãèµ·ããŸãã682ä»¶ã®ãã¡äœä»¶ãæ¬ æããŠãããã¯ç¢ºèªã§ããŸãããããèšé²ãããåã ãåæã§ããããšããåæã§éçšããŠããŸããå®ç§ãªèšé²ãæ±ãããšéçšãæ¢ãŸããŸãã
pending ã¹ããŒã¿ã¹ã®ã¬ã³ãŒããéèšã«æ··å
¥ããã
status: "pending" ã®ã¬ã³ãŒãã¯ã»ãã·ã§ã³éäžã§èšé²ããããã®ã§ããéèšã¹ã¯ãªããã¯statusã§ãã£ã«ã¿ããå
šä»¶ãã«ãŠã³ãããŸããã€ãŸããéå§ãããå®äºãããäžæãã®åŒã³åºããåŒã³åºãæ°ã«å«ãŸããŸããå®éã®682ä»¶ã®å
èš³ã確èªãããšpendingã¯ããå°æ°ã§ããã粟床ãäžãããå Žå㯠"status" != "pending" ã®æ¡ä»¶ã远å ããå¿
èŠããããŸããçŸç¶ã¯ãå€å°ã®èª€å·®ã¯èš±å®¹ãããéçšã§ãã
ãšã©ãŒçã®è§£éãééããã
Top 10ã® errors åã¯ãŒãã䞊ãã§ããŸãããããã¯ãšã©ãŒãäžåçºçããŠããªããšããæå³ã§ã¯ãããŸãããerrors ãšããŠã«ãŠã³ããããã®ã¯ status: "error" ã®ã¬ã³ãŒãã®ã¿ã§ãããšãŒãžã§ã³ããåŒã°ããçµæãåçãäžå®å
šã ã£ããããã¡ã€ã«ãèŠã€ããããªãã£ãããšããçµæã¯ãã¹ãŠ ok ãšããŠèšé²ãããŸããããšã©ãŒæ°ãå°ãªãïŒå¥å
šã«åããŠãããã¯èšãããã§ããèšé²ã¬ãã«ã®èŽåœçãšã©ãŒã¯å°ãªãããšèªãã¹ãã§ãã
è€æ°ãããžã§ã¯ãã«ãŸããããš cwd ãæ··åšããã
JSONLã®åã¬ã³ãŒãã«ã¯ cwd ãèšé²ãããŠããŸããç§ã®ãã°ã«ã¯ /dev/affiliate-fc2ã/dev/note-autolikeã/dev/... ãæ··åšããŠããŸããçŸåšã®éèšã¹ã¯ãªããã¯ãããžã§ã¯ããåºå¥ããå
šä»¶ãåç®ããŸããããããžã§ã¯ãAã§ã¯ Explore ãå€çšãããŠãããããããžã§ã¯ãBã§ã¯äžå䜿ãããŠããªãããšããåæããããå Žåã¯ãcwd ãã£ãŒã«ãã§ãã£ã«ã¿ãããªãã·ã§ã³ã远å ããå¿
èŠããããŸããä»ã¯å
šç€Ÿéèšã ãã§ååãªã®ã§æªå®è£
ã§ããããããžã§ã¯ãæ°ãå¢ããã察å¿ããäºå®ã§ãã
å®çŸ©ãã¡ã€ã«ã®ãµã€ãºæã軜èŠããŠããã
0-callãšãŒãžã§ã³ããããŸããããããšæŸçœ®ããã¡ã§ãããå®éã«æ°å€ãåºããšèŠæ¹ãå€ãããŸããçŸåš8ãã¡ã€ã«ã®åèšã¯109,852ãã€ãïŒçŽ107KBïŒã»1,221è¡ã§ããå
èš³ã§å€§ããã®ã code-reviewer.mdïŒ323è¡ïŒãplanner.mdïŒ221è¡ïŒãarchitect.mdïŒ220è¡ïŒãããããæ¯ãªã¯ãšã¹ãã®ã·ã¹ãã ããã³ããã«æ³šå
¥ãããŸãã107KBãã©ã®çšåºŠã®åœ±é¿ãæã€ãã¯ã³ã³ããã¹ããŠã£ã³ããŠå
šäœã®äœ¿ãæ¹æ¬¡ç¬¬ã§ãããã䜿ã£ãŠããªãå®çŸ©ãæ¶ãããåçãéããªã£ãããšããäœæã¯å®éã«åŸãããŸããæ°å€åãããšãã£ãšè
°ãäžãããŸãã
ãã¹ããã©ã¯ãã£ã¹
å®éã«éçšããŠå¹æããã£ããã®ãéã«å€±æããŠããåŸãæèšããŸãšããŸãã
1. ã¹ã¯ãªãããäœãåã«ãã°åœ¢åŒãçãã¡ã€ã«ã§ç¢ºèªããã
grep '"name"' ~/.claude/projects/*/transcript.jsonl | head -5 ãæåã«å©ãã"Task" ã "Agent" ããsubagent_type ãã©ã®éå±€ã«ãããã¯ãããã¥ã¡ã³ãã§ã¯ãªãå®ãã¡ã€ã«ãæ£ã§ãããã®1ã³ãã³ãã2æ¥éã®ç¡é§ãé²ããŸãã
2. ãå®çŸ©ãããšãŒãžã§ã³ããæ©èœããŠãããã¯å®æž¬ãããŸã§ä¿¡ããªãã
MUST BE USED ãšããæèšã¯ããã®ãšãŒãžã§ã³ããéžã°ããããšã®å
éšã«ãŒã«ã§ãããšãŒãžã§ã³ãå€éšããã®åŒ·å¶åŒã³åºãã«ã¯å¹ããŸãããå®çŸ©çŽåŸã« agent-usage-summary.sh 7d ãå®è¡ããŠãç¿é±ã«0åã®ãŸãŸãªããåŒã³åºãå
ãäœãããåé€ããããã峿±ºããŸãã
3. éèšãŠã£ã³ããŠã¯7æ¥ãš30æ¥ã®2ã€ãåžžã«äžŠã¹ãã
agent-usage-summary.sh 7d 30d ã®çµã¿åããã§ããæè¿äœ¿ãå§ãããã以åã¯äœ¿ã£ãŠãããæè¿äœ¿ã£ãŠããªããã®äž¡æ¹ã1ã³ãã³ãã§èŠããŸãã30æ¥ã§1åã ãåŒã°ããŠãããšãŒãžã§ã³ãã¯ã7æ¥éèšã§ã¯0åã«ãªããŸãããã®å·®ããå¶ç¶1å䜿ã£ãçšåºŠãã§ããããšã瀺ããŸãã
4. åé€ãæãããªããã¢ãŒã«ã€ãã䜿ãåããã
ãå°æ¥äœ¿ãããããšããæèãã¿ãŒã³ãäžèŠãªãšãŒãžã§ã³ããæž©åããŸããå€æåºæºãã·ã³ãã«ã«ããŠãã ããââã30æ¥ãŒãåãã€åŒã³åºãä»çµã¿ãååšããªããªãåé€ããã以å€ã¯ã¢ãŒã«ã€ãããã¢ãŒã«ã€ã㯠~/.claude/agents/archive/ ã«ç§»åããã ãã§ãå¿
èŠã«ãªãã°æ»ããŸããglobãçŽäžããèŠãªããããç§»åããç¬éã«éèšããå€ããŸãã
5. åé€åŸã«ããéèšãåããŠå¹æã確èªããã
ãšãŒãžã§ã³ããåé€ããã agent-usage-summary.sh 30d ã§0-callãªã¹ããçããªã£ãããšã確èªããŸãããåé€ããã¯ããªã®ã«ãŸã åºãŠããããšãã¯ãã¡ã€ã«ãæ®ã£ãŠããããå¥ã®å Žæã«ã³ããŒããããŸãã倿Žã®ååŸã§æ°å€ãæ¯èŒããç¿æ
£ããç°å¢ã®ä¿¡é Œæ§ãç¶æããŸãã
6. stop hookã®èšé²ã¯ã»ãã·ã§ã³çµäºåŸã«æå確èªã§ããããã«ããŠããã
tail -5 ~/.claude/logs/agent-invocations.jsonl | python3 -m json.tool ã§ãã€ã§ãææ°5ä»¶ã確èªã§ããŸããã仿¥ã®ã»ãã·ã§ã³ãèšé²ãããããã確èªããç¿æ
£ããhookã®æ»æŽ»ç¢ºèªã«ãªããŸãã1é±éèšé²ããªããã°hookãå£ããŠãããµã€ã³ã§ãã
7. ãšã©ãŒã«ãŠã³ããçªç¶å¢ãããåªå çã«èª¿æ»ããã
平垞æã¯ãšã©ãŒæ°ããŒãã§ããTop 10ããŒãã«ã§ errors åã«æ°åãåºããããã®ãšãŒãžã§ã³ããåé¡ãèµ·ãããŠããŸããgrep '"status":"error"' ~/.claude/logs/agent-invocations.jsonl ã§è©²åœã¬ã³ãŒããæœåºããsession_id ããtranscriptã远ã£ãŠäœãèµ·ãããã調ã¹ãŸãããšã©ãŒçã®ç£èŠã¯äœ¿çšçã®ç£èŠãšåããããéèŠã§ãã
8. pending ã¹ããŒã¿ã¹ã¯å¥éèšããŠæ¬ æçãææ¡ããã
宿çã« grep '"status":"pending"' ~/.claude/logs/agent-invocations.jsonl | wc -l ã確èªããŸãã682ä»¶äžã®pendingæ°ãå¢å åŸåã«ããå Žåã匷å¶çµäºãå€ãïŒïŒã»ãã·ã§ã³ãäžå®å®ïŒããhookã®åŠçãéäžã§èœã¡ãŠãããã®ã©ã¡ããã§ããæ¬ æç10%æªæºãªã蚱容ããã以äžãªãåå 調æ»ã«åããŸãã
9. cronå®çŸ©ã§ã¯ HOME ãš PATH ãæç€ºããã
0 9 * * 1 HOME=/Users/èªå/ PATH=/usr/local/bin:/usr/bin:/bin bash ~/claude/scripts/agent-usage-summary.sh 7d 30d >> ~/agent-weekly.log 2>&1
HOME 㯠$HOME ã®å±éãã§ããªãããå€ãããŒãã³ãŒãããŸããPATH 㯠python3 ãèŠããå ŽæãŸã§å«ããŸããåºåã >> ~/agent-weekly.log ã«ãªãã€ã¬ã¯ãããŠãããšã倱æãããšãã«çç±ãããããŸãã
10. éèšã鱿¬¡ã¬ããŒããšããŠèšé²ã«æ®ãã
agent-usage-summary.sh 7d 30d >> ~/.claude/logs/agent-weekly-report.log ã鱿¬¡cronã«çµã¿èŸŒã¿ããã°ãèç©ããŸããã2ã¶æå㯠python-reviewer ãæ5ååŒã°ããŠãããä»ã¯0åããšããå€åããã©ã€ãã©ãªã®å€æŽãäœæ¥å
容ã®ã·ãããåæ ããŠããããšããããŸããæç³»åã§å€åã远ãããšãšãŒãžã§ã³ãèšèšã®æ¯ãè¿ããã§ããŸãã
11. åŒã³åºãããžãã¯ãäœãåã«ãšãŒãžã§ã³ããå®çŸ©ããªãã
ãå®çŸ©ããŠããåŒã³åºãå ãèãããã®é åºãåé¡ã®æ ¹æ¬ã§ãããšãŒãžã§ã³ããå®çŸ©ãããšãã¯ãåæã«ãããããã€ã»ã©ããã£ãŠåŒã¶ãããæ±ºããŸããhookãããã³ãããã³ãã¬ãŒããç¹å®ã³ãã³ãåŸã®èªåå®è¡ââãããããååšããªãéããå®çŸ©ãã¡ã€ã«ã¯ã·ã¹ãã ããã³ãããè¥å€§åãããã ãã§ãã
12. æ¢åãšãŒãžã§ã³ãã®åŒã³åºãæ°ã確èªããŠããæ°ãããšãŒãžã§ã³ãã远å ããã
远å åã« agent-usage-summary.sh 30d ãå®è¡ãã0-callãªã¹ããé·ããã°ãŸãæŽçããŸãããæ°ãããšãŒãžã§ã³ãã远å ãããå€ããã®ã䜿ãããªããªã£ããã§ã¯ãªããã䜿ãããŠãããã®ã ãååšãããç°å¢ãä¿ã¡ãŸããå®çŸ©ãã¡ã€ã«ã®ç·éãå°ããã»ã©ãClaude CodeããšãŒãžã§ã³ããéžã¶å€æãæå¿«ã«ãªããŸãã
13. duration_msã䜿ã£ãŠéããšãŒãžã§ã³ããææ¡ããã
Explore ã®å¹³åå®è¡æéã¯236msãgeneral-purpose ã¯3,407msã6,830msã§ããéããšãŒãžã§ã³ããé »ç¹ã«åŒã°ããŠãããªãããã®çšéã Explore ã§ä»£æ¿ã§ããªããæ€èšãã䟡å€ããããŸããduration_msã¯JSONLã«èšé²ãããŠãããããpython3 -c "import json,statistics; data=[json.loads(l) for l in open('~/.claude/logs/agent-invocations.jsonl')]; ..." ã§å¹³åã»äžå€®å€ãåºããŸãã
ãŸãšã
ãå®çŸ©ããïŒæ©èœããŠããããšããæã蟌ã¿ã¯ãClaude Codeç°å¢ãè²ãŠãäžã§æãéããªã³ã¹ããçã¿ãŸãã
ä»åã®å®æž¬ã§ã¯ã8ãšãŒãžã§ã³ãã®å®çŸ©ã®ãã¡30æ¥éã§åŒã°ããã®ã¯1çš®é¡ã»1åã ãã§ãããæ®ã7ã€ã¯åèš1,100è¡ã»çŽ95KBã®å®çŸ©ãæ¯ãªã¯ãšã¹ãã®ã·ã¹ãã ããã³ãããå æãç¶ããŠããŸããããããå¯èŠåããã®ã2æ¬ã®ã¹ã¯ãªããã§ãââstop_agent_tracker.sh ããšãŒãžã§ã³ãåŒã³åºããJSONLãžèšé²ããagent-usage-summary.sh ãæéã»ãšãŒãžã§ã³ãå¥ã«éèšããŠ0-callãªã¹ããåºåããŸãã
ä»çµã¿ã®ãã€ã³ãã3ã€ã«çµããŸãã
transcript.jsonlã®2ãã¹åŠçã tool_useãštool_resultã¯å¥è¡ã«èšé²ãããŠããŸããäž¡è ãçªãåãããŠåããŠãäœãã»ãã€ã»æåŠã¯ããæããŸãã1ãã¹ã§æžããšçæ¹ããåãããèšé²ãäžå®å šã«ãªããŸãã
Bash倿®»ïŒPythonå æ žã®åæ¥ã åŒæ°åŠçãšç°å¢å€æ°ã®åãæž¡ãã¯Bashã«ä»»ããJSONLã®ããŒã¹ãšéèšã¯Pythonã«ä»»ããŸããã©ã¡ããäžæ¹ã ãã§æžãããšãããšãåŸæã§ãªãåŠçã§è©°ãŸããŸãã
~/.claude/agents/*.md ãšã®çªãåããã éèšãåºã0-callãªã¹ãã¯ããã°ã ãã§ã¯äœããŸããããå®çŸ©ããŠãããåŒã°ããŠããªãããæ€åºããã«ã¯ããã¡ã€ã«ã·ã¹ãã åŽã®æ
å ±ãå¿
èŠã§ããglobã§ãã¡ã€ã«åãååŸããŠSetã§å·®åãåã1段éãããã®ã¹ã¯ãªããã®æ žå¿ã§ãã
åé€ã¯æããããŸãããã¢ãŒã«ã€ããžç§»åããã ãã§éèšããå€ããå¿ èŠã«ãªãã°æ»ããŸãããæ°å€ããªããã°å€æã§ããªããæ°å€ãããã°è¿·ããªããââãããèªåŸç°å¢ãè²ãŠããšãã®åºæ¬å§¿å¢ã§ãã
æå120äžãæ¯ããŠããã®ã¯AIã®è³¢ãã§ã¯ãªãããåããŠãããæž¬ããç°å¢ãã§ããæž¬ããããåãããåããããAIãæ¬æ¥ã®äœæ¥ã«éäžã§ããããã®ãµã€ã¯ã«ã2æ¬ã®ã¹ã¯ãªããã§åããŠããŸãã
ä»çµã¿ã®å
šäœåã»æ120äžã®å
èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- å¶äœç©ã»èšäºã¯ bokuwalily.com ã«ãŸãšããŠããŸãð¥ïž
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ