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