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 。

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

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

小夜