dsh-obsidian-memo 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +270 -0
- package/README.md +272 -0
- package/cordis.patch.yml +10 -0
- package/docs/ARCHITECTURE.md +88 -0
- package/docs/AUDIT-0.16.md +74 -0
- package/docs/CHANGELOG.md +120 -0
- package/docs/CONTRACT.md +544 -0
- package/docs/GUIDE.md +177 -0
- package/docs/KNOWN_ISSUES.md +113 -0
- package/icon.svg +7 -0
- package/lib/ai.js +161 -0
- package/lib/capture.js +175 -0
- package/lib/client.js +6994 -0
- package/lib/config-picker.js +29 -0
- package/lib/filename.js +33 -0
- package/lib/files.js +88 -0
- package/lib/host/ai-jobs.js +118 -0
- package/lib/host/configuration.js +151 -0
- package/lib/host/dispatch.js +32 -0
- package/lib/host/environment.js +24 -0
- package/lib/host/folders.js +77 -0
- package/lib/host/images.js +116 -0
- package/lib/host/mutations.js +123 -0
- package/lib/host/note-content.js +44 -0
- package/lib/host/notes.js +148 -0
- package/lib/host/rpc.js +82 -0
- package/lib/host/scanning.js +67 -0
- package/lib/host/session.js +67 -0
- package/lib/host/state.js +68 -0
- package/lib/host/vault.js +38 -0
- package/lib/host/writes.js +21 -0
- package/lib/index.js +88 -0
- package/lib/notes.js +454 -0
- package/lib/obsidian.js +93 -0
- package/lib/scan.js +269 -0
- package/lib/settings.js +228 -0
- package/lib/shared.js +309 -0
- package/lib/trash.js +205 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +76 -0
- package/scripts/benchmark.mjs +58 -0
- package/scripts/build-client.mjs +39 -0
- package/src/client/ai/use-comments.js +75 -0
- package/src/client/ai/use-job-notifications.js +53 -0
- package/src/client/ai/use-project-dialog.js +58 -0
- package/src/client/capture/composer.js +266 -0
- package/src/client/capture/images.js +64 -0
- package/src/client/capture/keyboard.js +34 -0
- package/src/client/components/dialogs.js +67 -0
- package/src/client/components/feedback.js +50 -0
- package/src/client/components/icons.js +160 -0
- package/src/client/components/use-toasts.js +58 -0
- package/src/client/constants.js +127 -0
- package/src/client/data/state.js +116 -0
- package/src/client/data/use-notes-data.js +137 -0
- package/src/client/data/visibility.js +14 -0
- package/src/client/drag/drop-actions.js +47 -0
- package/src/client/drag/motion.js +84 -0
- package/src/client/drag/overlay.js +33 -0
- package/src/client/drag/use-card-drag.js +149 -0
- package/src/client/i18n/en.js +219 -0
- package/src/client/i18n/index.js +11 -0
- package/src/client/i18n/zh.js +219 -0
- package/src/client/images/cache.js +55 -0
- package/src/client/images/components.js +121 -0
- package/src/client/images/queue.js +106 -0
- package/src/client/index.js +40 -0
- package/src/client/panel/header.js +146 -0
- package/src/client/panel/use-shortcuts.js +79 -0
- package/src/client/panel.js +424 -0
- package/src/client/preferences.js +198 -0
- package/src/client/react.js +8 -0
- package/src/client/reader/blocks.js +51 -0
- package/src/client/reader/note-drawer.js +270 -0
- package/src/client/reader/use-dock-offset.js +23 -0
- package/src/client/reader/use-drawer-layout.js +96 -0
- package/src/client/reader/use-note-editor.js +230 -0
- package/src/client/reader/use-pinned-note.js +41 -0
- package/src/client/runtime.js +30 -0
- package/src/client/settings/ai-budget-row.js +65 -0
- package/src/client/settings/ai-budget.js +42 -0
- package/src/client/settings/callouts.js +21 -0
- package/src/client/settings/config-file.js +74 -0
- package/src/client/settings/image-processing.js +31 -0
- package/src/client/settings/official-page.js +32 -0
- package/src/client/settings/paths.js +131 -0
- package/src/client/settings/settings-drawer.js +244 -0
- package/src/client/settings/style-select.js +58 -0
- package/src/client/settings/trash.js +30 -0
- package/src/client/settings/use-settings-draft.js +207 -0
- package/src/client/styles/base.js +63 -0
- package/src/client/styles/capture.js +94 -0
- package/src/client/styles/index.js +26 -0
- package/src/client/styles/overrides.js +116 -0
- package/src/client/styles/reader.js +66 -0
- package/src/client/styles/settings.js +118 -0
- package/src/client/styles/tokens.js +29 -0
- package/src/client/styles/wall.js +83 -0
- package/src/client/testing.js +139 -0
- package/src/client/utils.js +66 -0
- package/src/client/wall/model.js +158 -0
- package/src/client/wall/note-card.js +201 -0
- package/src/client/wall/use-note-actions.js +107 -0
- package/src/client/wall/use-subfolders.js +42 -0
- package/src/client/wall/use-wall-content.js +135 -0
- package/src/client/wall/use-wall-filters.js +92 -0
- package/src/client/wall/use-wall-paging.js +55 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 代码结构与修改入口(0.16.3)
|
|
2
|
+
|
|
3
|
+
先按下表定位功能,再读目标文件的导入、参数和导出。RPC 与用户交互行为以 [CONTRACT.md](CONTRACT.md) 为准;历史修复见 [CHANGELOG.md](CHANGELOG.md),暂缓事项见 [KNOWN_ISSUES.md](KNOWN_ISSUES.md)。
|
|
4
|
+
|
|
5
|
+
## 运行与源码
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
Harness Host → lib/index.js → lib/host/ 服务 → lib/ 基础能力 → 本地仓库
|
|
9
|
+
Harness Web → lib/client.js(生成)
|
|
10
|
+
↑ pnpm build / pnpm dev
|
|
11
|
+
src/client/index.js → 面板、组件与 hooks
|
|
12
|
+
↓ 已认证 RPC /sticky-notes
|
|
13
|
+
Host RPC 路由
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- Host 使用原生 ES 模块,入口只创建服务并注册 endpoint。
|
|
17
|
+
- Client 按 ES 模块维护。esbuild 仅作为开发依赖,把源码生成 Harness `window.__ModuleLoader__.load` 所需的一个文件;运行时只从宿主读取 React 和 ReactDOM。发布包包含生成文件,使用者无需构建。
|
|
18
|
+
- `lib/client.js` 随源码一同提交,便于直接 `link:` 安装。生成文件带来源模块注释;修改应回到 `src/client/`。构建没有时间戳或机器路径,`pnpm build:check` 检查是否与源码一致。
|
|
19
|
+
- `src/client/testing.js` 集中组装已有 `__test` 调试接口;业务模块不依赖测试入口。
|
|
20
|
+
|
|
21
|
+
## Host:业务组合与状态所有权
|
|
22
|
+
|
|
23
|
+
`lib/index.js` 的 endpoint 表是 RPC 名称到实现的唯一映射。每次 `apply` 创建一套独立服务,队列、缓存、任务和撤回 token 不跨插件实例共享。
|
|
24
|
+
|
|
25
|
+
| 修改内容 | 入口 | 状态与边界 |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| 认证、请求大小、信封协议 | `lib/host/rpc.js` | 只处理传输;不读写笔记 |
|
|
28
|
+
| endpoint 调度、操作串行化 | `lib/host/dispatch.js`、`writes.js` | 配置/删除队列与逐文件写锁保持原有顺序 |
|
|
29
|
+
| 用户配置、外部变更、切换 JSON | `lib/host/configuration.js` | 持有当前设置、位置、签名和配置队列;通过 `getSettings()` 提供最新值 |
|
|
30
|
+
| 扫描单飞与写后失效 | `lib/host/scanning.js` | 持有 scanner、epoch 与扫描队列;旧扫描不会回写新状态 |
|
|
31
|
+
| state/settings 响应、复合 revision | `lib/host/state.js` | 组合扫描、配置与任务快照 |
|
|
32
|
+
| 便签读写、新建、改名、待办 | `lib/host/notes.js` | 复用文件边界、内容版本和扫描失效 |
|
|
33
|
+
| 当前仓库与便签路径 | `lib/host/vault.js` | 读取最新配置并校验真实路径 |
|
|
34
|
+
| 全文与模型输入读取 | `lib/host/note-content.js` | 读原始 Markdown,不复用展示摘要 |
|
|
35
|
+
| 本地图片读取与附件查找 | `lib/host/images.js` | 持有命中/负缓存;切库和删除后清理 |
|
|
36
|
+
| AI 评论与开档 | `lib/host/ai-jobs.js` | 使用同一份任务表与写锁,保留现有并发/部分完成策略 |
|
|
37
|
+
| 任务、撤回 token、过期回收 | `lib/host/session.js` | 持有当前实例的 jobs、归档与删除 token |
|
|
38
|
+
| 归档、删除、撤回、系统回收站 | `lib/host/mutations.js` | 复用现有独占移动与整组回滚 |
|
|
39
|
+
| 目录浏览、新建、系统选择 | `lib/host/folders.js` | 保持仓库和符号链接边界 |
|
|
40
|
+
| 版本、安装位置、调试日志 | `lib/host/environment.js` | 版本只读 `package.json`,旧配置仍从包根目录迁移 |
|
|
41
|
+
|
|
42
|
+
配置服务在接受新设置后通过 `onSettingsChange(next, previous)` 通知组合入口。只有扫描范围变化才重置 scanner,仓库或便签目录变化才清理图片缓存;AI/图片参数变化不会清空整库摘要。
|
|
43
|
+
|
|
44
|
+
## Client:按功能定位
|
|
45
|
+
|
|
46
|
+
| 功能 | 源码目录或文件 | 对应测试 |
|
|
47
|
+
| --- | --- | --- |
|
|
48
|
+
| 插件注册、样式/字典生命周期 | `src/client/index.js`、`runtime.js` | `test/client/registration.test.mjs` |
|
|
49
|
+
| 主面板组合 | `src/client/panel.js` | reader-layout、drag-sessions |
|
|
50
|
+
| 顶栏与全局快捷键 | `src/client/panel/` | preferences、reader-layout |
|
|
51
|
+
| 数据读取、响应代次与轮询 | `src/client/data/` | data、editor |
|
|
52
|
+
| 卡片、排序筛选、分页、笔记操作 | `src/client/wall/` | preferences、wall-rendering、note-actions、drag-sessions |
|
|
53
|
+
| 阅读块、抽屉编辑、宽度、钉住恢复 | `src/client/reader/` | editor、reader-layout |
|
|
54
|
+
| 快速记录、图片编码、输入快捷键 | `src/client/capture/` | capture、images |
|
|
55
|
+
| 拖拽浮层、动作栏、动画与会话 | `src/client/drag/` | drag-motion、drag-sessions |
|
|
56
|
+
| 图片队列、LRU、视口加载 | `src/client/images/` | images |
|
|
57
|
+
| 评论确认、开档对话框、任务通知 | `src/client/ai/` | ai、notifications |
|
|
58
|
+
| 设置组件、草稿、配置文件与回收站 | `src/client/settings/` | settings-ui、settings-draft、settings-config |
|
|
59
|
+
| 图标、通用对话框与 toast | `src/client/components/` | ai、reader-layout、notifications |
|
|
60
|
+
| localStorage 兼容与抽屉尺寸约束 | `src/client/preferences.js` | preferences、reader-layout |
|
|
61
|
+
| 中英文文案 | `src/client/i18n/` | registration、settings-ui、ai |
|
|
62
|
+
| 样式和主题变量 | `src/client/styles/` | styles、wall-rendering |
|
|
63
|
+
|
|
64
|
+
`panel.js` 组合数据、编辑、设置与交互 hooks,并把明确的回调交给视图。每个 hook 持有自己创建的 state/ref/effect;异步任务继续通过 `aliveRef`、请求代次和会话代次拒绝过期回调。高频拖拽移动仍只更新浮层 transform,不经过整墙渲染。
|
|
65
|
+
|
|
66
|
+
样式按 base → capture → wall → reader → settings → overrides 顺序组合。最后一层保留原有覆盖与深色规则;拆分时不调整 CSS 层叠顺序。
|
|
67
|
+
|
|
68
|
+
## 基础能力
|
|
69
|
+
|
|
70
|
+
`lib/files.js` 管路径、内容版本和原子/独占文件操作;`filename.js` 管文件名规则;`notes.js` 管 Markdown 解析与写回;`scan.js` 管摘要和全文缓存;`capture.js` 管新建笔记、模板和附件;`settings.js` 管配置格式与持久化;`ai.js` 管模型请求/输出;`trash.js` 管回收组;`obsidian.js`、`config-picker.js` 管系统交互。业务服务调用这些能力,基础模块不依赖 Host 或浏览器组合层。
|
|
71
|
+
|
|
72
|
+
## 开发与验证
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pnpm install --frozen-lockfile
|
|
76
|
+
pnpm build # 修改浏览器源码后更新 lib/client.js
|
|
77
|
+
pnpm dev # 持续构建,配合 Harness HMR
|
|
78
|
+
pnpm build:check # 只检查产物一致性,不改写文件
|
|
79
|
+
pnpm test # 一致性、架构边界和全部回归
|
|
80
|
+
node --test test/client/drag-sessions.test.mjs
|
|
81
|
+
node --test test/host/configuration.test.mjs
|
|
82
|
+
pnpm bench # 临时数据性能基准
|
|
83
|
+
pnpm pack # 自动构建并生成可安装的 tgz
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
先构建再运行定向浏览器测试,保证测试的是当前源码生成的发布文件。浏览器行为测试仍执行真正的 bundle,少量历史结构断言读取手写源码。`test-support/client.mjs` 提供 React/hook 运行器;`test-support/host.mjs` 提供临时仓库与认证 RPC 运行器,每个测试进程独立隔离。
|
|
87
|
+
|
|
88
|
+
新增代码应保持静态模块依赖无环,浏览器仅允许 React/ReactDOM 外部依赖,基础模块不反向依赖组合层,手写生产文件不超过 500 行。`test/architecture.test.mjs` 自动检查这些边界;超出时应重新划分职责,生成文件单独排除。
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# 0.16 发版前性能与结构稳定性排查
|
|
2
|
+
|
|
3
|
+
日期:2026-11-11。范围:0.16 系列开发期间的性能、结构与界面复核,包括设置与配置迁移功能;最终发布版本为 0.16.2。
|
|
4
|
+
|
|
5
|
+
## 结论
|
|
6
|
+
|
|
7
|
+
发现的主要问题是缓存失效范围过大、整库全文常驻、已有加载队列未被阅读组件复用,以及异步操作缺少设置会话边界。已完成针对性修复,未引入运行时依赖或构建工具。
|
|
8
|
+
|
|
9
|
+
现有卡片 memo、稳定回调、分批渲染、隐藏时暂停轮询、响应代次保护与扫描单飞值得保留。单文件 Client 约 6200 行,包含约 500 行样式、两套文案和组件;行数本身不能说明运行开销,但面板与设置的后续维护确实需要控制职责增长。
|
|
10
|
+
|
|
11
|
+
## 修复记录
|
|
12
|
+
|
|
13
|
+
| 问题及影响 | 修复 |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| 单文件 invalidate 同时清空 scanKey,下一轮误清整库缓存 | 仅删除该文件摘要及全文缓存,其他对象继续复用 |
|
|
16
|
+
| Scanner 常驻所有正文、blocks、评论,内存随整库正文增长 | 整库只保留摘要;全文按需读取,LRU 最多四篇 |
|
|
17
|
+
| Markdown 最终只返回 200 块,却先解析全部段落 | 展示块与标题齐全后跳过额外块解析;继续提取尾部评论,代码与引用示例不误识别;评论满额后也停止格式化 |
|
|
18
|
+
| 只按四舍五入的 mtime 与大小判断变化,可能漏掉原子替换 | 指纹加入完整 mtime/ctime、inode、birthtime;刷新时淘汰对应全文缓存 |
|
|
19
|
+
| 官方设置页复用便签墙轮询,扫描并传输整库便签 | 新增轻量 settings 读取,复用原轮询协调器和草稿组件 |
|
|
20
|
+
| state 整体进入配置串行队列,并发请求无法复用正在扫描的结果 | 仅配置刷新进入配置队列,扫描继续单飞;慢扫描不阻塞设置保存,目录切换使旧扫描重试 |
|
|
21
|
+
| AI、图片参数修改也清空扫描与图片路径缓存;unchanged 响应仍复制所有摘要 | 按字段失效,只在范围变化时清空;unchanged 跳过摘要装饰 |
|
|
22
|
+
| 阅读图片绕过卡片已有队列,打开多图笔记时同时请求全部本地图 | 提取 useNoteImage,卡片/阅读共用视口懒加载、三个并发与取消;阅读可复用卡片原图缓存 |
|
|
23
|
+
| 排序在每次比较时通过 localeCompare 重建带选项的比较器 | 复用一个 Intl.Collator,保持原排序规则 |
|
|
24
|
+
| 目录选择、新建、配置回调可能在关闭重开或切换仓库后修改新草稿 | 设置会话代次与仓库范围检查;系统选择返回真实 Promise,过期结果不进入新草稿 |
|
|
25
|
+
| 设置 JSON 与位置指针各自实现临时文件写入,失败可残留临时文件 | 共用 atomicWrite,保留私有配置权限并在失败时清理 |
|
|
26
|
+
| 普通 rename 在重名检查之后仍可能覆盖并发创建的目标 | 新建、改名、归档、归档撤回、删除恢复共用独占移动;不支持硬链接时独占复制,同文件大小写改名保留特例 |
|
|
27
|
+
| 合法正文经 JSON 转义后超过原 2 MiB 传输预算;上限与分发解析路径不一致 | 共用归一化 pathname;正文预算按最坏六倍转义推导,新建另加图片 base64 预算;文件与图片落盘限额保持不变 |
|
|
28
|
+
| 输入岛停用后附件 URL 未释放、归档撤回 token 长期积累、外部 JSON 数值隐式强制 | 补齐资源清理与过期回收,压缩参数只接受有限 number,界面显式转换输入 |
|
|
29
|
+
| 旧归档系统选择函数、initial/resolvedHint/onAddArchive、scanner.files 已无有效使用 | 删除死逻辑;文件移动与配置写入原语统一,减少重复实现 |
|
|
30
|
+
|
|
31
|
+
## 性能对照
|
|
32
|
+
|
|
33
|
+
同机 Node v22.22.3,同一个基准脚本:1000 篇便签,每篇约 72.27 KiB、2000 段;另测 5000 条打乱顺序的中文文件名。基线为本次排查前的 0.16 工作区快照。下表为单次对照,具体耗时会随 CPU、文件系统与缓存状态变化。
|
|
34
|
+
|
|
35
|
+
| 指标 | 修复前 | 修复后 |
|
|
36
|
+
| --- | ---: | ---: |
|
|
37
|
+
| 首次扫描 | 4205 ms | 938 ms |
|
|
38
|
+
| 无修改的缓存扫描 | 28 ms | 25 ms |
|
|
39
|
+
| 只改一篇后的扫描 | 4202 ms | 25 ms |
|
|
40
|
+
| 扫描后新增的保留 JS 堆 | 118 MiB | 2.19 MiB |
|
|
41
|
+
| 修改一篇后复用的摘要 | 0 / 999 | 999 / 999 |
|
|
42
|
+
| 5000 条文件名排序 | 258 ms | 9.72 ms |
|
|
43
|
+
|
|
44
|
+
内存数据是 GC 后进程 JS 堆的增量,不代表完整 DSH 进程、浏览器解码图片或页面 DOM 的总占用。基准不计测试数据生成时间。
|
|
45
|
+
|
|
46
|
+
运行 `pnpm bench` 可重现当前版本。脚本只使用自动清理的临时仓库,不访问用户配置或真实 Obsidian 仓库;可用 `node --expose-gc scripts/benchmark.mjs /path/to/checkout` 对照另一份源码。
|
|
47
|
+
|
|
48
|
+
## 验证
|
|
49
|
+
|
|
50
|
+
- 原有 330 项测试作为基线全部通过;性能修复后 349 项通过,界面细节补齐后共 354 项通过,无跳过或失败。
|
|
51
|
+
- 新增测试覆盖:摘要复用、全文缓存淘汰、同 mtime 替换、尾部评论与代码示例、轻量设置、并发扫描与设置保存、扫描中切换目录、旧设置回调隔离、图片懒加载/并发/缓存复用、对象 URL 释放、配置写失败清理、JSON 转义预算、独占移动与并发改名。
|
|
52
|
+
- 额外进行了 400 组新旧 Markdown 解析差分检查,覆盖不同块上限、相邻/分隔段落、代码、引用、图片和评论,输出一致。
|
|
53
|
+
- 全部 lib 与基准脚本的 JS 语法检查、diff 空白检查通过;`pnpm pack` 成功,已检查 0.16.2 包含全部运行时模块、locale 与补丁文件,未包含测试数据或临时配置。
|
|
54
|
+
|
|
55
|
+
## 结构判断与后续边界
|
|
56
|
+
|
|
57
|
+
Client 继续作为单文件浏览器 bundle 发布。已有数据、编辑、设置三个 hooks 的边界可以继续使用;本次让设置页与图片组件正确复用既有机制。后续若继续扩展设置,建议先拆开发源码中的样式/文案/设置视图,再生成同样的发布 bundle,并保留行为测试。仅拆文件不会消除扫描、传输或图片解码成本。
|
|
58
|
+
|
|
59
|
+
### 界面细节后的结构复核
|
|
60
|
+
|
|
61
|
+
本次未发现需要先重写架构才能继续新增功能的阻断点。Host 已把扫描、Markdown、设置、附件、回收站与系统打开器放在各自模块,Client 的读取、编辑、设置与图片加载也已有可复用边界。界面调整继续复用 copyNote、runDelete、撤回与原生配置加载链路,没有另建一套行为状态。右侧工具栏使用固定两行结构,同时移除已不再使用的窄面板阈值、分组布局与图标分支。
|
|
62
|
+
|
|
63
|
+
主要维护压力仍是 lib/client.js:目前约 6200 行,其中 StickyNotesPanel 约 1500 行,集中管理拖拽、整理、快捷键、弹窗与布局。继续增加较大功能时,优先按交互职责提取 hooks 或组件,并让数据、编辑、设置保留现有边界;样式和双语文案可随后拆为开发源文件,发布时仍生成单个 bundle。本轮没有为样式修改引入构建系统或状态库。
|
|
64
|
+
|
|
65
|
+
补充验证使用真实 Client 组件的本地浏览器预览:普通箭头光标、五种纸色标签与蒙层、深浅主题、四个操作的顺序及悬停提示、紫色 Obsidian 图文按钮独占第二行、320px 阅读面板、空正文提示、关于信息同排与窄设置页均通过,页面无脚本异常。此预览不等同于真实 DSH/Obsidian 的系统集成验收。中英文 README、指南、契约与本版变更记录已按最终界面同步,最终版本统一为 0.16.2。
|
|
66
|
+
|
|
67
|
+
仍保留以下边界:
|
|
68
|
+
|
|
69
|
+
1. 轮询仍遍历便签集合并 stat 文件;首次仍需读取正文。当前修复适合现有架构,超大库可再评估 Host 分页与真正虚拟列表。
|
|
70
|
+
2. 含图片删除仍要检查全库共享引用,这是保护其他笔记附件的必要校验。后续可考虑增量引用索引;本轮保留保守的删除规则。
|
|
71
|
+
3. 中途崩溃的孤儿附件尚无 journal;模板正文语义、自定义 Obsidian 配置目录、触摸交互等既有产品项仍见 [已知问题](KNOWN_ISSUES.md)。
|
|
72
|
+
4. 验证使用临时文件、Host RPC 集成测试与 Client hook/组件运行器;未连接真实 DSH/Obsidian 做界面验收。系统垃圾桶与网络盘/移动盘回退仍需要各目标环境实机验证。
|
|
73
|
+
|
|
74
|
+
本报告记录 0.16.2 发版前的可复现结果,不把代码与模拟测试通过等同于所有平台已经完成验收。
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# 版本记录
|
|
2
|
+
|
|
3
|
+
[返回 README](../README.md) · [使用与开发指南](GUIDE.md)
|
|
4
|
+
|
|
5
|
+
以下保留各版本发布时的变更记录,当前功能以 README 与实现契约为准。
|
|
6
|
+
|
|
7
|
+
## 版本 0.16.3 变更摘要(2026-11-12)
|
|
8
|
+
|
|
9
|
+
- 重整浏览器代码:原约 6,200 行单文件拆成 `src/client/` 内按功能组织的 ES 模块;数据、编辑、设置、图片、拖拽、AI、筛选分页、布局、样式与文案各自维护。主面板缩至约 400 行,只组合状态和操作入口。
|
|
10
|
+
- Host 入口拆成 `lib/host/` 独立服务,明确配置、扫描单飞、写队列、图片缓存、任务与撤回 token 的状态所有权;保留 RPC、路径校验、内容版本、文件格式与现有交互行为。
|
|
11
|
+
- 使用固定版本的开发依赖 esbuild 生成并提交 `lib/client.js`,保持 Harness 单文件加载与零运行时依赖,直接安装无需构建。新增 `pnpm build`、`pnpm dev`、`pnpm build:check`,测试检查产物同步,打包自动构建,发布流程安装锁定依赖。
|
|
12
|
+
- 将大型前端、Host、Markdown 与配置测试按职责拆分,共用隔离的测试运行器;保留原有 354 项回归,新增模块依赖方向/无环/文件规模检查、服务隔离、写队列失败恢复、通知 hooks 与样式生命周期回归,共 362 项测试通过。
|
|
13
|
+
- 新增 [架构导航](ARCHITECTURE.md) 与根目录 AGENTS.md,提供功能到源码/测试的映射、模块协作边界和常用验证命令;同步中英文 README、开发指南、实现契约与已知问题位置,为后续大版本更新提供入口。
|
|
14
|
+
|
|
15
|
+
## 版本 0.16.2 变更摘要(2026-11-11)
|
|
16
|
+
|
|
17
|
+
- 发版前性能与稳定性排查:修复单文件修改误清全库缓存,扫描仅常驻摘要、全文保留最近四篇;Markdown 展示满额后跳过多余解析,文件指纹识别同 mtime 原子替换,排序复用 Collator。
|
|
18
|
+
- 官方设置改用轻量 settings 轮询,配置队列不再阻塞扫描单飞;卡片与阅读图片共用懒加载及三个并发的可取消队列。补齐设置异步会话隔离、配置临时文件清理、对象 URL 释放与撤回 token 过期回收,移除旧归档选择死代码。
|
|
19
|
+
- 文件新建、改名、归档与恢复统一独占移动,防止并发同名覆盖;RPC 预算覆盖正文 JSON 转义并统一路径解析。新增基准脚本及回归测试,细节见 [排查报告](AUDIT-0.16.md)。
|
|
20
|
+
- 重整设置为文件夹、AI、图片、管理与关于四个标签;接入官方设置 → 插件 → Obsidian MEMO,面板与官方页面复用相同组件及 JSON 保存逻辑。GitHub 与作者信息收至两处设置共用的「管理与关于」底部淡字,顶栏只保留版本号。
|
|
21
|
+
- 仓库只选一次,便签、项目、图片与归档文件夹使用共享下拉组件,显示相对路径,支持仓库内新建多级文件夹、系统选择、搜索与跨字段最近记录;切换仓库保留相对文件夹。
|
|
22
|
+
- Emoji 改为横向标签,右侧固定加号;切换只编辑所选角色,开档提示词默认折叠。
|
|
23
|
+
- 配置改存独立用户目录 config.json,为 npm 安装准备;首次自动迁移旧 data/settings.json 并保留原文件。支持直接打开 JSON、重新加载、浏览并加载已有文件、另存并记住自定义位置;保存仓库相对路径。外部编辑自动读取,损坏配置保留,旧草稿拒绝覆盖新配置;环境变量固定位置保持兼容。
|
|
24
|
+
- 日常删除与 5 秒撤回不变,仍使用仓库 .trash。设置新增 Finder / 文件管理器入口及经确认的「移至系统垃圾桶」;整组转交系统回收 API,失败不以永久删除兜底,不清空系统已有垃圾,撤回窗口内禁止清理。
|
|
25
|
+
- 输入浮岛的 Tab 提示跟随标题并右对齐,空间不足自动置于下方;保留正文分割线。移除顶栏手动刷新,自动轮询和错误重试保留。
|
|
26
|
+
- 后续细节:文件夹标签仅随卡片菜单激活叠在右上角,加入同纸色半透明渐变蒙层;卡片与右侧阅读共用同纸色胶囊样式。复用原空正文占位显示「双击正文编辑」,标题元信息不再显示此提示。Config JSON 的「加载配置」直接弹出系统 JSON 文件选择窗,选中即加载;「打开配置 / 加载配置 / 更多」统一尺寸,其余三项仍在「更多」。
|
|
27
|
+
- 界面细节:便签使用普通箭头光标;标签底色和蒙层直接采用便签纸色,文字使用对应深色。关于区简化为一行 GitHub 链接与 by cavenzhong,「更多」移除下拉箭头。右侧操作条第一行依次为归档、到项目、删除、复制全文四个线图标与上方提示;第二行保留紫色的「在 Obsidian 打开」图标与文字。删除沿用 5 秒撤回。
|
|
28
|
+
- 补充配置迁移、外部 JSON 与冲突、目录创建与边界、跨字段历史、系统垃圾桶失败保护、设置标签与官方注册的回归测试;354 项测试全部通过。
|
|
29
|
+
|
|
30
|
+
## 版本 0.15.1 变更摘要(0.15 系列首个发布)
|
|
31
|
+
|
|
32
|
+
- 在 0.15.0 的基础上修复:拖拽缩略卡片柔和阴影、动作提示在卡片上方居中、归档目录菜单固定在底部归档区上方并加淡阴影;放手未选目录时预览停在归档区中心并暂时隐藏图标文字,点击目录归档,点击外部、焦点移出、窗口失焦或 Esc 回落,Enter 回落后聚焦输入岛;移除旧卡片内归档菜单与冗余状态。
|
|
33
|
+
- 合并 `drop` 与 `dragend` 收尾,切换目标复用便签墙,避免闪回、重复测量与无关缩略图重载。
|
|
34
|
+
- 补充拖拽、归档、删除与撤回的回归测试(312 个测试全部通过);README、实现契约、指南与已知问题基准同步到 0.15.1。
|
|
35
|
+
|
|
36
|
+
## 版本 0.15.0 变更摘要
|
|
37
|
+
|
|
38
|
+
- 拖拽缩略卡片增加柔和阴影,动作提示在卡片上方居中;归档目录菜单固定在底部归档区上方并增加淡阴影。放手未选目录时,预览停在归档区中心并暂时隐藏图标文字;点击目录归档,点击外部、焦点移出、窗口失焦或 Esc 回落,Enter 回落后聚焦输入岛。移除旧卡片内归档菜单与冗余状态。
|
|
39
|
+
- 卡片支持拖拽:输入岛临时切换为三列操作栏,保留并上移渐变背景;归档可展开已配置目录,到项目打开项目名对话框,删除在放手时执行。原位置保留空虚线框,便签预览宽高缩为 1/3,实色动作提示置于预览上方且层级更高,底部渐变随目标变色。
|
|
40
|
+
- 操作栏右边界跟随右侧面板左边缘,兼容钉住、浮动与拖拽调整宽度;取消拖拽后保留输入草稿。
|
|
41
|
+
- 拖拽移动合并到每帧一次浮层 transform 更新,切换目标复用便签墙;操作栏与输入岛切换保持布局稳定。取消放手短动画回落,归档/删除淡出后等待操作完成再清理占位,合并 drop/dragend 收尾,避免闪回、重复测量与无关缩略图重载。
|
|
42
|
+
- 空白墙面同时接收内部 dragenter/dragover,drop 当场启动回落,消除浏览器拒绝拖放后等待原生回弹的停顿;外部文件不被该处理器拦截。提示宽度仅在靠近视口边缘时调整,纯文字便签删除跳过全库附件扫描。
|
|
43
|
+
- 卡片操作区在 AI 评论下方仅提供复制和在 Obsidian 打开;归档与到项目入口迁至拖拽栏,阅读面板保留原有入口。复制内容为文件标题一行、换行后完整 Markdown 正文,成功显示提示。
|
|
44
|
+
- 删除由拖拽菜单与 ⌘ / Ctrl + Backspace 触发:Markdown 和独占本地图片成组进入库内 `.trash/MEMO-…`,5 秒内可整组撤回;共享图片保留,原位置有同名文件时拒绝覆盖。删除与撤回直接使用库内文件读写,消除系统垃圾桶、AppleScript 和 Finder 的额外权限依赖;到期保留文件及 `restore.json` 恢复清单,不自动清空。
|
|
45
|
+
- 输入岛空正文失焦、空正文 Backspace 时收起;Enter 统一聚焦输入岛(输入岛内输入和右侧正文编辑除外),卡片悬停/聚焦不再触发打开详情,岛内 Esc 退出焦点并保留草稿;标题自动折行并随内容增高。
|
|
46
|
+
- 向下滚动超过一屏后,输入岛上方显示圆形 ↑ 按钮,点击平滑回到顶部。
|
|
47
|
+
- 新增删除与撤回、附件保护、快捷键、拖拽取消的回归测试;库内隐藏回收目录与整组恢复使用真实临时文件验证,覆盖删除/撤回中途权限失败的回滚、同名防覆盖、路径与符号链接边界、过期保留及其他回收文件保护。
|
|
48
|
+
|
|
49
|
+
## 版本 0.14.2 变更摘要(第二批审查修复)
|
|
50
|
+
|
|
51
|
+
- 文件名规范化统一到 `lib/filename.js`:新建与编辑改名共用特殊字符/控制符/零宽与双向控制字符清理、NFC、保留设备名与 240 UTF-8 字节上限。
|
|
52
|
+
- 快速记录:提交失败后按原焦点恢复标题/正文;标题 Enter/Tab 阻止冒泡;正文删空自动收起(0.14.1 已加)。
|
|
53
|
+
- Default Template:`community-plugins.json` 缺失/损坏/非数组按未启用处理,不再误套模板。
|
|
54
|
+
- 阅读视图:有序任务显示「编号 + 复选框」。
|
|
55
|
+
|
|
56
|
+
## 版本 0.14.1 变更摘要(0.14 审查修复)
|
|
57
|
+
|
|
58
|
+
- RPC 失败信封补 `details`,恢复重名 / 冲突 / 校验错误的真实 code 与中文提示;endpoint 查找不再受原型链影响。
|
|
59
|
+
- 快速记录:Tab 快捷方式只在无焦点/面板空白处进入标题,按钮/卡片/抽屉恢复原生 Tab 顺序;正文删空后自动收起为标题态。
|
|
60
|
+
- Default Template:`{{date}}`/`{{time}}`/`{{title}}` 按插件语义替换;模板损坏/不可读/越界时按无模板新建,不再阻塞。
|
|
61
|
+
- 图片文件夹禁止指向 `.obsidian`/`.trash` 等隐藏目录;新建图片仍用仓库相对 wikilink。
|
|
62
|
+
- 限额常量、源上限与文案改为单源(Host `LIMITS`/`formatBytes` + Client 常量 parity);移除未使用的 `date.menu` 文案与 `SN_dateToggle` class。
|
|
63
|
+
- 文档与验收清单同步 0.14 行为(Tab、模板变量、图片文件夹、隐藏目录、正文自动收起)。
|
|
64
|
+
|
|
65
|
+
## 版本 0.14.0 变更摘要
|
|
66
|
+
|
|
67
|
+
- 底部透明浮岛快速新建 Markdown:文件名即想法,Tab 可输入正文。
|
|
68
|
+
- 多图粘贴/选择、叠放展开、延迟完整预览;附件随便签持久保存。
|
|
69
|
+
- 独立图片处理设置:默认 WebP 质量 70/最大边长 2048px,可自定义或关闭。
|
|
70
|
+
- 日期筛选移除三角,点击开关、悬停显示范围菜单。
|
|
71
|
+
|
|
72
|
+
## 版本 0.13.9.2 变更摘要(结构收敛)
|
|
73
|
+
|
|
74
|
+
- 编辑保存增加内容版本检查;冲突时文件不变,草稿保留。
|
|
75
|
+
- 文件操作统一真实路径校验,覆盖归档、开档、图片、扫描与系统打开。
|
|
76
|
+
- 前端分离数据刷新、抽屉编辑、设置草稿;处理响应乱序与保存后的旧回调。
|
|
77
|
+
- AI 从原始正文读取,输入上限 12000 字符且带裁切提示;评论输出上限 4000 字符、开档 24000 字符,发生字符裁切也会提示。
|
|
78
|
+
- 移除未使用的独立改名和目录浏览 RPC,版本只由 Host 下发。
|
|
79
|
+
- **开档任务的去重、并发、部分完成与生命周期策略保持原状**,本次仅应用公共路径校验与 AI 内容规则。
|
|
80
|
+
|
|
81
|
+
## 版本 0.13.9 变更摘要
|
|
82
|
+
|
|
83
|
+
- **日期筛选改成开关**:顶栏日历按钮主区域 = 开/关(点亮按档位筛选,熄灭显示全部),右侧小三角打开档位菜单;菜单去掉「全部」,档位只留今天 / 3 天 / 本周 / 本月。开关状态与档位分别持久化,旧版存过 `all` 的自动迁移成「开关熄灭」。和子文件夹开关统一成「点亮 = 开启」的语义,方便以后文件夹也做「开关 + 选目录菜单」。
|
|
84
|
+
- **卡片无正文不再占位**:没有正文的便签不渲染「(暂无正文)」行。
|
|
85
|
+
- **「在 Obsidian 打开」视觉/布局**:文字改为紫色高亮(暗色主题自动提亮);右侧抽屉操作条空间不足时允许换行,归档 / 开档在上、它在下一行。
|
|
86
|
+
- **Block id 隐藏修复**:`^qa-daily-preview-…` 这类 Obsidian 锚点不再只匹配行尾——段落里的锚点也会隐藏,且保留它后面的文字。
|
|
87
|
+
- **锁定改图钉**:右侧面板锁定按钮从锁图标换成图钉(钉住 = 实心,未钉住 = 空心)。
|
|
88
|
+
- **窗口拖拽**:桌面版 DSH 里,顶栏标题区域可作为窗口拖拽区(`-webkit-app-region: drag`),按钮/菜单显式 `no-drag`;Web GUI 不受影响。
|
|
89
|
+
- **版本对齐**:`package.json` / `locale/*.json` / `APP_VERSION` / README / CONTRACT 统一到 0.13.9,单测校验。
|
|
90
|
+
|
|
91
|
+
## 版本 0.13.8 变更摘要
|
|
92
|
+
|
|
93
|
+
- **动态加载**:便签墙首屏只渲染 50 张,滚到接近底部自动补 50 张(IntersectionObserver,提前 320px);墙底部有简约三点加载动画 + 「加载中…」淡字。排序/日期筛选变化回到首屏。数据仍是 Host 一次下发,分批的是渲染/DOM(评估:对几十张感知有限,300+ 张时明显降低首屏与滚动压力;没有引入虚拟列表的复杂度)。
|
|
94
|
+
- **在 Obsidian 打开**:卡片操作行「归档 / 开档」同排右侧、以及右侧面板操作条最右,新增「转发 icon + 粗体文字」按钮;Host 用系统打开器打开 `obsidian://open?path=<便签绝对路径>`(不依赖仓库显示名)。只允许仓库内已存在文件;失败 toast(`open-failed`)。
|
|
95
|
+
- **设置版式**:每枚 AI 评论角色的 emoji、名称、callout 样式按钮排成一行(样式按钮与 emoji 输入同高),名称输入占剩余宽度;callout 样式从原生下拉改成「callout样式-xx」按钮 + 13 项菜单打勾,含义更清楚。
|
|
96
|
+
- **版本对齐**:`package.json` / `locale/*.json` / `APP_VERSION` / README / CONTRACT 统一到 0.13.8,单测校验。
|
|
97
|
+
|
|
98
|
+
## 版本 0.13.4 变更摘要
|
|
99
|
+
|
|
100
|
+
- **日期筛选**:顶栏操作区第一个新增日历菜单(今天 / 3 天 / 本周 / 本月 / 全部,默认今天,按文件创建时间);菜单内 `日期截止按真实时间` 勾选项(默认不勾):勾选 = 每日 00:00 分界,不勾 = 以最新一篇为锚滚动 24h/72h/7d/30d;全部 = 不筛选。档位与勾选状态持久化,计数随筛选变化。
|
|
101
|
+
- **锁定面板恢复**:锁定态记住当前打开的便签;切换面板/重进自动恢复,不再隐藏抽屉;目标便签不在当前筛选里时自动选当前筛选排序后的第一篇。
|
|
102
|
+
- **菜单与图片统一**:卡片操作菜单出现(悬停/聚焦整张卡)时,有图预览就统一隐藏;删除旧的「只有 emoji 行 hover 才出现的同色渐变蒙版 / aiRow 状态」,逻辑更简单一致。
|
|
103
|
+
- **版本对齐**:`package.json` 升到 0.13.4;顶栏 byline 改为显示完整版本号(自动取 Host `state.version`);插件描述(中英文 locale)同步到 0.13.4,并加单测保证以后不会再漂移。
|
|
104
|
+
- **改名保存修复**:编辑标题保存后,抽屉跟随新文件名,不再被自动关闭;锁定态也不再因此误切到别的便签。
|
|
105
|
+
|
|
106
|
+
## 版本 0.13 变更摘要
|
|
107
|
+
|
|
108
|
+
- 正文/摘要 80% 不透明度;面板大标题后 `by caven v0.13`;日间卡片色整体往白里调(`#FDFAF4` 系);标题保持宋体加粗。
|
|
109
|
+
- 卡片内正方形图片预览(最多 3 张 + 淡色 `+N`,贴在卡片左下角;懒加载、大小上限保护)。
|
|
110
|
+
- 卡片操作区重做:所有 AI emoji 平铺一行,悬停某枚时上方浮出文字标题;分割线 + 归档/开档;emoji 行悬停时同色渐变蒙版。
|
|
111
|
+
- 卡片图片 64×64、贴左下角;抽屉新增操作条(左 emoji 评论 / 右 归档开档);锁定态隐藏关闭按钮;顶栏 icon 选中态统一紫色高亮。
|
|
112
|
+
- 性能:空闲轮询退避(最长 30s)、不可见暂停、无变化不重渲染、卡片 memo、缩略图并发 ≤3 + 内存预算缓存、Host 扫描单飞/附件负缓存。
|
|
113
|
+
- 右侧面板:双击标题进入编辑;评论固定在面板下方独立区域;新增锁定按钮(左右并排、状态记住)。
|
|
114
|
+
- 顶栏新增子文件夹显示开关(icon)。
|
|
115
|
+
- 同款 AI 评论已存在时先确认再生成。
|
|
116
|
+
- 四个全新 AI 人格预设(😈 毒舌 / ✨ 另一面 / 🧭 落地 / 😇 真心话),旧默认预设自动迁移。
|
|
117
|
+
- AI 预算可配:每枚评论 emoji 与开档各有一个「低 / 中 / 高 / 自定义」四档控件(默认高:high / 8192 tokens);模型因思考吃光预算而写不出正文时,toast 直接引导去设置调档(`llm-token-budget`),写出半截时也会提示。
|
|
118
|
+
- 修复:仅大小写改名在 macOS 上误报重名;附件名图片查找增加缓存;扫描缓存键加入 vaultPath;清理死代码。
|
|
119
|
+
- 版本号统一为 v0.13;标题旁 byline 的版本号改为自动跟随 `package.json`(Host `state.version` → Client 取 major.minor)。
|
|
120
|
+
|