Tauri 2 + Vue 3 + Vite 6 桌面应用,Rust workspace 含 13 个 crate (df-ai / df-storage / df-workflow / df-core / df-execute 等)。 核心能力:AI 聊天 agentic 循环(工具调用+人工审批)、工作流引擎、 任务/想法/项目/阶段管理、可追溯性,及配套前端组件。
398 lines
26 KiB
Markdown
398 lines
26 KiB
Markdown
# DevFlow — 项目进展与工作交接
|
||
|
||
> 创建: 2026-06-10 | 最后更新: 2026-06-12 | 当前阶段: Phase 2 aichat UX 快赢(A 路线)+ 技能联想需求调研(Sprint 8)
|
||
|
||
---
|
||
|
||
## 一、项目速览
|
||
|
||
| 项目 | 值 |
|
||
|------|-----|
|
||
| 定位 | AI 原生创作流程驾驶舱,从想法到创作成果的全流程管理 |
|
||
| 技术栈 | Tauri v2 + Vue 3 + TypeScript + Pinia / Rust Workspace (13 crate) / SQLite |
|
||
| 路径 | `E:/wk-lab/devflow/` |
|
||
| 架构文档 | `ARCHITECTURE.md` (22,745 字) |
|
||
| Git 状态 | 未首次 commit,代码全在 untracked |
|
||
| AI 能力 | df-ai OpenAI 兼容 Provider + 12 工具 + Agentic Loop |
|
||
|
||
---
|
||
|
||
## 二、代码规模统计
|
||
|
||
### Rust 后端 (71 个 .rs 文件)
|
||
|
||
| Crate | 文件数 | 总行数 | 有效行 | 实现程度 |
|
||
|-------|--------|--------|--------|---------|
|
||
| df-core | 4 | 259 | 151 | ✅ 完整 — 错误/事件/状态枚举/ID生成 |
|
||
| df-workflow | 7 | 489 | 333 | ✅ 核心 — DAG拓扑排序/执行器/状态机/事件总线 可用 |
|
||
| df-storage | 4 | 294 | 217 | ✅ 部分 — SQLite连接/迁移/建表完整,**缺 CRUD 层** |
|
||
| df-execute | 5 | 203 | 129 | ⚡ 混合 — Shell 执行器真实可用,Docker/SSH/Git 骨架 |
|
||
| df-ideas | 6 | 421 | 278 | ⚡ 大部分 — 捕获/评估/晋升/关联图 有逻辑,评分固定值 |
|
||
| df-task | 5 | 390 | 252 | ⚡ 大部分 — Task/Branch/Semver 可用,合并冲突 骨架 |
|
||
| df-project | 5 | 272 | 175 | ⚡ 混合 — 数据模型/Timeline 可用,调度器 骨架 |
|
||
| df-ai | 6 | 281 | 173 | 🔧 接口 — 类型/Provider trait 完整,无实际 LLM 调用 |
|
||
| df-traceability | 4 | 312 | 201 | ⚡ 混合 — 决策记录/标注构建 可用,SQLite查询 骨架 |
|
||
| df-plugin | 4 | 255 | 158 | ⚡ 混合 — Host/Builder 有逻辑,核心加载 骨架 |
|
||
| df-evolve | 6 | 301 | 172 | ⚡ 混合 — Knowledge/PromptTemplate 可用,引擎/提取器 骨架 |
|
||
| df-nodes | 9 | 344 | 277 | ⚡ 混合 — script_node 真实可用(接 Shell),human_node 半实现(审批响应 TODO),其余 6 种骨架 |
|
||
| df-stages | 6 | 287 | 209 | 🔩 全骨架 — 11个阶段节点 Schema 完整,execute() 全空 |
|
||
| **合计** | **71** | **~4,108** | **~2,625** | |
|
||
|
||
### 前端 (9 页面 + Store + i18n)
|
||
|
||
| 类别 | 文件数 | 行数 | 状态 |
|
||
|------|--------|------|------|
|
||
| Vue 页面 | 9 | ~3,372 | ✅ UI 全部真实 — 无空壳 |
|
||
| Pinia Store | 4 | ~362 | ⚠️ 有 state/getter 但**无 action,View 未引用** |
|
||
| Router | 1 | 63 | ✅ 9 条路由含动态路由 |
|
||
| i18n | 2 | ~94 | ⚠️ 翻译完整但**未接入 main.ts** |
|
||
| 设计系统 | 1 | 105 | ✅ CSS 变量/动画/Arco 暗色覆盖 |
|
||
| Tauri Commands | 1 | 13 | 🔩 仅 `greet` 示例,无业务逻辑 |
|
||
|
||
**前端关键问题**:
|
||
- 所有 View 组件数据**硬编码** (`ref([...])`),与 Store 完全独立
|
||
- 所有按钮事件处理函数为**空函数** `{}`
|
||
- i18n 插件未注册到 Vue app
|
||
- Arco Design 组件库未实际使用(仅 CSS 变量覆盖)
|
||
|
||
---
|
||
|
||
## 三、架构分层与依赖关系
|
||
|
||
```
|
||
真实可用路径(有端到端逻辑):
|
||
df-core (类型基础)
|
||
→ df-workflow (DAG 拓扑排序 + 执行器 + 状态机 + EventBus)
|
||
→ df-execute/shell (tokio::process Shell 执行)
|
||
→ df-storage (SQLite 连接 + 迁移 + 建表)
|
||
|
||
待打通路径(骨架就位,需填充):
|
||
df-workflow → df-nodes (8种节点 execute() 待实现)
|
||
df-workflow → df-stages (11种阶段节点 execute() 待实现)
|
||
df-ai → LlmProvider 实现 (无 HTTP client)
|
||
df-storage → 所有 crate 的 CRUD 操作
|
||
Tauri commands → Rust 业务逻辑
|
||
Vue Views → Pinia Store → Tauri IPC → Rust
|
||
```
|
||
|
||
---
|
||
|
||
## 四、全局性问题
|
||
|
||
| # | 问题 | 影响 | 优先级 | 状态 |
|
||
|---|------|------|--------|------|
|
||
| 1 | **无 CRUD 层** — df-storage 只有建表 | 所有 crate 无法持久化数据 | P0 | ✅ Sprint 2 |
|
||
| 2 | **Tauri IPC 未建** — 只有 greet 示例 command | 前端无法调用后端 | P0 | ✅ Sprint 3(17 commands) |
|
||
| 3 | **Store 未接入 View** — 两套独立硬编码数据 | 数据流断裂 | P0 | ✅ Sprint 4 |
|
||
| 4 | **AI Provider 无实现** — trait 定义完整但无 HTTP client | AI 功能全部不可用 | P1 | ✅ Sprint 5 |
|
||
| 5 | **同层节点未并行** — DagExecutor 有 TODO 注释 | 工作流执行效率 | P1 | ✅ Sprint 3(join_all) |
|
||
| 6 | **条件表达式引擎** — 仅支持 true/false 字面量 | 条件分支不可用 | P2 | ⬜ 待办 |
|
||
| 7 | **i18n 未注册** — 翻译文件存在但未挂载 | 多语言不生效 | P2 | ✅ Sprint 7 |
|
||
| 8 | **未 git commit** — 代码全 untracked | 无版本基线 | P0 | ✅ Sprint 2 |
|
||
|
||
---
|
||
|
||
## 五、Phase 规划与当前进度
|
||
|
||
### Phase 1 — 引擎骨架 ✅ 完成
|
||
|
||
| 任务 | 状态 | 说明 |
|
||
|------|------|------|
|
||
| df-core 类型系统 | ✅ 完成 | 错误/事件/状态枚举/ID生成 |
|
||
| df-workflow DAG 引擎 | ✅ 完成 | 拓扑排序/执行器/状态机/EventBus |
|
||
| df-storage SQLite 基础表 | ✅ 完成 | 6 张表 + 4 索引,缺 CRUD |
|
||
| df-execute Shell 执行 | ✅ 完成 | tokio::process 实现 |
|
||
| 最小前端:项目列表 + 工作流日志 | ✅ 完成 | Sprint 4:5 页面接 Store + 创建/运行交互 |
|
||
| 验证:3 节点简单工作流 | ⬜ 待验证 | 后端就绪,需端到端跑通 |
|
||
| df-storage CRUD 层 | ✅ 完成 | Sprint 2:6 Repo + impl_repo! 宏;Sprint 3 增 BranchRepo |
|
||
| 对抗式评估系统 | ✅ 完成 | Sprint 6:AdversarialEngine + 正反方辩论 + AI 分析师 |
|
||
| Migrations V2(关联字段 + branches 表) | ✅ 完成 | Sprint 3 |
|
||
| Executor 同层并行 + 状态转换校验 | ✅ 完成 | Sprint 3,4 单测全绿 |
|
||
| Tauri IPC 命令 | ✅ 完成 | Sprint 3:17 commands + 事件转发 |
|
||
| Store 接入 View | ✅ 完成 | Sprint 4:API 层 + composable Store + 5 页面改造 |
|
||
|
||
### Phase 2 — AI 集成 ✅ 核心完成
|
||
|
||
| 任务 | 状态 | 说明 |
|
||
|------|------|------|
|
||
| df-ai Provider 实现 | ✅ | OpenAI 兼容 HTTP client,流式 SSE 解析 |
|
||
| AI 工具注册 + V3 迁移 | ✅ | AiToolRegistry + 12 工具(list/create/update/delete + 文件系统) |
|
||
| AI IPC 命令 | ✅ | 17 个 AI command(对话/工具执行/审批门控) |
|
||
| AI Chat 面板 | ✅ | 侧边栏 + 分离窗口 + 拖拽调宽 + 对话管理 |
|
||
| Agentic Loop | ✅ | 多轮工具调用循环(max 10 轮)+ 中/高风险人工审批 |
|
||
| AI Node 实现 | ✅ | df-nodes 接 df-ai:config 驱动 provider(base_url/api_key/model/prompt)→ OpenAICompatProvider.complete → 输出 text/model/usage;注册 "ai" 节点;未端到端实测 |
|
||
| **AI Chat LLM 优化** | 🚧 P0 完成 | 任务 #43:P0 可靠性(超时/断连/停止生成)✅;P1 token 控制(usage采集/滑动窗口/摘要)⬜ | |
|
||
|
||
### Phase 3 — 想法池 + 多项目 (3-4 周) | ⬜ 未开始
|
||
### Phase 4 — 节点丰富 + 阶段插件 (3-4 周) | ⬜ 未开始
|
||
### Phase 5 — 体验打磨 (4-6 周) | ⬜ 未开始
|
||
|
||
---
|
||
|
||
## 六、工作迭代日志
|
||
|
||
### [Sprint 1] 2026-06-10 — 项目初始化
|
||
|
||
**工作内容**:
|
||
- 创建项目骨架:`bun create vite` + Tauri v2 + Cargo Workspace
|
||
- 编写完整架构文档 `ARCHITECTURE.md` (22,745 字)
|
||
- 13 个 Rust crate 全部创建,类型系统和接口设计完整
|
||
- 9 个 Vue 页面 UI 全部编写(~3,372 行),设计系统完善
|
||
- 4 个 Pinia Store 定义(state + computed)
|
||
- i18n 中英文翻译
|
||
|
||
**代码规模**:Rust ~4,108 行 / Vue+TS ~3,896 行 / 总计 ~8,000 行
|
||
|
||
**遗留问题**:
|
||
1. 所有数据硬编码,无持久化
|
||
2. 前后端未桥接
|
||
3. 未做 git commit
|
||
|
||
**下一步建议**:
|
||
1. 首次 git commit 建立基线
|
||
2. 优先实现 df-storage CRUD 层(所有持久化的前置条件)
|
||
3. 实现 Tauri IPC 命令层
|
||
4. 将 Store 接入 View,替换硬编码数据
|
||
5. 端到端验证:3 节点简单工作流跑通
|
||
|
||
---
|
||
|
||
### [Sprint 2] 2026-06-10/11 — 设计审查 + 对抗论证 + 阻塞项修复
|
||
|
||
**工作内容**:
|
||
- 三路功能审查(架构/前端/数据模型):发现 4 条核心路径全断、缺 10 张表、状态枚举三套不一致
|
||
- 三路对抗论证(市场/技术/需求"魔法打败魔法"):综合结论 = 方向有价值、scope 必须砍 60%
|
||
- 修复 Phase 1 阻塞项:Shell Windows 兼容(cmd /C)、状态枚举统一(types.rs 为准)、DAG 序列化(DagDef + NodeRegistry)
|
||
- 实现 df-storage CRUD 层(6 Repo + impl_repo! 宏 + spawn_blocking + 列名白名单)
|
||
- ScriptNode 接入 df-execute Shell 执行器
|
||
- 建立 docs/ 8 层文档体系(中文命名)
|
||
- 新增设计文档:业务系统设计、对抗论证裁决报告、想法探索-对抗式评估
|
||
|
||
**关键决策(详见 docs/02-架构设计/对抗论证裁决报告.md)**:
|
||
- 定位调整:"产研操作系统" → "本地优先的个人开发流程驾驶舱"
|
||
- 砍掉:插件系统、经验进化(自动)、需求-测试追溯、多模型路由、Agent 协作
|
||
- 降级:想法池(简化+对抗式评估)、标注(TODO 扫描器)、决策留痕(字段级)
|
||
- Phase 1 只激活 6 个 crate,其余 7 个标记预留
|
||
- 验证策略:先自用 3 个月再决定是否对外
|
||
|
||
**遗留问题**:
|
||
1. Executor 同层并行化 + StateMachine 转换校验(任务 #8)
|
||
2. Migrations V2 补字段(promoted_to/workflow_def_id/project_id 等)+ branches 表(任务 #9)
|
||
3. Tauri IPC / 前端 Store 对接尚未开始
|
||
4. Sprint 2 的代码变更未 commit
|
||
|
||
**下一步**:
|
||
1. commit Sprint 2 变更
|
||
2. Migrations V2 + Executor 并行化
|
||
3. Tauri IPC(AppState + project/task/workflow commands)
|
||
4. 前端类型对齐 + Store 接 View
|
||
|
||
### [Sprint 3] 2026-06-11 — Migrations V2 + Executor 并行化 + Tauri IPC(三代理并行)
|
||
|
||
**工作内容**(三个子代理并行,目录互不重叠):
|
||
- **Migrations V2**(df-storage/df-core):版本推进到 2 — ideas 补 promoted_to/ai_analysis/scores、tasks 补 workflow_def_id/base_branch、workflow_executions 补 project_id/task_id、新建 branches 表(含 2 索引);BranchRecord/BranchRepo/BranchStatus 枚举同步落地,ALLOWED_COLUMNS 白名单 +8 列
|
||
- **Executor 并行化**(df-workflow):同层节点改 futures::join_all 并发,三阶段模式(串行准备→并发执行→串行收尾)规避借用冲突;StateMachine 增加转换校验(仅 Pending→Running、Running→Completed/Failed 合法,set_xxx 改返回 Result);4 个单测全绿(含并行耗时断言 <180ms、失败中止下游层)
|
||
- **Tauri IPC**(src-tauri):AppState(db + 6 Repo + EventBus + NodeRegistry)+ 17 个 command(project/task/idea CRUD + run_workflow/list/get executions);run_workflow 先落库 status=running 立即返回 execution_id,事件经 app.emit("workflow-event") 转发前端,完成后回写状态。注意:NodeRegistry 不能用 default()(script 工厂是 unimplemented! 占位),改为 new() + 手动注册真实 ScriptNode
|
||
|
||
**验证**:cargo check 通过(仅 1 个 dead_code 警告:releases/node_executions Repo 暂无 command 使用);cargo test -p df-workflow 4 passed
|
||
|
||
**遗留问题**:
|
||
1. executor 失败路径只发 NodeFailed 不发 WorkflowFailed,目前由 run_workflow 在 IPC 层补发——后续应下沉到 executor
|
||
2. 前端 Store/View 仍硬编码,未调用任何 command
|
||
3. NodeRegistry::default() 的 unimplemented! 占位是隐患,应改为注册真实节点或移除
|
||
|
||
**下一步**:
|
||
1. 前端类型对齐(id: string、状态枚举对齐 types.rs)+ src/api/ 封装层
|
||
2. Store 加 action 接 API,核心 4 页面(Dashboard/Projects/ProjectDetail/Tasks)接 Store
|
||
3. 端到端验证:tauri dev 创建项目 → 运行 3 节点工作流 → 日志实时展示
|
||
|
||
### [Sprint 4] 2026-06-11 — 前端交互功能(API 层 + Store + 5 页面)
|
||
|
||
**工作内容**:
|
||
- **API 层**:新建 `src/api/` 目录 — types.ts(与 Rust Record 严格对齐)+ project/task/idea/workflow 四个 invoke 封装 + 事件监听(listen workflow-event)
|
||
- **Store 重写**:`stores/project.ts` 改为 composable 模式(reactive 全局状态 + 12 个 actions + computed stats),不依赖 Pinia
|
||
- **Projects.vue**:接 Store 真数据 + 创建项目模态框(名称/描述)+ 卡片点击跳详情页 + status 中文映射
|
||
- **ProjectDetail.vue**:路由参数加载项目 + 真实任务列表 + **3 节点 Shell DAG 工作流运行**(环境检查→运行测试→构建产物)+ 实时事件日志 + 创建任务模态框 + onUnmounted 清理监听
|
||
- **Tasks.vue**:项目/状态双筛选联动 + 创建任务模态框(选择项目+标题)+ 状态/优先级中文映射
|
||
- **Ideas.vue**:捕捉想法模态框 + 选中详情(tags JSON 解析、scores 展示)+ 删除功能
|
||
- **Dashboard.vue**:统计卡从 Store computed 计算 + Active Projects/Idea Pool 接真数据 + quickCapture 跳 Ideas
|
||
|
||
**代码变更**:13 files, +1059/-486
|
||
|
||
**遗留问题**:
|
||
1. 端到端验证未完成:需 tauri dev 实际创建项目→运行工作流→确认日志展示
|
||
2. 无数据时空状态展示较简陋
|
||
3. ~~Settings/Knowledge/Decisions 三个页面仍为硬编码 demo~~ ✅ Sprint 7 已解决(三 view 接 stores/{knowledge,settings}.ts,无 ref([ 硬编码)
|
||
|
||
**下一步**:
|
||
1. 端到端验证:tauri dev → 创建项目 → 运行 3 节点工作流 → 日志实时展示
|
||
2. 修复验证中发现的问题
|
||
3. 考虑 Phase 2 规划
|
||
|
||
### [Sprint 5] 2026-06-11 — AI Chat 全功能(Provider + 工具执行 + Agentic Loop)
|
||
|
||
**工作内容**:
|
||
- **df-ai Provider**:OpenAI 兼容 HTTP client,SSE 流式解析,ChatMessage/CompletionRequest 类型系统
|
||
- **V3 存储迁移**:ai_providers、ai_conversations、ai_tool_executions 三张表 + 对应 Repo
|
||
- **AI IPC 命令层**:17 个 command — 对话发送/流式推送、工具执行/审批门控(低风险自动/中高风险人工)、对话管理(CRUD + 切换)
|
||
- **AI 工具注册**:12 个工具 — list_projects/tasks/ideas(只读)、create_project/task/idea(创建)、update_project(更新)、delete_project(删除)、read_file/list_directory/write_file(文件系统)
|
||
- **Agentic Loop**:多轮工具调用循环(max 10 轮),流式输出→检测工具调用→执行→结果回传→继续,中高风险暂停等审批后恢复
|
||
- **AI Chat 前端**:侧边栏面板 + 拖拽调宽 + 分离独立窗口 + 对话列表管理 + 工具审批弹窗 + AgentRound 多轮消息
|
||
- **Tauri Capabilities**:ai-detached 窗口权限配置
|
||
|
||
**代码变更**:20+ files,新增 ~2000 行
|
||
|
||
**遗留问题**:
|
||
1. ~~空白屏问题:Vite 启动正常(122s)、HTML 200,但 webview 显示空白~~ ✅ Sprint 7 已修复(index.html 主题防闪烁脚本 + 启动计时埋点 __APP_T0 + body 背景色)
|
||
2. AI Node 未实现 — 目前只有骨架,需接入 df-ai 的 LlmProvider(任务 #44)
|
||
3. AI Chat LLM 调用逻辑待优化:长对话可靠性、大任务执行稳定性、token 消耗控制(任务 #43)— **P0 可靠性已在 Sprint 6 完成,P1 token 控制待办**
|
||
|
||
**下一步**:
|
||
1. 排查并修复空白屏问题
|
||
2. 实际验证 AI Chat 端到端(选 Provider → 发消息 → 工具调用 → 审批)
|
||
3. HumanNode + Settings 页面
|
||
4. AI Chat LLM 调用逻辑优化(任务 #43)
|
||
5. AI Node 实现(任务 #44)
|
||
|
||
### [Sprint 6] 2026-06-11 — AI Chat 调用可靠性 P0 + 前端类型修复
|
||
|
||
**工作内容**:
|
||
|
||
**A. AI Chat 调用可靠性 P0(df-ai + src-tauri,跨前后端 6 文件)** — 三路代理核对(调用链/上下文-token/前端)后定位可靠性死锁类问题,本轮按"先保命"只做 P0 五项(P1 token 控制设计已定,留待下轮):
|
||
- **P0-1 连接超时**:`openai_compat.rs` Client 加 `connect_timeout(30s)` 防连接阶段无限 hang;不设总 timeout(避免 reqwest 总时长限制误砍流式长生成任务)
|
||
- **P0-2 流式 idle timeout**:`stream_llm` 用 `tokio::time::timeout(120s)` 包 `stream.next()`,防"连上后中途静默"无限 hang
|
||
- **P0-3 断连检测丢弃残缺**:维护 `finished_received` 标志,流尽未收到 finished 信号 → emit AiError + **丢弃残缺响应不当完整入库**(防脏历史污染)
|
||
- **P0-4 停止生成**:`AiSession.stop_flag: Arc<AtomicBool>` + 新 `ai_chat_stop` command + 前端停止按钮(streaming 时切换为珊瑚红方块按钮);run_agentic_loop/stream_llm 多检查点响应,停止后保留已生成文本
|
||
- **P0-5 切对话防护**:`ai_conversation_switch` 生成中拒绝切换(防 active_conversation_id 被改导致旧 loop 的 save_conversation 串台写库)
|
||
|
||
**B. 前端既有类型错误修复(14 处,让 `bun run build` 通过)**:
|
||
- `types.ts`:删重复的 `WorkflowEventPayload`(declaration merging 冲突)
|
||
- `stores/project.ts`:补 `invoke` import + `payload.event.data` 类型断言 + **return 包 `reactive()` 自动解包 computed**(一处解决 Dashboard/ProjectDetail 的 store.stats/pendingApproval 解包,消费端零改动)
|
||
- `Ideas/Tasks/ProjectDetail`:去掉 `parseInt(number)` 误用 → `new Date(timestamp)`
|
||
- `ProjectDetail.vue`:删 unused `nextTick` import
|
||
- `AiChat.vue`:删死代码 `TOOL_STATUS_MAP` + `toolStatusLabel`
|
||
|
||
**C. AI Chat 代码审查修复(9 处,ai.rs + openai_compat.rs)** — 对 P0 代码做 /review 审查后修复,cargo check ✓:
|
||
- 🔴① `finish_reason="length"`(max_tokens 截断)纳入 finished — 修「大任务输出撞 4096 上限被误判断连、丢弃整段响应」(与 ④ 配合是本轮关键)
|
||
- 🔴② 路径校验最小加固:正斜杠→反斜杠规范化 + 拒 `..` 遍历 + 扩 `.aws`/`.gnupg`(根治 workspace 白名单 + canonicalize 待定边界后再做)
|
||
- 🔴③ tool_calls 按 index 排序(assistant 消息 line506 + tool_result line709 两处),消 HashMap 迭代乱序
|
||
- 🔴④ max_tokens 4096→8192,贴合大任务
|
||
- 🟡⑤ `ai_chat_stop` 在审批等待态清 pending_approvals + 复位 generating(原 stop_flag 无人读取,停止按钮表面无反应、会话卡 generating=true)
|
||
- ⚪⑨ 4 个 i18n 小函数(language_instruction/capability_section/behavior_rules/context_label)合并为 `system_prompt_parts`
|
||
- ⚪⑩ `extract_title` 单次 chars 遍历
|
||
- ⚪⑪ reqwest builder 降级加 `warn!`
|
||
|
||
**代码变更**:df-ai/openai_compat.rs、src-tauri/{commands/ai.rs, lib.rs}、前端 7 文件(+ C 轮 review:ai.rs、openai_compat.rs)
|
||
|
||
**验证**:cargo check -p devflow ✓(仅既有 warning)、vue-tsc --noEmit ✓、bun run build ✓(built in 2.47s)
|
||
|
||
**遗留问题 / 下一步**:
|
||
1. **P1 token 控制(任务 #43 续)**:流式 usage 采集(`stream_options:{include_usage:true}` + SSE usage 字段)+ token 预算自适应窗口(chars≈/3.5 启发式估算)+ 历史摘要压缩(早期摘要 + 近期全文)—— 设计已定,未实施。**⚠️ usage 采集 2026-06-11 用户叫停暂缓(结构层写一半已回退),P1 从 token 估算/裁剪/摘要续**
|
||
2. **实测验证**:`cargo tauri dev` 跑起来验证停止按钮/超时/断连真实生效(本轮仅编译 + 类型验证)
|
||
3. 停止生成边界:LLM 正常输出时停止立即生效(<1s);idle(无输出)时最多等 120s idle timeout —— P2 可用 `tokio::sync::Notify` 优化为绝对即时
|
||
4. ~~Sprint 5 遗留的空白屏问题仍待排查~~ ✅ Sprint 7 已修复(用户实测确认)
|
||
|
||
### [Sprint 7] 2026-06-11 — 空白屏修复 + i18n 接入 + 剩余页面接 Store
|
||
|
||
**工作内容**:
|
||
- **空白屏修复**(前端):`index.html` 加主题防闪烁脚本(localStorage `df-theme` 渲染前置 `data-theme`)+ 启动计时埋点 `window.__APP_T0` + body 背景 `#0c0e1a`;`main.ts` 加 `.use(i18n)` 并打印 mount 耗时日志。用户实测确认空白屏消失
|
||
- **i18n 接入**:`main.ts` 注册 `i18n` 插件;`i18n/index.ts` 完整(legacy:false / globalInjection / zh-CN 默认 + en fallback / localStorage `df-language` 持久化);App.vue 导航与各 view 改 `$t()`
|
||
- **剩余 3 页面接 Store**:`Knowledge.vue`/`Settings.vue`/`Decisions` 去硬编码 `ref([...])`,对接新建 `stores/{knowledge,settings,ai}.ts`
|
||
- **新路由**:`/` redirect → `/ai-home`,新增 `AiHome.vue`(默认落地页)/`AiDetached.vue`(分离窗口);路由 9→11 条
|
||
- **df-nodes 实现度修正**:核对发现 `script_node.rs` 早为真实实现(接 df_execute Shell + 非零退出码判断),`human_node.rs` 半实现(发 `HumanApprovalRequest` 事件 + 超时循环,但审批响应 TODO 直接返回"同意")—— 非文档原记"全骨架"
|
||
|
||
**遗留问题 / 下一步**:
|
||
1. **P1 token 控制(任务 #43 续)**:仍待办(usage 采集用户叫停,从 token 估算/裁剪/摘要续)
|
||
2. **条件表达式引擎**(conditions.rs 仍 true/false 字面量)— P2 未动
|
||
3. ~~AI Node 实现(任务 #44)~~ ✅ 本轮已实现:`ai_node.rs` 接 df-ai `OpenAICompatProvider`,从 `ctx.config` 读 base_url/api_key/model/prompt/system_prompt/temperature/max_tokens 调 `complete()`,prompt 支持上游输入优先;`df-nodes/Cargo.toml` 加 df-ai 依赖;`state.rs` build_registry 注册 "ai"。cargo check ✓(未端到端实测真实 LLM 调用)
|
||
4. **df-stages** 11 个 execute() 全空骨架 — Phase 4
|
||
5. **HumanNode 审批响应闭环**:目前直接返回"同意",需前端审批弹窗回写结果
|
||
|
||
### [Sprint 8] 2026-06-12 — Anthropic 协议 + 切对话不中断 + 技能联想需求调研
|
||
|
||
**工作内容**:
|
||
|
||
**A. aichat 升级 A 路线(UX 快赢,已实现并验证)** — 详见 memory `aichat-roadmap-ab-split`:
|
||
- **Anthropic 协议 Provider**:新增 `crates/df-ai/src/anthropic_compat.rs`,实现 `LlmProvider` trait 覆盖 Anthropic Messages API(`x-api-key` + `anthropic-version`、顶层 `system`、必填 `max_tokens`、SSE event 类型解析、`content_block` tool_use)。按 `provider_type` 路由分发(`run_agentic_loop` / `ai_node`)。支持 GLM 订阅端点 `https://open.bigmodel.cn/api/anthropic` — **用户实测对话流式 OK**
|
||
- **切对话不打断生成**:后端 `AiChatEvent` 全变体加 `conversation_id`,agentic loop spawn 前快照 conv_id,所有 emit 填充;`ai_conversation_switch` 生成中只读返回;前端 `stores/ai.ts` 按 conversation_id 路由(后台对话事件不污染当前视图,完成/错误时刷新侧边栏)
|
||
- **审查项落地**:删全屏 Tool Approval Modal(保留行内卡片审批)、错误友好化(`friendlyError` 正则映射 404/401/timeout/network → 中文提示 + `isError` 红色气泡)、智能滚动(`isNearBottom` < 80px 阈值)、provider bar 点击切换、未配 provider 空状态引导、删死 class
|
||
- **B 路线(规划式多智能体)单独立项**:填 `coordinator.rs` + `conditions.rs` 空壳,详见 memory `aichat-decision-capability`
|
||
|
||
**B. 技能联想功能需求(本轮重点,未实现,需求阶段)**:
|
||
- **需求**:aichat 输入框输入 `/` → 联想列出本机 Claude 技能(SKILL.md),按输入过滤,选中插入 `/name`;发送时后端读 SKILL.md 全文注入 system prompt / context
|
||
- **首批数据源 = Claude 3 类**(SKILL.md frontmatter 统一 `name` / `description` / `user_invocable` / `metadata.argument-hint` / `triggers[]`,只取 `user_invocable: true`):
|
||
1. Claude skills:`~/.claude/skills/*/SKILL.md`(23 个:sleep / mission-control / idea / cpa 等)
|
||
2. Claude commands:`~/.claude/commands/*.md`(1 个:idea)
|
||
3. Claude plugins:`~/.claude/plugins/marketplaces/**/skills/*/SKILL.md`(caveman 全家、官方 frontend-design / skill-creator / mcp-server-dev、wuming prompt-optimizer;`cache/` 与 `marketplaces/` 重复需按 path 去重)
|
||
- 加项目级 `.claude/skills` + `.claude/commands`(DevFlow 暂无)
|
||
- **实现要点**:① 后端新 IPC `list_skills()` 扫 Claude 3 类来源解析 frontmatter + 按 path 去重,返回 `[{name, description, argument_hint, triggers, source}]`;② 前端输入框 `/` 触发联想浮层(名称 + description);③ `/name` 发送 → 后端读 SKILL.md 注入 context;④ 跨平台 home 路径(dirs crate)
|
||
|
||
**C. 多工具 skill 体系调研结论(仅记录,后续按需扩展)**:
|
||
| 工具 | 本机状态 | skill 机制 | 是否纳入 |
|
||
|------|---------|-----------|---------|
|
||
| Claude Code | ✅ 已装 | SKILL.md(skills + commands + plugins 三类) | ✅ 首批数据源 |
|
||
| Codex (OpenAI) | ✅ 已装 | SKILL.md(`~/.codex/vendor_imports/skills/skills/.curated/*/SKILL.md`,39 个:figma / notion / playwright / security / vercel·netlify·render-deploy / latex 等;frontmatter 与 Claude 一致,可统一解析) | ⏳ 后续可扩展 |
|
||
| openclaw | ✅ 已装 | 多 agent gateway(`~/.openclaw/openclaw.json` 注册 8 agent 绑各 workspace + glm-5,经飞书 channel binding),非 SKILL.md;`agents/` 实体目录暂空 | ❌ 属 agent 选择层,非 skill 联想,暂不纳入 |
|
||
| opencode | ❌ 未装 | AGENTS.md + custom agents + slash commands(机制待确认) | ⏳ 待装后调研 |
|
||
|
||
**代码变更**:A 路线 — `crates/df-ai/src/{anthropic_compat.rs, lib.rs}`、`src-tauri/src/commands/ai.rs`、`crates/df-nodes/src/ai_node.rs`、`src/views/Settings.vue`、`src/stores/ai.ts`、`src/components/AiChat.vue`、`src/api/types.ts`
|
||
|
||
**遗留问题 / 下一步**:
|
||
1. **技能联想(B)未实现** — 需求已记,首批聚焦 Claude 3 类,等排期(工作量中:后端扫文件 + IPC、前端联想浮层)
|
||
2. **A 路线剩余场景实测**:切对话不中断(场景 2/3)、错误友好化(场景 4)待用户实测
|
||
3. **B 路线(规划式能力)**:coordinator / conditions 空壳,单独立项
|
||
|
||
<!--
|
||
|
||
### [Sprint N] YYYY-MM-DD — 简述
|
||
|
||
**工作内容**:
|
||
- 具体做了什么
|
||
|
||
**代码变更**:
|
||
- 修改了哪些文件/Crate
|
||
|
||
**遗留问题**:
|
||
- 1. ...
|
||
|
||
**下一步**:
|
||
- 1. ...
|
||
|
||
-->
|
||
|
||
---
|
||
|
||
## 七、开发约定
|
||
|
||
### 构建命令
|
||
|
||
```bash
|
||
# Rust 检查
|
||
cd E:/wk-lab/devflow && cargo check
|
||
|
||
# 前端开发
|
||
cd E:/wk-lab/devflow && bun run dev
|
||
|
||
# Tauri 开发(必须用这个,不能 cargo build)
|
||
cd E:/wk-lab/devflow && bun run tauri dev
|
||
|
||
# Tauri 构建
|
||
cd E:/wk-lab/devflow && bun run tauri build
|
||
```
|
||
|
||
### 关键设计决策
|
||
|
||
1. **引擎不绑定业务** — Workflow Engine 只做 DAG 执行,阶段是插件
|
||
2. **无 panic** — 所有占位代码返回空/默认值,不使用 `todo!`/`unimplemented!`
|
||
3. **本地优先** — SQLite 嵌入,不依赖云服务
|
||
4. **想法第一公民** — 想法池独立于项目
|
||
5. **多任务/分支并行** — 同一项目多任务各绑 Git 分支
|
||
|
||
### 复用资源
|
||
|
||
| 资源 | 路径 | 复用点 |
|
||
|------|------|--------|
|
||
| u-desk-rust Tauri 经验 | `E:/wk-lab/u-desk-rust/` | Workspace + crate 拆分 + Tauri v2 |
|
||
| Rust proxy 工具链 | `E:/wk-oth/rust-work/` | 连接管理,内嵌调用 |
|
||
| Tauri 开发铁律 | Memory: `feedback_tauri_dev_rules` | 必须用 `cargo tauri dev/build` |
|