feat(draft): draft list 支持按一级目录过滤,Type 改从路径提取
| | |
| | | } |
| | | |
| | | 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, |
| | | } |
| | | |
| | |
| | | |
| | | // runDraftList 列出所有活跃草稿 |
| | | func runDraftList(cmd *cobra.Command, args []string) error { |
| | | // 可选参数:指定一级目录过滤 |
| | | filterType := "" |
| | | if len(args) > 0 { |
| | | filterType = args[0] |
| | | } |
| | | |
| | | // 创建草稿录入器 |
| | | intake := draft.NewIntake(vaultPath, nil) |
| | | |
| | |
| | | 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 { |
| | |
| | | |
| | | // 表格输出 |
| | | 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 { |
| | |
| | | if err == nil { |
| | | content := extractMainContent(string(draftContent)) |
| | | if content != "" { |
| | | fmt.Println("### 草稿主要内容\n") |
| | | fmt.Println("### 草稿主要内容") |
| | | fmt.Println(content) |
| | | } |
| | | } |
| | |
| | | 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 { |
| | |
| | | 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 |
| | | } |
| | |
| | | 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 { |
| | |
| | | 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 |
| | | } |