From ec01248346a93a9ca13f86970998e239c62132e4 Mon Sep 17 00:00:00 2001
From: ai_xiaopei <xiaopei@aisim.cn>
Date: Thu, 03 Sep 2026 14:15:59 +0800
Subject: [PATCH] feat(draft): draft list 支持按一级目录过滤,Type 改从路径提取

---
 cmd/draft.go             |   34 ++++++++++++++++++++++++++++++----
 cmd/review.go            |    2 +-
 internal/draft/intake.go |   20 ++++++++++++++------
 3 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/cmd/draft.go b/cmd/draft.go
index 4341371..7de4840 100644
--- a/cmd/draft.go
+++ b/cmd/draft.go
@@ -28,10 +28,11 @@
 }
 
 var draftListCmd = &cobra.Command{
-	Use:   "list",
+	Use:   "list [一级目录名]",
 	Short: "列出所有活跃草稿",
 	Long: `# draft list - 列出所有活跃草稿
-kb-cli draft list [--json] # 列出待审阅区的所有草稿(目录结构 + 老格式单文件)`,
+kb-cli draft list [--json] # 列出待审阅区的所有草稿(目录结构 + 老格式单文件)
+kb-cli draft list TAPD提取 # 只列出指定一级目录下的草稿`,
 	RunE: runDraftList,
 }
 
@@ -150,6 +151,12 @@
 
 // runDraftList 列出所有活跃草稿
 func runDraftList(cmd *cobra.Command, args []string) error {
+	// 可选参数:指定一级目录过滤
+	filterType := ""
+	if len(args) > 0 {
+		filterType = args[0]
+	}
+
 	// 创建草稿录入器
 	intake := draft.NewIntake(vaultPath, nil)
 
@@ -159,6 +166,17 @@
 		return fmt.Errorf("列出草稿失败: %w", err)
 	}
 
+	// 按一级目录过滤
+	if filterType != "" {
+		var filtered []draft.DraftInfo
+		for _, d := range drafts {
+			if d.Type == filterType {
+				filtered = append(filtered, d)
+			}
+		}
+		drafts = filtered
+	}
+
 	if draftJSON {
 		// JSON 输出
 		output := struct {
@@ -175,11 +193,19 @@
 
 	// 表格输出
 	if len(drafts) == 0 {
-		fmt.Println("没有活跃草稿")
+		if filterType != "" {
+			fmt.Printf("没有找到类型为 '%s' 的活跃草稿\n", filterType)
+		} else {
+			fmt.Println("没有活跃草稿")
+		}
 		return nil
 	}
 
-	fmt.Printf("找到 %d 个活跃草稿:\n\n", len(drafts))
+	if filterType != "" {
+		fmt.Printf("找到 %d 个类型为 '%s' 的活跃草稿:\n\n", len(drafts), filterType)
+	} else {
+		fmt.Printf("找到 %d 个活跃草稿:\n\n", len(drafts))
+	}
 	for _, d := range drafts {
 		mergeStatus := "❌"
 		if d.HasMergeHint {
diff --git a/cmd/review.go b/cmd/review.go
index a84025b..bdc0561 100644
--- a/cmd/review.go
+++ b/cmd/review.go
@@ -74,7 +74,7 @@
 		if err == nil {
 			content := extractMainContent(string(draftContent))
 			if content != "" {
-				fmt.Println("### 草稿主要内容\n")
+				fmt.Println("### 草稿主要内容")
 				fmt.Println(content)
 			}
 		}
diff --git a/internal/draft/intake.go b/internal/draft/intake.go
index 0f4c36f..8e90449 100644
--- a/internal/draft/intake.go
+++ b/internal/draft/intake.go
@@ -654,6 +654,13 @@
 				HasMergeHint: hasMerge,
 			}
 
+			// 从路径提取一级目录名作为 Type
+			// 路径格式:待审阅/TAPD提取/003-xxx/draft.md
+			parts := strings.Split(relPath, string(filepath.Separator))
+			if len(parts) >= 2 && parts[0] == "待审阅" {
+				draft.Type = parts[1]
+			}
+
 			// 解析 frontmatter
 			fm := parseFrontmatter(string(content))
 			if title, ok := fm["title"]; ok {
@@ -662,9 +669,6 @@
 			if status, ok := fm["status"]; ok {
 				draft.Status = status
 			}
-			if draftType, ok := fm["type"]; ok {
-				draft.Type = draftType
-			}
 			if created, ok := fm["created"]; ok {
 				draft.Created = created
 			}
@@ -690,6 +694,13 @@
 					HasMergeHint: false,
 				}
 
+				// 从路径提取一级目录名作为 Type
+				// 路径格式:待审阅/TAPD提取/003-xxx.md
+				parts := strings.Split(relPath, string(filepath.Separator))
+				if len(parts) >= 2 && parts[0] == "待审阅" {
+					draft.Type = parts[1]
+				}
+
 				// 解析 frontmatter
 				fm := parseFrontmatter(string(content))
 				if title, ok := fm["title"]; ok {
@@ -698,9 +709,6 @@
 				if status, ok := fm["status"]; ok {
 					draft.Status = status
 				}
-				if draftType, ok := fm["type"]; ok {
-					draft.Type = draftType
-				}
 				if created, ok := fm["created"]; ok {
 					draft.Created = created
 				}

--
Gitblit v1.10.0