dsh-plugin-github-radar:在 DSH 面板裏看 GitHub 趨勢,順手收藏、標星和克隆

前言

日常在 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 。

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

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

小夜