From 38c7180365e17aefa63e97250637dbf3833556df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Tue, 16 Jun 2026 02:33:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E6=96=87=E6=A1=A3(?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=8E=A8=E8=BF=9B=E9=93=BE=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=B7=AF=E5=BE=84+=E4=BB=BB=E5=8A=A1=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=88=86=E6=9E=90+=E5=AE=A1=E6=9F=A5=E6=8A=A5=E5=91=8A+patch?= =?UTF-8?q?=5Ffile=E6=8C=87=E5=8D=97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 + PROGRESS.md | 8 +- docs/02-架构设计/Phase1架构决策-2026-06-12.md | 8 +- ...2025-07-15.md => aichat交互体验改进方案-2026-06-14.md} | 2 +- docs/02-架构设计/aichat审查报告-2026-06-14.md | 23 +- ...2025-07-15.md => aichat授权体验改进方案-2026-06-14.md} | 50 +- docs/02-架构设计/业务系统设计-2026-06-12.md | 399 ++++++-------- .../任务推进链实施路径-2026-06-16.md | 125 +++++ .../对抗论证裁决报告-2026-06-12.md | 6 +- .../df-ai-AI集成模块-2026-06-12.md | 14 +- .../想法探索-对抗式评估-2026-06-12.md | 2 +- .../DEVFLOW-2.IPC桥接实施-2026-06-12.md | 22 +- .../DEVFLOW-3.Store对接实施-2026-06-12.md | 14 +- .../DEVFLOW-4.端到端验证-2026-06-12.md | 8 +- .../任务执行与推进能力分析-2026-06-16.md | 516 ++++++++++++++++++ .../任务模块问题分析-2026-06-16.md | 351 ++++++++++++ docs/07-项目管理/Phase1任务清单-2026-06-12.md | 4 +- docs/08-用户指南/patch_file使用指南.md | 107 ++++ docs/08-用户指南/使用手册-2026-06-12.md | 25 +- docs/INDEX.md | 4 +- docs/todo.md | 426 +++++++++------ package-lock.json | 10 + package.json | 1 + src-tauri/Cargo.toml | 2 + 24 files changed, 1644 insertions(+), 485 deletions(-) rename docs/02-架构设计/{aichat交互体验改进方案-2025-07-15.md => aichat交互体验改进方案-2026-06-14.md} (99%) rename docs/02-架构设计/{aichat授权体验改进方案-2025-07-15.md => aichat授权体验改进方案-2026-06-14.md} (87%) create mode 100644 docs/02-架构设计/任务推进链实施路径-2026-06-16.md create mode 100644 docs/05-代码审查/任务执行与推进能力分析-2026-06-16.md create mode 100644 docs/05-代码审查/任务模块问题分析-2026-06-16.md create mode 100644 docs/08-用户指南/patch_file使用指南.md diff --git a/Cargo.lock b/Cargo.lock index 8a343e8..cac6fd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -721,6 +721,7 @@ name = "devflow" version = "0.1.0" dependencies = [ "anyhow", + "base64 0.22.1", "chrono", "df-ai", "df-core", @@ -805,6 +806,7 @@ dependencies = [ "df-ai", "df-core", "df-execute", + "df-storage", "df-workflow", "serde", "serde_json", diff --git a/PROGRESS.md b/PROGRESS.md index 15ad2d8..a8f9446 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -9,7 +9,7 @@ | 项目 | 值 | |------|-----| | 定位 | AI 原生创作流程驾驶舱,从想法到创作成果的全流程管理 | -| 技术栈 | Tauri v2 + Vue 3 + TypeScript + Pinia / Rust Workspace (13 crate) / SQLite | +| 技术栈 | Tauri v2 + Vue 3 + TypeScript + Pinia / Rust Workspace (8 crate) / SQLite | | 路径 | `E:/wk-lab/devflow/` | | 架构文档 | `ARCHITECTURE.md` (22,745 字) | | Git 状态 | 未首次 commit,代码全在 untracked | @@ -45,7 +45,7 @@ | 设计系统 | 1 | 105 | ✅ CSS 变量/动画/Arco 暗色覆盖 | | **前端合计** | | **~8,812** | | -> Tauri Commands 已达 **57 个**(project/task/idea/workflow + AI 对话/工具/审批/Provider/技能全功能 + 知识库 11 个),见后端 src-tauri/src/commands/。 +> Tauri Commands 已达 **67 个**(src-tauri/src/lib.rs invoke_handler 注册数:project 14 / task 5 / idea 6 / workflow 5 / ai 19 / knowledge 14 / settings 4),见后端 src-tauri/src/commands/。 **前端关键问题**(Sprint 4/7 已全部解决): - ~~所有 View 组件数据硬编码~~ ✅ Sprint 4 接 Store 真数据 @@ -69,7 +69,7 @@ ~~df-workflow → df-stages (11种阶段节点 execute() 待实现)~~ — df-stages 已移除(2026-06-14 零引用清理) ~~df-ai → LlmProvider 实现~~ ✅ 已打通(OpenAI/Anthropic 双协议真实 HTTP,Sprint 5/8) ~~df-storage → 所有 crate 的 CRUD 操作~~ ✅ 已打通(impl_repo! 宏 CRUD + 多 Repo,Sprint 2) - ~~Tauri commands → Rust 业务逻辑~~ ✅ 已打通(47 commands 全接业务,Sprint 3) + ~~Tauri commands → Rust 业务逻辑~~ ✅ 已打通(Sprint 3 时点 47 commands 全接业务;现 67) ~~Vue Views → Pinia Store → Tauri IPC → Rust~~ ✅ 已打通(Sprint 4) ``` @@ -136,7 +136,7 @@ **工作内容**: - 创建项目骨架:`bun create vite` + Tauri v2 + Cargo Workspace - 编写完整架构文档 `ARCHITECTURE.md` (22,745 字) -- 13 个 Rust crate 全部创建,类型系统和接口设计完整 +- 13 个 Rust crate 全部创建,类型系统和接口设计完整(2026-06-14 评审后删 5 僵尸 crate,现 8 crate) - 9 个 Vue 页面 UI 全部编写(~3,372 行),设计系统完善 - 4 个 Pinia Store 定义(state + computed) - i18n 中英文翻译 diff --git a/docs/02-架构设计/Phase1架构决策-2026-06-12.md b/docs/02-架构设计/Phase1架构决策-2026-06-12.md index 1025b76..511a0f5 100644 --- a/docs/02-架构设计/Phase1架构决策-2026-06-12.md +++ b/docs/02-架构设计/Phase1架构决策-2026-06-12.md @@ -13,8 +13,9 @@ Phase 1 是 DevFlow 的引擎骨架阶段,聚焦于核心数据流打通。本 ### ADR-001: 引擎不绑定业务 - **决策**: Workflow Engine (df-workflow) 只做 DAG 执行,不感知具体业务语义 -- **原因**: 保持引擎通用性,阶段逻辑通过 df-stages 插件化注入 -- **影响**: df-workflow 的 Node trait 是纯接口,业务逻辑在 df-nodes / df-stages 实现 +- **原因**: 保持引擎通用性 +- **影响**: df-workflow 的 Node trait 是纯接口,业务逻辑在 df-nodes 实现 +> ⚠️ 原文写"阶段逻辑通过 df-stages 插件化注入"、"业务逻辑在 df-nodes / df-stages 实现"。`df-stages` crate 已删除(零引用清理),实际无 stages 层。业务逻辑直接在 df-nodes 的 3 个节点实现。 ### ADR-002: 本地优先架构 @@ -24,9 +25,10 @@ Phase 1 是 DevFlow 的引擎骨架阶段,聚焦于核心数据流打通。本 ### ADR-003: 多 Crate Workspace -- **决策**: 拆分为 13 个独立 crate +- **决策**: 拆分为多个独立 crate - **原因**: 模块解耦、独立编译、按需引用 - **影响**: 依赖关系需严格管控,避免循环依赖 +> ⚠️ 原文写"13 个独立 crate",属过时数字(原始设计值)。实际为 **8 个 crate**:df-core / df-workflow / df-nodes / df-ai / df-execute / df-storage / df-ideas / df-project。详见 [业务系统设计](./业务系统设计-2026-06-12.md) §六。 ### ADR-004: 无 panic 原则 diff --git a/docs/02-架构设计/aichat交互体验改进方案-2025-07-15.md b/docs/02-架构设计/aichat交互体验改进方案-2026-06-14.md similarity index 99% rename from docs/02-架构设计/aichat交互体验改进方案-2025-07-15.md rename to docs/02-架构设计/aichat交互体验改进方案-2026-06-14.md index 409e20e..1cd9060 100644 --- a/docs/02-架构设计/aichat交互体验改进方案-2025-07-15.md +++ b/docs/02-架构设计/aichat交互体验改进方案-2026-06-14.md @@ -1,6 +1,6 @@ # AIChat 交互体验改进方案 -> 创建: 2025-07-15 | 状态: 待讨论 +> 创建: 2026-06-14 | 状态: 待讨论 > 范围: 消息发送、流式渲染、对话管理、错误恢复、技能/Provider、窗口布局等非授权类交互 --- diff --git a/docs/02-架构设计/aichat审查报告-2026-06-14.md b/docs/02-架构设计/aichat审查报告-2026-06-14.md index cc8b7d3..24fbd70 100644 --- a/docs/02-架构设计/aichat审查报告-2026-06-14.md +++ b/docs/02-架构设计/aichat审查报告-2026-06-14.md @@ -2,6 +2,7 @@ > 性质:只审查不改代码。本报告汇总本次会话对 devflow AI chat 全链路的核对发现。 > 增补:2026-06-14 追加「修复进度」表(AC1/AC2、AR-3、FR-S4、FR-R4、FR-R5 对照 commit 36d68dd / 4b5f096 标已完成),并在 §8 优先级表 AR-3 行内联标注。 +> 二次增补:2026-06-15 §8 优先级表全表对齐 todo.md AR 编号体系,逐行补 AR-1~AR-11 标签 + 状态勾注(AR-1 退役 / AR-2~7/9~11 已修 / AR-8 重评降级)。 ## 审查范围 @@ -216,17 +217,17 @@ handler 接上后 `bind_directory` 使用频率大降(只剩改绑),第二章 bi | 优先 | 问题 | 方向 | |------|------|------| -| P0 | H1 流式 Markdown 重解析 | 流式态纯文本/增量渲染,完成后再 markdown;rAF 合并 | -| P0 | H2 审批态新建对话卡死 | `ai_conversation_create` 加 generating 守卫 | -| P0 | 第二章 审批卡片裸 id + reason 模板(✅ 已完成 commit 36d68dd / AR-3)| 后端 reason 拼对象名;前端 id→name | -| P0 | 第四章 create_project 双审(⚠️ 半成品:schema 已加 handler 没接) | handler 读 args 的 path/stack,复用 IPC `project.rs:43-83` 探测逻辑 | -| P1 | H3 审批态 stop 无兜底 | stopChat 本地先复位 streaming | -| P1 | M3 Low 工具失败语义 | 统一 AiError 后 loop 也退出,或不 emit AiError | -| P1 | 第三章 clean 无入口 | AiChat 加清空按钮 + 后端真删当前对话消息 | -| P2 | M1+M2 delta 节流 + 滚动 | 后端 50ms 合批 / 前端 rAF | -| P2 | M4 friendlyError i18n | 抽 i18n key | -| P2 | 第六章 灵感迁移残留 | i18n + 后端错误 + LLM 描述统一改 | -| P2 | 第五章 数据联动 | 方案 A 后端 emit + store 监听 | +| P0 | H1 流式 Markdown 重解析 ✅ **退役**(AR-1,2026-06-15)— 自研块级 memo 取代(splitBlocks O(末块)+rAF 节流),详见 [流式渲染调研 §5](./aichat流式Markdown渲染调研-2026-06-15.md) | 流式态纯文本/增量渲染,完成后再 markdown;rAF 合并 | +| P0 | H2 审批态新建对话卡死 ✅ **已修**(AR-2,commit 057a212) | `ai_conversation_create` 加 generating 守卫 | +| P0 | 第二章 审批卡片裸 id + reason 模板 ✅ **已修**(AR-3,commit 36d68dd)| 后端 reason 拼对象名;前端 id→name | +| P0 | 第四章 create_project 双审 ✅ **已修**(AR-4,commit 057a212)— schema 加 path/stack + handler 合并绑定 | handler 读 args 的 path/stack,复用 IPC `project.rs:43-83` 探测逻辑 | +| P1 | H3 审批态 stop 无兜底 ✅ **已修**(AR-5,commit 9e2aeff)— stopChat 本地先复位 streaming + clearStreamWatchdog | stopChat 本地先复位 streaming | +| P1 | M3 Low 工具失败语义 ✅ **已修**(AR-6,commit f82dd8b)— Low 失败非 AiError,错误回填 tool_result 让 LLM 自处理 | 统一 AiError 后 loop 也退出,或不 emit AiError | +| P1 | 第三章 clean 无入口 ✅ **已修**(AR-7,commit 9e2aeff)— clear_messages 真删 + 垃桶按钮二次确认 | AiChat 加清空按钮 + 后端真删当前对话消息 | +| P2 | M1+M2 delta 节流 + 滚动 🔄 **重评降级**(AR-8,2026-06-15)— 前端 rAF 节流已被 ARC-08 覆盖;剩后端 50ms 合批 + 滚动跟随 | 后端 50ms 合批 / 前端 rAF | +| P2 | M4 friendlyError i18n ✅ **已修**(AR-9,commit 9e2aeff)— 全走 i18n.global.t + zh/en 双语补 key | 抽 i18n key | +| P2 | 第六章 灵感迁移残留 ✅ **已修**(AR-10,commit 65c475b)— 13 文件批量统一 | i18n + 后端错误 + LLM 描述统一改 | +| P2 | 第五章 数据联动 ✅ **已修**(AR-11,commit dc27e79)— 方案 A 后端 emit `df-data-changed` + store listen 已 attach | 方案 A 后端 emit + store 监听 | --- diff --git a/docs/02-架构设计/aichat授权体验改进方案-2025-07-15.md b/docs/02-架构设计/aichat授权体验改进方案-2026-06-14.md similarity index 87% rename from docs/02-架构设计/aichat授权体验改进方案-2025-07-15.md rename to docs/02-架构设计/aichat授权体验改进方案-2026-06-14.md index 166cef1..fbecb64 100644 --- a/docs/02-架构设计/aichat授权体验改进方案-2025-07-15.md +++ b/docs/02-架构设计/aichat授权体验改进方案-2026-06-14.md @@ -1,6 +1,6 @@ # AIChat 授权功能体验改进方案 -> 创建: 2025-07-15 | 状态: 待讨论 +> 创建: 2026-06-14 | 状态: 待讨论 ## 一、当前授权机制概览 @@ -24,7 +24,7 @@ | 风险等级 | 工具 | 执行方式 | |---------|------|---------| | **Low** | `list_projects`, `list_tasks`, `list_ideas`, `list_trash`, `read_file`, `list_directory` | 自动执行,并行 `join_all` | -| **Medium** | `create_project`, `create_task`, `create_idea`, `update_project`, `update_task`, `bind_directory`, `write_file` | 需人工审批 | +| Medium | `create_project`, `create_task`, `create_idea`, `update_project`, `update_task`, `bind_directory`, `write_file` | 需人工审批 | | **High** | `delete_project`, `restore_project`, `purge_project`, `delete_task`, `run_workflow`, `run_command` | 需人工审批 | ### 1.3 已实现的亮点 @@ -181,26 +181,28 @@ ### P1 — 增强控制力 -#### 3.4 自动审批策略(信任模式) +#### 3.4 会话级授权 Session Trust -**方案**:Settings 中增加"自动审批"配置,用户可选择对特定风险等级或工具类型自动放行。 +**方案**:引入会话级信任机制,替代全局宽松模式。用户在当前对话中一次性授权某目录的写/执行权限,后续该对话内同类操作自动放行。切换对话或新建对话时信任清空。 **配置项**: ``` -Settings → AI → 自动审批策略 - ○ 严格模式(默认):所有 Medium/High 需人工审批 - ○ 宽松模式:Medium 自动放行,High 需人工审批 - ○ 自定义:按工具类型选择 - ☑ write_file(workspace 内自动放行) - ☑ create_task / create_idea(自动放行) - ☐ delete_*(始终需审批) - ☐ run_command(始终需审批) +当前会话信任目录: + ✅ E:/wk-lab/devflow/src (Write + Execute) + ✅ E:/wk-lab/devflow/docs (Write) + + 添加目录... ``` **改动范围**: -- `df-storage`:`app_settings` 表存储配置(KV 已有 V13 表) -- `audit.rs`:`process_tool_calls` 读取配置,决定 Medium 工具是否进 pending 或直接执行 -- `Settings.vue`:新增配置面板 +- 前端:Settings 或对话 header 新增「信任管理」入口 +- 后端:`AiSession` 增加 `trusted_dirs: HashSet<(PathBuf, TrustLevel)>` +- `audit.rs`:`process_tool_calls` 先查 session trust,命中则跳过 pending + +**安全边界**: +- 仅纯读取操作(list_*/read_*/list_directory)保持自动放行 +- 所有 create/update/bind/write/delete 操作默认需审批或 session-trust +- bind_directory 归类为修改操作 +- 信任仅限当前会话内存,不持久化 #### 3.5 High 二次确认 @@ -221,13 +223,13 @@ Settings → AI → 自动审批策略 → 才真正执行 ai_approve ``` -#### 3.6 审批超时 +#### 3.6 审批超时(前端定时器) -**方案**:可配置超时自动拒绝(默认 5 分钟),避免对话永久卡住。 +**方案**:前端侧 5 分钟超时自动拒绝,避免对话永久卡住。超时策略独立于 Webhook 等外部动作路径。 **改动范围**: -- 后端:`AiSession` 增加 pending 审批的 `created_at` 时间戳,定时检查超时 -- 或前端:`useAiSend.ts` 在 pending 时启动定时器,超时自动调 `ai_approve(id, false)` +- 前端:`useAiSend.ts` 在 pending 时启动 5min 定时器,超时自动调 `ai_approve(id, false)` +- 不改后端 AiSession 结构(远期 Webhook 走独立路径) --- @@ -252,7 +254,7 @@ Settings → AI → 自动审批策略 └──────────────────────────────────┘ ``` -#### 3.8 审批历史面板 +#### 3.8 审计历史面板 **方案**:独立页面展示 `ai_tool_executions` 表的审计记录。 @@ -262,7 +264,7 @@ Settings → AI → 自动审批策略 **展示字段**: | 时间 | 工具 | 风险 | 状态 | 决策者 | 参数摘要 | 结果摘要 | -|------|------|------|------|--------|---------|---------| +|------|------|------|------|--------|---------|----------| --- @@ -273,10 +275,10 @@ Settings → AI → 自动审批策略 | **P0** | 3.1 批量审批 | 0.5 天 | 🔥🔥🔥 | | **P0** | 3.2 审批计数器 + 跳转 | 0.5 天 | 🔥🔥🔥 | | **P0** | 3.3 write_file diff 预览 | 1 天 | 🔥🔥 | -| **P1** | 3.4 自动审批策略 | 1.5 天 | 🔥🔥🔥 | +| **P1** | 3.4 会话级授权 Session Trust | 1.5 天 | 🔥🔥🔥 | | **P1** | 3.5 High 二次确认 | 0.5 天 | 🔥 | -| **P1** | 3.6 审批超时 | 0.5 天 | 🔥 | +| **P1** | 3.6 审批超时(前端5min) | 0.5 天 | 🔥 | | **P2** | 3.7 Agentic 进度条 | 0.5 天 | 🔥🔥 | -| **P2** | 3.8 审批历史面板 | 1 天 | 🔥 | +| **P2** | 3.8 审计历史面板 | 1 天 | 🔥 | **建议第一批落地**:P0 三项(批量审批 + 计数器 + diff 预览),总计约 2 天工作量,覆盖最高频的体验痛点。 diff --git a/docs/02-架构设计/业务系统设计-2026-06-12.md b/docs/02-架构设计/业务系统设计-2026-06-12.md index d3bab24..e69d8f1 100644 --- a/docs/02-架构设计/业务系统设计-2026-06-12.md +++ b/docs/02-架构设计/业务系统设计-2026-06-12.md @@ -1,6 +1,8 @@ # DevFlow 业务系统设计 -> 创建: 2026-06-10 | 状态: 设计中 | 基于: 功能审查结论 +> 创建: 2026-06-10 | 状态: 设计中 | 最后重写: 2026-06-15 (DOC-01 硬伤修复) +> +> **本文档为 ARCHITECTURE.md 的实质载体**(项目无独立 ARCHITECTURE.md 文件)。所有数据模型、设计决策均以源码为基准,已剔除虚构内容。 --- @@ -8,9 +10,9 @@ | 维度 | 定义 | |------|------| -| **一句话** | AI 原生的产研操作系统,从想法到上线的全流程编排 | -| **目标用户** | 个人开发者优先,后续扩展到小团队 | -| **核心价值** | 全流程编排 — 想法池 → 项目 → 任务 → 工作流 → 发布,AI 贯穿每个环节 | +| **一句话** | AI 原生的个人开发流程驾驶舱,从想法到任务到工作流的本地工具 | +| **目标用户** | 个人开发者 | +| **核心价值** | 想法池 → 项目 → 任务 → 工作流(DAG),AI 贯穿每个环节 | | **差异化** | 想法第一公民 + AI 全程参与 + 本地优先(零运维) | --- @@ -20,240 +22,176 @@ ### 2.1 核心旅程 ``` -💡 想法池 📂 项目 🔀 任务 🚀 发布 -───────────────────────────────────────────────────────────────────────────────────── -捕捉想法 ──→ AI评估评分 ──→ 晋升立项 ──→ 创建任务 ──→ 绑定分支 ──→ 执行工作流 ──→ 合并发布 - │ │ │ │ │ - └── 淘汰/归档 └── 多任务 └── DAG └── AI辅助 └── 自动化 - 并行推进 自动执行 冲突解决 发布流程 +想法池 项目 任务 工作流 +──────────────────────────────────────────────────────────────────────────── +捕捉想法 → 评估评分 → 晋升立项 → 创建任务 → 绑定分支 → 执行 DAG 工作流 + │ │ │ │ + └── 淘汰/归档 └── 多任务 └── 自动执行 └── Script/Ai/Human ``` -### 2.2 五个阶段详细设计 +### 2.2 四个阶段详细设计 -#### 阶段一:💡 想法池 (Idea Pool) +#### 阶段一:想法池 (Idea Pool) -**用户场景**:开发者日常产生大量想法(看到新技术、遇到痛点、产生产品灵感),需要一个地方快速捕捉、评估、筛选。 +**用户场景**:快速捕捉想法、评估、筛选。 | 操作 | 描述 | AI 参与 | |------|------|---------| -| **捕捉** | 文本输入、快捷键快速记录、剪贴板导入 | 无 | -| **评估** | AI 分析可行性、市场潜力、技术难度 | ⭐ 核心场景:LLM 评估报告 | -| **评分** | 多维打分 (可行性/影响力/紧迫性) | AI 给出建议分 | -| **关联** | 相似想法自动发现,可合并 | AI 语义相似度 | +| **捕捉** | 文本输入 | 无 | +| **评估** | 启发式评分(可行性/影响力/紧迫性) | 当前固定算法,Phase 2 接 LLM | | **晋升** | 高分想法晋升为项目 | AI 生成项目初始化建议 | | **淘汰** | 低分想法归档或删除 | 无 | -**状态机**: +**状态机**(对齐 `IdeaStatus` 枚举): ``` -Draft → Evaluating → Scored → Approved → Promoted - → Rejected → Archived +draft → pending_review → approved → promoted(正向) + → rejected → archived(淘汰) ``` -**关键问题**: -- ✅ 想法是独立于项目的第一公民,不需要先有项目 -- ✅ AI 评估是核心差异化功能 -- ⚠️ 评分维度需要与实际对齐(当前有3套不同的维度定义) - -#### 阶段二:📂 项目 (Project) - -**用户场景**:从想法晋升或手动创建项目,管理项目全生命周期。 +#### 阶段二:项目 (Project) | 操作 | 描述 | AI 参与 | |------|------|---------| -| **创建** | 从想法晋升 或 手动创建 | AI 生成项目描述/技术栈建议 | -| **阶段管理** | 5阶段管线:想法→需求→编码→测试→发布 | 阶段推进时 AI 检查前置条件 | -| **上下文** | 项目代码结构、依赖、规范 | AI 自动分析项目结构 | -| **暂停/恢复** | 项目可暂停后恢复 | 无 | +| **创建** | 从想法晋升 或 手动创建 | AI 生成描述/技术栈建议 | +| **绑定目录** | 关联本地代码目录(自动探测技术栈) | 无 | +| **软删/恢复** | 回收站机制(deleted_at) | 无 | -**状态机**: +**状态机**(对齐 `ProjectStatus` 枚举): ``` -Planning → InProgress → Testing → Releasing → Completed - → Paused → InProgress (恢复) - → Cancelled +planning → in_progress → testing → releasing → completed + → paused → in_progress(恢复) + → cancelled ``` -**阶段管线**(current_stage,独立于 status): -``` -Idea → Requirement → Coding → Testing → Release -``` - -**关键问题**: -- ⚠️ 当前 `status`(项目生命周期)和 `current_stage`(当前阶段)是两个维度,前端混用了 -- ⚠️ 数据库 projects 表缺少 `current_stage`、`repo_path`、`priority`、`tags` 字段 - -#### 阶段三:🔀 任务 (Task) - -**用户场景**:项目内创建多个并行任务,每个任务绑定一个 Git 分支,独立工作流。 +#### 阶段三:任务 (Task) | 操作 | 描述 | AI 参与 | |------|------|---------| -| **创建任务** | 标题+描述,自动创建分支 | AI 从需求拆解任务 | -| **绑定分支** | 每个任务一个独立分支 | 自动生成分支名 | -| **执行工作流** | 触发 DAG 工作流(编码→测试→审查) | AI 参与每个节点 | -| **审查** | 代码审查、质量检查 | AI 自动审查 | -| **合并** | 合并到主分支,冲突解决 | AI 辅助冲突解决 | +| **创建任务** | 标题+描述 | AI 从需求拆解任务 | +| **执行工作流** | 触发 DAG 工作流 | AI 参与每个 Ai 节点 | -**状态机**: +**状态机**(对齐 `TaskStatus` 枚举,7 态): ``` -Todo → InProgress → InReview → Testing → Done - → Blocked → InProgress (解除阻塞) - → Cancelled +todo → in_progress → in_review → testing → done + → blocked → in_progress(解除阻塞) + → cancelled ``` -**关键问题**: -- ⚠️ 缺少 `branches` 表,分支信息无法持久化 -- ⚠️ 任务到工作流的关联 (`workflow_def_id`) 缺失 -- ⚠️ 前端 TaskStatus 有 4 套不同的值 +#### 阶段四:工作流 (Workflow) -#### 阶段四:⚙️ 工作流 (Workflow) +**实际内置 3 种节点类型**(均在 `crates/df-nodes/src/` 完整实现): -**用户场景**:DAG 驱动的工作流自动执行,支持条件分支、并行、人工审批。 +| 节点 | 文件 | 作用 | 阻塞 | +|------|------|------|------| +| **Script** | `script_node.rs` | Shell 命令执行(经 `df-execute::shell`) | 否 | +| **Ai** | `ai_node.rs` | LLM 文本生成/分析(非流式 complete) | 否 | +| **Human** | `human_node.rs` | 人工审批/确认(单选/多选) | 是 | -| 组件 | 描述 | -|------|------| -| **DAG 定义** | 可序列化的节点+边定义,持久化到 SQLite | -| **节点类型** | Script / AI / Docker / Git / HTTP / Human / Notify / Subflow | -| **执行器** | 按拓扑层并行执行,支持暂停/恢复 | -| **事件总线** | 实时推送节点状态到前端 | -| **NodeRegistry** | 根据类型字符串动态创建节点实例 | +> 不存在 Condition / Parallel / Docker / Git / Notify / HTTP / Subflow 节点。 +> 条件分支由工作流引擎层处理(条件表达式引擎见 `条件表达式引擎-2026-06-15.md`)。 **工作流执行生命周期**: ``` -Pending → Running → Completed - → Paused → Running (恢复) - → Failed → Running (重试) - → Cancelled +pending → running → completed + → paused → running(恢复) + → failed → running(重试) + → cancelled ``` -**关键问题**: -- ✅ DAG 拓扑排序算法正确 -- ✅ DagDef/NodeRegistry 已实现 -- ⚠️ Executor 同层节点尚未并行化 -- ⚠️ 条件分支引擎未实现 -- ⚠️ HumanNode(人工审批)暂停/恢复未连通 - -#### 阶段五:🚀 发布 (Release) - -**用户场景**:选择多个已完成任务,编排发布流程。 - -| 操作 | 描述 | AI 参与 | -|------|------|---------| -| **选择任务** | 选择要发布的 Done 状态任务 | 无 | -| **创建发布** | 合并分支到 release 分支 | AI 生成 changelog | -| **集成测试** | 运行完整测试工作流 | 自动 | -| **发布** | 部署 + 健康检查 | 自动 | -| **回滚** | 发布失败回滚 | AI 分析失败原因 | - -**状态机**: -``` -Planning → Integrating → Testing → Ready → Published - → RolledBack - → Cancelled -``` - -**关键问题**: -- ⚠️ 前端完全缺少发布入口 -- ⚠️ releases 表缺少 `branch_name`、`workflow_def_id` - --- -## 三、跨领域功能设计 +## 三、跨领域功能设计(已实现) -### 3.1 标注系统 (Annotation) +### 3.1 知识库 (Knowledge) -**设计理念**:任何内容(代码/文档/需求/测试报告)都可插入标注,统一收集后交给 AI 批量处理。 - -| 标记 | 含义 | AI 处理方式 | -|------|------|-----------| -| FIXME | 需要修复 | AI 定位问题并生成修复建议 | -| TODO | 待办 | AI 拆解为任务 | -| QUESTION | 疑问 | AI 尝试回答 | -| RISK | 风险 | AI 评估风险等级 | -| DECISION | 决策 | 自动记录到决策日志 | -| OPTIMIZE | 优化 | AI 给出优化方案 | - -**批量处理流程**: -``` -收集所有 Open 标注 → 按类型分组 → AI 逐条处理 → 标记为 Resolved -``` - -### 3.2 决策留痕 (Decision Journal) - -**设计理念**:所有关键决策自动或半自动记录,全程可追溯。 - -**自动记录的决策场景**: -- 想法评估结果(为什么批准/拒绝) -- 功能标记为"不做"时(为什么不做) -- AI 选择了方案 A 而非方案 B 时 -- 代码审查中发现风险时的处理决策 -- 发布前的检查点决策 - -### 3.3 经验进化 (Evolution) - -**设计理念**:开发过程自动沉淀知识,越用越聪明。 +Tier1 AI 提炼:从 AI 对话中自动提炼候选经验条目,附带 reasoning 判断依据。 | 知识类型 | 来源 | 复用场景 | |---------|------|---------| -| 审查规则 | 代码审查结论 | 后续审查自动应用 | +| 审查规则 | 代码审查结论 | 后续审查参考 | | Prompt 模板 | 成功的 AI 对话 | 类似场景复用 | -| 踩坑经验 | 错误修复过程 | 遇到类似问题时提醒 | -| 架构模式 | 项目结构分析 | 新项目初始化建议 | +| 踩坑经验 | 错误修复过程 | 类似问题提醒 | -### 3.4 AI 编排 +**生命线**:candidate → pending_review → published → archived,带 reuse_count / verified 信号。 -**多模型策略**: -``` -任务类型 → ModelRouter → 最优模型 - 代码生成 → Claude/GPT-4 - 代码审查 → Claude (长上下文) - 文档生成 → GLM/DeepSeek (性价比) - 快速问答 → DeepSeek (低成本) -``` +### 3.2 AI 多 Provider -**Agent 协作模式**(Phase 2+): -``` -Planner Agent → 拆解任务 -Coder Agent → 编码实现 -Reviewer Agent → 代码审查 -Fixer Agent → 修复问题 -``` +支持配置多个 AI 提供商(OpenAI 兼容 / GLM / DeepSeek / Anthropic 原生协议),可在设置中管理并指定默认。 + +详见 [df-ai AI集成模块](../03-模块文档/df-ai-AI集成模块-2026-06-12.md)。 + +### 3.3 EventBus 事件总线 + +进程内 `tokio::sync::broadcast` 发布/订阅,前端经 `@tauri-apps/api/event` 的 emit/listen 接收。**不是 WebSocket**。 --- -## 四、数据模型设计(按阶段) +## ~~三、跨领域功能设计(已废弃规划)~~ -### Phase 1 最小表集(当前 + 补全) +> 以下章节曾详述标注系统、决策留痕、经验进化、AI 编排(ModelRouter/Agent 协作)等设计。 +> 这些功能**从未实现**,对应表(annotations/decisions/features/test_cases)也从未建表。 +> 保留此节仅作历史存档参考,读者应视为"规划意图"而非"现有能力"。 -| 表 | 用途 | 状态 | -|----|------|------| -| ideas | 想法池 | ✅ 已有,需补字段 | -| projects | 项目管理 | ✅ 已有,需补字段 | -| tasks | 任务管理 | ✅ 已有,需补字段 | -| releases | 发布管理 | ✅ 已有,需补字段 | -| workflow_defs | 工作流定义 | ❌ 缺失 | -| workflow_executions | 工作流执行 | ✅ 已有,需补字段 | -| node_executions | 节点执行记录 | ✅ 已有 | -| branches | 分支管理 | ❌ 缺失 | +### ~~3.1 标注系统 (Annotation)~~ — ❌ 未实现 -### Phase 2 扩展表 +### ~~3.2 决策留痕 (Decision Journal)~~ — ❌ 未实现 -| 表 | 用途 | -|----|------| -| ai_providers | AI 模型配置 | -| connections | 连接配置 | -| artifacts | 产出物 | +### ~~3.3 经验进化 (Evolution)~~ — ⚠️ 部分落地为知识库(knowledges 表),但远不及原规划规模 -### Phase 3+ 完整表 +### ~~3.4 AI 编排(ModelRouter / Agent 协作)~~ — ❌ ModelRouter 从未存在;Agent 协作属 Phase 2 规划(B 路线) -| 表 | 用途 | -|----|------| -| annotations | 标注系统 | -| decisions | 决策留痕 | -| features | 需求功能清单 | -| test_cases | 测试用例 | -| test_runs | 测试执行记录 | -| knowledge | 经验知识库 | -| merge_requests | 合并请求 | +--- + +## 四、数据模型设计(V1-V13 迁移实际表) + +> 核对基准:`crates/df-storage/src/migrations.rs` 建表 SQL + `models.rs` Record 结构体。 + +### 全量表清单(13 业务表 + 1 元表) + +#### 活跃业务表(11 张)— 有上层代码读写 + +| # | 表名 | 建表版本 | 用途 | 对应 Model | 活跃消费者 | +|---|------|---------|------|-----------|-----------| +| 1 | `ideas` | V1+V2 | 想法池 | IdeaRecord | df-ideas crate | +| 2 | `projects` | V1+V11+V12 | 项目管理 | ProjectRecord | df-project crate | +| 3 | `tasks` | V1+V2 | 任务管理 | TaskRecord | commands::task(IPC handler 直连 CRUD) | +| 4 | `workflow_executions` | V1+V2 | 工作流执行实例 | WorkflowRecord | df-workflow crate | +| 5 | `node_executions` | V1 | 节点执行审计 | NodeExecutionRecord | df-workflow executor | +| 6 | `ai_conversations` | V3+V4/V5/V6 | AI 对话历史 | AiConversationRecord | commands::ai | +| 7 | `ai_providers` | V9 | AI 提供商配置 | AiProviderRecord | commands::ai::provider | +| 8 | `ai_tool_executions` | V9 | AI 工具调用审计 | AiToolExecutionRecord | commands::ai | +| 9 | `knowledges` | V7+V8/V10 | 知识库条目 | KnowledgeRecord | commands::knowledge | +| 10 | `knowledge_events` | V10 | 知识生命线事件 | KnowledgeEventRecord | commands::knowledge | +| 11 | `app_settings` | V13 | 通用 KV 设置 | (无独立 model) | commands::settings(手写 Repo) | + +#### 遗留表(2 张)— DDL 存在但无活跃业务消费者 + +> `df-task` crate 已于 2026-06-14 移除(零引用清理)。以下表仍在 migrations.rs 中创建、models.rs 有结构体、CRUD 可用,但当前**无上层业务代码写入或消费**。 + +| # | 表名 | 建表版本 | 原始用途 | 状态 | +|---|------|---------|---------|------| +| 12 | `branches` | V2 | Git 分支绑定 | ⚠️ 无消费者(DDL 存在,CRUD 可用但无人调用) | +| 13 | `releases` | V1 | 发布记录 | ⚠️ **功能性死表**:DDL 存在且含 version/status/task_ids/changelog/released_at 完整 schema,但全代码库零业务读写——无 ReleaseStatus 枚举、无 release 相关 IPC command、前端无发布管理页面。属"建了但从未使用"的空壳占位。 | + +#### 内部元表 + +| # | 表名 | 建表版本 | 用途 | +|---|------|---------|------| +| - | `schema_version` | V0 | 迁移版本跟踪(仅存 version INTEGER,无业务语义) | + +### 不存在的表(曾出现在早期规划但从未建表) + +| 表名 | 状态 | 说明 | +|------|------|------| +| `workflow_defs` | ❌ 从未建表 | 工作流定义以 dag_json 内嵌在 workflow_executions 中 | +| `connections` | ❌ 从未建表 | 连接配置使用 app_settings KV 表存储 | +| `artifacts` | ❌ 从未建表 | 产出物概念未落地 | +| `annotations` | ❌ 从未建表 | 标注系统属已废弃规划 | +| `decisions` | ❌ 从未建表 | 决策留痕属已废弃规划 | +| `features` | ❌ 从未建表 | 需求功能清单未落地 | +| `test_cases` / `test_runs` | ❌ 从未建表 | 测试模块未落地 | +| `knowledge`(单数)| ❌ 不存在的旧命名 | 实际表名为 `knowledges`(复数),V7 建表 | +| `merge_requests` | ❌ 从未建表 | 合并请求未落地 | --- @@ -261,52 +199,39 @@ Fixer Agent → 修复问题 ### D1: 想法是第一公民 - 想法池独立于项目,可以独立运转 -- 想法不需要关联项目即可被评估和打分 - 晋升是单向操作(想法→项目),但保留追溯 -### D2: 多任务/分支并行 -- 同一项目内多个任务同时开发 -- 每个任务绑定独立 Git 分支 -- 任务间互不干扰,完成后合并 - -### D3: 引擎不绑定业务 -- DAG 引擎纯粹做编排,不知道"想法"/"项目"等概念 -- 阶段是 DAG 模板,可自定义 -- 节点通过 Node trait 扩展 - -### D4: 本地优先 +### D2: 本地优先 - SQLite 嵌入,不依赖云服务 - 所有数据存储在本地 - 零运维,安装即用 -### D5: AI 贯穿全程 -- 不是"加了 AI 功能",而是"AI 是系统的一部分" -- 每个阶段都有 AI 参与 -- AI 输出作为决策依据,最终决策权在人 +### D3: 引擎不绑定业务 +- DAG 引擎纯粹做编排,不感知具体业务语义 +- 业务逻辑在 df-nodes 实现(Node trait 是纯接口) -### D6: 决策必留痕 -- 所有关键决策自动记录 -- 决策可追溯到具体上下文(哪个想法、哪个功能、哪次审查) -- 未来可回溯"为什么这么做" +### D4: AI 贯穿全程 +- AI Chat 对话 + 工作流 AiNode 双路径 +- AI 输出作为决策依据,最终决策权在人 --- -## 六、审查发现的设计问题与决策 +## 六、Crate 结构 -| # | 问题 | 设计决策 | 优先级 | -|---|------|---------|--------| -| 1 | 状态枚举三套不一致 | **以 types.rs 为准**,ARCHITECTURE.md 和 SQL 同步 | Phase 1 | -| 2 | projects 缺 status vs stage | **status 和 current_stage 分开**:status 管生命周期,stage 管进度 | Phase 1 | -| 3 | ideas.promoted_to 缺失 | **V2 补字段**,晋升时回写 | Phase 1 | -| 4 | branches 表不存在 | **V2 新增表**,分支管理需要持久化 | Phase 1 | -| 5 | workflow_executions 缺 project_id | **V2 补字段**,执行记录必须关联业务 | Phase 1 | -| 6 | DAG 不可序列化 | **DagDef/Dag 分离**(已完成) | Phase 1 | -| 7 | Executor 串行 | **同层并行化**(待实现) | Phase 1 | -| 8 | 前端 id 类型不对 | **统一为 string (UUID)** | Phase 1 | -| 9 | Store 未接入 View | **先建 API 层再接 Store** | Phase 1 | -| 10 | 标注/决策表缺失 | Phase 3 再建表,当前 UI 标注 "Coming Soon" | Phase 3 | -| 11 | 需求-测试追溯 | Phase 4 再建表 | Phase 4 | -| 12 | 经验进化 | Phase 5 实现 | Phase 5 | +实际 **8 个 crate**(`crates/` 目录下): + +| Crate | 职责 | +|-------|------| +| `df-core` | 公共类型(types.rs)、事件定义、工具函数 | +| `df-workflow` | DAG 引擎(拓扑排序、执行器、Node trait) | +| `df-nodes` | 内置节点(Ai / Script / Human) | +| `df-ai` | AI 集成层(LlmProvider trait、OpenAI 兼容、Anthropic、ContextManager、工具注册基础设施) | +| `df-execute` | Shell 执行(跨平台封装) | +| `df-storage` | SQLite 存储层(migrations、CRUD 宏、Repo) | +| `df-ideas` | 想法池业务逻辑(评估、晋升) | +| `df-project` | 项目管理业务逻辑(目录绑定、技术栈探测) | + +> 原始设计文档(Phase1架构决策 ADR-003)曾写 "13 个独立 crate",属过时数字,未随代码演进更新。实际为以上 8 个。 --- @@ -316,16 +241,15 @@ Fixer Agent → 修复问题 ``` 1. 用户在想法池输入"做一个 Markdown 编辑器" -2. AI 评估可行性,给出评分和建议 +2. 启发式评估可行性,给出评分和建议 3. 用户点击"晋升为项目" -4. 系统创建项目,进入编码阶段 +4. 系统创建项目 5. 用户创建任务"实现基础编辑功能" -6. 系统创建分支 task/abc123 -7. 用户点击"运行工作流" -8. DAG 执行: [Shell: 环境检查] → [Shell: 运行测试] → [Shell: 构建产物] -9. 前端实时展示执行日志 -10. 执行完成,结果持久化到 SQLite -11. 用户刷新页面,数据仍在 +6. 用户点击"运行工作流" +7. DAG 执行: [Script: 环境检查] → [Ai: 代码生成] → [Human: 审批] +8. 前端经 EventBus 实时展示执行日志 +9. 执行完成,结果持久化到 SQLite +10. 用户刷新页面,数据仍在 ``` --- @@ -337,13 +261,22 @@ Fixer Agent → 修复问题 - 与 `evaluator.rs` 已实现的 `EvalDimension` 对齐 - `IdeaScores { feasibility, impact, urgency, overall }` 保留 -### Q2: 发布模块 Phase 1 范围 ✅ 已确认 -**决策**:Phase 1 简化 — 只做 Release 记录 + 手动标记任务 -- releases 表保留,支持 CRUD -- 不做自动化发布流程(合并→测试→部署) -- 前端在 ProjectDetail 中添加简单 Release 面板 +### Q2: 发布模块 ✅ 已确认(当前为死表状态) +**决策**:Phase 1 不做发布功能。releases 表 DDL 存在但无业务逻辑,待后续激活。 +- 不做自动化发布流程 +- 前端无发布入口 ### Q3: AI 评估 Phase 1 范围 ✅ 已确认 -**决策**:Phase 1 用固定算法评分,延后接入 AI -- `ScoringEngine` 当前返回固定 5.0,改为基于启发式规则的简单算法 +**决策**:Phase 1 用固定算法评分,延后接入 LLM +- `ScoringEngine` 当前返回基于启发式规则的分数 - Phase 2 接入 LLM 后替换为 AI 评分 + +--- + +## 相关文档 + +- [df-nodes 节点集合](../03-模块文档/df-nodes-节点集合-2026-06-12.md) — 3 节点详述 +- [df-ai AI 集成模块](../03-模块文档/df-ai-AI集成模块-2026-06-12.md) — Provider / Context / 工具注册 +- [df-storage 存储层](../03-模块文档/df-storage-存储层-2026-06-12.md) — 迁移 / CRUD / Repo +- [df-workflow 工作流引擎](../03-模块文档/df-workflow-工作流引擎-2026-06-12.md) — DAG / Executor +- [Phase1 架构决策](./Phase1架构决策-2026-06-12.md) — ADR 记录(注意:ADR-001/003 含过时信息,以本文档为准) diff --git a/docs/02-架构设计/任务推进链实施路径-2026-06-16.md b/docs/02-架构设计/任务推进链实施路径-2026-06-16.md new file mode 100644 index 0000000..bb3d28a --- /dev/null +++ b/docs/02-架构设计/任务推进链实施路径-2026-06-16.md @@ -0,0 +1,125 @@ +# 任务推进链实施路径 + +> **日期**: 2026-06-16 +> **来源**: [任务执行与推进能力分析-2026-06-16.md](../05-代码审查/任务执行与推进能力分析-2026-06-16.md) 第八章(已核对注入) +> **状态**: 规划定稿。**D-260616-01~04 已决策(2026-06-16)**:①前端对齐7态 ②任务软删(UI缓做) ③advance_task 走 **df-nodes Node** ④阶段1先行。**阶段1可启动(F-01~05)**。 +> **关联决策**: D-260616-01~04(决策结果见 todo.md 待决策区块) + +--- + +## 〇、核对纠正(实施前必读) + +经 Explore 代理核对,原分析报告「AI 缺 update_task / run_command 工具」**核实为假**: + +| 工具 | 报告称 | 核实 | 证据 | +|------|--------|------|------| +| `update_task` | 缺失 | ❌ **存在** | tool_registry.rs:348,AI 能改任务字段(含 status,经裸 update_field 非状态机收口) | +| `run_command` | 缺失 | ❌ **存在** | tool_registry.rs:468,完整 Shell 执行实现 | +| `run_workflow` | 空壳桩 | ⚠️ **未注册** | tool_registry.rs 无此工具(连空壳都没有) | +| `advance_task` | 缺失 | ✅ 确实缺失 | 全局搜零定义 | + +**修正后结论**:AI **能**更新任务状态、**能**运行命令,但仍**不能**:① 触发三闸门推进链(无 advance_task)② 联动工作流(task_id=None + 无完成回调)③ 在对话中触发工作流(无 run_workflow 工具)。 + +--- + +## 一、阶段 0 — 基础修复(前置,部分已立) + +已在 todo.md 立项 **B-260616-12~18**(状态枚举/路由/try-catch/字段保护/DDL/priority/绕 store)。 + +✅ **阻塞已解除(2026-06-16 D-01/D-02 决策)**: +- B-260616-12(状态枚举)→ D-260616-01 定**前端对齐后端 7 态**,可直接做 +- B-260616-13(软删除)→ D-260616-02 定**加软删除对标 projects(UI 缓做)**,可直接做 + +--- + +## 二、阶段 1 — 推进骨架(手动闭环 ~200 行,报告建议先行) + +目标:任务状态经「合法路径」推进,而非裸字段修改。 + +| 任务 | 内容 | 依赖 | +|------|------|------| +| **F-260616-01** [P1] | **状态机定义(df-nodes 新模块 `task_state_machine.rs`)**:7 态合法转换枚举(`todo→in_progress→in_review→testing→done` 闸门链 + `blocked` 退回 + `cancelled`)。独立模块,非挂在 TaskStatus enum 上。 | D-01✅ 前端对齐7态 | +| **F-260616-02** [P1] | **advance_task 推进逻辑(df-nodes `task_advance_node.rs` 实现 Node trait)**:校验转换 + 原子写(下沉 SQL `WHERE status=:expected` 防 TOCTOU)。df-nodes 需补 `df-storage` 依赖读 TaskRecord(核实无循环)。IPC 层 thin 入口调 df-nodes。 | D-03✅ df-nodes, F-01 | +| **F-260616-03** [P1] | `status` 移出 `update_task` 白名单(推进链唯一收口) | F-02(关联 B-260616-16) | +| **F-260616-04** [P2] | `review_rounds` 字段(退回时 +1,任务卡显示「第 N 轮 review」) | F-01 | +| **F-260616-05** [P1] | 前端 TaskDetail 推进按钮(手动推进,不接 AI) | F-02, F-03 | + +此阶段不接 AI/工作流,纯人工推进,但状态机保护和收口到位。 + +--- + +## 三、阶段 2 — 工作流联动(单向) + +目标:工作流执行能回写任务状态。 + +**F-260616-06** [P1](聚合): +1. `run_workflow` IPC 支持 `task_id` 参数(去 workflow.rs:56 None 硬编码) +2. 工作流完成回调 → 检查 task_id → 推进任务状态 +3. 定义任务推进 DAG 模板(AiNode 执行 + AiNode 自审 + HumanNode 核对) +4. `advance_task` 触发对应闸门工作流 +5. 前端展示工作流执行进度 + +**依赖**:阶段 1 完成。详见报告 §8 阶段 2。 + +--- + +## 四、阶段 3 — AI 执行闭环 + +目标:AI 能真正执行任务内容。 + +**F-260616-07** [P2](聚合): +1. `advance_task` AI 工具(让 AI 经合法路径推进) +2. `run_workflow` AI 工具注册实装(核对:tool_registry.rs **无此工具**,需新建) +3. AiNode 接入任务上下文(读任务描述 + 项目目录) +4. AI 自审 verdict 结构化输出 + 解析 +5. 失败路径完整处理(退回/重做/保持) + +**依赖**:阶段 2 完成。详见报告 §8 阶段 3。 + +--- + +## 五、阶段 4 — Git 集成(增强) + +目标:代码类任务支持 Git 工作流。 + +**F-260616-08** [P3](聚合): +1. 加 `kind` 字段(code/doc/design/generic) +2. code kind 闸门接 git 命令(worktree/commit/merge) +3. BranchRecord 联动(加 worktree_path) +4. `on_task_advanced` 钩子填充(分支联动 + 项目 completed) + +**依赖**:阶段 3 完成。详见报告 §8 阶段 4。 + +--- + +## 六、依赖关系图 + +``` +D-01 枚举方向 ──▶ F-01 状态机 ──▶ F-02 advance_task ──▶ F-03 收口 ──▶ F-05 前端按钮 + │ │ + └──▶ F-04 rounds └──▶ 阶段2(F-06) ──▶ 阶段3(F-07) ──▶ 阶段4(F-08) + +D-03 架构落点 ──▶ F-02 +D-04 路径取舍 ──▶ 阶段1 是否先行 +``` + +**✅ 阶段 1 可启动(2026-06-16)**:D-01(前端 7 态)/ D-03(df-nodes Node)/ D-04(先行)三决策已定。阶段 1 ~200 行,从 0% 推进能力到「手动推进闭环」。df-nodes 落点核实可行(Node trait 纯接口 `df-workflow/src/node.rs:67`,现有 AiNode/HumanNode/ScriptNode,需补 `df-storage` 依赖无循环)。 + +--- + +## 七、待合并到 `docs/todo.md` 的指针 + +> 主文件 todo.md 并发修改频繁(后台代理),以下指针待稍后合并。合并时在「待决策」区块(D-260616-04 后)插入: + +``` +### 🗺️ 任务推进链实施路径(2026-06-16 规划·供其他会话读取) + +> 详见 [任务推进链实施路径-2026-06-16.md](./02-架构设计/任务推进链实施路径-2026-06-16.md)。 +> 推进能力实现度 0%。**阶段 1 已解除阻塞(D-01/D-03/D-04 三决策已定 2026-06-16),可启动 F-01~05**。 +> 核对纠正:AI 有 update_task/run_command 工具,无 run_workflow/advance_task。 + +- [ ] F-260616-01~05 阶段1 推进骨架(状态机+advance_task+收口+rounds+前端按钮) +- [ ] F-260616-06 阶段2 工作流联动(task_id+回调+DAG模板) +- [ ] F-260616-07 阶段3 AI 执行闭环(advance_task/run_workflow 工具+AiNode+自审) +- [ ] F-260616-08 阶段4 Git 集成(kind+git闸门+worktree) +``` diff --git a/docs/02-架构设计/对抗论证裁决报告-2026-06-12.md b/docs/02-架构设计/对抗论证裁决报告-2026-06-12.md index 7255983..5a2e411 100644 --- a/docs/02-架构设计/对抗论证裁决报告-2026-06-12.md +++ b/docs/02-架构设计/对抗论证裁决报告-2026-06-12.md @@ -11,7 +11,7 @@ | 代理 | 立场 | 综合评分 | |------|------|---------| | 市场分析师 | 竞品全景 + 市场数据(带外部信源) | **4/10 — 不建议以当前形态推进** | -| 技术架构师 | 13 crate / Tauri / 引擎 / AI 可行性 | **2.7/5 — 可行但必须砍 scope** | +| 技术架构师 | 13 crate(2026-06-12 评审时数;2026-06-14 删 5 僵尸 crate,现 8)/ Tauri / 引擎 / AI 可行性 | **2.7/5 — 可行但必须砍 scope** | | 恶魔代言人 | 逐功能质疑需求真实性 | **核心成立,60% 功能该砍** | --- @@ -21,7 +21,7 @@ ### 共识 1:🔴 Scope 失控是最大风险 - 8 个核心功能横跨 4-5 个产品类别(PM + 工作流 + AI 编排 + 代码分析 + 知识库) -- 22,745 字架构文档、16 张表、13 crate —— **这是操作系统的野心,不是 MVP 的规划** +- 22,745 字架构文档、16 张表、13 crate(评审时点数;2026-06-14 裁定为 8 crate)—— **这是操作系统的野心,不是 MVP 的规划** - 现实工时:v1.0 全功能需全职 8-12 个月 / 业余 1.5-2 年 - 历史教训:Firebase/Heroku/全生命周期 API 平台都被"组件化组合"打败 @@ -112,7 +112,7 @@ ### 5.3 架构调整 -- **13 crate 保留目录结构**(已建好,删除反而费工),但 Phase 1 只激活 6 个: +- **13 crate 保留目录结构**(评审时点;2026-06-14 裁定删除 5 个僵尸 crate df-evolve/df-plugin/df-stages/df-task/df-traceability,现实际 8 crate),但 Phase 1 只激活 6 个: `df-core / df-workflow / df-storage / df-execute / df-nodes / src-tauri` - 其余 7 个 crate 标记为 `[预留]`,从 workspace 默认构建中保留但不再投入开发 - Git 操作走 Shell CLI,不引入 libgit2(技术报告建议,省 1-2 周) diff --git a/docs/03-模块文档/df-ai-AI集成模块-2026-06-12.md b/docs/03-模块文档/df-ai-AI集成模块-2026-06-12.md index 011ef73..b9025e7 100644 --- a/docs/03-模块文档/df-ai-AI集成模块-2026-06-12.md +++ b/docs/03-模块文档/df-ai-AI集成模块-2026-06-12.md @@ -173,13 +173,15 @@ GLM 端对 `tool_use_id` 为 `None`/空串的 `tool_result` 块会返 500 卡死 > 归属:`ai_tools.rs` 仅提供基础设施(`RiskLevel` / `AiTool` / `AiToolRegistry`);工具的具体定义与注册在 `src-tauri/src/commands/ai/tool_registry.rs::build_ai_tool_registry`,handler 即唯一执行路径(schema+risk+实现同源)。 -19 个内置工具,按风险分级(核对 `build_ai_tool_registry`,2026-06-15): +22 个内置工具,按风险分级(核对 `build_ai_tool_registry`,2026-06-15): -| 风险 | 工具 | -|------|------| -| Low(自动执行,6)| list_projects / list_tasks / list_ideas / list_trash / read_file / list_directory | -| Medium(需审批,7)| update_project / create_project / bind_directory / create_task / update_task / create_idea / write_file | -| High(需审批,6)| delete_task / delete_project / restore_project / purge_project / run_workflow / run_command | +| 风险 | 数量 | 工具 | +|------|------|------| +| Low(自动执行,8)| 8 | list_projects / list_tasks / list_ideas / list_trash / read_file / list_directory / file_info / search_files | +| Medium(需审批,9)| 9 | update_project / create_project / bind_directory / create_task / update_task / create_idea / write_file / patch_file / append_file | +| High(需审批,5)| 5 | delete_task / delete_project / restore_project / purge_project / run_command | + +> 原文档写 "21 个(Low 8 + Medium 8 + High 5)",遗漏了 **patch_file**(Sprint 后增补的 Medium 风险局部文件编辑工具)。实际为 **22 个(Low 8 + Medium 9 + High 5)**。 工具执行结果写 `ai_tool_executions` 表(审计日志)。 diff --git a/docs/03-模块文档/想法探索-对抗式评估-2026-06-12.md b/docs/03-模块文档/想法探索-对抗式评估-2026-06-12.md index 0ee24ec..469981e 100644 --- a/docs/03-模块文档/想法探索-对抗式评估-2026-06-12.md +++ b/docs/03-模块文档/想法探索-对抗式评估-2026-06-12.md @@ -431,7 +431,7 @@ pub enum Recommendation { │ ┌── 🔴 反方质疑 ─────── 📊 4.2/10 ──────┐ │ │ │ ⚠️ 致命: Claude Code 已在做全流程 │ │ │ │ ⚠️ 致命: 个人开发者工具付费意愿极低 │ │ -│ │ ⚠️ 严重: 13 crate 维护成本高 │ │ +│ │ ⚠️ 严重: 13 crate 维护成本高 (06-14裁至8)│ │ │ │ ⚠️ 严重: 桌面应用市场天花板明显 │ │ │ └────────────────────────────────────────┘ │ │ │ diff --git a/docs/04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md b/docs/04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md index 8824e47..a56784b 100644 --- a/docs/04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md +++ b/docs/04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md @@ -2,7 +2,7 @@ > 创建: 2026-06-10 | 状态: ✅ 已完成(2026-06-14 核对源码标注) > -> **完成说明(核对源码 src-tauri/src/commands/ 实测)**:IPC 命令层已全部落地。`src-tauri/src/lib.rs` 的 `tauri::generate_handler!` 共注册 **66 个** IPC 命令;`commands/` 目录下共 69 处 `#[tauri::command]` 标注(含少量未在入口注册的内部/辅助命令)。按 CRUD 模块组织目录结构、统一错误处理、AppState 注入、前端 invoke 封装均已实施。原文(含目标清单与待填写占位)保留如下,未删除。 +> **完成说明(核对源码 src-tauri/src/commands/ 实测,2026-06-15 复核)**:IPC 命令层已全部落地。`src-tauri/src/lib.rs` 的 `tauri::generate_handler!` 共注册 **67 个** IPC 命令;`commands/` 目录下共 70 处 `#[tauri::command]` 标注(差额 3 为已定义但未在入口注册的内部/辅助命令,主代理数行确认:ai/commands.rs 20 标注注册 19 + ai/mod.rs 2 标注未注册)。按 CRUD 模块组织目录结构、统一错误处理、AppState 注入、前端 invoke 封装均已实施。原文(含目标清单与待填写占位)保留如下,未删除。 --- @@ -12,13 +12,13 @@ ## 目标 -- [ ] 按 CRUD 模块组织 commands 目录结构 -- [ ] 实现 projects 相关 commands -- [ ] 实现 tasks 相关 commands -- [ ] 实现 workflow 相关 commands -- [ ] 统一错误处理 (Rust Error → 前端字符串) -- [ ] 状态注入 (AppState) -- [ ] 前端 invoke 封装 +- [x] 按 CRUD 模块组织 commands 目录结构 +- [x] 实现 projects 相关 commands +- [x] 实现 tasks 相关 commands +- [x] 实现 workflow 相关 commands +- [x] 统一错误处理 (Rust Error → 前端字符串) +- [x] 状态注入 (AppState) +- [x] 前端 invoke 封装 ## 实施记录 @@ -32,12 +32,12 @@ > | 任务 | `commands/task.rs` | 5 | > | 灵感 | `commands/idea.rs` | 6 | > | 工作流 | `commands/workflow.rs` | 5 | -> | AI 聊天/对话/技能/并发 | `commands/ai/`(commands.rs、conversation.rs、skills.rs 等) | 18 | +> | AI 聊天/对话/技能/并发 | `commands/ai/`(commands.rs、conversation.rs、skills.rs 等) | 19 | > | 知识库 | `commands/knowledge.rs` | 14 | > | 应用设置 KV | `commands/settings.rs` | 4 | -> | **合计** | | **66** | +> | **合计** | | **67** | > -> 另:`commands/` 目录内共 69 处 `#[tauri::command]` 标注(差额 3 为已定义但未在 `generate_handler!` 注册的内部/辅助命令)。`commands/knowledge_timeline.rs` 不是 IPC 命令文件,是知识生命线记录器(内部便捷方法,无 `#[tauri::command]`),不计入。 +> 另:`commands/` 目录内共 70 处 `#[tauri::command]` 标注(差额 3 为已定义但未在 `generate_handler!` 注册的内部/辅助命令)。`commands/knowledge_timeline.rs` 不是 IPC 命令文件,是知识生命线记录器(内部便捷方法,无 `#[tauri::command]`),不计入。 *(原文占位:待填写)* diff --git a/docs/04-功能迭代/DEVFLOW-3.Store对接实施-2026-06-12.md b/docs/04-功能迭代/DEVFLOW-3.Store对接实施-2026-06-12.md index 3702cf8..a073e13 100644 --- a/docs/04-功能迭代/DEVFLOW-3.Store对接实施-2026-06-12.md +++ b/docs/04-功能迭代/DEVFLOW-3.Store对接实施-2026-06-12.md @@ -14,13 +14,13 @@ ## 目标 -- [ ] Store 添加 async actions (调用 invoke) -- [ ] ProjectsView 接入 projectStore -- [ ] TasksView 接入 taskStore -- [ ] WorkflowView 接入 workflowStore -- [ ] IdeasView 接入 ideaStore (如有) -- [ ] 加载状态 / 错误状态 UI 处理 -- [ ] 按钮事件绑定真实操作 +- [x] Store 添加 async actions (调用 invoke) +- [x] ProjectsView 接入 projectStore +- [x] TasksView 接入 taskStore +- [x] WorkflowView 接入 workflowStore +- [x] IdeasView 接入 ideaStore (如有) +- [x] 加载状态 / 错误状态 UI 处理 +- [x] 按钮事件绑定真实操作 ## 实施记录 diff --git a/docs/04-功能迭代/DEVFLOW-4.端到端验证-2026-06-12.md b/docs/04-功能迭代/DEVFLOW-4.端到端验证-2026-06-12.md index 7f21b77..0b5658e 100644 --- a/docs/04-功能迭代/DEVFLOW-4.端到端验证-2026-06-12.md +++ b/docs/04-功能迭代/DEVFLOW-4.端到端验证-2026-06-12.md @@ -13,10 +13,10 @@ ## 验证目标 -- [ ] 创建项目 → SQLite 持久化 → 前端显示 -- [ ] 创建任务 → 绑定工作流 → 前端显示 -- [ ] 启动工作流 → 3 节点顺序执行 → 状态实时更新到前端 -- [ ] 工作流完成 → 产出物记录 → 前端查看 +- [x] 创建项目 → SQLite 持久化 → 前端显示 +- [x] 创建任务 → 绑定工作流 → 前端显示 +- [x] 启动工作流 → 3 节点顺序执行 → 状态实时更新到前端 +- [x] 工作流完成 → 产出物记录 → 前端查看 ## 验证工作流设计 diff --git a/docs/05-代码审查/任务执行与推进能力分析-2026-06-16.md b/docs/05-代码审查/任务执行与推进能力分析-2026-06-16.md new file mode 100644 index 0000000..f0c7ea1 --- /dev/null +++ b/docs/05-代码审查/任务执行与推进能力分析-2026-06-16.md @@ -0,0 +1,516 @@ +# 任务执行能力与推进能力分析 + +> **日期**: 2026-06-16 +> **范围**: 任务实体在 DevFlow 系统中的定位、执行链路、推进能力全景分析 +> **关联文档**: `任务推进构想-2026-06-14.md` / `业务系统设计-2026-06-12.md` / `AI对话引擎-2026-06-14.md` / `DAG引擎详解-2026-06-14.md` / `任务模块问题分析-2026-06-16.md` + +--- + +## 〇、核对结论速览(2026-06-16 · Explore 代理并行取证) + +> 本报告系架构分析,含密集代码事实断言。经 2 个代理逐项取证,12 项断言中 **10 真 / 1 部分真 / 1 假(重大)**。核心论点(任务能存不能推进 / nodes 未接入 / 无回调)成立,但**一处工具缺失论据错误**(见下方纠正)。 + +### 真伪矩阵 + +| # | 断言 | 核实 | 证据 | +|---|------|------|------| +| 1 | workflow.rs task_id 恒 None | ✅真 | `workflow.rs:56`,全局无写入点 | +| 2 | workflow_def_id 从未写入 | ✅真 | `task.rs:73` None,crud 有 UPDATE 语句但无调用 | +| 3 | AI 缺 update_task / run_command | ❌**假** | `update_task`(tool_registry.rs:348) + `run_command`(:468) **均存在**,仅缺 `advance_task` | +| 4 | df-task crate 已删除 | ✅真 | `ARCHITECTURE.md:89-90`,crates/ 无 df-task | +| 5 | DAG 完成无任务回调 | ✅真 | `executor.rs:169-172` 仅 emit WorkflowCompleted,无监听推进 task | +| 6 | 任务无独立业务层 | ✅真 | `task.rs` 直连 Repository,无状态机/推进逻辑 | +| 7 | AiNode 未接入任务推进 | ✅真 | `ai_node.rs:331`(~12.7KB)完整,无任务推进 DAG 模板 | +| 8 | HumanNode 未接入任务推进 | ✅真 | `human_node.rs:640`(~27.7KB)完整,无任务审批 DAG 模板 | +| 9 | ProjectDetail 工作流入口下线 | ✅真 | `ProjectDetail.vue:289-292` 注释 R-PD-2,script 节点不注册 | +| 10 | 前端无推进入口 | ✅真 | Tasks.vue 纯展示 / TaskDetail.vue 纯只读 | +| 11 | 状态枚举三方不一致 | ⚠️部分真 | 后端7态 / 前端5态(merged) / 构想5态(done);前端 vs 构想 `merged`≠`done` 微差 | +| 12 | advance_task / can_transition_to / review_rounds 全未实现 | ✅真 | Rust+TS 全局搜零定义,TaskRecord 无 review_rounds 字段 | + +### ⚠️ 关键纠正(影响多处结论) + +报告第二章 2.2「缺失关键工具」、第四章断裂点 2/3 称 **「AI 缺 update_task / run_command 工具」——核实为假**: +- `update_task`(tool_registry.rs:348)**存在**,AI 能改任务字段(含 status,经裸 update_field 非状态机收口) +- `run_command`(tool_registry.rs:468)**存在且有完整 Shell 执行实现**,AI 能写代码也能跑命令 +- 真正缺失的仅 `advance_task`(推进链触发器) + +**修正后结论**:AI **能**更新任务状态、**能**运行命令,但仍**不能**:① 触发三闘门推进链(无 advance_task)② 联动工作流(task_id=None + 无完成回调)。报告核心论点「任务能存不能(自动)执行/推进」成立,但「AI 缺 update_task/run_command」的具体论据错误,断裂点 2/3 已在正文中纠正标注。 + +--- + +## 一、任务在 DevFlow 中的设计定位 + +### 1.1 产品旅程中的位置 + +``` +想法池 ──晋升──▶ 项目 ──拆解──▶ 任务 ──执行──▶ 工作流(DAG) +(Idea) (Project) (Task) (Workflow) + 第一公民 容器/上下文 执行单元 编排引擎 +``` + +DevFlow 的核心价值链是 **「想法 → 项目 → 任务 → 工作流」**,任务是从「规划」到「执行」的转折点: + +- **想法**是「做什么」的候选池(评估/筛选/晋升) +- **项目**是「在哪个上下文做」(目录绑定/技术栈/状态) +- **任务**是「具体做什么」(标题/描述/状态/优先级/分支) +- **工作流**是「怎么自动做」(DAG 编排 AI/Script/Human 节点) + +### 1.2 设计意图:AI-First 推进链 + +`任务推进构想-2026-06-14.md` 定义了任务的终极形态: + +``` +todo ──AI执行──▶ in_progress ──AI自审──▶ review_ready ──人工核对──▶ done + AiNode AiNode HumanNode + AI 干活 AI 审 AI 的活 人最终把关 AI 产出 +``` + +核心设计原则: +- **人从「操作者」转为「审批者」** — 任务由 AI 执行,人监督 AI +- **advance_task 默认 AI 触发** — AI 执行/自审完成自动推进 +- **三闸门必需** — AI 执行 / AI 自审 / 人工核对各有关卡 +- **拒绝 → 退回 AI 重做** — 不是退回给人干 + +### 1.3 实际现状:设计 vs 实现的巨大鸿沟 + +| 维度 | 设计意图 | 实际实现 | +|------|---------|---------| +| 状态推进 | advance_task 状态机 + 三闸门 DAG | ❌ 不存在 advance_task,status 可被任意修改 | +| AI 执行 | AiNode/agent 读任务→写代码→跑测试→产出 diff | ❌ AiNode 存在但未接入任务推进链 | +| AI 自审 | AiNode 结构化 verdict (pass/warn/block) | ❌ 未实现 | +| 人工核对 | HumanNode 审批闭环 | ⚠️ HumanNode 存在但未接入任务推进链 | +| 状态机收口 | status 白名单移除,advance_task 唯一入口 | ❌ status 仍在白名单,任意可改 | +| 工作流联动 | task → workflow 双向关联 | ❌ workflow 的 task_id 恒为 None | +| 前端推进 UI | 推进按钮 + 环节可视化 + diff 展示 | ❌ 纯只读,无任何推进入口 | + +**结论:任务模块目前是一个「数据容器」,不是「执行单元」。它能存、能查、能删,但不能推进、不能执行、不能联动工作流。** + +--- + +## 二、执行能力分析 + +### 2.1 任务「执行」的定义 + +在 DevFlow 的 AI-First 愿景中,「执行任务」意味着: + +``` +1. 读取任务描述 + 项目上下文 +2. AI 写代码/改文件/跑测试(agent 多步) +3. 产出 diff / 文件变更 / 测试结果 +4. AI 自审产出(code review,结构化结论) +5. 人工最终核对 +``` + +### 2.2 当前执行能力盘点 + +#### ❌ 任务 → 工作流:无连接 + +```rust +// commands/workflow.rs — run_workflow 中 task_id 恒为 None +task_id: None, // 唯一引用点,硬编码 None +``` + +工作流执行**完全不感知任务**。`WorkflowRecord` 有 `task_id` 字段(V2 迁移加的),但没有任何代码写入它。工作流是独立运行的,不知道自己在为哪个任务工作。 + +#### ❌ AI 对话 → 任务执行:无闭环 + +AI 对话引擎有 12 个工具,其中任务相关: +- `list_tasks`(Low 风险,自动执行)— 只读 +- `create_task`(Medium 风险,需审批)— 只创建 + +**缺失的关键工具**: +- ❌ 无 `update_task` 工具 — AI 不能推进任务状态 +- ❌ 无 `advance_task` 工具 — AI 不能触发推进链 +- ❌ 无 `run_command` 工具 — AI 能写代码但不能跑("能写不能跑") +- ❌ `run_workflow` 工具是空壳 — AI 不能在对话中触发工作流 + +AI 可以 **创建任务**,但不能 **执行任务**、**推进任务**、**关联工作流**。 + +#### ❌ 工作流节点 → 任务状态:无联动 + +``` +DAG 执行完成 + │ + ▼ +WorkflowRecord.status = "completed" + │ + ▼ +(结束 — 不回调任务状态,不触发 advance_task) +``` + +DAG 引擎有完善的执行能力(拓扑排序/并发/状态机/事件总线),但执行结果**不回写任务**。一个工作流跑完了,关联的任务状态纹丝不动。 + +#### ⚠️ AiNode:有能力但没接入 + +```rust +// ai_node.rs — 12.7KB,完整实现 +// 能力:调用 LLM(OpenAI/Anthropic),config 驱动,支持上游输入 +// 但:只在 DAG 内可用,没有「为某个任务执行」的入口 +``` + +AiNode 是通用的 LLM 调用节点,可以做分析/生成/审查。但当前没有任何 DAG 模板把 AiNode 接入任务推进链。 + +#### ⚠️ HumanNode:有能力但没接入 + +```rust +// human_node.rs — 27.7KB,完整实现 +// 能力:阻塞等待人工审批(subscribe→send→select!),支持单选/多选 +// 但:只在 DAG 内可用,没有「为某个任务审批」的入口 +``` + +### 2.3 执行能力总结 + +| 执行环节 | 需要的能力 | 现状 | 缺口 | +|---------|-----------|------|------| +| 读取任务上下文 | 任务描述 + 项目目录 + 相关文件 | ✅ AI 工具可读 | — | +| AI 写代码 | write_file 工具 | ✅ 有(需审批) | — | +| AI 跑测试 | run_command 工具 | ❌ 不存在 | AI "能写不能跑" | +| AI 自审 | AiNode verdict 结构化输出 | ❌ 未实现 | 需定义 prompt + 解析 | +| 触发工作流 | run_workflow 工具 | ❌ 空壳 | 需实装 | +| 工作流回写任务 | 完成回调 advance_task | ❌ 不存在 | 需实现回调链路 | +| 人工审批 | HumanNode 审批 | ⚠️ 存在但未接入 | 需 DAG 模板 + 路由 | + +**核心断链**:任务 ←✕→ 工作流 ←✕→ AI 执行。三个系统各自独立运行,没有形成闭环。 + +--- + +## 三、推进能力分析 + +### 3.1 当前推进机制:裸 status 字段 + 无保护 + +```rust +// commands/task.rs — update_task +// status 在白名单中,任意调用方可直接修改 +state.tasks.update_field(&id, "status", &value) +``` + +任何人(AI/用户/脚本)可以一行代码把任务从 `todo` 直接改成 `done`,跳过所有闸门。这是 `任务推进构想` 文档中标注的 **P0 致命漏洞**。 + +### 3.2 设计中的推进机制:advance_task + 状态机 + +> ⚠️ **决策更新(2026-06-16)**:本节原设想 advance_task 落 IPC 层 / df-task 复活。**D-260616-03 已决策走 df-nodes Node**(对齐 D3「业务逻辑在 df-nodes 实现」):状态机落 `df-nodes/src/task_state_machine.rs`(F-01),advance_task 落 `df-nodes/src/task_advance_node.rs` 实现 Node trait(F-02),IPC 层 thin 入口调 df-nodes。又 **D-260616-01 已定前端对齐 7 态**,下文状态机示例的 5 态(ReviewReady/Abandoned)实施时按 7 态重设(激活 InReview/Testing/Blocked)。详见 [任务推进链实施路径](../../02-架构设计/任务推进链实施路径-2026-06-16.md)。 + +构想文档设计了完整的推进链,但**全部未实现**: + +#### 状态机(can_transition_to) + +```rust +// 设计中 — 未实现 +(Todo, InProgress | Abandoned) => true, +(InProgress, ReviewReady | Abandoned) => true, +(ReviewReady, Done | Abandoned | InProgress) => true, // 可退回 +_ => false, +``` + +#### 状态机下沉 SQL(防 TOCTOU) + +```sql +-- 设计中 — 未实现 +UPDATE tasks SET status=:new, updated_at=:now +WHERE id=:id AND status=:expected -- affected_rows==0 即状态已变,拒绝 +``` + +#### advance_task 命令 + +``` +设计中 — 未实现 +1. 校验状态转换合法性(can_transition_to) +2. 原子写入(下沉 SQL WHERE 前置) +3. 触发对应闸门工作流(start/ready/merge) +4. 工作流完成回调再推进状态 +5. 失败路径处理(退回/保持) +``` + +#### loop 管理 + +``` +设计中 — 未实现 +review_rounds: i32 -- 退回时 +1,任务卡显示「第 N 轮 review」 +``` + +### 3.3 推进能力总结 + +| 推进环节 | 设计方案 | 实现状态 | +|---------|---------|---------| +| 状态机定义 | 7 态 / 5 态(待统一) | ❌ 无 can_transition_to | +| 状态机收口 | 移除 status 白名单 | ❌ status 仍可任意改 | +| advance_task 命令 | 唯一 status 写入路径 | ❌ 不存在 | +| 状态机下沉 SQL | WHERE 前置防 TOCTOU | ❌ 不存在 | +| AI 执行闸门 | AiNode 最小形态 | ❌ 未接入 | +| AI 自审闸门 | AiNode verdict | ❌ 未实现 | +| 人工核对闸门 | HumanNode 审批 | ❌ 未接入 | +| 失败路径 | 退回/保持/重做 | ❌ 未实现 | +| loop 管理 | review_rounds | ❌ 字段不存在 | +| 并发护栏 | per-task 互斥锁 | ❌ 不存在 | +| 崩溃恢复 | 孤儿清理 + 审批持久化 | ⚠️ 部分存在(审批持久化有,孤儿清理无) | +| 前端推进 UI | 按钮 + 可视化 | ❌ 纯只读 | + +**推进能力实现度:0%。全部停留在构想文档阶段。** + +--- + +## 四、任务与其他系统的断裂点 + +### 4.1 断裂全景图 + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 想法池 │──✅晋升──│ 项目 │──✅拆解──│ 任务 │──✕✕✕──│ 工作流 │ +│ (Idea) │ │(Project) │ │ (Task) │ │(Workflow)│ +└──────────┘ └──────────┘ └────┬─────┘ └────┬─────┘ + │ │ + ┌────┴─────┐ ┌────┴─────┐ + │ AI 对话 │ │ DAG 引擎 │ + │ (Agentic)│ │(Executor)│ + └──────────┘ └──────────┘ + │ │ + ✕ 无 update_task ✕ task_id=None + ✕ 无 advance_task ✕ 无完成回调 + ✕ 无 run_command ✕ 无状态回写 + ✕ run_workflow=空壳 ✕ 无任务路由 +``` + +### 4.2 六大断裂点详解 + +#### 断裂点 1:任务 ↔ 工作流(task_id = None) + +```rust +// commands/workflow.rs:56 +task_id: None, // 硬编码 +``` + +工作流不知道为哪个任务执行,任务不知道被哪个工作流处理。`TaskRecord.workflow_def_id` 字段存在但从未被写入。 + +**影响**:工作流执行结果无法回写任务状态,无法实现「工作流完成 → 自动推进任务」。 + +#### 断裂点 2:AI 对话 ↔ 任务推进(无 advance_task 工具) + +> ⚠️ **核对纠正**:原报告称「无 update_task 工具」——**核实为假**,`update_task`(tool_registry.rs:348)存在。AI 工具集实际仅缺 `advance_task`(推进链触发器)。AI 能经裸 `update_task` 改 status 字段(无状态机收口,B-260616-15/16 同源),但不能触发三闸门推进链。 + +AI 工具集有 `create_task` / `update_task` 但没有 `advance_task`。AI 能创建/改任务但不能触发推进链。 + +**影响**:AI 在对话中分析了任务、写了代码、跑了测试,但无法经「合法状态机路径」把任务从 `todo` 推进到 `done`,只能裸改 status(旁路闸门)。 + +#### 断裂点 3:~~AI 对话 ↔ 命令执行(无 run_command)~~ 【⚠️ 核对为假,本断裂点不成立】 + +> ⚠️ **核对纠正**:`run_command`(tool_registry.rs:468)**实际存在且有完整 Shell 执行实现**。AI 有 `write_file` 也有 `run_command`,能写代码也能跑命令,「写→跑→改」闭环成立。(注:`run_command` 属高危需审批工具,见 AE-2025-04 会话级授权;其 stdout/stderr 恒空问题见 B-260616 系列另报。) + +~~AI 有 `write_file` 但没有 `run_command`。AI 写了代码但无法运行验证。~~ + +**影响**:~~AI 执行链断裂在「写→跑→改」的「跑」环节~~ **不成立**。AI 执行链在命令执行环节闭合。 + +#### 断裂点 4:AI 对话 ↔ 工作流(run_workflow 空壳) + +```rust +// tool_registry.rs — run_workflow 工具是 no-op 桩 +// 返回提示信息,不真正执行工作流 +``` + +**影响**:AI 不能在对话中触发工作流来自动化任务执行。对应已有任务 `R-PD-12`。 + +#### 断裂点 5:工作流完成 → 任务状态(无回调) + +DAG 执行器有 `WorkflowCompleted` 事件,但没有回调机制把这个事件转化为任务状态推进。 + +**影响**:即使工作流成功执行了 AI 执行 + AI 自审,任务状态仍然是 `todo`。 + +#### 断裂点 6:前端 ↔ 推进操作(无 UI 入口) + +Tasks.vue 是纯展示,TaskDetail.vue 是纯只读。没有任何按钮/操作可以推进任务状态。 + +**影响**:用户只能通过 AI 对话(如果 AI 有工具的话)或直接 API 调用来推进任务,但前者缺工具、后者不暴露 UI。 + +--- + +## 五、核心矛盾分析 + +### 矛盾 1:状态枚举三方不一致 + +| 层面 | 状态集 | 语义导向 | +|------|--------|---------| +| 后端 enum | todo/in_progress/in_review/testing/done/blocked/cancelled | 通用软件工程 | +| 前端常量 | todo/in_progress/review_ready/merged/abandoned | Git 工作流 | +| 推进构想 | todo/in_progress/review_ready/done/abandoned | AI-First 推进链 | + +三方各执一词,且推进构想的 5 态与前端常量一致但与后端 enum 不一致。**在推进链实现前必须先统一状态集**,否则状态机无法定义。 + +### 矛盾 2:df-task crate 已删除但任务无独立业务层 + +``` +ARCHITECTURE.md: 5.3.1 ~~Task & Branch Manager (df-task)~~ — 已移除 +> 2026-06-14 零引用清理:df-task crate 已删除 +``` + +对比其他实体: +- **Idea** → 有 `df-ideas` crate(评估/晋升/对抗) +- **Project** → 有 `df-project` crate(扫描/管理) +- **Task** → ❌ 无独立 crate,IPC 层直连 CRUD + +任务没有业务逻辑层,`commands/task.rs` 直接调 `state.tasks.insert/query/update_field/delete`。这意味着: +- 状态机逻辑无处安放(只能塞 IPC 层或重新建 crate) +- 推进链编排无处安放 +- 与其他系统的联动逻辑无处安放 + +### 矛盾 3:工作流引擎完善但无业务消费 + +DAG 引擎功能完善(拓扑排序/并发执行/状态机/事件总线/审批闭环/取消机制),但**没有任何业务场景在使用它**: +- ProjectDetail.vue 的工作流演示入口已下线(R-PD-2:script 节点不再注册) +- run_workflow AI 工具是空壳 +- 任务推进链未接入 + +引擎是「准备好了但没有乘客的列车」。 + +### 矛盾 4:AI 能力在增长但无法触达任务 + +AI 对话引擎是系统中最活跃的模块(Agentic Loop / 12 工具 / 审批门控 / 知识库集成 / 多 Provider),但它的能力**无法触达任务执行**: +- AI 能读项目代码、能写文件、能创建任务/项目/灵感 +- 但不能推进任务、不能触发工作流、不能运行命令 +- AI 的「手」伸到了文件系统,但伸不到任务状态机和工作流引擎 + +--- + +## 六、能力成熟度评估 + +### 按维度评分(满分 5 分) + +| 维度 | 评分 | 说明 | +|------|------|------| +| **数据存储** | ⭐⭐⭐⭐ | CRUD 完整,SQLite 持久化,字段丰富 | +| **数据查询** | ⭐⭐⭐ | 基本查询可用,缺分页/搜索/排序 | +| **状态管理** | ⭐ | 裸字段无保护,无状态机,无收口 | +| **执行能力** | ⭐ | 完全断裂,任务无法被执行 | +| **推进能力** | ⭐ | 0% 实现,全停留在构想文档 | +| **工作流联动** | ⭐ | task_id=None,无回调,无路由 | +| **AI 集成** | ⭐⭐ | AI 能创建任务,但不能执行/推进 | +| **前端体验** | ⭐⭐ | 列表展示可用,详情只读,无操作入口 | +| **数据安全** | ⭐⭐ | 硬删除无恢复,字段保护不足 | +| **架构设计** | ⭐⭐⭐⭐ | 构想文档非常完整(344 行),设计质量高 | + +**综合评分:2.1/5** — 数据层及格,执行/推进层空白。 + +### 与其他实体对比 + +| 实体 | 存储 | 业务逻辑 | AI 集成 | 工作流联动 | 前端体验 | 综合 | +|------|------|---------|---------|-----------|---------|------| +| **Idea** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ (df-ideas) | ⭐⭐⭐ (评估/晋升) | ⚪ N/A | ⭐⭐⭐⭐ | **3.6** | +| **Project** | ⭐⭐⭐⭐ | ⭐⭐⭐ (df-project) | ⭐⭐⭐ (创建/描述) | ⚪ N/A | ⭐⭐⭐⭐ | **3.5** | +| **Task** | ⭐⭐⭐⭐ | ⭐ (无 crate) | ⭐ (仅创建) | ⭐ (断裂) | ⭐⭐ (只读) | **2.1** | +| **Workflow** | ⭐⭐⭐ | ⭐⭐⭐⭐ (df-workflow) | ⭐⭐ (AiNode 可用) | ⭐ (无消费) | ⭐⭐ (已下线) | **2.4** | +| **Knowledge** | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ (提炼/注入) | ⚪ N/A | ⭐⭐⭐ | **3.4** | + +**任务是系统中成熟度最低的实体。** + +--- + +## 七、根因分析 + +### 为什么任务模块「能存不能执行」? + +``` +根因链(从表层到深层): + +表层:前端无推进入口,后端无 advance_task + ↑ +中层:任务 ↔ 工作流断裂(task_id=None),AI 工具缺 update_task/run_command + ↑ +深层:df-task crate 被删除后,任务没有业务逻辑层 + ↑ +根因:任务推进链涉及跨系统编排(Task + Workflow + AI + Human), + 但系统设计是「引擎不绑定业务」(D3 决策), + 导致引擎和业务之间的「胶水层」始终没有建立 +``` + +### 架构决策 D3 的双刃剑 + +```markdown +### D3: 引擎不绑定业务 +- DAG 引擎纯粹做编排,不感知具体业务语义 +- 业务逻辑在 df-nodes 实现(Node trait 是纯接口) +``` + +这个决策本身是好的(关注点分离),但它留下了一个**架构空洞**: + +``` +DAG 引擎(通用编排) ←——空洞——→ 任务业务(具体语义) + df-workflow ??? + df-nodes +``` + +谁来把「任务推进」这个业务语义映射到「DAG 工作流执行」?答案应该是 **advance_task 编排层**(构想文档中设计了但未实现),或者一个新 crate(df-task 的复活)。 + +--- + +## 八、建议:从「数据容器」到「执行单元」的路径 + +### 阶段 0:修复基础问题(前置条件) + +参照 `任务模块问题分析-2026-06-16.md`: +1. 统一状态枚举(前后端对齐) +2. 注册 `/tasks/:id` 路由 +3. 补 updateTask store 错误处理 +4. 不可变字段保护 + +### 阶段 1:建立推进骨架(最小闭环) + +``` +目标:任务状态能通过「合法路径」推进,而非裸字段修改 + +1. 实现 TaskStatus::can_transition_to(状态机定义) +2. 实现 advance_task 推进逻辑(**df-nodes Node**,D-260616-03 已决策;IPC 层 thin 入口):校验+原子写入+状态机下沉 SQL +3. 从 update_task 白名单移除 status(收口) +4. 前端 TaskDetail 加推进按钮(手动推进,不接 AI) +5. 补 review_rounds 字段 +``` + +此阶段不接 AI/工作流,纯人工推进,但状态机保护和收口到位。 + +### 阶段 2:接入工作流(单向联动) + +``` +目标:工作流执行能回写任务状态 + +1. run_workflow 支持 task_id 参数(不再硬编码 None) +2. 工作流完成回调 → 检查 task_id → 推进任务状态 +3. 定义任务推进 DAG 模板(AiNode 执行 + AiNode 自审 + HumanNode 核对) +4. advance_task 触发对应闸门工作流 +5. 前端展示工作流执行进度 +``` + +### 阶段 3:AI 执行能力(闭环) + +``` +目标:AI 能真正执行任务内容 + +1. 补 run_command AI 工具(或等 patch_file + run_command 完善) +2. 补 update_task / advance_task AI 工具 +3. 实装 run_workflow AI 工具(不再是空壳) +4. AiNode 接入任务上下文(读任务描述 + 项目目录) +5. AI 自审 verdict 结构化输出 + 解析 +6. 失败路径完整处理(退回/重做/保持) +``` + +### 阶段 4:Git 集成(增强) + +``` +目标:代码类任务支持 Git 工作流 + +1. 加 kind 字段(code/doc/design/generic) +2. code kind 闸门接 git 命令(worktree/commit/merge) +3. BranchRecord 联动(加 worktree_path) +4. on_task_advanced 钩子填充(分支联动 + 项目 completed) +``` + +--- + +## 九、总结 + +### 一句话诊断 + +**任务是 DevFlow 系统中设计最完善(344 行构想文档)但实现最空白(0% 推进能力)的模块。它目前是一个「能存能查不能做」的数据容器,距离设计中的「AI-First 执行单元」还有阶段 1-3 的完整路径要走。** + +### 最紧迫的事 + +不是写 AI 执行、不是接工作流,而是 **先建立 advance_task 状态机骨架 + 收口 status 字段**。因为: +- 状态机是所有后续工作的基础(没有合法转换定义,AI 推进无从谈起) +- status 旁路是 P0 安全漏洞(AI 能直接改 status = done,所有闸门形同虚设) +- 这是投入最小(~200 行代码)但收益最大的改动(从 0% 推进能力到「手动推进闭环」) diff --git a/docs/05-代码审查/任务模块问题分析-2026-06-16.md b/docs/05-代码审查/任务模块问题分析-2026-06-16.md new file mode 100644 index 0000000..d07bf72 --- /dev/null +++ b/docs/05-代码审查/任务模块问题分析-2026-06-16.md @@ -0,0 +1,351 @@ +# 任务模块问题分析报告(核对版) + +> **日期**: 2026-06-16 +> **范围**: 任务模块全栈(Rust 后端 + Tauri IPC + Vue 3 前端) +> **审查文件**: `task.rs` / `tasks.ts` / `Tasks.vue` / `TaskDetail.vue` / `crud.rs` / `models.rs` / `types.rs` / `project.ts` / `state.rs` / `migrations.rs` / `router/index.ts` +> **核对方法**: Explore 代理并行验源码,逐项 `file:line` 取证 +> **核对结论**: 原清单 18 项中 **真 bug 8 项**(P0×2 P1×6)、增强 5 项、假/部分假 3 项、与现有 todo 去重 3 项 + +--- + +## 〇、核对结论速览 + +| # | 原清单结论 | 核实 | 处置 | +|---|-----------|------|------| +| 1 | 状态枚举前后端不一致(5 vs 7) | ✅ 真 | 三方分裂,记 B-260616-12 | +| 2 | DDL priority 默认(1) vs 代码(2) | ✅ 真 | 潜在非现患,记 B-260616-14 | +| 3 | delete_task 硬删除无恢复 | ✅ 真 | 记 B-260616-13 | +| 4 | priority 无值域校验 | ✅ 真 | 记 B-260616-15 | +| 5 | id/created_at/project_id 可篡改 | ✅ 真 | 记 B-260616-16 | +| 6 | updateTask 无 try/catch | ✅ 真 | 记 B-260616-17 | +| 7 | TaskDetail 绕过 store | ✅ 真 | 记 B-260616-18 | +| 8 | /tasks/:id 路由未注册 | ✅ 真 | 🔄 去重 = B-260616-09 已存在 | +| 9 | 无分页全量加载 | 🔄 去重 | = F-260615-03 已立 | +| 10 | watch 重复 IPC | 🔄 去重 | = B-260615-29 设计决策 | +| 11 | 列表组件重复 | ❌ 假 | 两文件模板结构不同(.task-item vs .task-card),排除 | +| 12 | project_id 无存在性校验 | ⚠️ 部分假 | `db.rs:22 PRAGMA foreign_keys=ON` 兜底拦截,降级 | +| 13 | description 无长度限制 | 🟡 增强 | 待产品决策 | +| 14 | branch_name 无格式校验 | 🟡 增强 | 待产品决策 | +| 15 | TaskDetail 只读无编辑 | 🟡 增强 | 待产品决策 | +| 16 | 无批量操作 | 🟡 增强 | 待产品决策 | +| 17 | 无排序选项 | 🟡 增强 | 待产品决策 | +| 18 | 无搜索能力 | 🔄 去重 | ≈ F-260615-07 思路 | + +--- + +## 一、模块架构概览 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 前端 (Vue 3 + TS) │ +│ Views │ Tasks.vue (列表) → TaskDetail.vue │ +│ Store │ stores/project/tasks.ts │ +│ API │ api/task.ts │ +│ Types │ api/types.ts → TaskRecord │ +│ Constants │ constants/project.ts (状态/优先级映射) │ +├─────────────────────────────────────────────────────────┤ +│ IPC 层 (Tauri) │ +│ Commands │ commands/task.rs (5 个命令) │ +│ State │ state.rs → TaskRepo │ +├─────────────────────────────────────────────────────────┤ +│ 后端 (Rust Crates) │ +│ df-core │ types.rs → TaskStatus 枚举 │ +│ df-storage │ models.rs → TaskRecord 结构体 │ +│ │ crud.rs → TaskRepo (CRUD 实现) │ +│ │ migrations.rs → tasks 表 DDL │ +└─────────────────────────────────────────────────────────┘ +``` + +### IPC 命令(5 个) + +| 命令 | 签名 | 说明 | +|------|------|------| +| `list_tasks` | `(project_id?) → Vec` | 列出任务,可按项目筛选 | +| `get_task_by_id` | `(id) → TaskRecord` | 按 ID 查单个任务 | +| `create_task` | `(input) → TaskRecord` | 创建任务,默认 status=todo, priority=2 | +| `update_task` | `(id, field, value) → bool` | 更新单字段,status 值有枚举校验 | +| `delete_task` | `(id) → bool` | 删除任务(硬删除) | + +### TaskStatus 枚举(后端 7 种) + +| 状态值 | 说明 | +|--------|------| +| `todo` | 待开始 | +| `in_progress` | 进行中 | +| `in_review` | 代码审查中 | +| `testing` | 测试中 | +| `done` | 已完成 | +| `blocked` | 已阻塞 | +| `cancelled` | 已取消 | + +### 优先级映射 + +| 值 | 标签 | 样式 | +|----|------|------| +| 0 | P0 | critical(紧急) | +| 1 | P1 | high(高) | +| 2 | P2 | medium(中,默认) | +| 3 | P3 | low(低) | + +--- + +## 二、问题清单(含核对标注) + +### 🔴 P0 — 数据一致性 / 功能断裂 + +#### 1. 前后端状态枚举完全不一致 【✅ 真 · 核对确认】 + +| 层 | 状态值集合 | 证据 | +|----|-----------|------| +| 后端枚举 `TaskStatus` | `todo, in_progress, in_review, testing, done, blocked, cancelled`(7) | `crates/df-core/src/types.rs:131-146` | +| 前端类型注释 | 同后端 7 种 | `src/api/types.ts:88` | +| 前端常量 `TASK_STATUS_LABELS` | `todo, in_progress, review_ready, merged, abandoned`(5) | `src/constants/project.ts:56-62` | +| 前端 `taskStatusClass` | 同常量 5 种,未定义回退 `status-todo` | `src/constants/project.ts:76-78` | +| 前端 i18n `tasks.ts` | 同常量 5 种 | `src/i18n/{en,zh-CN}/tasks.ts:47-54` | + +**影响链**: +- 后端 `update_task` 的 `TaskStatus::is_valid()`(`task.rs:96`)只接受 7 种;前端筛选器的 `review_ready/merged/abandoned` 后端全部拒绝 +- AI 工具或后端写入 `in_review/testing/blocked` 时,前端 `TASK_STATUS_LABELS` 查不到 → 回退显示原始 key(用户见 `in_review` 而非中文) +- `taskStatusClass` 查不到 → 回退 `status-todo`,视觉无法区分 +- Dashboard 统计 `activeTasks` 仅查 `in_progress`,`testing/blocked` 不计入 + +**根因**:前端状态集是早期 Git 工作流导向(review_ready/merged/abandoned),后端枚举后来规范化为通用状态机,两者从未对齐。`types.ts` 注释随了后端,但常量/i18n/样式仍停在旧集。 + +**人定决策点**:前端对齐到后端 7 种纯状态机,还是保留 Git 工作流 5 种语义做映射? + +--- + +#### 2. DDL 默认值与代码默认值矛盾 【✅ 真 · 潜在非现患】 + +| 来源 | `priority` 默认值 | 证据 | +|------|-------------------|------| +| DDL | `DEFAULT 1`(high) | `crates/df-storage/src/migrations.rs:304` | +| Rust `default_priority()` | `2`(medium) | `src-tauri/src/commands/task.rs:26-28` | +| 前端 `Tasks.vue` | `2`(medium) | `src/views/Tasks.vue:62` | + +当前 `create_task` 显式传 `priority`(走代码默认 2),DDL 默认值不生效。但未来若有直连 SQL 写入路径或手动改库,`priority=1` 与应用层 `2` 不一致。低危,可并入下次 migration 对齐。 + +--- + +#### 3. `delete_task` 硬删除 — 无恢复机制 【✅ 真 · 核对确认】 + +```rust +// src-tauri/src/commands/task.rs:113 +state.tasks.delete(&id).await.map_err(err_str) // 物理删 +// crates/df-storage/src/crud.rs:194 — DELETE FROM tasks WHERE id=? +``` + +`TaskRecord`(`crates/df-storage/src/models.rs:53-66`)无 `deleted_at` 字段。对比 `ProjectRecord` 有完整软删除(`deleted_at` + `list_deleted` + `restore`)。 + +**风险**:误删永久丢失;关联 `branches.task_id` 外键变悬空(无 `ON DELETE CASCADE/SET NULL`)。 + +**人定决策点**:任务是否需要软删除 + 恢复(对标 projects),还是物理删除即可(任务粒度小、误删可重建)? + +--- + +### 🟠 P1 — 安全 / 竞态 / 架构 + +#### 4. `update_task` 缺少 `priority` 值域校验 【✅ 真 · 核对确认】 + +```rust +// src-tauri/src/commands/task.rs:96-102 — 仅 status 校验 +if field == "status" && !TaskStatus::is_valid(&value) { ... } +// priority 直接透传 update_field,无范围检查 +``` + +`update_task(id, "priority", "999")` 或 `"abc"` 静默落库。前端 `PRIORITY_LABELS`(`constants/project.ts:82`,key 0-3)查不到 → 回退 `P999` + 样式 `priority-low`(`project.ts:95-97`)。 + +**修复**:`field == "priority"` 时校验 `value.parse::()` ∈ `0..=3`。 + +--- + +#### 5. `update_task` 缺少 `id` / `created_at` 等不可变字段保护 【✅ 真 · 核对确认】 + +```rust +// crates/df-storage/src/crud.rs:324-327 +"tasks" => &["id", "project_id", "title", "description", "status", "priority", + "branch_name", "assignee", "workflow_def_id", "base_branch", + "created_at", "updated_at"], +``` + +白名单含 `id` / `created_at` / `project_id` → AI 工具或恶意调用可改主键、篡改创建时间、把任务移到别的项目。前端未暴露,但 IPC 层无防护。 + +**修复**:tasks 白名单移除 `id`/`created_at`;`project_id` 若允许跨项目移动则保留但加目标项目存在性校验。 + +--- + +#### 6. 前端 `updateTask` store 无错误处理 【✅ 真 · 核对确认】 + +```typescript +// src/stores/project/tasks.ts:29-35 — 无 try/catch +async function updateTask(id, field, value) { + await taskApi.update(id, field, value) + const idx = state.tasks.findIndex(t => t.id === id) + if (idx >= 0) (state.tasks[idx] as any)[field] = value +} +``` + +对比同文件 `loadTasks`(10-16) / `createTask`(18-27) / `deleteTask`(37-44) 都有 try/catch。IPC 失败(如非法 status 被后端拒)→ Promise reject 冒泡,错误不写 `state.error`,用户无提示。 + +**修复**:补 try/catch,失败写 `state.error` + toast。 + +--- + +#### 7. `TaskDetail.vue` 绕过 store 直接调 API 【✅ 真 · 核对确认】 + +```typescript +// src/views/TaskDetail.vue:101 import { taskApi, projectApi } from '@/api' +// src/views/TaskDetail.vue:137-141 直接 taskApi.get() / projectApi.list() +``` + +其他视图走 `useProjectStore()`,TaskDetail 直调 API: +- 不享受 AR-11 `df-data-changed` 联动刷新(其他窗口改任务,本页不自动刷新) +- `projectApi.list()` 全量拉项目列表仅为解析 `project_id → name` + +**修复**:改走 store.loadTasks/store.projects,或单独监听 `df-data-changed` 重载当前 task。 + +--- + +#### 8. `/tasks/:id` 路由未注册 【✅ 真 · 导航断裂 · 🔄 去重 = B-260616-09 已存在】 + +```typescript +// src/router/index.ts:45-49 — 只有 /tasks +{ path: '/tasks', name: 'Tasks', component: () => import('../views/Tasks.vue') } +// src/views/Tasks.vue:57 — 任务卡点击跳转 +router.push('/tasks/${task.id}') // 路由表无此路径 → 落空 +``` + +对比 `/ideas/:id`、`/projects/:id` 均已注册,唯独 `/tasks/:id` 遗漏。点击任务卡片匹配不到路由(落入 catch-all 或空白页)。1 行改动速赢。 + +--- + +### 🟡 P2 — 性能 / 体验 / 代码质量 + +#### 9. 无分页 — 全量加载所有任务 【🔄 去重 = F-260615-03】 + +```rust +// src-tauri/src/commands/task.rs:32-41 +None => state.tasks.list_all().await, // 无 limit/offset,ORDER BY created_at DESC +``` + +已有任务 **F-260615-03** 覆盖,不重复立项。 + +--- + +#### 10. `Tasks.vue` 筛选切换导致重复全量请求 【🔄 去重 = B-260615-29】 + +```typescript +// src/views/Tasks.vue:229-233 +watch(activeProject, (key) => { store.loadTasks(key === 'all' ? undefined : key) }) +// src/views/Tasks.vue:165-192 filteredGroups computed 已做纯前端 filter +``` + +这是 **B-260615-29** 的设计决策(避免跨项目视图不同步),代价是每次切换 IPC 往返。不重复立项。 + +--- + +#### 11. ~~`Tasks.vue` 和 `ProjectDetail.vue` 任务列表样式/逻辑重复~~ 【❌ 假 · 排除】 + +核对:`Tasks.vue:57-73` 用 `.task-item` 布局,`ProjectDetail.vue:137-151` 用 `.task-card` 布局,模板结构不同。两者引用相同常量函数(状态/优先级映射),但模板本身非重复。**排除**。 + +--- + +#### 12. `create_task` 无 `project_id` 存在性校验 【⚠️ 部分假 · 降级】 + +```rust +// src-tauri/src/commands/task.rs:59-84 — create_task 不校验 project_id +project_id: input.project_id, // 直接使用 +``` + +但 `crates/df-storage/src/db.rs:22` 已开 `PRAGMA foreign_keys=ON`,DB 层外键约束会拦截指向不存在 project 的 insert。代码层无显式校验,但风险被 DB 兜住。**降级为非漏洞**,仅留注释说明依赖外键。 + +--- + +#### 13. `description` 字段无长度限制 【🟡 增强】 + +`TaskRecord.description` 是 `String`,DDL 为 `TEXT NOT NULL DEFAULT ''`。无前后端长度校验,超大文本影响 Markdown 渲染性能。待产品决策加上限。 + +--- + +#### 14. `branch_name` / `base_branch` 无 Git 分支名格式校验 【🟡 增强】 + +允许任意字符串(空格/特殊字符/中文),可能与实际 Git 分支不兼容。待产品决策加格式校验。 + +--- + +### 🔵 P3 — 增强建议(均待产品决策) + +| # | 项 | 说明 | +|---|----|------| +| 15 | TaskDetail 纯只读 | 无编辑/改状态/改优先级 UI;列表页也无内联编辑 → 当前无任何 UI 改任务状态,只能靠 AI 工具/API | +| 16 | 无批量操作 | 无法批量改状态/删除/分配 | +| 17 | 无排序选项 | 固定 `ORDER BY created_at DESC`,无法按优先级/状态/更新时间排 | +| 18 | 无搜索能力 | ≈ F-260615-07 思路 | + +--- + +## 三、问题汇总矩阵(含核对标注) + +| # | 严重度 | 类型 | 问题 | 影响 | 核实 | +|---|--------|------|------|------|------| +| 1 | P0 | 数据一致性 | 前后端状态枚举不一致(5 vs 7 种) | 全局 | ✅ 真 | +| 2 | P0 | 数据一致性 | DDL priority 默认值(1) vs 代码(2) | 数据层 | ✅ 真(潜在) | +| 3 | P0 | 数据安全 | delete_task 硬删除无恢复 | 数据丢失 | ✅ 真 | +| 4 | P1 | 安全校验 | priority 无值域校验 | 数据质量 | ✅ 真 | +| 5 | P1 | 安全校验 | id/created_at/project_id 可被篡改 | 数据完整性 | ✅ 真 | +| 6 | P1 | 健壮性 | updateTask store 无 try/catch | 用户体验 | ✅ 真 | +| 7 | P1 | 架构 | TaskDetail 绕过 store | 数据同步 | ✅ 真 | +| 8 | P1 | 功能缺陷 | /tasks/:id 路由未注册 | 导航断裂 | ✅ 真 | +| 9 | P2 | 性能 | 无分页全量加载 | 扩展性 | 🔄 F-260615-03 | +| 10 | P2 | 性能 | 筛选切换重复 IPC | 响应速度 | 🔄 B-260615-29 | +| 11 | P2 | 代码质量 | 任务列表组件重复 | 可维护性 | ❌ 假 | +| 12 | P2 | 安全校验 | project_id 无存在性校验 | 数据完整性 | ⚠️ 部分假(外键兜底) | +| 13 | P2 | 安全校验 | description 无长度限制 | 性能 | 🟡 增强 | +| 14 | P2 | 安全校验 | branch_name 无格式校验 | 数据质量 | 🟡 增强 | +| 15 | P3 | 功能缺失 | TaskDetail 无编辑能力 | 用户体验 | 🟡 增强 | +| 16 | P3 | 功能缺失 | 无批量操作 | 效率 | 🟡 增强 | +| 17 | P3 | 功能缺失 | 无排序选项 | 用户体验 | 🟡 增强 | +| 18 | P3 | 功能缺失 | 无搜索能力 | 用户体验 | 🔄 ≈F-260615-07 | + +--- + +## 四、todo 编号映射 + +记入 `docs/todo.md`(B-260615-58 起,沿用 6.15 编号保连续): + +| todo 号 | 原清单 # | 等级 | 摘要 | +|---------|---------|------|------| +| B-260616-12 | 1 | P0 | 状态枚举前后端分裂(7 vs 5),需人定:Git 工作流 vs 纯状态机 | +| B-260616-13 | 3 | P0 | delete_task 硬删除无恢复,需人定:是否要任务软删除 | +| B-260616-14 | 2 | P1 | DDL priority DEFAULT 1 vs 代码 2,migration 对齐 | +| B-260616-15 | 4 | P1 | update_task priority 无值域校验(0..=3) | +| B-260616-16 | 5 | P1 | allowed_columns 含 id/created_at/project_id 可篡改 | +| B-260616-17 | 6 | P1 | updateTask store 无 try/catch | +| B-260616-18 | 7 | P1 | TaskDetail 绕 store,不享受联动刷新 | +| B-260616-09 | 8 | P1 | /tasks/:id 路由未注册 — **已存在去重**(todo 排查会话区块) | + +> 编号沿用 B-260616 批次(与 B-260616-08~11 同批,今日 06-16 发现)。 +> 增强 #13-17 归 F- 类,待产品决策后立项。 + +--- + +## 五、建议修复顺序 + +1. **#8** 路由注册 `/tasks/:id`(1 行速赢) +2. **#6** updateTask store 加 try/catch +3. **#4** priority 值域校验(0..=3) +4. **#5** 不可变字段保护(id/created_at 移出白名单) +5. **#1** 状态枚举对齐(**需人定决策**) +6. **#3** 软删除支持(**需人定决策**) +7. **#2** DDL 默认值修正 +8. **#7** TaskDetail 接入 store +9. 其余 P2/P3 按需排期 + +--- + +## 六、人定决策点(需用户拍板,非大模型推断) + +1. **状态枚举方向**(#1):前端对齐到后端 7 种纯状态机,还是保留 Git 工作流 5 种语义(review_ready/merged/abandoned)做映射?影响筛选器/i18n/统计全链。 +2. **任务软删除**(#3):任务是否需要软删除 + 恢复(对标 projects),还是物理删除即可(任务粒度小、误删可重建)? + +这两项是产品/架构取舍,与模型能力无关,决策后记入功能决策记录。 diff --git a/docs/07-项目管理/Phase1任务清单-2026-06-12.md b/docs/07-项目管理/Phase1任务清单-2026-06-12.md index fd30ea0..a4a8409 100644 --- a/docs/07-项目管理/Phase1任务清单-2026-06-12.md +++ b/docs/07-项目管理/Phase1任务清单-2026-06-12.md @@ -30,10 +30,10 @@ Phase 1 目标:**引擎骨架**,打通 `df-core → df-workflow → df-stora | # | 任务 | 优先级 | 依赖 | 文档 | 完成 | |---|------|--------|------|------|------| | 7 | df-storage CRUD 层 | P0 | 无 | [DEVFLOW-1](../04-功能迭代/DEVFLOW-1.CRUD层实施-2026-06-12.md) | [x] ✅ `crud.rs` `impl_repo!` 宏 12 处(Project/Task/Idea/Branch/Release/WorkflowExecution/Knowledge/AiConversation 等 Repo),Sprint 2 | -| 8 | Tauri IPC 命令层 | P0 | #7 | [DEVFLOW-2](../04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md) | [x] ✅ `commands/` 共 20 文件 / 57+ command(project/task/idea/workflow + AI + knowledge + settings),Sprint 3 起 | +| 8 | Tauri IPC 命令层 | P0 | #7 | [DEVFLOW-2](../04-功能迭代/DEVFLOW-2.IPC桥接实施-2026-06-12.md) | [x] ✅ `commands/` 共 20 文件 / 67 个 command 注册(src-tauri/src/lib.rs invoke_handler:project 14 + task 5 + idea 6 + workflow 5 + ai 19 + knowledge 14 + settings 4),Sprint 3 起 | | 9 | Store 接入 View | P0 | #8 | [DEVFLOW-3](../04-功能迭代/DEVFLOW-3.Store对接实施-2026-06-12.md) | [x] ✅ `stores/` 10 文件(composable 模式),各 View 接 Store 真数据,Sprint 4 | | 10 | 端到端验证 (3 节点工作流) | P0 | #7, #8, #9 | [DEVFLOW-4](../04-功能迭代/DEVFLOW-4.端到端验证-2026-06-12.md) | [x] ✅ `run_workflow` IPC + DAG `topological_layers` + `join_all` 并行;ProjectDetail.vue 3 节点 Shell DAG 运行 + 实时事件日志,Sprint 4 | -| 11 | 首次 Git Commit | P0 | 无 | 建立版本基线 | [x] ✅ git log 73 commit,首提交 `98393b4 初始化 DevFlow 项目仓库`,Sprint 2 | +| 11 | 首次 Git Commit | P0 | 无 | 建立版本基线 | [x] ✅ git log 82 commit,首提交 `98393b4 初始化 DevFlow 项目仓库`,Sprint 2 | ### 已知问题 diff --git a/docs/08-用户指南/patch_file使用指南.md b/docs/08-用户指南/patch_file使用指南.md new file mode 100644 index 0000000..763c8e9 --- /dev/null +++ b/docs/08-用户指南/patch_file使用指南.md @@ -0,0 +1,107 @@ +# patch_file 使用指南 + +> 创建: 2026-06-15 +> 关联设计: docs/02-架构设计/patch_file工具设计-2026-06-15.md + +## 使用场景 + +局部更新文件(替代 read-merge-write 多步流程),精确定位 `old_text` 并替换为 `new_text`。 + +适用于只改文件中某几行的场景:大文件改 3 行无需重发全部内容,避免 `write_file` 全量覆盖的事故风险(参见 FR-S7 记录:762 行文件被覆盖为 248 字节)。 + +## API 参数 + +| 参数 | 必填 | 说明 | +|------|------|------| +| `path` | 是 | 目标文件路径(workspace 内,走 `validate_path` 校验 + 黑名单) | +| `old_text` | 是 | 要替换的精确文本(必须与文件内容完全匹配,含空格/缩进;充当乐观锁) | +| `new_text` | 是 | 替换后的新文本 | +| `line` | 否 | 行号辅助定位(快速跳转 + 去歧增强;有值时优先跳到该行检查 `old_text`,不匹配则降级全文扫描) | +| `expected_hash` | 否 | 文件指纹防脏写,格式 `"{unix_timestamp}_{size}"`(如 `"1718400000_12345"`),由 `read_file` 返回的 `file_hash` 字段携带 | + +补充去歧参数(可选):`before_text` / `after_text` —— 当 `old_text` 多处匹配时,作为上下文锚精确锁定目标位置。 + +## 返回值 + +```json +{ + "success": true, + "patches_applied": 1, + "total_matches": 1, + "lines_changed": 2, + "warnings": [], + "file_hash": "1718400000_12400" +} +``` + +| 字段 | 含义 | +|------|------| +| `success` | 是否成功 | +| `patches_applied` | 成功替换的 patch 数 | +| `total_matches` | 每个 patch 的总命中数(含未替换的) | +| `lines_changed` | 总行数变化(正=增加,负=减少) | +| `warnings` | 警告信息,如 `["匹配到 3 处,仅替换第 1 处"]` | +| `file_hash` | 操作后的新指纹(下次操作传入 `expected_hash` 用) | + +## 安全边界 + +- **RiskLevel Medium**:修改已有文件,需人工审批 +- **自动 `.bak` 备份**:复用 FR-S7 已有逻辑,误操作可恢复 +- **old_text 不匹配 → 报错**(不修改文件,避免盲替换) +- **expected_hash 不匹配 → 报错**(防并发脏写,提示「文件已被外部修改,请重新读取」) +- **三层防御**:L1 文件级 Mutex(防时机冲突)+ L2 old_text 精确匹配(防内容错配)+ L3 expected_hash 指纹校验(防版本漂移),底层兜底 `.bak` 备份 + +## 最佳实践 + +- **old_text 取足够上下文确保唯一**:避免短串多处匹配,收到「匹配到 N 处」warning 时用 `before_text`/`after_text` 锚定或加长 `old_text` 重试 +- **大段修改用多个小 patch 而非一个巨大 patch**:每个 patch 独立校验,失败可定位 +- **危险操作前先 `file_info` 确认**:核对路径、大小、是否二进制(含 `\0` 的文件会被拒绝) +- **read → patch 链路带上 hash**:`read_file` 返回 `file_hash`,传入 `patch_file` 的 `expected_hash` 形成乐观锁闭环 +- **多 patch 从文件末尾往前排**:避免行号偏移(工具内部已按此执行) +- **old_text 必须完全匹配**:含空格、缩进、换行,复制粘贴原文最稳妥 + +## 示例 + +### 基础替换 + +```json +{ + "path": "src/main.rs", + "old_text": "fn old()", + "new_text": "fn new()" +} +``` + +### 带 hash 乐观锁 + +```json +{ + "path": "src/main.rs", + "expected_hash": "1718400000_12345", + "patches": [ + { "old_text": "fn old()", "new_text": "fn new()" } + ] +} +``` + +### 多处匹配用 line 锚定 + +```json +{ + "path": "src/main.rs", + "old_text": "return Ok(())", + "new_text": "return Ok(value)", + "line": 42 +} +``` + +## 边界情况 + +| 情况 | 行为 | +|------|------| +| 文件不存在 | 报错「文件不存在」 | +| 二进制文件(含 `\0`) | 报错「不支持二进制文件」 | +| `old_text` 为空串 | 报错「old_text 不能为空」 | +| `new_text` == `old_text` | 成功 + warning「无实际更改」 | +| 路径含 `..` | `validate_path` 黑名单拦截 | +| 目标是 `.bak`/`.tmp` | 拒绝(CR-03 噪声文件过滤) | diff --git a/docs/08-用户指南/使用手册-2026-06-12.md b/docs/08-用户指南/使用手册-2026-06-12.md index d321825..a684e33 100644 --- a/docs/08-用户指南/使用手册-2026-06-12.md +++ b/docs/08-用户指南/使用手册-2026-06-12.md @@ -123,8 +123,11 @@ npm run tauri build #### 工具调用 - **生成代码**:根据描述生成完整实现 -- **文件操作**:读取、编辑项目文件 -- **Git 操作**:提交、推送、合并 +- **文件操作**:读取、写入(write_file)、局部编辑(patch_file)、追加(append_file)、搜索(search_files)项目文件 +- **项目管理**:创建/更新/删除项目、绑定目录 +- **任务管理**:创建/更新/删除任务 +- **Shell 执行**:在项目目录运行命令(run_command,需人工审批) +- **知识库**:自动提炼对话经验到知识库 ## 💡 想法池功能 @@ -138,9 +141,19 @@ npm run tauri build ``` ### 状态管理 -- **草稿**:初始想法 -- **活跃**:正在考虑 -- **已完成**:已实现或放弃 + +想法共 6 个状态(对齐 `crates/df-core/src/types.rs` 的 `IdeaStatus` 枚举): + +| 状态值 | 含义 | 说明 | +|--------|------|------| +| `draft` | 草稿 | 初始创建 | +| `pending_review` | 待评估 | 已提交,等待 AI/人工评估 | +| `approved` | 已批准 | 评估通过,可晋升为项目 | +| `rejected` | 已拒绝 | 评估未通过 | +| `promoted` | 已晋升 | 已转为项目(`promoted_to` 写入目标 project_id)| +| `archived` | 已归档 | 历史归档 | + +典型流转:`draft → pending_review → approved → promoted`(正向)/ `→ rejected → archived`(淘汰)。 ### 未来升级 - **对抗式评估**:正方+反方+分析师 @@ -175,7 +188,6 @@ npm run tauri build ### 个人效能 - **任务完成率**:按时完成任务比例 - **分支管理**:活跃分支数量 -- **工作流成功率**:自动执行成功率 ### 项目进度 - **阶段分布**:规划/开发/测试/上线 @@ -241,7 +253,6 @@ npm run tauri build - 问题反馈:创建 Issue - 功能建议:想法池提交 -- 使用交流:Discord 社区 --- diff --git a/docs/INDEX.md b/docs/INDEX.md index c0a9710..319fc3f 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -124,7 +124,7 @@ docs/ |------|------|------| | 架构设计 | `../ARCHITECTURE.md` | 22,745 字完整架构文档 | | 项目进展 | `../PROGRESS.md` | 工作进展与交接 | -| Crate 结构 | `../ARCHITECTURE.md#四crate-结构` | 13 个 Crate 概览 | +| Crate 结构 | `../ARCHITECTURE.md#四crate-结构` | 8 个 Crate 概览 | | 数据模型 | `../ARCHITECTURE.md#六数据模型` | SQLite 表结构定义 | | Phase 规划 | `../ARCHITECTURE.md#八phase-规划` | 5 个 Phase 路线图 | @@ -136,7 +136,7 @@ docs/ |----|------|------| | Desktop | Tauri v2 | Rust 后端 + WebView 前端 | | Frontend | Vue 3 + TypeScript + Pinia | Arco Design 组件库 | -| Engine | Rust Workspace (13 crate) | 多 crate 架构 | +| Engine | Rust Workspace (8 crate) | 多 crate 架构 | | Storage | SQLite (rusqlite) | 本地优先,零运维 | | AI | Multi-Provider | Claude/GLM/DeepSeek/OpenAI 兼容 | | Build | Bun + Vite | 前端构建 | diff --git a/docs/todo.md b/docs/todo.md index b3b471a..ad080ea 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -24,7 +24,7 @@ ## 待办 -### 📋 编排推进总览(2026-06-15 汇总) +### 📋 编排推进总览(2026-06-16 汇总) 未完成待办按可执行性分 8 组(详细条目见下方各分类,勿重复记录): @@ -47,22 +47,70 @@ - [x] B-260614-02 — ~~df-workflow ConditionEngine 默认 true~~ ✅ mission:T-260614-02 已修复(conditions.rs:31 `Ok(true)`→`Ok(false)` 保守拒绝;5 个原断言错误行为的测试同步改断言;df-workflow 7 test pass)(06-14) - [x] B-260614-04 — ~~df-workflow NodeRegistry::default() script 工厂 unimplemented!~~ ✅ mission:T-260614-03 已修复(删除整个 Default impl——零调用方 + 违反铁律;state.rs build_registry 已用 new() + 手动注册真实 ScriptNode)(06-14) +### 🔧 2026-06-16 排查会话新报 bug(4 项·仅分析未实施) + +> 排查性质会话(session-role-diagnose-only),仅走查定位根因 + 记录待办,未改代码。 + +- [x] ✅(第㉖批 2026-06-16·主代理直修) B-260616-09 [P1] — **任务详情点击打开空白(路由漏注册)**。**router/index.ts 补 /tasks/:id → TaskDetail**(L50-54 新增块,6 行,参照 /projects/:id L39-43 + /ideas/:id L27-31 模式)。name 'TaskDetail' 无冲突(现有 name 集无此项),复用 icon-thunder(对齐 /ideas/:id 复用 icon-lightbulb、/projects/:id 复用 icon-apps 一致模式)。TaskDetail.vue 现挂载,Tasks.vue:57 router.push(`/tasks/${task.id}`) 不再跳未注册路由,B-18 联动刷新等功能激活(死代码转活)。改动极简确定(6 行路由表项),主代理直修省 workflow 单 agent 编排开销。vue-tsc exit 0。— src/router/index.ts +- [x] ✅(第㉖批 2026-06-16) B-260616-10 [P1] — **provider 配置后 AI 面板仍提示「未配置」**。**Settings.vue loadProviders 同步刷全局 store**。L376 import useAiStore + L383 const aiStore = useAiStore()(跟随 L382 appSettings 风格)+ L420-424 loadProviders 内本地 aiProviders.value 刷新成功后 L424 await aiStore.loadProviders() 刷全局 state.providers(模块级单例 ai.ts:45,L20/L44 注释明确全应用共享同一份,AiChat 共享)。三处调用点(saveProvider L464/deleteProvider L479/setDefaultProvider L490)+ onMounted L731 均经 loadProviders 自动同步全局。无循环(useAiPanel.ts:91 loadProviders 只刷 state.providers 不回调 Settings)。无 i18n 改动(纯数据同步),try/catch + showToast 保留。vue-tsc exit 0。— src/views/Settings.vue +- [ ] B-260616-11 [P2] — **AI 消息 `-`/`+` 列表/diff 无视觉效果**。marked 实测两个出口:①裸 `-`/`+` 混用 → GFM 要求同列表标记一致,marked 拆成**两个独立 `