ai_xiaopei
2 days ago ec01248346a93a9ca13f86970998e239c62132e4
feat(draft): draft list 支持按一级目录过滤,Type 改从路径提取
3 files modified
56 ■■■■ changed files
cmd/draft.go 34 ●●●● patch | view | raw | blame | history
cmd/review.go 2 ●●● patch | view | raw | blame | history
internal/draft/intake.go 20 ●●●● patch | view | raw | blame | history
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 {
cmd/review.go
@@ -74,7 +74,7 @@
        if err == nil {
            content := extractMainContent(string(draftContent))
            if content != "" {
                fmt.Println("### 草稿主要内容\n")
                fmt.Println("### 草稿主要内容")
                fmt.Println(content)
            }
        }
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
                }