dsh-tiddlywiki 0.30.60 → 0.30.62

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/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  > 最近几个主要版本的一句话记录(完整变更见 [Releases](https://github.com/bbqisbbq/dsh-tiddlywiki/releases) / git log)。
6
6
 
7
+ - **v0.30.62**(2026-10-09):**第二轮审查的三类修复一次落地(回收站格式合并 / 会话作用域目录 / 剪藏目标库口径 + 提示词 −14% + 清理)**。全部改动都有行为级守门,且都做了反向验证。① **回收站:两种格式真正合并**。v0.30.59 的注释写着「legacy index is still READ so a wiki that has both keeps working」,代码却是 `trashbin !== undefined ? {entries: []} : readTrashIndex()` —— 于是**装了 trashbin 的库反而看不到内置条目**:work 库当时回收站里明明有 1 条内置索引条目,`trash list` 报「共 0 条」(本次实测复现)。现在两种格式**都读、合并列出**,恢复/清空按「这条来自哪种格式」记账(`fromIndex`)。② **`|` 分隔符会截断标题**:v0.30.60 的注释断言「TW 把 `|` 转义成 `&#124;`」——**实测为假**(`<$text text="a|b"/>` 原样渲染回 `a|b`;TW 的 htmlEncode 只转 `& < > "`),所以标题含 `|` 的副本会被拆成两段、列出**截断的标题**且恢复不了。改为用**自有标记 `<li>`** 分隔(标题里的 `<` 必被转义,不可能伪造标记),并把抽取逻辑拆成纯函数 `parseTrashbinFragment()`;顺手补上**实体还原**(`&lt;`/`&gt;`/`&quot;`/`&amp;`,`&amp;` 放最后才是无损的)⇒ 标题含 `<`/`&`/`"` 的副本现在也能正确列出与恢复。③ **恢复不再把副本的溯源字段留在笔记上**:`TRASHBIN_AT_FIELD` 在 v0.30.60 从 `trash-at` 改名成 `trash-iso`,而恢复路径只删新名字 ⇒ 恢复**任何 v0.30.60 之前的副本**(或内置格式快照)都会让 `trash-at` 留在恢复出来的笔记上(正是改名要躲的那种「TW 会重排成本地日期」的字段)。现在旧名字有具名常量 `TRASHBIN_LEGACY_AT_FIELD`,**列出时读、恢复时删**,内置格式的写入也统一用新常量。④ **`git_resolve` / `git_sync` 的目录改从会话作用域读**(`ToolScope.dir`):两者原来都走 `ToolsDeps.wikiPath()`,而它解析成**默认库** —— 于是「排干哨兵写进会话库、却在默认库目录里等文件」(多库且作用域≠默认时**必然** 12s 超时 + 假 `drainFailed`,而真正要验的库一行没验),`git_resolve` 不传 `wiki` 时会在**错的仓库**里 checkout+commit(回执示例恰好就是不带 `wiki` 的写法)。`ToolsDeps.wikiPath` 已删除(它没有 session 参数、只会误导)。⑤ **剪藏目标库口径统一**:`bridge.wiki` 指向**已登记但没在跑**的库时不再静默回落默认库(那正是「剪到别的库」的失败形态,而书签小工具根本不看回执里的库名),改为 **503 + 点名那个库**(与 `?wiki=` 路由自 v0.29.0 起的规则一致,`targetProblem()` 把句子带进响应体);**未知 id** 仍回落(老书签不能 404);书签的成功提示现在显示回执里的库 id;`bridge.*` 是**插件级**设置(读取它的是默认库那份 config),设置页因此只在「未选中具体库」的作用域里露出这一组,选中某个库时给一句说明 —— 否则在别的库的配置里改它是静默无效的(v0.28.8 起就存在的陷阱);seed 文档的配置表补上 `bridge.wiki` 这一行。⑥ **注入提示词 1011 → 866 字符(−14%,预算 1200 → 1000)**:写入约定压成「被拒后重读、别用 `force`」一句(`expectedModified`/`force` 的语义逐字在 `put` 的 schema 里)、同步那条去掉与 schema 重复的自动 commit 说明、intro 去掉「本机有一个知识库」这个**多库下就是错的**说法;同时**多库时正文会自动换成带库 id 的链接格式** `/tw/<id>/#标题`(裸 `/tw/` 在助手正文里跟随**焦点库**、写进笔记则把中央 TW 的 iframe 导航到**默认库**——两种都不是「本会话那个库」)。⑦ **清理**:删掉死代码 `messageKeys()`(注释自称有消费者,实际全仓 1 处引用=声明自身)、修掉三处过时注释(「尚无 i18n 分支」/「index.ts effectiveBridge」/两条被粘成一行的注释)、`tiddlywiki_status` 这个**不存在的工具名**从错误文案里去掉、删掉两个零引用的一次性迁移脚本(`push-notes-to-wiki.mjs` / `split-agents-to-wiki.mjs`)、`docs/code-review-*.md` 不再随 npm 包发布(`files` 加否定式 + 守门断言,实测 171 → 170 项)、`wechat.endpoint` 补进 `ResolvedConfig`/`STRING_CONFIG_PATHS` 两处形状、AGENTS.md §2 的行数清单去掉会漂移的数字。**守门**:`verify-trashbin-probe.mjs` 11 → **15 条**(新增「两种格式合并列出」「从索引恢复要摘掉索引记录」「恢复不得残留 `trash-at`」「含 `|`/转义标题的解析」)、新增 `scripts/verify-clip-target.mjs`(运行中/已登记未运行/未知 id/清单未就绪 + 端到端 503 文案,**这是 AGENTS 早就声称存在、实际为 0 的守门**)、`verify-git-multi-sync.mjs` 新增两条(哨兵必须落在会话库目录、`git_resolve` 缺省目标必须是会话库)、`verify-prompt.mjs` 新增多库链接用例。**反向验证**:去掉 `delete restored[TRASHBIN_LEGACY_AT_FIELD]` ⇒ 15 条里精确红 1 条;恢复后逐字一致。**环境事实(今天第二次踩到)**:运行时的 `profiles/*/node_modules/dsh-tiddlywiki` 必须显式升级,源码仓库改了不会自动生效。
8
+ - **v0.30.61**(2026-10-09):**修 `tiddlywiki_trash list` 少报一条 —— TW 给块级片段的首元素套 `<p>`** —— v0.30.60 实跑时 `list` 对**126 条**回收站报「共 125 条」,少的那一条**恰好是排序后的第一条**(实测片段为 `<p>$:/trashbin/__验收测试_trashbin软删除__|…`,而 `startsWith('$:/trashbin/')` 对带 `<p>` 的首条不成立)。**「列表少一条」是最坏的失败形态之一** —— 少的那条可能正是用户最想找的那条,而工具报告成功、不报错。现在改为**先定位前缀再剥标签**(`indexOf` 取到前缀处、再 `replace(/<[^>]*>/g,'')`),与首条是否被段落包裹无关。② 同时兼容旧字段名:`trash-iso` 是 v0.30.60 起的名字,**此前写的副本只带 `trash-at`**,不兼容读它时回执里「删除于」那一栏**整列为空**(实测);现在两个字段都读,`trash-iso` 优先。**守门** `scripts/verify-trashbin-probe.mjs` 增至 **11 条**,新增两条钉住上述两点;**反向验证**:去掉剥标签逻辑 ⇒ 红、改回 `\n` 拆分 ⇒ 红,各自精确点名,恢复后逐字一致。
7
9
  - **v0.30.60**(2026-10-09):**修 v0.30.59 的 `tiddlywiki_trash` 静默谎报「回收站是空的」** —— v0.30.59 发布后第一次实跑,`list` 就报「共 0 条」,而 wiki 里明明有 126 条 `$:/trashbin/` 副本。**两个独立缺陷叠在一起,缺一个都不会这么静默**:① `listTrashbin()` 的探针写成 `<$list … variable="ignore">` —— **`variable="ignore"` 会占用 `currentTiddler` 这个保留变量名**,于是循环体内的 `<$text text=<<currentTiddler>>/>` 全部绑到空上下文,实测返回 **126 个分隔符、零个标题**;② 分隔符原写成 `\n`,而片段是 **HTML**、换行会被折成空格,按 `\n` 拆会把整个列表当成**一行**,那行又过不了 `$:/trashbin/` 前缀检查。两者都产出 `[]`,而「空的回收站」是完全正常的答案 —— 于是工具**报告成功、同时撒谎**。③ 补一道自检:**有分隔符却零标题 = 探针坏了,必须显式报错**(不再回落成空列表)。④ 逐条 `wiki.get()` 改**有界并发(8)**:125 条串行就是 125 次 REST 往返。⑤ 溯源时间字段由 `trash-at` 改名 **`trash-iso`** —— TW 会把任何 `*-at`/`*-date` 字段当日期**重新序列化成本地格式**(实测 PUT 进去的 ISO 读回来是 `10/09/2026 05:11:54`),机器可读的值会丢。⑥ 配套发现并修正一处**流程事实**:`plugins/dsh-tiddlywiki`(源码仓库,0.30.59)与 `profiles/*/node_modules/dsh-tiddlywiki`(运行时实际加载,0.30.57)**是两份不同的副本** —— 改完源码 + 重启 DSH 不会生效,必须走发布流程(tag → npm publish → 升级运行时副本),这是 AGENTS.md §4 末尾第 8 步「同步线上 wiki」的真实含义。**守门**(新增 `scripts/verify-trashbin-probe.mjs`,进 `verify:unit`,8 条):钉住探针不含 `variable="ignore"`、必须输出 `<<currentTiddler>>`、必须按 `|` 拆而非换行、有分隔符零标题必须 throw、有界并发、字段名。**反向验证**:把 `variable="ignore"` 注回去 ⇒ 红;把 `|` 换回 `\n` ⇒ 红;恢复后逐字一致。
8
10
  - **v0.30.59**(2026-10-09):**软删除改为「跟着 wiki 已有的回收站机制走」;同时把一条会误导人的注释改成实测事实** —— 本机 work 库已装 [kookma/trashbin](https://github.com/kookma/TW-Trashbin)(v1.3.6,`$:/trashbin/<原标题>` + `$:/tags/trashbin` 标签),但 `tiddlywiki_delete` 此前**看不见它**:软删除一律写 `$:/dsh-tiddlywiki/trash/<时间戳>/<原名>` + JSON 索引,于是 agent 删掉的东西只有 agent 能列出/恢复,人在 TW 侧边栏里一条都看不到,两套回收站互不相通。现在:① `tools-support.ts` 新增 `hasTrashbin()` 探测(**只读**,不写探针 tiddler——那会在从不装 trashbin 的库里留垃圾,而它正是要检测的东西;判据是 `$:/tags/trashbin` / `$:/plugins/kookma/trashbin/sidebar-tab` **是否存在条目**,**不是查 `tiddlywiki.info`**——浏览器安装的 trashbin 压根不在 info 里(实测:服务器无 `plugin.info`、info 无登记,却照常工作),查 info 会在「恰恰装了它的库」上误报 false);② 命中时 `delete` 写 trashbin 格式副本(保留原 `created`/`modified`,另记 `trash-of`/`trash-iso`),**不再写 trash-index**,同名二次删除显式拒绝而非静默覆盖;③ 未命中时走原路径(未装 trashbin 的库行为不变)。**⚠️ 顺带修正一条错误的注释**(`tools-support.ts` 原先写「`$:/` 系统标题无法被枚举」,v0.30.58 之前 agent 据此连续三次误判,包括否掉一个实际可行的方案):实测证明「不可枚举」**只对 HTTP 列举端点成立**(`get-tiddlers-json.js` 给任何 filter 追加 `+[!is[system]]`,实测 `tiddlers.json` 恒 138 条、系统条目恒 0),而**filter 引擎无此限制**(服务端渲染 `[tag[$:/tags/trashbin]]` 得 `COUNT=125`)、**启动期 `store.area.template.html` 内嵌整个 store** 使客户端一开始就持有全部 tiddler——**三条通道必须分开说**,这也是 trashbin 格式不需要索引的根本原因。
9
11
  - **v0.30.58**(2026-10-09):**`tiddlywiki_git_sync` 不再要求显式配 `git.remote` —— 配置为空时回落到该库所在仓库自己的 `origin`**(作者 2026-10-09 裁定,方案 A)。起因是一个**同一个问题两个答案**的真实现场:设置页/FAB 的「同步」按钮一直是在目录里跑 `pull/commit/push`、按仓库 `origin` 推,而 Agent 工具把 `git.remote` 当成"开启同步"的开关 —— 同一个仓库,界面点得动、工具却回「没有任何知识库配置了 git.remote(同步远端)」并**整库跳过**(实测:本机 notes 仓库已推到远端、`git remote -v` 有 origin,工具仍报三个库皆未配置)。现在:① 判定改为「**`git.remote` 或仓库 `origin`**」,`git.remote` 降级为**覆盖**(也仍是 `ensureRemote` 写入的目标);② 回落**只在「没配 **且** 真在 git 仓库里」时发生** —— 不在仓库里就不白跑 `git`(新增 `GitFace.originOf()`,**只读、不建远端**);③ `GitSyncTarget` 新增 `remoteSource: 'config' | 'origin' | 'none'`,**回执逐仓库写出远端与来源**(「自动识别自仓库 origin」/「来自 git.remote 配置」),且 URL 里的**凭据先剥掉**(`git.remote` 可能带 PAT,`/admin/state` 对同一个值打码 —— 回执是新开的一条出口);④ `skipped` 分得清「未配 `git.remote`,仓库也没有 origin」与「不在 git 仓库里」,零目标时的文案同时给出两条出路;⑤ 设置页「git 远端」提示改为「空=自动用该库所在仓库的 origin」,`docs/features.md` / `docs/usage.md` / `AGENTS.md` 同步改写。**守门**:`scripts/verify-git-multi-sync.mjs` 新增「回落只在该回落时发生」(**假 farm + 假 GitFace 直接驱动 `createGitLayer().gitTargets()`**,断言 `originOf` 的**调用点集合**:有配置的不探、不在仓库的不探)、回执来源文案、凭据剥离、两种跳过原因;`scripts/verify-repo-keying.mjs` 用真临时仓库钉 `originOf()` 的三态(有 origin / 没有 / 不在仓库里)与「只读不建远端」。`createGitLayer` 因此进入公共面(`scripts/index-barrel-surface.json` 已更新)。**反向验证**:把回落那一行改回 `''` ⇒ 新守门当场点名 `personal` 的 `remoteSource`;恢复后逐字一致。**顺手修好一处既存红灯**:`AGENTS.md` §5 的开发文档索引还指着 2026-10-04 那次笔记整理里**已被合并删除**的 5 篇旧笔记(常见坑 / 架构事实 / 仓库布局 / 易变清单 / 发布流程),而 `scripts/verify-wiki-pointers.mjs` 正是为此存在 —— 指针已改指**整理后仍在的三篇**(《dsh-tiddlywiki 事实总表》《TiddlyWiki 使用与技巧事实总表》《拆库丢失的系统条目清单》)+ 仓库 `docs/CHANGELOG.md` / `docs/development.md`,§2 §4 §6 §7 里同样的旧名字一并改掉。**不恢复那些笔记**(删除是有意为之),`verify:sync` 因此恢复全绿。
package/docs/features.md CHANGED
@@ -16,7 +16,7 @@
16
16
  | 📍 **知识库位置可切换** | 设置页「知识库位置」可把插件切换到**任意本地文件夹**(不用改 cordis 配置、不用重装):就地停/起 TW 子进程,目标目录没有 `tiddlywiki.info` 时自动 `--init server` 建一个全新知识库;选择记在 `$DSH_HOME/dsh-tiddlywiki/location.json`——一个**在 wiki 之外**的指针文件(所以切到新 wiki 后仍记得「我用的是哪个」),「恢复为配置默认」一键清除;**切换失败自动回滚**到原知识库并如实告知(v0.22.0)。⚠️ 它一次只有一个库在线;要**多库同时在线**见上面的「多知识库」(v0.28.0) |
17
17
  | 🔄 **seed 更新检测** | seed 标记记录**内容哈希**:内置内容在本 wiki 预置之后更新过 → 设置页显示「⬆ 有更新」;被你改过 → 显示「✏️ 本地已修改」,且「重新初始化」前**二次确认**;两者都基于哈希判定,绝不猜(旧格式标记会明确显示「尚未启用更新检测」,不会误报为「你改过」,v0.22.0) |
18
18
  | 🎨 **自定义样式** | 「自定义样式」seed:编辑器美化 / 窄屏侧栏隐藏 / menubar 加高 / 批注弹窗等 5 张通用样式表,新 wiki 也能一键初始化(可选,v0.16.22) |
19
- | 📝 **可配置的注入提示词** | 插件注入每个会话的「TiddlyWiki 持久知识库」提示词可在设置页配置:**默认精简版**(v0.29.0 起 ~1.0KB,只保留工具 schema **表达不了**的约定——同步时机 / 写入被拒后重读而不用 `force` / 时效标注 / 淘汰权归人 / `human-edited` / 链接格式 / todo 约定),可选**完整版**(额外附一份**由工具注册表实时生成**的参数索引,不会再过期);`extra` 追加自定义规范、`override` 整段接管、可整体停用;**保存后无需重启 dsh web**(section 即时重注册,当前会话下一步即生效),设置页可**按表单当前值预览**即将注入的全文(未保存的形态切换也立刻可见,v0.21.0 / v0.22.7)。**v0.29.0 去重**:与工具 description 逐字重复的句子(工作区标记 / 先窄后宽 / 多词 AND / tags·type 保留规则)从提示词里删掉、**只留 schema 一份**,`verify-prompt.mjs` 改为在 schema 侧逐条断言「从提示词删 ≠ 丢了」 |
19
+ | 📝 **可配置的注入提示词** | 插件注入每个会话的「TiddlyWiki 持久知识库」提示词可在设置页配置:**默认精简版**(v0.30.62 起 **866 字符 / 预算 1000**,只保留工具 schema **表达不了**的约定——同步时机 / 写入被拒后重读而不用 `force` / 时效标注 / 淘汰权归人 / `human-edited` / 链接格式 / todo 约定),可选**完整版**(额外附一份**由工具注册表实时生成**的参数索引,不会再过期);`extra` 追加自定义规范、`override` 整段接管、可整体停用;**保存后无需重启 dsh web**(section 即时重注册,当前会话下一步即生效),设置页可**按表单当前值预览**即将注入的全文(未保存的形态切换也立刻可见,v0.21.0 / v0.22.7)。**v0.29.0 去重**:与工具 description 逐字重复的句子(工作区标记 / 先窄后宽 / 多词 AND / tags·type 保留规则)从提示词里删掉、**只留 schema 一份**,`verify-prompt.mjs` 改为在 schema 侧逐条断言「从提示词删 ≠ 丢了」。**v0.30.62 再瘦一轮**(1011 → 866 字符):写入约定压成「被拒后重读、别用 `force`」,intro 去掉多库下就不成立的「本机有一个知识库」;**多库时正文自动换成带库 id 的链接格式** `/tw/<id>/#标题` —— 裸 `/tw/` 在助手正文里跟随**焦点库**、写进笔记则把中央 TW 的 iframe 导航到**默认库**,两种都不是「本会话那个库」 |
20
20
  | 🌐 **中英双语界面**(v0.30.6) | 插件自己的界面(FAB / 侧边栏 / 快速笔记 / 工具卡片 / 设置页 / toast)与 TW 子进程**共用同一个 `uiLanguage` 设置**;文案按区域分片成 `i18n-*.ts` 的 `zh`/`en` 目录,守门保证两侧键集合一致、且**客户端代码里不再有硬编码中文文案** |
21
21
  | 🤖 **Agent 工具** | 15 个 `tiddlywiki_*` 工具:检索(**相关度排序 + 命中处片段 + 字段过滤**)、读写、**增量追加**、批量、重命名、**软删除/回收站**、**反向链接**、**附件入库**、**知识库体检**、git 同步与冲突解决(v0.30.5 起 `git_sync` **一次同步所有可同步的库**、按仓库去重、逐仓库独立成败;**v0.30.58 起「有远端」= 配了 `git.remote` **或**该库所在仓库自己的 `origin`**,配置为空即回落、回执写明远端与来源;v0.19.0;检索/最近仍在**服务端**排除二进制附件,大 wiki 上从 515MB/17s 降到 ~0.4s) |
22
22
  | 🛡️ **不会被覆盖的写入** | 所有写入路径(agent 工具 **与** 快速笔记/编辑器路由)都**先读后写**:不传 tags 就保留原有标签、自定义字段与**内容类型**(`text/css`/wikitext 等不会被重置成 Markdown,v0.20.1);`tiddlywiki_put(..., expectedModified/expectedRevision)` 与 `tiddlywiki_delete(..., expectedModified/expectedRevision)` 乐观并发——读取后若有人(在 TW 编辑器里)改过,写入/删除被拒绝(HTTP 409)而不是静默覆盖或丢进回收站;**给了哪个令牌就必须匹配哪个**(v0.23.5:两个令牌是 AND 不是 OR——`revision` 是 TW 的内存计数器、重启会复位,旧逻辑会因此静默放行跨重启的覆盖);`tiddlywiki_attach` 的同名标题**默认拒绝**(要覆盖必须 `force: true`);`tiddlywiki_delete` 默认**软删除进回收站**,`tiddlywiki_trash` 可恢复(v0.19.0 / v0.19.1 / v0.19.5 / v0.23.5)。**v0.25.0**:`tiddlywiki_append` / `tiddlywiki_rename` / `tiddlywiki_batch_put`(逐条目)也支持并发令牌——它们同样是「读全文 → 整篇回写」,此前**没有令牌可传**,而注入的提示词恰恰让模型回传 `expectedModified`;`tags: []` 现在表示**清空全部标签**(此前被当成「未传」而静默保留,模型按 lint 的 junk-tags 建议去清标签时什么都不会发生);`tiddlywiki_rename` 更新引用时若某个引用者在遍历期间被改动过,**跳过它**并在回执里报出数量,而不是覆盖它 |
package/docs/usage.md CHANGED
@@ -65,7 +65,7 @@
65
65
  - **🗂️ 右侧边栏 Tab**(v0.16.21):DSH 新右侧栏展开后,首页会出现「**TiddlyWiki 知识库**」入口盒,点击即在右侧栏以 tab 形式打开完整 TW 编辑器——**与聊天并排**,适合边聊边查/边记。由 `ui.showRightbarTab` 控制(默认开);老版本 DSH(无右侧栏)自动跳过。
66
66
  - **🧩 Better Sidebar 共存**:装了 [dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar) 时,插件只做 UI 共存(中央 TW 面板的 z-index 自动压在其侧边栏展开/收起按钮之下,按钮始终可点)。**v0.17.0 起不再向 dsh-better-sidebar 注册「TiddlyWiki 知识库」tab**(旧版可用 `ui.showBetterSidebarTab` 关闭)——该 tab 的 kind 会与其它注册方冲突报 `tab kind "dsh-tiddlywiki" is already registered`。右侧边栏入口请用上面的 **右侧边栏 Tab**(DSH 原生 rightbar)。
67
67
  - **📝 快速笔记**:输入框上方快捷按钮(`ui.showQuickNoteDock`)或 FAB;`ui.quickNoteMode` 选打开方式——**native**(默认,直达 TW 原生编辑页,草稿自动续写)或 **card**(CodeMirror 6 Markdown 高亮、文件上传、多选 tag、草稿自动保存、「🕘 最近」载入、Ctrl+Enter 保存)。**v0.22.6**:原生编辑弹窗里用 TW 的「🗑 删除」把笔记删掉后不会再变成打不开的白板——再点一次「快速笔记」就会重新载入编辑器;card 模式底部操作条改成「按钮文字永不折行、放不下时整组换行」,窄卡片里不再把「✏️ 在 TW 中编辑」压成两行。
68
- - **📌 本地剪藏桥**(可选,v0.16.24+/v0.16.25 支持图片):DSH 设置 → 常规配置 → 勾选「**启用本地剪藏桥**」(保存后立即生效)——DSH 即监听 `127.0.0.1:8618` 接收剪藏请求。浏览器书签栏新建书签,把知识库文档里的 JS 代码粘贴为地址,点一下弹出**浮层**:确认/修改标题与划线文字、勾选页面图片(封面自动标出)→「剪藏」即写入 wiki。文字成笔记(默认 `clip` 标签、正文含来源与选中文字、重名自动 `(2)` 去重);**图片由 DSH 本机下载字节存为二进制附件**(`clip-url`/`clip-note` 溯源字段,笔记内 `[img[标题]]` 内嵌展示;某张下载失败自动降级为链接),全部随 wiki 自动 git commit。「📚 插件文档」栏的 `本地剪藏桥(书签小工具)` seed 文档含完整步骤、书签代码、安全说明与 curl 用法。安全:桥只监听 127.0.0.1 + Host 白名单防 DNS rebinding;**强烈建议设 `bridge.token`**(非空时校验书签的 `x-clip-token` 头,防止任意网页往 wiki 里塞内容)。图片附件按设计不参与 `search`/`recent`(避免刷屏),`get` 只回元数据。**v0.28.8 起可指定写进哪个库**:`bridge.wiki`(设置页里是「剪藏写入」下拉,只在多库时才有意义)——**不指定 = 写进知识库列表里带 ★ 的那个库**(下拉里那一项直接显示那个库的名字 +「(默认)」,v0.28.12 起不再出现「默认库」这种无名选项);填了某个库的 id 就固定写它,与你在 GUI 里看的那个库无关(剪藏来自浏览器书签,没有"当前会话"可以跟随)。填了一个不存在的 id 时**不静默改落点**:`/clip` 回执带 `wiki` 字段说明实际落在哪,插件日志里也会提示一次。
68
+ - **📌 本地剪藏桥**(可选,v0.16.24+/v0.16.25 支持图片):DSH 设置 → 常规配置 → 勾选「**启用本地剪藏桥**」(保存后立即生效)——DSH 即监听 `127.0.0.1:8618` 接收剪藏请求。浏览器书签栏新建书签,把知识库文档里的 JS 代码粘贴为地址,点一下弹出**浮层**:确认/修改标题与划线文字、勾选页面图片(封面自动标出)→「剪藏」即写入 wiki。文字成笔记(默认 `clip` 标签、正文含来源与选中文字、重名自动 `(2)` 去重);**图片由 DSH 本机下载字节存为二进制附件**(`clip-url`/`clip-note` 溯源字段,笔记内 `[img[标题]]` 内嵌展示;某张下载失败自动降级为链接),全部随 wiki 自动 git commit。「📚 插件文档」栏的 `本地剪藏桥(书签小工具)` seed 文档含完整步骤、书签代码、安全说明与 curl 用法。安全:桥只监听 127.0.0.1 + Host 白名单防 DNS rebinding;**强烈建议设 `bridge.token`**(非空时校验书签的 `x-clip-token` 头,防止任意网页往 wiki 里塞内容)。图片附件按设计不参与 `search`/`recent`(避免刷屏),`get` 只回元数据。**v0.28.8 起可指定写进哪个库**:`bridge.wiki`(设置页里是「剪藏写入」下拉,只在多库时才有意义)——**不指定 = 写进知识库列表里带 ★ 的那个库**(下拉里那一项直接显示那个库的名字 +「(默认)」,v0.28.12 起不再出现「默认库」这种无名选项);填了某个库的 id 就固定写它,与你在 GUI 里看的那个库无关(剪藏来自浏览器书签,没有"当前会话"可以跟随)。填了一个不存在的 id 时**不静默改落点**:`/clip` 回执带 `wiki` 字段说明实际落在哪,插件日志里也会提示一次。**v0.30.62 起落点规则收严**:填的库**已登记但没在运行** ⇒ 剪藏直接失败(503)并**点名那个库**,不会偷偷写进默认库(书签的成功提示现在也会显示实际写进的库 id);只有 id **不在清单里**(已移出/打错)才回落默认库。⚠️ 这一组是**插件级**设置(整插件一个监听端口、一个写入目标,读取它的是默认库那份配置)⇒ 设置页只在**没选中具体库**时露出它,多库下选中某个库再改它是**不生效**的。
69
69
  - **🏠 首页(初始化 home-index 后)**:待办四象限(`todo` 标签 + `q` 字段拖放分类)+ 快速记笔记(完整编辑器,勾选「同时加入待办」即建任务)+「所有标签 / 所有文章」入口 +「📚 插件文档」栏(自动收录所有带 `dsh-docs` 标签的 seed 文档)。
70
70
  - **📚 会话知识库 Tab**:会话顶部 Tab(`ui.tabLabel` 改名、`ui.showSessionTab` 关闭),自动汇总本会话读写过的 wiki 笔记(写入 volatile `$:/temp`,不落盘不进 git),**TW 原生渲染**(v0.16.19 起 `/tw/render` 片段管线,与回复流工具卡同链路),链接点击直达中央 TW 面板,不可编辑。
71
71
  - **🌗 跟随 DSH 主题**:内嵌 TW 随 DSH 深浅切换 palette,纯内存不写回 wiki(`ui.followDshTheme`/`ui.darkPalette`)。