README08_LEVEL4_插件系统架构
【Hanako】源码地址:https://github.com/liliMozi/openhanako
### 文章目录
- [README08_LEVEL4_插件系统架构](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [@[toc]](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [核心问题解决](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [一、现实世界类比](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [二、0-to-1 演化:如果从零设计插件系统](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [阶段 1:硬编码工具(v0)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [阶段 2:动态加载工具(v1)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [阶段 3:Manifest 声明(v2)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [阶段 4:两级权限模型(v3 - 当前)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [三、核心类/函数列表](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [PluginManager(core/plugin-manager.js)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [createPluginContext(core/plugin-context.js)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [Contribution Registries(贡献注册表)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [四、调用链追踪:从插件安装到工具调用](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [五、数据流:插件的完整生命周期](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [1. 安装阶段](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [2. 加载阶段](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [3. 运行阶段](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [4. 卸载阶段](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [六、设计模式分析](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [1. Registry 模式(注册表模式)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [2. Context 模式(上下文模式)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [3. Convention over Configuration 模式(约定优于配置)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [4. Disposable 模式(可释放模式)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [5. Loader 模式(加载器模式)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [七、关键代码解析](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [1. 插件扫描(core/plugin-manager.js:56-84)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [2. 权限检查(core/plugin-manager.js:114-148)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [3. 工具加载(core/plugin-manager.js:200-250)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [4. 生命周期管理(core/plugin-manager.js:180-196)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [八、扩展点:如何创建一个新插件](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 1:创建插件目录](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 2:编写 manifest.json(可选)](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 3:贡献工具](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 4:贡献命令](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 5:贡献技能](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 6:贡献配置 Schema](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [步骤 7:安装并测试](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [九、常见问题与调试](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [1. 如何启用插件调试日志?](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [2. 如何处理插件依赖?](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [3. 如何测试插件?](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [4. 如何热重载插件?](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [十、性能优化](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [1. 延迟加载](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [2. 缓存插件模块](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
- [下一步阅读](#文章目录 README08_LEVEL4_插件系统架构 @[toc] 核心问题解决 一、现实世界类比 二、0-to-1 演化:如果从零设计插件系统 阶段 1:硬编码工具(v0) 阶段 2:动态加载工具(v1) 阶段 3:Manifest 声明(v2) 阶段 4:两级权限模型(v3 - 当前) 三、核心类/函数列表 PluginManager(core/plugin-manager.js) createPluginContext(core/plugin-context.js) Contribution Registries(贡献注册表) 四、调用链追踪:从插件安装到工具调用 五、数据流:插件的完整生命周期 1. 安装阶段 2. 加载阶段 3. 运行阶段 4. 卸载阶段 六、设计模式分析 1. Registry 模式(注册表模式) 2. Context 模式(上下文模式) 3. Convention over Configuration 模式(约定优于配置) 4. Disposable 模式(可释放模式) 5. Loader 模式(加载器模式) 七、关键代码解析 1. 插件扫描(core/plugin-manager.js:56-84) 2. 权限检查(core/plugin-manager.js:114-148) 3. 工具加载(core/plugin-manager.js:200-250) 4. 生命周期管理(core/plugin-manager.js:180-196) 八、扩展点:如何创建一个新插件 步骤 1:创建插件目录 步骤 2:编写 manifest.json(可选) 步骤 3:贡献工具 步骤 4:贡献命令 步骤 5:贡献技能 步骤 6:贡献配置 Schema 步骤 7:安装并测试 九、常见问题与调试 1. 如何启用插件调试日志? 2. 如何处理插件依赖? 3. 如何测试插件? 4. 如何热重载插件? 十、性能优化 1. 延迟加载 2. 缓存插件模块 下一步阅读)
核心问题解决
- 扩展性:如何让第三方开发者贡献工具/技能/命令,而不修改核心代码?
- 权限隔离:如何防止恶意插件删除用户文件或调用危险 API?
- 热加载:如何在运行时加载/卸载插件,无需重启应用?
- 约定优先:如何让开发者只需"放入文件"即可生效,无需注册?
- 依赖管理:如何处理插件之间的依赖关系和通信?
一、现实世界类比
插件系统就像「手机应用商店」:
- PluginManager = 应用商店管理器(扫描、安装、卸载应用)
- manifest.json = 应用清单(应用名称、版本、权限声明)
- tools/ = 应用功能(提供给用户使用的工具)
- skills/ = 应用知识(帮助应用理解特定领域)
- commands/ = 应用快捷方式(用户直接调用的功能)
- routes/ = 应用 API(需要高级权限,如网络访问)
- extensions/ = 系统钩子(深入系统核心能力)
- Restricted vs Full-access = 普通权限 vs root 权限
二、0-to-1 演化:如果从零设计插件系统
阶段 1:硬编码工具(v0)
javascript
// lib/tools/my-tools.js
export const tools = [
{
name: "hello",
description: "Say hello",
execute: async (params) => `Hello, ${params.name}!`,
},
// ... 更多硬编码工具
];
// core/agent.js
import { tools } from "../lib/tools/my-tools.js";
const agentTools = tools; // 无法扩展
问题:第三方开发者无法贡献工具,必须修改源码
阶段 2:动态加载工具(v1)
javascript
// 扫描 plugins/ 目录下的 tools/
const pluginTools = [];
for (const pluginDir of fs.readdirSync("plugins/")) {
const toolsDir = path.join(pluginDir, "tools");
if (!fs.existsSync(toolsDir)) continue;
for (const toolFile of fs.readdirSync(toolsDir)) {
const mod = await import(path.join(toolsDir, toolFile));
pluginTools.push({
name: mod.name,
description: mod.description,
execute: mod.execute,
});
}
}
const allTools = [...builtinTools, ...pluginTools];
代码映射 :PluginManager._loadTools()
问题:
- 没有权限控制(工具可以删除任意文件)
- 无法声明元数据(版本、依赖、作者)
- 没有生命周期管理(无法清理资源)
阶段 3:Manifest 声明(v2)
javascript
// my-plugin/manifest.json
{
"id": "hello-plugin",
"name": "Hello Plugin",
"version": "1.0.0",
"description": "A simple hello plugin",
"author": "Alice",
"minAppVersion": "1.5.0",
"trust": "restricted" // | "full-access"
}
代码映射 :PluginManager._readPluginDescriptor()
问题:仍无法区分"安全插件"和"危险插件"
阶段 4:两级权限模型(v3 - 当前)
javascript
// Restricted(默认)
const restrictedCapabilities = [
"tools", // Agent 可调用
"skills", // 知识注入
"commands", // 用户命令
"agents", // Agent 模板
"config", // 读写自己的配置
];
// Full-access(需用户授权)
const fullAccessCapabilities = [
...restrictedCapabilities,
"routes", // HTTP 路由(危险!可暴露私有 API)
"extensions", // Pi SDK 扩展(危险!可拦截所有消息)
"providers", // LLM Provider(危险!可窃取 API Key)
"lifecycle", // onload/onunload(危险!可执行任意代码)
];
代码映射 :PluginManager._loadPlugin() (line 151-198)
三、核心类/函数列表
PluginManager(core/plugin-manager.js)
职责:插件生命周期管理(扫描、加载、卸载、贡献注册)
| 方法 | 职责 |
|---|---|
scan() |
扫描插件目录,返回描述符列表 |
loadAll() |
批量加载所有扫描到的插件 |
_loadPlugin(entry) |
加载单个插件(注册贡献、调用生命周期) |
unload(pluginId) |
卸载插件(清理贡献、调用 onunload) |
addTool(pluginId, toolDef) |
动态注册工具(index.js 中使用) |
getTools() |
获取所有插件贡献的工具 |
getCommands() |
获取所有插件贡献的命令 |
getSkillPaths() |
获取所有插件贡献的技能路径 |
getAgentTemplates() |
获取所有插件贡献的 Agent 模板 |
createPluginContext(core/plugin-context.js)
职责:创建插件运行时上下文(限制可用 API)
| API | 说明 | 权限要求 |
|---|---|---|
ctx.pluginId |
插件 ID | All |
ctx.pluginDir |
插件目录 | All |
ctx.dataDir |
插件数据目录 | All |
ctx.config |
读写插件配置 | All |
ctx.bus.emit |
发布事件 | All |
ctx.bus.subscribe |
订阅事件 | All |
ctx.bus.request |
调用他人能力 | All |
ctx.bus.handle |
注册事件处理器 | Full-access |
ctx.registerTool |
动态注册工具 | Full-access |
ctx.registerRoute |
注册 HTTP 路由 | Full-access |
Contribution Registries(贡献注册表)
工具注册表 (PluginManager._tools):
javascript
[
{
pluginId: "hello-plugin",
name: "hello",
description: "Say hello",
parameters: { type: "object", properties: { name: { type: "string" } } },
execute: async (input) => `Hello, ${input.name}!`,
},
// ... 更多工具
]
命令注册表 (PluginManager._commands):
javascript
[
{
pluginId: "hello-plugin",
name: "/hello",
description: "Say hello to someone",
handler: async (args) => `Hello, ${args[0]}!`,
},
// ... 更多命令
]
技能路径注册表 (PluginManager._skillPaths):
javascript
[
{
pluginId: "hello-plugin",
dir: "/Users/xxx/.hanako/plugins/hello-plugin/skills/hello-skill",
},
// ... 更多技能
]
四、调用链追踪:从插件安装到工具调用
Plugin Tool Agent PluginManager Hono Server 桌面端 UI 开发者 Plugin Tool Agent PluginManager Hono Server 桌面端 UI 开发者 扫描 tools/ 目录 for (const file of fs.readdirSync("tools/")) const mod = await import(`tools/${file}`) tools.push({ name: mod.name, execute: mod.execute }) 用户对话:"帮我调用 hello 工具" 拖拽插件文件夹到安装区 POST /api/plugins/install { files: [...] } installPlugin(zipBuffer) 解压到 ~/.hanako/plugins/hello-plugin/ scan()(读取 manifest.json) _readPluginDescriptor(pluginDir) { id: "hello-plugin", name: "Hello Plugin", version: "1.0.0", contributions: ["tools", "skills"], trust: "restricted" } _loadPlugin(entry) createPluginContext({ pluginId, accessLevel }) _loadTools(entry) _loadSkillPaths(entry) _loadCommands(entry) _loadAgentTemplates(entry) { success: true, plugin: {...} } { success: true, plugin: {...} } 显示"插件已安装" hello-plugin_hello.execute({ name: "Alice" }) "Hello, Alice!" "Hello, Alice!"
五、数据流:插件的完整生命周期
1. 安装阶段
输入 :用户拖拽的 .zip 文件或文件夹
javascript
// server/routes/plugins.js
async function installPlugin(files) {
const zipBuffer = await files[0].arrayBuffer();
const pluginId = await pluginManager.installFromZip(zipBuffer);
return { success: true, pluginId };
}
中间产物:
javascript
// ~/.hanako/plugins/hello-plugin/manifest.json
{
"id": "hello-plugin",
"name": "Hello Plugin",
"version": "1.0.0",
"description": "A simple hello plugin",
"contributions": ["tools", "skills", "commands"],
"trust": "restricted"
}
输出:
javascript
// PluginManager._plugins Map
Map {
"hello-plugin" => {
id: "hello-plugin",
name: "Hello Plugin",
version: "1.0.0",
pluginDir: "/Users/xxx/.hanako/plugins/hello-plugin",
status: "loaded",
accessLevel: "restricted",
ctx: PluginContext { /* ... */ },
_disposables: [],
}
}
2. 加载阶段
工具加载 (_loadTools()):
javascript
async _loadTools(entry) {
const toolsDir = path.join(entry.pluginDir, "tools");
if (!fs.existsSync(toolsDir)) return;
for (const file of fs.readdirSync(toolsDir)) {
if (!file.endsWith(".js")) continue;
const toolPath = path.join(toolsDir, file);
const mod = await freshImport(toolPath);
const toolDef = {
pluginId: entry.id,
name: mod.name,
description: mod.description,
parameters: mod.parameters,
execute: async (input) => {
// 包装执行:捕获错误、注入上下文
try {
return await mod.execute(input, entry.ctx);
} catch (err) {
console.error(`[plugin] Tool ${entry.id}/${mod.name} failed:`, err);
throw err;
}
},
};
this._tools.push(toolDef);
}
}
示例工具 (tools/hello.js):
javascript
export const name = "hello";
export const description = "Say hello to someone";
export const parameters = {
type: "object",
properties: { name: { type: "string" } },
required: ["name"],
};
export async function execute(input, ctx) {
// ctx = PluginContext { pluginId, dataDir, config, bus }
const config = await ctx.config.get();
const greeting = config.greeting || "Hello";
return `${greeting}, ${input.name}!`;
}
3. 运行阶段
Agent 调用工具:
javascript
// Agent.tools (built by SessionCoordinator)
const tools = [
...builtinTools, // bash, read_files, write_files, ...
...pluginTools, // hello-plugin_hello, ...
];
// LLM 决定调用工具
const toolCall = {
toolName: "hello-plugin_hello",
arguments: { name: "Alice" },
};
// 查找工具
const tool = tools.find(t => t.name === toolCall.toolName);
if (!tool) throw new Error(`Tool ${toolCall.toolName} not found`);
// 执行工具
const result = await tool.execute(toolCall.arguments);
// result = "Hello, Alice!"
4. 卸载阶段
卸载流程 (unload(pluginId)):
javascript
async unload(pluginId) {
const entry = this._plugins.get(pluginId);
if (!entry) return;
// 1. 清理贡献
this._tools = this._tools.filter(t => t.pluginId !== pluginId);
this._commands = this._commands.filter(c => c.pluginId !== pluginId);
this._skillPaths = this._skillPaths.filter(s => s.pluginId !== pluginId);
this._agentTemplates = this._agentTemplates.filter(a => a.pluginId !== pluginId);
// 2. 清理 routes
for (const dispose of entry._disposables) {
if (typeof dispose === "function") await dispose();
}
// 3. 调用 onunload
if (entry.instance?.onunload) {
await entry.instance.onunload();
}
// 4. 移除插件条目
this._plugins.delete(pluginId);
}
六、设计模式分析
1. Registry 模式(注册表模式)
位置 :PluginManager._tools, ._commands, ._skillPaths
设计意图:集中管理所有插件的贡献
javascript
class PluginManager {
constructor() {
this._tools = []; // 工具注册表
this._commands = []; // 命令注册表
this._skillPaths = []; // 技能路径注册表
}
getTools() {
return [...this._tools]; // 返回副本,防止外部修改
}
}
2. Context 模式(上下文模式)
位置 :createPluginContext()(core/plugin-context.js)
设计意图:限制插件的可用 API(沙盒机制)
javascript
function createPluginContext({ pluginId, pluginDir, dataDir, bus, accessLevel }) {
const ctx = {
pluginId,
pluginDir,
dataDir,
// 所有插件可用
config: createConfigStore(pluginId),
bus: {
emit: (event, data) => bus.emit(event, data),
subscribe: (event, handler) => bus.subscribe(event, handler),
request: async (event, data) => bus.request(event, data),
},
// Full-access only
...(accessLevel === "full-access" ? {
registerTool: (toolDef) => {/* ... */},
registerRoute: (routeDef) => {/* ... */},
} : {}),
};
return ctx;
}
3. Convention over Configuration 模式(约定优于配置)
位置 :目录结构扫描(_readPluginDescriptor())
设计意图:开发者只需"放入文件",无需手动注册
javascript
// 约定:tools/ 目录下的所有 .js 文件自动注册为工具
function scanTools(pluginDir) {
const toolsDir = path.join(pluginDir, "tools");
if (!fs.existsSync(toolsDir)) return [];
const tools = [];
for (const file of fs.readdirSync(toolsDir)) {
if (!file.endsWith(".js")) continue;
const mod = await import(path.join(toolsDir, file));
tools.push({
name: mod.name, // 导出的 name
execute: mod.execute, // 导出的 execute
});
}
return tools;
}
// 约定:skills/ 目录下的所有 SKILL.md 自动注册为技能
function scanSkills(pluginDir) {
const skillsDir = path.join(pluginDir, "skills");
if (!fs.existsSync(skillsDir)) return [];
const skills = [];
for (const skillDir of fs.readdirSync(skillsDir)) {
const skillPath = path.join(skillsDir, skillDir, "SKILL.md");
if (fs.existsSync(skillPath)) {
skills.push(skillDir);
}
}
return skills;
}
4. Disposable 模式(可释放模式)
位置 :entry._disposables 数组
设计意图:统一清理资源(routes、事件监听器等)
javascript
// 插件注册清理函数
instance.register((disposable) => {
entry._disposables.push(disposable);
});
// 示例:注册 HTTP 路由
instance.registerRoute({
method: "get",
path: "/api/hello",
handler: (req) => {/* ... */},
});
// PluginManager 内部实现
instance.ctx.registerRoute = (routeDef) => {
const dispose = server.registerRoute(routeDef);
instance.register(dispose); // 卸载时自动清理路由
};
5. Loader 模式(加载器模式)
位置 :_loadTools(), _loadSkillPaths(), _loadCommands() 等
设计意图:统一的加载逻辑(扫描 → 导入 → 注册)
javascript
async _loadTools(entry) {
const dir = path.join(entry.pluginDir, "tools");
if (!fs.existsSync(dir)) return;
for (const file of fs.readdirSync(dir)) {
const modulePath = path.join(dir, file);
const mod = await freshImport(modulePath);
const contribution = {
pluginId: entry.id,
name: mod.name,
description: mod.description,
parameters: mod.parameters,
execute: mod.execute,
};
this._tools.push(contribution);
}
}
七、关键代码解析
1. 插件扫描(core/plugin-manager.js:56-84)
javascript
scan() {
const results = [];
const seen = new Set(); // 去重:防止同名插件
for (let i = 0; i < this._pluginsDirs.length; i++) {
const dir = this._pluginsDirs[i];
const source = i === 0 ? "builtin" : "community"; // 第一个目录 = 内置插件
if (!fs.existsSync(dir)) continue;
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
if (seen.has(entry.name)) continue; // 跳过重复
seen.add(entry.name);
const pluginDir = path.join(dir, entry.name);
try {
const desc = this._readPluginDescriptor(pluginDir, entry.name);
desc.source = source;
// 跳过 ID 冲突
if (seen.has(`id:${desc.id}`)) {
console.warn(`[plugin-manager] plugin id "${desc.id}" 冲突,跳过`);
continue;
}
seen.add(`id:${desc.id}`);
results.push(desc);
} catch (err) {
console.error(`[plugin-manager] failed to read plugin "${entry.name}":`, err.message);
}
}
}
this._scanned = results;
return results;
}
2. 权限检查(core/plugin-manager.js:114-148)
javascript
async loadAll() {
const descriptors = this._scanned.length > 0 ? this._scanned : this.scan();
const disabledList = this._preferencesManager?.getDisabledPlugins() || [];
for (const desc of descriptors) {
const entry = { ...desc, status: "loading", instance: null, _disposables: [] };
// 1. 内置插件不受禁用列表约束
if (desc.source !== "builtin" && disabledList.includes(desc.id)) {
entry.status = "disabled";
this._plugins.set(desc.id, entry);
continue;
}
// 2. Full-access 插件需用户授权
if (desc.source === "community" && desc.trust === "full-access") {
const allowed = this._preferencesManager?.getAllowFullAccessPlugins() || false;
if (!allowed) {
entry.status = "restricted";
this._plugins.set(desc.id, entry);
continue;
}
}
// 3. 版本兼容性检查
const minVer = desc.manifest?.minAppVersion;
if (minVer && !semverGte(this._appVersion, minVer)) {
entry.status = "incompatible";
entry.error = `requires app v${minVer}+, current v${this._appVersion}`;
this._plugins.set(desc.id, entry);
console.warn(`[plugin-manager] "${desc.id}" skipped: ${entry.error}`);
continue;
}
// 4. 加载插件
this._plugins.set(desc.id, entry);
try {
await this._loadPlugin(entry);
entry.status = "loaded";
} catch (err) {
entry.status = "failed";
entry.error = err.message;
console.error(`[plugin-manager] plugin "${desc.id}" failed to load:`, err.message);
}
}
}
3. 工具加载(core/plugin-manager.js:200-250)
javascript
async _loadTools(entry) {
const toolsDir = path.join(entry.pluginDir, "tools");
if (!fs.existsSync(toolsDir)) return;
for (const file of fs.readdirSync(toolsDir)) {
if (!file.endsWith(".js")) continue;
const toolPath = path.join(toolsDir, file);
try {
const mod = await freshImport(toolPath);
// 验证工具定义
if (typeof mod.name !== "string" || typeof mod.execute !== "function") {
console.warn(`[plugin] Invalid tool ${entry.id}/${file}: missing name or execute`);
continue;
}
const toolDef = {
pluginId: entry.id,
name: `${entry.id}_${mod.name}`, // 命名空间前缀
displayName: mod.name,
description: mod.description || "",
parameters: mod.parameters || { type: "object", properties: {} },
execute: async (input, agentContext) => {
// 注入插件上下文
const ctx = entry.ctx;
try {
return await mod.execute(input, ctx, agentContext);
} catch (err) {
console.error(`[plugin] Tool ${entry.id}_${mod.name} error:`, err);
throw err;
}
},
};
this._tools.push(toolDef);
} catch (err) {
console.error(`[plugin] Failed to load tool ${entry.id}/${file}:`, err.message);
}
}
}
4. 生命周期管理(core/plugin-manager.js:180-196)
javascript
// Lifecycle (index.js)
const indexPath = path.join(entry.pluginDir, "index.js");
if (fs.existsSync(indexPath)) {
const mod = await freshImport(indexPath);
const PluginClass = mod.default;
if (PluginClass && typeof PluginClass === "function") {
const instance = new PluginClass();
entry.instance = instance;
instance.ctx = entry.ctx;
// 提供 register 方法(用于清理)
instance.register = (disposable) => {
if (typeof disposable === "function") {
entry._disposables.push(disposable);
}
};
// 注入动态工具注册 API
instance.ctx.registerTool = (toolDef) => {
this.addTool(entry.id, toolDef);
};
// 调用 onload 钩子
if (typeof instance.onload === "function") {
await instance.onload();
}
}
}
示例插件 (index.js):
javascript
export default class HelloPlugin {
async onload() {
// 动态注册工具
this.ctx.registerTool({
name: "dynamic_hello",
description: "Dynamically registered tool",
execute: async (input) => `Hello, ${input.name}!`,
});
// 注册清理函数
this.register(() => {
console.log("Cleaning up dynamic_hello tool");
});
}
async onunload() {
console.log("HelloPlugin unloaded");
}
}
八、扩展点:如何创建一个新插件
步骤 1:创建插件目录
bash
mkdir -p ~/.hanako/plugins/my-plugin/tools
cd ~/.hanako/plugins/my-plugin
步骤 2:编写 manifest.json(可选)
json
{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "A simple example plugin",
"author": "Your Name",
"minAppVersion": "1.0.0",
"trust": "restricted"
}
步骤 3:贡献工具
javascript
// tools/weather.js
export const name = "weather";
export const description = "Get weather for a city";
export const parameters = {
type: "object",
properties: {
city: { type: "string", description: "City name" },
},
required: ["city"],
};
export async function execute(input, ctx) {
// 读取插件配置
const config = await ctx.config.get();
const apiKey = config.weatherApiKey;
// 调用 API
const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${input.city}&appid=${apiKey}`);
const data = await response.json();
return JSON.stringify(data, null, 2);
}
步骤 4:贡献命令
javascript
// commands/hello.js
export const name = "/hello";
export const description = "Say hello";
export const handler = async (args, ctx) => {
return `Hello, ${args[0] || "World"}!`;
};
步骤 5:贡献技能
markdown
<!-- skills/weather/SKILL.md -->
# Weather Skill
You are a weather assistant. When users ask about weather, use the `my-plugin_weather` tool to fetch current weather data.
Example:
- User: "What's the weather in Tokyo?"
- Assistant: [calls my-plugin_weather tool]
步骤 6:贡献配置 Schema
json
{
"contributes": {
"configuration": {
"properties": {
"weatherApiKey": {
"type": "string",
"description": "OpenWeatherMap API Key",
"default": ""
}
}
}
}
}
步骤 7:安装并测试
- 打开 Hanako → 设置 → 插件
- 拖拽
my-plugin文件夹到安装区 - 在对话中测试:"帮我查询北京的天气"
- Agent 会自动调用
my-plugin_weather工具
九、常见问题与调试
1. 如何启用插件调试日志?
javascript
// core/plugin-manager.js
import { debugLog } from "../lib/debug-log.js";
debugLog()?.enable("plugin");
// 查看日志
// [plugin] Scanning plugin: my-plugin
// [plugin] Loaded tool: my-plugin_weather
// [plugin] Loaded command: /hello
2. 如何处理插件依赖?
javascript
// index.js
export default class MyPlugin {
async onload() {
// 订阅其他插件的事件
this.ctx.bus.subscribe("other-plugin:event", (data) => {
console.log("Received:", data);
});
// 调用其他插件的能力
const result = await this.ctx.bus.request("other-plugin:action", { foo: "bar" });
}
}
3. 如何测试插件?
javascript
// tests/plugins/my-plugin.test.js
import { PluginManager } from "../../core/plugin-manager.js";
import { createTestBus } from "../helpers/test-bus.js";
const pm = new PluginManager({
pluginsDirs: ["test/fixtures/plugins"],
dataDir: "/tmp/hanako-test",
bus: createTestBus(),
});
await pm.scan();
const plugins = pm.getPlugins();
console.log(plugins); // [{ id: "my-plugin", name: "My Plugin", ... }]
4. 如何热重载插件?
bash
# 卸载旧版
POST /api/plugins/unload
{ "pluginId": "my-plugin" }
# 重新加载
POST /api/plugins/reload
{ "pluginId": "my-plugin" }
十、性能优化
1. 延迟加载
javascript
// 只在首次使用时加载插件
class PluginManager {
constructor() {
this._lazyLoaded = new Set();
}
async loadPluginOnDemand(pluginId) {
if (this._lazyLoaded.has(pluginId)) return;
const entry = this._plugins.get(pluginId);
await this._loadPlugin(entry);
this._lazyLoaded.add(pluginId);
}
}
2. 缓存插件模块
javascript
// 避免重复 import
const moduleCache = new Map();
async function freshImport(modulePath) {
if (moduleCache.has(modulePath)) {
return moduleCache.get(modulePath);
}
const mod = await import(modulePath);
moduleCache.set(modulePath, mod);
return mod;
}
下一步阅读
README09_LEVEL4_添加新检索模式:扩展 OpenHanako 的检索能力(从 Episodic 到 Triplet Completion)。