# 冒烟清单 **本项目没有自动化测试**:这是 UI 插件,行为依赖宿主 alpha 的槽位遮蔽、输入机与侧栏内部结构,跑不起 DOM 级别的用例,成本收益不划算。 `.github/workflows/ci.yml` **不是测试套件,只做静态把关**——`npm ci` 装依赖、`tsc --noEmit` 类型检查、发布构建(压缩、无内联 sourcemap)、产物自检(bundle 非空、含 `__ModuleLoader__.load`、无内联 sourcemap)。它不加载页面、不连宿主、不跑任何交互,所以**运行时行为它是零覆盖**:CI 全绿只说明「类型对、构建得出、发出去的不是调试产物」。 凡是「功能到底对不对」的问题,都靠下面这份清单手动过。改完代码、升级宿主、发布前,在内置浏览器/浏览器里走一遍。 准备工作:`npm run build`(发布产物)或 `npm run build:dev`(调试用,源码可读),强刷页面(宿主 `patchReload: live` 下改 `lib/client.js` 只需刷新)。 > 推 GitHub / 发 npm 之前确保 `lib/client.js` 是**当前源码**构建出来的:仓库带构建产物,走源码安装的人是直接用这份的。CI 只重建、不比对,`git status lib/` 有改动就说明提交里的产物落后于源码(构建可复现,同源码两次构建哈希一致)。 ## 0. 载入与健康 - [ ] 页面刷新后无报错:`window.__dshCodinputErrs.length === 0` - [ ] `window.__dshCodinputShell` 含 `apply: 'done'`、`bar: 'registered'`、`settings: 'registered'`、`sidebar.body: 'registered'` - [ ] `__dshCodinputShell` 里没有 `failed` 项(槽位废黜会记 `slot.entry` 错误) ## 1. 三态单实例(核心不变式) 任何一步之后都断言:`document.querySelectorAll('.dci-surface').length === 1`,且官方输入框不存在(`[data-composer-seat]` 里除 `.dci-card` 外没有可编辑元素)。 - [ ] **普通**:接管卡片在原输入位,`.dci-surface[data-side]` / `[data-float]` 都不存在 - [ ] **悬浮**:按住卡片顶部行空白区拖动 → 脱出为 `.dci-float`,跟手;松手在底部输入区之外 → 保持悬浮 - [ ] **悬浮 → 普通**:拖回底部输入区松手 → 回到原位(位置/尺寸记忆保留) - [ ] **悬浮缩放**:拖四个边与四个角落 → 1:1 跟手、对边不动、不越出视口、不小于 360×140;松手后刷新页面尺寸保持 - [ ] **侧栏**:展开右侧栏 → 从指南页点「Codinput」→ 输入面出现在侧栏,**主输入位为空** - [ ] **侧栏收起不让位**:收起右侧栏 → 主输入**不**回来,右上角出现圆形小球(标题栏下方、右对齐、与官方侧栏按钮不重叠) - [ ] **小球唤回**:点小球 → 侧栏展开且 Codinput 可见,小球消失 - [ ] **退出侧栏**:关闭 Codinput 标签 → 主输入按 `prefs.mode` 原样恢复(普通卡片或悬浮) - [ ] **复制标签**:右侧栏「分栏」后,两栏各开一个 Codinput 标签 → 第二个面板只出提示,全局仍只有 1 个 `.cm-editor` ## 2. 编辑与草稿 - [ ] 输入中文(输入法)→ 选词回车**不发送**、正常上屏 - [ ] 行号/当前行高亮/软换行/行列指示正常;Tab 插入缩进不夺焦点 - [ ] **撤销历史跨形态**:打字 → 拖成悬浮 → `Ctrl+Z` 能撤销刚才的字(不是撤销成空) - [ ] **侧栏键入回写**:在侧栏标签里打字 → 关掉标签,主输入位应带着刚打的内容;侧栏内移动光标,「行, 列」指示实时更新(回归点:编辑器 hooks 是模块级单槽,若卸载时无条件清空,晚卸载的旧实例会把新实例的 hooks 摘掉——症状就是侧栏里打字不落草稿、行列指示不动、发送手势失效) - [ ] **官方侧灌入不进撤销栈**:发送一条消息后按 `Ctrl+Z`,不应把已发送内容拉回编辑器 - [ ] 草稿在 形态切换 / 刷新页面 / 切换会话 后都不丢 ## 3. 触发管线与菜单 - [ ] 输入 `/` → 官方候选菜单在卡片上方弹出(侧栏/悬浮态改为头部行下方向下弹出),组标题本地化 - [ ] 输入 `@` → 文件/会话候选、section 小节标题、钻取(Tab/chevron)、crumbs 正常 - [ ] 菜单打开时 ↑↓/Enter/Tab 由菜单消费;**菜单关闭时 Enter 是换行**(不被吞) - [ ] 鼠标点击候选能补全;卡片内按下不关闭菜单 - [ ] 工具行 `plus` 按钮能程序化唤起 `/` 菜单 ## 4. 工具行控件 - [ ] 模型下拉:显示当前模型与推理等级,切换后宿主 `/model` 一致 - [ ] 权限下拉:三预设 + glyph;选「完全权限」弹确认模态(勾选后才能启用) - [ ] 附件:点 paperclip 选文件 / **粘贴图片** / **拖文件进卡片**(拖入时有描边提示)三条路径都能入草稿并出现芯片;移除附件正常 - [ ] 发送按钮:草稿与附件皆空时禁用;空草稿手势转队列 Steer - [ ] 上下文小圈:百分比与分段面板数据合理 ## 5. 设置 - [ ] 设置 → Codinput:启用接管(关闭后官方输入框原样恢复、草稿不丢)、行号、字体、发送/换行快捷键录制(任意组合、冲突拒绝) - [ ] 偏好刷新后保持(`localStorage['dsh-codinput.prefs.v2']`) ## 6. 回归提示 - 宿主升级后,重点复验第 1 节的**三态与侧栏承载**、第 3 节**菜单**(宿主席位/令牌变化最先断在这里)。 - 槽位条目渲染崩溃会被「废黜」(本注册周期内永久改用下一条目):症状是形态卡住/输入面消失,先看 `__dshCodinputErrs` 里的 `slot.entry`。 ## 7. 换通道验证(rc / alpha) 宿主在 npm 上有三个通道,**普通用户拿到的不是 alpha**: ```bash npm view @deepseek-ai/dsh dist-tags # latest = 最新 rc;next = 下一个 rc;alpha = 更超前 dsh --version # 你本机实际跑的那个 ``` `latest` 通道发的是 rc,所以「装了 dsh 插件却跑不起来」的报障大概率发生在 rc 上。开发机可以待在 alpha,但**对外声称的兼容范围应当以 rc 为准**,至少在 rc 上跑一遍第 1、3 节。 > **已验记录**:`0.1.5-rc.2` 于 2026-09-23 在另一台机器上实机跑通(README 兼容表据此标为实测通过)。换宿主版本后请重新走一遍下面这节。 不动现有安装的验证方式(独立 prefix + 独立 `DSH_HOME`,不碰你在用的 profile 与会话): ```bash # 1) 把另一个通道装到临时 prefix,不覆盖全局安装 npm i --prefix /tmp/dsh-rc @deepseek-ai/dsh@0.1.5-rc.2 # 2) 复制一份独立 home(含带 codinput 的 profile) cp -r ~/.dsh /tmp/dsh-rc-home # 3) 起在另一个端口,避免和正在跑的实例撞车 DSH_HOME=/tmp/dsh-rc-home /tmp/dsh-rc/node_modules/.bin/dsh web --port 3081 --no-open ``` 重点复验:第 1 节**三态与侧栏承载**(`conversation.composer.bar` 遮蔽、`sidebar.right.pane.tab` 承载判定、收起后的唤回小球)与第 3 节**触发管线与菜单**——宿主契约变化最先断在这两处,其余功能是自绘的,跨通道风险低。