package cmd import ( "fmt" "github.com/aisim/kb-cli/internal/classify" "github.com/spf13/cobra" ) var reorgCmd = &cobra.Command{ Use: "reorg", Short: "根据分类结果重组知识库目录", Long: `# reorg - 目录重组 kb-cli reorg [--plan <文件>] [--dry-run] [--execute] # 根据分类结果重组知识库目录`, RunE: runReorg, } var ( reorgPlan string reorgDryRun bool reorgExecute bool ) func init() { rootCmd.AddCommand(reorgCmd) reorgCmd.Flags().StringVar(&reorgPlan, "plan", "classification.json", "分类结果文件") reorgCmd.Flags().BoolVar(&reorgDryRun, "dry-run", false, "仅生成迁移计划,不执行移动") reorgCmd.Flags().BoolVar(&reorgExecute, "execute", false, "执行迁移(需要明确确认)") } func runReorg(cmd *cobra.Command, args []string) error { vaultPath := cmd.Flag("vault").Value.String() fmt.Println("步骤 1/3: 读取分类结果...") classification, err := classify.LoadClassification(vaultPath, reorgPlan) if err != nil { return fmt.Errorf("读取分类结果失败: %w", err) } fmt.Printf("✓ 读取 %d 个文档分类\n", len(classification.Items)) fmt.Println("\n步骤 2/3: 生成迁移计划...") plan, err := classify.GenerateMigrationPlan(vaultPath, classification) if err != nil { return fmt.Errorf("生成迁移计划失败: %w", err) } if err := classify.SaveMigrationPlan(vaultPath, plan); err != nil { return fmt.Errorf("保存迁移计划失败: %w", err) } fmt.Printf("✓ 已生成 migration-plan.json(%d 个文件)\n", len(plan.Migrations)) if reorgDryRun { fmt.Println("\n[DRY-RUN] 迁移计划已生成,未执行移动") fmt.Println("使用 --execute 执行迁移") return nil } if !reorgExecute { fmt.Println("\n警告: 未指定 --execute,迁移未执行") fmt.Println("请检查 migration-plan.json,然后使用 --execute 执行") return nil } fmt.Println("\n步骤 3/3: 执行迁移...") if err := classify.ExecuteMigration(vaultPath, plan); err != nil { return fmt.Errorf("执行迁移失败: %w", err) } fmt.Printf("✓ 迁移完成(%d 个文件)\n", len(plan.Migrations)) return nil }