5.1 KiB
5.1 KiB
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) | 超大文件,应拆分 |
🟡 P1(30 个,尽快修)
主要分布:
- 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,影响安全性/功能正确性)
- docker_node.rs shell_quote 命令注入 — 用 shell-escape crate 或手动转义所有元字符
- ai_node.rs + ai_self_review_node.rs schema 不一致 — 修正 required 字段
- 6 个大文件拆分 — 按模块拆分为多文件
尽快修(P1,影响稳定性/可维护性)
- HumanNode timeout 默认值 3600s 过长 → 改为 1800s
- SubflowNode 不执行子 DAG → 补递归执行
- HttpNode 每次新建 Client → 复用连接池
- df-mcp 未校验实体类型 → 对齐 B-260801-01 修复
- keyring 迁移失败保留明文 → 加 AES fallback 或更强告警
后续迭代(P2)
- 大文件拆分持续推进
- conditions-eval 默认开启
- NotifyNode desktop 集成 tauri-plugin-notification
- ScriptNode dangerous_keywords 配置化
- 自动重连 supervisor(df-tunnel)