dsh-rtk:尽量原生精简的 DSH-RTK 连接器

前言

在 DeepSeek Harness(DSH)里跑 shell 时,输出往往冗长,占上下文 token。RTK 可以把常见命令的输出压成更紧凑的形式,但要在 DSH 里接上 RTK,常见做法是继承 harness 内部的 PwshLocalExecutor / SandboxPwshExecutor,或把 peer 依赖钉在某个 rc 版本上——DSH 一迭代,这类插件就容易挂。

下面介绍社区插件 dsh-rtk(维护者 Piracola,分类:工作流):不碰 DSH 内部模块,只在 shell 服务的 resolve() 边界把简单命令改写成 rtk <cmd>,其余语义(工作目录、超时、环境变量、沙箱、结果格式)仍由原执行器负责。

这是什么

dsh-rtk 是给 DeepSeek Harness 的薄 RTK 集成。npm 包名为 dsh-rtk-thin(当前资料中版本 0.2.0),许可证 MIT,要求 Node.js ≥ 20。

插件只注入 shell 服务并包装它的 resolve()。换执行器、换平台理论上都不用改插件代码;最坏情况是改写静默不生效,命令仍按原样执行。

与现有 RTK 插件的差异

作者说明的动机很直接:现成的 dsh RTK 插件多 extends harness 内部执行器类,或锁定特定 rc 依赖。dsh-rtk 不 import 任何 DSH 内部模块,依赖的是三个外部契约:

  1. ctx.shell 暴露 resolve(request) -> spec,且 spec.command 是字符串。
  2. rtk rewrite <cmd>:改写成功时 stdout 输出改写后的命令;无可改写则 stdout 为空。插件只认「stdout 非空且与原命令不同」,不依赖退出码(README 注明文档写退出码 0,实测曾见 3)。
  3. 平台黑名单:Windows 上 rtk ls/tree/pwd/wc/grep 会去代理不存在的 Unix 同名程序而失败,因此默认不把命令改写进这些子命令;判定作用于改写后的子命令。Linux/macOS 可将 denySubcommands 设为 [] 放开。

安装与启用

从 GitHub 安装(推荐,升级一条 update 即可):

dsh plugin --profile web add github:Piracola/dsh-rtk
dsh plugin --profile web update dsh-rtk-thin    # 以后更新

本地开发(改完立即生效,不用重装):

dsh plugin --profile web add "link:<本仓库绝对路径>"

装完即生效:本机 web profile 若为 patchReload: live,dsh plugin add 会把 dsh-rtk-thin 追加进 dsh.profile.bundles,README 实测无需重启 dsh——跑一条 git status,输出变成 rtk 的紧凑格式即表示生效;未生效再重启。

若 pnpm 供应链策略拦截安装(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION,常见于 lockfile 里其它包发布不满 24 小时),可临时放宽:

dsh plugin --profile web add --config.minimumReleaseAge=0 github:Piracola/dsh-rtk

配置

通过 Cordis patch 插入 bundle 配置,示例(路径与黑名单按需改):

- insert:
    - id: rtk-thin
      name: dsh-rtk-thin
      config:
        rtkExe: C:\Users\you\.cargo\bin\rtk.exe    # 默认:RTK_EXE 环境变量 → PATH
        denySubcommands: [ls, tree, pwd, wc, grep]   # 默认值,仅 win32 生效

rtkExe 未写时走 RTK_EXE 环境变量,再 fallback 到 PATH 中的 rtk。

典型改写行为

README 在 rtk 0.49.0 / 0.50.0、Windows 上做了实测,可作预期参考:

输入 结果
git status / cargo test / npm run build rtk git status / rtk cargo test / rtk npm run build
cat package.json rtk read package.json
find . -name *.md rtk find . -name *.md
ls -la / pwd / wc -l x / grep -rn foo . / tree . 原样不动
git status \| grep x / a && b 原样不动(含 shell 元字符,避免改变管道语义)
echo hello 原样不动(rtk 无等价形式)

不启动 dsh 也可自测改写逻辑(把路径换成本机仓库绝对路径):

node -e "import('file:///<仓库路径>/index.js').then(m=>console.log(m.rewriteWithRtk('git status')))"

适用场景与注意

适合谁:已在用 DSH 的 web profile(或其它启用了该插件 bundle 的 profile),本机已安装 RTK,希望 agent 执行的简单 shell 命令自动走 rtk rewrite,又不想维护与 harness 内部执行器耦合的插件。

注意:

  • 插件随当前 dsh 进程权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证,确认符合你的安全策略。
  • 含管道、&& 等 shell 元字符的命令 deliberately 不改写,避免语义变化。
  • Windows 与 Linux/macOS 在 denySubcommands 默认值上行为不同,跨平台开发时要对照配置。
  • DSH 社区插件目录(如 SkillHub)是独立生态站点,与 DeepSeek / 幻方无官方从属关系;本文事实以仓库 README 与 package.json 为准。

链接

  • 目录页:https://www.skillhub.cn/plugins/Piracola/dsh-rtk
  • 源码与说明:https://github.com/Piracola/dsh-rtk

经过上面的步骤,dsh-rtk 在不动 harness 内部实现的前提下,把 RTK 接到 shell 解析边界:能改写的简单命令自动前缀 rtk,不能改写或不应改写的保持原样,适合作为工作流里省 token 的轻量连接器。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜