dsh-tiddlywiki 0.28.2 → 0.28.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/README.md CHANGED
@@ -67,6 +67,7 @@ dsh plugin --profile web add dsh-tiddlywiki
67
67
 
68
68
  ## 🕘 版本记录
69
69
 
70
+ - **v0.28.3**(2026-09-28):**修三个真机报障 + 插件说明补「多库 / 升级」两节**(作者拆库实测中发现)。① 单库模式下快速笔记露出一个没有选项的下拉 —— 根因是 **CSS `hidden` 只是 `display:none`,被显式 `display` 盖掉**(修法:显式 `[hidden]{display:none}` + 组件兜底)。② 会话级选择器没和输入框对齐 —— **对齐规则原本只写在 quick-note 条目内部**,已抽成 `client/dock-align.ts` 两处共用。③ 左侧入口按库显示:多库时每个在运行的库一个入口行、用各自显示名,点该行先切焦点库再开面板。④ 插件说明新增「多知识库」与「从旧版本升级上来」两节:明确升级后**不会自动变成多库**、`wikis.json` 在哪、旧指针文件何时还权威。守门扩到 19 条(含反向验证)。
70
71
  - **v0.28.2**(2026-09-28):**设置页去掉重复的「知识库位置」**(作者反馈:多库配置做完后它重复且逻辑冲突)。这一块的语义是「把**唯一的那个库**换到别处」——写的是 wiki 之外的指针文件 `location.json`,措辞也是单库时代的("切换到这个位置" / "恢复为配置默认")。现在**按模式二选一**:**单库模式**保留它(那里它是唯一正确入口);**多库模式整块不渲染**,某个库换目录收到「知识库列表」那一行的**「改目录」**(默认库经 `/admin/wiki/switch` → 改清单 + farm 收敛 + 校验;非默认库直接 `update`)。宿主接口**没有**冲突也**没有**改动:`/admin/wiki/switch|reset` 从 v0.28.0 起就按模式分派。守门:`verify-wiki-focus` 新增"多库模式下不得渲染该块"的断言;farm-boot 补上 location 面接线(22 条),保证藏了界面之后**接口仍按模式正确分派**。
71
72
  - **v0.28.1**(2026-09-28):**修「拆库 skill 在 wiki 启动慢 / 起不来时永远装不上」+ 快速笔记的目标库可切换(R7)**。① **真实事故**(作者升级 0.28.0 后重启宿主时发现,测试没拦住):技能安装写在了 `farm.startAll()` **之后**,而那个 wiki 很大、启动要几十秒 —— 于是"技能装没装"取决于"wiki 起得快不快";更糟的是 wiki 若因配置问题**永远起不来**,技能就永远不装,而它跟 wiki 毫无关系(只往 `$DSH_HOME/skills/` 写一个文件)。已挪到启动任务**最前面**并新增**顺序守门**(`verify-skill-install` 断言安装早于 `startAll()`,已反向验证)。② 快速笔记卡片新增「写入」目标库:**默认跟随你在 GUI 里看的那个库**(焦点库),卡片内可临时改、改过后不再被焦点带走。要点是**整张卡片一起换库**:标签建议 / 最近 / 草稿读取 / 附件上传 / 保存 / 随后弹出的 TW 编辑器必须落在同一个库 —— 只改保存那一处会产出"标签列表来自 A、笔记写进 B",比不做还糟(弹窗那条另有一条守门:写入 A、编辑器打开 B(空白)是典型的"看起来成功了"的失败)。目标库没在运行时卡片**先讲清楚**,而不是让你写完一段再失败。单库安装不显示选择器、请求 URL 逐字不变。
72
73
  - **v0.28.0**(2026-09-28):**多知识库**——同一进程内可同时运行多个 TiddlyWiki,每个库独立配置、独立 git、按会话选择作用域,且可对 Agent **彻底隐身**。起因是作者自己的库:`书籍` 语料 2468 条与日常笔记挤在一个 800MB 仓库里,Agent 检索/lint/backlink 每天在约 30 倍于工作集的内容上跑。拆库需要**同时在线**——只切换位置的话,你切到语料库翻资料时 Agent 也跟着切过去了。要点:① 三个模块各司其职(`wiki-registry` 清单/模式/动作、`wiki-instance` 单库运行时、`wiki-farm` 谁该在跑 + 会话作用域);② 模式开关 `wikis.json` 的 `mode`(缺省 `single`,升级用户逐字不变);③ 路由按库定向 `/tw/<id>/…`(每个库 seed 自己的同源基址——不区分 id 就会「页面显示 A、读写落在 B」),裸 `/tw/` 仍是默认库别名,为此引入**保留 id 名单**;④ **git 按仓库重构**:多库可共用一个仓库,`git add -A` 只允许一个 committer,pull 后只重启受影响的库;⑤ Agent 侧:会话单选作用域 + `agentVisible`,工具回执在可见库多于一个时**标明库名**,注入提示词**按会话求值**并读作用域库的 `prompt.*`;两条刻意拒绝(隐身库→忽略;没在跑→报错而非静默换库);⑥ GUI:输入框上方的会话选择器、FAB 的知识库分组、设置页「知识库列表」与**显式配置作用域**;⑦ **拆库引导** `docs/wiki-split.md` + 随包 skill(安装时只覆盖带标记的文件)。新增 6 个守门脚本(共约 96 条断言,含**真起两个 TW 子进程**与**真 git 仓库**两类集成验证),全部反向验证;4 个既有守门跟着间接层更新。**未做**:per-wiki 认证(`auth.*` 仍全局)、快速笔记目标切换策略。
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  > 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
6
6
 
7
+ - **v0.28.3**(2026-09-28):**修三个真机报障 + 插件说明补「多库 / 升级」两节**(作者拆库实测中发现)。① **单库模式下快速笔记露出一个没有选项的「写入」下拉** —— 根因是 **CSS 的 `hidden` 属性只是 `display:none`,任何显式 `display` 都能盖掉它**:我给 `.dsh-tw-note-wiki` 写了 `display:inline-flex`,于是 `hidden` 失效,那个空下拉照常渲染。修法两层:CSS 显式加 `[hidden]{display:none}`(且必须写在设 `display` 的那条**之后**,同优先级靠后者生效)+ 组件侧兜底(单库时 `disabled` 并直接 `display:none`)。② **会话级知识库选择器没有和输入框对齐** —— 根因是**规则只写在了一个使用者的内部**:找 composer 输入卡片、按差值补 `paddingRight` 的整套测量逻辑原本长在 `quick-note-dock.ts` 里,第二个 dock 条目加进来时没人知道要对齐。已抽成 `client/dock-align.ts`(`alignDockEntry`)两处共用,并守门断言「条目内不得再自带测量实现」。③ **左侧入口按库显示** —— 多库时每个**在运行**的库一个入口行、用各自的显示名;点该行**先切焦点库再开面板**(否则点 A 打开 B);当前焦点库有左侧标线。单库安装仍走原来那一行 + `ui.sidebarLabel`,逐字不变。④ **插件说明新增两节**:升级用户最大的困惑是"装完了不知道有这个东西",所以明确写了——升级后**不会自动变成多库**、行为与升级前一致;想用多库去哪点;`wikis.json` 在哪;旧 `location.json` 在哪些模式下还权威;每个库要有自己的 `tiddlywiki.info`。守门 `verify-wiki-focus` 扩到 19 条(`hidden` 那条已反向验证)。
7
8
  - **v0.28.2**(2026-09-28):**设置页去掉重复的「知识库位置」**(作者反馈:多库配置做完后它重复且逻辑冲突)。这一块的语义是「把**唯一的那个库**换到别处」——写的是 wiki 之外的指针文件 `location.json`,措辞也是单库时代的("切换到这个位置" / "恢复为配置默认")。现在**按模式二选一**:**单库模式**保留它(那里它是唯一正确入口);**多库模式整块不渲染**,某个库换目录收到「知识库列表」那一行的**「改目录」**(默认库经 `/admin/wiki/switch` → 改清单 + farm 收敛 + 校验;非默认库直接 `update`)。宿主接口**没有**冲突也**没有**改动:`/admin/wiki/switch|reset` 从 v0.28.0 起就按模式分派。守门:`verify-wiki-focus` 新增"多库模式下不得渲染该块"的断言;farm-boot 补上 location 面接线(22 条),保证藏了界面之后**接口仍按模式正确分派**。
8
9
  - **v0.28.1**(2026-09-28):**修「拆库 skill 在 wiki 启动慢 / 起不来时永远装不上」+ 快速笔记的目标库可切换(R7)**。① **真实事故**(作者升级 0.28.0 后重启宿主时发现,测试没拦住):技能安装写在了 `farm.startAll()` **之后**,而作者的知识库很大、TW 冷启动要几十秒 —— 于是"技能装没装"取决于"wiki 起得快不快";更糟的是 wiki 若因配置问题**永远起不来**,技能就永远不装,而它跟 wiki 毫无关系(只往 `$DSH_HOME/skills/` 写一个文件)。已挪到启动任务**最前面**,并新增**顺序守门**:`verify-skill-install` 断言 `installSplitSkill()` 出现在 `farm.startAll()` 之前(已反向验证:在安装前插一次 startAll → 该条红)。② **R7 快速笔记目标**:卡片新增「写入」目标库,**默认跟随 GUI 的焦点库**(你在看哪个库,快速笔记就进哪个库),卡片内可临时改且改过之后不再被焦点带走。设计的核心是**整张卡片一起换库** —— 标签建议(memo 以 URL 为键,换库自动重读)/ 最近列表 / 草稿读取 / 附件上传 / 保存 / 随后弹出的 TW 编辑器,六处全部经 `withWikiQuery()`(`?wiki=<id>`)与 `twProxyFor()` 定向;只改保存那一处会产出"标签列表来自 A、笔记写进 B",比不做还糟。目标库没在运行时卡片会**先讲清楚**("先在右下角「知识库」菜单里打开它"),而不是让用户写完一段再失败;这里刻意**不自动启动** —— 启动是「知识库」菜单的职责,保存路由顺手 spawn 进程不该由一次误点触发。单库安装不显示选择器、请求 URL 逐字不变。守门 `verify-wiki-focus` 扩到 16 条(含 `withWikiQuery` 的四条纯逻辑断言与"整张卡片同库"的源码级断言,已反向验证);`verify-tw-origin` 的弹窗接线断言跟着间接层更新(保留强度)。
9
10
  - **v0.28.0**(2026-09-28):**多知识库**——同一进程内可同时运行多个 TiddlyWiki,每个库独立配置、独立 git,Agent 侧按**会话**选择作用域,且每个库可对 Agent **彻底隐身**。起因是作者自己的库:`书籍` 语料 2468 条与日常笔记挤在一个 800MB 仓库里,Agent 的检索 / lint / backlink 每天在约 **30 倍于工作集**的内容上跑(「先窄后宽」是缓解不是解法)。而拆库必须**同时在线**——只切换位置的话,你切到语料库翻资料时 Agent 也跟着切过去了。**① 三个模块各司其职**:`host/wiki-registry.ts`(清单 / 模式 / 动作规则,纯函数)、`host/wiki-instance.ts`(**一个**库的运行时:TW 子进程 + REST 客户端 + 配置覆盖层 + fs 监听 + 自身自举)、`host/wiki-farm.ts`(**谁该在跑**:reconcile 规则 + 会话作用域解析);`apply()` 从"抱着一个实例"变成"驱动一个农场"。**② 模式开关**:`wikis.json` 的 `mode: 'single' | 'multi'`,**缺省 `single`** —— 升级用户的行为逐字不变(位置仍由旧指针文件 > cordis 默认决定,registry 此时只记住模式与候选列表)。**③ 路由按库定向**:`/tw/<id>/…`,且每个库把自己那份同源代理基址 seed 进**各自的** `$:/config/tiddlyweb/host`(TW 用它拼**所有** API URL;不区分 id 就会出现"页面显示 A、每次读写落在 B");裸 `/tw/` 保留为默认库别名(旧链接 / 书签 / 已 seed 的值都不失效)。为此引入**保留 id 名单**(`status`/`files`/`recipes`/`render`… 与 TW 自己的根路径撞名时无法区分,一律拒绝注册)。非代理路由统一吃 `?wiki=<id>`。**④ git 按仓库重构**:多个库可以共用**一个**仓库(按文件夹物理划分)。`git add -A` 在子目录执行也作用于整个工作树,所以自动提交必须**按仓库**去重(`host/repo-committers.ts`,提交在仓库根执行;`dir → repo` 只缓存**肯定**结果——否定结果缓存会让全新安装的自动提交永久静默失效);`pull()` 回传改动路径,**只重启内容真的变了的库**("这次 pull 改了东西"与"这个库快照过期了"是两个问题)。**⑤ Agent 侧**:会话级作用域(`$DSH_HOME/dsh-tiddlywiki/sessions.json`,单选,软失败——读不到就只是"没选过")+ `agentVisible`(**彻底隐身**:不进选择器、不进提示词、工具不可达)。工具按会话路由,且**可见库多于一个时每条回执都标明库名**(一处包装实现,不是改 15 个 render);注入提示词改为**按会话求值**(`PromptSection.text` 支持函数,DSH 每次装配传入该会话的 agent)并读**作用域那个库**的 `prompt.*`——单库安装的 slim 仍是 1918 字符,逐字节不变。**两条刻意的拒绝**:作用域指向隐身库 → 忽略(隐身是硬边界,过期选择不能绕过它);指向可见但**没在跑**的库 → **报错并带上库名**,绝不静默落到别的库(静默换库 = 笔记进了用户没指定的知识库而且看起来一切正常,这是本功能唯一真正危险的失败方式)。**⑥ GUI**:`/status` 回传知识库名册;输入框上方的**会话选择器**(只在可见库多于一个时存在);右下角「知识库」菜单的知识库分组(点开一个没在跑的库会**显式 POST** 启动它——代理路由绝不在 GET 里 spawn 子进程);设置页新增「知识库列表」(模式切换、增删改、启停、设为默认、可见性、开局自启、新增;「移出列表」明确写着**不删目录**)与**显式配置作用域**(每个库的配置在它自己的 tiddler 里,不说清就会出现"改了但不生效")。**⑦ 拆库引导**:`docs/wiki-split.md`(人读 + 顶部一整段**可直接复制给 Agent** 的话)+ 随包 skill `skills/wiki-split/SKILL.md`(启动时装到 `$DSH_HOME/skills/`;**只覆盖带标记的文件**,用户自己写的 skill 一个字节都不碰)。**守门**:新增 6 个脚本——`verify-wiki-registry`(18 条)、`verify-wiki-farm`(12 条,注入假实例钉死 reconcile)、`verify-wiki-farm-boot`(**22 条,真起两个 TW 子进程**)、`verify-session-scope`(13 条)、`verify-repo-keying`(11 条,**真 git 仓库**)、`verify-skill-install`(7 条)、`verify-wiki-focus`(13 条,真读 client 源码),**全部反向验证过**;另有 5 个既有守门(drain / language-pin / frame-guards / ready-policy / tw-origin / conflict-config)跟着间接层更新,同样保留强度并反向验证。**未做**:per-wiki `auth.*`(仍是全局)、快速笔记目标切换(目前写默认库也显示默认库,一致但不是最终形态)。