🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

WSL 项目服务 mvalentsev/dsh-wsl-projects

DeepSeek Harness
mvalentsev29 天前有提交已提供中文文档扫描:含敏感能力

为每个项目独立启停并打开 WSL2 里的 web 服务

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add mvalentsev/dsh-wsl-projects
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · dev
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 29 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令发起外部网络请求
查看扫描证据(共 2 处,展示前 2 条)
  • 发起网络请求
    lib/client.js:196
    const response = await fetch(bases[index] + path, { cache: 'no-store', ...options })
  • 执行外部命令来自配置/变量
    lib/wsl.js:39
    child = spawn(WSL_EXE, args, { windowsHide: true })
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 独立启停项目服务
  • 打开WSL2web服务

每个项目一个 DeepSeek Harness web 服务器,跑在 WSL2 里,从 Windows 应用的面板启动、停止和打开。

README

由 DeepSeek 最新模型翻译生成
每个项目一个 DeepSeek Harness web 服务器,跑在 WSL2 里 —— 从 Windows 应用的面板里启动、停止、打开。 问题 dsh web 只服务一个工作区 —— 也就是它的 dsh home 最后打开的那个。把它指向第二个项目,两个项目就会抢同一个 home、同一个端口、同一个 token:链接打开错误的项目,会话混在一起,重启会杀掉你的登录。想同时跑多个项目,就得手动折腾终端和端口。 这个插件给每个项目一块自己的地盘 —— 再用一个面板统管它们。 你能得到什么 - 每个项目一个 systemd 用户服务。 从面板启动和停止;终端关掉,服务照样活着。 - 每个项目一个端口。 端口绝不会分给第二个项目,所以链接永远打开它所属的那个项目。 - 每个项目一个 dsh home。 对话和会话都留在各自项目里。账号只复制一次,之后不会再让你登录。 - 能应答的链接。 服务器应答之后,面板才会显示链接 —— 没有失效的 token。 - 应用里的面板。 每个服务都带着自己的状态、端口和控制按钮:Open、Stop、Start、Restart、Remove。启动项目只需选中它、起个名字、挑个端口。状态每五秒刷新一次,面板显示的就是此刻的真实情况。 - 给程序用的两个入口。
展开完整文档(README 剩余 1 节)
每个项目一个 DeepSeek Harness web 服务器,跑在 WSL2 里 —— 从 Windows 应用的面板里启动、停止、打开。

问题

dsh web 只服务一个工作区 —— 也就是它的 dsh home 最后打开的那个。把它指向第二个项目,两个项目就会抢同一个 home、同一个端口、同一个 token:链接打开错误的项目,会话混在一起,重启会杀掉你的登录。想同时跑多个项目,就得手动折腾终端和端口。

这个插件给每个项目一块自己的地盘 —— 再用一个面板统管它们。

你能得到什么

- 每个项目一个 systemd 用户服务。 从面板启动和停止;终端关掉,服务照样活着。
- 每个项目一个端口。 端口绝不会分给第二个项目,所以链接永远打开它所属的那个项目。
- 每个项目一个 dsh home。 对话和会话都留在各自项目里。账号只复制一次,之后不会再让你登录。
- 能应答的链接。 服务器应答之后,面板才会显示链接 —— 没有失效的 token。
- 应用里的面板。 每个服务都带着自己的状态、端口和控制按钮:Open、Stop、Start、Restart、Remove。启动项目只需选中它、起个名字、挑个端口。状态每五秒刷新一次,面板显示的就是此刻的真实情况。
- 给程序用的两个入口。 /wsl-projects/api/ 下的 REST API,以及 wsl_dsh 智能体工具,让模型拥有同样的操作能力。

环境要求

- Windows,并已安装 DeepSeek Harness 应用。
- WSL2,并装好一个 Linux 发行版。插件在 Ubuntu 上测试过,其他发行版未测试。
- 该发行版里有 dsh,且在 PATH 中可直接调用。
- 该发行版里有 systemd —— 插件用的是 systemctl --user。
- 该发行版里有 bash。
- 一个存放项目的文件夹:默认 ~/projects,可配置。

安装

1. 在 Windows 的终端里运行这条命令:

dsh plugin --profile desktop add <path-or-github-spec>

如果用的是普通的 dsh web 配置档,把 --profile 换成 web。也可以直接给本地克隆的路径。

2. 退出 DeepSeek Harness 应用,再重新启动。

只刷新页面不够。应用加载插件两半的时机不同:面板随客户端那一半一起到达,而宿主那一半属于启动流程的一部分。

使用

1. 打开面板 —— 它在侧边栏底部。
2. 在 Start a project 下选择一个项目。
3. 点击 Start a service for this project。
4. 在新出现的行里点击 Open。

配置

把设置加进配置档补丁:

- 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 默认发行版 |
| projectsRoot | 存放项目的文件夹。 | ~/projects |
| unit | 掌管 WSL 里 dsh 的 systemd 用户单元。 | dsh-web.service |
| defaultPort | 新服务的起始端口。 | 19800 |
| configFiles | 面板可以编辑的文件。 | dsh 的标准文件 |

面板的位置

面板默认在侧边栏底部。另外还有两个位置可选 —— 在 bundle 启动前设置一个全局变量:

window.__DSH_WSL_PROJECTS_SURFACE__ = 'settings' // a page in Settings
window.__DSH_WSL_PROJECTS_SURFACE__ = 'floating' // a movable panel

工作原理

项目是控制单位。每个项目都有自己的 dsh home,位于 ~/.dsh/dsh-wsl-projects/homes/<folder>-<tag>/。tag 来自路径,所以文件夹同名的两个项目会拿到各自独立的 home。首次启动时,启动器创建 home,从 ~/.dsh 一次性复制账号,再把项目写进该 home 的工作区存储。

隔离才是关键,而 dsh 的行为决定了三条规则:

- dsh 打开的是 $DSH_HOME/storages/workspace.json 指定的工作区 —— 它不会拿这个工作区和启动它的文件夹做比较。每个项目一个 home,才能让每个服务都待在自己的项目上。
- dsh 用主机和端口来标识浏览器会话。每个项目一个端口,才能什么能防止会话跨项目串味。
- 一个 token 只属于一个进程,所以更早一次启动留下的 token 已经失效。只有运行中的服务端应答之后,才会给出链接。

自动化

REST 接口在 /wsl-projects/api/ —— state、units、projects、distros、start、stop、restart、stop-unit、restart-unit、remove-unit、config、alias。智能体工具 wsl_dsh 把同样的操作开放给模型。

故障排查

面板毫无反应,还说主机那一半版本太旧。

应用一启动就会运行主机那一半。退出应用,再重新启动。刷新页面不够。

Open 显示的项目不对。

看地址。一个端口只服务一个项目,每个项目有自己的 home。重新启动该项目,然后在它自己那一行点 Open。

Open 报认证相关的错误。

链接太旧了。点 Stop,再点 Start。面板在显示链接之前会先检查它。

某个项目又要求登录。

该项目的 home 里存着一份账号副本,这份副本不会跟着 ~/.dsh 之后的改动走。删掉副本,再启动项目:

rm ~/.dsh/dsh-wsl-projects/homes/<folder>-<tag>/.credentials.yaml

某个服务起不来。

看它的日志:

journalctl --user -u dsh-web-<folder>-<tag>.service -n 40

开发

npm run check # every check, in one sequence
npm run check:offline # only the checks that need no distribution

上面的面板图片是真实面板的截图:node scripts/capture-panel.mjs <url> 可以从运行中的应用重新截取。横幅和架构图是绘制的,各有浅色、深色和窄版三种变体,放在 docs/。

CI 在 Node 20、22 和 24 上跑离线检查。每项检查覆盖什么,以及怎么跑那些需要真实发行版或浏览器的检查,见 CONTRIBUTING.md。

安全

- 插件以你的权限运行:它使用 systemctl --user,并读写发行版里的文件。
- 主机只接受来自面板自身 origin 的请求;origin 不同的请求会收到错误。
- origin 检查不是认证:本地进程只要拥有相同的用户权限,仍然能访问回环端口。

许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓mvalentsev/dsh-wsl-projects
分享 · DeepSeek Harness Hub
mvalentsev/dsh-wsl-projects

为每个项目独立启停并打开 WSL2 里的 web 服务

回到顶部