DeepSeek Harness(dsh)插件的可视化安装界面:一个跨平台桌面程序,用于浏览
profile、安装/卸载/更新插件 bundle、在 npm 上发现插件、编辑 profile 的 patch 层。
架构继承自 minimal-tauri-app 的极简风格: Tauri 2 + 纯 HTML/CSS/JS 前端(无框架、无构建步骤)+ Rust 后端。
| 功能 | 说明 |
|---|---|
| 环境概览 | 显示 dsh 版本与路径、DSH_HOME、Node/npm/pnpm 状态 |
| Profile 管理 | 列出 $DSH_HOME/profiles/*,一键新建(默认挂 @deepseek-ai/dsh-base) |
| 安装插件 | 输入包名/name@version/git 地址/本地路径,流式显示 pnpm 输出,可取消 |
| 卸载 / 更新 | 对已安装 bundle 一键卸载或更新 |
| 插件发现 | 两个来源:npm registry 搜索(dsh-plugin 关键词);GitHub dsh-plugin topic 仓库搜索(github.com/topics/dsh-plugin),一键以 github:owner/repo 安装到当前 profile |
| Patch 层编辑 | 可视化编辑 cordis.patch.yml(dsh 长驻进程会热重载) |
插件管理全部走 dsh 官方机制:dsh plugin --profile <name> add|remove|update <pkg>,
由 dsh 在 profile 目录里转发 pnpm 并自动对账 dsh.profile.bundles 层列表,与
命令行完全一致,不会产生额外状态。
├── src/ # 前端(静态文件,无构建步骤)
│ ├── index.html # 单页布局:环境横幅 + profile 侧栏 + 主视图
│ ├── styles.css # 深/浅色模式
│ └── main.js # 通过 window.__TAURI__ 调用 Rust 命令、监听流式事件
└── src-tauri/ # Rust 后端
├── src/
│ ├── lib.rs # tauri 命令注册
│ ├── dsh.rs # dsh/DSH_HOME/工具链探测(PATH、corepack、安装锚点)
│ ├── profiles.rs # profile 读取/创建/编辑、bundle 版本解析(含单元测试)
│ └── ops.rs # 插件操作:dsh plugin 转发、流式输出、进程组取消
├── Cargo.toml
└── tauri.conf.json # 窗口与打包配置
前置要求与 minimal-tauri-app 相同:Rust stable、Node.js LTS+,Linux 额外需要
libwebkit2gtk-4.1-dev、librsvg2-dev、patchelf、xdg-utils。此外还需要:
dsh在 PATH 上(例如已执行过npx @deepseek-ai/dsh web,或全局安装 dsh)。 应用从启动它的终端继承 PATH,建议从终端启动。pnpm或corepack:安装插件需要。应用自动优先用 PATH 上的pnpm; 没有时若存在corepack,会临时生成一个corepack pnpmshim 并注入子进程 PATH, 无需全局安装 pnpm。
npm install # 安装 @tauri-apps/cli
npm run tauri dev # 开发模式(打开窗口,热更新前端)
npm run tauri build # 发布构建,产物在 src-tauri/target/release/bundle/后端单元测试:
cd src-tauri && cargo test- profile 是
$DSH_HOME/profiles/<name>/下的目录(DSH_HOME未设置时默认~/.dsh):package.json持有有序的dsh.profile.bundles层列表,cordis.patch.yml是用户 patch 层,pnpm-workspace.yaml供 pnpm 管理外部插件。 - bundle 是声明了
"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }的 npm 包;dsh-base等内置 bundle 从 dsh 安装目录解析(应用通过解析dsh二进制的真实路径定位安装锚点,与 dsh 自身的resolveBundleDir逻辑一致)。 - 安装:后端
spawndsh plugin --profile <name> add <spec>,stdout/stderr 逐行通过plugin-line事件推送到前端,结束时发plugin-done并返回完整日志 (前端刷新后也能重放)。取消操作会按进程组杀掉 dsh→pnpm 整棵进程树 (Unixkill -TERM/-KILL -<pgid>,Windowstaskkill /T /F)。spec支持包名、name@version、github:owner/repo(GitHub 发现页直接生成)与 本地路径;git 源插件若被 pnpm 的构建脚本策略拦截,dsh 会给出allowBuilds配置指引。 - 发现:npm 搜索直连
registry.npmjs.org/-/v1/search(CORS 开放); GitHub 搜索直连api.github.com/search/repositories?q=topic:dsh-plugin[+关键词](topic 是 dsh 插件仓库的官方发现机制,未认证限额 60 次/小时,限流时界面会提示)。
- pnpm 的最小发布年龄策略:pnpm ≥10 的供应链安全策略会静默跳过发布不足
24 小时的版本(本机策略
minimumReleaseAge: 1440分钟)。刚发布的插件可能 被解析到较旧版本而暂未带dsh.bundle声明;此时 dsh 会提示"declares no dsh.bundle",属正常现象,可稍后update或显式安装name@版本号。 - dsh 未找到时:安装/卸载/更新会返回明确错误;环境横幅会显示红色告警。
从 Finder 双击启动的应用 PATH 不完整,建议从终端
npm run tauri dev启动。
与 minimal-tauri-app 相同,.github/workflows/ 可用
tauri-action 构建
macOS(arm64/x64)、Linux(x86_64/arm64)、Windows 五个目标;打 v* tag 自动生成
带全部安装包的 Release。