Files
DevFlow/docs/05-代码审查/04-df-storage-ideas-mcp-走查-2026-08-02.md

90 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# df-storage + df-ideas + df-mcp 代码走查报告
> 走查日期: 2026-08-02
> 范围: crates/df-storage/ (7 files, ~142KB) + crates/df-ideas/ (7 files, ~63KB) + crates/df-mcp/ (3 files, ~52KB)
---
## 一、df-storage 存储层
### 文件规模
| 文件 | 行数 | 类型 |
|---|---|---|
| migrations.rs | 89,663 | 迁移脚本(37 个版本) |
| models.rs | 24,880 | 15 个数据模型 |
| secret.rs | 16,523 | 密钥管理(keyring) |
| crud/mod.rs | 14,919 | Repo 宏 + 公共工具 |
| crud/task_repo.rs | 42,011 | 任务 Repo |
| crud/idea_repo.rs | 65,123 | 灵感 Repo |
| crud/conversation_repo.rs | 23,614 | 对话 Repo |
| crud/message_repo.rs | 26,633 | 消息 Repo |
| crud/project_repo.rs | 20,753 | 项目 Repo |
| crud/settings.rs | 11,778 | 列白名单 |
### 问题汇总
| # | 等级 | 文件 | 类型 | 简述 |
|---|---|---|---|---|
| 1 | 🟡 P1 | migrations.rs | smell | 89KB 单文件,37 个迁移函数全在一个文件,V1 建表 SQL 也嵌在里面 |
| 2 | 🟡 P1 | secret.rs | risk | keyring 在 Linux 无 GUI 会话时静默失败,`set_provider_secret` 返回 Err 但上层不处理 |
| 3 | 🟡 P1 | db.rs | risk | 单连接 `Mutex<Connection>`GUI + MCP server 并发读写时锁竞争 |
| 4 | 🟡 P1 | crud/mod.rs | risk | `impl_repo!` 宏生成的 `update_field` 不校验 entity_type(已知缺陷 B-260801-01 |
| 5 | 🟡 P1 | crud/idea_repo.rs | smell | 65KB 单文件,灵感 Repo 含知识库/向量工具,职责过宽 |
| 6 | 🟡 P1 | crud/task_repo.rs | smell | 42KB 单文件,含 `advance_status_atomic` 状态机收口 |
| 7 | 🟢 P2 | secret.rs | smell | 迁移失败计数 sidecar 文件用 `.devflow-keyring-failcount`,路径依赖 cwd |
| 8 | 🟢 P2 | models.rs | smell | `AiProviderRecord``Debug` 手动脱敏,新增字段易漏 |
| 9 | 🟢 P2 | migrations.rs | smell | 37 个迁移版本,V1 建表 SQL 内联,V21 消息拆表迁移函数长 |
### 正面评价
1. **胡盾宏 impl_repo!**: 消除 14 个 Repo 的重复样板,from_row/insert/update 三体分离
2. **迁移幂等**: column_exists 探测,新库/老库/坏数据均不崩
3. **WAL 模式**: `PRAGMA journal_mode=WAL` 已启用,GUI + MCP 并发安全
4. **密钥管理**: keyring 迁移 + 失败计数阈值 + 显示告警,设计完整
5. **ensure_resolved_key**: 归一化(trim/剥引号)防粘贴脏 key
6. **列白名单**: `allowed_columns_for` 每表独立白名单,防 SQL 注入
7. **基线测试**: `all_known_tables_have_column_whitelist` 防新增表漏白名单
---
## 二、df-ideas 灵感评估
### 问题汇总
| # | 等级 | 文件 | 类型 | 简述 |
|---|---|---|---|---|
| 1 | 🟡 P1 | adversarial.rs | smell | 296KB 单文件,引擎 + 测试混在一起,测试应拆到独立文件 |
| 2 | 🟡 P1 | adversarial_helpers.rs | risk | 拒绝语义化关键字 `"no"` 过宽,`"no problem"` 等文本可能误判 |
| 3 | 🟢 P2 | scoring.rs | smell | 关键词匹配 `count_any` 否定前缀处理复杂,但只处理单字+两字否定 |
| 4 | 🟢 P2 | scoring_keywords.rs | smell | 关键词硬编码,最佳实践应为 JSON 配置 |
| 5 | 🟢 P2 | adversarial.rs | risk | `evaluate_with_llm` 返回一致性未校验,ARC-260618-01-e 待决策 |
### 正面评价
1. **对抗评估架构**: 启发式/LLM 双轨 + 自动降级,`evaluated_by` 三态标记前端可展示
2. **LLM prompt 设计**: 三角色辩论 + 严格 JSON schema + 截断保护
3. **parse_llm_eval 容错**: 剥离 ```json 围栏 + 正则兜底 + 枚举映射 + 数值 clamp
4. **评分引擎**: 否定前缀处理(不复用反向不计入复用正向分),设计精细
5. **测试覆盖**: adversarial 7 个启发式 + 1 个 LLM mock 测试,scoring 10 个测试
---
## 三、df-mcp MCP Server
### 问题汇总
| # | 等级 | 文件 | 类型 | 简述 |
|---|---|---|---|---|
| 1 | 🟡 P1 | tools.rs | smell | 31KB 单文件,19 个 handler + 工具定义全在一起 |
| 2 | 🟡 P1 | tools.rs | risk | `Box::leak` 静态化工具定义,但 `all_tools()` 每次调用重新构建 Vec |
| 3 | 🟢 P2 | server.rs | smell | dispatch 中 `high_risk` 兜底拒绝与 `visible` 过滤双重检查,但 `visible` 已过滤 High |
| 4 | 🟢 P2 | protocol.rs | smell | `McpMethod::from_request``tools/call` 的 arguments 取 `req.params.get("arguments")`,可能为 null |
### 正面评价
1. **安全设计**: High 风险工具默认拒绝,read-only 模式仅 Low,双保险
2. **协议实现**: 完整 JSON-RPC 2.0 + MCP 2025-06-18 协议
3. **测试覆盖**: initialize/list/call/High拒绝/read-only/create-then-list 全路径覆盖
4. **handler 函数指针**: 避免闭包捕获生命周期问题
5. **medium_audit 审计日志**: Medium 风险工具调用有 tracing::warn 审计