Repository navigation
v0.3.0 — 插件数据跟着工作区走(索引与回收站进 <工作区>/.dsh-notes/)
插件自己的数据现在跟着工作区走了。 这是本插件的一次存储契约变更(带自动迁移,升级零操作):
把工作区备份走、或整份拷到另一台机器,装上同一个插件就能原样读出来 —— 分类树、笔记归属、忽略规则、
置顶、跨工作区映射、回收站(可恢复的删除),全都在工作区里。
破坏性存储变更,带自动迁移。 插件的语义数据(分类树、笔记归属、忽略规则、置顶、
跨工作区映射、回收站)从用户主目录搬进工作区自己的 .dsh-notes/:
<工作区>/
├── notes/ # 笔记(不变)
├── .dsh-assets/ # 图片资产(不变)
└── .dsh-notes/ # 新增:插件数据(自动写 .gitignore,不进 git status)
├── index.json # 薄索引
└── .trash/ # 回收站(文件本体 + trash.json)
为什么:以前这些数据在 $DSH_HOME/knowledge/registry.json —— 用户主目录。备份工作区、
或把工作区搬到另一台机器,数据不跟着走,得从头组织一遍。现在整份拷过去、装上同一个插件就能原样读出来。
变化
- 跟着工作区走:备份 / 迁机 / 改路径之后,分类树、归属、忽略规则、置顶、跨工作区映射、
回收站(可恢复的删除)全都在。 - 路径自动重定位:索引里记的是绝对路径;工作区换路径后,装载时按旧根的相对位置重定位到新根,
不会留下一堆指向老机器的死路径(这条不做的话,"搬走的工作区"是打不开的)。 - 升级零操作:第一次打开工作区时,把旧
registry.json里属于它的切片自动迁进
.dsh-notes/index.json,旧文件原样保留作备份;已知工作区列表改存$DSH_HOME/knowledge/workspaces.json。 - 机器本地只剩扫描缓存(
index/<key>.json,派生数据)与"这台机器见过哪些工作区"。 storeScope: home逃生开关:完全回到旧行为(只读挂载、共享仓库、应急回退时用);
knowledge工具新增migrateop(toWorkspace/toHome),在两个位置之间显式搬运
(移动语义,不留两半)。- 只读工作区:读路径(对账/扫描)只记一次日志、不抛,界面仍能用内存里的索引;
用户显式写操作才如实报错。 .dsh-notes/永不被扫描:走目录时跳过所有点目录,所以回收站里的.md不会被当成候选笔记
重新登记回树(回收站搬进工作区的前提)。- 标签/分屏布局、字号刻意留在浏览器
localStorage(设备形状的偏好,不跟着工作区跑)。
工程
- 新增
lib/store.js(存储位置决策 + 数据切片,纯函数)与test/store.test.mjs(9 条)、
test/store-scope.test.mjs(8 条:迁移 / 搬走工作区 / 只读 / 回收站 / 点目录不被扫 / 两种形态等价)。 - 单测 184 条(v0.2.0 是 164 条),
build-graphcycles 0。
怎么用
- 什么都不用做:第一次打开工作区时,旧
$DSH_HOME/knowledge/registry.json里属于它的那部分
会自动迁进<工作区>/.dsh-notes/index.json,旧文件原样保留作备份。 - 搬机器/搬路径:整份拷过去、用那个目录开会话即可(索引里记的绝对路径会按新根自动重定位)。
- 不想要工作区里这个目录:配置
storeScope: home回到旧行为;或用knowledge工具的
migrateop 在两个位置之间显式搬运。 - 要备份"人工组织":带上
.dsh-notes/(它自带.gitignore,不会污染你的git status)。
只删掉它的话,笔记文件不丢、rescan能把"哪些是笔记"认回来,但分类树/归属/忽略/置顶会退化成平铺树。
验证
190 条单测全绿(test/store.test.mjs 10 条 + test/store-scope.test.mjs 9 条是新加的),
build-graph cycles 0;真机实测:迁移后树结构与迁移前逐项一致、旧索引未被改写、
工作区 git status 看不到 .dsh-notes/、切到别的工作区不会在那里留下空目录。