前言¶
日常在 DSH(DeepSeek Harness)裏幹活,找倉庫基本靠開新標籤頁刷 github.com/trending:看到覺得有用的倉庫,再複製地址、開終端 git clone,順便把 README 丟進翻譯工具。瀏覽器直連 GitHub 會被 CORS 擋住,所以插件必須自己做這些網絡請求。
dsh-plugin-github-radar(1578361862-art/dsh-plugin-github-radar)把這個過程收進 DSH 自己的 Web GUI:加一個「GitHub 雷達」面板,看今天/本週/本月在漲的倉庫,收藏,讀 README(可一鍵翻成中文),標星,淺克隆到本地。它不是獨立網頁,而是 DSH 的一個全局面板,佔 main 槽,左欄有一個入口,樣式跟隨主題。
下面介紹這個插件的構成、能力、安裝方式和使用中的實際坑。
這是什麼¶
一句話定位:DSH 的客戶端插件,把 GitHub 趨勢瀏覽、收藏、克隆和 README 中文化做進 DSH 面板。
- 維護者:1578361862-art
- 當前版本:0.2.0(
package.json) - 許可證:MIT
- 運行環境:
node >=20,dsh >=0.2.1-rc.5 - 目錄頁分類:聯網工具
- 原理:宿主負責抓取和克隆,瀏覽器端只做 UI,兩者同源調用
/github-radar/api/*,不開額外端口、不起第二個進程。
它解決的是「找倉庫」和「讀 README」這兩步的摩擦:用戶名下的 DSH 已經掛了模型,插件直接複用,不額外要 key;克隆是淺克隆,通常就是要看一眼代碼而不是拉全量歷史的場景。
整體結構:宿主 + 瀏覽器兩端¶
dsh-plugin-github-radar/
├── package.json # dsh.client.platform=web,導出 ./client
├── lib/index.js # 宿主半側:/github-radar/api/*、抓取、克隆、登錄、翻譯
├── lib/client.js # 瀏覽器半側:__ModuleLoader__ bundle,註冊 main + 側欄入口
└── docs-panel.png
分工是明確的:
- 宿主做髒活:抓
github.com/trending、取raw.githubusercontent.com的 README、git clone --depth 1、調模型翻譯。 - 瀏覽器只做 UI,
fetch('/github-radar/api/...')同源調用。
這樣做的原因是瀏覽器直連 GitHub 會被 CORS 擋住,無法把這些動作放進前端代碼裏。
核心功能¶
趨勢看板與過濾¶
面板按時間範圍切今日 / 本週 / 本月,語言下拉支持 18 種語言,過濾框可以按倉庫名、描述、語言篩。榜單數據在宿主內存裏緩存 10 分鐘。
未登錄訪問 github.com/trending 只能拿到 15 條;登錄後走 GitHub API,額度從 60 次/小時提到 5000 次/小時。
README 中文翻譯¶
README 彈層右上角有「原文 / 中文」。點「中文」時宿主把 README 切成代碼塊和正文段兩類:代碼塊原樣保留直接輸出,正文按段落逐段翻譯,SSE 流式回傳,邊翻邊看。用的模型就是 DSH 裏已經配好的(ctx.llm,默認取 deepseek-account / deepseek-flash),不額外要 key。沒掛模型的 profile 會直接報「沒有掛載任何模型服務」。
幾個細節值得注意:
- 單段空回覆就退回原文並標註,不會讓整篇失敗。
- 分批翻譯:每次約 12000 字符,翻到這批末尾時正文和彈層底部都會出現「繼續翻譯(剩 N 字)」。
- 每翻完一段就落盤,中途關掉彈層不白翻;下次打開先顯示已翻的部分,還能從斷點繼續。
- 譯文緩存在
~/Data/github-radar/translations/<owner>__<repo>__<engine>.json,按引擎分開存,互不覆蓋;「重新翻譯」強制重跑。
引擎可選(彈層左下角下拉):
| 引擎 | 說明 |
|---|---|
| 任意已配置的模型 | 從 ctx.llm 列出,flash / mini / lite / small 這類小模型排前面,默認就用它 |
| Google 翻譯 | Cloud Translation API v2,需要一個 API key;沒有 key 時選它會彈出配置框 |
| 免費機翻 · MyMemory | 不花模型額度,限制很死:單次 500 字符、每天約 1000 詞,翻兩個 README 就可能 429。限流時會自動退回模型繼續 |
接入 Google 翻譯的步驟:
1. GCP 控制台啓用 Cloud Translation API
2. 創建 API key(建議加限制:只允許 Translation API)
3. 面板裏把引擎切到「Google 翻譯」,粘 key,保存時會先翻一個詞驗證
key 存 ~/Data/github-radar/google.json(權限 600),驗證失敗會立即刪除。計費按字符:每月 50 萬字符免費,超出約 $20/百萬字符。它比 deepseek-flash 翻同樣內容貴一兩個數量級,選它的理由通常是「不想動模型額度」或「手上有 GCP 額度」。
GitHub 登錄¶
右上角「登錄 GitHub」,兩種來源:直接粘貼 Personal Access Token,或者什麼都不填、在終端跑 gh auth login,插件會自動複用 gh auth token。classic token 要 repo 範圍,fine-grained 要倉庫讀權限。
登錄前後能力差異:
| 能力 | 未登錄 | 登錄後 |
|---|---|---|
| 趨勢榜單、README、翻譯 | ✅ | ✅ |
| 克隆公開倉庫 | ✅ | ✅ |
| 克隆私有倉庫 | ❌ | ✅ |
| 面板內直接標星 / 取消 | ❌(點了會提示登錄) | ✅ |
| GitHub API 額度 | 60 次/小時 | 5000 次/小時 |
token 存 ~/Data/github-radar/auth.json,寫入後 chmod 600;克隆時通過 GIT_CONFIG_* 環境變量傳 header,token 不會進 argv,也不會寫進 .git/config。
安裝與啓用¶
插件按 DSH 的組合包(bundle)格式發佈,一條命令(npm 發佈之後):
dsh plugin --profile desktop add dsh-plugin-github-radar
本地目錄試的話:
dsh plugin --profile desktop add file:/絕對路徑/github-radar-plugin
它會同時寫進 profile 的 dependencies 和 dsh.profile.bundles,條目由包內 cordis.patch.yml 提供,不用手工改配置。需要說明 dsh.bundle 聲明是社區目錄的硬性要求,只聲明 dsh.client 的包不可一鍵安裝,本包兩者都有。
卸載:
dsh plugin --profile desktop remove dsh-plugin-github-radar
本地目錄裝的,再刪掉 ~/.dsh/profiles/desktop/node_modules/dsh-plugin-github-radar 這個軟鏈。~/Data/github-radar 和 ~/Code 下已克隆的倉庫不會被刪。
典型用法¶
在面板裏完成常見動作的對照如下:
| 操作 | 結果 |
|---|---|
| 今日 / 本週 / 本月 | 切 trending 時間範圍 |
| 語言下拉 | 只看某個語言(18 種) |
| 過濾框 | 按倉庫名、描述、語言篩 |
| 克隆 | git clone --depth 1 到 ~/Code/<owner>__<repo> |
| 收藏 | 收進右側收藏夾,存 ~/Data/github-radar/collection.json |
| README | 彈層看,Markdown 正常渲染,可切中文(引擎可選) |
| ☆ | 在 GitHub 標星(需登錄) |
| ↗ | 去 GitHub |
克隆下來就是普通 git 倉庫。淺克隆只有當前一個 commit,需要完整歷史時進目錄跑:
git fetch --unshallow
瀏覽順序通常是先看趨勢,篩出目標,點克隆,再在 README 彈層裏切中文。翻譯這種活不需要強模型,如果以後在 DSH 裏配了本地或免費的提供方,它會直接出現在引擎下拉里。
數據落在哪裏¶
按家目錄規則分兩處:
~/Data/github-radar/ # 插件自己的狀態
├── auth.json # 登錄 token(600)
├── collection.json # 收藏夾
└── translations/*.json # 譯文緩存
~/Code/<owner>__<repo>/ # 克隆下來的倉庫,都是普通 git 倉庫
克隆目錄用 owner__repo 而不是裸倉庫名,是因爲 ~/Code 下可能已有同名目錄,加前綴纔不會把別人的倉庫當成「已經在本地了」。兩個根都可以用環境變量覆蓋:GITHUB_RADAR_CODE、GITHUB_RADAR_HOME。
接口一覽¶
宿主側提供這些 HTTP 接口,瀏覽器端同源調用:
GET /github-radar/api/trending?since=daily|weekly|monthly&lang=
GET /github-radar/api/state
POST /github-radar/api/collection {action:'add'|'remove', item}
POST /github-radar/api/clone {owner, repo}
GET /github-radar/api/readme?owner=&repo=
POST /github-radar/api/reveal {dir}
GET /github-radar/api/auth
POST /github-radar/api/auth {token}
DELETE /github-radar/api/auth
GET /github-radar/api/engines
POST /github-radar/api/engines {engine}
POST /github-radar/api/google {key}
DELETE /github-radar/api/google
GET /github-radar/api/stars?repos=a/b,c/d
POST /github-radar/api/star {owner, repo, star}
POST /github-radar/api/translate {owner, repo, force} → SSE
其中 /github-radar/api/translate 返回 SSE,是逐段翻譯流式回傳的通道。
已知限制¶
README 裏寫明的限制,用之前值得知道:
- 解析的是
github.com/trending的 HTML,未登錄訪問只有 15 條;GitHub 改版會失靈,頁面顯示「這次沒掃到」。 - 榜單在宿主內存裏緩存 10 分鐘。
- 克隆是淺克隆,需要完整歷史就進目錄
git fetch --unshallow。 - 翻譯一次最多約 12000 字符,長 README 的後半段保留原文。
- README 渲染是內置的輕量解析器(不引第三方庫):裸 HTML 會被去掉只留文字,
<details>摺疊塊會被攤平。 - 客戶端
apply和翻譯都包了 try/catch:插件自身出錯只打日誌,不會拖垮 Web 啓動。
適用場景與注意¶
適合誰:日常要在 DSH 裏找開源倉庫、看 README 並想直接落一份淺克隆的人;以及想少開幾個標籤頁、把「發現—收藏—克隆—讀懂」放一起的 DSH 用戶。已經在用 gh 登錄、或已經配好 deepseek 模型 profile 的,幾乎零額外配置。
需要留意的:
- 插件以當前 dsh 進程權限運行,能讀寫文件、起進程、訪問網絡。裝機前應當檢查源碼(
lib/index.js、lib/client.js)與許可證(MIT),看清楚它會動哪些路徑。 - 譯文走你 DSH 裏已掛的模型,會消耗對應模型的額度;不想動額度可以選 Google 翻譯或 MyMemory,但後者有單次 500 字符、每天約 1000 詞的限制。
- 團隊/公司代理環境下訪問
github.com、raw.githubusercontent.com是否暢通,直接決定插件能不能用,先用未登錄狀態試一下趨勢列表是最省事的驗證方式。
結尾¶
dsh-plugin-github-radar 的用法很集中:在 DSH 裏多一個面板,把找倉庫、克隆和讀 README 合在一起,翻譯能力複用已有模型配置,登錄和 key 都是可選。功能不算複雜,但把幾處重複的手動操作收進了一個入口。
更多信息看目錄頁 https://www.skillhub.cn/plugins/1578361862-art/dsh-plugin-github-radar 和倉庫 https://github.com/1578361862-art/dsh-plugin-github-radar 。