fix: 0.9.1 快照收尾修复与稳健性增强 - 快照目录对归一化匹配(Windows同目录异写不误拦、与scanCacheStore同款逻辑双向同步)、截断结果保存快照拦截提示(防对照新文件误报)、folder:scan IPC校验抽scanIpc纯逻辑模块单测全覆盖(缓存源选择惰性读盘)、对照模式导出报告附变迁对照表(三格式当前/基线状态与大小、标签收敛SNAPSHOT_CHANGE_LABEL共享映射、E2E对照导出写盘断言)、顶层ErrorBoundary渲染兜底(错误面板一键重载防白屏)、文档四件套同步

This commit is contained in:
2026-08-19 09:20:28 +08:00
parent 35fa81df9d
commit 38512d7882
19 changed files with 571 additions and 73 deletions
+6 -22
View File
@@ -6,7 +6,7 @@ import fs from 'fs'
import { parseState, clampBounds, type AppState } from './windowState'
import { decodeText, type DecodeResult } from './decode'
import { scanFolders, SEMANTIC_MAX_BYTES, type ScanCacheEntry } from './folderScan'
import { isIgnoreRulesArray } from './ignoreRules'
import { resolveScanArgs } from './scanIpc'
import {
parseScanCacheStore,
putScanCache,
@@ -313,28 +313,12 @@ ipcMain.handle(
ignoreRules?: unknown
) => {
try {
// 增量缓存防御性校验:仅接受数组形态(渲染端从上次扫描结果携带,损坏即不沿用
const cache =
Array.isArray(previous) && previous.every(
(c) =>
typeof c === 'object' &&
c !== null &&
typeof (c as ScanCacheEntry).rel === 'string' &&
typeof (c as ScanCacheEntry).status === 'string'
)
? (previous as ScanCacheEntry[])
: undefined
// 渲染端未携带内存缓存时(跨会话首次扫描),尝试注入 userData 落盘的持久化缓存
let prev = cache
if (prev === undefined) {
const stored = getScanCache(loadScanCacheStore(), leftDir, rightDir)
if (stored !== null && stored.length > 0) prev = stored
}
// 忽略规则防御性校验:仅接受字符串数组形态(渲染端从偏好携带,损坏即忽略)
const ignore = isIgnoreRulesArray(ignoreRules) ? ignoreRules : undefined
// 入参防御性校验与增量缓存源选择(内存缓存优先,未携带/非法回退 userData 落盘缓存,惰性读盘
const args = resolveScanArgs(previous, ignoreRules, () =>
getScanCache(loadScanCacheStore(), leftDir, rightDir)
)
const result = await scanFolders(leftDir, rightDir, {
...(prev ? { previous: prev } : {}),
...(ignore ? { ignore } : {}),
...args,
...(semantic
? {
// 语义判等解码复用解码 worker(大缓冲后台解码,与文件打开共用同一管线)