dsh-direnv:为 DSH 会话注入工作区 direnv 环境

前言

在 DeepSeek Harness(DSH)里跑 shell 命令时,子进程默认继承宿主进程的环境,不会自动执行项目根目录下的 .envrc。若你本地已用 direnv 管理 API_BASE、工具链路径等变量,智能体执行的命令往往拿不到同一套环境,排查时容易误以为是代码或脚本问题。dsh-direnv 在 DSH 侧按「会话工作区」解析 direnv,把 direnv export json 的结果合并进每条命令的环境变量,并在 .envrc 未批准时走 DSH 审批通道,而不是把未授权内容暴露给模型。

下面介绍插件定位、能力与安装配置方式。事实以 GitHub 仓库 README 为准。

这是什么

dsh-direnv(npm 包名 @snylonue/dsh-direnv)由维护者 snylonue 发布,分类为客户端插件,简介为「direnv support for DeepSeek Harness」。当前 package 版本为 0.4.0,许可证 MIT。

插件只支持 DSH 0.2.1-rc.2;更早的 host 版本范围已移除。开发与集成测试均针对该 host 版本。direnv 快照绑定于会话创建时的工作区,不会随后续 working_directory 变更或单条命令的 cwd 而切换;重载与批准始终针对这一固定工作区。

核心功能

环境注入

行为 说明
注入 将 direnv export json 在工作区上的结果合并进子进程环境变量
作用范围 工作区由调用方 agent 的 session cwd 固定
会话启动提示 会话开始时向模型注入一条快照:说明工作区 direnv 是否生效、注入了哪些变量名(不展示值);无 .envrc 的工作区保持静默
批准后再加载 direnv_allow 经 DSH 审批通道执行,通过后再运行 direnv allow

命令执行时只读取已解析好的环境;若 direnv 解析在启动阶段失败,错误会被记录,但不会阻止会话启动。

会话启动时的模型上下文

会话创建时,插件解析工作区一次,并在首轮对话前通过 agent/created 与 agent.inject() 排队一条面向模型的上下文。模型无需先跑命令即可知道 direnv 状态。已激活时示例(README 原文):

[dsh-direnv] The workspace direnv environment is active.
[dsh-direnv] /home/me/proj/.envrc injects 3 variable(s) into every command the agent runs:
[dsh-direnv]   API_BASE, PROJECT_TOOLCHAIN, RUST_LOG
[dsh-direnv] Values are applied to each command's environment and are deliberately not shown here.

被阻止、拒绝或失败的工作区会使用与命令侧一致的可操作文案,便于模型直接调用 direnv_allow。compact 或 resume 之后会再发一条新消息。会话创建会等待该解析完成再进入首轮;将 sessionContext 设为 false 可关闭这条消息,工作区仍会解析。

未批准 .envrc 时的行为

未批准的 .envrc 不会导致命令失败,也不会泄露文件内容;命令在无 direnv 环境的情况下运行。若配置 notifyOnBlocked: true,会在命令结果的 stderr 追加提示,例如:

[dsh-direnv] This command ran WITHOUT the workspace direnv environment.
[dsh-direnv] /home/me/proj/.envrc is not approved, so native direnv refused to load it.
[dsh-direnv] Call the direnv_allow tool to ask the user to approve this workspace:
[dsh-direnv]   direnv_allow
[dsh-direnv] Workspace: /home/me/proj

模型可调用 direnv_allow(可选 reason),由用户批准当前会话工作区;host 在工作区执行 direnv allow,且不读取或预览 .envrc 内容。

显式重载

启动时会于固定工作区运行 direnv status --json 与 direnv export json 并等待结果。环境变更后需通过面向模型的工具显式重载:

direnv_reload                          # reload the calling session workspace

安装与启用

DSH 生态采用「一切皆插件」;社区目录页在 SkillHub,与 DeepSeek / 幻方无官方从属关系,安装前请自行查看源码与许可证。

1、确认本机已安装 direnv,且 DSH 版本为 0.2.1-rc.2。

2、使用 web profile 从 npm 安装(README 原文命令):

dsh plugin --profile web add @snylonue/dsh-direnv

3、安装后必须重启 DSH 插件才会生效。

卸载:

dsh plugin --profile web remove @snylonue/dsh-direnv

配置

在 Cordis 插件行中增加或调整如下片段(disabled: true 写在插件行外层,不在 config 内,用于关闭 provider 及其依赖的 adapter 与工具):

- id: direnv
  name: dsh-direnv
  config:
    executable: direnv          # bare PATH name or absolute path
    probeTimeoutMs: 10000       # budget for one direnv run
    notifyOnBlocked: false      # opt in to append actionable notices to results
    sessionContext: true        # inject the workspace's direnv variables at session start
字段 默认值 含义
executable direnv direnv 可执行文件;须在 PATH 中或为绝对路径
probeTimeoutMs 10000 单次 direnv status --json 或 direnv export json 超时上限(毫秒)
notifyOnBlocked false 为 true 时在命令结果 stderr 追加可操作提示
sessionContext true 为 true 时会话启动注入工作区 direnv 变量名或失败原因

典型用法

1、在项目根放置 .envrc,本地先用 direnv 习惯完成编辑;在 DSH 中打开以该目录为 session cwd 的会话。

2、若会话启动上下文或 notifyOnBlocked 提示未批准,由模型调用 direnv_allow,用户在 DSH 审批通道确认;host 在工作区执行 direnv allow。

3、修改 .envrc 或 direnv 状态后,调用 direnv_reload 对当前会话工作区重新解析并更新注入环境。

适用场景与注意

适合已在仓库中使用 direnv、且希望 DSH 智能体执行的 shell 命令与本地终端共享同一套工作区变量的开发者。

使用前请确认:executable 指向的 direnv 可用;探测超时可通过 probeTimeoutMs 调整。插件以当前 DSH 进程权限运行 direnv 与子进程,安装与启用前请阅读 GitHub 源码 与 MIT 许可证。图标使用 direnv logo(Peter Waller,CC BY 4.0)。

结尾

dsh-direnv 将会话工作区与 direnv 对齐:启动时告知模型变量名、命令侧注入环境、未批准时走用户审批而不泄露 .envrc 内容。目录页:SkillHub - dsh-direnv;源码与完整说明:github.com/snylonue/dsh-direnv。

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

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

小夜