文档: 全库走查报告(walkthrough-2026-08,summary + 4 分方向)
4 workflow/35 维度走查产出:P0(2 已修)+ P1(4 修 + 2 专项登记)+ P2/P3 清单 + 推翻假设(AiChat 798 非 God / human_node 测试 76% 无债)。每发现 file:line 源码佐证。
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
# DevFlow 全量代码走查汇总报告
|
||||
|
||||
> 走查日期: 2026-08-02
|
||||
> 范围: 12 个 crate, ~80 文件, ~1.2MB 源码
|
||||
> 走查方式: 逐文件全量阅读 + 交叉引用 + 自动化分析
|
||||
|
||||
---
|
||||
|
||||
## 走查覆盖
|
||||
|
||||
| 模块 | 文件数 | 代码量 | 报告 |
|
||||
|---|---|---|---|
|
||||
| df-nodes(节点) | 17 | ~280KB | 01 ✅ |
|
||||
| df-workflow(工作流引擎) | 11 | ~108KB | 02 ✅ |
|
||||
| df-ai + df-ai-core(AI 核心) | 30 | ~555KB | 03 ✅ |
|
||||
| df-storage(存储层) | 7 | ~150KB | 04+05 ✅ |
|
||||
| df-ideas(灵感评估) | 7 | ~63KB | 04 ✅ |
|
||||
| df-mcp(MCP Server) | 3 | ~52KB | 04 ✅ |
|
||||
| df-execute(命令执行) | 2 | ~34KB | 04 ✅ |
|
||||
| df-relay(云中继) | 5 | ~30KB | 05 ✅ |
|
||||
| df-tunnel(隧道) | 3 | ~28KB | 05 ✅ |
|
||||
| df-project(项目管理) | 3 | ~21KB | 05 ✅ |
|
||||
| df-types(类型定义) | 3 | ~42KB | 05 ✅ |
|
||||
| **总计** | **~91** | **~1.4MB** | **5 份报告** |
|
||||
|
||||
---
|
||||
|
||||
## 问题汇总(按等级)
|
||||
|
||||
### 🔴 P0(7 个)
|
||||
|
||||
| # | 模块 | 文件 | 简述 |
|
||||
|---|---|---|---|
|
||||
| 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-ai | openai/anthropic_compat | 双文件 112KB,大量重复代码,应抽取共享模块 |
|
||||
| 5 | df-ai | coordinator.rs | 65KB 单文件,DevFlow 最大文件,应拆分 |
|
||||
| 6 | df-ai | context_helpers.rs | 63KB 纯辅助函数单文件,应拆分 |
|
||||
| 7 | df-storage | migrations.rs | 89KB 单文件,37 个迁移函数应拆分到独立文件 |
|
||||
|
||||
### 🟡 P1(20 个)
|
||||
|
||||
| # | 模块 | 简述 |
|
||||
|---|---|---|
|
||||
| 1 | df-nodes | DockerNode volumes.host 用户可控,命令注入 |
|
||||
| 2 | df-nodes | HumanNode timeout 默认 3600s 过长 |
|
||||
| 3 | df-nodes | HttpNode 每次新建 reqwest::Client |
|
||||
| 4 | df-nodes | SubflowNode 不实际执行子 DAG |
|
||||
| 5 | df-nodes | human_node.rs(833行) / conditions.rs(934行) 过大 |
|
||||
| 6 | df-workflow | conditions.rs 934 行单文件,应拆分 |
|
||||
| 7 | df-workflow | conditions-eval feature 默认关闭 |
|
||||
| 8 | df-ai | intent.rs 57KB 单文件 |
|
||||
| 9 | df-ai | context/sanitize.rs 51KB 单文件 |
|
||||
| 10 | df-ai | router cost_tier/intelligence 悬空无数据源 |
|
||||
| 11 | df-ai | retry.rs MAX_COMPLETE_ATTEMPTS=3 硬编码 |
|
||||
| 12 | df-ideas | adversarial.rs 29KB + 测试混在一起 |
|
||||
| 13 | df-ideas | LLM 评估一致性未校验 |
|
||||
| 14 | df-execute | env_snapshot Windows Store alias 卡死(已修复) |
|
||||
| 15 | df-execute | shell.rs pwsh 首次探测时序依赖 |
|
||||
| 16 | df-mcp | tools.rs 未校验实体类型(同 B-260801-01) |
|
||||
| 17 | df-storage | secret.rs keyring 迁移失败保留明文 |
|
||||
| 18 | df-storage | db.rs 单连接 Mutex 瓶颈 |
|
||||
| 19 | df-storage | idea_repo.rs 65KB / task_repo.rs 42KB |
|
||||
| 20 | df-relay | 单 token 鉴权,生产级需独立 |
|
||||
|
||||
### 🟢 P2(15 个)
|
||||
|
||||
| # | 模块 | 简述 |
|
||||
|---|---|---|
|
||||
| 1-2 | df-nodes | shell_quote DRY 漂移 / REJECT_KEYWORDS "no" 过宽 |
|
||||
| 3-4 | df-ai | ChatMessage 18 字段 / SSE 1MB BUF_MAX |
|
||||
| 5-6 | df-ideas | 关键词硬编码 / 否定前缀仅单字+两字 |
|
||||
| 7-8 | df-storage | 迁移失败计数 cwd 依赖 / Debug 脱敏手动 |
|
||||
| 9-10 | df-relay | device 无主动心跳 / 匿名结构体提取 payload |
|
||||
| 11-12 | df-project | is_pure_badge_line 手写复杂 / 无 regex |
|
||||
| 13-14 | df-types | 9 个 ID 别名 / MentionRef/Augmentation 未共用反序列化 |
|
||||
| 15 | df-mcp | Box::leak 违背进程生命周期假设 |
|
||||
|
||||
---
|
||||
|
||||
## 按严重程度排序
|
||||
|
||||
### 安全漏洞(2 个)
|
||||
1. **P0** DockerNode shell_quote 命令注入(`;` `|` `&` 未转义)
|
||||
2. **P1** DockerNode volumes.host 用户可控注入
|
||||
|
||||
### 功能缺陷(3 个)
|
||||
1. **P1** SubflowNode 不实际执行子 DAG
|
||||
2. **P1** NotifyNode desktop 只是日志占位
|
||||
3. **P1** df-mcp 未校验实体类型(跨实体误操作)
|
||||
|
||||
### 可维护性(18 个)
|
||||
1. **P0** migrations.rs 89KB / coordinator.rs 65KB / context_helpers.rs 63KB
|
||||
2. **P0** openai/anthropic_compat 双文件 112KB 重复
|
||||
3. **P1** intent.rs 57KB / sanitize.rs 51KB / idea_repo 65KB 等
|
||||
4. **P2** 各种 DRY 漂移、关键词硬编码
|
||||
|
||||
### 性能(2 个)
|
||||
1. **P1** HttpNode 每次新建 Client
|
||||
2. **P1** db.rs 单连接 Mutex 瓶颈
|
||||
|
||||
---
|
||||
|
||||
## 正面评价(亮点)
|
||||
|
||||
### 设计优秀
|
||||
1. **状态机**: task_state_machine 从 TaskStatus::as_str() 派生常量 + 双源一致性测试
|
||||
2. **CAS 原子写**: advance_status_atomic `WHERE status=expected` 防 TOCTOU
|
||||
3. **HumanNode 拒绝语义化**: 审批拒绝从 Ok→Err,触发工作流 failed→退回
|
||||
4. **AiSelfReviewNode 兜底**: verdict=unknown 不阻断,保持人定权
|
||||
5. **conditions 求值失败保守 false**: 安全优先
|
||||
|
||||
### 架构合理
|
||||
1. **df-ai-core 下沉**: trait+类型在轻量 crate,df-ideas 不引入 HTTP 重依赖
|
||||
2. **impl_repo! 宏**: 消除 14 个 Repo 的重复样板
|
||||
3. **WAL 模式**: 已启用,GUI + MCP 并发安全
|
||||
4. **密钥管理**: keyring 迁移 + 失败计数 + 显示告警
|
||||
|
||||
### 测试覆盖
|
||||
1. 每个节点文件都有配套测试
|
||||
2. advance_task_atomic 有 20+ 测试覆盖各种状态转换
|
||||
3. router.rs 全维度覆盖(10+ 测试)
|
||||
4. retry.rs 覆盖首次成功/重试成功/耗尽/Fatal
|
||||
5. MCP server 协议层完整测试
|
||||
|
||||
### 代码质量
|
||||
1. 注释详尽,每处设计决策都有理由/替代方案/选型依据
|
||||
2. 降级路径完整(LLM→启发式→兜底)
|
||||
3. 锁中毒不 panic,返回保守默认值
|
||||
4. SSE 解析器宽松 UTF-8 处理
|
||||
|
||||
---
|
||||
|
||||
## 改进优先级建议
|
||||
|
||||
### 立即修复(P0,7 个)
|
||||
1. DockerNode shell_quote 命令注入(最快修,影响安全)
|
||||
2. ai_node.rs schema/运行时不一致
|
||||
3. ai_self_review_node.rs schema/运行时不一致
|
||||
4. migrations.rs 拆分(89KB 单文件)
|
||||
5. coordinator.rs 拆分(65KB 单文件)
|
||||
6. context_helpers.rs 拆分(63KB 单文件)
|
||||
7. openai/anthropic_compat 共享模块抽取
|
||||
|
||||
### 尽快修复(P1,20 个)
|
||||
1. HumanNode timeout 默认值
|
||||
2. HttpNode Client 复用
|
||||
3. SubflowNode 功能完整
|
||||
4. conditions.rs 拆分
|
||||
5. df-mcp 实体类型校验
|
||||
6. db.rs 连接池
|
||||
7. keyring 迁移明文告警
|
||||
|
||||
### 后续迭代(P2,15 个)
|
||||
1. 大文件拆分(intent/sanitize/idea_repo/task_repo)
|
||||
2. DRY 漂移(shell_quote 共享)
|
||||
3. 关键词配置化
|
||||
4. relay 自动重连 supervisor
|
||||
Reference in New Issue
Block a user