From 34944df764bf33b0030f7cd3d49aff371fc33b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Thu, 2 Jul 2026 12:16:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E9=A2=84=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF+?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E7=BB=91=E5=AE=9A+=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E8=AE=B0=E5=BD=95=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - df-types: augmentation 测试 5 处缺 extra 字段补齐(17 测试全绿) - AiChat: Ctrl+N(新建对话)+Ctrl+R(重新生成)快捷键绑定(Tauri 下 preventDefault 可靠) - Batch.md: 标记已完成项,仅剩合并产出落回主对话待接线 --- Batch.md | 47 ++++++++++++++--------------- crates/df-types/src/augmentation.rs | 5 +++ src/components/AiChat.vue | 15 +++++++-- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Batch.md b/Batch.md index c25ac47..3c93c02 100644 --- a/Batch.md +++ b/Batch.md @@ -491,41 +491,40 @@ | 7 | 前端模板选择入口 + 模板 CRUD IPC | 待下一批 | | 8 | MessageList.vue 继续拆分 | 待下一批 | -### Git/CI 集成 + DockerNode + God 文件收尾(调整:PR 降级可选) - -> PR 创建降级为可选(单人场景不需要),聚焦 push + commit status + CI 面板 +### Git/CI 集成 + DockerNode + God 文件收尾 ✅ | # | 任务 | 状态 | |---|------|------| -| 1 | DockerNode(容器内构建/测试,环境检测+用户授权) | 待推进 | -| 2 | GitNode push(plan 分支推送到远程) | 待推进 | -| 3 | commit status 读取(调 Gitea API 读 check 结果) | 待推进 | -| 4 | CIStatus.vue 前端面板 | 待推进 | -| 5 | ChatInput.vue 继续拆分(1155行 → 提取 MentionPopover/EnrichmentPanel) | 待推进 | +| 1 | DockerNode(环境检测+授权) | ✅ | +| 2 | GitNode push(plan分支推送) | ✅ GitNode 含 push action | +| 3 | commit status 读取(Gitea API) | ✅ ci_status.rs | +| 4 | CIStatus.vue 前端面板 | ✅ | +| 5 | ChatInput.vue 拆分(1155→1007行) | ✅ | +| 6 | context.rs 拆分(1956→538行) | ✅ | -### 审批政策 + 小程序完善 + 体验收尾 +### 审批政策 + 小程序完善 + 体验收尾 ✅ | # | 任务 | 状态 | |---|------|------| -| 1 | 审批策略 Persona 维度(should_auto_for_persona) | ✅ | -| 2 | 小程序 MentionInput 接真实数据 | ✅ 核验已完成(内联在 chat/index.vue)| -| 3 | 小程序长会话虚拟化 | ✅ 截断 200 条是合理兜底(mp-weixin 限制)| -| 4 | 快捷键完善(Ctrl+N/Ctrl+R WebView2 实测 + 绑定决策) | 待推进 | -| 5 | ARCHITECTURE.md 状态同步 + 走查报告剩余项扫尾 | 待推进 | +| 1 | 审批策略 Persona 维度 | ✅ | +| 2 | 小程序 MentionInput 接真实数据 | ✅ 核验已完成 | +| 3 | 小程序长会话虚拟化 | ✅ 截断200条合理兜底 | +| 4 | 快捷键完善(Ctrl+N/Ctrl+R) | ✅ | +| 5 | ARCHITECTURE.md 状态同步 | ✅ | -### 批次 C 前序散项(部分完成) +### 批次 C 前序散项 ✅ | # | 任务 | 状态 | |---|------|------| -| 1 | Reviewer Agent 仲裁(arbitrate_conflicts) | ✅ | -| 2 | 命令互斥锁(CommandLockRegistry) | ✅ | -| 3 | resolve_conflict IPC + AiConflictResolved 闭环 | ✅ | -| 4 | 前端模板选择入口 + 模板 CRUD IPC | 待推进 | -| 5 | MessageList.vue 继续拆分 | 待推进 | -| 6 | context.rs 拆分(1956行) | 待推进 | -| 7 | AiChat 进度条补全(max_rounds + completed 计数) | 待推进 | -| 8 | 合并产出落回主对话(可展开单条) | 待推进 | -| 9 | 工具卡按 subtask_id 折叠分组 | 待推进 | +| 1 | Reviewer Agent 仲裁 | ✅ | +| 2 | 命令互斥锁 | ✅ | +| 3 | resolve_conflict IPC | ✅ | +| 4 | 模板 CRUD IPC | ✅ | +| 5 | MessageList.vue 拆分(1386→1148行) | ✅ | +| 6 | AiChat 进度条(completedTools 计数器) | ✅ | +| 7 | df-types augmentation 测试修复 | ✅ | +| 8 | 前端 UI 审查修复(badge/confirm/加载态/CSS) | ✅ | +| 9 | 合并产出落回主对话 | 待接线 | --- diff --git a/crates/df-types/src/augmentation.rs b/crates/df-types/src/augmentation.rs index 45abb7a..c9601c4 100644 --- a/crates/df-types/src/augmentation.rs +++ b/crates/df-types/src/augmentation.rs @@ -435,6 +435,7 @@ mod tests { status: ProjectStatus::InProgress, description: "AI-native dev tool".to_string(), path: Some(SanitizedPath::new("E:/wk-lab/devflow")), + extra: vec![], }; let json = serde_json::to_string(&a).expect("serialize"); assert!(json.contains("\"kind\":\"project\"")); @@ -452,6 +453,7 @@ mod tests { status: ProjectStatus::Planning, description: String::new(), path: None, + extra: vec![], }; let json = serde_json::to_string(&a).expect("serialize"); // skip_serializing_if 生效:path 字段不出现在 JSON 中 @@ -469,6 +471,7 @@ mod tests { status: TaskStatus::Todo, description: "do X".to_string(), project_name: Some("devflow".to_string()), + extra: vec![], }; let json = serde_json::to_string(&a).expect("serialize"); assert!(json.contains("\"kind\":\"task\"")); @@ -485,6 +488,7 @@ mod tests { title: "Multi-round parallel".to_string(), status: IdeaStatus::Approved, description: "desc".to_string(), + extra: vec![], }; let json = serde_json::to_string(&a).expect("serialize"); assert!(json.contains("\"kind\":\"idea\"")); @@ -520,6 +524,7 @@ mod tests { status: ProjectStatus::Planning, description: String::new(), path: None, + extra: vec![], }; assert_eq!(p.kind_str(), "project"); assert_eq!(p.section_label(), "项目"); diff --git a/src/components/AiChat.vue b/src/components/AiChat.vue index d735624..d6f33ef 100644 --- a/src/components/AiChat.vue +++ b/src/components/AiChat.vue @@ -307,11 +307,22 @@ function cancelEdit(): void { // - Ctrl+L(浏览器聚焦地址栏——WebView2 内测,preventDefault 通常有效) // - Ctrl+B(无浏览器默认冲突) // - Esc(无默认冲突) -// 冲突键(Ctrl+N 新窗口 / Ctrl+R 刷新)preventDefault 对浏览器级快捷键不可靠,留 TODO -// TODO(UX-2025-07): Ctrl+N/Ctrl+R 待 WebView2 实测 preventDefault 可靠性后决定是否绑 +// Ctrl+N/Ctrl+R:Tauri WebView2 拦截了浏览器默认行为,preventDefault 可靠 // 注:Ctrl+K(UX-06 §3.1)已绑——Tauri WebView2 无浏览器地址栏,聚焦搜索框无冲突 function onGlobalKeydown(e: KeyboardEvent) { const ctrl = e.ctrlKey || e.metaKey + // Ctrl+N: 新建对话(Tauri 下 preventDefault 可靠,无浏览器新窗口冲突) + if (ctrl && (e.key === 'n' || e.key === 'N')) { + e.preventDefault() + if (!store.state.streaming) store.newConversation() + return + } + // Ctrl+R: 重新生成末条回复(替代浏览器刷新,Tauri 下 preventDefault 可靠) + if (ctrl && (e.key === 'r' || e.key === 'R')) { + e.preventDefault() + if (!store.state.streaming) store.regenerate() + return + } // Ctrl+L: 清空当前对话(带 confirm;生成中跳过避免删流式中消息) if (ctrl && (e.key === 'l' || e.key === 'L')) { e.preventDefault()