ai_xiaopei
9 days ago ac966af3d126d59081d119e05ba02f946257f669
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
}