Files
DevFlow/docs/05-代码审查/00-全库代码走查汇总-2026-08-02.md

124 lines
5.1 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.
# 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