前言¶
在 DSH(DeepSeek Harness)裏讓 Agent 讀分支、看 diff、甚至改工作區,常見做法是自己在會話裏貼命令輸出,或把令牌寫進環境變量——前者信息零散,後者權限邊界難控。社區插件 @zjj/dsh-git-panel(倉庫 zjj1769404838/dsh-git-panel)把賬號接入、範圍閘門、圖形化工作臺和 8 個 git_* Agent 工具收進同一套插件:配置集中在 DSH 設置頁的 Git 分節,輸入框下方用 opencode 風格的分支 chip 作唯一入口。下面介紹它解決什麼問題、怎麼裝、以及使用前必須配好的授權範圍。
這是什麼¶
@zjj/dsh-git-panel 是 DSH 桌面端插件(npm 包名 @zjj/dsh-git-panel,當前資料中版本 0.1.0,MIT 許可證),維護者爲 zjj1769404838。定位是:Git 賬號接入 + 受控倉庫操作——OAuth 設備碼或個人訪問令牌(PAT)連接 GitHub / GitLab / Gitea,令牌 AES-256-GCM 落盤且界面與接口不回顯明文;本地 git 與平臺 REST 走統一閘門(allowedRoots、allowedRepos、賬號級 full / read / none);同時提供 Git 工作臺 UI 與 Agent 可調工具。
DSH 生態是「一切皆插件」;插件目錄頁在 skillhub.cn,與 DeepSeek / 幻方無官方從屬關係,本文僅依據倉庫 README 與 package.json 說明能力。
核心功能¶
界面入口與 Git 工作臺¶
- 設置頁:宿主左側導航新增
Git分節(settings.section,order: 20),含賬號、倉庫範圍、寫開關、界面偏好等。 - 輸入區 chip:會話輸入框下方左側顯示分支狀態(如
⎇ main ↑2 3*);非 Git 目錄時灰化Git入口;點擊彈出分組菜單(未初始化 → 初始化嚮導;已初始化 → 工作臺 / 刷新 / 分支詳情 / 打開目錄 / Git 設置)。狀態不在後臺輪詢,僅在 cwd 變化、窗口獲焦、頁面可見、打開菜單等時機刷新。 - Git 工作臺:居中模態,頂部頁簽爲改動 / 歷史 / 文件 / 標籤 / 貯藏;改動頁雙欄(左列表 + 右就地 diff);歷史支持關鍵詞搜索與泳道拓撲;差異模塊支持行號、四種佈局、詞級高亮、Prism 語法高亮等。
- 初始化:未初始化目錄可走單頁表單 + 右側執行計劃,支持選已有遠程、新建遠程倉庫或手工
owner/repo,執行端爲POST /repo/bootstrap(本地操作,不自動 push)。
賬號與權限¶
- 接入方式:OAuth 設備碼(需自備各平臺 OAuth App Client ID)或 PAT。
- 賬號 → 倉庫:每個賬號卡片內聯平臺側全部遠程倉庫;每行三檔 完整 / 只讀 / 無權限,點選即
POST /repo/permission提交。 - 全局範圍(必須配置,否則 Agent 拒絕一切操作):
allowedRepos:每行owner/repo,*表示不限遠程倉庫白名單。allowedRoots:本機絕對路徑白名單,*表示不限制目錄。allowWrite:默認關閉;開啓後仍默認requireConfirm二次確認。- 遠端寫操作:fetch / pull / push / remotes-add 等按 remote 的
owner/repo校驗賬號是否爲full,否則 403。
Agent 工具(8 個)¶
| 工具 | 作用 | 是否改倉庫 |
|---|---|---|
git_panel_status |
賬號(脫敏)、授權範圍、寫開關 | 否 |
git_repo_info |
分支、遠端(脫敏)、改動概況 | 否 |
git_branches |
分支列表與 ahead/behind | 否 |
git_diff |
worktree / staged / commit / range | 否 |
git_log |
提交記錄,可過濾 | 否 |
git_remote_info |
平臺 REST 元信息 | 否 |
git_write |
add / commit / checkout / switch / restore / stash / tag 等 | 是 |
git_confirm |
確認或取消待執行的 git_write |
是 |
約束要點:未授權路徑不泄露「是否爲 git 倉庫」;git_write 在 requireConfirm 開啓時先返回 pending 與 confirmToken,確認前狀態不變;執行走 execFile('git', args),拒絕危險參數注入。README 註明寫操作白名單不含 push / reset --hard / clean -fdx,需人工處理時可自行在終端操作。
憑據與數據路徑¶
| 內容 | 路徑 |
|---|---|
| 狀態與範圍設置 | $DSH_HOME/git-panel/state.json(默認 ~/.dsh/git-panel/state.json) |
| 加密密鑰 | $DSH_HOME/git-panel/key.bin(權限 0600) |
安裝與啓用¶
從 Git 源安裝(倉庫已含 lib/ 構建產物):
dsh plugin --profile desktop add github:zjj1769404838/dsh-git-panel
本地開發時先構建再以 link 安裝:
npm install --include=dev
node scripts/build.mjs
dsh plugin --profile desktop add link:/absolute/path/to/dsh-git-panel
裝完後重啓 DSH 桌面端(node 側路由與工具在啓動時加載);若只改 client 模塊,在 GUI 中 Ctrl+Shift+R 硬刷新即可。
卸載:
dsh plugin --profile desktop remove @zjj/dsh-git-panel
典型用法¶
1. 連接賬號¶
打開 設置 → Git → 賬號,點「連接賬號」:
- OAuth(本機有人點瀏覽器):選平臺 → 接入方式 OAuth → 填寫 Client ID → 連接;GitHub 走設備碼流程,瀏覽器輸入 8 位代碼後輪詢換令牌。
- PAT(CI / 最小權限):接入方式選 PAT → 粘貼令牌 → 連接;可在平臺側限制 scope 或 fine-grained 倉庫範圍。
多賬號時可指定默認賬號,Agent 側優先使用。
2. 配置倉庫範圍(必做)¶
在 設置 → Git → 倉庫範圍 填寫:
- 允許的遠程倉庫(例:
myorg/my-app,或一行*)。 - 允許的本機目錄(例:
/home/you/projects/my-app的絕對路徑)。 - 按需開啓「允許寫操作」;建議保持「寫操作需要二次確認」爲開啓。
範圍爲空時策略爲 fail-closed(全部拒絕)。路徑按段匹配,D:\repo-evil 不會命中 D:\repo。
3. 從 chip 進入日常工作流¶
在已授權且已初始化的項目會話中:
- 看輸入框下 chip 的分支與 dirty 狀態。
- 點 chip → Git 工作臺,在「改動」頁暫存、寫提交信息(可用「AI 生成」,依賴宿主
ctx.llm)、提交;右欄查看 diff。 - 需要 push 且無上游時,界面會提示「發佈分支」(
git push -u),仍受寫開關與遠端full權限約束。
未初始化目錄:菜單選 初始化 Git 項目,左側選賬號與遠程,右側看計劃清單後提交;目錄須已通過 allowedRoots 授權。
4. Agent 側受控寫入¶
在開啓 allowWrite 且 Agent 被允許調用插件工具的前提下,寫操作典型路徑爲:
- Agent 調用
git_write(例如add+commit)。 - 若
requireConfirm爲真,得到summary與confirmToken,用戶或 Agent 再調git_confirm才真正執行。
未配置授權範圍或寫開關關閉時,工具與 HTTP 寫端點會直接拒絕。
適用場景與注意¶
適合:在 DSH 桌面端統一管 GitHub/GitLab/Gitea 賬號;希望 Agent 只讀查狀態、diff、log,或在明確閘門與二次確認下做有限寫操作;需要內置工作臺而不反覆切終端。
注意:
- 插件以當前 DSH 進程權限運行,安裝前請自行審閱 源碼與 LICENSE,勿把超出需要的 PAT 或過寬的
allowedRoots(如整盤*)交給生產環境。 - OAuth 需自備 Client ID;插件不分發 Client Secret,也不做 OAuth 回調服務器。
- node 半邊改動需重啓 DSH;client 改動硬刷新即可。
git_remote_info受平臺 API 限流影響,限流時返回 429 提示。
結尾¶
@zjj/dsh-git-panel 把 Git 賬號、目錄與遠程倉庫三道閘門、圖形工作臺和 Agent 工具放在同一插件裏,默認偏安全(不寫盤、不泄露未授權路徑、寫操作可確認)。若要在目錄裏試用,可從社區頁瞭解收錄信息:https://www.skillhub.cn/plugins/zjj1769404838/dsh-git-panel;安裝與細節以 GitHub 倉庫爲準:https://github.com/zjj1769404838/dsh-git-panel。