# Minke

> 面向 DSH Web 宿主平台的极简外部插件，挂入渲染端模块加载器并标记文档根节点，用于校验插件安装与热更新链路。

## Metadata

- Author: [@lencx](https://github.com/lencx)
- Repo: <https://github.com/lencx/Minke.git>
- GitHub: [lencx/Minke](https://github.com/lencx/Minke)
- Stars: 250
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Topics: `agent`, `deekseek`, `desktop`, `dsh`, `dsh-plugin`, `harness`
- Forks: 28
- Open Issues: 3
- Last push: 2026-08-20T14:53:48.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:lencx/Minke/tests/fixtures/web-plugin
```

## Wiki

## 一句话定位
这是 Minke 桌面工程附带的一个 Web 平台烟雾测试夹具，作为最简形式的外部 Web 插件挂入宿主渲染端模块加载器，用于验证 dsh plugin 安装与热更新链路是否通畅。

## 核心能力
- 在宿主页面 HTML 根元素上写入 `data-dsh-external-web-plugin="active"`，作为"外部 Web 插件已加载"的探针标记
- 通过宿主提供的 `window.__ModuleLoader__` 把自身注册为一个可被宿主启动的客户端模块
- 在包元数据中声明 cordis 补丁，把自己插入到宿主启动清单中，名称为 `@dsh-desktop/smoke-web-plugin`
- 不在桌面主进程做任何事，主进程侧的 `apply()` 是空函数

## 技术实现
- **语言**: JavaScript（ESM，`type: module`）
- **关键依赖**: 仅依赖宿主运行时提供的 `window.__ModuleLoader__`，无第三方包依赖
- **架构模式**: Web 平台客户端插件——通过 `cordis.patch.yml` 在宿主启动清单中插入自己，再由宿主在渲染端加载 `lib/client.js` 注册的工厂
- **入口文件**: `lib/index.js`（主进程侧，空实现）/ `lib/client.js`（渲染端侧，真正生效）

## 适用场景
适合 Minke 维护者或 DSH 桌面宿主开发者，用来验证"外部 Web 插件安装 + 渲染端加载 + 热更新"这条链路在改版后仍然工作；不适合普通终端用户安装使用。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 未声明 | 插件包未声明 DSH 版本；仅在 Minke 自带的 harness:smoke 流程下被消费 |
| Node | 未声明 | 插件包未声明 Node 版本 |
| 平台 | 跨平台 | 在宿主 Web 平台（Electron 渲染端或浏览器）运行 |
| 原生模块 | 无 | 源码中未引入任何原生模块 |

## 安装方式
```bash
dsh plugin --profile web add github:lencx/Minke/tests/fixtures/web-plugin
```

## 配置项
本插件无需额外配置。包内 `dsh.client` 仅声明三个清单字段，没有暴露可由用户调整的运行参数：

| 清单字段 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `dsh.client.platform` | 字符串 | 声明运行平台，必须是 `web` 才能被宿主渲染端加载 | `"web"` |
| `dsh.client.inject` | 数组 | 客户端脚本要注入的位置标签，当前为空 | `[]` |
| `dsh.client.immediately` | 布尔 | 是否在宿主启动时立即注册该客户端模块 | `true` |

## 常见问题

**Q: 这个插件装上以后我能在 DSH 桌面上看到什么功能？**

A: 看不到任何新功能。它的唯一副作用是在宿主页面根元素上写一个 `data-dsh-external-web-plugin="active"` 数据属性，普通用户感知不到界面变化。

**Q: 它适合普通用户安装吗？**

A: 不适合。它是 Minke 仓库内的烟雾测试夹具，被 `scripts/harness/smoke.mjs` 用来自动校验外部 Web 插件的安装和热更新链路，没有业务价值。

**Q: 安装后能否卸载？**

A: 可以，按通用的 `dsh plugin remove` 流程卸载即可；卸载后宿主页面根元素上的 `data-dsh-external-web-plugin="active"` 标记会随之消失。

**Q: 它的主进程和渲染端分别是干什么的？**

A: 主进程侧的 `lib/index.js` 导出一个空 `apply()`，不做任何事情；真正的动作发生在渲染端，`lib/client.js` 调用 `window.__ModuleLoader__.load` 注册一个工厂，工厂的 `apply()` 写入文档根元素的数据属性。

**Q: 如何验证这个插件是否被宿主正确加载？**

A: 在浏览器开发者工具里查看页面根 `<html>` 元素，如果 `data-dsh-external-web-plugin` 的值是 `"active"`，说明已被加载。Minke 的烟雾测试还会修改客户端源码把 `"active"` 改成 `"reloaded"` 来验证热更新。

## 上手难度
入门 — 整个插件只有两个空壳 JS 文件加一份 cordis 补丁，理解门槛来自 DSH Web 插件清单的字段约定，而不是插件自身逻辑。

## 已知问题与限制
- 仅作为 Minke 工程内烟雾测试夹具存在，未声明对外使用的版本兼容信息，第三方环境无法保证可用
- 主进程 `apply()` 始终是空函数，无法在 Node/桌面主进程侧扩展业务逻辑

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [Minke](https://deepseek-plugin.org/plugins/lencx/Minke/tests/fixtures/web-plugin)
Wiki generated by AI (model: `MiniMax-M3`)
