【Hanako】README08_LEVEL4_插件系统架构

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. 缓存插件模块 下一步阅读)

核心问题解决

  1. 扩展性:如何让第三方开发者贡献工具/技能/命令,而不修改核心代码?
  2. 权限隔离:如何防止恶意插件删除用户文件或调用危险 API?
  3. 热加载:如何在运行时加载/卸载插件,无需重启应用?
  4. 约定优先:如何让开发者只需"放入文件"即可生效,无需注册?
  5. 依赖管理:如何处理插件之间的依赖关系和通信?

一、现实世界类比

插件系统就像「手机应用商店」

  • 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:安装并测试

  1. 打开 Hanako → 设置 → 插件
  2. 拖拽 my-plugin 文件夹到安装区
  3. 在对话中测试:"帮我查询北京的天气"
  4. 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)。

相关推荐
花千树-0101 小时前
Proposer-Critic 多轮辩论:两个 LLM Agent 用 loop() 逼近共识
langchain·agent·ai编程·skill·multi-agent·claude code·ai 工程化
dFObBIMmai1 小时前
Go语言怎么用GitHub Actions_Go语言GitHub Actions教程【基础】
jvm·数据库·python
Michelle80231 小时前
25大数据 11-1 函数
开发语言·python
dFObBIMmai1 小时前
SQL复杂数据聚合_嵌套子查询与GROUP BY配合
jvm·数据库·python
小许同学记录成长1 小时前
基于幅度形态与参数聚类的工作模式判别
python·算法·scikit-learn
dinglu1030DL1 小时前
CSS Grid布局如何实现网格项目排序_使用order属性改变显示顺序
jvm·数据库·python
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月13日
大数据·人工智能·python·信息可视化·自然语言处理
m0_470857641 小时前
c++怎么利用C++17的filesystem--copy实现高效文件夹克隆【详解】
jvm·数据库·python
duke8692672141 小时前
HTML怎么区分正文与广告_HTML aside与广告位语义【技巧】
jvm·数据库·python