dsh-tiddlywiki 0.10.0 → 0.12.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
@@ -18,12 +18,12 @@
18
18
  | 能力 | 说明 |
19
19
  |---|---|
20
20
  | 🤖 **Agent 工具** | `tiddlywiki_search` / `get` / `put` / `batch_put` / `rename` / `delete` / `recent` / `list_tags` / `git_sync` / `git_resolve` 十个工具:检索、读写、批量、重命名、删除、git 同步与冲突解决 |
21
- | 📤 **一键发送给 Agent** | TW 笔记工具栏「**发送给 Agent**」按钮(首次启动自动写入 wiki):把当前笔记作为消息注入所选 dsh 会话(按工作区分组选择,可新建工作区/会话);**消息自动附加待办说明**——告知 Agent 这是用户提前编辑在 wiki 中的待办事项,不清楚应主动提问 |
21
+ | 📤 **一键发送给 Agent** | TW 笔记工具栏「**发送给 Agent**」按钮(首次启动自动写入 wiki):把当前笔记作为消息注入所选 dsh 会话(按工作区分组选择,可新建工作区/会话,**可选「工作模式」= Agent 预设**,如 默认/cordis/blade,已有会话显示其当前模式);**消息自动附加待办说明**——告知 Agent 这是用户提前编辑在 wiki 中的待办事项,不清楚应主动提问 |
22
22
  | 🧭 **内嵌编辑器** | 侧边栏「TiddlyWiki」入口 → 中央列内嵌完整 TW 5 编辑器(**同源代理**,经 DSH origin 访问,Tailscale/内网/域名/HTTPS 均可用) |
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;**「初始化」区块**列出所有一次性预置项(说明笔记/发送按钮/首页/所有文章/同源代理基址)的实时状态,可随时手动**重新初始化**;**「所有文章」每页条数**可在配置里调整(实时生效,无需重新初始化) |
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.12.0**(2026-09-04):**新默认主页「主页」+ 「所有文章」两列分页页**。把首页拆成三页:**主页**(默认打开,`$:/DefaultTiddlers` 指向它)= 四象限待办 + 「所有标签」「所有文章」入口;**所有标签**瘦身为独立标签统计页(标签 + Agent 区块 + 回主页链接);新增 **所有文章**——全部条目分两列(🤖 Agent 撰写 / 👤 人工·人类,含 `human-edited` 的 Agent 笔记)**各自分页**展示(排除系统页、草稿与 `索引` 导航页),每页条数取配置 `ui.allArticles.pageSize`(默认 10,设置页可调、实时生效)。**所有文章**作为新 seed 进统一注册表(`all-articles`),设置页可单独/全部**重新初始化**。
37
+ - **v0.11.0**(2026-09-04):TW「**发送给 Agent**」选择器新增**「工作模式」(Agent 预设)**——弹层顶部可选择会话挂载的 Agent 预设(如 默认/cordis/blade,来自 DSH `agentPresets`),**新建工作区/会话并发送**时以所选模式创建(`/agent/create` 新增 `mode` 参数 → `sessionController.create(agentPreset)`);已有会话显示其当前模式(`🧭` 徽标)。新增 `GET /agent/modes` 返回可用模式清单 + 部署默认。对旧宿主**向后兼容**:模式接口缺失时选择器降级为默认模式,功能不受影响。
36
38
  - **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)。
37
39
  - **v0.9.0**(2026-09-04):TW「**发送给 Agent**」按钮随插件**首次启动自动写入 wiki**(ONE-SHOT:只写一次、用户可删可改不复活)——新装用户开箱即用,无需手工往 wiki 塞插件 bundle;消息格式更新:**去掉 `【TiddlyWiki 笔记一键发送】` 前缀**,并**附加待办说明**告知 Agent 这是用户提前编辑在 wiki 中的待办事项、不清楚应主动提问。
38
40
  - **v0.8.0**(2026-09-04):嵌入式 TW **跟随 DSH 深浅主题**——暗色自动切深色 palette(默认 CupertinoDark)、浅色恢复原 palette,纯内存切换**不写回 wiki、不进 git**,设置页可开关/换深色 palette。
@@ -58,7 +60,7 @@ dsh plugin --profile web add github:bbqisbbq/dsh-tiddlywiki
58
60
  dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
59
61
  ```
60
62
 
61
- 首次启动会自动完成:**初始化 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 重写内置内容)。
63
+ 首次启动会自动完成:**初始化 wiki 目录**、**`git init` 并提交基线**、把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见「初始化」):向 wiki **写入一次**「dsh-tiddlywiki 插件说明」笔记(tag `docs`)、**写入一次**「发送给 Agent」TW 按钮插件(`$:/plugins/dsh/send-to-agent`)、**写入默认主页**「主页 / 所有标签 / 标签笔记」(四象限待办 + 入口 + 标签统计 + Agent 区块,并把 `$:/DefaultTiddlers` 指向主页)、**写入「所有文章」两列分页页**、把 `$:/config/tiddlyweb/host` 指向同源代理。它们都是 ONE-SHOT:只写缺失、不覆盖你的改动、删掉重启也不会自动恢复——需要时可在设置页「**初始化**」区块手动「重新初始化」(force 重写内置内容)。
62
64
 
63
65
  ---
64
66
 
@@ -107,6 +109,7 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
107
109
  ### 🧑‍💻 给人:界面操作
108
110
 
109
111
  **📤 一键发送给 Agent** — 插件首次启动会把「发送给 Agent」按钮插件写入 wiki(`$:/plugins/dsh/send-to-agent`,ONE-SHOT)。在 TW 里打开任意笔记,工具栏点「**发送给 Agent**」:
112
+ - 弹层顶部有**「工作模式」(Agent 预设)**选择器(v0.11.0):列出 DSH 全部可用预设(`/agent/modes`,标记部署默认),**新建工作区/会话并发送**时按所选模式创建(`/agent/create` 传 `mode` → `sessionController.create(agentPreset)`);已有会话旁显示其当前模式徽标(🧭);
110
113
  - 弹层**按工作区(cwd)分组**列出可见会话,点选即把当前笔记作为消息注入(`sessionController.prompt`,与聊天输入同 API);
111
114
  - 也可以**新建工作区/会话**再发送(`/agent/create` 按 cwd 落入真实 Workspace,会话不落「未分组」);
112
115
  - 消息格式为 `《标题》` + 标签/类型 + **待办说明**(告知 Agent 这是用户提前编辑在 wiki 中的待办事项、不清楚应主动提问)+ 正文;
@@ -146,7 +149,7 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
146
149
  | 插件管理 | 自带官方插件勾选(可搜索)→ 应用并自动重启 TW |
147
150
  | 主题管理 | 自带主题**多选加载 + 单选活动** → 应用并自动重启 TW |
148
151
  | 语言管理 | 自带官方语言包勾选(含 zh-Hans 简体)→ 应用并自动重启 TW |
149
- | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/同源代理基址)→ 每项「重新初始化」+ 「全部重新初始化」 |
152
+ | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/所有文章/同源代理基址)→ 每项「重新初始化」+ 「全部重新初始化」 |
150
153
 
151
154
  - 配置写入 wiki 内的 `$:/plugins/dsh-tiddlywiki/config` tiddler(JSON),随 git 同步,作为 **cordis `config:` 块之上的覆盖层**(tiddler 优先)。
152
155
  - git 类配置修改后**重启 dsh web 生效**(bootstrap 时读取)。
@@ -167,13 +170,14 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
167
170
  |---|---|---|---|
168
171
  | `doc-note` | 「dsh-tiddlywiki 插件说明」笔记(tag `docs`) | 新手引导 | marker 门控:只写一次,删掉重启不复活 |
169
172
  | `send-to-agent` | 「发送给 Agent」TW 按钮插件 `$:/plugins/dsh/send-to-agent` | 一键把笔记注入 dsh 会话的入口 | 同上 |
170
- | `home-index` | 首页「所有标签 / 标签笔记」 | **系统提示承诺的首页**:四象限待办 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上 |
173
+ | `home-index` | 默认主页「主页 / 所有标签 / 标签笔记」+ `$:/DefaultTiddlers` → 主页 | **系统提示承诺的首页**:四象限待办 + 「所有标签」「所有文章」入口 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上 |
174
+ | `all-articles` | 「所有文章」——两列(🤖 Agent 撰写 / 👤 人工·人类)各自分页 | 全部条目的分栏总览;每页条数实时读 `ui.allArticles.pageSize`(设置页可调) | 同上 |
171
175
  | `tw-web-host` | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 嵌入式 TW 编辑器的同源代理 API 基址(远程访问模式前提) | 非 force = 缺失/旧默认才写、用户自定义保留;force = 强制写回代理基址 |
172
176
 
173
177
  **用法**:
174
178
  - **查看状态**:设置页 →「初始化」→ 每项一个状态点(✓ 已就绪 / ✗ 缺失)+ 说明。
175
179
  - **重新初始化单项**:点该项「重新初始化」——force 重写内置内容(覆盖你对该 tiddler 的改动)并重记 marker,用于「我把首页改坏了想恢复模板」「按钮被我删了想补回」等场景。
176
- - **全部重新初始化**:底部「全部重新初始化」一键重跑全部四项。
180
+ - **全部重新初始化**:底部「全部重新初始化」一键重跑全部五项。
177
181
  - **为什么删掉重启不会自动恢复**:ONE-SHOT marker(`$:/plugins/dsh-tiddlywiki/seed-*`)记录「已提供过」,之后归用户所有——想恢复请手动「重新初始化」,而非依赖重启。
178
182
 
179
183
  详细设计(后台 API、force 语义、如何重新生成内置常量)见 [docs/seed-initialization.md](docs/seed-initialization.md)。
@@ -263,8 +267,8 @@ node scripts/verify-seeds-admin.mjs # 可选:全新 wiki + 真实 HTTP
263
267
  # 改了 wiki 里的 $:/plugins/dsh/send-to-agent bundle 后,重新生成内置常量:
264
268
  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
265
269
 
266
- # 改了 wiki 首页「所有标签 / 标签笔记」后,重新生成内置 seed 常量:
267
- node scripts/gen-seed-home.mjs '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts && npm run build
270
+ # 改了 wiki 首页「主页 / 所有标签 / 标签笔记」后,重新生成内置 seed 常量:
271
+ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts && npm run build
268
272
  ```
269
273
 
270
274
  **产物约定**(发布必守):`lib/` 内**零** `@deepseek-ai` 运行时 import(`src/sdk.ts` 自实现 `defineTool` / `dshHomePath`,类型用结构接口)。发布前用 `grep -r "@deepseek-ai" lib/` 验证。
@@ -286,9 +290,10 @@ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddle
286
290
  | `/dsh-tiddlywiki/sync` | POST | 一键 pull → commit → push |
287
291
  | `/dsh-tiddlywiki/upload` | POST | 文件上传到 `files/`(原始 body + `X-Filename`) |
288
292
  | `/dsh-tiddlywiki/restart` | POST | 重启 TW 子进程 |
289
- | `/dsh-tiddlywiki/agent/sessions` | GET | 可见会话列表(TW「发送给 Agent」选择器) |
293
+ | `/dsh-tiddlywiki/agent/sessions` | GET | 可见会话列表(TW「发送给 Agent」选择器;含每会话 `agentPreset` 模式徽标) |
294
+ | `/dsh-tiddlywiki/agent/modes` | GET | 可用「工作模式」(Agent 预设)清单 + 部署默认(v0.11.0) |
290
295
  | `/dsh-tiddlywiki/agent/send` | POST | 把笔记作为消息注入一个会话(`sessionController.prompt`) |
291
- | `/dsh-tiddlywiki/agent/create` | POST | 按 cwd 新建/复用 Workspace + 会话(工作区优先) |
296
+ | `/dsh-tiddlywiki/agent/create` | POST | 按 cwd 新建/复用 Workspace + 会话(工作区优先);可选 `mode`(Agent 预设) |
292
297
  | `/dsh-tiddlywiki/api/*` | any | 透传到 TW 服务(JSON) |
293
298
  | `/dsh-tiddlywiki/tw/*` | any | **同源 TW 代理**:整个 TW 前端(index + `/files/*` + TiddlyWeb API)→ 回环 TW(v0.6.0,远程访问核心) |
294
299
 
@@ -322,8 +327,9 @@ src/
322
327
  │ ├── config.ts # ConfigStore:cordis config 基底 + 配置 tiddler 覆盖层
323
328
  │ ├── seed-notes.ts # seed: 首次一次性写入「插件说明」笔记(支持 force)
324
329
  │ ├── seed-send-to-agent.ts # seed: 首次一次性写入「发送给 Agent」TW 按钮插件(bundle 内嵌常量,支持 force)
325
- │ ├── seed-home.ts # seed: 首页「所有标签/标签笔记」(生成自 wiki .tid,支持 force)
326
- │ ├── seeds.ts # 统一 seed 注册表:doc-note / send-to-agent / home-index / tw-web-host,check + run(force)
330
+ │ ├── seed-home.ts # seed: 默认主页「主页/所有标签/标签笔记」+ $:/DefaultTiddlers(生成自 wiki .tid,支持 force)
331
+ │ ├── seed-all-articles.ts # seed: 「所有文章」两列分页页(支持 force
332
+ │ ├── seeds.ts # 统一 seed 注册表:doc-note / send-to-agent / home-index / all-articles / tw-web-host,check + run(force)
327
333
  │ └── tools.ts # 5 个工具(列表式注册,可扩展)
328
334
  └── client/
329
335
  ├── index.ts # client 入口(纯 DOM + settings.section 注册,永不 throw)
@@ -344,7 +350,7 @@ src/
344
350
 
345
351
  - **GitHub(公开)**:https://github.com/bbqisbbq/dsh-tiddlywiki
346
352
  - **npm**:`dsh-tiddlywiki`(https://www.npmjs.com/package/dsh-tiddlywiki)
347
- - **说明笔记**:插件在**首次启动**时把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见 [🧩 初始化](#🧩-初始化一次性预置)):`dsh-tiddlywiki 插件说明` 笔记(tag `docs`)、「发送给 Agent」按钮插件(`$:/plugins/dsh/send-to-agent`)、首页「所有标签/标签笔记」、`$:/config/tiddlyweb/host` 同源代理基址——都只写一次、手动编辑不被覆盖、**删除后重启不会自动恢复**(一次性标记;清空 wiki 重装会再写入;设置页「初始化」可手动重新初始化)。
353
+ - **说明笔记**:插件在**首次启动**时把「与 dsh 联动、需要 wiki 预置」的一次性项写入 wiki(**统一 seed 注册表**,见 [🧩 初始化](#🧩-初始化一次性预置)):`dsh-tiddlywiki 插件说明` 笔记(tag `docs`)、「发送给 Agent」按钮插件(`$:/plugins/dsh/send-to-agent`)、默认主页「主页/所有标签/标签笔记」+ `$:/DefaultTiddlers`、「所有文章」两列分页页、`$:/config/tiddlyweb/host` 同源代理基址——都只写一次、手动编辑不被覆盖、**删除后重启不会自动恢复**(一次性标记;清空 wiki 重装会再写入;设置页「初始化」可手动重新初始化)。
348
354
 
349
355
  **可被检索的标准字段**(为 GitHub / npm / 搜索引擎发现):
350
356
 
@@ -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** 引入/完善的「一次性预置」机制:哪些东西需要随插件初始化写入 wiki、它们与 dsh 的联动关系、ONE-SHOT / force 语义、后台 API 与设置页操作,以及开发时如何重新生成内置常量。
4
4
 
5
5
  ---
6
6
 
@@ -11,7 +11,8 @@
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,编辑/保存失效 |
16
17
  | 新手引导 | 「dsh-tiddlywiki 插件说明」笔记 | 新用户没有入门说明 |
17
18
 
@@ -37,12 +38,13 @@ interface SeedDef {
37
38
  |---|---|---|---|
38
39
  | `doc-note` | `seed-notes.ts` → `seedDocNote` | 「dsh-tiddlywiki 插件说明」(tag `docs`) | `$:/plugins/dsh-tiddlywiki/seed-doc-note` |
39
40
  | `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` |
41
+ | `home-index` | `seed-home.ts` → `seedHomeIndex` | 「主页」+「所有标签」+「标签笔记」(tag `索引`),并把 `$:/DefaultTiddlers` 指向 `[[主页]]` | `$:/plugins/dsh-tiddlywiki/seed-home-index` |
42
+ | `all-articles` | `seed-all-articles.ts` → `seedAllArticles` | 「所有文章」(tag `索引`)——两列分页总览,每页条数实时读 `ui.allArticles.pageSize`(默认 10) | `$:/plugins/dsh-tiddlywiki/seed-all-articles` |
41
43
  | `tw-web-host` | `seeds.ts` 内联 | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 无 marker(ensure 型,见 §4) |
42
44
 
43
45
  ### 统一入口(`src/index.ts` 导出)
44
46
 
45
- - `runAllSeeds(ctx)` —— **启动路径**:四项全部非 force 执行(只写缺失)。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
47
+ - `runAllSeeds(ctx)` —— **启动路径**:五项全部非 force 执行(只写缺失)。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
46
48
  - `checkAllSeeds(ctx)` —— 返回每项当前状态数组(设置页「初始化」区块数据源)。
47
49
  - `runSeedById(ctx, id?, force)` —— 单跑(`id` 指定)或全跑(`id` 为 `undefined`);`force` 为手动「重新初始化」;未知 `id` 返回显式错误结果而非抛异常。
48
50
 
@@ -52,7 +54,7 @@ interface SeedDef {
52
54
 
53
55
  **核心原则:seed 只提供一次,之后内容归用户所有。**
54
56
 
55
- - **marker 门控**(doc-note / send-to-agent / home-index):首次执行写入内容 + 写 marker;此后只要 marker 在,seed 就**不再写**(无论目标 tiddler 是否存在)。
57
+ - **marker 门控**(doc-note / send-to-agent / home-index / all-articles):首次执行写入内容 + 写 marker;此后只要 marker 在,seed 就**不再写**(无论目标 tiddler 是否存在)。
56
58
  - **用户删除 tiddler 后,重启不会复活**(marker 仍在)——这是刻意的:用户删掉 = 不想要。
57
59
  - **用户编辑过 tiddler,永远不会被启动 seed 覆盖**(marker 在,seed 根本不触碰)。
58
60
  - **升级兼容**:老 wiki 已有这些 tiddler(旧版本手工放的)时,首次执行只补写 marker、不覆盖现有内容,从这一刻起同样归用户所有。
@@ -71,7 +73,8 @@ interface SeedDef {
71
73
 
72
74
  典型使用场景:
73
75
 
74
- - 「我把首页改坏了,想恢复成模板」→ `home-index` 重新初始化;
76
+ - 「我把首页改坏了,想恢复成模板」→ `home-index` 重新初始化(恢复主页/所有标签/标签笔记 + `$:/DefaultTiddlers` → 主页);
77
+ - 「所有文章页被删了 / 改坏了」→ `all-articles` 重新初始化;
75
78
  - 「发送给 Agent 按钮被我删了 / 改坏了」→ `send-to-agent` 重新初始化;
76
79
  - 「TW 编辑器打不开,疑似 `$:/config/tiddlyweb/host` 被改错」→ `tw-web-host` 重新初始化(force 强制写回代理基址);
77
80
  - 「刚装完发现 wiki 里缺了说明/首页」→ 对应项重新初始化或「全部重新初始化」。
@@ -92,10 +95,11 @@ interface SeedDef {
92
95
  {
93
96
  "ok": true,
94
97
  "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/" }
98
+ { "id": "doc-note", "title": "插件说明笔记", "description": "…", "present": true, "detail": "已存在" },
99
+ { "id": "send-to-agent", "title": "「发送给 Agent」按钮", "description": "…", "present": true, "detail": "已存在" },
100
+ { "id": "home-index", "title": "首页(主页 / 所有标签 / 标签笔记)", "description": "…", "present": false, "detail": "缺失:主页" },
101
+ { "id": "all-articles", "title": "所有文章(两列分页总览)", "description": "…", "present": true, "detail": "已存在" },
102
+ { "id": "tw-web-host", "title": "TW 前端 API 基址(同源代理)", "description": "…", "present": true, "detail": "已指向 /dsh-tiddlywiki/tw/" }
99
103
  ]
100
104
  }
101
105
  ```
@@ -136,7 +140,7 @@ DSH 设置 →「TiddlyWiki 知识库」→ 最底部「**初始化(一次性
136
140
 
137
141
  - 顶部状态行:`共 N 项,M 项已就绪`;
138
142
  - 每项一行:状态点(✓ 已就绪 / ✗ 缺失)+ 名称 + 实时详情(如缺失了哪个 tiddler)+ 「重新初始化」按钮;
139
- - 底部:「**全部重新初始化**」按钮(force 全部四项)。
143
+ - 底部:「**全部重新初始化**」按钮(force 全部五项)。
140
144
 
141
145
  前端源码:`src/client/settings-page.ts` 的 `renderSeedsSection`;样式 `src/client/styles.ts`(状态点 `ok` / `missing`)。
142
146
 
@@ -150,8 +154,11 @@ DSH 设置 →「TiddlyWiki 知识库」→ 最底部「**初始化(一次性
150
154
  # 改了 wiki 里的「发送给 Agent」按钮 bundle($:/plugins/dsh/send-to-agent):
151
155
  node scripts/gen-seed-send-to-agent.mjs '<wiki>/tiddlers/$__plugins_dsh_send-to-agent.json' src/host/seed-send-to-agent.ts
152
156
 
153
- # 改了 wiki 首页(所有标签 / 标签笔记):
154
- node scripts/gen-seed-home.mjs '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts
157
+ # 改了 wiki 首页(主页 / 所有标签 / 标签笔记):
158
+ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts
159
+
160
+ # 「所有文章」页的内容维护在 src/host/seed-all-articles.ts 的 ALL_ARTICLES_TEXT
161
+ # (来源:<wiki>/tiddlers/所有文章.tid;改 wiki 页后同步手工更新该常量)。
155
162
 
156
163
  # 重新生成后务必:
157
164
  npm run typecheck && npm run build && npm run selftest
@@ -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
@@ -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 {