前言¶
在 Windows 上用 DeepSeek Harness(DSH)做多个仓库时,常见做法是反复改 dsh web 指向的工作区,或在不同终端里手动换端口。dsh web 一次只服务一个 workspace——以 dsh home 里最后一次打开的那份为准;第二个项目进来后会和第一个争同一个 home、同一个端口和同一个 token:链接可能打开错项目,会话混在一起,重启还会把登录状态清掉。要同时跑多个项目,就得自己记端口、记进程。
下面介绍社区插件 dsh-wsl-projects(维护者 mvalentsev,GitHub:mvalentsev/dsh-wsl-projects)。它在 WSL2 里为每个项目分配独立的 systemd 用户服务、端口和 dsh home,并在 Windows 版 DSH 客户端侧边栏底部提供面板,用来启动、停止和打开各项目的 Web 服务。插件分类为客户端;许可证 MIT(见仓库 README)。
这是什么¶
一句话:One DeepSeek Harness web server per project, inside WSL2 — started, stopped and opened from a panel in the Windows app.
Windows 上的 DSH 应用驱动 WSL2 内的 Linux 发行版:每个「项目」对应一条 systemd 用户单元、一个监听端口、一份隔离的 dsh home。会话和对话留在各自项目内;首次启动会把账号从 ~/.dsh 复制一次,避免每个 home 都重新登录。
核心功能¶
按项目隔离¶
- 每个项目一个 systemd 用户服务:在面板里启停;关掉终端后服务仍可存活。
- 每个项目一个端口:端口不会分给第二个项目,链接与项目一一对应。
- 每个项目一个 dsh home:路径形如
~/.dsh/dsh-wsl-projects/homes/<folder>-<tag>/;tag来自路径,同名文件夹也会分到不同 home。 - 链接可用才展示:面板只在当前运行的服务能应答该链接时才显示 Open,避免过期 token。
面板与刷新¶
面板默认在侧边栏底部(sidebar foot),约每 5 秒刷新状态。每一行展示服务状态、端口,以及 Open、Stop、Start、Restart、Remove。在 Start a project 下选目录、命名并选端口即可新建服务。
面板还可通过全局变量换位置(在 bundle 加载前设置):
window.__DSH_WSL_PROJECTS_SURFACE__ = 'settings' // Settings 内一页
window.__DSH_WSL_PROJECTS_SURFACE__ = 'floating' // 可拖动浮层
自动化接口¶
- REST:
/wsl-projects/api/,含state、units、projects、distros、start、stop、restart、stop-unit、restart-unit、remove-unit、config、alias等。 - Agent 工具:
wsl_dsh,向模型暴露与面板相同的操作。
环境要求¶
- 已安装 DeepSeek Harness 的 Windows 环境。
- WSL2 及某一 Linux 发行版;README 写明在 Ubuntu 上测试,其他发行版未测试。
- 该发行版内
dsh在PATH中可用。 - 发行版启用 systemd(插件使用
systemctl --user)。 - 发行版内有 bash。
- 存放项目的目录,默认
~/projects,可在配置中改。
package.json 要求 Node ≥ 20;插件对 dsh 的版本约束为 >=0.2.0-rc.2 <0.2.2-0(安装前请与当前客户端版本对照)。
安装与启用¶
- 在 Windows 终端执行(
<path-or-github-spec>换成本地路径或 GitHub 规范,以你实际使用的 spec 为准):
dsh plugin --profile desktop add <path-or-github-spec>
若使用纯 dsh web 配置,将 --profile desktop 改为 --profile web。本地 clone 路径也可作为参数。
- 完全退出 DeepSeek Harness 应用后重新启动。仅刷新页面不够:客户端半部与 host 半部在不同时机加载,host 半部随应用启动序列载入。
插件以当前 dsh 进程权限运行;安装前建议阅读仓库源码与 MIT 许可证,确认行为符合你的安全预期。
典型用法¶
- 打开面板(侧边栏底部)。
- 在 Start a project 下选择一个项目。
- 点击 Start a service for this project。
- 在新行点击 Open 打开该项目的 Web 界面。
配置¶
在 profile patch 中增加插件块,例如:
- id: wsl-projects
name: dsh-wsl-projects
config:
distro: Ubuntu
projectsRoot: ~/projects
unit: dsh-web.service
defaultPort: 19800
configFiles:
- ~/.dsh/settings.yaml
- ~/.dsh/profiles/web/cordis.patch.yml
| 键 | 含义 | 默认 |
|---|---|---|
distro |
使用的 WSL 发行版 | WSL 默认发行版 |
projectsRoot |
项目根目录 | ~/projects |
unit |
WSL 内 dsh 对应的 systemd 用户单元模板 | dsh-web.service |
defaultPort |
新服务使用的起始端口 | 19800 |
configFiles |
面板可编辑的配置文件列表 | 标准 dsh 文件 |
工作原理(简要)¶
DSH 通过 $DSH_HOME/storages/workspace.json 决定打开哪个 workspace,不会校验启动目录;因此「一项目一 home」才能绑死 workspace。浏览器会话按 host 与 port 区分;「一项目一 port」避免串会话。token 绑定进程,旧 token 无效,故面板会探测后再给链接。
首次启动时,launcher 创建 home、一次性复制 ~/.dsh 的账号,并把项目写入该 home 的 workspace storage。
适用场景与注意¶
适合:在 Windows + WSL2 上同时维护多个代码仓库,希望每个仓库有独立 DSH Web、又不想手管端口与 systemd 的开发者。
注意:
- 平台限定 Windows · WSL2;非 Ubuntu 发行版 README 未承诺兼容。
- 某项目 home 内的账号副本不会随
~/.dsh后续变更自动更新;若反复要求登录,可按 README 删除该 home 下的.credentials.yaml后重新 Start。 - 服务起不来时,可用
journalctl --user -u dsh-web-<folder>-<tag>.service -n 40查看日志。 - 面板提示 host 半部版本过旧时,需退出应用再开,不能只 reload 页面。
故障排查摘要¶
| 现象 | 处理方向 |
|---|---|
| 面板无响应,提示 host 半部过旧 | 退出 DSH 应用后重新启动 |
| Open 打开错项目 | 核对地址;一 port 一项目;在该行 Stop 再 Start 后 Open |
| Open 报认证错误 | 链接过期;Stop 再 Start |
| 又要登录 | 删除对应 home 的 .credentials.yaml 后重新启动项目 |
| 服务无法启动 | 查上述 journalctl 日志 |
结尾¶
DSH 生态强调「一切皆插件」;社区目录 SkillHub 上的 dsh-wsl-projects 页 与 GitHub 仓库相互独立索引,并非 DeepSeek / 幻方官方应用商店条目。若你的日常是「多项目 + WSL2 + Windows 客户端」,这个插件把「一项目一服务、一端口、一 home」收成一块面板,减少和单一 dsh web 实例抢 home 与端口的手动成本。
- 目录页:https://www.skillhub.cn/plugins/mvalentsev/dsh-wsl-projects
- 源码与文档:https://github.com/mvalentsev/dsh-wsl-projects