package cmd import ( "fmt" "os" "time" "github.com/aisim/kb-cli/internal/graph" "github.com/aisim/kb-cli/internal/index" "github.com/aisim/kb-cli/internal/vault" ) // rebuildIndex 重建索引:扫描 vault → 构建图 → 写入 SQLite func rebuildIndex(store *index.Store, commit string) error { // 清空旧数据 if err := store.ClearData(); err != nil { return fmt.Errorf("清空数据失败: %w", err) } // 扫描 vault files, err := vault.ScanVault(vaultPath) if err != nil { return fmt.Errorf("扫描知识库失败: %w", err) } fmt.Fprintf(os.Stderr, "扫描到 %d 个文件\n", len(files)) // 构建图 g := graph.BuildGraph(files) // 写入节点 for _, n := range g.Nodes { if _, err := store.InsertNode(n); err != nil { return fmt.Errorf("插入节点失败 [%s]: %w", n.Path, err) } } // 写入边 for _, e := range g.Edges { if err := store.InsertEdge(e); err != nil { return fmt.Errorf("插入边失败: %w", err) } } // 创建并填充 FTS5 索引 if err := store.CreateFTS(); err != nil { return fmt.Errorf("创建 FTS 索引失败: %w", err) } if err := store.PopulateFTS(); err != nil { return fmt.Errorf("填充 FTS 索引失败: %w", err) } // 记录元信息 if commit != "" { if err := store.SetMeta("git_commit", commit); err != nil { return fmt.Errorf("记录 git commit 失败: %w", err) } } if err := store.SetMeta("built_at", time.Now().Format(time.RFC3339)); err != nil { return fmt.Errorf("记录构建时间失败: %w", err) } fmt.Fprintf(os.Stderr, "已索引 %d 个节点, %d 条边\n", len(g.Nodes), len(g.Edges)) return nil }