dsh-secrets-manager:在 DSH 里管理项目密钥而不把值交给模型

前言

在 DeepSeek Harness(DSH)里做智能体开发,常见矛盾是:命令行需要 API token、数据库密码等变量,但又不希望这些值出现在对话或模型上下文里。把密钥写进 .env、在 bash 里 source,是惯用做法;monorepo 里根目录和各 workspace 包可能各有 .env,还要和 DSH 全局配置叠在一起,手工维护容易漏文件、改乱注释。

下面介绍社区插件 dsh-secrets-manager(维护者 lifecoder1988,分类 admin-security):在 Settings 和会话头部安全编辑密钥,扫描 monorepo 中的 dotenv 文件,并向每次 bash 调用提供 DSH_ENV_FILE / DSH_ENV_FILES 指针,让模型只知道「有哪些 key、从哪几个文件加载」,而不读取具体值。

这是什么

dsh-secrets-manager 是 DeepSeek Harness 的插件,仓库:github.com/lifecoder1988/dsh-secrets-manager。目录页:skillhub.cn 上的插件条目。

它解决三件事:发现 monorepo 内(及一层全局)的 .env 相关文件;在界面里增删改 key 时保留注释、顺序与引号风格;把加载链交给 shell,而不是把值写进工具返回或列表接口。

DSH 生态是「一切皆插件」;SkillHub 等社区目录与 DeepSeek / 幻方无官方从属关系,安装前请自行查看源码与 MIT 许可证,并记住插件以当前 dsh 进程权限运行。

核心功能

环境变量指针(给 bash,不给模型看值)

装好后,每个 bash 调用会注入:

变量 内容
DSH_ENV_FILE 离 cwd 最近的那个 .env;项目里一个都没有时为 $DSH_HOME/.env
DSH_ENV_FILES 完整链(: 分隔):全局文件在最前,然后是仓库根到 cwd 的项目文件
DSH_ENV_KEYS 链上所有 key 名(去重,不含值)

模型可按 README 示例加载,而工具输出里只有名字:

set -a; for f in ${DSH_ENV_FILES//:/ }; do [ -f "$f" ] && . "$f"; done; set +a

全局层 $DSH_HOME/.env(DSH_HOME 默认 ~/.dsh)排在链首;后加载覆盖先加载,项目可覆盖全局默认值。项目里没有任何 .env 时,仍可通过全局文件拿到变量。DSH 进程自身在启动时读全局 dotenv(例如 NEW_API_KEY),改完后需重启 dsh web;给 bash 用的密钥是每次调用现 source,改完即生效。

发现与编辑

  • 全局层:$DSH_HOME/.env 单独一张卡片,与项目文件同样可增删改。
  • monorepo 发现:仓库根 + pnpm-workspace.yaml / package.json workspaces 下各包目录,索引 .env、.env.local、.env.<mode> 等(受 maxPackages 限制)。
  • 按目录查看:每目录一张卡片,列 key 名(值默认遮蔽),并显示 shell 生效顺序。
  • 安全写入:增删改保留注释与顺序,原子替换写文件;可写范围仅为项目根之内,以及全局目录下形如 .env* 的文件。
  • 刷新:外部改过项目 .env 后可重建索引(全局文件每次 shell 现读,无需刷新)。

模型工具 project_secrets

action 关键参数 说明
list cwd? 索引目录与各 key 名 + global 层;带 cwd 时附带 shell facts
files — 所有 .env 文件路径
set path?, scope?, key, value 写入;scope: "global" 写全局文件
remove path?, scope?, key 删除 key;scope: "global" 删全局

scope: "global" 指向 $DSH_HOME/.env;scope 与 path 只能二选一。

界面

  • Settings(settings.section,order 32):变量文件网格、全局第一张卡、键列表值默认打码、按需显隐与编辑。
  • 会话头部(conversation.session.header.utilities,order 53):图标打开可写面板,不预读值,点眼睛才 POST /file 取一次;含「打开管理页」入口。
  • DevSpace:当前工作区为远端镜像时,设置页与会话面板可按需扫描对应节点(约十几秒,缓存 60 秒);非镜像工作区不显示远端块。

HTTP 路由前缀为 /secrets-manager(如 GET /state、POST /file、POST /write、POST /refresh)。

安装与启用

README 推荐用 DSH 自带的 plugin_manager 安装(会自动写 profile 并插入 composition 行)。若手工安装,进入当前 profile 目录执行:

cd "$DSH_HOME/profiles/<profile>"
pnpm add github:lifecoder1988/dsh-secrets-manager

在 profile 的 cordis.patch.yml 中可手工加入:

- insert:
    - id: secrets-manager
      name: '@local/dsh-secrets-manager'

装完后:host 侧改动需重启 DSH;仅 client 侧改动刷新页面即可。

可选配置(摘自 README):

config:
  maxPackages: 200        # 单次索引的包目录上限
  dshHome: /path/to/.dsh  # 全局层目录;默认 $DSH_HOME,再默认 ~/.dsh
  globalEnv: /path/to/env # 直接指定全局 env 文件,优先级最高

仓库内可用 node test/local-check.mjs 做离线自检。

典型用法

  1. 安装并重启 DSH 后,在 Settings 的「secrets-manager」区查看扫描到的 .env 与全局层,按需新增或修改 key(值不会进入 list / /state 的模型可见输出)。
  2. 在对话里让智能体执行需要密钥的命令时,依赖已注入的 DSH_ENV_FILES,用上文 set -a 循环 source,而不是让模型复述 secret 值。
  3. 需要改全局默认或仅本机 DSH 配置时,编辑 $DSH_HOME/.env;若改的是 DSH 进程启动时读取的项,改完重启 dsh web。
  4. 在 monorepo 根或各 package 下维护 .env.local 等文件;外部编辑器改过文件后,在设置页点刷新重建项目索引。

适用场景与注意

适合:在 DSH 里跑 bash、对接第三方 API 或数据库,且希望 monorepo 多包 dotenv 与全局 DSH 配置统一管理;需要在 UI 里改 key 又不想让明文进对话上下文。

注意:

  • 安全边界:list、/state、inspect 只报 key 名与路径;值仅出现在 /write 请求体与磁盘 .env 中。
  • 插件与 DSH 同权限,安装前请阅读 GitHub 仓库 源码。
  • 全局目录下非 .env* 文件名(如 credentials.yaml)会被拒绝写入。

结尾

dsh-secrets-manager 把「项目要有密钥」和「密钥不能进对话」拆开:文件里存值,模型和列表接口只拿指针与 key 名,shell 按链加载。进一步了解可访问 SkillHub 目录页 与 GitHub README。

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

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

小夜