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
|
}
|