# dsh-tiddlywiki 能力清单

> 从 README 拆出（v0.27.1 起 README 精简为入口页，完整能力清单与实现细节在这里）。

| 能力 | 说明 |
|---|---|
| 🏠 **文档中心起步包** | 首次安装自动 seed：插件说明 + 「示例与文档」（主题汇总模板 / 教程 / 三个示例主题页），首页「📚 插件文档」栏一键查阅；**同名 tiddler 已存在一律安全跳过，绝不覆盖你的数据**（v0.16.22）；插件说明里的**工具清单由工具注册表实时生成**，不会再写着「10 个工具」却已经 15 个（v0.22.0） |
| 🗂 **多知识库（v0.28.0）** | **多个 TiddlyWiki 同时在线**，每个库独立配置、独立 git 仓库（或共用仓库按文件夹物理划分 —— 「工作 + 个人」同仓、「书籍」独立仓，两种拓扑都支持）。开关是 `wikis.json` 的 `mode`，**缺省 `single`**：升级用户的行为逐字不变（位置仍由旧指针文件 > cordis 默认决定）。每个库有自己的编辑器与入口（右下角「知识库」菜单的分组、每个库自己的 `/tw/<id>/` 同源基址），设置页「知识库列表」负责增删改 / 启停 / 设为默认 / 开局自启 / 对 Agent 可见性；「移出列表」明确**不会删除目录**。快速笔记卡片也能选目标库（默认跟随你在 GUI 里看的那个库；**整张卡片一起换库**：标签建议 / 最近 / 附件 / 保存 / 弹窗编辑器同库）。**左侧边栏每个在运行的库一行**（各用自己在「知识库列表」里配的显示名与图标，当前显示的那个高亮）：**点另一个库 = 立刻切过去**（v0.28.13 起面板保持打开），点当前那个库才收起 —— 入口同时也是开关。切换 = 换成那个库的整份 TW 文档（10–30MB，TW 回 `no-store` 缓存不了），v0.28.14 起**点击即开始换**（不再先等一次 `/status`）、高亮即时跟上、界面底部显示「正在载入知识库「X」…」。 |
| 🎨 **每库图标用 DSH 官方图标系统（v0.28.8）** | 知识库列表里每行的图标是个**弹出式网格**：收录 **DSH 官方的 36 个图标**（内联的是上游的 path 数据，客户端保持纯 DOM、零运行时依赖）+ 本插件自绘的 8 个 + 一组 emoji，超出 **48 个一页**分页展示；选中即写入 `wikis.json` 的 `icon`。同时修掉一个真 bug：`/admin/wikis` 的读取视图漏了 `icon` 字段，导致「选了图标、界面立刻变回默认」（写进去了、读回来是 `undefined`）—— 守门钉死该字段并反向验证过。 |
| 📑 **设置页分页：总览 / 本库配置 / 全局（v0.28.8）** | 多库模式下十几块面板挤在一页里，既分不清「改这个库」还是「改整个插件」，改完也没有退出口。现在按作用域分成三个 tab：「**总览**」（名册 + 全局项）、「**本库配置**」（点某个库的「配置」才出现；按钮变成「**退出配置**」，再点一次就回到总览）、「**全局**」。「插件管理（自带官方插件）/ 主题管理 / 语言管理 / 初始化」这些**per-库**面板只在本库配置里渲染（此前它们混在全局项中，看着像所有库共用一个设置）。**单库安装没有 tab 条**，就是原来那一页，逐字不变。 |
| 🆕 **新会话也能选知识库** | 会话知识库选择器长在输入框左侧的官方内联座位 `conversation.input.left`（v0.31.0 起；此前挂的 `conversation.input.selector.context` 在 **DSH 0.2.1 里根本不存在**，那段代码只会静默不渲染）。**空白会话里同样可用**，且任何情况下都只有**一个**选择器；可见库 ≤1 时不渲染。 |
| 🏷 **「默认库」不再是一个名字（v0.28.12）** | 设置过默认知识库之后，界面**不再显示「默认库」这个字样**——被设为默认的那个库一律直接用**它自己的显示名**（后缀「（默认）」只作身份标记）。会话选择器里它排在最前、**新会话打开时它已经是选中项**（选中它 = 清空显式作用域，所以以后改了默认库，没动过选择器的会话会跟着走）；剪藏目标下拉里它代表"不指定"，同一个库不会出现两次；快速笔记「写入」目标、设置页「单库（只跑 X）」与切单库的确认文案同样直呼其名。只读清单失败时给中性说法，绝不退回「默认库」。 |
| 🖥 **桌面版（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`）。 |
| 🔒 **对 Agent 的可见性（v0.28.0）** | 每个库可设「对 Agent 隐身」= **彻底不可达**：不进会话选择器、不进注入提示词、`tiddlywiki_*` 工具永不触及（人在 GUI 里照常用它）。会话级作用域**单选**（输入框上方的选择器，选择存在 `$DSH_HOME/dsh-tiddlywiki/sessions.json` 并跨重启存活），工具按会话路由，**可见库多于一个时每条回执都标明库名**，注入提示词按会话求值并读**该库自己**的 `prompt.*`。两条刻意的拒绝：作用域指向隐身库 → 忽略（隐身是硬边界）；指向可见但**没在跑**的库 → **报错并带上库名**，绝不静默落到别的库 —— 静默换库会让笔记落进你没指定过的库，而且看起来一切正常。 |
| 🧩 **拆库引导（v0.28.0）** | 想把现有库按用途拆开（语料/归档 vs 工作集）时有一份现成流程：[docs/wiki-split.md](wiki-split.md) 顶部是**一整段可直接复制给 Agent 的话**；Agent 会先只读体检、再问五个问题（每个都给默认建议）、出方案表格等你确认，然后备份 → `git mv` 保历史 → 登记进插件 → 校验，**旧库一个都不删**。随包 skill `dsh-tiddlywiki-wiki-split` 在启动时**注册进宿主 skill 注册表**（v0.31.0 起：内存注册、随插件卸载消失、不写你的 `$DSH_HOME`；宿主没有该服务时才回落到 `$DSH_HOME/skills/`，且**只覆盖带标记的文件**），也可以直接说「用拆库 skill 帮我拆」。 |
| ⚡ **`/note` 一句话记笔记（v0.31.0）** | 输入框里打 `/note 标题` 换行写正文，直接写进当前会话的知识库：**不产生模型消息**（不占上下文、不用等回复），自动打 `inbox` 标签 + 工作区标记，**不打 `agent-written`**（那是人写的）。同名笔记**已存在就拒绝**并指路 —— 静默覆盖正是「同一件事被写成多份互相矛盾」的来源。 |
| 🧭 **提示词里的读写纪律（v0.31.0）** | 注入提示词新增两块：**「先查再答」**（问题可能已沉淀成笔记时先 `tiddlywiki_search`，别凭记忆答）与**「时效与去重」**（一件事只留一处权威表述、命中就**原地改那一节**；每条笔记要能看出还有效到什么时候 —— `valid-until` / `review-after` / 「长期有效」，说不清时效的别写进 wiki；**不写流水账**，正文不追加「某日改了什么」，git 历史里有；**读到就先判时效**，过期/被取代就更新或明说已过期）。目的是治「agent 爱写短命内容、同一件事写多份、正文越堆越长」。 |
| 📄 **`.tid` 文件预览（v0.32.0）** | 在右侧栏打开 wiki 里的 `.tid` / `.tiddler` 文件时，看到的是**真 TiddlyWiki 渲染**（链接、宏、样式都生效），而不是一堆 `title:` 字段行加原始 wikitext。字段行会单独排一行摘要。**绝不白屏**：还没读到内容会说「等待文件内容…」，只有字段没有正文会说清楚，渲染失败则直接显示原文。 |
| 📤 **导出笔记（v0.31.1）** | 「把这条笔记给我」不用再让助手把正文贴进回复：`tiddlywiki_export` 把一篇笔记落成文件（`md` 带 YAML frontmatter / `tid` 是 TW 原生格式 / `json` 是完整 tiddler），然后助手用 DSH 的 `present` 作为交付物给你。**同名文件已存在就拒绝**（导出是旁路产物，静默覆盖会毁掉你上一次的交付物）；插件自身命名空间（`$:/plugins/dsh-tiddlywiki/`，可能含密钥）拒绝导出。 |
| 📍 **知识库位置可切换** | 设置页「知识库位置」可把插件切换到**任意本地文件夹**（不用改 cordis 配置、不用重装）：就地停/起 TW 子进程，目标目录没有 `tiddlywiki.info` 时自动 `--init server` 建一个全新知识库；选择记在 `$DSH_HOME/dsh-tiddlywiki/location.json`——一个**在 wiki 之外**的指针文件（所以切到新 wiki 后仍记得「我用的是哪个」），「恢复为配置默认」一键清除；**切换失败自动回滚**到原知识库并如实告知（v0.22.0）。⚠️ 它一次只有一个库在线；要**多库同时在线**见上面的「多知识库」（v0.28.0） |
| 🔄 **seed 更新检测** | seed 标记记录**内容哈希**：内置内容在本 wiki 预置之后更新过 → 设置页显示「⬆ 有更新」；被你改过 → 显示「✏️ 本地已修改」，且「重新初始化」前**二次确认**；两者都基于哈希判定，绝不猜（旧格式标记会明确显示「尚未启用更新检测」，不会误报为「你改过」，v0.22.0） |
| 🎨 **自定义样式** | 「自定义样式」seed：编辑器美化 / 窄屏侧栏隐藏 / menubar 加高 / 批注弹窗等 5 张通用样式表，新 wiki 也能一键初始化（可选，v0.16.22） |
| 📝 **可配置的注入提示词** | 插件注入每个会话的「TiddlyWiki 持久知识库」提示词可在设置页配置：**默认精简版**（v0.30.63 起 **937 字符 / 预算 1000**，只保留工具 schema **表达不了**的约定——同步时机 / 写入被拒后重读而不用 `force` / 时效标注 / 淘汰权归人 / `human-edited` / 链接格式 / todo 约定），可选**完整版**（额外附一份**由工具注册表实时生成**的参数索引，不会再过期）；`extra` 追加自定义规范、`override` 整段接管、可整体停用；**保存后无需重启 dsh web**（section 即时重注册，当前会话下一步即生效），设置页可**按表单当前值预览**即将注入的全文（未保存的形态切换也立刻可见，v0.21.0 / v0.22.7）。**v0.29.0 去重**：与工具 description 逐字重复的句子（工作区标记 / 先窄后宽 / 多词 AND / tags·type 保留规则）从提示词里删掉、**只留 schema 一份**，`verify-prompt.mjs` 改为在 schema 侧逐条断言「从提示词删 ≠ 丢了」。**v0.30.62 再瘦一轮**（1011 → 866 字符）、**v0.30.63 拆链接两条**（866 → 937 字符）：写入约定压成「被拒后重读、别用 `force`」，intro 去掉多库下就不成立的「本机有一个知识库」；**多库时正文自动换成带库 id 的链接格式** `/tw/<id>/#标题` —— 裸 `/tw/` 在助手正文里跟随**焦点库**、写进笔记则把中央 TW 的 iframe 导航到**默认库**，两种都不是「本会话那个库」 |
| 🌐 **中英双语界面**（v0.30.6） | 插件自己的界面（FAB / 侧边栏 / 快速笔记 / 工具卡片 / 设置页 / toast）与 TW 子进程**共用同一个 `uiLanguage` 设置**；文案按区域分片成 `i18n-*.ts` 的 `zh`/`en` 目录，守门保证两侧键集合一致、且**客户端代码里不再有硬编码中文文案** |
| 🤖 **Agent 工具** | 15 个 `tiddlywiki_*` 工具：检索（**相关度排序 + 命中处片段 + 字段过滤**）、读写、**增量追加**、批量、重命名、**软删除/回收站**、**反向链接**、**附件入库**、**知识库体检**、git 同步与冲突解决（v0.30.5 起 `git_sync` **一次同步所有可同步的库**、按仓库去重、逐仓库独立成败；**v0.30.58 起「有远端」= 配了 `git.remote` **或**该库所在仓库自己的 `origin`**，配置为空即回落、回执写明远端与来源；v0.19.0；检索/最近仍在**服务端**排除二进制附件，大 wiki 上从 515MB/17s 降到 ~0.4s） |
| 🛡️ **不会被覆盖的写入** | 所有写入路径（agent 工具 **与** 快速笔记/编辑器路由）都**先读后写**：不传 tags 就保留原有标签、自定义字段与**内容类型**（`text/css`/wikitext 等不会被重置成 Markdown，v0.20.1）；`tiddlywiki_put(..., expectedModified/expectedRevision)` 与 `tiddlywiki_delete(..., expectedModified/expectedRevision)` 乐观并发——读取后若有人（在 TW 编辑器里）改过，写入/删除被拒绝（HTTP 409）而不是静默覆盖或丢进回收站；**给了哪个令牌就必须匹配哪个**（v0.23.5：两个令牌是 AND 不是 OR——`revision` 是 TW 的内存计数器、重启会复位，旧逻辑会因此静默放行跨重启的覆盖）；`tiddlywiki_attach` 的同名标题**默认拒绝**（要覆盖必须 `force: true`）；`tiddlywiki_delete` 默认**软删除进回收站**，`tiddlywiki_trash` 可恢复（v0.19.0 / v0.19.1 / v0.19.5 / v0.23.5）。**v0.25.0**：`tiddlywiki_append` / `tiddlywiki_rename` / `tiddlywiki_batch_put`（逐条目）也支持并发令牌——它们同样是「读全文 → 整篇回写」，此前**没有令牌可传**，而注入的提示词恰恰让模型回传 `expectedModified`；`tags: []` 现在表示**清空全部标签**（此前被当成「未传」而静默保留，模型按 lint 的 junk-tags 建议去清标签时什么都不会发生）；`tiddlywiki_rename` 更新引用时若某个引用者在遍历期间被改动过，**跳过它**并在回执里报出数量，而不是覆盖它 |
| 🏷 **工作区感知的读写** | **新建**笔记自动带 `ws/<项目名>` 标签 + `workspace` 字段（项目名取自会话工作目录，`note.workspaceMark` 可关）；`tiddlywiki_search` 因此默认**先在本项目里找、区内 0 条才自动扩大到全库**并在回执里写明实际范围，`query` 按空白切词、**全部词命中**才算（AND）。工作区只是**附加**标记，绝不改写笔记原有的标签/字段，也**只在新建时**打（v0.24.0） |
| 🕰 **时效性内容只提示不删** | 阶段性笔记（版本记录 / 部署步骤 / 排期 / 临时方案）可声明 `valid-until`（硬过期）或 `review-after`（该复查），被取代时写 `superseded-by` + `superseded` 标签并**保留旧笔记**；`tiddlywiki_lint` 的 `stale` 检查**只报告**（含「版本号或 done 标签 + 长期未改动」的**候选**，明确标注非判定）——**淘汰永远由人决定**，插件不会自动删除或归档任何笔记（v0.24.0） |
| 🚰 **重启不丢写入** | 停/重启 TW 只有一条路：`drainThenStop()`——**排干 syncer 队列之后才停子进程**，`/restart`、`/admin/restart`、插件/主题变更后的重启、知识库切换、`/sync`、seed、**以及启动自举路径**（v0.29.0：`pluginAdded` 与 `uiLanguage` 两处曾是裸 `server.restart()`，现在全部走 `instance.restart()`）都经它；排干不完整会在回包里如实报 `drained:false`，而不是假装没事（v0.24.1）。唯一的例外是 `dispose()`（卸载路径按设计不排干，且它只从会先排干的 `stopEntry` 到达）|
| 🕒 **时间戳不再丢** | 插件写入的每条笔记都会带上 TW 的 `created`/`modified`（17 位紧凑 UTC，与 TW 编辑器逐字节一致）：新建 = 两者都取当前时刻，覆盖 = **保留原 `created`、刷新 `modified`**。此前这两个字段被当成「TW 服务端会补」而丢弃，而服务端**从不补**——缺 `modified` 的条目会被 TW 的 `sortTiddlers` 当空串，在 `+[!sort[modified]]` 页面上**直接沉到最后一名**（表现为「新日记没被收录」）。`TiddlyWebClient.put()` 还有一道兜底，任何写路径都不会写出无时间戳的条目（v0.22.5） |
| 🧼 **渲染片段净化** | 回复流卡片与会话汇总注入的 TW 片段先经 **host 白名单净化**（丢 `iframe`/`script`/`svg`/`on*`/`javascript:`/`data:text/html` 等）——TW 自己的解析器只剥 `on*`，`<iframe src="javascript:…">` 会原样通过并在 DSH 页面里执行（v0.19.1 修复的存储型 XSS） |
| 🔒 **写路由方法校验** | 每个写路由只接受自己的 HTTP 方法：跨站 `GET /sync`、`GET /restart`、`GET /upload` 一律 405 且无副作用（v0.19.0 修复了「任意网页一张 `<img>` 即可触发 pull/commit/push」的 CSRF 面） |
| 🔑 **密钥不外泄** | `bridge.token` / `ui.sendToAgent.token` / **`auth.password`**（v0.20.0）在 `/admin/state`、`/admin/config` 的回包里是 `********`（设置页原样保存 ≠ 覆盖，清空即删除），`git.remote` 里的 PAT 打码；**`/tw`、`/api` 与 `POST /render` 都拒绝 `$:/plugins/dsh-tiddlywiki/` 命名空间**——此前 `/render` 能把配置 tiddler 连 token 与 PAT 一起渲染出来（v0.19.3 / v0.20.0） |
| 🧯 **路由不会拖垮进程** | 所有路由经 `guardHandler` 包装：任何 rejection（含代理里 try 之外的 `new URL()`）都变成 413/500 响应，而不是宿主未处理的 promise rejection（那会**直接结束 dsh web 进程**并挂死请求）；剪藏桥 listen 后保留常驻 `error` 监听（v0.19.3） |
| 📊 **回复流卡片** | 工具结果显示原生 TW 卡片（**按笔记自己的内容类型渲染**：Markdown 笔记就是 Markdown，v0.18.0），检索/最近列表带**命中处摘要**（v0.22.8）；`[标题](/dsh-tiddlywiki/tw/#标题)` 点击直达 TW 面板 |
| 📤 **发送给 Agent** | TW 笔记工具栏一键把当前笔记注入所选 dsh 会话（可选工作模式/权限/附加说明）；成功/失败会弹出提示（v0.20.0 修复：此前提示把自由文本当 tiddler 标题传给 TW notifier，全部静默） |
| 🧭 **内嵌编辑器** | 中央列内嵌完整 TW 5 编辑器（同源代理，Tailscale/内网/域名/HTTPS 均可） |
| 🗂️ **右侧边栏 Tab** | DSH 新右侧栏（rightbar）：首页「TiddlyWiki 知识库」入口一键打开，与聊天并排；链接点击可直达（v0.16.21） |
| 🧪 **审计守门** | 第四轮审计（v0.20.0）把 CI 与 `npm run verify:*` 合成一份清单，并补上 `verify-constants`（filter 长度预算）、`/render` 403、auth 打码、notify 与草稿避让回归。**v0.25.0 再加两道**：`verify-config-patch`（设置页补丁必须过 `normalizeConfigPatch`：范围夹取 / 类型错误 400 / `__proto__` 等危险键拒绝 / 未知键透传）与 `verify-tool-views`（源码级断言**客户端 `TOOL_VIEW_KEYS` 与 host 注册的工具名完全一致**、`TOOL_LABELS` 全覆盖、工作区前缀与 host 常量相同——此前只靠 AGENTS.md 一句「记得同步」，新增工具时卡片会静默退化成纯文本） |
| 🧩 **Better Sidebar 共存** | 与 dsh-better-sidebar 侧边栏共存（其展开/收起按钮浮在 TW 面板之上）；**不再向该侧边栏注册 TW tab**（v0.17.0 移除了 tab 注册，避免 tab kind 冲突） |
| 📚 **会话知识库 Tab** | 每个会话顶部汇总本会话读写过的 wiki 笔记，TW 原生渲染（host `/render` 片段管线 + 白名单净化，v0.16.19 / v0.19.1）。**v0.25.0 补齐**：归类含 **`append`（增量写入）/ `attach`（附件）**（此前用 append 写的笔记在这个 Tab 里**完全不可见**，而注入提示词恰好推荐 append），并新增「🗑 删除 / 回收站」一节；事件日志读不出来的会话会**在页面上明说**（不再静默吞掉、把「读不出来」显示成「没碰过笔记」）；读取改为 4 路有界并发 + 12s 墙钟预算（最坏 375s → 有界，客户端 25s abort 后不再继续压着 TW 打）；生成有 3s 单飞/复用；`$:/temp` 条目被 TW 重启清掉时自愈（**三态探测**：在 / 被清 / 状态未知——未知不计失败也不清零），另按 3 分钟节拍静默刷新，长期开着也能跟上会话 |
| 📝 **快速笔记** | 输入框上方快捷按钮或右下角「知识库」FAB；原生编辑页或 Markdown 卡片两种模式；首页内置「快速记笔记（完整编辑器）」 |
| 📌 **本地剪藏桥** | 可选「剪藏桥 + 书签小工具」：DSH 监听 127.0.0.1 端口接收剪藏请求（Host 校验防 rebinding），点书签弹出浮层——可改标题/编辑选中文字/**勾选图片**，一键写入知识库；文字成笔记（默认 `clip` 标签），图片由桥下载存为**二进制附件**（`type: image/*` + base64，笔记内 `[img[标题]]` 内嵌），随 wiki 自动进 git；图片下载有 **SSRF 守卫**（仅公网 http(s)、逐跳校验重定向，v0.18.0） |
| 🔐 **写操作防跨站** | 所有写路由（笔记/上传/同步/后台/代理）拒绝跨站请求（403），仅同源的 GUI 与内嵌 TW 可写；跨站 GET 与浏览器地址栏直达不受影响（v0.18.0） |
| ✅ **待办四象限** | 首页看板：任务打 `todo` 标签即收录，拖动即可分类/完成（正文附 `q` 字段），逾期/今日到期自动统计 |
| 🌗 **跟随主题** | 内嵌 TW 自适应 DSH 深浅主题（纯内存切换，不进 git） |
| 🔄 **一键同步** | FAB「同步」一键 pull→commit→push，状态点实时反映 git 状态 |
| 💾 **数据即备份** | wiki 文件夹本身就是 git 仓库，自动 commit（60s 防抖） |
| ⚙️ **设置页不再「假装生效」** | **v0.25.0** 把一批「保存了却不变」的项收敛掉：`git.autoCommit`/`git.debounceMs`/`git.remote` 保存后**对运行中的插件立即生效**（重建防抖提交器 + 指向新 remote；`git.branch` 只对首次初始化的仓库有意义，标签里已写明，状态行显示的是真实分支）；数值项（端口 / 就绪窗口 / 分页条数 / 防抖毫秒）带 `min`/`max` 与字段旁红字，非法值**拒绝保存**而不是静默夹取；保存被拒（409，例如配置 tiddler 残留冲突标记）时错误**持久显示**而不是一闪而过的 toast；「没有改动」不再发请求、宿主也不重写配置 tiddler（每次空点保存都给 git 造 diff / 两台机器在 `.meta` 上冲突）；插件/主题/语言的未应用勾选能活过「同步 / 重启」触发的重刷；表单有未保存内容时若配置在别处被改过，**保留你的输入**并给出显式提示而不是重建表单；微信发布的 `command`/`adapter`/`token`/`dsn` 补齐 UI（token 是密码型 + 显隐切换，掩码回填照旧） |

| 🧾 **`fields` 是对象，不是字符串** | **v0.26.5**：三个写工具的 `fields` 参数 schema 从 `{type:'json'}`（在 DSH 的 schema 里是**纯注解**、编译后连 `type` 都没有，模型只能猜）改成真正的 `object`；工具层 `normalizeFieldsArg()` 还会把模型发来的 **JSON 字符串解析成对象**，数组 / 解析不出的字符串则**明确报错**——不再出现「传了 `fields` 却写出 `0={`、`1="`、`2=r`… 几十个单字符垃圾字段，真正的字段一个没落」（用户实测复现两次） |
| 🔍 **插件状态不说谎** | **v0.26.0**：设置页「插件管理」的勾选只代表 `tiddlywiki.info` 启动清单，而 TW 运行时集合还要并上**经 TW 原生插件库装进 wiki 的插件 tiddler**、减去**在 TW 面板里被禁用的**。两边不一致时（TW 里启用着、设置页没有——或反过来），行内会显示「**wiki 内已装**」「**TW 内已禁用**」徽标，并单列只读小节「**wiki 内插件（经 TW 原生安装）**」（名称/版本/描述），启停与卸载引导回 TW 控制面板。第三方插件的安装与管理仍然完全交给 TW 原生界面 |

---

