# @rvaim/dsh-compat 0.4.4 验证报告

验证日期：2026-08-15  
交付版本：`0.4.4`
目标 DeepSeek Harness：`0.1.0-rc.6`
Plugin parser：`2.0.1`
Source parser：`2.0.0`

## 1. 结论

0.4.3 首次以公开 npm 组织包交付后，0.4.4 在 Web 设置页加入 Source 更新检测与在线更新：刷新时探测各 Source 的最新 revision，有更新即显示“更新”按钮。包清单、Cordis resolver、浏览器 ModuleLoader 与 Typert 生成目标均使用同一个 scoped 包名；内部 Cordis 行 ID、服务名和 `$DSH_HOME/dsh-compat/` 数据目录保持稳定。README 将 npm 安装与 Web 使用流程移至最前，并随包发布设置页截图。Claude Code / Codex 旧插件解析与运行语义未改变。

已验证的关键结果：

- “兼容插件”按 DSH `settings.section` 机制出现在 Agent 预设之后；
- 浏览器 bundle 由 DSH `/plugins/@rvaim/dsh-compat/client.js` 提供，并以 `@rvaim/dsh-compat` 进入 `window.__DSH_BOOT__`；
- 添加弹窗、多插件复选列表、插件列表、卸载确认、Toast 和暗/浅主题均沿用 0.3.1 的 Web 基线；
- 多插件确认后复用第一次固定的 Source 快照，不重复拉取；
- 同一运行进程内启停状态实际完成 `true → false → true`，不需要重启；
- 当前页面的 list、beginAdd、completeAdd、setEnabled、checkUpdates 和 update RPC 无浏览器错误或 Host 错误；
- 刷新会检查已安装 Source 的最新 revision，共享 Source 的全部插件都会显示更新状态；
- 发布包不声明 `bin`，不依赖 `@clack/prompts`，并包含 npm/GitHub 元数据与 README 截图；
- `source.json` / `install.json` / `state.json` / `scan.json` 不再包含 `schemaVersion`，`install.json` 不再写冗余 `pluginPath`；
- 多插件 Source 未显式选择时，`ctx.compat.install` 明确列出全部候选 ID 并拒绝默认全装。

## 2. 自动化验证

执行：

```bash
npm run verify
npm run verify:dsh
```

`npm run verify` 包含：

1. 清理 `dist/`；
2. Typert Host/Remote 生成；
3. TypeScript strict 编译；
4. DSH Client closure-factory bundle；
5. Node test runner；
6. 发布清单和 `npm pack --dry-run` 白名单检查。

本轮结果：**104/104 自动化测试通过**，发布包检查通过，共 368 个发布文件。自动测试覆盖 parser、Source/Plugin manager、事务回滚、runtime/adapters、Hook/MCP/Skill、安全边界、Web gateway 与发布包清单。其中与本轮变更直接相关的检查包括：

- 多插件 Source 未显式选择时拒绝安装并列出候选 ID；
- Web 单插件自动安装与多插件二阶段选择；
- 原输入目录删除后仍可从固定快照完成安装；
- 取消选择清理临时 Source；
- 同一 Source 并发选择的清理责任转交；
- 在线启用、停用和卸载映射；
- 目录 Source 的 revision 变化检测，以及更新后检查结果收敛；
- Web 共享 Source 更新会标记全部受影响插件并在线完成更新；
- 磁盘记录无 `schemaVersion`，且旧记录可被直接读取（多余字段不影响 JSON 解析）；
- `package.json` 的包名、版本、公开 registry 与 GitHub repository 元数据正确；
- Cordis patch、Client ModuleLoader 与 Typert artifact 使用 scoped 包名；
- 发布包包含 `docs/assets/compat-settings.png`，且不包含 `bin`、`@clack/prompts`、`src/`、`test/`、`dist/test/` 或 `node_modules/`。

`npm run verify:dsh` 额外导入真实 rc.6 包并核对：

- Cordis `Service`；
- Schemastery schema API；
- Hook Protocol 关键函数；
- MCP Client 可挂载形态；
- `CompatWebGateway` 与 `CompatManager.prepareInstall()`；
- `compatAdmin/{beginAdd,cancelAdd,checkUpdates,completeAdd,list,setEnabled,uninstall,update}` 的 Typert Host/Remote descriptor。

## 3. 真实 DSH Web 验证

使用 `npm pack --ignore-scripts` 生成 `@rvaim/dsh-compat@0.4.3` tarball，并安装到全新的隔离 `DSH_HOME` / `web` profile。实际启动 DSH Web 后得到：

```text
profile dependency: @rvaim/dsh-compat@0.4.3
dump-config: Cordis id=dsh-compat, name=@rvaim/dsh-compat
boot manifest: id=@rvaim/dsh-compat
client URL: /plugins/@rvaim/dsh-compat/client.js?rev=<revision>
client route: HTTP 200, content-type=text/javascript
bundle handoff: window.__ModuleLoader__.load({ id: "@rvaim/dsh-compat", ... })
```

这证明 scope 中的 `/` 能被当前 DSH Client Modules 正确路由，且 Host patch、boot manifest、URL 与浏览器注册 ID 没有分叉。

0.3.1 报告中的交互式浏览器实测继续作为 UI 行为基线：0.4.4 未修改 `CompatSettingsSection`、Typert Remote schema、`CompatWebOperations` 或 `CompatRuntimeManager`，因此设置导航、添加弹窗、多选、安装后 `running`、动态开关、卸载确认、诊断 disclosure 及暗/浅主题结论仍然适用。

0.3.1 验证观察：

```text
profile dependency: dsh-compat@0.3.1
dump-config: 包含 dsh-compat bundle 条目
boot manifest: 包含 dsh-compat client 条目及四个 inject 边
client route: HTTP 200，内容为 ModuleLoader closure-factory
Typert Remote: 六个 compatAdmin 方法均被严格挂载
```

浏览器实测路径：

```text
设置
→ 兼容插件
→ 添加本地多插件 Marketplace
→ 显示两个候选并勾选
→ 添加所选插件
→ web-alpha / web-beta 均显示运行中
→ 停用 web-alpha
→ aria-checked=false，运行实例停止
→ 再启用 web-alpha
→ aria-checked=true，状态恢复运行中
```

还检查了：

- 空列表，以及读取失败分支的实现与可展示错误映射；
- 添加输入、取消与 Enter 提交；
- 不可安装候选禁用；
- 拉取/安装按钮和正文中的进行中状态；
- 卸载二次确认；
- 中文/英文词典结构；
- DSH 深色与浅色 Token；
- 图标按钮、switch、checkbox 的可访问名称和焦点状态。

## 4. 动态加载边界

### 兼容插件操作

以下操作调用当前 Host 进程中的 `ctx.compat`，会立即驱动 `CompatRuntimeManager`：

- Web/服务 API 添加旧 Plugin；
- 启用；
- 停用；
- 卸载。

这些操作不修改 DSH Client 启动图，所以不需要重启。

### @rvaim/dsh-compat bundle 操作

首次安装、升级或删除 `@rvaim/dsh-compat` 本身会改变 profile 的 Host Loader 条目与 `dsh.client` 图。DSH Typert Loader 和 Client Modules 都缓存包级判定，因此这类变化需要重启 profile，并让 Web 页面重新加载新的 boot manifest。

## 5. 安全与一致性

- Web 不暴露自定义任意 HTTP handler，统一走 DSH Typert `/api` carrier；
- 所有参数和结果使用生成的 Zod v4 strict codec；
- Source 输入继续经过原有 Git、归档、路径、符号链接和凭据安全检查；
- 分步选择只向浏览器返回公开候选字段，不返回 Marketplace 原始配置或凭据；
- request ID 使用随机 UUID，并在取消、页面卸载、插件停止或十分钟过期时清理；
- 安装失败不会提交部分 Plugin；运行启动失败沿用 manager 的原子回滚规则；
- UI 只使用 DSH primitives、locale、Settings Slot 和 `--dsw-*` Token；
- 不再存在的 CLI 不会作为 bin 进入 profile，减少一个未接入 DSH 生命周期的离线入口。

## 6. 已知验证边界

本报告不扩大声明以下内容：

- 未对任意第三方远端 MCP 服务完成网络端到端握手；
- 未在真实模型会话中执行所有第三方 Hook；
- 未通过真实公网超慢 Git 仓库逐帧捕获 loading 动画；本地 Source 完成过快，但进行中 DOM、按钮禁用与 loading 图标已进入编译后的 Client bundle，并通过实现审查；
- 不支持的 Claude Code/Codex 能力仍以结构化诊断公开，不会被描述为已兼容；
- 0.4.3 已重新执行隔离 tarball 安装、DSH Web 启动、boot manifest 与 scoped Client 路由验证；0.4.4 新增更新检测后未重复执行设置页逐项点击回归，UI 行为验证继承 0.3.1 基线。

## 7. 发布命令

```bash
npm run verify
npm run verify:dsh
npm pack --ignore-scripts
dsh plugin --profile <profile-name> add @rvaim/dsh-compat@latest
```

安装或升级 `@rvaim/dsh-compat` 后重启该 profile。之后可直接在“设置 → 兼容插件”中在线添加和管理旧 Plugin。
