feat: P2全部功能 - MCP协议+插件系统+任务管理+CLI增强
A组 CLI增强: - DiffRenderer: 彩色diff渲染(行号/stat摘要/unified格式) - /hooks: 查看已注册Hook列表 - /review: AI代码审查(支持--staged/文件路径) - /stats: 会话使用统计(tokens/费用/API调用/运行时长) - /branch: 对话分支管理(save/load/list/delete) - /rewind: 回退对话历史 - /tag: 对话位置标签 - /security-review: AI安全审查 B组 任务系统: - TaskManager: 后台任务管理(线程安全/自动执行/手动管理) - TaskCreate/TaskGet/TaskList/TaskUpdate 4个工具 - ConfigTool: 配置读写工具 C组 MCP协议: - McpClient: MCP客户端(JSON-RPC 2.0/工具发现/资源读取) - McpTransport: 传输层接口 - StdioTransport: StdIO传输实现(子进程/异步读写) - McpManager: 多MCP服务器管理(配置加载/生命周期) - McpToolBridge: MCP工具桥接为本地Tool - /mcp: MCP服务器管理命令 D组 插件系统: - Plugin接口 + PluginContext + PluginManager - JAR插件加载(ClassLoader隔离/Manifest读取) - OutputStylePlugin: 内置输出样式插件 - /plugin: 插件管理命令 集成: AppConfig注册全部18工具+28命令 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package com.claudecode.plugin;
|
||||
|
||||
import com.claudecode.tool.ToolContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 插件上下文 —— 为插件提供访问应用核心功能的接口。
|
||||
* <p>
|
||||
* 每个插件在初始化时会收到一个专属的 {@code PluginContext} 实例,
|
||||
* 包含:
|
||||
* <ul>
|
||||
* <li>{@link ToolContext} —— 工具执行上下文(工作目录、共享状态)</li>
|
||||
* <li>工作目录路径</li>
|
||||
* <li>插件专属日志器 —— 日志前缀为 "plugin.{pluginId}"</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>此类的引用字段在构造后不可变(shallowly immutable),但持有的
|
||||
* {@link ToolContext} 本身是可变的,多个插件共享同一实例。</p>
|
||||
*/
|
||||
public class PluginContext {
|
||||
|
||||
private final ToolContext toolContext;
|
||||
private final String workDir;
|
||||
private final Logger pluginLogger;
|
||||
|
||||
/**
|
||||
* 创建插件上下文。
|
||||
*
|
||||
* @param toolContext 工具执行上下文,不能为 null
|
||||
* @param workDir 当前工作目录路径,不能为 null
|
||||
* @param pluginId 插件标识,用于创建专属日志器,不能为 null
|
||||
* @throws NullPointerException 如果任何参数为 null
|
||||
*/
|
||||
public PluginContext(ToolContext toolContext, String workDir, String pluginId) {
|
||||
this.toolContext = Objects.requireNonNull(toolContext, "toolContext 不能为 null");
|
||||
this.workDir = Objects.requireNonNull(workDir, "workDir 不能为 null");
|
||||
Objects.requireNonNull(pluginId, "pluginId 不能为 null");
|
||||
this.pluginLogger = LoggerFactory.getLogger("plugin." + pluginId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工具执行上下文。
|
||||
* <p>
|
||||
* 通过 ToolContext 可以访问工作目录、模型信息和共享状态。
|
||||
*
|
||||
* @return 工具执行上下文
|
||||
*/
|
||||
public ToolContext getToolContext() {
|
||||
return toolContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前工作目录路径。
|
||||
*
|
||||
* @return 工作目录的绝对路径字符串
|
||||
*/
|
||||
public String getWorkDir() {
|
||||
return workDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件专属日志器。
|
||||
* <p>
|
||||
* 日志器名称格式为 "plugin.{pluginId}",方便在日志中区分不同插件的输出。
|
||||
*
|
||||
* @return SLF4J Logger 实例
|
||||
*/
|
||||
public Logger getLogger() {
|
||||
return pluginLogger;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user