文档: 全库走查报告(docs/05-代码审查 00-05)+ 规范更新

This commit is contained in:
lxy
2026-08-02 10:44:10 +08:00
parent 3f2cf5fa3a
commit 8eb689af37
9 changed files with 866 additions and 2 deletions
@@ -0,0 +1,124 @@
# DevFlow 全库代码走查汇总报告
> 走查日期: 2026-08-02
> 范围: 全部 12 个 crate + 1 个 src-tauri(入口),约 100+ 文件,~1.5MB 代码
> 走查方式: 逐文件全量阅读 + 交叉引用 + 架构分析
---
## 总览
| 报告 | 文件数 | 问题数 | P0 | P1 | P2 |
|---|---|---|---|---|---|
| 01-df-nodes | 17 | 20 | 3 | 7 | 10 |
| 02-df-workflow | 11 | 9 | 1 | 4 | 4 |
| 03-df-ai | 30 | 13 | 5 | 3 | 5 |
| 04-df-storage-ideas-mcp | 13 | 17 | 2 | 8 | 7 |
| 05-df-relay-tunnel-project-execute | 15 | 19 | 0 | 8 | 11 |
| **合计** | **86** | **78** | **11** | **30** | **37** |
---
## 按严重等级分布
### 🔴 P0(11 个,必须立即修)
| # | 模块 | 文件 | 问题 |
|---|---|---|---|
| 1 | df-nodes | ai_node.rs | schema `required=[]` 但运行时 prompt 必填,前后端不一致 |
| 2 | df-nodes | ai_self_review_node.rs | schema `required=["task_id","provider_id"]` 但 provider_id 可空 |
| 3 | df-nodes | docker_node.rs | shell_quote 不处理 `;` `|` `&`,命令注入漏洞 |
| 4 | df-workflow | conditions.rs | 单引号 `''` 转义边界 bug |
| 5 | df-ai | openai_compat.rs(58KB) | 超大文件,应拆分 |
| 6 | df-ai | anthropic_compat.rs(54KB) | 超大文件,应拆分 |
| 7 | df-ai | context_helpers.rs(63KB) | 超大文件,应拆分 |
| 8 | df-ai | coordinator.rs(65KB) | 超大文件,应拆分 |
| 9 | df-ai | sanitize.rs(51KB) | 超大文件,应拆分 |
| 10 | df-storage | migrations.rs(89KB) | 超大文件,应拆分 |
| 11 | df-storage | models.rs(25KB) | 超大文件,应拆分 |
### 🟡 P130 个,尽快修)
主要分布:
- **df-nodes**: DockerNode 命令注入、HumanNode timeout 3600s 过长、SubflowNode 不执行子 DAG
- **df-ai**: intent.rs 57KB 大文件、router cost_tier 悬空、retry 硬编码
- **df-storage**: keyring 迁移失败保留明文、单连接 Mutex、idea_repo 65KB
- **df-ideas**: adversarial 启发式论点模板化、LLM 一致性未校验
- **df-mcp**: tools.rs 31KB 大文件、未校验实体类型
- **df-relay**: 单 token 鉴权、锁粒度粗
- **df-tunnel**: 无自动重连 supervisor
- **df-execute**: pwsh 探测时序风险、env_snapshot 卡死
### 🟢 P2(37 个,后续迭代)
技术债务、轻微代码异味、文档不足。
---
## 关键发现
### 1. 大文件问题突出(11 个 P0 中 6 个是大文件)
| 文件 | 行数 | 建议 |
|---|---|---|
| `migrations.rs` | 89KB/1914行 | 拆为 migrations/v1.rs~v37.rs |
| `coordinator.rs` | 65KB | 拆为 coordinator/tasks.rs + scheduler.rs + state.rs |
| `context_helpers.rs` | 63KB | 拆为 token_estimator.rs + config.rs + classify.rs |
| `openai_compat.rs` | 58KB | 拆为 protocol.rs + stream.rs + embed.rs |
| `anthropic_compat.rs` | 54KB | 同上 |
| `sanitize.rs` | 51KB | 拆为 sanitize/ 目录 |
| `idea_repo.rs` | 65KB | 拆为 IdeaRepo + KnowledgeRepo + KnowledgeEventsRepo |
| `task_repo.rs` | 42KB | 拆为常规 CRUD + advance_status_atomic 专用文件 |
| `intent.rs` | 57KB | 拆为多个意图分类文件 |
| `models.rs` | 25KB | 拆为 models/idea.rs + project.rs + task.rs + ai.rs |
| `tools.rs`(df-mcp) | 31KB | 拆为 tools/ 目录 |
### 2. 安全风险
- **P0**: DockerNode shell_quote 命令注入(`;` `|` `&` 未转义)
- **P1**: df-storage 单连接 Mutex 无并发保护
- **P1**: df-mcp 未校验实体类型(跨实体误操作)
- **P1**: keyring 迁移失败保留明文在 SQLite
### 3. 功能不完整
- **SubflowNode**: 只返回子 DAG 元数据,不实际执行
- **NotifyNode**: desktop 类型只是 tracing 日志占位
- **conditions-eval**: 934 行条件引擎写了但默认 feature 关闭
- **coordinator**: 65KB 多 Agent 协调但未接入主 loop
- **planner**: 38KB 规划器但 Phase 0 未接入主 loop
### 4. 设计优秀点
- **状态机**: task_state_machine 双源一致性测试锁定 + 原子 CAS 写
- **对抗评估**: 三路径降级 + 三角色辩论 + 容错解析
- **重试策略**: 指数退避 + jitter + Fatal/Retryable 分类 + 预算上限
- **SSE 解析器**: 宽松 UTF-8 + 三种分隔符兼容 + 1MB 缓冲区上限
- **密钥管理**: keyring 迁移 + 失败计数阈值 + 归一化校验
- **MCP 安全**: High 风险默认拒绝 + read-only 模式 + 双保险
---
## 修复优先级建议
### 立即修(P0,影响安全性/功能正确性)
1. **docker_node.rs shell_quote 命令注入** — 用 shell-escape crate 或手动转义所有元字符
2. **ai_node.rs + ai_self_review_node.rs schema 不一致** — 修正 required 字段
3. **6 个大文件拆分** — 按模块拆分为多文件
### 尽快修(P1,影响稳定性/可维护性)
1. HumanNode timeout 默认值 3600s 过长 → 改为 1800s
2. SubflowNode 不执行子 DAG → 补递归执行
3. HttpNode 每次新建 Client → 复用连接池
4. df-mcp 未校验实体类型 → 对齐 B-260801-01 修复
5. keyring 迁移失败保留明文 → 加 AES fallback 或更强告警
### 后续迭代(P2
1. 大文件拆分持续推进
2. conditions-eval 默认开启
3. NotifyNode desktop 集成 tauri-plugin-notification
4. ScriptNode dangerous_keywords 配置化
5. 自动重连 supervisordf-tunnel