dsh-nu:让 DeepSeek Harness 只跑 Nushell

前言

在 DeepSeek Harness(dsh)里,模型默认通过 bash / pwsh 工具执行 shell。若你希望智能体统一用 Nushell 的管道、结构化输出和类型系统,又要避免模型偷偷起 bash 或 PowerShell,就需要在运行时换掉执行器,并在系统提示里教会模型 Nushell 语法。手写 profile 补丁可以做到,但维护成本高,也容易和 dsh 其它插件的约定不一致。

下面介绍社区插件 dsh-nu(维护者 ryan4yin):它把 dsh 的每一次 shell 调用都落到 Nushell 上,并在子进程启动前拒绝把命令交给其它 shell。插件归类为「客户端」,可在 SkillHub 目录页 查看条目;源码与文档在 GitHub(当前约 2 stars)。

这是什么

dsh-nu 是一个 dsh bundle 插件:通过 dsh 暴露的低层扩展点,在运行时把 bash / pwsh 执行器换成 Nushell 执行器;所有命令以 nu --no-config-file -c "<command>" 形式运行。对 dsh 而言,工具名和调用约定仍是 bash / pwsh,因此与其它插件和功能保持兼容——模型侧看到的仍是名为 bash / pwsh 的工具,只是传入的脚本应是 Nushell。

npm 包版本 0.6.1,许可证 MIT。package.json 中记录的测试组合为 dsh 0.2.1-rc.2 与 Nushell 0.115.1;作者声明仅支持该组合,若本机 dsh 或 nu 版本不同,启动时会打警告,其它版本未做测试。

核心功能

插件 README 归纳了三件事,下面按执行顺序说明。

1. 替换执行器(Swap the executor)

bundle 的 patch 会挂载 Nushell 执行器,并禁用平台自带的 bash / pwsh 执行器。dsh 仍调用同一套 shell 工具接口,实际执行路径变为 Nushell。

2. 教会模型(Teach the model)

在系统提示中追加简短的 Nushell 规则与语法说明(teaching 层)。这会占用一部分上下文;若关闭教学文本,模型调用 shell 工具时更容易出错。配置里可通过 guide(full | compact | off)和 rules 等字段调节(见下文配置示例)。

3. 拒绝外 shell 交接(Refuse handoffs)

当命令试图把工作交给 bash、PowerShell 等其它 shell 时,guard 在进程启动前就拒绝执行。被 Nushell 拒绝或误读的 bash/PowerShell 语法也会由语法规则拦截,错误信息中会给出对应的 Nushell 写法提示。

需要明确:这不是完整沙箱。guard 只检查它能读到的命令位置;README 另有「only Nushell 不覆盖什么」的说明,部署前宜通读仓库文档。

安装与启用

环境要求(来自 README):

  • Node 22.19+
  • pnpm 在 PATH 上(dsh plugin 安装流程会用到)
  • dsh 0.2.1-rc.2
  • Nushell 0.115.1 在 PATH 上

在 dsh profile 中加入 bundle:

dsh plugin --profile tui add dsh-nu@0.6.1

浏览器端使用 --profile web。第一次执行 dsh plugin 会创建 profile;bundle 的 patch 会禁用平台 shell 执行器,并挂载 Nushell 执行器与 teaching 层。随后用 dsh tui(或 dsh web)启动对应 profile。

若 pnpm 报 ERR_PNPM_NO_MATURE_MATCHING_VERSION(新版本受 minimumReleaseAge 限制),可等待截止时间,或在同一命令上加 --config.minimumReleaseAge=0。

注意:插件以当前 dsh 进程的权限运行 shell;安装前请自行审阅 源码与许可证,勿在未信任的环境中直接启用。

配置要点

profile 可通过 cordis.patch.yml 按 id 覆盖 bundle 默认行。README 给出的完整示例如下(字段含义见仓库配置表):

- id: nu-executor
  name: dsh-nu/executor
  config:
    nuPath: ""
    nuArgs: ["--no-config-file", "-c"]
    timeoutMs: 60000
    enforceNushellOnly: true
    syntaxLint: true
    syntaxHints: true
    requireNu: true
    verifyNu: true
    verifyTimeoutMs: 10000
    foreignShellAllowlist: []

- id: nu-teaching
  name: dsh-nu/teaching
  config:
    guide: full          # full | compact | off
    rules: true
    rewriteToolDescriptions: true
    toolNames: ["bash", "pwsh"]

常用取舍:

  • guide: full(默认):详细语法参考,适合非常规语法与边界情况。
  • guide: compact:更省 token,eval 中多数样例无需拒绝即可通过。
  • guide: off:仅关指南,规则仍可由 rules 控制;README 称 eval 中会出现更多 preflight 拒绝与重试,不宜作为日常会话默认。

nuPath 解析顺序为配置字段 → 环境变量 DSH_NU_PATH → PATH 中的 nu。enforceNushellOnly: false 与 syntaxLint: false 是文档中提到的「逃生口」,仅在明确需要时考虑。

沙箱相关预算(如 cwd、timeoutMs)挂在 nu-executor 行,不在 dsh 共享的 shell 命名空间里。仓库 examples/preset-nu-shell.md 列出了 preset 级需要关掉的 shell 旁路。

Nix 与其它安装路径

dsh-nu 不打包 dsh 本体。仓库提供 flake,可用 nix develop 获得测试用的 Node 与 Nushell 版本。若用 Nix 组装带插件的 dsh,README 给出了通过 nur-ryan4yin 的 withPlugins 与 mkDshNuPackage 的示例 flake;nix build 产出带 bundle 的 dsh 二进制。细节以 README Nix 一节 为准。

适用场景与注意

适合:已在日常开发中使用 Nushell,希望 dsh 智能体与本地脚本语言一致;需要尽量阻止模型通过 shell 工具拉起 bash/pwsh;愿意接受 teaching 文本带来的上下文开销。

不适合或需审慎:必须使用未在 testedWith 中列出的 dsh / Nushell 版本;依赖 bash 专有语法或频繁 exec 外 shell 的工作流(除非你理解 guard 边界并调整白名单 foreignShellAllowlist)。

DeepSeek Harness 的生态理念是「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系,本文安装命令与版本均以仓库 README 为准。

结尾

dsh-nu 把 dsh 的 shell 层收成「只跑 Nushell」:执行器替换、提示词教学、启动前拒绝外 shell,三者一起减少模型在错误 shell 方言里打转的情况。若你要在 dsh 里固定 Nushell,可先按上文命令把 dsh-nu@0.6.1 加入 profile,再对照 README 调 guide 与 guard 开关。

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

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

Xiaoye