前言¶
在 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.jsonworkspaces 下各包目录,索引.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 做离线自检。
典型用法¶
- 安装并重启 DSH 后,在 Settings 的「secrets-manager」区查看扫描到的
.env与全局层,按需新增或修改 key(值不会进入list//state的模型可见输出)。 - 在对话里让智能体执行需要密钥的命令时,依赖已注入的
DSH_ENV_FILES,用上文set -a循环 source,而不是让模型复述 secret 值。 - 需要改全局默认或仅本机 DSH 配置时,编辑
$DSH_HOME/.env;若改的是 DSH 进程启动时读取的项,改完重启dsh web。 - 在 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。