feat: Phase4 命令系统与上下文增强
新增基础设施: - TokenTracker: 真实Token使用量追踪和费用估算(按模型定价) - SkillLoader: .claude/skills/ 扫描加载,支持YAML frontmatter元数据 - GitContext: Git分支/状态/最近提交收集,注入系统提示词 新增命令 (4个): - /init: 项目CLAUDE.md初始化向导,自动检测项目类型(Maven/Gradle/Node/Python等) - /status: 会话状态仪表板(模型、Token、内存、运行时间等) - /context: 上下文概览(CLAUDE.md、Skills、Git、系统提示词大小) - /config: 配置查看/设置(支持model快捷切换和API key显示) 增强命令 (3个): - /cost: 从占位→真实Token统计,显示input/output/cache tokens和费用 - /model: 支持快捷名称切换(sonnet/opus/haiku),显示可用模型列表 - /compact: 增强显示压缩前后消息数和Token使用量 系统提示词增强: - 集成Skills摘要和Git上下文到系统提示词 - 新增Shell环境信息和更详细的Guidelines 命令总数: 6 → 10, 工具总数: 11 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
package com.claudecode.command.impl;
|
||||
|
||||
import com.claudecode.command.CommandContext;
|
||||
import com.claudecode.command.SlashCommand;
|
||||
import com.claudecode.console.AnsiStyle;
|
||||
import com.claudecode.core.TokenTracker;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
|
||||
/**
|
||||
* /status 命令 —— 显示会话状态仪表板。
|
||||
* <p>
|
||||
* 展示当前模型、Token 用量、工具数、消息数、内存和运行时间等信息。
|
||||
*/
|
||||
public class StatusCommand implements SlashCommand {
|
||||
|
||||
private final Instant startTime = Instant.now();
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "status";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "Show session status dashboard";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String execute(String args, CommandContext context) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("\n");
|
||||
sb.append(AnsiStyle.bold(" 📊 Session Status\n"));
|
||||
sb.append(" ").append("─".repeat(40)).append("\n\n");
|
||||
|
||||
// 模型信息
|
||||
TokenTracker tracker = context.agentLoop().getTokenTracker();
|
||||
sb.append(" ").append(AnsiStyle.bold("Model: ")).append(AnsiStyle.cyan(tracker.getModelName())).append("\n");
|
||||
|
||||
// Token 使用
|
||||
sb.append(" ").append(AnsiStyle.bold("Tokens: "))
|
||||
.append("↑ ").append(TokenTracker.formatTokens(tracker.getInputTokens()))
|
||||
.append(" input, ↓ ").append(TokenTracker.formatTokens(tracker.getOutputTokens()))
|
||||
.append(" output")
|
||||
.append(AnsiStyle.dim(" ($" + String.format("%.4f", tracker.estimateCost()) + ")"))
|
||||
.append("\n");
|
||||
|
||||
// API 调用次数
|
||||
sb.append(" ").append(AnsiStyle.bold("API Calls:")).append(" ").append(tracker.getApiCallCount()).append("\n");
|
||||
|
||||
// 消息历史
|
||||
int msgCount = context.agentLoop().getMessageHistory().size();
|
||||
sb.append(" ").append(AnsiStyle.bold("Messages: ")).append(msgCount).append("\n");
|
||||
|
||||
// 工具数
|
||||
sb.append(" ").append(AnsiStyle.bold("Tools: ")).append(context.toolRegistry().size()).append(" registered\n");
|
||||
|
||||
// 工作目录
|
||||
sb.append(" ").append(AnsiStyle.bold("Work Dir: ")).append(AnsiStyle.dim(System.getProperty("user.dir"))).append("\n");
|
||||
|
||||
// JVM 内存
|
||||
Runtime rt = Runtime.getRuntime();
|
||||
long usedMB = (rt.totalMemory() - rt.freeMemory()) / (1024 * 1024);
|
||||
long maxMB = rt.maxMemory() / (1024 * 1024);
|
||||
sb.append(" ").append(AnsiStyle.bold("Memory: ")).append(usedMB).append("MB / ").append(maxMB).append("MB\n");
|
||||
|
||||
// 运行时间
|
||||
Duration uptime = Duration.between(startTime, Instant.now());
|
||||
sb.append(" ").append(AnsiStyle.bold("Uptime: ")).append(formatDuration(uptime)).append("\n");
|
||||
|
||||
// Java 版本
|
||||
sb.append(" ").append(AnsiStyle.bold("JDK: ")).append(System.getProperty("java.version")).append("\n");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String formatDuration(Duration d) {
|
||||
long hours = d.toHours();
|
||||
long minutes = d.toMinutesPart();
|
||||
long seconds = d.toSecondsPart();
|
||||
if (hours > 0) return String.format("%dh %dm %ds", hours, minutes, seconds);
|
||||
if (minutes > 0) return String.format("%dm %ds", minutes, seconds);
|
||||
return String.format("%ds", seconds);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user