DSH 插件引导
在新机器上恢复一个已知良好的 DeepSeek Harness (DSH) 插件集。
真相源是 plugins.json:每个插件都固定到精确版本,并附有说明和可选的安装后配置。脚本无需用户记住包名即可复现设置。
用户故事
我换了一台新机器。我想让 DSH 安装我在另一台机器上使用的所有插件,版本相同,关键行为也相同。
将本技能传输到新机器
规范的公开副本位于:
https://github.com/GGGengXXX/make-dsh-better
在新机器上:
git clone https://github.com/GGGengXXX/make-dsh-better.git
mkdir -p ~/.agents/skills
cp -R make-dsh-better/skills/dsh-plugin-bootstrap ~/.agents/skills/
如果你已经克隆了仓库,只需复制技能目录。然后启动一个新的 DSH 会话。DSH 在 ~/.agents/skills/<名称>/SKILL.md 下发现技能;该技能显示为 dsh-plugin-bootstrap。如果该技能已存在于该目录中,则跳过复制。
工作副本是编辑的真相源;更改后重新复制。
本技能的功能
- 读取
plugins.json(版本锁定的插件列表)。 - 检测正确的 DSH CLI。
desktop配置文件由桌面应用保留,因此技能优先使用应用捆绑的 CLI 包装器,而非PATH上的通用dsh。 - 检查 DSH 版本与清单是否匹配,并在不匹配时发出警告/阻止。
- 显示安装/更新/跳过计划,请求确认,然后使用
dsh plugin --profile <配置文件> add <名称>@<版本>安装每个插件。 - 可选地应用配置文件级别的
dsh-browser-cdp配置(Chrome 路径 +--headless)到cordis.patch.yml。 - 验证每个插件既是依赖项又是选定的包。
- 可选地应用两个版本锁定的本地补丁:
[email protected]:optimizeComposerKeys默认为 true。[email protected]:Enter=换行,Cmd/Ctrl+Enter=发送。
它不复制密钥、API 密钥、会话、工作区文件或整个 ~/.dsh 目录。
用户调用此技能时的工作流程
从技能目录(包含此 SKILL.md 的目录)开始工作。
1. 在修改任何内容之前进行检查
node scripts/install.mjs --profile desktop --dry-run
向用户展示计划。如果计划需要安装或更新任何内容,请在未使用 --dry-run 运行之前请求明确确认。
如果用户的目标不是桌面应用,请传递实际的配置文件(例如 --profile web 或 --profile tui)。对于非桌面配置文件,PATH 上的普通 dsh 就足够了;脚本会自动处理。
2. 安装
node scripts/install.mjs --profile desktop --yes
有用的标志:
| 标志 | 含义 |
|---|---|
--dry-run | 打印计划;不更改任何内容 |
--yes / -y | 非交互式确认 |
--json | stdout 输出机器可读摘要(日志转到 stderr) |
--no-config | 不修改 cordis.patch.yml |
--skip <pkg> | 跳过一个插件(可重复) |
--strict | 要求精确的 DSH 版本匹配 |
--allow-dsh-mismatch | 即使 major.minor 不同也继续 |
--dsh-cli <path> | 显式指定 CLI 路径 |
--manifest <path> | 使用另一个清单 |
该脚本是幂等的:已安装在固定版本并作为包选中的插件将被跳过。
3. 应用可选的本地补丁
仅在用户希望从源机器获得精确的关键行为时:
node scripts/apply-patches.mjs --profile desktop --dry-run
node scripts/apply-patches.mjs --profile desktop --yes
这会修改 node_modules/ 下已安装的第三方文件。如果版本不匹配,除非使用 --force,否则会拒绝操作,并保留 .bak-<时间戳> 副本。告知用户这是一个本地补丁,未来的插件更新可能会覆盖它;更新后,重新运行补丁脚本或在该插件的设置中设置行为。
--only keyboard 和 --only markdown 用于限制补丁范围。
4. 重启 / 刷新
安装插件后,告知用户重启 DeepSeek Harness(或在 macOS 上使用 Cmd+Shift+R 硬刷新 Web UI)。客户端包按页面加载缓存;普通刷新可能不够。
5. 验证
安装程序会打印一个验证表。如果某个插件显示 FAIL,请检查:
- 配置文件的
package.json依赖项和dsh.profile.bundles; - 该包的版本是否与正在运行的 DSH 版本兼容;
- 插件管理器日志位于
~/.dsh/profiles/<配置文件>/.plugin-manager/logs/下。
更新清单(在源机器上捕获)
当用户在其主机器上安装/移除插件时,刷新清单:
node scripts/capture.mjs --profile desktop --dry-run # 预览
node scripts/capture.mjs --profile desktop # 写入 plugins.json
这会读取配置文件的选定包,记录每个包的已安装版本,并保留现有的 note 字段。之后提交/推送技能目录(或将其复制到新机器)。
桌面配置文件规则
通用 DSH CLI 会故意拒绝 --profile desktop:
error: profile "desktop" is managed exclusively by the Electron application
改用桌面应用的 CLI 包装器:
/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh
install.mjs 会在 macOS 上自动找到它。在其他平台上,或者如果应用在其他位置,请设置 DSH_CLI 或传递 --dsh-cli。
清单格式
plugins.json:
{
"schemaVersion": 1,
"targetProfile": "desktop",
"dshVersion": "0.2.1-rc.2",
"plugins": [
{ "name": "@scope/plugin", "version": "1.2.3", "note": "why it is here" }
],
"config": {
"dsh-browser-cdp": {
"chromePath": "auto",
"runtimeArgs": "--headless"
}
},
"localPatches": [
{ "package": "dsh-keyboard-shortcut", "version": "0.2.0", "description": "..." }
]
}
dshVersion是捕获清单时的版本。相同的 major.minor 允许带有警告;不同的 major.minor 需要--allow-dsh-mismatch。targetProfile只是默认值;--profile会覆盖它。config.dsh-browser-cdp.chromePath: "auto"使安装程序探测常见的 Chrome/Chromium/Edge/Brave 位置。如果探测失败,请设置显式路径。localPatches仅供人类参考;安装程序不会自动应用它。请显式运行apply-patches.mjs。
包含的插件集(捕获于 2026-10-24)
| 插件 | 版本 | 作用 |
|---|---|---|
@flyer103/dsh-side-chat | 0.6.0 | 原生右侧栏侧边对话 |
dsh-browser-cdp | 1.6.0 | 通过 Chrome/CDP 的代理浏览器;无头监视面板 |
dsh-keyboard-shortcut | 0.2.0 | Enter=换行,Cmd/Ctrl+Enter=发送 |
dsh-markdown-bubble | 0.1.5 | Markdown 渲染的用户消息 |
dsh-markdown-input | 0.2.0-alpha.20 | 实时 Markdown 编辑器(alpha) |
dsh-better-sidebar | 0.28.0 | 文件树 + 可编辑 CodeMirror + Git/任务/终端(重量级) |
注意:
dsh-markdown-input是 alpha 版本;如果其编辑器接管行为异常,请在设置 → 插件中禁用它。dsh-better-sidebar很重且包含自己的侧边聊天;它可以与@flyer103/dsh-side-chat共存,但用户会看到两个侧边聊天入口点。决定保留哪一个。- 内置的文件和文档预览是 DSH 本身的一部分;它们不在此清单中,无需安装。
安全
- 第三方 DSH 插件在进程内运行,可以使用用户的权限执行。仅从用户信任的清单安装。
- 精确版本已固定。不要静默地将其替换为
latest。 - 本地补丁修改
node_modules;它们是可选的、版本锁定的、有备份且可逆的(恢复.bak文件或重新安装插件)。 - 作为“安装插件”的一部分,不要复制
~/.dsh/.credentials.yaml、会话日志或工作区文件。
故障排除
| 症状 | 修复 |
|---|---|
profile "desktop" is managed exclusively… | 使用桌面应用 CLI 包装器或 DSH_CLI;见上文 |
Could not find a dsh CLI | 安装 DSH Desktop,或传递 --dsh-cli /path/to/dsh |
profile "desktop" is not initialized | 打开 DSH Desktop 一次,以便创建 ~/.dsh/profiles/desktop |
ECONNRESET / fetch failed | 重试;安装程序会自动重试一次;检查网络/代理/注册表 |
| 插件已安装但 UI 未变化 | 重启 DSH 或硬刷新(Cmd+Shift+R);客户端包已缓存 |
| 插件已安装但未激活 | 确认它存在于 dsh.profile.bundles 中;插件管理器的 add 通常会将追加进去 |
dsh-markdown-input 编辑器缺失 | 检查设置 → 插件;alpha 插件;硬刷新;检查控制台中的插槽/编辑器错误 |
dsh-better-sidebar/侧边聊天冲突 | 两者均可启动;选择一个侧边聊天入口或移除一个插件 |
补丁显示 already-patched | 符合预期;该文件已具有目标行为 |
补丁显示 skipped — version … | 清单/插件版本已更改;在使用 --force 前审查新版本 |
文件
| 文件 | 用途 |
|---|---|
SKILL.md | 本工作流程 |
plugins.json | 版本锁定的插件清单 |
scripts/install.mjs | 试运行/安装/验证 |
scripts/capture.mjs | 从实时配置文件刷新清单 |
scripts/apply-patches.mjs | 可选的本地关键行为补丁 |
patches/README.md | 补丁原理和手动回退方法 |