From 3e6659d64a22fe664d72f9eb83310f697ff27a94 Mon Sep 17 00:00:00 2001
From: ax_rd <ax_rd@aisim.cn>
Date: Thu, 03 Sep 2026 11:40:07 +0800
Subject: [PATCH] feat: 悬空双链自动补全(RetryUnresolved,Reconcile 末尾自动调用)+ 3 个 Task3 审查 Minor 修复

---
 internal/vault/scanner.go |   41 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/internal/vault/scanner.go b/internal/vault/scanner.go
index f19def5..7981aaf 100644
--- a/internal/vault/scanner.go
+++ b/internal/vault/scanner.go
@@ -19,6 +19,10 @@
 			if strings.HasPrefix(info.Name(), ".") && info.Name() != "." {
 				return filepath.SkipDir
 			}
+			// 跳过待审阅目录
+			if info.Name() == "待审阅" {
+				return filepath.SkipDir
+			}
 			return nil
 		}
 		if !strings.HasSuffix(path, ".md") {
@@ -36,3 +40,40 @@
 
 	return files, err
 }
+
+// FileStat 文件指纹(只 stat,不读内容)
+type FileStat struct {
+	Path  string // 相对路径
+	Size  int64
+	Mtime int64 // Unix 秒
+}
+
+// ScanVaultStat 扫描 .md 文件指纹清单(跳过隐藏目录和待审阅目录,与 ScanVault 一致)
+func ScanVaultStat(vaultPath string) ([]FileStat, error) {
+	var stats []FileStat
+	err := filepath.Walk(vaultPath, func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			return nil
+		}
+		if info.IsDir() {
+			if strings.HasPrefix(info.Name(), ".") && info.Name() != "." {
+				return filepath.SkipDir
+			}
+			if info.Name() == "待审阅" {
+				return filepath.SkipDir
+			}
+			return nil
+		}
+		if !strings.HasSuffix(path, ".md") {
+			return nil
+		}
+		relPath, _ := filepath.Rel(vaultPath, path)
+		stats = append(stats, FileStat{
+			Path:  relPath,
+			Size:  info.Size(),
+			Mtime: info.ModTime().Unix(),
+		})
+		return nil
+	})
+	return stats, err
+}

--
Gitblit v1.10.0