From 60eb89c12ee0661785395bff90940204b16dcb3a Mon Sep 17 00:00:00 2001
From: ax_rd <ax_rd@aisim.cn>
Date: Thu, 03 Sep 2026 13:21:39 +0800
Subject: [PATCH] docs: e2e 验证脚本 + README 更新(增量同步/explore/构建要求)

---
 cmd/index.go |   43 +++++++++++++++++++++++++++++--------------
 1 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/cmd/index.go b/cmd/index.go
index 14b808f..4678803 100644
--- a/cmd/index.go
+++ b/cmd/index.go
@@ -17,21 +17,27 @@
 	Short: "索引管理",
 }
 
+// forceRebuild index build 的 --force flag:全量重建索引
+var forceRebuild bool
+
 var indexBuildCmd = &cobra.Command{
 	Use:   "build",
 	Short: "构建或重建知识库索引",
+	Long:  `kb-cli index build [--vault <路径>] [--db <路径>] [--force] # 构建或重建知识库索引(默认增量对账,--force 全量重建)`,
 	RunE:  runIndexBuild,
 }
 
 var indexStatusCmd = &cobra.Command{
 	Use:   "status",
 	Short: "查看索引状态信息",
+	Long:  `kb-cli index status [--vault <路径>] [--db <路径>] # 查看索引状态(节点数、边数、commit、构建时间)`,
 	RunE:  runIndexStatus,
 }
 
 var indexGcCmd = &cobra.Command{
 	Use:   "gc",
 	Short: "清理孤立节点和边",
+	Long:  `kb-cli index gc [--vault <路径>] [--db <路径>] # 清理索引中文件已删除的孤立节点和边`,
 	RunE:  runIndexGc,
 }
 
@@ -43,6 +49,7 @@
 var gitSyncCmd = &cobra.Command{
 	Use:   "sync",
 	Short: "同步知识库到 Git 仓库",
+	Long:  `kb-cli git sync [--vault <路径>] # 执行 git add、commit、push 同步知识库`,
 	RunE:  runGitSync,
 }
 
@@ -51,6 +58,7 @@
 	indexCmd.AddCommand(indexBuildCmd)
 	indexCmd.AddCommand(indexStatusCmd)
 	indexCmd.AddCommand(indexGcCmd)
+	indexBuildCmd.Flags().BoolVar(&forceRebuild, "force", false, "全量重建索引(默认走增量对账)")
 	
 	rootCmd.AddCommand(gitCmd)
 	gitCmd.AddCommand(gitSyncCmd)
@@ -64,19 +72,26 @@
 	}
 	defer store.Close()
 
-	// 获取当前 commit
-	commit, err := index.GetGitCommit(vaultPath)
-	if err != nil {
-		fmt.Fprintln(os.Stderr, "警告: 无法获取 git commit:", err)
-		commit = ""
+	if forceRebuild {
+		// 全量重建
+		commit, err := index.GetGitCommit(vaultPath)
+		if err != nil {
+			fmt.Fprintln(os.Stderr, "警告: 无法获取 git commit:", err)
+			commit = ""
+		}
+		fmt.Fprintln(os.Stderr, "正在全量重建索引...")
+		if err := rebuildFull(store, commit); err != nil {
+			return fmt.Errorf("重建索引失败: %w", err)
+		}
+		fmt.Fprintln(os.Stderr, "索引重建完成")
+		return nil
 	}
 
-	fmt.Fprintln(os.Stderr, "正在重建索引...")
-	if err := rebuildIndex(store, commit); err != nil {
-		return fmt.Errorf("重建索引失败: %w", err)
+	// 默认走增量对账
+	if err := syncIndex(store); err != nil {
+		return fmt.Errorf("增量同步失败: %w", err)
 	}
-
-	fmt.Fprintln(os.Stderr, "索引重建完成")
+	fmt.Fprintln(os.Stderr, "索引同步完成")
 	return nil
 }
 
@@ -123,14 +138,14 @@
 	fmt.Printf("  当前 commit: %s\n", currentCommit)
 	fmt.Printf("  构建时间: %s\n", builtAt)
 
-	// 检查是否需要更新
-	needsRebuild, _, err := index.NeedsRebuild(store, vaultPath)
+	// 检查是否有变更(stat 快速比对)
+	dirty, err := index.QuickCheck(store, vaultPath)
 	if err != nil {
 		return fmt.Errorf("检查索引状态失败: %w", err)
 	}
 
-	if needsRebuild {
-		fmt.Printf("  状态: 需要更新\n")
+	if dirty {
+		fmt.Printf("  状态: 有变更\n")
 	} else {
 		fmt.Printf("  状态: 最新\n")
 	}

--
Gitblit v1.10.0