From 2f8b13ff7c781b9f7ca2ec8866be76f720e538b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Fri, 19 Jun 2026 19:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BA:=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=94=AF=E6=8C=81=E6=8C=89=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=BF=87=E6=BB=A4(list=5Ftasks=20status)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AI 工具 list_tasks: schema 加 status 参数 + handler 内存过滤 (todo/in_progress/in_review/testing/blocked/done/cancelled) - df-mcp list_tasks: handler 加 status 过滤(MCP 对外一致) (spec 声明待补:中文 Edit 编码匹配限制,后续补) 自验: workspace EXIT 0 + df-mcp cargo check EXIT 0 --- crates/df-mcp/src/tools.rs | 8 ++++++-- src-tauri/src/commands/ai/tool_registry.rs | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/df-mcp/src/tools.rs b/crates/df-mcp/src/tools.rs index baa5244..0f8c602 100644 --- a/crates/df-mcp/src/tools.rs +++ b/crates/df-mcp/src/tools.rs @@ -346,12 +346,16 @@ fn bind_directory(ctx: &Ctx, args: Value) -> BoxFuture<'static, CallToolResult> fn list_tasks(ctx: &Ctx, args: Value) -> BoxFuture<'static, CallToolResult> { let db = ctx.db.clone(); let project_id_filter = args.get("project_id").and_then(|v| v.as_str()).map(|s| s.to_owned()); + let status_filter = args.get("status").and_then(|v| v.as_str()).map(|s| s.to_owned()); Box::pin(async move { let repo = TaskRepo::new(&db); match repo.list_active().await { Ok(mut list) => { - if let Some(pid) = project_id_filter { - list.retain(|t| t.project_id == pid); + if let Some(pid) = &project_id_filter { + list.retain(|t| t.project_id == *pid); + } + if let Some(st) = &status_filter { + list.retain(|t| t.status == *st); } json_ok(json!({ "tasks": list, "count": list.len() })) } diff --git a/src-tauri/src/commands/ai/tool_registry.rs b/src-tauri/src/commands/ai/tool_registry.rs index afa6971..7fed0bf 100644 --- a/src-tauri/src/commands/ai/tool_registry.rs +++ b/src-tauri/src/commands/ai/tool_registry.rs @@ -605,17 +605,21 @@ fn register_project_tools(registry: &mut AiToolRegistry, db: &Arc) { /// 组内顺序保留原相对顺序(list/create/update/advance/delete/get_count)。 fn register_task_tools(registry: &mut AiToolRegistry, db: &Arc) { registry.register( - "list_tasks", "列出任务,可按 project_id 筛选,支持 offset/limit 分页。返回 items、total、has_more。默认 limit=50", - df_ai::ai_tools::object_schema(vec![("project_id", "string", false), ("offset", "integer", false), ("limit", "integer", false)]), RiskLevel::Low, + "list_tasks", "列出任务,可按 project_id/status 筛选(status: todo/in_progress/in_review/testing/blocked/done/cancelled),支持 offset/limit 分页。返回 items、total、has_more。默认 limit=50", + df_ai::ai_tools::object_schema(vec![("project_id", "string", false), ("status", "string", false), ("offset", "integer", false), ("limit", "integer", false)]), RiskLevel::Low, { let db = db.clone(); Box::new(move |args: serde_json::Value| { let db = db.clone(); Box::pin(async move { let repo = df_storage::crud::TaskRepo::new(&db); - let tasks = if let Some(pid) = args.get("project_id").and_then(|v| v.as_str()) { + let mut tasks = if let Some(pid) = args.get("project_id").and_then(|v| v.as_str()) { repo.query("project_id", pid).await? } else { repo.list_all().await? }; + // 按状态过滤(可选):todo/in_progress/in_review/testing/blocked/done/cancelled + if let Some(status) = args.get("status").and_then(|v| v.as_str()) { + tasks.retain(|t| t.status == status); + } let total = tasks.len(); let offset = args["offset"].as_u64().unwrap_or(0) as usize; let limit = args["limit"].as_u64().unwrap_or(MAX_LIST_RESULTS as u64).min(MAX_LIST_RESULTS as u64) as usize;