name: 上下文报告 description: 分析当前项目的Claude代码上下文效率。在评估会话效率或优化Claude代码使用时调用。 allowed-tools: Bash(jq:), Bash(find:), Bash(wc:), Bash(du:), Bash(sort:), Bash(uniq:), Bash(head:), Bash(cat:), Bash(basename:), Bash(dirname:), Bash(bc:), Bash(date:), Bash(ls:), Bash(tr:)
上下文效率报告
分析当前项目的Claude代码JSONL会话数据,生成上下文效率报告。
何时调用
- 当审查Claude代码会话效率时
- 为了理解模型使用模式
- 当优化以降低成本时
- 完成项目后审查使用情况
指令
项目路径检测
当前工作目录为:$ARGUMENTS(如果提供)或 $CWD
将路径转换为Claude项目文件夹格式:
- 将
/替换为- - 项目文件夹位于:
~/.dotfiles/claude.symlink/projects/
分析脚本
为当前项目运行此分析:
#!/bin/bash
CWD="${ARGUMENTS:-$(pwd)}"
PROJECT_KEY=$(echo "$CWD" | sed 's|/|-|g; s|\.|-|g')
PROJECTS_BASE="$HOME/.dotfiles/claude.symlink/projects"
PROJECT_DIR="$PROJECTS_BASE/$PROJECT_KEY"
if [ ! -d "$PROJECT_DIR" ]; then
echo "未找到会话数据:$CWD"
echo "查找位置:$PROJECT_DIR"
exit 1
fi
echo "╔══════════════════════════════════════════════════════════════════╗"
echo "║ 上下文效率报告: $(basename "$CWD" | head -c 20)"
echo "╚══════════════════════════════════════════════════════════════════╝"
echo "项目: $CWD"
echo ""
# 会话计数
session_count=$(find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" ! -name "agent-*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
agent_count=$(find "$PROJECT_DIR" -maxdepth 1 -name "agent-*.jsonl" 2>/dev/null | wc -l | tr -d ' ')
echo "📁 会话"
echo "────────────────────────────────────────────────────────────────────"
echo "主会话: $session_count"
echo "代理会话: $agent_count"
if [ "$session_count" -gt 0 ]; then
ratio=$(echo "scale=2; $agent_count / $session_count" | bc)
echo "委托比例: ${ratio}:1"
fi
echo ""
# 模型使用
echo "🤖 模型使用"
echo "────────────────────────────────────────────────────────────────────"
find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" -size +1k -exec cat {} + 2>/dev/null | \
jq -r 'select(.message.model != null) | .message.model' 2>/dev/null | \
sort | uniq -c | sort -rn
echo ""
# 工具使用
echo "🔧 工具使用"
echo "────────────────────────────────────────────────────────────────────"
find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" -size +1k -exec cat {} + 2>/dev/null | \
jq -r '.message.content[]? | select(.type == "tool_use") | .name' 2>/dev/null | \
sort | uniq -c | sort -rn | head -15
echo ""
# 大小
echo "📊 数据大小"
echo "────────────────────────────────────────────────────────────────────"
total_size=$(du -sh "$PROJECT_DIR" 2>/dev/null | cut -f1)
msg_count=$(find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" -exec cat {} + 2>/dev/null | wc -l | tr -d ' ')
echo "总大小: $total_size"
echo "消息记录: $msg_count"
echo ""
# 收集工具数据一次
all_tools=$(find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" -size +1k -exec cat {} + 2>/dev/null | jq -r '.message.content[]? | select(.type == "tool_use") | .name' 2>/dev/null)
all_models=$(find "$PROJECT_DIR" -maxdepth 1 -name "*.jsonl" -size +1k -exec cat {} + 2>/dev/null | jq -r '.message.model // empty' 2>/dev/null)
# 模型计数
opus=$(echo "$all_models" | grep -c "opus" || echo 0)
sonnet=$(echo "$all_models" | grep -c "sonnet" || echo 0)
haiku=$(echo "$all_models" | grep -c "haiku" || echo 0)
model_total=$((opus + sonnet + haiku))
# 工具计数
bash_count=$(echo "$all_tools" | grep -c "^Bash$" || echo 0)
grep_count=$(echo "$all_tools" | grep -c "^Grep$" || echo 0)
glob_count=$(echo "$all_tools" | grep -c "^Glob$" || echo 0)
todo_count=$(echo "$all_tools" | grep -c "^TodoWrite$" || echo 0)
task_count=$(echo "$all_tools" | grep -c "^Task$" || echo 0)
# 计算分数
score=0
warnings=""
# 1. 模型分数(30分):50% opus = 30分,100% opus = 0分
if [ "$model_total" -gt 0 ]; then
opus_pct=$((opus * 100 / model_total))
model_score=$((30 - (opus_pct - 50) * 30 / 50))
[ "$model_score" -lt 0 ] && model_score=0
[ "$model_score" -gt 30 ] && model_score=30
score=$((score + model_score))
[ "$opus_pct" -gt 80 ] && warnings="${warnings}⚠️ Opus ${opus_pct}% - 应用 --model haiku 进行探索
"
else
opus_pct=0
model_score=15
score=$((score + model_score))
fi
# 2. 委托分数(25分):3:1 = 25分,0:1 = 0分
if [ "$session_count" -gt 0 ]; then
delegation_ratio_x100=$((agent_count * 100 / session_count))
delegation_score=$((delegation_ratio_x100 * 25 / 300))
[ "$delegation_score" -gt 25 ] && delegation_score=25
score=$((score + delegation_score))
[ "$delegation_ratio_x100" -lt 100 ] && warnings="${warnings}⚠️ 低委托 - 更多应用任务代理
"
else
delegation_score=0
fi
# 3. 工具效率分数(25分):原生工具 vs bash
native_search=$((grep_count + glob_count))
if [ "$bash_count" -gt 0 ]; then
tool_ratio_x100=$((native_search * 100 / bash_count))
tool_score=$((tool_ratio_x100 * 25 / 50))
[ "$tool_score" -gt 25 ] && tool_score=25
score=$((score + tool_score))
[ "$tool_ratio_x100" -lt 10 ] && warnings="${warnings}⚠️ Bash/原生比例 - 优先使用Grep/Glob工具
"
else
tool_score=25
score=$((score + tool_score))
fi
# 4. TodoWrite分数(20分):任务跟踪
if [ "$msg_count" -gt 0 ]; then
todo_ratio_x1000=$((todo_count * 1000 / msg_count))
todo_score=$((todo_ratio_x1000 * 20 / 50))
[ "$todo_score" -gt 20 ] && todo_score=20
score=$((score + todo_score))
[ "$todo_count" -eq 0 ] && warnings="${warnings}⚠️ 无TodoWrite - 应用任务跟踪
"
else
todo_score=0
fi
# 输出
echo "📈 效率分数"
echo "────────────────────────────────────────────────────────────────────"
echo ""
echo " ┌─────────────────────────────────────┐"
printf " │ 分数: %3d / 100 │
" "$score"
echo " └─────────────────────────────────────┘"
echo ""
echo " 细分:"
printf " 模型效率: %2d/30 (Opus %d%%)
" "$model_score" "$opus_pct"
del_ratio=$(echo "scale=1; $agent_count / ($session_count + 0.001)" | bc)
printf " 任务委托: %2d/25 (比例 %s:1)
" "$delegation_score" "$del_ratio"
printf " 工具效率: %2d/25 (Grep+Glob: %d, Bash: %d)
" "$tool_score" "$native_search" "$bash_count"
printf " 任务跟踪: %2d/20 (TodoWrite: %d)
" "$todo_score" "$todo_count"
echo ""
if [ -n "$warnings" ]; then
echo " 警告:"
printf " $warnings"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════════"
echo "生成时间: $(date '+%Y-%m-%d %H:%M')"
输出
呈现结果并根据以下方面提供建议:
- 模型使用分布(目标为<50% Opus)
- 工具效率(Grep > bash grep, Glob > bash find)
- 任务委托比例(目标为>2:1)
- TodoWrite使用用于任务跟踪