dsh-tiddlywiki 0.13.2 → 0.15.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
@@ -7,7 +7,7 @@
7
7
  [![GitHub](https://img.shields.io/github/stars/bbqisbbq/dsh-tiddlywiki)](https://github.com/bbqisbbq/dsh-tiddlywiki)
8
8
  [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
9
9
 
10
- > 📚 **文档索引**:[🧩 初始化(一次性预置)](#🧩-初始化一次性预置) · [docs/seed-initialization.md](docs/seed-initialization.md)(统一 seed 注册表 / ONE-SHOT 与 force 语义 / 后台 API / 重新生成内置常量)
10
+ > 📚 **文档索引**:[🧩 初始化(一次性预置)](#🧩-初始化一次性预置) · [docs/seed-initialization.md](docs/seed-initialization.md)(统一 seed 注册表 / 核心项与可选项 / ONE-SHOT / force / 反初始化 / 后台 API / 重新生成内置常量)
11
11
 
12
12
  等 Agent 干活的时候,人常是干坐着的——想随手写点什么,又不想切来切去。TiddlyWiki 单文件、纯文本、wiki 语法、自带 git 同步,天生适合**随手写点小东西**。于是把它做成 DSH 原生插件:不用离开当前界面,聊天区右下角就有快速笔记;要正经编辑,弹出 TW 原生编辑器;写下的内容自动进 git,既是知识库也是备份。
13
13
 
@@ -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 预设**,如 默认/cordis/blade,已有会话显示其当前模式);**消息自动附加待办说明**——告知 Agent 这是用户提前编辑在 wiki 中的待办事项,不清楚应主动提问 |
21
+ | 📤 **一键发送给 Agent** | TW 笔记工具栏「**发送给 Agent**」按钮(首次启动自动写入 wiki;**独立加粗纸飞机图标**,遵循核心工具栏图标约定,工具栏设置列表也显示各按钮图标/说明):把当前笔记作为消息注入所选 dsh 会话(按工作区分组选择,可新建工作区/会话,**可选「工作模式」= Agent 预设**、**可选「权限」= 权限预设**(沙箱+审批),**可选附加说明**随消息一起发给 Agent,已有会话显示其当前模式);**消息自动附加待办说明**——告知 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;**「初始化」区块**列出所有一次性预置项(说明笔记/发送按钮/首页/所有文章/**menubar 顶栏主题自适应**/同源代理基址)的实时状态,可随时手动**重新初始化**;**「所有文章」每页条数**可在配置里调整(实时生效,无需重新初始化) |
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.15.0**(2026-09-05):**初始化不强制 + 可反初始化 + 设置页样式修复**。① **不给用户强绑定**——seed 注册表拆两层:启动只自动写入**功能必需项**(「发送给 Agent」按钮 + TW 前端 API 基址);**可选项**(说明笔记 / 首页 / 所有文章 / menubar 顶栏主题自适应)默认不写入,设置页「初始化」区块可随时「重新初始化」写入;② **「反初始化」**——可选 seed 每项(及「全部反初始化」)可一键删除其写入的 tiddler + marker,恢复未初始化状态(核心项不可移除;home-index 反初始化会顺带把 `$:/DefaultTiddlers` 从 `[[主页]]` 恢复为 GettingStarted);后台新增 `POST /admin/seeds/remove`;③ **menubar 顶栏主题自适应不再自动写入**(改的不对可去——本 wiki 已移除该样式表,顶栏恢复默认外观;想要可随时在设置页重新初始化);④ **设置页样式修复**——说明/次要文字不再依赖可能缺失的 `label-dimmed` token,改由主题主文字色派生(任意深浅主题下可读,不再出现白色文字);配置字段标签改为自然换行、输入框右对齐限宽,行内名称/说明单行省略,长选项不再断行错乱。
37
+ - **v0.14.0**(2026-09-05):TW「**发送给 Agent**」一键发送三处优化。① **工具栏按钮修复**——之前按钮在 控制台→外观→工具栏 里**不显示图标与说明**(还和「导出此条目」用同一个导出图标):现为按钮补上 `icon`/`caption`/`description` 字段,并在 bundle 里**自带独立的「发送」图标**(不再借用 core 的 export-button),工具栏设置与条目标题栏都显示独立图标;后续小修:图标改用**更饱满的实心纸飞机**并遵循核心图标约定(`\parameters (size:"22pt")` + `width/height` + `tc-image-button` class + `$:/tags/Image` 标签),修复宽度比相邻图标窄的问题;同时 bundle **shadow 覆盖核心 `$:/core/ui/ControlPanel/Toolbars/ItemTemplate`**(镜像 EditorItemTemplate),让 查看/页面/编辑工具栏 的设置列表**也显示每个按钮的图标**(原来只有编辑器工具栏列表显示);**再修「图标裂了」**——根因是 bundle 里 icon tiddler 被设了 `type: image/svg+xml`:`{{icon}}` 会走 imageparser 渲染成 `<img src="data:image/svg+xml,...">`,数据 URI 保留原始文本(开头的 `\parameters` 与未展开的 `width=<<size>>` 不是合法独立 SVG),Chrome/Edge 直接加载失败显示裂图;核心图标**不带 type 字段**(默认 wikitext),`{{icon}}` 被 wiki 化成语法展开后的**内联 `<svg width="22pt">`**。修复:icon tiddler 去掉 type 字段(保持 wikitext,与核心一致),已在真实浏览器验证图标渲染尺寸与核心图标完全一致(32.9×24.7)且无裂图;② **可选「附加说明」**——发送弹层新增文本输入框,填写的说明会以 `【附加说明】` 段随消息一起发给 Agent(不填则无此段);③ **可选「权限」**——弹层新增「权限(权限预设)」选择器(来自 DSH `permissionPresets`,如 工作区写入+询问 / 完全访问+免确认),**新建会话并发送**时 `/agent/create` 传 `permission` → 创建后对会话日志应用该预设(`permission/preset` + `sandbox/mode` + `approval/policy` 事件),覆盖部署默认;对旧宿主**向后兼容**:权限服务缺失时选择器降级为提示、不发送该字段。bundle 源码收进仓库 `scripts/bundle/send-to-agent/`(startup.js/button.tid/icon.svg/item-template.tid)+ 组装脚本 `scripts/build-send-to-agent-bundle.mjs`,改按钮后重跑组装 → gen-seed → build 即可。
36
38
  - **v0.13.1**(2026-09-04):**客户端 bundle 压缩(minify)**。CodeMirror 6 + Lezer markdown 让 `lib/client.js`(`./client` 导出)达到 1.06MB,超过插件目录注册表(如 dsh.pub 收录校验)经 GitHub Contents API 检查的 **1MB 上限**,导致 dsh.pub 收录 PR 首轮校验失败(`invalid_file`);开启 tsdown `minify` 后产物降到 **0.58MB**(gzip ~193KB),浏览器加载更快,dsh.pub 收录 PR #83 校验全绿并已合并。构建配置见 `tsdown.client.config.ts`。
37
39
  - **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,不覆盖你的改动),设置页「初始化」可单独/全部**重新初始化**。
38
40
  - **v0.12.0**(2026-09-04):**新默认主页「主页」+ 「所有文章」两列分页页**。把首页拆成三页:**主页**(默认打开,`$:/DefaultTiddlers` 指向它)= 四象限待办 + 「所有标签」「所有文章」入口;**所有标签**瘦身为独立标签统计页(标签 + Agent 区块 + 回主页链接);新增 **所有文章**——全部条目分两列(🤖 Agent 撰写 / 👤 人工·人类,含 `human-edited` 的 Agent 笔记)**各自分页**展示(排除系统页、草稿与 `索引` 导航页),每页条数取配置 `ui.allArticles.pageSize`(默认 10,设置页可调、实时生效)。**所有文章**作为新 seed 进统一注册表(`all-articles`),设置页可单独/全部**重新初始化**。
@@ -62,7 +64,7 @@ dsh plugin --profile web add github:bbqisbbq/dsh-tiddlywiki
62
64
  dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
63
65
  ```
64
66
 
65
- 首次启动会自动完成:**初始化 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 重写内置内容)。
67
+ 首次启动会自动完成:**初始化 wiki 目录**、**`git init` 并提交基线**、把「与 dsh 联动、功能必需」的一次性项写入 wiki(**统一 seed 注册表**,见「初始化」):**写入一次**「发送给 Agent」TW 按钮插件(`$:/plugins/dsh/send-to-agent`)、把 `$:/config/tiddlyweb/host` 指向同源代理。它们都是 ONE-SHOT:只写缺失、不覆盖你的改动、删掉重启也不会自动恢复。**可选项不自动写入、不强制**:说明笔记 / 首页 / 所有文章 / menubar 顶栏主题自适应 需要时在设置页「初始化」手动「重新初始化」,不想要可「反初始化」移除。
66
68
 
67
69
  ---
68
70
 
@@ -111,10 +113,13 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
111
113
  ### 🧑‍💻 给人:界面操作
112
114
 
113
115
  **📤 一键发送给 Agent** — 插件首次启动会把「发送给 Agent」按钮插件写入 wiki(`$:/plugins/dsh/send-to-agent`,ONE-SHOT)。在 TW 里打开任意笔记,工具栏点「**发送给 Agent**」:
116
+ - 弹层顶部有**「附加说明」(可选)**输入框(v0.14.0):填写的说明会以 `【附加说明】` 段随消息一起发给 Agent(不填则没有该段);
114
117
  - 弹层顶部有**「工作模式」(Agent 预设)**选择器(v0.11.0):列出 DSH 全部可用预设(`/agent/modes`,标记部署默认),**新建工作区/会话并发送**时按所选模式创建(`/agent/create` 传 `mode` → `sessionController.create(agentPreset)`);已有会话旁显示其当前模式徽标(🧭);
118
+ - 弹层顶部还有**「权限」(权限预设)**选择器(v0.14.0):列出 DSH 权限预设(沙箱 + 审批的捆绑,如 工作区写入+询问 / 完全访问+免确认,来自 `permissionPresets`),**新建会话并发送**时应用所选权限(`/agent/create` 传 `permission` → 创建后 `permissionPresets.set` 写入会话日志);权限服务不可用时选择器自动隐藏、按部署默认;
115
119
  - 弹层**按工作区(cwd)分组**列出可见会话,点选即把当前笔记作为消息注入(`sessionController.prompt`,与聊天输入同 API);
116
120
  - 也可以**新建工作区/会话**再发送(`/agent/create` 按 cwd 落入真实 Workspace,会话不落「未分组」);
117
- - 消息格式为 `《标题》` + 标签/类型 + **待办说明**(告知 Agent 这是用户提前编辑在 wiki 中的待办事项、不清楚应主动提问)+ 正文;
121
+ - 消息格式为 `《标题》` + 标签/类型 + **待办说明**(告知 Agent 这是用户提前编辑在 wiki 中的待办事项、不清楚应主动提问)+ **附加说明**(可选)+ 正文;
122
+ - 按钮在 控制台→外观→工具栏 里带**独立加粗图标与说明**(v0.14.0 起不再借用「导出此条目」的图标;bundle 还 shadow 覆盖核心工具栏行模板,让查看/页面/编辑工具栏的设置列表都显示每个按钮的图标);
118
123
  - 开关与 token 见设置页「常规配置」/配置项 `ui.sendToAgent`(默认开)。
119
124
 
120
125
  **🧭 中央列编辑器** — 侧边栏「TiddlyWiki」按钮开关中央编辑器面板(**同源代理**:iframe 指向 `<DSH origin>/dsh-tiddlywiki/tw/`,由 DSH 转发到回环上的 TW 服务),完整 TW 5 编辑器。
@@ -151,7 +156,7 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
151
156
  | 插件管理 | 自带官方插件勾选(可搜索)→ 应用并自动重启 TW |
152
157
  | 主题管理 | 自带主题**多选加载 + 单选活动** → 应用并自动重启 TW |
153
158
  | 语言管理 | 自带官方语言包勾选(含 zh-Hans 简体)→ 应用并自动重启 TW |
154
- | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/所有文章/menubar 顶栏主题自适应/同源代理基址)→ 每项「重新初始化」+ 「全部重新初始化」 |
159
+ | **初始化** | 一次性预置项实时状态(说明笔记/发送按钮/首页/所有文章/menubar 顶栏主题自适应/同源代理基址)→ 每项「重新初始化」;可选 seed 另有「反初始化」+ 「全部反初始化」 |
155
160
 
156
161
  - 配置写入 wiki 内的 `$:/plugins/dsh-tiddlywiki/config` tiddler(JSON),随 git 同步,作为 **cordis `config:` 块之上的覆盖层**(tiddler 优先)。
157
162
  - git 类配置修改后**重启 dsh web 生效**(bootstrap 时读取)。
@@ -166,24 +171,28 @@ dsh plugin --profile web add link:/path/to/your/dsh-tiddlywiki
166
171
 
167
172
  ### 🧩 初始化(一次性预置)
168
173
 
169
- 插件与 dsh 联动、需要在 wiki 里预置 tiddler/配置的项,全部收在**统一 seed 注册表**中(`SEED_DEFS`)。首次启动自动执行(**非 force**:只写缺失、绝不覆盖你的改动);设置页「**初始化**」区块可随时查看每项实时状态并手动「**重新初始化**」(force:重写内置内容)。
174
+ 插件与 dsh 联动、需要在 wiki 里预置 tiddler/配置的项,全部收在**统一 seed 注册表**中(`SEED_DEFS`),分两层(v0.15.0):
170
175
 
171
- | seed id | 预置内容 | 与 dsh 的联动 | ONE-SHOT 语义 |
172
- |---|---|---|---|
173
- | `doc-note` | 「dsh-tiddlywiki 插件说明」笔记(tag `docs`) | 新手引导 | marker 门控:只写一次,删掉重启不复活 |
174
- | `send-to-agent` | 「发送给 Agent」TW 按钮插件 `$:/plugins/dsh/send-to-agent` | 一键把笔记注入 dsh 会话的入口 | 同上 |
175
- | `home-index` | 默认主页「主页 / 所有标签 / 标签笔记」+ `$:/DefaultTiddlers` → 主页 | **系统提示承诺的首页**:四象限待办 + 「所有标签」「所有文章」入口 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上 |
176
- | `all-articles` | 「所有文章」——两列(🤖 Agent 撰写 / 👤 人工·人类)各自分页 | 全部条目的分栏总览;每页条数实时读 `ui.allArticles.pageSize`(设置页可调) | 同上 |
177
- | `menubar-theme` | `$:/plugins/dsh-tiddlywiki/menubar-theme` 样式表(tag `$:/tags/Stylesheet`) | 把 tiddlywiki/menubar 顶栏从默认蓝色改为跟随活动 palette 的 `background`/`foreground`,随 DSH 深浅主题自动换色(嵌入式 TW 主题跟随机制) | 同上 |
178
- | `tw-web-host` | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 嵌入式 TW 编辑器的同源代理 API 基址(远程访问模式前提) | 非 force = 缺失/旧默认才写、用户自定义保留;force = 强制写回代理基址 |
176
+ - **核心项**(功能必需):「发送给 Agent」按钮 + TW 前端 API 基址——**首次启动自动写入**(非 force:只写缺失、绝不覆盖你的改动);
177
+ - **可选项**:说明笔记 / 首页 / 所有文章 / menubar 顶栏主题自适应——**默认不写入、不强制**,可在设置页「**初始化**」区块随时手动「**重新初始化**」(force:重写内置内容)或「**反初始化**」(移除写入的 tiddler + marker)。
178
+
179
+ | seed id | 层级 | 预置内容 | 与 dsh 的联动 | ONE-SHOT 语义 |
180
+ |---|---|---|---|---|
181
+ | `send-to-agent` | **核心** | 「发送给 Agent」TW 按钮插件 `$:/plugins/dsh/send-to-agent` | 一键把笔记注入 dsh 会话的入口 | marker 门控:只写一次,删掉重启不复活 |
182
+ | `tw-web-host` | **核心** | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 嵌入式 TW 编辑器的同源代理 API 基址(远程访问模式前提) | 非 force = 缺失/旧默认才写、用户自定义保留;force = 强制写回代理基址 |
183
+ | `doc-note` | 可选 | 「dsh-tiddlywiki 插件说明」笔记(tag `docs`) | 新手引导 | marker 门控:只写一次,删掉重启不复活;可反初始化 |
184
+ | `home-index` | 可选 | 默认主页「主页 / 所有标签 / 标签笔记」+ `$:/DefaultTiddlers` → 主页 | **首页**:四象限待办 + 「所有标签」「所有文章」入口 + 标签统计 + **Agent 区块**(纯 Agent / Agent+人工 分区,主标签列表排除 `agent-written`) | 同上;反初始化会一并把 `$:/DefaultTiddlers` 恢复为 GettingStarted |
185
+ | `all-articles` | 可选 | 「所有文章」——两列(🤖 Agent 撰写 / 👤 人工·人类)各自分页 | 全部条目的分栏总览;每页条数实时读 `ui.allArticles.pageSize`(设置页可调) | 同上;可反初始化 |
186
+ | `menubar-theme` | 可选 | `$:/plugins/dsh-tiddlywiki/menubar-theme` 样式表(tag `$:/tags/Stylesheet`) | 把 tiddlywiki/menubar 顶栏从默认蓝色改为跟随活动 palette 的 `background`/`foreground`,随 DSH 深浅主题自动换色 | 同上;可反初始化 |
179
187
 
180
188
  **用法**:
181
189
  - **查看状态**:设置页 →「初始化」→ 每项一个状态点(✓ 已就绪 / ✗ 缺失)+ 说明。
182
190
  - **重新初始化单项**:点该项「重新初始化」——force 重写内置内容(覆盖你对该 tiddler 的改动)并重记 marker,用于「我把首页改坏了想恢复模板」「按钮被我删了想补回」「menubar 又变回蓝色了」等场景。
191
+ - **反初始化**:可选 seed 每项(及「全部反初始化」)——删除其写入的 tiddler + marker,恢复未初始化状态(核心项不可移除;点击前有确认弹窗)。
183
192
  - **全部重新初始化**:底部「全部重新初始化」一键重跑全部。
184
193
  - **为什么删掉重启不会自动恢复**:ONE-SHOT marker(`$:/plugins/dsh-tiddlywiki/seed-*`)记录「已提供过」,之后归用户所有——想恢复请手动「重新初始化」,而非依赖重启。
185
194
 
186
- 详细设计(后台 API、force 语义、如何重新生成内置常量)见 [docs/seed-initialization.md](docs/seed-initialization.md)。
195
+ 详细设计(后台 API、force / remove 语义、如何重新生成内置常量)见 [docs/seed-initialization.md](docs/seed-initialization.md)。
187
196
 
188
197
  ### 🌐 界面语言(中文)
189
198
 
@@ -268,8 +277,11 @@ node scripts/verify-menubar-theme.mjs # 可选:真实浏览器验证 menubar
268
277
  node scripts/verify-seed-send-to-agent.mjs # 可选:全新 wiki 上 E2E 验证「发送给 Agent」按钮 seed(bundle 写入/幂等/marker)
269
278
  node scripts/verify-seeds-admin.mjs # 可选:全新 wiki + 真实 HTTP 验证 /admin/seeds 状态与 /admin/seeds/run(单跑/全跑/force/unknown id)
270
279
 
271
- # 改了 wiki 里的 $:/plugins/dsh/send-to-agent bundle 后,重新生成内置常量:
272
- 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
280
+ # 改了 scripts/bundle/send-to-agent/ 下的按钮源码(startup.js / button.tid / icon.svg)后,
281
+ # 重新组装 bundle → 重新生成内置常量:
282
+ node scripts/build-send-to-agent-bundle.mjs
283
+ node scripts/gen-seed-send-to-agent.mjs scripts/bundle/send-to-agent.bundle.json src/host/seed-send-to-agent.ts && npm run build
284
+ node scripts/verify-send-to-agent-bundle.mjs # 可选:校验组装出的 bundle 字段/内容
273
285
 
274
286
  # 改了 wiki 首页「主页 / 所有标签 / 标签笔记」后,重新生成内置 seed 常量:
275
287
  node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所有标签.tid' '<wiki>/tiddlers/标签笔记.tid' src/host/seed-home.ts && npm run build
@@ -295,11 +307,14 @@ node scripts/gen-seed-home.mjs '<wiki>/tiddlers/主页.tid' '<wiki>/tiddlers/所
295
307
  | `/dsh-tiddlywiki/upload` | POST | 文件上传到 `files/`(原始 body + `X-Filename`) |
296
308
  | `/dsh-tiddlywiki/restart` | POST | 重启 TW 子进程 |
297
309
  | `/dsh-tiddlywiki/agent/sessions` | GET | 可见会话列表(TW「发送给 Agent」选择器;含每会话 `agentPreset` 模式徽标) |
298
- | `/dsh-tiddlywiki/agent/modes` | GET | 可用「工作模式」(Agent 预设)清单 + 部署默认(v0.11.0) |
310
+ | `/dsh-tiddlywiki/agent/modes` | GET | 可用「工作模式」(Agent 预设)清单 + 部署默认;同时返回 `permissions`(权限预设 roster:`{defaultId, items:[{value,name,description}]}`,v0.14.0,来自 `permissionPresets`,缺失时 `null`) |
299
311
  | `/dsh-tiddlywiki/agent/send` | POST | 把笔记作为消息注入一个会话(`sessionController.prompt`) |
300
- | `/dsh-tiddlywiki/agent/create` | POST | 按 cwd 新建/复用 Workspace + 会话(工作区优先);可选 `mode`(Agent 预设) |
312
+ | `/dsh-tiddlywiki/agent/create` | POST | 按 cwd 新建/复用 Workspace + 会话(工作区优先);可选 `mode`(Agent 预设)、可选 `permission`(权限预设,创建后经 `permissionPresets.set` 应用到会话日志,v0.14.0;未知预设 400 拒绝) |
301
313
  | `/dsh-tiddlywiki/api/*` | any | 透传到 TW 服务(JSON) |
302
314
  | `/dsh-tiddlywiki/tw/*` | any | **同源 TW 代理**:整个 TW 前端(index + `/files/*` + TiddlyWeb API)→ 回环 TW(v0.6.0,远程访问核心) |
315
+ | `/dsh-tiddlywiki/admin/seeds` | GET | 一次性预置项实时状态(含 `removable` 标记) |
316
+ | `/dsh-tiddlywiki/admin/seeds/run` | POST | 运行一个/全部 seed(`force` = 重新初始化) |
317
+ | `/dsh-tiddlywiki/admin/seeds/remove` | POST | 反初始化:移除一个/全部可选 seed(核心项 400 拒绝) |
303
318
 
304
319
  ---
305
320
 
@@ -355,7 +370,7 @@ src/
355
370
 
356
371
  - **GitHub(公开)**:https://github.com/bbqisbbq/dsh-tiddlywiki
357
372
  - **npm**:`dsh-tiddlywiki`(https://www.npmjs.com/package/dsh-tiddlywiki)
358
- - **说明笔记**:插件在**首次启动**时把「与 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 重装会再写入;设置页「初始化」可手动重新初始化)。
373
+ - **说明笔记**:插件在**首次启动**时把「与 dsh 联动、**功能必需**」的一次性项写入 wiki(**统一 seed 注册表**,见 [🧩 初始化](#🧩-初始化一次性预置)):「发送给 Agent」按钮插件(`$:/plugins/dsh/send-to-agent`)、`$:/config/tiddlyweb/host` 同源代理基址——只写一次、手动编辑不被覆盖、**删除后重启不会自动恢复**(一次性标记)。**可选项**(`dsh-tiddlywiki 插件说明` 笔记、默认主页「主页/所有标签/标签笔记」+ `$:/DefaultTiddlers`、「所有文章」两列分页页、`menubar` 顶栏主题自适应样式表 `$:/plugins/dsh-tiddlywiki/menubar-theme`)**默认不写入、不强制**——需要时设置页「初始化」手动「重新初始化」,不想要可「反初始化」移除。
359
374
 
360
375
  **可被检索的标准字段**(为 GitHub / npm / 搜索引擎发现):
361
376
 
@@ -1,6 +1,8 @@
1
- # 统一 seed 注册表 & 后台「重新初始化」
1
+ # 统一 seed 注册表 & 后台「重新初始化 / 反初始化」
2
2
 
3
- > 本文档说明 dsh-tiddlywiki **v0.12.0** 引入/完善的「一次性预置」机制(v0.13.0 新增 `menubar-theme` seed):哪些东西需要随插件初始化写入 wiki、它们与 dsh 的联动关系、ONE-SHOT / force 语义、后台 API 与设置页操作,以及开发时如何重新生成内置常量。
3
+ > 本文档说明 dsh-tiddlywiki 的「一次性预置」机制:哪些东西需要随插件初始化写入 wiki、它们与 dsh 的联动关系、**核心项 / 可选项**两层划分、ONE-SHOT / force / remove 语义、后台 API 与设置页操作,以及开发时如何重新生成内置常量。
4
+ >
5
+ > 版本沿革:v0.10.0 引入统一注册表 + 后台「重新初始化」;v0.13.0 新增 `menubar-theme` seed;**v0.15.0 拆成核心/可选两层**——启动只自动写**功能必需**项(发送给 Agent 按钮 + TW 前端 API 基址),可选项默认不写入、不强制,设置页可随时「重新初始化」写入或「反初始化」移除。
4
6
 
5
7
  ---
6
8
 
@@ -8,16 +10,16 @@
8
10
 
9
11
  插件与 dsh 有多个联动功能,**前提是 wiki 里存在特定 tiddler / 配置**。这些项历史上靠手工往 wiki 里塞(只存在于个别 wiki 的 git 历史中),**初次安装插件的新用户拿不到**,导致联动功能残缺:
10
12
 
11
- | 联动功能 | 依赖的 wiki 预置 | 缺失时的表现 |
12
- |---|---|---|
13
- | 一键发送给 Agent | `$:/plugins/dsh/send-to-agent` 按钮插件 | TW 工具栏没有「发送给 Agent」按钮,后端路由在但无入口 |
14
- | 首页(待办四象限 / 标签统计 / Agent 区块) | 「主页」「所有标签」「标签笔记」三个 tiddler + `$:/DefaultTiddlers` → 主页 | 系统提示承诺的「首页把 Agent 笔记单独列在 Agent 区块、主标签列表只统计人类笔记」完全不存在;TW 打开的是 GettingStarted |
15
- | 所有文章(两列分页总览) | 「所有文章」tiddler | 没有一键总览全部条目的入口 |
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 深浅主题变化 |
18
- | 新手引导 | 「dsh-tiddlywiki 插件说明」笔记 | 新用户没有入门说明 |
13
+ | 联动功能 | 依赖的 wiki 预置 | 缺失时的表现 | 层级 |
14
+ |---|---|---|---|
15
+ | 一键发送给 Agent | `$:/plugins/dsh/send-to-agent` 按钮插件 | TW 工具栏没有「发送给 Agent」按钮,后端路由在但无入口 | **核心**(功能必需) |
16
+ | 嵌入式 TW 编辑器 | `$:/config/tiddlyweb/host` 指向同源代理 | iframe 里的 TW 前端 API 基址指向错误的 origin,编辑/保存失效 | **核心**(功能必需) |
17
+ | 首页(待办四象限 / 标签统计 / Agent 区块) | 「主页」「所有标签」「标签笔记」三个 tiddler + `$:/DefaultTiddlers` → 主页 | 没有承诺的首页;TW 打开的是 GettingStarted | 可选(不强制) |
18
+ | 所有文章(两列分页总览) | 「所有文章」tiddler | 没有一键总览全部条目的入口 | 可选(不强制) |
19
+ | menubar 顶栏主题自适应 | `$:/plugins/dsh-tiddlywiki/menubar-theme` 样式表(tag `$:/tags/Stylesheet`) | tiddlywiki/menubar 顶栏停留在默认色映射的蓝色(`$:/config/DefaultColourMappings/` → `#5778d8`) | 可选(不强制) |
20
+ | 新手引导 | 「dsh-tiddlywiki 插件说明」笔记 | 新用户没有入门说明 | 可选(不强制) |
19
21
 
20
- v0.10.0 把**全部**这类项收进一个**统一 seed 注册表**,随插件首次启动自动预置;并给后台加「重新初始化」能力,让缺失/被改坏的项可以随时由用户手动恢复。
22
+ **v0.15.0 原则:不给用户强绑定。** 启动路径只自动预置**核心**项(发送给 Agent 按钮、TW 前端 API 基址——它们与插件自身功能强关联);其余**可选项**(说明笔记 / 首页 / 所有文章 / menubar 顶栏主题自适应)默认**不自动写入**,需要时在设置页「初始化」区块手动「重新初始化」,不想要了可随时「反初始化」移除。
21
23
 
22
24
  ---
23
25
 
@@ -30,25 +32,28 @@ interface SeedDef {
30
32
  id: string // doc-note / send-to-agent / home-index / tw-web-host
31
33
  title: string // 设置页显示名
32
34
  description: string // 说明
33
- check(ctx): Promise<SeedStatus> // 当前状态(present / detail),供 UI 展示
35
+ core: boolean // true=功能必需(启动自动 seed);false=可选(不强制,可反初始化)
36
+ check(ctx): Promise<SeedStatus> // 当前状态(present / removable / detail),供 UI 展示
34
37
  run(ctx, force): Promise<SeedRunResult> // 执行;force=false 保持 ONE-SHOT,force=true 重写内置内容
38
+ remove?(ctx): Promise<SeedRunResult> // 反初始化:删除写入的 tiddler + marker(仅可选 seed 实现)
35
39
  }
36
40
  ```
37
41
 
38
- | id | 实现 | 写什么 | marker |
39
- |---|---|---|---|
40
- | `doc-note` | `seed-notes.ts` → `seedDocNote` | 「dsh-tiddlywiki 插件说明」(tag `docs`) | `$:/plugins/dsh-tiddlywiki/seed-doc-note` |
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` |
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` |
45
- | `tw-web-host` | `seeds.ts` 内联 | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 无 marker(ensure 型,见 §4) |
42
+ | id | 实现 | 写什么 | marker | 层级 |
43
+ |---|---|---|---|---|
44
+ | `doc-note` | `seed-notes.ts` → `seedDocNote` / `unseedDocNote` | 「dsh-tiddlywiki 插件说明」(tag `docs`) | `$:/plugins/dsh-tiddlywiki/seed-doc-note` | 可选 |
45
+ | `send-to-agent` | `seed-send-to-agent.ts` → `seedSendToAgent` | `$:/plugins/dsh/send-to-agent` 按钮 bundle(`application/json`) | `$:/plugins/dsh-tiddlywiki/seed-send-to-agent` | **核心** |
46
+ | `home-index` | `seed-home.ts` → `seedHomeIndex` / `unseedHomeIndex` | 「主页」+「所有标签」+「标签笔记」(tag `索引`),并把 `$:/DefaultTiddlers` 指向 `[[主页]]` | `$:/plugins/dsh-tiddlywiki/seed-home-index` | 可选 |
47
+ | `all-articles` | `seed-all-articles.ts` → `seedAllArticles` / `unseedAllArticles` | 「所有文章」(tag `索引`)——两列分页总览,每页条数实时读 `ui.allArticles.pageSize`(默认 10) | `$:/plugins/dsh-tiddlywiki/seed-all-articles` | 可选 |
48
+ | `menubar-theme` | `seed-menubar-theme.ts` → `seedMenubarTheme` / `unseedMenubarTheme` | `$:/plugins/dsh-tiddlywiki/menubar-theme`(tag `$:/tags/Stylesheet`)——覆盖 tiddlywiki/menubar 顶栏:把 `<<colour menubar-background>>` 的「默认色映射蓝色」改为跟随活动 palette 的 `background`/`foreground`,随 DSH 主题切换(`$:/palette` 翻转)自动换色 | `$:/plugins/dsh-tiddlywiki/seed-menubar-theme` | 可选 |
49
+ | `tw-web-host` | `seeds.ts` 内联 | `$:/config/tiddlyweb/host` → `/dsh-tiddlywiki/tw/` | 无 marker(ensure 型,见 §4) | **核心** |
46
50
 
47
51
  ### 统一入口(`src/index.ts` 导出)
48
52
 
49
- - `runAllSeeds(ctx)` —— **启动路径**:全部非 force 执行(只写缺失)。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
50
- - `checkAllSeeds(ctx)` —— 返回每项当前状态数组(设置页「初始化」区块数据源)。
53
+ - `runAllSeeds(ctx)` —— **启动路径**:**只 seed 核心项**(`core: true`:发送给 Agent 按钮 + TW 前端 API 基址),非 force(只写缺失)。可选项**不自动写入**。启动时序在 `configStore.load()` 之后、`bootstrapGit()` 之前,保证 seed 写入的内容进入首次 git 提交。
54
+ - `checkAllSeeds(ctx)` —— 返回每项当前状态数组(设置页「初始化」区块数据源,含 `removable` 标记)。
51
55
  - `runSeedById(ctx, id?, force)` —— 单跑(`id` 指定)或全跑(`id` 为 `undefined`);`force` 为手动「重新初始化」;未知 `id` 返回显式错误结果而非抛异常。
56
+ - `removeSeedById(ctx, id?)` —— **反初始化**:删除单个(或全部)可选 seed 写入的 tiddler + marker,恢复「从未初始化」状态;核心项拒绝移除。
52
57
 
53
58
  ---
54
59
 
@@ -84,6 +89,15 @@ interface SeedDef {
84
89
 
85
90
  > ⚠️ force 会**覆盖你对目标 tiddler 的编辑**,仅用于明确想要恢复内置内容时。日常「补缺失」不需要 force——启动流程与「全部重新初始化」之外的场景由 ONE-SHOT 语义兜底。
86
91
 
92
+ ### 反初始化(remove,v0.15.0)
93
+
94
+ 设置页「初始化」区块的「反初始化」按钮(以及后台 `POST /admin/seeds/remove`)触发,**只对可选 seed 提供**:
95
+
96
+ - 删除该 seed 写入的全部 tiddler **与** 一次性 marker,把 wiki 恢复到「从未初始化」状态;
97
+ - 之后该 seed 在设置页状态为「缺失」,需要时可再用「重新初始化」写回;
98
+ - `home-index` 反初始化时,若 `$:/DefaultTiddlers` 仍指向 seed 写出的 `[[主页]]`,一并恢复为 `[[GettingStarted]]`(用户自定义的默认页不受影响);
99
+ - **核心 seed(发送给 Agent 按钮 / TW 前端 API 基址)不可反初始化**——它们与插件自身功能强关联,移除会破坏对应能力;「全部反初始化」也只处理可选 seed。
100
+
87
101
  ---
88
102
 
89
103
  ## 5. 后台 API
@@ -98,17 +112,18 @@ interface SeedDef {
98
112
  {
99
113
  "ok": true,
100
114
  "items": [
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/" }
115
+ { "id": "doc-note", "title": "插件说明笔记", "description": "…", "present": true, "removable": true, "detail": "已存在" },
116
+ { "id": "send-to-agent", "title": "「发送给 Agent」按钮", "description": "…", "present": true, "removable": false, "detail": "已存在" },
117
+ { "id": "home-index", "title": "首页(主页 / 所有标签 / 标签笔记)", "description": "…", "present": false, "removable": true, "detail": "缺失:主页" },
118
+ { "id": "all-articles", "title": "所有文章(两列分页总览)", "description": "…", "present": true, "removable": true, "detail": "已存在" },
119
+ { "id": "menubar-theme", "title": "menubar 顶栏主题自适应", "description": "…", "present": true, "removable": true, "detail": "已存在" },
120
+ { "id": "tw-web-host", "title": "TW 前端 API 基址(同源代理)", "description": "…", "present": true, "removable": false, "detail": "已指向 /dsh-tiddlywiki/tw/" }
107
121
  ]
108
122
  }
109
123
  ```
110
124
 
111
- wiki 服务未运行时返回 `503 { ok: false, error: "wiki service is not running" }`。
125
+ - `removable: true` = 可选 seed(可「反初始化」移除);`false` = 核心 seed(功能必需,不可移除)。
126
+ - wiki 服务未运行时返回 `503 { ok: false, error: "wiki service is not running" }`。
112
127
 
113
128
  ### `POST /dsh-tiddlywiki/admin/seeds/run`
114
129
 
@@ -136,17 +151,40 @@ wiki 服务未运行时返回 `503 { ok: false, error: "wiki service is not runn
136
151
  - 未知 `id` → `400 { ok: false, results: [{ id, ok: false, error: "unknown seed: <id>" }] }`;
137
152
  - 请求体过大(> 1MB)或非法 JSON → `400`。
138
153
 
154
+ ### `POST /dsh-tiddlywiki/admin/seeds/remove`
155
+
156
+ 反初始化(v0.15.0)。请求体:
157
+
158
+ | 字段 | 类型 | 说明 |
159
+ |---|---|---|
160
+ | `id` | string, 可选 | 指定移除单项;缺省 = 全部可选 seed |
161
+
162
+ 响应与 `/admin/seeds/run` 同构(`results[]`):
163
+
164
+ ```jsonc
165
+ {
166
+ "ok": true,
167
+ "results": [
168
+ { "id": "menubar-theme", "ok": true, "wrote": false, "detail": "已移除:$:/plugins/dsh-tiddlywiki/menubar-theme、$:/plugins/dsh-tiddlywiki/seed-menubar-theme" }
169
+ ]
170
+ }
171
+ ```
172
+
173
+ - 核心 seed(发送给 Agent 按钮 / TW 前端 API 基址)**不可移除**——指定它们 → `400 { ok: false, results: [{ id, ok: false, error: "该 seed 为核心项(功能必需),不可反初始化" }] }`;「全部反初始化」会自动跳过核心项;
174
+ - 未知 `id` → `400`,`error: "unknown seed: <id>"`;
175
+ - wiki 服务未运行时 → `503`。
176
+
139
177
  ---
140
178
 
141
179
  ## 6. 设置页操作
142
180
 
143
181
  DSH 设置 →「TiddlyWiki 知识库」→ 最底部「**初始化(一次性预置)**」区块:
144
182
 
145
- - 顶部状态行:`共 N 项,M 项已就绪`;
146
- - 每项一行:状态点(✓ 已就绪 / ✗ 缺失)+ 名称 + 实时详情(如缺失了哪个 tiddler)+ 「重新初始化」按钮;
147
- - 底部:「**全部重新初始化**」按钮(force 全部)。
183
+ - 顶部状态行:`共 N 项,M 项已就绪;可移除 K 项`;
184
+ - 每项一行:状态点(✓ 已就绪 / ✗ 缺失)+ 名称 + 实时详情(如缺失了哪个 tiddler)+ 「重新初始化」按钮;**可选 seed 另有「反初始化」按钮**(核心 seed 不显示);
185
+ - 底部:「**全部重新初始化**」按钮(force 全部)+「**全部反初始化**」按钮(移除全部可选 seed,核心项保留;点击前有确认弹窗)。
148
186
 
149
- 前端源码:`src/client/settings-page.ts` 的 `renderSeedsSection`;样式 `src/client/styles.ts`(状态点 `ok` / `missing`)。
187
+ 前端源码:`src/client/settings-page.ts` 的 `renderSeedsSection`;样式 `src/client/styles.ts`(状态点 `ok` / `missing`、危险按钮 `dsh-tw-settings-danger`)。
150
188
 
151
189
  ---
152
190
 
@@ -175,9 +213,9 @@ npm run typecheck && npm run build && npm run selftest
175
213
 
176
214
  新增一个 seed 的步骤:
177
215
 
178
- 1. 写实现(或复用现有 `seedXxx(client, { force? })` 模式);
179
- 2. 在 `src/host/seeds.ts` 的 `SEED_DEFS` 里登记(`check` + `run`);
180
- 3. (若需要展示/强制恢复)确认启动路径 `runAllSeeds` 自动覆盖它;
216
+ 1. 写实现(或复用现有 `seedXxx(client, { force? })` 模式;可选 seed 再补 `unseedXxx(client)` 返回 `{ removed: string[] }`);
217
+ 2. 在 `src/host/seeds.ts` 的 `SEED_DEFS` 里登记(`core` + `check` + `run`,可选 seed 加 `remove`);
218
+ 3. 核心 seed 会被启动路径 `runAllSeeds` 自动覆盖;可选 seed 仅设置页手动触发;
181
219
  4. selftest 增加对应断言段,跑 `verify-seeds-admin.mjs` 验证后台 API;
182
220
  5. bump 版本、更新本文档与 README。
183
221
 
@@ -186,13 +224,13 @@ npm run typecheck && npm run build && npm run selftest
186
224
  ## 8. 验证
187
225
 
188
226
  - `npm run typecheck` / `npm run build`:编译与打包;
189
- - `npm run selftest`:5d 段覆盖注册表清单、runAllSeeds、单跑幂等、force 重写、unknown id、tw-web-host 三分支(custom 保留 / force 写回 / legacy 修复);
190
- - `node scripts/verify-seeds-admin.mjs`:全新 wiki + 真实 HTTP,端到端验证 `GET /admin/seeds` 状态流转(全缺失 → 启动后全就绪)与 `POST /admin/seeds/run`(force 单跑恢复被改坏的首页、非 force 不覆盖用户内容、force-all 恢复代理基址、unknown id 400)。
227
+ - `npm run selftest`:5d 段覆盖注册表清单(含 `core` / `removable`)、**启动只 seed 核心项**、手动全跑只写缺失、单跑幂等、force 重写、unknown id、tw-web-host 三分支(custom 保留 / force 写回 / legacy 修复)、**反初始化**(单移除 / 核心拒绝 / unknown / 全部移除保留核心);
228
+ - `node scripts/verify-seeds-admin.mjs`:全新 wiki + 真实 HTTP,端到端验证 `GET /admin/seeds` 状态流转(全缺失 → 启动后仅核心就绪)与 `POST /admin/seeds/run`(force 单跑恢复被改坏的首页、非 force 不覆盖用户内容、force-all 恢复代理基址、unknown id 400)+ `POST /admin/seeds/remove`(移除可选、核心 400、remove-all 仅剩核心)。
191
229
 
192
230
  ---
193
231
 
194
232
  ## 9. 生效方式
195
233
 
196
234
  - seed 注册表属插件源码逻辑:**重启 dsh web** 后生效(会中断当前会话,注意时机)。
197
- - 本 wiki(已存在上述 tiddler):重启只补写 marker,**不覆盖现有内容**;要强制恢复内置内容,用设置页「初始化」。
198
- - 新装 wiki:首次启动自动获得全部预置(说明笔记 / 发送按钮 / 首页 / 代理基址),无需手工放 tiddler。
235
+ - 本 wiki(已存在上述 tiddler):重启后启动路径**只补核心项**(发送给 Agent 按钮 / TW 前端 API 基址,缺才写),**不覆盖任何现有内容**;可选项维持现状,可在设置页「初始化」手动「重新初始化」或「反初始化」。
236
+ - 新装 wiki:首次启动只自动获得**核心预置**(发送按钮 + 代理基址);说明笔记 / 首页 / 所有文章 / menubar 顶栏主题自适应为可选项,需要时在设置页写入,不想要也不会被强制。