dsh-tiddlywiki 0.11.0 → 0.13.0

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
@@ -23,7 +23,7 @@
23
23
  | 🌗 **跟随 DSH 主题** | 嵌入式 TW(中央面板 +「在 TW 中编辑」弹窗)**自适应 DSH 深浅主题**:暗色自动切深色 palette、浅色恢复原 palette;**纯内存切换,不写回 wiki、不进 git**;设置页可关可换深色 palette |
24
24
  | 📝 **快速笔记** | 右下角「知识库」悬浮按钮 → 快速笔记卡片:**CodeMirror 6** Markdown 编辑器(语法高亮 + 撤销/重做)、文件上传、多选/自动补全 tag、**草稿自动保存(刷新不丢)**、**「🕘 最近」一键载入旧笔记**,Ctrl+Enter 保存;可整体隐藏 |
25
25
  | 🔄 **一键同步** | 「知识库」按钮 →「🔁 同步」:pull → commit → push;FAB 上的状态点实时反映 git 状态(已同步/待提交/可更新/离线) |
26
- | ⚙️ **设置页** | DSH 设置 →「TiddlyWiki 知识库」:插件/主题/语言管理与运行配置,应用后自动重启 TW;**「初始化」区块**列出所有一次性预置项(说明笔记/发送按钮/首页/同源代理基址)的实时状态,可随时手动**重新初始化** |
26
+ | ⚙️ **设置页** | DSH 设置 →「TiddlyWiki 知识库」:插件/主题/语言管理与运行配置,应用后自动重启 TW;**「初始化」区块**列出所有一次性预置项(说明笔记/发送按钮/首页/所有文章/**menubar 顶栏主题自适应**/同源代理基址)的实时状态,可随时手动**重新初始化**;**「所有文章」每页条数**可在配置里调整(实时生效,无需重新初始化) |
27
27
  | 🛡 **零摩擦生命周期** | 随 dsh 自动启停;TW 子进程崩溃自动重启(退避);端口/目录/首次 git init 全自动 |
28
28
  | 💾 **数据即备份** | wiki 文件夹本身就是一个 git 仓库;自动 commit(60s 防抖,可关),配置随 dsh-market 迁移 |
29
29
 
@@ -33,6 +33,8 @@
33
33
 
34
34
  > 最近几个主要版本的一句话更新记录(完整变更见 git log / Releases)。
35
35
 
36
+ - **v0.13.0**(2026-09-04):**menubar 顶栏主题自适应**。tiddlywiki/menubar 顶栏背景原来一直停在默认色映射的蓝色(`$:/config/DefaultColourMappings/` → `#5778d8`),不随 DSH 深浅主题变化——根因是大部分浅色 palette(Vanilla/Blanca…)不定义 `menubar-background`,`<<colour menubar-background>>` 落回插件硬编码的蓝色。新增 seed `menubar-theme`:写入样式表覆盖 `$:/plugins/dsh-tiddlywiki/menubar-theme`(tag `$:/tags/Stylesheet`),把顶栏改为跟随**活动 palette** 的 `background`/`foreground`(`!important` 压过插件自身规则);嵌入式 TW 的 `$:/palette` 由主题同步随 DSH 翻转时,TW 会实时重渲染全部样式表,menubar 即自动换色。作为新 seed 进统一注册表(`menubar-theme`),首次启动自动写入(ONE-SHOT,不覆盖你的改动),设置页「初始化」可单独/全部**重新初始化**。
37
+ - **v0.12.0**(2026-09-04):**新默认主页「主页」+ 「所有文章」两列分页页**。把首页拆成三页:**主页**(默认打开,`$:/DefaultTiddlers` 指向它)= 四象限待办 + 「所有标签」「所有文章」入口;**所有标签**瘦身为独立标签统计页(标签 + Agent 区块 + 回主页链接);新增 **所有文章**——全部条目分两列(🤖 Agent 撰写 / 👤 人工·人类,含 `human-edited` 的 Agent 笔记)**各自分页**展示(排除系统页、草稿与 `索引` 导航页),每页条数取配置 `ui.allArticles.pageSize`(默认 10,设置页可调、实时生效)。**所有文章**作为新 seed 进统一注册表(`all-articles`),设置页可单独/全部**重新初始化**。
36
38
  - **v0.11.0**(2026-09-04):TW「**发送给 Agent**」选择器新增**「工作模式」(Agent 预设)**——弹层顶部可选择会话挂载的 Agent 预设(如 默认/cordis/blade,来自 DSH `agentPresets`),**新建工作区/会话并发送**时以所选模式创建(`/agent/create` 新增 `mode` 参数 → `sessionController.create(agentPreset)`);已有会话显示其当前模式(`🧭` 徽标)。新增 `GET /agent/modes` 返回可用模式清单 + 部署默认。对旧宿主**向后兼容**:模式接口缺失时选择器降级为默认模式,功能不受影响。
37
39
  - **v0.10.0**(2026-09-04):**统一 seed 注册表**——把「与 dsh 联动、需要 wiki 预置」的全部一次性项收进 `SEED_DEFS`(说明笔记、发送给 Agent 按钮、**首页「所有标签/标签笔记」**、**TW 前端同源代理基址**),首次启动只写缺失、不覆盖用户内容;设置页新增「**初始化**」区块:列出每项实时状态 + 手动「**重新初始化**」(force 重写内置内容,含缺失项补齐与 TW 前端基址修复)。新装用户开箱即有**首页**(四象限待办 + 标签统计 + Agent 区块),不再手工放 tiddler。配套文档:[🧩 初始化小节](#🧩-初始化一次性预置) + [docs/seed-initialization.md](docs/seed-initialization.md)。
38
40
  - **v0.9.0**(2026-09-04):TW「**发送给 Agent**」按钮随插件**首次启动自动写入 wiki**(ONE-SHOT:只写一次、用户可删可改不复活)——新装用户开箱即用,无需手工往 wiki 塞插件 bundle;消息格式更新:**去掉 `【TiddlyWiki 笔记一键发送】` 前缀**,并**附加待办说明**告知 Agent 这是用户提前编辑在 wiki 中的待办事项、不清楚应主动提问。
@@ -59,7 +61,7 @@ dsh plugin --profile web add github:bbqisbbq/dsh-tiddlywiki
59
61
  dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
60
62
  ```
61
63
 
62
- 首次启动会自动完成:**初始化 wiki 目录**、**`git init` 并提交基线**、把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见「初始化」):向 wiki **写入一次**「dsh-tiddlywiki 插件说明」笔记(tag `docs`)、**写入一次**「发送给 Agent」TW 按钮插件(`$:/plugins/dsh/send-to-agent`)、**写入首页**「所有标签 / 标签笔记」(四象限待办 + 标签统计 + Agent 区块)、把 `$:/config/tiddlyweb/host` 指向同源代理。它们都是 ONE-SHOT:只写缺失、不覆盖你的改动、删掉重启也不会自动恢复——需要时可在设置页「**初始化**」区块手动「重新初始化」(force 重写内置内容)。
64
+ 首次启动会自动完成:**初始化 wiki 目录**、**`git init` 并提交基线**、把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见「初始化」):向 wiki **写入一次**「dsh-tiddlywiki 插件说明」笔记(tag `docs`)、**写入一次**「发送给 Agent」TW 按钮插件(`$:/plugins/dsh/send-to-agent`)、**写入默认主页**「主页 / 所有标签 / 标签笔记」(四象限待办 + 入口 + 标签统计 + Agent 区块,并把 `$:/DefaultTiddlers` 指向主页)、**写入「所有文章」两列分页页**、**写入「menubar 顶栏主题自适应」样式表**(`$:/plugins/dsh-tiddlywiki/menubar-theme`,随 DSH 主题换色)、把 `$:/config/tiddlyweb/host` 指向同源代理。它们都是 ONE-SHOT:只写缺失、不覆盖你的改动、删掉重启也不会自动恢复——需要时可在设置页「**初始化**」区块手动「重新初始化」(force 重写内置内容)。
63
65
 
64
66
  ---
65
67
 
@@ -148,7 +150,7 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
148
150
  | 插件管理 | 自带官方插件勾选(可搜索)→ 应用并自动重启 TW |
149
151
  | 主题管理 | 自带主题**多选加载 + 单选活动** → 应用并自动重启 TW |
150
152
  | 语言管理 | 自带官方语言包勾选(含 zh-Hans 简体)→ 应用并自动重启 TW |
151
- | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/同源代理基址)→ 每项「重新初始化」+ 「全部重新初始化」 |
153
+ | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/所有文章/menubar 顶栏主题自适应/同源代理基址)→ 每项「重新初始化」+ 「全部重新初始化」 |
152
154
 
153
155
  - 配置写入 wiki 内的 `$:/plugins/dsh-tiddlywiki/config` tiddler(JSON),随 git 同步,作为 **cordis `config:` 块之上的覆盖层**(tiddler 优先)。
154
156
  - git 类配置修改后**重启 dsh web 生效**(bootstrap 时读取)。
@@ -169,13 +171,15 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
169
171
  |---|---|---|---|
170
172
  | `doc-note` | 「dsh-tiddlywiki 插件说明」笔记(tag `docs`) | 新手引导 | marker 门控:只写一次,删掉重启不复活 |
171
173
  | `send-to-agent` | 「发送给 Agent」TW 按钮插件 `$:/plugins/dsh/send-to-agent` | 一键把笔记注入 dsh 会话的入口 | 同上 |
172
- | `home-index` | 首页「所有标签 / 标签笔记」 | **系统提示承诺的首页**:四象限待办 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上 |
174
+ | `home-index` | 默认主页「主页 / 所有标签 / 标签笔记」+ `$:/DefaultTiddlers` → 主页 | **系统提示承诺的首页**:四象限待办 + 「所有标签」「所有文章」入口 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上 |
175
+ | `all-articles` | 「所有文章」——两列(🤖 Agent 撰写 / 👤 人工·人类)各自分页 | 全部条目的分栏总览;每页条数实时读 `ui.allArticles.pageSize`(设置页可调) | 同上 |
176
+ | `menubar-theme` | `$:/plugins/dsh-tiddlywiki/menubar-theme` 样式表(tag `$:/tags/Stylesheet`) | 把 tiddlywiki/menubar 顶栏从默认蓝色改为跟随活动 palette 的 `background`/`foreground`,随 DSH 深浅主题自动换色(嵌入式 TW 主题跟随机制) | 同上 |
173
177
  | `tw-web-host` | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 嵌入式 TW 编辑器的同源代理 API 基址(远程访问模式前提) | 非 force = 缺失/旧默认才写、用户自定义保留;force = 强制写回代理基址 |
174
178
 
175
179
  **用法**:
176
180
  - **查看状态**:设置页 →「初始化」→ 每项一个状态点(✓ 已就绪 / ✗ 缺失)+ 说明。
177
- - **重新初始化单项**:点该项「重新初始化」——force 重写内置内容(覆盖你对该 tiddler 的改动)并重记 marker,用于「我把首页改坏了想恢复模板」「按钮被我删了想补回」等场景。
178
- - **全部重新初始化**:底部「全部重新初始化」一键重跑全部四项。
181
+ - **重新初始化单项**:点该项「重新初始化」——force 重写内置内容(覆盖你对该 tiddler 的改动)并重记 marker,用于「我把首页改坏了想恢复模板」「按钮被我删了想补回」「menubar 又变回蓝色了」等场景。
182
+ - **全部重新初始化**:底部「全部重新初始化」一键重跑全部。
179
183
  - **为什么删掉重启不会自动恢复**:ONE-SHOT marker(`$:/plugins/dsh-tiddlywiki/seed-*`)记录「已提供过」,之后归用户所有——想恢复请手动「重新初始化」,而非依赖重启。
180
184
 
181
185
  详细设计(后台 API、force 语义、如何重新生成内置常量)见 [docs/seed-initialization.md](docs/seed-initialization.md)。
@@ -259,14 +263,15 @@ npm run typecheck # tsc --noEmit
259
263
  npm run build # clean + host tsdown + client tsdown + wrap
260
264
  npm run selftest # headless:spawn TW → REST 读写 → git → 退出回收
261
265
  node scripts/verify-theme-browser.mjs # 可选:真实浏览器验证「跟随 DSH 主题」的 palette 切换与不持久化(需 puppeteer-core + Chrome,缺则 SKIP)
266
+ node scripts/verify-menubar-theme.mjs # 可选:真实浏览器验证 menubar 顶栏随 palette 换色(浅色→白、深色→深,不再蓝色;可 TW_URL=… 指定活动 wiki)
262
267
  node scripts/verify-seed-send-to-agent.mjs # 可选:全新 wiki 上 E2E 验证「发送给 Agent」按钮 seed(bundle 写入/幂等/marker)
263
268
  node scripts/verify-seeds-admin.mjs # 可选:全新 wiki + 真实 HTTP 验证 /admin/seeds 状态与 /admin/seeds/run(单跑/全跑/force/unknown id)
264
269
 
265
270
  # 改了 wiki 里的 $:/plugins/dsh/send-to-agent bundle 后,重新生成内置常量:
266
271
  node scripts/gen-seed-send-to-agent.mjs '<wiki>/tiddlers/$__plugins_dsh_send-to-agent.json' src/host/seed-send-to-agent.ts && npm run build
267
272
 
268
- # 改了 wiki 首页「所有标签 / 标签笔记」后,重新生成内置 seed 常量:
269
- node scripts/gen-seed-home.mjs '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts && npm run build
273
+ # 改了 wiki 首页「主页 / 所有标签 / 标签笔记」后,重新生成内置 seed 常量:
274
+ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts && npm run build
270
275
  ```
271
276
 
272
277
  **产物约定**(发布必守):`lib/` 内**零** `@deepseek-ai` 运行时 import(`src/sdk.ts` 自实现 `defineTool` / `dshHomePath`,类型用结构接口)。发布前用 `grep -r "@deepseek-ai" lib/` 验证。
@@ -325,8 +330,10 @@ src/
325
330
  │ ├── config.ts # ConfigStore:cordis config 基底 + 配置 tiddler 覆盖层
326
331
  │ ├── seed-notes.ts # seed: 首次一次性写入「插件说明」笔记(支持 force)
327
332
  │ ├── seed-send-to-agent.ts # seed: 首次一次性写入「发送给 Agent」TW 按钮插件(bundle 内嵌常量,支持 force)
328
- │ ├── seed-home.ts # seed: 首页「所有标签/标签笔记」(生成自 wiki .tid,支持 force)
329
- │ ├── seeds.ts # 统一 seed 注册表:doc-note / send-to-agent / home-index / tw-web-host,check + run(force)
333
+ │ ├── seed-home.ts # seed: 默认主页「主页/所有标签/标签笔记」+ $:/DefaultTiddlers(生成自 wiki .tid,支持 force)
334
+ │ ├── seed-all-articles.ts # seed: 「所有文章」两列分页页(支持 force
335
+ │ ├── seed-menubar-theme.ts # seed: menubar 顶栏主题自适应样式表(支持 force)
336
+ │ ├── seeds.ts # 统一 seed 注册表:doc-note / send-to-agent / home-index / all-articles / menubar-theme / tw-web-host,check + run(force)
330
337
  │ └── tools.ts # 5 个工具(列表式注册,可扩展)
331
338
  └── client/
332
339
  ├── index.ts # client 入口(纯 DOM + settings.section 注册,永不 throw)
@@ -347,7 +354,7 @@ src/
347
354
 
348
355
  - **GitHub(公开)**:https://github.com/bbqisbbq/dsh-tiddlywiki
349
356
  - **npm**:`dsh-tiddlywiki`(https://www.npmjs.com/package/dsh-tiddlywiki)
350
- - **说明笔记**:插件在**首次启动**时把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见 [🧩 初始化](#🧩-初始化一次性预置)):`dsh-tiddlywiki 插件说明` 笔记(tag `docs`)、「发送给 Agent」按钮插件(`$:/plugins/dsh/send-to-agent`)、首页「所有标签/标签笔记」、`$:/config/tiddlyweb/host` 同源代理基址——都只写一次、手动编辑不被覆盖、**删除后重启不会自动恢复**(一次性标记;清空 wiki 重装会再写入;设置页「初始化」可手动重新初始化)。
357
+ - **说明笔记**:插件在**首次启动**时把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见 [🧩 初始化](#🧩-初始化一次性预置)):`dsh-tiddlywiki 插件说明` 笔记(tag `docs`)、「发送给 Agent」按钮插件(`$:/plugins/dsh/send-to-agent`)、默认主页「主页/所有标签/标签笔记」+ `$:/DefaultTiddlers`、「所有文章」两列分页页、`menubar` 顶栏主题自适应样式表(`$:/plugins/dsh-tiddlywiki/menubar-theme`)、`$:/config/tiddlyweb/host` 同源代理基址——都只写一次、手动编辑不被覆盖、**删除后重启不会自动恢复**(一次性标记;清空 wiki 重装会再写入;设置页「初始化」可手动重新初始化)。
351
358
 
352
359
  **可被检索的标准字段**(为 GitHub / npm / 搜索引擎发现):
353
360
 
@@ -1,6 +1,6 @@
1
1
  # 统一 seed 注册表 & 后台「重新初始化」
2
2
 
3
- > 本文档说明 dsh-tiddlywiki **v0.10.0** 引入的「一次性预置」机制:哪些东西需要随插件初始化写入 wiki、它们与 dsh 的联动关系、ONE-SHOT / force 语义、后台 API 与设置页操作,以及开发时如何重新生成内置常量。
3
+ > 本文档说明 dsh-tiddlywiki **v0.12.0** 引入/完善的「一次性预置」机制(v0.13.0 新增 `menubar-theme` seed):哪些东西需要随插件初始化写入 wiki、它们与 dsh 的联动关系、ONE-SHOT / force 语义、后台 API 与设置页操作,以及开发时如何重新生成内置常量。
4
4
 
5
5
  ---
6
6
 
@@ -11,8 +11,10 @@
11
11
  | 联动功能 | 依赖的 wiki 预置 | 缺失时的表现 |
12
12
  |---|---|---|
13
13
  | 一键发送给 Agent | `$:/plugins/dsh/send-to-agent` 按钮插件 | TW 工具栏没有「发送给 Agent」按钮,后端路由在但无入口 |
14
- | 首页(Agent 区块 / 标签统计) | 「所有标签」「标签笔记」两个 tiddler | 系统提示承诺的「首页把 Agent 笔记单独列在 Agent 区块、主标签列表只统计人类笔记」完全不存在 |
14
+ | 首页(待办四象限 / 标签统计 / Agent 区块) | 「主页」「所有标签」「标签笔记」三个 tiddler + `$:/DefaultTiddlers` → 主页 | 系统提示承诺的「首页把 Agent 笔记单独列在 Agent 区块、主标签列表只统计人类笔记」完全不存在;TW 打开的是 GettingStarted |
15
+ | 所有文章(两列分页总览) | 「所有文章」tiddler | 没有一键总览全部条目的入口 |
15
16
  | 嵌入式 TW 编辑器 | `$:/config/tiddlyweb/host` 指向同源代理 | iframe 里的 TW 前端 API 基址指向错误的 origin,编辑/保存失效 |
17
+ | menubar 顶栏主题自适应 | `$:/plugins/dsh-tiddlywiki/menubar-theme` 样式表(tag `$:/tags/Stylesheet`) | tiddlywiki/menubar 顶栏停留在默认色映射的蓝色(`$:/config/DefaultColourMappings/` → `#5778d8`),不随 DSH 深浅主题变化 |
16
18
  | 新手引导 | 「dsh-tiddlywiki 插件说明」笔记 | 新用户没有入门说明 |
17
19
 
18
20
  v0.10.0 把**全部**这类项收进一个**统一 seed 注册表**,随插件首次启动自动预置;并给后台加「重新初始化」能力,让缺失/被改坏的项可以随时由用户手动恢复。
@@ -37,12 +39,14 @@ interface SeedDef {
37
39
  |---|---|---|---|
38
40
  | `doc-note` | `seed-notes.ts` → `seedDocNote` | 「dsh-tiddlywiki 插件说明」(tag `docs`) | `$:/plugins/dsh-tiddlywiki/seed-doc-note` |
39
41
  | `send-to-agent` | `seed-send-to-agent.ts` → `seedSendToAgent` | `$:/plugins/dsh/send-to-agent` 按钮 bundle(`application/json`) | `$:/plugins/dsh-tiddlywiki/seed-send-to-agent` |
40
- | `home-index` | `seed-home.ts` → `seedHomeIndex` | 「所有标签」+「标签笔记」(tag `索引`) | `$:/plugins/dsh-tiddlywiki/seed-home-index` |
42
+ | `home-index` | `seed-home.ts` → `seedHomeIndex` | 「主页」+「所有标签」+「标签笔记」(tag `索引`),并把 `$:/DefaultTiddlers` 指向 `[[主页]]` | `$:/plugins/dsh-tiddlywiki/seed-home-index` |
43
+ | `all-articles` | `seed-all-articles.ts` → `seedAllArticles` | 「所有文章」(tag `索引`)——两列分页总览,每页条数实时读 `ui.allArticles.pageSize`(默认 10) | `$:/plugins/dsh-tiddlywiki/seed-all-articles` |
44
+ | `menubar-theme` | `seed-menubar-theme.ts` → `seedMenubarTheme` | `$:/plugins/dsh-tiddlywiki/menubar-theme`(tag `$:/tags/Stylesheet`)——覆盖 tiddlywiki/menubar 顶栏:把 `<<colour menubar-background>>` 的「默认色映射蓝色」改为跟随活动 palette 的 `background`/`foreground`,随 DSH 主题切换(`$:/palette` 翻转)自动换色 | `$:/plugins/dsh-tiddlywiki/seed-menubar-theme` |
41
45
  | `tw-web-host` | `seeds.ts` 内联 | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 无 marker(ensure 型,见 §4) |
42
46
 
43
47
  ### 统一入口(`src/index.ts` 导出)
44
48
 
45
- - `runAllSeeds(ctx)` —— **启动路径**:四项全部非 force 执行(只写缺失)。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
49
+ - `runAllSeeds(ctx)` —— **启动路径**:全部非 force 执行(只写缺失)。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
46
50
  - `checkAllSeeds(ctx)` —— 返回每项当前状态数组(设置页「初始化」区块数据源)。
47
51
  - `runSeedById(ctx, id?, force)` —— 单跑(`id` 指定)或全跑(`id` 为 `undefined`);`force` 为手动「重新初始化」;未知 `id` 返回显式错误结果而非抛异常。
48
52
 
@@ -52,7 +56,7 @@ interface SeedDef {
52
56
 
53
57
  **核心原则:seed 只提供一次,之后内容归用户所有。**
54
58
 
55
- - **marker 门控**(doc-note / send-to-agent / home-index):首次执行写入内容 + 写 marker;此后只要 marker 在,seed 就**不再写**(无论目标 tiddler 是否存在)。
59
+ - **marker 门控**(doc-note / send-to-agent / home-index / all-articles):首次执行写入内容 + 写 marker;此后只要 marker 在,seed 就**不再写**(无论目标 tiddler 是否存在)。
56
60
  - **用户删除 tiddler 后,重启不会复活**(marker 仍在)——这是刻意的:用户删掉 = 不想要。
57
61
  - **用户编辑过 tiddler,永远不会被启动 seed 覆盖**(marker 在,seed 根本不触碰)。
58
62
  - **升级兼容**:老 wiki 已有这些 tiddler(旧版本手工放的)时,首次执行只补写 marker、不覆盖现有内容,从这一刻起同样归用户所有。
@@ -71,7 +75,9 @@ interface SeedDef {
71
75
 
72
76
  典型使用场景:
73
77
 
74
- - 「我把首页改坏了,想恢复成模板」→ `home-index` 重新初始化;
78
+ - 「我把首页改坏了,想恢复成模板」→ `home-index` 重新初始化(恢复主页/所有标签/标签笔记 + `$:/DefaultTiddlers` → 主页);
79
+ - 「所有文章页被删了 / 改坏了」→ `all-articles` 重新初始化;
80
+ - 「menubar 顶栏又变回蓝色了 / 样式表被我改了」→ `menubar-theme` 重新初始化(恢复跟随 palette 的样式覆盖);
75
81
  - 「发送给 Agent 按钮被我删了 / 改坏了」→ `send-to-agent` 重新初始化;
76
82
  - 「TW 编辑器打不开,疑似 `$:/config/tiddlyweb/host` 被改错」→ `tw-web-host` 重新初始化(force 强制写回代理基址);
77
83
  - 「刚装完发现 wiki 里缺了说明/首页」→ 对应项重新初始化或「全部重新初始化」。
@@ -92,10 +98,12 @@ interface SeedDef {
92
98
  {
93
99
  "ok": true,
94
100
  "items": [
95
- { "id": "doc-note", "title": "插件说明笔记", "description": "…", "present": true, "detail": "已存在" },
96
- { "id": "send-to-agent", "title": "「发送给 Agent」按钮", "description": "…", "present": true, "detail": "已存在" },
97
- { "id": "home-index", "title": "首页(所有标签 / 标签笔记)", "description": "…", "present": false, "detail": "缺失:所有标签" },
98
- { "id": "tw-web-host", "title": "TW 前端 API 基址(同源代理)", "description": "…", "present": true, "detail": "已指向 /dsh-tiddlywiki/tw/" }
101
+ { "id": "doc-note", "title": "插件说明笔记", "description": "…", "present": true, "detail": "已存在" },
102
+ { "id": "send-to-agent", "title": "「发送给 Agent」按钮", "description": "…", "present": true, "detail": "已存在" },
103
+ { "id": "home-index", "title": "首页(主页 / 所有标签 / 标签笔记)", "description": "…", "present": false, "detail": "缺失:主页" },
104
+ { "id": "all-articles", "title": "所有文章(两列分页总览)", "description": "…", "present": true, "detail": "已存在" },
105
+ { "id": "menubar-theme", "title": "menubar 顶栏主题自适应", "description": "…", "present": true, "detail": "已存在" },
106
+ { "id": "tw-web-host", "title": "TW 前端 API 基址(同源代理)", "description": "…", "present": true, "detail": "已指向 /dsh-tiddlywiki/tw/" }
99
107
  ]
100
108
  }
101
109
  ```
@@ -136,7 +144,7 @@ DSH 设置 →「TiddlyWiki 知识库」→ 最底部「**初始化(一次性
136
144
 
137
145
  - 顶部状态行:`共 N 项,M 项已就绪`;
138
146
  - 每项一行:状态点(✓ 已就绪 / ✗ 缺失)+ 名称 + 实时详情(如缺失了哪个 tiddler)+ 「重新初始化」按钮;
139
- - 底部:「**全部重新初始化**」按钮(force 全部四项)。
147
+ - 底部:「**全部重新初始化**」按钮(force 全部)。
140
148
 
141
149
  前端源码:`src/client/settings-page.ts` 的 `renderSeedsSection`;样式 `src/client/styles.ts`(状态点 `ok` / `missing`)。
142
150
 
@@ -150,8 +158,14 @@ DSH 设置 →「TiddlyWiki 知识库」→ 最底部「**初始化(一次性
150
158
  # 改了 wiki 里的「发送给 Agent」按钮 bundle($:/plugins/dsh/send-to-agent):
151
159
  node scripts/gen-seed-send-to-agent.mjs '<wiki>/tiddlers/$__plugins_dsh_send-to-agent.json' src/host/seed-send-to-agent.ts
152
160
 
153
- # 改了 wiki 首页(所有标签 / 标签笔记):
154
- node scripts/gen-seed-home.mjs '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts
161
+ # 改了 wiki 首页(主页 / 所有标签 / 标签笔记):
162
+ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts
163
+
164
+ # 「所有文章」页的内容维护在 src/host/seed-all-articles.ts 的 ALL_ARTICLES_TEXT
165
+ # (来源:<wiki>/tiddlers/所有文章.tid;改 wiki 页后同步手工更新该常量)。
166
+
167
+ # 「menubar 顶栏主题自适应」样式表维护在 src/host/seed-menubar-theme.ts 的
168
+ # MENUBAR_THEME_TEXT(改样式后手工更新该常量;重新初始化即恢复内置样式)。
155
169
 
156
170
  # 重新生成后务必:
157
171
  npm run typecheck && npm run build && npm run selftest
@@ -27818,7 +27818,7 @@ function mountKnowledgeFab(state, note, sync) {
27818
27818
  * 2. 常规配置 note.tag / git.* / uiLanguage(改了什么保存什么)
27819
27819
  * 3. 插件管理 自带官方插件勾选(可搜索)→ 应用并重启 TW
27820
27820
  * 4. 主题管理 自带主题单选 → 应用并重启 TW
27821
- * 5. 初始化 一次性预置(doc-note/send-to-agent/home-index/tw-web-host)
27821
+ * 5. 初始化 一次性预置(doc-note/send-to-agent/home-index/all-articles/menubar-theme/tw-web-host)
27822
27822
  * 状态 + 手动「重新初始化」(force)
27823
27823
  *
27824
27824
  * @module dsh-tiddlywiki/client/settings-page
@@ -28009,6 +28009,8 @@ function renderConfigSection(body, config, refresh) {
28009
28009
  checkField("ui.showSyncButton", "显示「知识库」按钮里的「同步」入口与 git 状态点", ui.showSyncButton !== false);
28010
28010
  checkField("ui.followDshTheme", "嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)", ui.followDshTheme !== false);
28011
28011
  textField("ui.darkPalette", "暗色时 TW palette(tiddler 标题)", typeof ui.darkPalette === "string" && ui.darkPalette.length > 0 ? ui.darkPalette : "$:/palettes/CupertinoDark");
28012
+ const allArticles = ui.allArticles ?? {};
28013
+ numField("ui.allArticles.pageSize", "「所有文章」每页条数", typeof allArticles.pageSize === "number" ? allArticles.pageSize : 10);
28012
28014
  const save = make("button", "dsh-tw-settings-btn dsh-tw-settings-primary", "保存配置");
28013
28015
  save.type = "button";
28014
28016
  save.addEventListener("click", () => {
@@ -28018,14 +28020,16 @@ function renderConfigSection(body, config, refresh) {
28018
28020
  for (const field of fields) {
28019
28021
  if (!field.changed()) continue;
28020
28022
  const parts = field.key.split(".");
28021
- if (parts.length === 1) {
28022
- const key = parts[0];
28023
- if (key !== void 0) patch[key] = field.read();
28024
- } else {
28025
- const [top, rest] = parts;
28026
- const obj = patch[top] ?? {};
28027
- obj[rest] = field.read();
28028
- patch[top] = obj;
28023
+ let node = patch;
28024
+ for (let i = 0; i < parts.length; i++) {
28025
+ const part = parts[i];
28026
+ if (part === void 0) break;
28027
+ if (i === parts.length - 1) node[part] = field.read();
28028
+ else {
28029
+ const child = node[part] ?? {};
28030
+ node[part] = child;
28031
+ node = child;
28032
+ }
28029
28033
  }
28030
28034
  }
28031
28035
  try {
package/lib/client.js CHANGED
@@ -27824,7 +27824,7 @@ function mountKnowledgeFab(state, note, sync) {
27824
27824
  * 2. 常规配置 note.tag / git.* / uiLanguage(改了什么保存什么)
27825
27825
  * 3. 插件管理 自带官方插件勾选(可搜索)→ 应用并重启 TW
27826
27826
  * 4. 主题管理 自带主题单选 → 应用并重启 TW
27827
- * 5. 初始化 一次性预置(doc-note/send-to-agent/home-index/tw-web-host)
27827
+ * 5. 初始化 一次性预置(doc-note/send-to-agent/home-index/all-articles/menubar-theme/tw-web-host)
27828
27828
  * 状态 + 手动「重新初始化」(force)
27829
27829
  *
27830
27830
  * @module dsh-tiddlywiki/client/settings-page
@@ -28015,6 +28015,8 @@ function renderConfigSection(body, config, refresh) {
28015
28015
  checkField("ui.showSyncButton", "显示「知识库」按钮里的「同步」入口与 git 状态点", ui.showSyncButton !== false);
28016
28016
  checkField("ui.followDshTheme", "嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)", ui.followDshTheme !== false);
28017
28017
  textField("ui.darkPalette", "暗色时 TW palette(tiddler 标题)", typeof ui.darkPalette === "string" && ui.darkPalette.length > 0 ? ui.darkPalette : "$:/palettes/CupertinoDark");
28018
+ const allArticles = ui.allArticles ?? {};
28019
+ numField("ui.allArticles.pageSize", "「所有文章」每页条数", typeof allArticles.pageSize === "number" ? allArticles.pageSize : 10);
28018
28020
  const save = make("button", "dsh-tw-settings-btn dsh-tw-settings-primary", "保存配置");
28019
28021
  save.type = "button";
28020
28022
  save.addEventListener("click", () => {
@@ -28024,14 +28026,16 @@ function renderConfigSection(body, config, refresh) {
28024
28026
  for (const field of fields) {
28025
28027
  if (!field.changed()) continue;
28026
28028
  const parts = field.key.split(".");
28027
- if (parts.length === 1) {
28028
- const key = parts[0];
28029
- if (key !== void 0) patch[key] = field.read();
28030
- } else {
28031
- const [top, rest] = parts;
28032
- const obj = patch[top] ?? {};
28033
- obj[rest] = field.read();
28034
- patch[top] = obj;
28029
+ let node = patch;
28030
+ for (let i = 0; i < parts.length; i++) {
28031
+ const part = parts[i];
28032
+ if (part === void 0) break;
28033
+ if (i === parts.length - 1) node[part] = field.read();
28034
+ else {
28035
+ const child = node[part] ?? {};
28036
+ node[part] = child;
28037
+ node = child;
28038
+ }
28035
28039
  }
28036
28040
  }
28037
28041
  try {