# Changelog
所有重要的项目变更都会记录在此文件中。
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
并且本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
## [0.1.31] - 2025-12-29
### 新增
- 新增 `Disabled` 插件状态,支持禁用插件而不卸载
- 新增 `disable_plugin` 方法,提供插件禁用功能
- 新增 `set_plugin_status` 内部方法,支持直接设置插件状态
- 禁用后的插件不会处理请求,但保持已加载状态
- 支持从 `Loaded`、`Initialized`、`Running`、`Stopped` 状态转换到 `Disabled` 状态
- 支持从 `Disabled` 状态恢复到 `Running`、`Stopped` 状态
### 改进
- 将 `secra-logger` 从开发依赖移回运行时依赖,支持在运行时使用日志功能
- 完善状态转换验证逻辑,支持 `Disabled` 状态的所有有效转换
- 改进状态显示和字符串转换,支持 `Disabled` 状态的显示
## [0.1.30] - 2025-12-29
### 改进
- 将 `tracing-subscriber` 和 `secra-logger` 从运行时依赖移动到开发依赖
- 优化依赖管理,这些依赖仅在示例程序中使用,不应作为库的运行时依赖
## [0.1.29] - 2025-12-29
### 变更
- 更新 `secra-logger` 依赖版本从 `1.0.1` 到 `1.0`
## [0.1.28] - 2025-12-29
### 改进
- 升级 `secra-logger` 依赖从 `0.1.0` 到 `1.0.1`
- 更新示例程序以适配 `secra-logger` 1.0.1 版本的新 API
- 将 `init_logging` 和 `LogConfig` 替换为 `init_logger` 和 `LoggerConfig`
- 使用 `tracing::Level` 替代 `secra_logger::LogLevel`,统一日志级别类型
- 简化日志配置代码,使用新的链式配置 API
## [0.1.27] - 2025-12-29
### 新增
- 新增 `get_target_triple()` 函数,自动检测当前编译目标的三元组(target triple)
- 插件加载器支持自动使用目标三元组作为动态库子目录路径
- 构建脚本支持 Linux glibc 目标平台(`x86_64-unknown-linux-gnu` 和 `aarch64-unknown-linux-gnu`)
- `collect-builds.sh` 脚本添加 glibc 目标平台支持
- `scripts/build/Makefile` 新增 `build-glibc` 和 `install-glibc-targets` 目标
- `scripts/build/build.sh` 添加 `--glibc` 参数,支持启用 glibc 目标构建
### 改进
- 改进 `get_library_file_path()` 函数,当 `library_path` 为 `None` 时自动使用目标三元组作为子目录
- 优化插件加载逻辑,自动适配不同平台的动态库路径结构
- 构建脚本改进 glibc 目标构建流程,优先使用 `cross` 工具进行交叉编译
- `scripts/build/build.ps1` 自动检测并使用 `cross` 工具构建 glibc 目标
- `scripts/build/build.sh` 支持通过环境变量 `ENABLE_GLIBC` 或 `--glibc` 参数启用 glibc 目标
- 改进构建脚本的错误处理和日志输出,提供更清晰的构建状态信息
## [0.1.26] - 2025-12-29
### 新增
- 集成 `secra-logger` 日志系统,提供统一的日志管理功能
- 添加 `tracing-shared` 依赖,支持共享日志记录器
- 示例程序使用 `secra-logger` 替代 `tracing-subscriber`,支持文件日志输出
- 示例程序配置日志输出到文件(`./logs/app.log`),支持日志轮转和按日期分割
### 改进
- 改进日志初始化配置,支持从环境变量 `RUST_LOG` 读取日志级别
- 配置日志文件最大大小为 100MB,保留最近 7 天的日志文件
- 在 `loader.rs` 中添加 `SharedLogger` 和 `FnSetupLogger` 类型定义
- 在 `watch_ops.rs` 中集成 `tracing_shared::SharedLogger`
- 优化代码格式,统一代码风格
- 改进错误日志格式,增强可读性
- 改进 `load_all_plugins` 函数,在未发现插件时提前返回,避免不必要的后续处理
- 示例程序移除插件文件预检查逻辑,直接调用 `load_all_plugins` 方法,简化代码流程
## [0.1.25] - 2025-12-29
### 改进
- 增强所有插件操作模块的日志记录,添加 trace、debug、warn 级别的详细日志
- 改进插件初始化操作的日志输出,添加成功/失败统计信息
- 改进插件加载操作的日志记录,提供更详细的加载过程信息
- 改进插件启动、停止、卸载操作的日志记录,增强可观测性
- 改进插件执行、路由注册、查询操作的日志记录
- 改进插件重载和文件监听操作的日志记录
- 优化错误日志信息,包含更多上下文信息(如超时时间、插件状态等)
- 改进代码可维护性,统一日志记录风格
## [0.1.24] - 2025-12-29
### 改进
- 重构代码结构,移除重复的类型定义
- 将 `PluginFactory` trait 定义统一到 `factory.rs` 模块,使用重新导出避免重复
- 优化 `types.rs` 模块,移除重复的 `PluginFactory` 和 `CreatePluginFn` 定义
- 简化代码结构,减少代码行数(净减少 56 行)
- 改进代码组织,统一类型定义位置,提高代码可维护性
## [0.1.23] - 2025-12-29
### 改进
- 示例程序添加 Ctrl+C 信号处理,支持优雅地停止 HTTP 服务器
- 当收到 Ctrl+C 信号时,服务器会先停止插件管理器,然后等待服务器完全停止后再退出
- 改进服务器关闭流程,确保资源正确释放
## [0.1.22] - 2025-12-28
### 新增
- 新增 `reload_plugin_directory` 方法,支持重新加载整个插件目录
- 方法会自动卸载所有当前已加载的插件,然后重新扫描并加载插件目录中的所有插件
### 改进
- 示例程序改进文件监听任务,当检测到插件文件变化时自动执行完整的插件重载流程
- 文件监听任务现在会自动调用 `reload_plugin_directory`、`initialize_all_plugins` 和 `start_all_plugins` 方法
- 在阻塞上下文中使用 `tokio::runtime::Handle::current()` 执行异步方法,确保插件重载流程正确执行
- 改进错误处理,提供更详细的错误日志信息
## [0.1.21] - 2025-12-28
### 新增
- `PluginManager` 集成文件系统监听功能,支持在初始化时自动创建监听器
- 新增 `watch_rx` 字段,提供文件系统事件接收器,允许外部代码接收监听事件
- 新增 `enable_plugin_dir_watch` 配置选项,支持通过配置控制是否启用插件目录监听
- `PluginManagerConfigBuilder` 新增 `enable_plugin_dir_watch` 方法,支持链式配置
- `PluginManagerConfig` 新增 `with_enable_plugin_dir_watch` 方法,支持直接设置配置
### 改进
- 示例程序改为使用 `PluginManager` 集成的文件系统监听功能,移除直接使用 `notify` crate 的代码
- 示例程序添加服务重启逻辑,当检测到插件文件变化时自动重启 HTTP 服务器
- 优化代码组织结构,统一管理文件系统监听相关功能
- 改进代码格式化,统一导入顺序和代码风格
## [0.1.20] - 2025-12-28
### 改进
- 示例程序添加文件系统监听功能,使用 `notify` crate 监听插件目录变化
- 示例程序演示如何使用 `RecommendedWatcher` 监听插件目录的文件系统事件
- 支持实时检测插件目录中的文件变化(创建、删除、修改)
## [0.1.19] - 2025-12-28
### 新增
- 新增 `watch_plugin_directory` 方法,支持监听插件目录的文件系统变化
- 新增 `stop_watching` 方法,支持停止插件目录监听
- 新增 `watch_ops.rs` 模块,实现插件目录监听的核心逻辑
- 支持自动检测插件目录中的 `.spk` 文件变化(创建、删除、修改)
- 当检测到新插件文件时,自动加载插件
- 当检测到插件文件删除时,自动卸载对应插件
- 当检测到插件文件修改时,自动重新加载插件
- 使用防抖机制(默认 500ms),避免频繁触发文件系统事件
- 监听器在后台异步运行,不阻塞主线程
### 改进
- 优化文件系统事件处理,只处理 `.spk` 文件相关的事件
- 增强错误处理和日志记录,提供详细的监听状态信息
- 支持通过停止信号优雅地停止监听器
## [0.1.18] - 2025-12-28
### 改进
- 为所有公共 API 添加详细的文档注释(doc comments)
- 完善 `PluginManager` 方法的文档,包括参数说明、返回值、行为描述和使用示例
- 完善 `PluginManagerError` 错误类型的文档,说明各错误变体的使用场景
- 完善 `PluginConfiguration` trait 的文档,说明配置管理接口的使用方法
- 完善 `PluginFactory`、`PluginLifecycle`、`PluginStatus` 等核心 trait 的文档
- 完善 `PluginConfig`、`PluginMetadata` 等数据结构的文档
- 改进代码可读性和可维护性,便于开发者理解和使用 API
## [0.1.17] - 2025-12-28
### 新增
- 新增 `register_all_plugin_routes_sync` 方法,提供同步版本的路由注册功能
- 支持在非异步上下文中注册插件路由(如 actix-web 的 `configure` 回调)
- 自动检测并使用当前的 Tokio 运行时句柄,如果不存在则创建新的运行时
### 改进
- 示例程序集成插件路由注册功能,在 HTTP 服务器启动时自动注册所有插件路由
- 优化示例程序代码,移除未使用的导入
## [0.1.16] - 2025-12-28
### 新增
- 示例程序添加 `detect_target_triple()` 函数,自动检测当前系统的目标三元组
- 示例程序添加 actix-web HTTP 服务器示例,包含 echo 端点
- `collect-builds.sh` 脚本支持从 `plugin.toml` 读取 `metadata.name` 作为文件名
- `collect-builds.sh` 脚本添加自动打包 child-plugin 的步骤
### 改进
- 插件加载器改进插件名称清理逻辑,允许点号(支持如 `com.example.child-plugin` 的插件名称)
- 动态库文件路径构建使用原始插件名称(包含点号),确保与打包时的命名一致
- 增强动态库文件加载错误日志,提供更详细的调试信息(包括文件路径、插件名称、库路径等)
- `validate_path_within_base` 函数支持路径不存在时验证父目录,提高路径验证的健壮性
- 示例程序支持根据系统架构自动设置 `library_path` 配置
### 修复
- 修复插件名称包含点号时无法正确加载动态库的问题
## [0.1.15] - 2025-12-28
### 新增
- 新增 `collect-builds.sh` 脚本,用于收集构建产物并按照插件类型和平台组织
- 脚本支持自动执行构建、收集各平台插件文件到 `output` 目录
- 脚本自动检查并安装 `pluginctl` 工具
- 脚本自动检查并生成密钥文件(如果不存在)
### 改进
- 更新 `.gitignore`,添加 `output` 和 `keys` 目录的忽略规则
## [0.1.14] - 2025-12-28
### 改进
- 构建脚本支持构建整个 workspace,使用 `--workspace` 标志
- 构建脚本自动复制插件库文件(parent-plugin 和 child-plugin)到输出目录
- 改进构建输出信息,分别显示主程序和插件库的构建状态
- 构建统计信息中显示所有构建的二进制文件,包括插件库文件
- 支持跨平台插件库文件命名(Windows: `.dll`,Linux: `.so`,macOS: `.dylib`)
### 变更
- 删除临时文档文件
## [0.1.13] - 2025-12-28
### 新增
- 新增 `README.md` 文档,详细说明支持的目标平台架构信息
- 包含各平台架构、供应商、操作系统和 ABI 的详细说明
### 改进
- 优化构建脚本输出信息,构建完成后显示详细的二进制文件列表
- 改进构建统计信息显示格式,增加分隔线和更好的可读性
- 为每个构建目标显示友好的平台名称(如 "Linux (x86_64)"、"macOS (Apple Silicon)" 等)
- 统一所有构建目标(`build-all`、`build-cross`、`build-linux`、`build-windows`、`build-macos`)的输出格式
## [0.1.12] - 2025-12-28
### 新增
- 新增跨平台构建脚本系统:
- `scripts/build/Makefile` - Make 构建脚本,支持多平台交叉编译
- `scripts/build/build.sh` - Bash 构建脚本(macOS/Linux)
- `scripts/build/build.ps1` - PowerShell 构建脚本(Windows)
- `scripts/README.md` - 脚本使用文档
- 新增根目录 `Makefile` 包装器,方便从项目根目录调用构建脚本
- 支持构建目标平台:
- Linux: `x86_64-unknown-linux-musl`, `aarch64-unknown-linux-musl`
- Windows: `x86_64-pc-windows-gnu`
- macOS: `x86_64-apple-darwin`, `aarch64-apple-darwin`
- 支持使用 `cross` 工具进行交叉编译(可选)
### 改进
- 构建脚本自动安装所需的目标平台工具链
- 构建脚本支持停止正在运行的构建进程
- 构建完成后自动复制二进制文件到 `target/release/` 目录
- 提供详细的构建统计信息和错误提示
## [0.1.11] - 2025-12-27
### 新增
- 添加 Cargo workspace 配置,支持多包项目管理
- 新增示例插件项目:
- `example/parent-plugin` - 父插件示例
- `example/child-plugin` - 子插件示例
- 恢复 `example/main.rs` 作为可执行文件入口
- 新增依赖:`anyhow`、`notify`、`tracing-subscriber`、`futures`
- 配置构建器 `build()` 方法现在返回 `Result`,支持路径解析错误处理
### 改进
- 使用 workspace dependencies 统一管理依赖版本
- `PluginManagerConfigBuilder::build()` 方法现在会自动将相对路径转换为绝对路径
- 添加路径解析功能,基于程序运行时工作目录解析相对路径
- `PluginManager::plugin_dir` 字段改为 `pub`,允许外部访问
- 完善配置构建器的文档和示例,说明相对路径解析行为
- 更新 `.gitignore`,添加 `/plugins` 和 `/temp` 目录忽略规则
### 变更
- 删除 `src/manager_old.rs` 临时文件
## [0.1.10] - 2025-12-27
### 改进
- 进一步重构 `manager/` 模块,将操作逻辑拆分为独立的操作模块
- 新增操作模块,将功能操作与底层实现分离:
- `load_ops.rs` - 插件加载操作
- `init_ops.rs` - 插件初始化操作
- `start_ops.rs` - 插件启动操作
- `stop_ops.rs` - 插件停止操作
- `unload_ops.rs` - 插件卸载操作
- `execute_ops.rs` - 插件执行操作
- `route_ops.rs` - 路由注册操作
- `query_ops.rs` - 查询操作
- `reload_ops.rs` - 重载操作
- 优化代码组织结构,提高模块化程度和可维护性
- 保持公共 API 不变,重构对用户透明
### 变更
- 删除 `example/main.rs` 示例文件
## [0.1.9] - 2025-12-26
### 改进
- 重构 `manager.rs` 模块,将大型单文件拆分为多个子模块
- 新增 `manager/` 子模块目录,包含以下模块:
- `constants.rs` - 常量定义
- `types.rs` - 类型定义(PluginFactory, PluginInstance, PluginInfo 等)
- `manager_config.rs` - 配置管理
- `validation.rs` - 验证功能
- `loader.rs` - 插件加载功能
- `lifecycle_ops.rs` - 生命周期操作
- `unloader.rs` - 插件卸载功能
- `executor.rs` - 插件执行功能
- `routes.rs` - 路由注册功能
- `query.rs` - 查询功能
- `reloader.rs` - 重载功能
- 代码行数从 2387 行减少到 196 行,大幅提升代码可维护性
- 改善代码组织结构,提高模块化程度
- 保持公共 API 不变,重构对用户透明
## [0.1.8] - 2025-12-26
### 新增
- 新增 `initialize_plugin` 方法,提供单个插件的初始化功能
- 新增 `start_plugin` 方法,提供单个插件的启动功能
- 支持单个插件的生命周期管理,与批量操作方法相对应
### 改进
- `initialize_plugin` 方法包含完整的输入验证和超时保护机制
- `start_plugin` 方法包含状态检查和超时保护机制
- 两个方法都包含详细的错误处理和状态转换验证
- 完善方法文档,包含使用示例和错误处理说明
### 安全
- 插件ID验证,防止路径遍历攻击
- 执行操作带有超时保护,防止长时间阻塞
- 状态转换验证,确保插件状态转换的合法性
## [0.1.7] - 2025-12-26
### 新增
- 新增 `PluginInfo` 结构体,用于查询返回插件信息,不包含内部实现细节
- 新增 `get_all_plugins` 方法,提供查询所有插件信息的统一接口
- 支持序列化/反序列化插件信息,便于 API 返回和日志记录
### 改进
- `get_all_plugins` 方法使用读锁,支持并发查询
- 优化锁持有时间,快速收集数据后立即释放锁
- 返回克隆的数据而非引用,避免锁持有时间过长
- 完善方法文档,包含使用示例和性能优化说明
### 安全
- 只返回公开信息,不暴露内部实现细节(如动态库句柄、临时路径等)
- 使用读锁保证线程安全
## [0.1.6] - 2025-12-26
### 新增
- 新增 `execute_plugin` 方法,提供统一的插件执行接口
- 新增 `register_all_plugin_routes` 方法,支持将插件路由注册到 actix-web 框架
- 集成 actix-web 支持,插件可以注册 HTTP 路由
### 改进
- `execute_plugin` 方法包含完整的输入验证和超时保护机制
- `register_all_plugin_routes` 方法支持按父插件、子插件顺序注册路由
- 优化锁持有时间,减少并发冲突
- 增强错误处理和日志记录
### 安全
- `execute_plugin` 方法包含输入验证,防止路径遍历攻击
- 执行操作带有超时保护,防止长时间阻塞
- 动作名称长度限制,防止过长的输入
## [0.1.5] - 2025-12-26
### 改进
- 添加常量定义,统一管理默认配置值(插件目录、临时目录、超时时间等)
- 新增插件操作超时时间配置功能,支持自定义超时时间(默认 30 秒)
- 在 `PluginManagerConfig` 和 `PluginManagerConfigBuilder` 中添加 `timeout_secs` 配置项
- 优化配置管理,使用常量替代硬编码的默认值
- 改进代码可维护性,统一管理配置常量
## [0.1.3] - 2024-12-XX
### 新增
- 插件管理器核心功能
- 插件生命周期管理(加载、启动、停止、卸载)
- 插件元数据管理
- 插件配置管理
- 插件状态跟踪
- 插件工厂模式支持
- 动态库加载和卸载
- 插件指纹验证
- 数字签名验证支持
- 子插件管理功能
### 功能
- 支持插件的动态加载和卸载
- 支持插件状态查询和管理
- 支持插件配置的读取和更新
- 支持插件元数据的查询
- 支持插件工厂模式创建插件实例
### 技术栈
- Rust 2024 edition
- 使用 `libloading` 进行动态库加载
- 使用 `tokio` 提供异步运行时
- 使用 `tracing` 进行日志记录
- 使用 `serde` 进行序列化/反序列化
- 集成 `secra-pluginctl` 进行插件包管理
## [0.1.4] - 2025-12-26
### 安全
- 新增 `sanitize_plugin_name` 方法,清理插件名称防止路径遍历攻击
- 新增 `validate_path_within_base` 方法,验证路径是否在指定基础目录内
- 在动态库路径构建时应用路径清理和验证,增强安全性
### 改进
- 完善插件卸载功能,支持依赖关系检查和子插件处理
- 新增 `stop_plugin` 公开方法,提供插件停止的公开 API
- 新增 `check_plugin_dependencies` 方法,检查插件依赖关系
- 新增 `remove_child_from_parent` 方法,从父插件中移除子插件信息
- 优化 `unload_plugin` 方法,增加状态检查和错误处理
- 优化插件包加载逻辑,避免重复加载 artifact
- 改进代码注释,说明串行加载的原因和优化点
### 修复
- 更新 `.gitignore` 文件,完善忽略规则