From ac966af3d126d59081d119e05ba02f946257f669 Mon Sep 17 00:00:00 2001
From: ai_xiaopei <xiaopei@aisim.cn>
Date: Sun, 26 Jul 2026 23:22:36 +0800
Subject: [PATCH] fix: 移除所有help中的等号格式

---
 cmd/draft.go |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 119 insertions(+), 0 deletions(-)

diff --git a/cmd/draft.go b/cmd/draft.go
new file mode 100644
index 0000000..f16da92
--- /dev/null
+++ b/cmd/draft.go
@@ -0,0 +1,119 @@
+package cmd
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/aisim/kb-cli/internal/draft"
+	"github.com/aisim/kb-cli/internal/index"
+	"github.com/spf13/cobra"
+)
+
+var draftCmd = &cobra.Command{
+	Use:   "draft",
+	Short: "草稿管理",
+	Long:  `kb-cli draft create # 创建草稿(AI 生成 tags + 合并指示)`,
+}
+
+var draftCreateCmd = &cobra.Command{
+	Use:   "create",
+	Short: "创建草稿",
+	Long:  `# draft create - 创建草稿
+kb-cli draft create --type <类型> --title <标题> --content-file <文件> [--source <来源>] [--force] # 创建草稿,自动提取 tags 并生成合并指示`,
+	RunE: runDraftCreate,
+}
+
+var tagsCmd = &cobra.Command{
+	Use:   "tags",
+	Short: "标签管理",
+	Long:  `kb-cli tags rebuild # 批量重建现有文档的 tags`,
+}
+
+var tagsRebuildCmd = &cobra.Command{
+	Use:   "rebuild",
+	Short: "批量重建 tags",
+	Long:  `# tags rebuild - 批量重建 tags
+kb-cli tags rebuild [--vault <路径>] [--limit <数量>] [--dry-run] # 使用 LLM 重新提取现有文档的 tags`,
+	RunE: runTagsRebuild,
+}
+
+var (
+	draftType       string
+	draftTitle      string
+	draftContentFile string
+	draftSource     string
+	draftForce      bool
+	tagsLimit       int
+	tagsDryRun      bool
+)
+
+func init() {
+	// draft create 命令
+	draftCreateCmd.Flags().StringVar(&draftType, "type", "", "草稿类型(售后/产品/运营/行业/TAPD)")
+	draftCreateCmd.Flags().StringVar(&draftTitle, "title", "", "草稿标题")
+	draftCreateCmd.Flags().StringVar(&draftContentFile, "content-file", "", "草稿内容文件路径")
+	draftCreateCmd.Flags().StringVar(&draftSource, "source", "", "来源标识")
+	draftCreateCmd.Flags().BoolVar(&draftForce, "force", false, "强制创建(跳过重复检查)")
+	draftCreateCmd.MarkFlagRequired("type")
+	draftCreateCmd.MarkFlagRequired("title")
+	draftCreateCmd.MarkFlagRequired("content-file")
+
+	draftCmd.AddCommand(draftCreateCmd)
+
+	// tags rebuild 命令
+	tagsRebuildCmd.Flags().IntVar(&tagsLimit, "limit", 0, "限制处理文档数量(0=全部)")
+	tagsRebuildCmd.Flags().BoolVar(&tagsDryRun, "dry-run", false, "仅预览,不实际更新")
+
+	tagsCmd.AddCommand(tagsRebuildCmd)
+
+	rootCmd.AddCommand(draftCmd)
+	rootCmd.AddCommand(tagsCmd)
+}
+
+func runDraftCreate(cmd *cobra.Command, args []string) error {
+	// 读取内容文件
+	content, err := os.ReadFile(draftContentFile)
+	if err != nil {
+		return fmt.Errorf("读取内容文件失败: %w", err)
+	}
+
+	if len(content) == 0 {
+		return fmt.Errorf("内容文件为空")
+	}
+
+	// 打开索引
+	store, err := index.Open(dbPath)
+	if err != nil {
+		return fmt.Errorf("打开索引失败: %w", err)
+	}
+	defer store.Close()
+
+	// 创建草稿录入器
+	intake := draft.NewIntake(vaultPath, store)
+
+	// 创建草稿
+	if err := intake.CreateDraft(draftType, draftTitle, string(content), draftSource, draftForce); err != nil {
+		return fmt.Errorf("创建草稿失败: %w", err)
+	}
+
+	return nil
+}
+
+func runTagsRebuild(cmd *cobra.Command, args []string) error {
+	// 打开索引
+	store, err := index.Open(dbPath)
+	if err != nil {
+		return fmt.Errorf("打开索引失败: %w", err)
+	}
+	defer store.Close()
+
+	// 创建草稿录入器
+	intake := draft.NewIntake(vaultPath, store)
+
+	// 重建 tags
+	if err := intake.RebuildTags(tagsLimit, tagsDryRun); err != nil {
+		return fmt.Errorf("重建 tags 失败: %w", err)
+	}
+
+	return nil
+}

--
Gitblit v1.9.1