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