DeepSeek Harness Hub
← 返回列表

MDR-EX1000/dsh-rw

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
⚠ 装前注意

面向 DeepSeek HarnessDSH的 Remote-SSH 风格工作区。

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/15 · 已提供中文文档
综合分
36.2
GitHub 分
36.2
用户评分
★ Stars
2
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add MDR-EX1000/dsh-rw
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包dsh-rw(未发布到 npm,仅可源码安装)
Node 引擎要求 >=18.0.0 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 12:12:07

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-rw

CI
Release
License: MIT

面向 DeepSeek Harness(DSH)的 Remote-SSH 风格工作区。

版本 0.4.3 支持 DSH 0.1.2-rc.1 及兼容的后续 0.1.x 版本。

选择一个 SSH 主机和一个远程目录——该目录即成为原生 DSH 工作区,agent 通过 rw_ 工具(基于持久化 ssh2 连接池的 SFTP/exec)直接在远程文件系统上工作。无镜像、无同步:远程即唯一事实来源。

自 0.4.0 起零配置——一旦远程工作区激活,agent 的原生 read/write/edit/bash 工具会自动在远程主机上运行;你无需再教它使用新工具。

可以把它看作 SSH 运维工具箱在工作区层面的对应物:不再是“在那边跑一条命令”,而是让 agent 获得一个持久的远程项目根目录,可在其中读取、编辑、构建和测试——就像 VS Code Remote-SSH,但面向你的 agent。

功能特性

- 远程目录作为原生工作区——一个居中的选择器模态框填充 DSH 的“添加工作区”流程:紧凑的双卡片选择器(英文为 LOCAL / REMOTE)分别导向本地页面(操作系统文件夹选择器)或 Codex 风格的远程页面(仅别名的 host 下拉框、预填 ~/ 的远程主目录路径、带实时输入过滤的内联目录浏览器、可选的工作区名称)。
- 跟随 DSH 语言设置——每个选择器标签、提示、校验消息、加载状态、确认信息和回退消息均提供中英文版本。当前文案跟随 DSH 全局的 Settings → Language 偏好设置,并在选择器打开时即时更新;无需插件专属语言设置,也无需重启。
- 主机来自 ~/.ssh/config——零配置:你现有的别名会自动出现(文件变更时重新读取,无需重启)。密码认证的主机可在选择器中添加(本地存储,文件权限 0600)。
- 真正的工作区限制——每个 rw_ 文件路径都被限制在所选工作区根目录内:../、根目录之外的绝对路径以及符号链接逃逸(通过远程 realpath 检测为 SYMLINK_ESCAPE)都会被拒绝,并返回结构化错误。
- SSH 主机密钥验证——默认对照 ~/.ssh/known_hosts 进行验证(accept-new:首次出现的密钥会被记录),并支持 strict 和显式 off 策略。主机密钥发生变化时会被拒绝,绝不会被静默接受。
- 结构化错误——连接被拒绝 / 认证失败 / 超时 / 路径不存在 / 权限不足 / 超出工作区 / 主机密钥问题均为不同的错误码,因此 agent 可以正确应对。
- 自愈连接 — ssh2 连接池的 keepalive(15 秒 × 3)会检测断开的连接,通道/子系统打开操作有超时限制(channelOpenTimeoutMs,默认 10 秒),因此静默失效的连接(半开 TCP)不会挂起操作。落在失效连接上的操作会在重新拨号的新连接上透明地重试一次——瞬时的网络抖动永远不会以错误的形式到达 agent。
- 占位符,而非副本 — DSH 注册的本地目录是一个空占位符(.dsh-rw-meta.json 记录 user@host:path 来源)。它从不保存远程文件内容,因此无需同步,也不会有冲突。它采用一个干净的名称——远程 basename 或你在选择器中给出的名称;只有在命名冲突时才会出现哈希后缀(旧版带哈希后缀的占位符仍可正常工作)。
- Shim 模式(默认开启) — DSH 原生的 read/write/edit/str_replace_editor/glob/grep/bash 工具在工具管道上被拦截并转换为远程执行,因此 agent 可以像工作区在本地一样工作,而无需学习 rw_。路径在占位符↔远程之间双向映射,编辑在写回前会重新 stat(并发更改时返回 RW_EDIT_CONFLICT),被 shim 的 bash 会升级到审批对话框并指明远程主机。默认开启——设置 shim: false(cordis 配置或 ~/.dsh/settings.yaml 中的 dsh-rw:)可退出,仅使用显式的 rw_ 工具。shim 锚定在 agent 会话的 cwd 占位符上——而非可变的 rw_ 会话——因此 rw_disconnect 或将 rw_ 重新连接到另一台主机不会静默重定向原生工具;根路径位于占位符之外的调用始终原样传递给本地工具。
- 大声失败,绝不静默本地化 — 如果某个占位符的主机已从配置中移除,会触及该占位符的调用将失败并返回可操作的 NOT_CONNECTED 错误,而不是静默地针对空的本地目录运行。该阻止是路径感知的:只有触及损坏占位符的调用会失败;其他一切仍然照常通过。

安装

使用 DSH Market 显示的紧凑仓库 basename,从 GitHub 源安装:

dsh plugin --profile web add github:MDR-EX1000/dsh-rw

该仓库跟踪编译后的 lib/ 输出,并且没有 prepare、prepack、install 或
postinstall 生命周期钩子。因此安装此源既不需要本地 TypeScript
工具链,也不需要构建该插件的权限。DSH Market 在更新
插件时会保留 github: 源,并解析该仓库当前默认分支的提交。

当需要确切的发布归档时,对应的不可变发布包仍然可用:

dsh plugin --profile web add https://github.com/MDR-EX1000/dsh-rw/releases/latest/download/dsh-rw.tgz

发布包包含相同的编译后 lib/ 输出。稳定的 dsh-rw.tgz 文件名使
releases/latest/download URL 在各版本间保持有效。

源安装维护说明
基础名称安装遵循仓库的默认分支,并且在安装期间不会运行此插件的
build 脚本。运行时入口点是已提交的 lib/index.js,因此
请将生成的 lib/ 文件保留在 Git 中,并在 src/ 发生变化时重新构建它们:

pnpm build
git add lib

该插件本身目前没有 prepare、prepack 或 postinstall 构建钩子。它的 ssh2
依赖仍可能为可选的原生模块(ssh2 和
cpu-features)请求 pnpm 权限;使用 pnpm 构建脚本允许列表的配置文件必须允许这些依赖项。这
是依赖项设置,而不是重新构建 dsh-rw。

对于每个发布版本,在推送版本提交和标签之前,先构建并提交 lib/。这样,现有的
基础名称安装就能在未来的 Market 更新中继续使用同一个简洁的 GitHub 源。
仅在需要经过测试的确切归档时,才使用 Release tarball。

从本地检出(开发):

dsh plugin --profile web add /path/to/dsh-rw

之后重启 dsh web。该插件会在启动时激活;“Add workspace”流程会获得基于卡片的选取器。

快速开始

1. 选择工作区 — 侧边栏 / 会话中的 Add workspace → REMOTE 卡片 → 选择主机(来自 ~/.ssh/config,或在其自己的子页面上使用 + Add host 进行密码认证)→ 浏览或输入远程路径(从远程主目录 ~/ 开始;可选地为它指定一个工作区名称)→ Use as remote workspace。当全局 DSH 语言为中文时,这些标签会以中文显示。
2. 像往常一样与 agent 协作 — 在 shim 模式开启(默认)的情况下,agent 在工作区内原生的 read/write/edit/glob/grep/bash 调用会自动转换为对远程主机的调用。只需让它修复 bug、运行测试或重构——无需学习新东西。
3. 需要时进行显式远程操作 — rw_ 工具仍然可用:
- rw_list_dir / rw_read_file / rw_write_file / rw_mkdir / rw_move / rw_delete — 文件操作(受工作区限制)
- rw_exec — 以工作区根目录作为 cwd 运行 shell 命令(构建、测试、grep……)
- rw_hosts / rw_connect / rw_pick_workspace / rw_info / rw_disconnect — 主机与会话管理

配置

dsh-rw 读取两个配置层:

- Cordis 条目配置(你的 cordis.yml / loader patch 中的插件条目)——以下每个键的基础层。
hostKeyPolicy、knownHostsPath、commandTimeoutMs、connectTimeoutMs 和
maxOutputChars 仅在此处配置。
- ~/.dsh/settings.yaml — dsh-rw: 部分仅覆盖三个 shim 开关。
通过 settings 服务所做的更改会实时生效;手动编辑文件后,
重启 dsh web 以确保它们被读取。解析顺序:schema 默认值 →
cordis 条目配置(基础)→ 此用户层。

~/.dsh/settings.yaml — 所有三个键都默认为所示值;你只需要
此部分来退出 shim 模式。
dsh-rw:yaml
shim: false             # 默认 true:原生工具在远程工作区上运行。
设为 false 则仅使用显式的 rw_ 工具。
shimBash: true        # 同时拦截 bash(会话 cwd 必须为占位符)
shimBashApproval: ask # ask = 弹出审批对话框并指明远程主机(在
诸如 danger-full-access 这类从不询问的预设下会被跳过,直接运行);
native = 交由原生 bash 策略处理

插件配置键(显示默认值):

| 键 | 默认值 | 层级 | 含义 |
| --- | --- | --- | --- |
| hostKeyPolicy | 'accept-new' | 仅 cordis | 'accept-new' 将首次见到的密钥学习到 known_hosts;'strict' 拒绝未知密钥;'off' 禁用验证(显式) |
| knownHostsPath | ~/.ssh/known_hosts | 仅 cordis | 用于验证的 known_hosts 文件 |
| commandTimeoutMs | 30000 | 仅 cordis | 每条远程命令的超时时间 |
| connectTimeoutMs | 15000 | 仅 cordis | SSH 握手超时时间 |
| channelOpenTimeoutMs | 10000 | 仅 cordis | 通道/子系统打开超时:限制在静默死连接上等待的时间,超时后丢弃并在新连接上重试一次 |
| maxOutputChars | 200000 | 仅 cordis | 每次调用收集的 stdout/stderr 上限 |
| shim | true | cordis + 设置 | shim 模式:拦截原生 read/write/edit/str_replace_editor/glob/grep/bash 工具,并针对活动远程工作区运行它们(设为 false 可退出并仅使用 rw_) |
| shimBash | true | cordis + 设置 | 在 shim 开启时,同时拦截 bash(仅当 agent 会话 cwd 为占位符工作区时) |
| shimBashApproval | 'ask' | cordis + 设置 | 经 shim 处理的 bash 审批:'ask' 升级到 DSH 审批对话框(原因中指明远程主机),但在诸如 danger-full-access 这类从不询问的预设下会让步——在那里询问会自动拒绝且不显示对话框,因此命令直接运行;'native' 始终交由原生 bash 策略处理 |

语言

dsh-rw 将其 zh 和 en 字典注册到官方
@deepseek-ai/dsh-client-locale 服务。它读取与
DSH 其余部分相同的由 Host 支持的全局偏好(~/.dsh/settings.yaml 中的 locale.preference),并订阅语言环境修订,因此
更改 设置 → 语言 会立即重新渲染已打开的选取器。对于其他语言包,英语是
回退语言,直到它们提供 dsh-rw 命名空间字典。

安全模型

- 工作区隔离 — 文件工具针对工作区根解析每个路径,并验证真实路径(跟随符号链接)保持在其中。写入会验证最近的存在祖先。
- 主机密钥验证如上所述;主机密钥变更会以 HOSTKEY_CHANGED 中止连接。
- 仅限回环的 HTTP 路由 — /api/dsh-rw/ 拒绝非回环调用者。
- 密钥 — 密码/口令以明文形式存储在 ~/.dsh/dsh-rw.json 中(权限模式 0600,与 dsh-ssh 相同的信任模型);它们绝不会出现在工具输出、API 响应或错误消息中。私钥仅在连接时由 ssh2 读取。
- 范围 — 将主机的凭据授予该插件,即允许智能体以该用户身份在该主机上运行 shell 命令。请仅连接你信任的主机。rw_delete 会执行真实的远程删除。

与 @linxin666/dsh-ssh 的关系

互补,而非替代。dsh-ssh 是一个运维工具箱(Web 终端、端口转发隧道、SFTP 传输 GUI、集群执行、ProxyJump)。dsh-rw 是工作区层(为智能体提供持久化的远程项目根目录)。二者共存:工具名称不同(ssh_ 与 rw_)、路由不同、连接池相互独立。

已知限制

- 不支持 ProxyJump / 跳板机链(仅单跳)。
- rw_exec 是一次性的,没有交互式 PTY。
- 文件读取面向文本(按行分页),上限为 2 MB;大型二进制传输不在支持范围内。
- DSH 文件树显示的是空的占位目录,而非远程文件——远程浏览通过选择器或智能体进行。

开发
bash
pnpm install
pnpm build        # tsc (host) + esbuild wrapper (client)
pnpm test         # vitest — all SSH/SFTP mocked
pnpm typecheck

真实主机验收(需主动启用,会在目标主机上创建并清理一个临时目录):
bash
ssh  'mktemp -d /tmp/dsh-rw-acceptance.XXXXXX'   # then seed test data
node scripts/acceptance.mjs  /tmp/dsh-rw-acceptance.XXXXXX
node scripts/live-shim.mjs     # end-to-end shim acceptance (native tools → remote)

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群