前言¶
在 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 开关。