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。

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

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

小夜