sdforge 0.3.0

Multi-protocol SDK framework with unified macro configuration
Documentation
# 更新日志

本项目所有重要变更都会在此文件中记录。

格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
本项目遵循 [语义化版本规范](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。

## [0.3.0] - 2026-07-04

### 概览

本次发布聚焦于**安全加固**与**依赖精简**:移除 confers 集成与 CLI 工具以收敛职责边界,缓存底座切换至 oxcache 0.3.2,修复 diting 安全审计 10 项发现与 kueiku FMEA 分析 5 项 Bug。共计 2057 个测试全部通过。

#### BREAKING 变更 ⚠️

1. **移除 confers 集成** — 删除 6 个特性:`validation``schema``watch``audit``hot-reload``cli`。如需 confers 能力,用户在自身代码中集成。
2. **移除 CLI 工具** — 删除 `src/main.rs``src/cli/` 目录,`cli` 特性不再存在。
3. **缓存底座从 dashmap 切换至 oxcache 0.3.2**`DashMapCache` 现为 `OxcacheSyncCache` 的类型别名(由 oxcache 的 `DashMapMemoryBackend` 支撑),内部所有 `DashMap` 用法替换为 `Mutex<HashMap>``RwLock<HashMap>`4. **移除 dashmap 依赖** — 不再出现在 Cargo.toml。
5. **ServerConfig 默认值变更**`DEFAULT_HOST``"0.0.0.0"`(fail-open,绑定所有网卡)改为 `"127.0.0.1"`(fail-safe 回环)。`Default` 实现改用常量:host="127.0.0.1"、port=8080、request_timeout_secs=30。
6. **JWT 密钥强制最小 32 字符**`MIN_SECRET_LENGTH=32` 常量现已实际用于校验,短于 32 字符的密钥将被拒绝并返回错误。
7. **CORS 校验收紧**`"http://"`(仅 scheme 无 host)在 `validate()``build_cors_layer()` 中均被拒绝。
8. **AppConfigBuilder::build() 一致性修复** — 未设置 `timeout` 字段时默认填充 `Some(TimeoutConfig::default())`,与 `AppConfig::default()` 行为一致。

#### 安全修复(diting 审计 — 10 项)

- **HIGH-001**:缓存 `key_index`/`backend` 一致性竞态 — 现在在整个 backend 操作期间持有 index 锁
- **HIGH-002**:缓存静默吞错 — backend 错误现通过 `log::warn!` 记录,不再 `let _ =`
- **MED-001**:websocket 中 `RwLock` 中毒 — 所有 `.write().unwrap()`/`.read().unwrap()` 替换为感知中毒的 `match`/`if let Ok(...)` 模式
- **MED-002**`regex_cache.rs``validation.rs``Mutex` 中毒 — 同样替换为感知中毒模式
- **MED-003**`init_all_plugins``Mutex` 中毒 — `routes.lock().unwrap().len()` 替换为 `.lock().map(|g| g.len()).unwrap_or(0)`
- **MED-004**:CORS validate 不一致 — 在 scheme 校验后新增 host 校验
- **LOW-001**`ServerConfig` fail-open 默认值 — 已修复(见 BREAKING 第 5 项)
- **LOW-002**:JWT 密钥无最小长度 — 已修复(见 BREAKING 第 6 项)
- **LOW-003**:WebSocket 认证文档告警 — 新增 Security Warning 文档注释
- **LOW-004**`SecurityHeaders::relaxed()` CSP 告警 — 新增 Security Warning 文档注释

#### Bug 修复(kueiku FMEA 分析 — 5 项)

- **BUG-1 [严重]**`remove_connection` usize 下溢 — 现先检查 `map.remove(id).is_some()``fetch_sub(1)`,防止 `usize::MAX` 下溢导致所有新连接被永久阻塞
- **BUG-2 [低]**`check_and_record` 窗口重置 off-by-one — 窗口重置时计数设为 1(非 0),当前消息被计入(原先每窗口允许 max+1 条消息)
- **BUG-3 [中]**`AppConfigBuilder::build()` timeout 不一致 — 已修复(见 BREAKING 第 8 项)
- **BUG-4 [中]**:缓存 backend 容量驱逐后 `key_index` 成为超集 — `find_keys_by_pattern` 现通过 `backend.exists()` 过滤并惰性清理过期索引项
- **BUG-5 [低]**`get_stats` 静默丢弃浮点统计 — 现尝试 u64 → f64(rate/ratio/pct ×100)→ `log::warn!`(不再静默)

#### 依赖变更

- **新增**`oxcache = { version = "0.3.2", features = ["memory"] }`(来自 crates.io)
- **移除**`dashmap``confers``schemars``clap``tera``walkdir`
- **移除特性**`validation``schema``watch``audit``hot-reload``cli`

#### 从 v0.2.0 迁移

1. 若使用 `cli` 特性或 `src/main.rs` 二进制,需在应用层自行实现 CLI
2. 若依赖 `confers` 特性(validation/schema/watch/audit/hot-reload),需在自身代码中直接集成 confers
3. `DashMapCache` 类型仍可编译(为 `OxcacheSyncCache` 别名),但底层实现已变更
4. `ServerConfig::default()` 现绑定 `127.0.0.1`,生产部署需显式配置 host
5. JWT 密钥若短于 32 字符将被拒绝,请更新密钥

#### 测试

- ✅ 2057 个测试全部通过(0 失败)
- ✅ clippy 零警告零错误

---

## [0.2.0] - 2026-07-04

### 概览

本次重大更新包含 Phase 1 架构改进(统一注册系统、配置管理重构、安全模块增强、缓存系统优化)、MCP SDK 迁移、OpenAPI 自动生成、文件拆分、代码质量清理(specmark code-quality-cleanup),以及性能基准文档。

#### BREAKING 变更 ⚠️

**MCP SDK 迁移(mcp-sdk 0.0.3 → rmcp 0.16):**
- 移除 `mcp-sdk = "0.0.3"` 依赖,新增 `rmcp = { version = "~0.16", features = ["server"] }`
- 移除 `initialize` 握手流程,改用 `server/discover` 端点(适配 MCP 2026-07-28 规范)
- 新增 `StatelessServerHandler` 无状态适配层,实现 `rmcp::ServerHandler` trait
- `RouteRegistration::register_mcp` 签名从 `fn register_mcp(&self, server: &mut Server)` 改为 `fn register_mcp(&self, registry: &mut dyn McpToolRegistry)`
- 新增 `Mcp-Method``Mcp-Name` HTTP 头解析(`parse_mcp_headers`- 新增 `cache_semantics` 模块处理 `ttlMs``cacheScope` 字段
- 新增 Multi Round-Trip Requests (MRTR) 支持,`MrtrSessionManager` 管理 300 秒超时会话

**配置验证统一:**
- `AuthConfig``ServerConfig``AppConfig``ValidateConfig` trait 实现委托给 inherent `validate()` 方法,消除双实现行为分叉

#### 新增特性

**统一注册系统:**
- 新增 `define_registration!` 宏,消除协议模块重复代码
- 新增 `Registration` trait,提供统一的协议注册接口
- HTTP、MCP、WebSocket、gRPC 四大协议模块全面采用统一注册系统
- 编译时协议选择,未使用的协议零编译代码

**OpenAPI 自动生成(新 `openapi` feature):**
- 基于 utoipa 5.5.0 生成 OpenAPI 3.1 规范
- `#[service_api]` 宏在 `openapi` 特性启用时自动通过 `inventory::submit!` 注册 `OpenApiRouteInfo`
- 新增 `OpenApiBuilder` 链式构造器(`new().title().version().description().build()`- 新增 `generate_openapi_spec()` 函数收集所有注册路由生成完整规范
- 宏使用 `#[cfg(feature = "openapi")]` 门控,未启用时零运行时开销

**OpenAPI 路径参数自动映射:**
- `#[service_api]` 宏自动提取路径参数(如 `/users/:id`)并生成 OpenAPI 参数条目
- 新增 `rust_type_to_openapi_schema()` 将 Rust 基本类型映射到 OpenAPI (type, format) 对
- 新增 `OpenApiPathParam` 类型,通过 `OpenApiRouteInfo::with_path_params()` 注册
- 宏生成 `#[cfg_attr(feature = "openapi", utoipa::path(...))]` 属性,支持 utoipa 工具链发现

**配置管理:**
- 新增模块化配置文件:`app.rs``cache.rs``security.rs`
- 新增 Builder 模式支持,提供更友好的 API
- 新增集中式默认值管理
- 新增配置验证功能(需启用 `validation` feature)

**安全增强:**
- 新增 API Key 版本管理功能
- 新增 LRU 缓存管理器,防止内存增长
- 新增密钥轮换审计日志
- 新增密钥过期检查机制

**缓存优化:**
- 新增 `canonicalize_cache_key()` 键规范化函数
- 新增 `invalidate(pattern: &str)` 模式匹配失效
- 新增 `find_keys_by_pattern()` 正则表达式匹配
- 新增 `get_stats()` 统计信息跟踪
- 新增 `delete_many()` 批量删除操作

#### 文件拆分(降低单文件复杂度)

**Phase 1 拆分:**
- `src/mcp/mod.rs` 拆分为 `server.rs``handler.rs``stateless.rs``headers.rs``cache_semantics.rs``mrtr.rs``protocol.rs` + `tests/`(mod.rs 从 800+ 行降至 200 行)
- `src/websocket/mod.rs` 拆分为 `connection.rs``handler.rs``broadcast.rs``message.rs` + `tests/`(mod.rs 从 2742 行降至 69 行)
- `src/core/error/mod.rs` 拆分为 `api_error.rs``i18n.rs``context.rs``sdforge_error.rs` + `tests/`(mod.rs 从 800+ 行降至 23 行)

**代码质量清理拆分(specmark code-quality-cleanup):**
- `src/security/audit.rs` (2210 行) → `audit/mod.rs` + `audit/tests/`(54 audit_logger + 10 builder 测试)
- `src/security/bearer.rs` (2107 行) → `bearer/mod.rs` + `bearer/tests/`(71 bearer_auth + 11 builder 测试)
- `src/security/types.rs` (1565 行) → `types/mod.rs` + `types/tests/`(75 types 测试)
- `src/http/mod.rs` (2210 → 434 行) + `tests/`(22 config + 44 routing + 3 middleware 测试)
- `src/grpc/mod.rs` (2067 → ~251 行) + `tests/`(88 grpc_service + 9 interceptor 测试)
- `src/streaming/mod.rs` (1458 → 231 行) + `tests/`(16 sse + 61 stream_builder 测试)

#### 改进

- 重构 HTTP 路由注册流程,减少样板代码
- 重构 MCP 工具注册流程,提高一致性
- 重构 WebSocket 路由注册,简化实现
- 重构 gRPC 路由注册,统一风格
- 优化缓存键处理,减少因格式不一致导致的 miss
- 优化错误处理,移除 CLI 相关变体(仅在 main.rs 中可用)
- audit 模块的 `eprintln!` 替换为 `log::warn!`(新增 `log` 工作区依赖)
- validation 模块移除 `#![allow(clippy::result_large_err)]`,改为 6 个函数级 `#[allow]`
- websocket/tests 和 core/error/tests 清理 `#![allow(unused_imports)]` 和未使用导入
- websocket handler/connection 添加 `#[cfg(feature = "security")]` 门控,使 `http,websocket`(无 security)编译通过
- 为 perf_* 示例添加 `required-features = ["cache"]` 声明
- 所有源文件添加 `SPDX-License-Identifier: MIT`
#### 正确性修复

- **CRIT-3**:移除 `macros/src/lib.rs``_param_unwraps` 的逐字重复定义
- **CRIT-4**`AuthConfig`/`ServerConfig`/`AppConfig``validate()` 实现统一为单一来源
- **CRIT-5**`MrtrSessionManager::create_session` 添加会话 ID 冲突检查,冲突时返回 `ErrorData::invalid_params`(原静默覆盖)
- **CRIT-6**:SSE 流 30 秒超时后发送 `Error` 事件,客户端可区分超时与正常完成
- **HIGH-003**:修复 `RegexCache` LRU 驱逐逻辑(`Reverse(time)` 导致驱逐 MRU 而非 LRU)
- **C-HIGH-1**:修复版本路由 `"v"` 单字符误判为有效版本(缺少 `len() > 1` 检查)
- **C-HIGH-4**`ApiError::from_std_error``SystemTime::now().duration_since(UNIX_EPOCH).unwrap()` 改为 `.unwrap_or_default()`,防止系统时钟回拨 panic

#### 质量门禁

- 覆盖率从 88.96% 提升至 95.94%(2720/2835 行),超过 95% 目标
- `cargo clippy --all-features --all-targets -- -D warnings` 零警告零错误
- CI 覆盖率门禁修复:`--features full --lib` 替代 `--all-features --workspace` 避免 macros trybuild 测试超时
- `.tarpaulin.toml` 配置修正:`exclude_files``exclude-files`(kebab-case)
- diting 6 维度全量审查完成(Security/Performance/Quality/Architecture/Simplification/Correctness),6 项 P0 Critical/High 问题已修复
- 25 项 Medium/High 技术债记录至 `SIMPLIFY-DEBT.md` 作为 v0.2.1+ backlog

#### 文档

- `README.md` 改为中文版(原 `README_zh.md`),英文版迁移至 `README_EN.md`
- 移除所有 Redis 提及(与 no-db 策略一致)
- 修正 `CacheConfig` 文档示例字段(`ttl_seconds`/`max_size_mb`/`max_entries``default_ttl_secs`/`max_items`/`track_stats`- Feature 表格新增 `openapi`/`cli`/`validation`/`schema`/`watch`/`audit`/`simd-json`/`hex` 行,修正 `mcp`/`security`/`full` 依赖描述
- 新增 "OpenAPI 自动生成" 章节(README.md + README_EN.md)
- 新增 "MCP 2026-07-28 迁移指南" 章节(README.md + README_EN.md)
- 项目结构图补充 `streaming/` 模块
- 新增 `docs/benchmarks/vs-server-less.md` 性能基准文档(http vs full 编译时间/体积对比,实测数据)
- 新增 `SIMPLIFY-DEBT.md` 技术债清单(记录 25 项 Medium/High 技术债作为 v0.2.1+ backlog,含源代码路径索引)

#### 测试

- ✅ lib 测试 1638 个全部通过(基线 1383 + 新增 255)
- ✅ clippy 零警告零错误
- ✅ 覆盖率 95.94%
- ✅ CI 门禁本地验证通过

#### 技术债务

- 移除 `SdForgeError::Generator` 变体(CLI 模块不可用于 lib)
- 清理条件编译相关的 unreachable pattern
- `ApiError` 枚举体积过大(Internal/ServiceUnavailable 变体包含 `Box<dyn StdError>` + `ErrorContext`),导致 `clippy::result_large_err` 在 validation 模块 6 个函数上需局部 `#[allow]`;拆分 `ApiError` 记录为技术债

---

## [0.1.0] - 2026-01-19

### 初始发布

SDForge 框架首次发布(前身为 axiom,已于 2026-01-17 重命名为 sdforge)。

#### 核心特性

- **统一接口**:单个 `#[service_api]` 宏同时支持 HTTP 和 MCP
- **编译期协议选择**:通过 Cargo features 控制生成哪些协议
- **零运行时开销**:未使用的协议不会出现在二进制文件中
- **类型安全**:编译期验证 API 配置正确性

#### 支持的协议

- HTTP(通过 Axum 0.8.8)
- MCP(通过 mcp-sdk 0.0.3,后续在 0.2.0 迁移到 rmcp 0.16)

#### 支持的特性

| 特性 | 说明 | 默认启用 |
|------|------|---------|
| `http` | HTTP 服务器支持 ||
| `mcp` | MCP 协议支持 ||
| `streaming` | SSE 流式响应 ||
| `timestamp` | 响应时间戳 ||
| `logging` | 结构化请求日志 ||
| `security` | 安全认证和审计 ||
| `cache` | 响应缓存(LRU) ||
| `full` | 启用所有功能 ||

#### 安全功能

- Bearer Token 认证(HMAC-SHA256 JWT 验证)
- IP 白名单验证(拒绝私有/保留地址)
- 限流器(带幂等性支持)
- 审计日志(防 DoS 设计)
- 错误消息脱敏(防止信息泄露)

#### 缓存系统

- 基于内存的 HTTP 响应缓存
- ETag 和 Last-Modified 支持
- LRU 淘汰策略
- 可配置的大小和数量限制

#### 测试

- 单元测试(23+ 测试)
- 集成测试(HTTP、MCP、双协议)
- 缓存集成测试
- 配置集成测试
- 编译失败测试

#### 性能

- HTTP 请求处理:10,000+ req/s
- MCP 工具调用:5,000+ ops/s
- P50 延迟:< 0.5ms
- P95 延迟:< 1ms