4 workflow/35 维度走查产出:P0(2 已修)+ P1(4 修 + 2 专项登记)+ P2/P3 清单 + 推翻假设(AiChat 798 非 God / human_node 测试 76% 无债)。每发现 file:line 源码佐证。
6.2 KiB
6.2 KiB
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 个)
- P0 DockerNode shell_quote 命令注入(
;|&未转义) - P1 DockerNode volumes.host 用户可控注入
功能缺陷(3 个)
- P1 SubflowNode 不实际执行子 DAG
- P1 NotifyNode desktop 只是日志占位
- P1 df-mcp 未校验实体类型(跨实体误操作)
可维护性(18 个)
- P0 migrations.rs 89KB / coordinator.rs 65KB / context_helpers.rs 63KB
- P0 openai/anthropic_compat 双文件 112KB 重复
- P1 intent.rs 57KB / sanitize.rs 51KB / idea_repo 65KB 等
- P2 各种 DRY 漂移、关键词硬编码
性能(2 个)
- P1 HttpNode 每次新建 Client
- P1 db.rs 单连接 Mutex 瓶颈
正面评价(亮点)
设计优秀
- 状态机: task_state_machine 从 TaskStatus::as_str() 派生常量 + 双源一致性测试
- CAS 原子写: advance_status_atomic
WHERE status=expected防 TOCTOU - HumanNode 拒绝语义化: 审批拒绝从 Ok→Err,触发工作流 failed→退回
- AiSelfReviewNode 兜底: verdict=unknown 不阻断,保持人定权
- conditions 求值失败保守 false: 安全优先
架构合理
- df-ai-core 下沉: trait+类型在轻量 crate,df-ideas 不引入 HTTP 重依赖
- impl_repo! 宏: 消除 14 个 Repo 的重复样板
- WAL 模式: 已启用,GUI + MCP 并发安全
- 密钥管理: keyring 迁移 + 失败计数 + 显示告警
测试覆盖
- 每个节点文件都有配套测试
- advance_task_atomic 有 20+ 测试覆盖各种状态转换
- router.rs 全维度覆盖(10+ 测试)
- retry.rs 覆盖首次成功/重试成功/耗尽/Fatal
- MCP server 协议层完整测试
代码质量
- 注释详尽,每处设计决策都有理由/替代方案/选型依据
- 降级路径完整(LLM→启发式→兜底)
- 锁中毒不 panic,返回保守默认值
- SSE 解析器宽松 UTF-8 处理
改进优先级建议
立即修复(P0,7 个)
- DockerNode shell_quote 命令注入(最快修,影响安全)
- ai_node.rs schema/运行时不一致
- ai_self_review_node.rs schema/运行时不一致
- migrations.rs 拆分(89KB 单文件)
- coordinator.rs 拆分(65KB 单文件)
- context_helpers.rs 拆分(63KB 单文件)
- openai/anthropic_compat 共享模块抽取
尽快修复(P1,20 个)
- HumanNode timeout 默认值
- HttpNode Client 复用
- SubflowNode 功能完整
- conditions.rs 拆分
- df-mcp 实体类型校验
- db.rs 连接池
- keyring 迁移明文告警
后续迭代(P2,15 个)
- 大文件拆分(intent/sanitize/idea_repo/task_repo)
- DRY 漂移(shell_quote 共享)
- 关键词配置化
- relay 自动重连 supervisor