dsh-tiddlywiki 0.28.7 → 0.28.9

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.
Files changed (52) hide show
  1. package/README.md +3 -0
  2. package/docs/CHANGELOG.md +2 -0
  3. package/docs/features.md +4 -0
  4. package/docs/usage.md +13 -3
  5. package/lib/client.js +123 -27
  6. package/lib/index.js +10655 -10188
  7. package/lib/index.js.map +1 -1
  8. package/package.json +2 -2
  9. package/src/client/dom.ts +26 -0
  10. package/src/client/index.ts +14 -0
  11. package/src/client/note-widget-draft.ts +154 -0
  12. package/src/client/note-widget-tags.ts +184 -0
  13. package/src/client/note-widget-upload.ts +50 -0
  14. package/src/client/note-widget.ts +19 -348
  15. package/src/client/panel.ts +12 -3
  16. package/src/client/render-fetch.ts +11 -4
  17. package/src/client/scope-seat.ts +117 -0
  18. package/src/client/session-summary.ts +29 -7
  19. package/src/client/settings-icon-picker.ts +238 -0
  20. package/src/client/settings-page-catalog.ts +578 -0
  21. package/src/client/settings-page-config.ts +445 -0
  22. package/src/client/settings-page-runtime.ts +149 -0
  23. package/src/client/settings-page-wikis.ts +432 -0
  24. package/src/client/settings-page.ts +127 -1425
  25. package/src/client/styles.ts +96 -0
  26. package/src/client/tool-views.ts +170 -36
  27. package/src/client/wiki-icon.generated.ts +97 -0
  28. package/src/client/wiki-icon.ts +50 -15
  29. package/src/client/wiki-scope-dock.ts +56 -2
  30. package/src/client/wiki-scope.ts +98 -0
  31. package/src/host/admin-catalog.ts +488 -0
  32. package/src/host/admin-routes.ts +670 -0
  33. package/src/host/admin-secrets.ts +119 -0
  34. package/src/host/admin.ts +3 -1244
  35. package/src/host/clip-bridge.ts +24 -1
  36. package/src/host/config.ts +10 -2
  37. package/src/host/routes-session.ts +617 -0
  38. package/src/host/routes-tw-proxy.ts +390 -0
  39. package/src/host/routes.ts +77 -829
  40. package/src/host/tools-attach.ts +151 -0
  41. package/src/host/tools-git.ts +213 -0
  42. package/src/host/tools-notes.ts +672 -0
  43. package/src/host/tools-read.ts +421 -0
  44. package/src/host/tools-support.ts +513 -0
  45. package/src/host/tools.ts +33 -1814
  46. package/src/host/wiki-registry.ts +25 -4
  47. package/src/host/wiki.ts +55 -5
  48. package/src/index-clip.ts +142 -0
  49. package/src/index-git.ts +196 -0
  50. package/src/index-prompt.ts +139 -0
  51. package/src/index-wikis.ts +353 -0
  52. package/src/index.ts +89 -429
package/README.md CHANGED
@@ -67,6 +67,9 @@ dsh plugin --profile web add dsh-tiddlywiki
67
67
 
68
68
  ## 🕘 版本记录
69
69
 
70
+ - **v0.28.9**(2026-09-28):**修「点击图标没有正常弹出」**(作者重启后实测报障)。根因:v0.28.8 的图标弹层只写了 DOM 与接线,**`styles.ts` 里一条 CSS 都没有** —— 弹层照样被 append 到 `document.body`,但它是个无宽高约束的裸块、压在页面底部,视觉上就是「点了没反应」。现在补齐 `.dsh-tw-iconpicker`(含 `position:fixed`——它挂在 body 上,用 absolute 会被页面滚动带走)、8 列网格、格子(含当前项高亮)、分页器与按钮图标位共 12 条规则。**守门一并补强**:`verify-wiki-focus.mjs` 原先只断言「TS 源码里出现过 `dsh-tw-iconpicker` 这个字符串」—— 而 class 名当然会出现在 TS 里(它是 `make()` 的参数),所以组件没样式也照样绿。现在改为**双向**断言:弹层/网格/格子/分页器必须真有 CSS 规则,且 **picker 里 `make()` 出来的每个 `dsh-tw-*` 类都必须在 `styles.ts` 里有下落**(下次再加子元素忘写 CSS 会当场变红)。新断言已反向验证(删掉那段 CSS → 红)。顺带被这条新守门抓出第二处漏写:按钮文字位 `.dsh-tw-settings-iconbtn-label` 也没样式。教训:**断言「某个类名存在」不等于断言「这个组件可用」** —— 渲染型组件的守门至少要跨两个文件,一个说"我生成了这个 DOM",一个说"这个 DOM 有样式"。
71
+ - **v0.28.8**(2026-09-28):**多库第五批反馈:图标真能用了、设置页分页了、新会话也能选库了 + 拆大文件**(12 条反馈一次做完)。① **图标选择器用上 DSH 官方图标系统** —— 从 8 个手绘图标扩到 **36 个官方图标**(内联的是上游 path 数据:客户端是纯 DOM、零运行时依赖)+ 8 个自绘 + 一组 emoji,弹出网格 **48 个一页**分页。② **修「选了图标立刻变回默认」** —— 根因在 `/admin/wikis` 的**读取视图漏了 `icon` 字段**:写进去了、读回来是 `undefined`,客户端拿它重渲染就回落默认,看起来完全像"没保存"。补上该字段,并加**源码级守门**钉死它(去掉修复即红)。③ **多库下设置页分页**:十几块面板挤一页既分不清"改这个库"还是"改整个插件"、改完也没有退出口 —— 现在分「**总览 / 本库配置 / 全局**」三个 tab,「插件管理 / 主题管理 / 语言管理 / 初始化」这些 per-库面板**只在点了某个库的「配置」之后**才出现,按钮变成「**退出配置**」;单库安装没有 tab 条,逐字不变。④ **新会话也能选知识库**:选择器此前只长在输入框上方(新会话还没有输入框),现在挂在预设/模式选择旁边 —— 声明感知注入 + 2 秒回落 + `blankOnly`,两种布局不会同时出现两个。⑤ **剪藏可指定落哪个库**(`bridge.wiki`,设置页下拉,留空 = 默认库)。⑥ **回复流卡片、会话「知识库」Tab 按会话作用域取数**:不这样做会出现"A 库的标题在 B 库里渲染成空白卡片"。⑦ **桌面版能起 TW 了**:`process.execPath` 在桌面版里是 Electron,TW 根本起不来 —— 现在按 `DSH_TIDDLYWIKI_NODE` → `where/which node` → `execPath` 解析并缓存,行为级守门进 `verify:unit`。⑧ **代码清理**:`tools.ts` 1913→132、`admin.ts` 1265→24、`index.ts` 1407→1001、`note-widget.ts` 1245→916、`settings-page.ts` 1815→400(全部**纯搬移**,注册顺序与装配顺序逐字保持),并新增 `scripts/lib/source-family.mjs` 让 12 个守门按「模块族」读源码 —— 以后纯搬迁不会再假红。⑨ **复核确认无需改动的两条**:注入提示词本来就是**按会话求值**的(换库后下一步即生效,且读的是那个库自己的 `prompt.*`),15 个工具在多库下全部正常(回执在可见库 >1 时标明库名)。全链路复跑:`typecheck` / `verify:static` / `verify:unit` / `verify:e2e` / `verify:large` 全绿(含真起两个 TW 子进程、3100 条大库 64s)。
72
+ ① **图标选择器用上 DSH 官方图标系统** —— 从 8 个手绘图标扩到 **36 个官方图标**(内联的是上游 path 数据:客户端是纯 DOM、零运行时依赖)+ 8 个自绘 + 一组 emoji,弹出网格 **48 个一页**分页。② **修「选了图标立刻变回默认」** —— 根因在 `/admin/wikis` 的**读取视图漏了 `icon` 字段**:写进去了、读回来是 `undefined`,客户端拿它重渲染就回落默认,看起来完全像"没保存"。补上该字段,并加**源码级守门**钉死它(去掉修复即红)。③ **多库下设置页分页**:十几块面板挤一页既分不清"改这个库"还是"改整个插件"、改完也没有退出口 —— 现在分「**总览 / 本库配置 / 全局**」三个 tab,「插件管理 / 主题管理 / 语言管理 / 初始化」这些 per-库面板**只在点了某个库的「配置」之后**才出现,按钮变成「**退出配置**」;单库安装没有 tab 条,逐字不变。④ **新会话也能选知识库**:选择器此前只长在输入框上方(新会话还没有输入框),现在挂在预设/模式选择旁边 —— 声明感知注入 + 2 秒回落 + `blankOnly`,两种布局不会同时出现两个。⑤ **剪藏可指定落哪个库**(`bridge.wiki`,设置页下拉,留空 = 默认库)。⑥ **回复流卡片、会话「知识库」Tab 按会话作用域取数**:不这样做会出现"A 库的标题在 B 库里渲染成空白卡片"。⑦ **桌面版能起 TW 了**:`process.execPath` 在桌面版里是 Electron,TW 根本起不来 —— 现在按 `DSH_TIDDLYWIKI_NODE` → `where/which node` → `execPath` 解析并缓存,行为级守门进 `verify:unit`。⑧ **代码清理**:`tools.ts` 1913→132、`admin.ts` 1265→24、`index.ts` 1407→1001、`note-widget.ts` 1245→916、`settings-page.ts` 1815→400(全部**纯搬移**,注册顺序与装配顺序逐字保持),并新增 `scripts/lib/source-family.mjs` 让 12 个守门按「模块族」读源码 —— 以后纯搬迁不会再假红。⑨ **复核确认无需改动的两条**:注入提示词本来就是**按会话求值**的(换库后下一步即生效,且读的是那个库自己的 `prompt.*`),15 个工具在多库下全部正常(回执在可见库 >1 时标明库名)。全链路复跑:`typecheck` / `verify:static` / `verify:unit` / `verify:e2e` / `verify:large` 全绿(含真起两个 TW 子进程、3100 条大库 64s)。
70
73
  - **v0.28.7**(2026-09-28):**会话知识库选择器改成与「快速笔记」同一行 + 单库专属配置项不再在多库下出现**(两条都是作者报障)。① **选择器"没和对话框对齐"** —— 上次的修法方向就错了:`conversation.input.dock` 是**竖向 flex 列,一个条目独占一整行**,选择器和快速笔记是**两个条目**时永远是上下两行,怎么调内边距都不可能并排。现在选择器不再是独立条目,而是由快速笔记条目通过 `scope` 参数渲染在**自己这一行里**(按钮前面),整行统一与输入框右缘对齐,一行只测一次。顺手修掉合并时的一处遗留:选择器组件里还留着上一版的 `alignDockEntry` 自测,并入同一行后会把右内边距补两遍——已移除(`wiki-scope` 也从客户端 slot 表里消失,回归由 `verify-wiki-focus.mjs` 断言"input.dock 只能有一个条目"守住)。② **「侧边栏 TW 入口显示名称」在多库下不该出现** —— 多库时侧边栏是每个库各占一行、各用自己 `wikis.json` 里的显示名,`ui.sidebarLabel` 只喂单库那一行,所以多库下它是个**改了不生效的假配置项**。现在该字段只在单库模式渲染(多库时换成一行说明"去知识库列表改各自的显示名");模式探测失败**回落成单库**(保守:宁可多给一个真能用的字段,也不要因为一次请求失败把设置项藏了),并反向断言不许写成 `!== 'single'`(那会把未知模式误判成多库)。两条守门断言都做了反向验证。
71
74
  - **v0.28.6**(2026-09-28):**修两个多库界面的真机报障**。① **「插件管理 / 主题管理 / 语言包 / 初始化」看起来是混在一起管理的** —— 宿主侧一直是 per-request 解析目标库的(`deps.server(req)`/`config(req)`/`getClient(req)`),缺的是**客户端那一半**:设置页只有 `state`/`config`/`prompt` 三处带上了 `?wiki=`,而**插件信息与初始化 seed 的调用没带**,于是它们永远落在默认库上,「切了库、面板内容却没变」。现在 7 个 per-wiki 端点全部经 `withWiki()`,并有守门逐个断言(去掉任一处的作用域 → 红)。单库(未选库)时 `withWiki` 原样返回 URL,现有用户逐字不变。② **左侧入口点一个却三个都高亮** —— 我上一版把「面板是共享的」错解成「所有行一起高亮」,但面板一次只显示一个库(当前焦点库)。现在只有那一行点亮,并订阅焦点变化重算;单库默认行在面板打开时仍正常高亮。两条守门断言都做了反向验证。
72
75
  - **v0.28.5**(2026-09-28):**修「多库模式下侧边栏多出一个没有库名的 `TiddlyWiki` 入口」**(作者报障)。根因是**同一个 CSS 陷阱踩了第 12 次**:`hidden` 属性在 CSS 里只是 `display:none`,而 `.dsh-tw-entry` 有显式 `display:flex` —— **显式 display 盖掉了 hidden**,于是那行让位给每库入口的默认行照样渲染。这次不再给它单独补一条规则,而是**收敃成一条全局兜底** `[hidden] { display: none !important; }`,并删掉本仓库历史上为此在不同元素上各补的 **12 条逐元素规则**(面板 iframe / 错误块 / 快速笔记 / FAB 菜单与提示 / 右侧栏 / 目标库下拉 / 草稿栏 / 最近列表…)。守门同时改为断言「全局兜底存在 + 不允许再出现逐元素版本」,并反向验证(把全局规则改成挂在类名下 → 红)。
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.28.9**(2026-09-28):**修「点击图标没有正常弹出」**(作者重启后实测报障)。本版只有一个修复,但值得单独发一版:它暴露的是**守门的失效模式**,不是普通的漏写。① **现象**:设置页知识库列表里点「图标」,弹层没有出现。② **根因**:v0.28.8 的 `settings-icon-picker.ts` 生成了完整 DOM(弹层 / 网格 / 格子 / 分页器)、接线也对,**但 `styles.ts` 里一条 CSS 都没有** —— 弹层照样被 append 到 `document.body`,而它是个无宽高约束的裸块、压在页面最底部,视觉上就等于「点了没反应」。③ **修复**:补齐 12 条规则 —— `.dsh-tw-iconpicker`(含 `position:fixed`:弹层挂在 body 上,用 absolute 会被页面滚动带走、也受祖先 overflow 影响)、`min(420px, 100vw-24px)` 宽度与 `max-height` 上限、8 列网格、格子悬停与当前项高亮、名称省略(8 列必须对齐)、分页器分隔线,以及按钮的图标位与文字位。④ **守门为什么没拦住(本版最重要的部分)**:`verify-wiki-focus.mjs` 原本断言的是 `assert.match(settings, /dsh-tw-iconpicker/)` —— 检查「TS 源码里出现过这个字符串」。但**类名当然会出现在 TS 里**(它是 `make('div', 'dsh-tw-iconpicker')` 的参数),所以组件一条 CSS 都没有时这条断言照样绿。**通用教训:断言「某个类名存在」不等于断言「这个组件可用」。** 渲染型组件的守门至少要跨两个文件——一个说「我生成了这个 DOM」,一个说「这个 DOM 有样式」。⑤ **新守门(双向)**:弹层 / 网格 / 格子 / 分页器四个类必须真有 CSS 规则;并且从 picker 源码里**解析出所有 `make()` 生成的 `dsh-tw-*` 类名**,逐个要求它们在 `styles.ts` 里有下落 —— 这条通用网能拦住「下次再加子元素、又忘了写 CSS」。**已反向验证**:删掉那段 CSS → 红;恢复 → 绿。⑥ **新守门当场抓出第二处漏写**:按钮的文字位 `.dsh-tw-settings-iconbtn-label` 同样没有样式。⑦ 复核:`typecheck` / `build`(`client.bundle.js` 701305 → **704155 字节**,并确认 CSS 真进了 bundle)/ `verify:static` / `verify:unit` / `verify:e2e` / `verify:large` 全绿。
8
+ - **v0.28.8**(2026-09-28):**多库第五批反馈(12 条一次做完)+ 拆大文件**。① **图标选择器接上 DSH 官方图标系统**(反馈 1)—— 从 8 个手绘图标扩到 **36 个官方图标**:没有 `require` 上游的 React 图标组件(客户端是纯 DOM,那样会引入运行时依赖、还会让改名对不上),而是把**上游的 path 数据内联**进 `src/client/wiki-icon.generated.ts`(由 `scripts/gen-wiki-icons.mjs` 生成,`scripts/extract-dsh-icons.mjs` 是取图素材的开发助手);实心图标(data / plugin / settings / dark)与线性图标分两套渲染。弹出网格 **48 个一页**分页,另有 8 个自绘图标与一组 emoji。守门断言 host↔client 的图标名单**双向完全一致**(少一个即红)。② **修「选了图标立刻变回默认」**(反馈 2)—— 根因是 `/admin/wikis` 的**读取视图漏了 `icon` 字段**(`buildWikisView()` 逐字段手写,加字段时漏了一处):写进 `wikis.json` 了,读回来是 `undefined`,客户端拿它重渲染就回落默认图标 —— 症状"完全像没保存"。补上 `...(entry.icon !== undefined ? { icon: entry.icon } : {})`,并加**源码级守门**钉死该字段(去掉修复即红)。③ **多库下设置页按作用域分页**(反馈 3/4/11)—— 十几块面板挤一页,既分不清「改这个库」还是「改整个插件」,改完也找不到退出口。现在分「**总览 / 本库配置 / 全局**」三个 tab;「插件管理(自带官方插件)/ 主题管理 / 语言管理 / 初始化」这些 **per-库** 面板只在你点了某个库那一行的「配置」之后才出现(此前它们和全局项混排,看着像所有库共用一个设置);「配置」按钮变成**开关**(再点 = 退出配置),顶部「配置作用域」条一直显示正在改哪个库。**单库安装没有 tab 条**,就是原来那一页。④ **新会话也能选知识库**(反馈 9)—— 选择器此前只长在 `conversation.input.dock`(新会话还没有输入框)。现在挂在**预设/模式选择旁边**:先声明式探测 `conversation.input.selector.context`,2 秒内没等到就回落到 dock,两条路径带 `blankOnly` 互斥,不会同时出现两个。⑤ **剪藏可指定落哪个库**(反馈 8)—— 新增 `bridge.wiki` 配置与设置页下拉(留空 = 默认库)。剪藏来自浏览器书签、没有"当前会话"可以跟随,所以这里必须是**显式钉死**;填了不存在的 id 时 `/clip` 回执会带 `wiki` 字段说明实际落点,插件日志也提示一次。⑥ **回复流卡片与会话「知识库」Tab 按会话作用域取数**(反馈 7/10)—— 卡片取数 / 链接 / 缓存 key / 汇总的存在性探测与渲染全部带上会话作用域的那个库;不这样做会出现"A 库的笔记标题在 B 库里渲染成空白卡片"。工具卡片右上角还会显示库名徽标。⑦ **桌面版能起 TW**(反馈 12)—— TW 子进程需要真正的 `node`,而桌面版里 `process.execPath` 是 Electron。现在按 `DSH_TIDDLYWIKI_NODE` → `where node` / `which node` → `process.execPath` 的顺序解析并缓存,启动日志写明用了哪个;新增 `scripts/verify-desktop-node.mjs` 做**行为级**断言(进 `verify:unit`)。⑧ **复核后确认无需改动的两条**:注入提示词**本来就是按会话求值**的(`systemPrompt.section` 的 text 是函数,DSH 每次装配传入该会话的 agent,插件据此读作用域库的 `prompt.*`)—— 在输入框上方换库,**下一步**就生效,不需要重启或新开会话;15 个 `tiddlywiki_*` 工具在多库下全部正常(可见库 >1 时每条回执由一处包装统一标明库名)。单库安装两条都是逐字节不变。⑨ **代码清理**(反馈 5)—— `tools.ts` 1913→132、`admin.ts` 1265→24(barrel)、`index.ts` 1407→1001、`note-widget.ts` 1245→916、`settings-page.ts` 1815→400,**全部纯搬移**(15 个工具的注册顺序、`apply()` 的装配顺序、所有注释与字符串逐字保持)。配套新增 `scripts/lib/source-family.mjs`:`readFamily()` 把 `<base>.ts` 与 `<base>-*.ts` 拼成一份文本,12 个守门脚本改用它 —— **以后纯搬迁不再假红**(断言的是"规则"而不是"路径")。`verify-frame-guards` 的 runSwitch 断言跟着新形状更新(`disposed` → `deps.isDisposed()`),并顺手收紧成必须命中**那一条**消息(旁边 `repointDefault` 的「已取消修改」曾因前缀相同而误判通过),两条都做了反向验证。⑩ **文档**:`docs/usage.md` 补 `bridge.wiki` / 设置页分页 / 新会话选择器 / 每个库一个图标 / 桌面版 node;`docs/features.md` 补四条能力;README 顶部版本记录同步。**验证**:`npx tsc --noEmit` 全绿、`npm run build` OK(`client.bundle.js` 701305 字节 / 684.9 KB,远低于 900KB 闸门)、`verify:static` / `verify:unit`(26 个脚本)/ `verify:e2e` / `verify:large` 全绿(含 `WIKI FARM BOOT` 真起两个 TW 子进程、`LARGE WIKI` 3100 条 64s)。
7
9
  - **v0.28.7**(2026-09-28):**会话知识库选择器改成与「快速笔记」同一行 + 单库专属配置项不再在多库下出现**(两条都是作者报障)。① **选择器"没和对话框对齐"** —— 上次的修法方向就错了:`conversation.input.dock` 是**竖向 flex 列,一个条目独占一整行**,选择器和快速笔记是**两个条目**时永远是上下两行,怎么调内边距都不可能并排。现在选择器不再是独立条目,而是由快速笔记条目通过 `scope` 参数渲染在**自己这一行里**(按钮前面),整行统一与输入框右缘对齐,一行只测一次。顺手修掉合并时的一处遗留:选择器组件里还留着上一版的 `alignDockEntry` 自测,并入同一行后会把右内边距补两遍——已移除(`wiki-scope` 也从客户端 slot 表里消失,回归由 `verify-wiki-focus.mjs` 断言"input.dock 只能有一个条目"守住)。② **「侧边栏 TW 入口显示名称」在多库下不该出现** —— 多库时侧边栏是每个库各占一行、各用自己 `wikis.json` 里的显示名,`ui.sidebarLabel` 只喂单库那一行,所以多库下它是个**改了不生效的假配置项**。现在该字段只在单库模式渲染(多库时换成一行说明"去知识库列表改各自的显示名");模式探测失败**回落成单库**(保守:宁可多给一个真能用的字段,也不要因为一次请求失败把设置项藏了),并反向断言不许写成 `!== 'single'`(那会把未知模式误判成多库)。两条守门断言都做了反向验证。
8
10
  - **v0.28.6**(2026-09-28):**修两个多库界面的真机报障**。① **「插件管理 / 主题管理 / 语言包 / 初始化」看起来是混在一起管理的** —— 宿主侧一直是 per-request 解析目标库的(`deps.server(req)`/`config(req)`/`getClient(req)`),缺的是**客户端那一半**:设置页只有 `state`/`config`/`prompt` 三处带上了 `?wiki=`,而**插件信息与初始化 seed 的调用没带**,于是它们永远落在默认库上,「切了库、面板内容却没变」。现在 7 个 per-wiki 端点全部经 `withWiki()`,并有守门逐个断言(去掉任一处的作用域 → 红)。单库(未选库)时 `withWiki` 原样返回 URL,现有用户逐字不变。② **左侧入口点一个却三个都高亮** —— 我上一版把「面板是共享的」错解成「所有行一起高亮」,但面板一次只显示一个库(当前焦点库)。现在只有那一行点亮,并订阅焦点变化重算;单库默认行在面板打开时仍正常高亮。两条守门断言都做了反向验证。
9
11
  - **v0.28.5**(2026-09-28):**修「多库模式下侧边栏多出一个没有库名的 `TiddlyWiki` 入口」**(作者报障)。根因是**同一个 CSS 陷阱踩了第 12 次**:`hidden` 属性在 CSS 里只是 `display:none`,而 `.dsh-tw-entry` 有显式 `display:flex` —— **显式 display 盖掉了 hidden**,于是那行让位给每库入口的默认行照样渲染。这次不再给它单独补一条规则,而是**收敃成一条全局兜底** `[hidden] { display: none !important; }`,并删掉本仓库历史上为此在不同元素上各补的 **12 条逐元素规则**(面板 iframe / 错误块 / 快速笔记 / FAB 菜单与提示 / 右侧栏 / 目标库下拉 / 草稿栏 / 最近列表…)。守门同时改为断言「全局兜底存在 + 不允许再出现逐元素版本」,并反向验证(把全局规则改成挂在类名下 → 红)。
package/docs/features.md CHANGED
@@ -6,6 +6,10 @@
6
6
  |---|---|
7
7
  | 🏠 **文档中心起步包** | 首次安装自动 seed:插件说明 + 「示例与文档」(主题汇总模板 / 教程 / 三个示例主题页),首页「📚 插件文档」栏一键查阅;**同名 tiddler 已存在一律安全跳过,绝不覆盖你的数据**(v0.16.22);插件说明里的**工具清单由工具注册表实时生成**,不会再写着「10 个工具」却已经 15 个(v0.22.0) |
8
8
  | 🗂 **多知识库(v0.28.0)** | **多个 TiddlyWiki 同时在线**,每个库独立配置、独立 git 仓库(或共用仓库按文件夹物理划分 —— 「工作 + 个人」同仓、「书籍」独立仓,两种拓扑都支持)。开关是 `wikis.json` 的 `mode`,**缺省 `single`**:升级用户的行为逐字不变(位置仍由旧指针文件 > cordis 默认决定)。每个库有自己的编辑器与入口(右下角「知识库」菜单的分组、每个库自己的 `/tw/<id>/` 同源基址),设置页「知识库列表」负责增删改 / 启停 / 设为默认 / 开局自启 / 对 Agent 可见性;「移出列表」明确**不会删除目录**。快速笔记卡片也能选目标库(默认跟随你在 GUI 里看的那个库;**整张卡片一起换库**:标签建议 / 最近 / 附件 / 保存 / 弹窗编辑器同库)。 |
9
+ | 🎨 **每库图标用 DSH 官方图标系统(v0.28.8)** | 知识库列表里每行的图标是个**弹出式网格**:收录 **DSH 官方的 36 个图标**(内联的是上游的 path 数据,客户端保持纯 DOM、零运行时依赖)+ 本插件自绘的 8 个 + 一组 emoji,超出 **48 个一页**分页展示;选中即写入 `wikis.json` 的 `icon`。同时修掉一个真 bug:`/admin/wikis` 的读取视图漏了 `icon` 字段,导致「选了图标、界面立刻变回默认」(写进去了、读回来是 `undefined`)—— 守门钉死该字段并反向验证过。 |
10
+ | 📑 **设置页分页:总览 / 本库配置 / 全局(v0.28.8)** | 多库模式下十几块面板挤在一页里,既分不清「改这个库」还是「改整个插件」,改完也没有退出口。现在按作用域分成三个 tab:「**总览**」(名册 + 全局项)、「**本库配置**」(点某个库的「配置」才出现;按钮变成「**退出配置**」,再点一次就回到总览)、「**全局**」。「插件管理(自带官方插件)/ 主题管理 / 语言管理 / 初始化」这些**per-库**面板只在本库配置里渲染(此前它们混在全局项中,看着像所有库共用一个设置)。**单库安装没有 tab 条**,就是原来那一页,逐字不变。 |
11
+ | 🆕 **新会话也能选知识库(v0.28.8)** | 会话知识库选择器此前只长在输入框上方;空白会话(还没发过消息、输入框尚未出现)里它挂在**预设/模式选择旁边**。实现是**声明感知**的:DSH 声明了 `conversation.input.selector.context` 就注入那里,声明不到则 2 秒后回落到 dock,并带 `blankOnly` 保证两种布局不会同时出现两个。 |
12
+ | 🖥 **桌面版(DSH Desktop)能起 TW 了(v0.28.8)** | TW 子进程需要真正的 `node`,而桌面版里 `process.execPath` 是 Electron —— 以前直接拿它 spawn,TW 起不来。现在按 `DSH_TIDDLYWIKI_NODE` → `where node` / `which node` → `process.execPath` 的顺序解析并缓存,启动日志写明用了哪个;`scripts/verify-desktop-node.mjs` 以行为级断言守门(进 `verify:unit`)。 |
9
13
  | 🔒 **对 Agent 的可见性(v0.28.0)** | 每个库可设「对 Agent 隐身」= **彻底不可达**:不进会话选择器、不进注入提示词、`tiddlywiki_*` 工具永不触及(人在 GUI 里照常用它)。会话级作用域**单选**(输入框上方的选择器,选择存在 `$DSH_HOME/dsh-tiddlywiki/sessions.json` 并跨重启存活),工具按会话路由,**可见库多于一个时每条回执都标明库名**,注入提示词按会话求值并读**该库自己**的 `prompt.*`。两条刻意的拒绝:作用域指向隐身库 → 忽略(隐身是硬边界);指向可见但**没在跑**的库 → **报错并带上库名**,绝不静默落到别的库 —— 静默换库会让笔记落进你没指定过的库,而且看起来一切正常。 |
10
14
  | 🧩 **拆库引导(v0.28.0)** | 想把现有库按用途拆开(语料/归档 vs 工作集)时有一份现成流程:[docs/wiki-split.md](wiki-split.md) 顶部是**一整段可直接复制给 Agent 的话**;Agent 会先只读体检、再问五个问题(每个都给默认建议)、出方案表格等你确认,然后备份 → `git mv` 保历史 → 登记进插件 → 校验,**旧库一个都不删**。随包 skill `dsh-tiddlywiki-wiki-split` 会在启动时装进 `$DSH_HOME/skills/`(**只覆盖带标记的文件**,你自己写的 skill 不被碰),也可以直接说「用拆库 skill 帮我拆」。 |
11
15
  | 📍 **知识库位置可切换** | 设置页「知识库位置」可把插件切换到**任意本地文件夹**(不用改 cordis 配置、不用重装):就地停/起 TW 子进程,目标目录没有 `tiddlywiki.info` 时自动 `--init server` 建一个全新知识库;选择记在 `$DSH_HOME/dsh-tiddlywiki/location.json`——一个**在 wiki 之外**的指针文件(所以切到新 wiki 后仍记得「我用的是哪个」),「恢复为配置默认」一键清除;**切换失败自动回滚**到原知识库并如实告知(v0.22.0)。⚠️ 它一次只有一个库在线;要**多库同时在线**见上面的「多知识库」(v0.28.0) |
package/docs/usage.md CHANGED
@@ -54,6 +54,8 @@
54
54
 
55
55
  保存后**不用重启 dsh web**:host 会即时重新注册 prompt section,当前会话从**下一步**起就使用新文本(DSH 的 `system-prompt/change` 会更新历史里的系统消息)。设置页的「预览注入文本(按表单当前值)」按钮会把**表单里此刻的值**(含还没保存的形态切换 / extra / override / 停用开关)发给 host 实时拼成全文——所见即「保存后会注入的内容」,顶部还会标注「含未保存的修改」;预览是只读的,不会替你保存(v0.22.7 之前它只读**已保存**的配置,所以切换形态后不点保存直接预览会看到逐字节相同的旧文本,容易被读成「两种形态没差别」)。
56
56
 
57
+ > 🗂 **多库下这段提示词是"按会话求值"的**(v0.28.0 起就是这样,v0.28.8 复核确认):section 的文本是一个**函数**,DSH 每次装配系统提示词时把该会话的 agent 传进来,插件据此读那个会话的**作用域库**,并从**那个库自己**的 `$:/plugins/dsh-tiddlywiki/config` 里取 `prompt.*`。所以在输入框上方把知识库从 A 换成 B,**下一步**注入的就是 B 的提示词(连 B 自己的 `extra` / `override` 一起换)——不需要重启,也不需要新开会话。单库安装(可见库 ≤ 1)时那行"当前知识库"说明整段**不注入**,文本与升级前逐字节相同。
58
+
57
59
  > 为什么默认精简:v0.20.1 之前这段提示词里手抄了一份**工具参数清单**,最后一次同步停在 v0.19.0,而 v0.19.4 / v0.19.5 / v0.20.1 都改过工具参数——模型因此看到 6 处过期签名(`delete` 缺并发令牌、`append` 缺 `fields`、`attach` 缺覆盖保护、`batch_put` 缺 `overwrite`、`trash` 缺 `title`/`limit`、`list_tags` 缺 `limit`)。v0.21.0 起:默认形态不再复述参数(工具 description 才是唯一事实),`full` 形态的目录改为**运行时生成**,并新增 `scripts/verify-prompt.mjs` 守门(slim 不得出现参数清单 / full 的每个工具与每个参数都必须在场 / 两种形态都必须保留治理约定块)。
58
60
 
59
61
  ### 🧑‍💻 界面操作
@@ -63,12 +65,12 @@
63
65
  - **🗂️ 右侧边栏 Tab**(v0.16.21):DSH 新右侧栏展开后,首页会出现「**TiddlyWiki 知识库**」入口盒,点击即在右侧栏以 tab 形式打开完整 TW 编辑器——**与聊天并排**,适合边聊边查/边记。由 `ui.showRightbarTab` 控制(默认开);老版本 DSH(无右侧栏)自动跳过。
64
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)。
65
67
  - **📝 快速笔记**:输入框上方快捷按钮(`ui.showQuickNoteDock`)或 FAB;`ui.quickNoteMode` 选打开方式——**native**(默认,直达 TW 原生编辑页,草稿自动续写)或 **card**(CodeMirror 6 Markdown 高亮、文件上传、多选 tag、草稿自动保存、「🕘 最近」载入、Ctrl+Enter 保存)。**v0.22.6**:原生编辑弹窗里用 TW 的「🗑 删除」把笔记删掉后不会再变成打不开的白板——再点一次「快速笔记」就会重新载入编辑器;card 模式底部操作条改成「按钮文字永不折行、放不下时整组换行」,窄卡片里不再把「✏️ 在 TW 中编辑」压成两行。
66
- - **📌 本地剪藏桥**(可选,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` 只回元数据。
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`(设置页里是「剪藏写入」下拉,只在多库时才有意义)——留空 = 默认库;填了某个库的 id 就固定写它,与你在 GUI 里看的那个库无关(剪藏来自浏览器书签,没有"当前会话"可以跟随)。填了一个不存在的 id 时**不静默回落默认库**:`/clip` 回执带 `wiki` 字段说明实际落在哪,插件日志里也会提示一次。
67
69
  - **🏠 首页(初始化 home-index 后)**:待办四象限(`todo` 标签 + `q` 字段拖放分类)+ 快速记笔记(完整编辑器,勾选「同时加入待办」即建任务)+「所有标签 / 所有文章」入口 +「📚 插件文档」栏(自动收录所有带 `dsh-docs` 标签的 seed 文档)。
68
70
  - **📚 会话知识库 Tab**:会话顶部 Tab(`ui.tabLabel` 改名、`ui.showSessionTab` 关闭),自动汇总本会话读写过的 wiki 笔记(写入 volatile `$:/temp`,不落盘不进 git),**TW 原生渲染**(v0.16.19 起 `/tw/render` 片段管线,与回复流工具卡同链路),链接点击直达中央 TW 面板,不可编辑。
69
71
  - **🌗 跟随 DSH 主题**:内嵌 TW 随 DSH 深浅切换 palette,纯内存不写回 wiki(`ui.followDshTheme`/`ui.darkPalette`)。
70
72
  - **🔧 知识库 FAB**:统一入口(TW 面板开关/重载、快速笔记、同步、TW 服务状态悬停 tip)。同步拉取到新内容会自动重启 TW(同端口)。
71
- - **⚙️ 设置页**:DSH 设置 →「TiddlyWiki 知识库」:状态/重启、**知识库位置(可切换)**、常规配置、插件/主题/语言管理(**自带官方插件**的离线启停;经 TW 面板装的第三方插件以只读小节列出,见 v0.26.0)、**初始化**(seed 状态与重新初始化)。配置写入 `$:/plugins/dsh-tiddlywiki/config` tiddler,覆盖 cordis `config:` 块(tiddler 优先)。
73
+ - **⚙️ 设置页**:DSH 设置 →「TiddlyWiki 知识库」:状态/重启、**知识库位置(可切换)**、常规配置、插件/主题/语言管理(**自带官方插件**的离线启停;经 TW 面板装的第三方插件以只读小节列出,见 v0.26.0)、**初始化**(seed 状态与重新初始化)。配置写入 `$:/plugins/dsh-tiddlywiki/config` tiddler,覆盖 cordis `config:` 块(tiddler 优先)。**v0.28.8 起分页**:多库模式下页面分成「**总览** / **本库配置** / **全局**」三个 tab——原来十几块面板从上到下挤在一页里,既看不出哪些是"改这个库"、哪些是"改整个插件",改完也找不到退出口。现在:① 点某个库那一行的「**配置**」进入「本库配置」tab,按钮变成「**退出配置**」(再点一次回到总览,不用滚回页面顶部);② 顶部「**配置作用域**」条一直显示正在改哪个库;③ 单库安装**没有 tab 条**,就是现在这一页,逐字不变。
72
74
 
73
75
  ### 🗂 多知识库(同时在线,v0.28.0)
74
76
 
@@ -91,12 +93,19 @@
91
93
 
92
94
  - **每个库有自己的一套设置**:笔记标签、语言、主题、`prompt.*` 都在该库自己的
93
95
  `$:/plugins/dsh-tiddlywiki/config` 里。设置页顶部会显示「**配置作用域**:…」,点某个库那一行的
94
- 「配置」即可改它的设置 —— 作用域不说清就会出现"改了但不生效"。
96
+ 「配置」即可改它的设置 —— 作用域不说清就会出现"改了但不生效"。**v0.28.8 起按模式分流**:多库时
97
+ 「插件管理(自带官方插件)/ 主题管理 / 语言管理 / 初始化」这些**per-库**的面板收进「**本库配置**」
98
+ tab,只有你点了某个库的「配置」之后才出现(此前它们和全局项混在同一页,看着像"所有库共用一个设置");
99
+ 「总览」tab 只放名册与全局项(端口、git 默认、桥、微信发布…)。单库模式仍是原来的一页。
95
100
  - **git 按仓库生效**:多个库可以共用**一个**仓库(例如「工作」+「个人」放在 `D:/notes/` 下的两个子
96
101
  目录),也可以各自独立仓库。共用仓库时**只有一个自动提交者**(`git add -A` 会作用于整个工作树),
97
102
  `git.*` 以该仓库下**列表里第一个库**为准、配置不一致时打印警告;pull 之后**只重启内容真的变了的库**。
98
103
  - **快速笔记的目标库**:卡片里有一个「写入」下拉,**默认跟随你在 GUI 里看的那个库**(右下角菜单切换焦点库,它就跟着变);在里面手动选过之后,这张卡片就不再被焦点带走。改目标库是**整张卡片一起换**——标签建议、最近列表、附件上传、保存、以及随后弹出的 TW 编辑器都会落到同一个库。目标库没在运行时卡片会先提示你,而不是等你写完再失败。
99
104
  - **「移出列表」不删目录**:只是让插件不再管理它,内容原样保留。
105
+ - **每个库一个图标**(v0.28.8):知识库列表每行的图标是个**弹出式网格**——里面是 **DSH 官方的 36 个图标**(与侧边栏/工具栏那套同源,深浅主题都对)、本插件自绘的 8 个(书籍 / 公文包 / 首页 / 笔记本 / 烧瓶 / 地球 / 星标 / 归档),外加一组 emoji 快捷选择;图标多了按 **48 个一页**翻页。选中即写入 `wikis.json` 的 `icon` 字段。当前值若不在候选里(比如你手写的短 emoji)会原样保留,不会被候选列表抹掉。**v0.28.8 同时修了一个真 bug**:此前选了图标界面会立刻变回默认 —— `/admin/wikis` 的读取视图漏了 `icon` 字段,于是"写进去了、读回来是 undefined",看起来就是没生效(现在有守门钉死这个字段,反向验证过)。
106
+ - **还没发过消息的新会话也能选库**(v0.28.8):选择器此前只长在输入框上方;新会话(空白页,输入框还没出现)时它挂在**预设/模式选择旁边**,位置由声明决定、声明不到就 2 秒后回落,两种布局不会同时出现两个。
107
+ - **会话「知识库」Tab 在多库下按会话作用域取数**(v0.28.8):汇总只统计**该会话作用域那个库**里的笔记;不这样做就会出现"A 库的笔记标题在 B 库里渲染成空白卡片"。
108
+ - **桌面版(DSH Desktop)**(v0.28.8):TW 子进程需要真正的 `node`。以前直接拿 `process.execPath` —— 在桌面版里那是 Electron 可执行文件,TW 根本起不来。现在先按 `DSH_TIDDLYWIKI_NODE` 环境变量、再 `where node` / `which node`、最后才回落 `process.execPath`;解析结果缓存,并在启动日志里写明用了哪个。
100
109
  - **清单文件**:`$DSH_HOME/dsh-tiddlywiki/wikis.json`(在每本 wiki 之外,所以它不会随某个库被搬走)。
101
110
  手写时注意:`id` 只能用小写字母/数字加 `._-`,且不能是 `status`/`files`/`recipes`/`render` 这类与 TW
102
111
  根路径撞名的保留字;两个库不能指向同一目录,**也不能互相嵌套**(外层库的 `git add -A` 会把内层内容
@@ -208,6 +217,7 @@ seed 是把「wiki 里预置内容」随插件分发的机制:**ONE-SHOT(只
208
217
  port: 8618 # 监听端口(127.0.0.1;改后需重启 dsh web 才绑定新端口)
209
218
  token: "" # 共享口令;非空时校验书签的 x-clip-token 头(强烈建议设置)
210
219
  tag: "clip" # 剪藏笔记默认 tag
220
+ wiki: "" # 剪藏写进哪个库(v0.28.8):空 = 默认库;多库时可钉死到某个 id
211
221
  ui:
212
222
  showQuickNote: true # FAB 里显示快速笔记入口
213
223
  showQuickNoteDock: true # 输入框上方快捷按钮