🧮 评分公式
DSH Radar 怎么给每个插件打分?完全开源,欢迎质疑
scripts/lib/score.mjs,欢迎 PR 改进。
总分公式
overall =
popularity × 25% +
maintenance × 20% +
quality × 20% +
security × 15% +
dsh_compat × 20%
// 权重总和 = 100% 5 维详解
📊 Popularity(人气) · 权重 25%
基于 npm weekly downloads,log scale 归一化到 0-100。
// log scale:10000 weekly downloads ≈ 满分
popularity = min(100, round(
log10(weekly + 1) / log10(10000 + 1) × 100
)) 为什么 log?头部插件下载量是腰部的 100-1000 倍,log scale 让长尾不被压扁。
🔧 Maintenance(维护活跃度) · 权重 20%
综合两个信号:npm 最后发布(60%)+ GitHub 最后 push(40%)。
// 指数衰减:半衰期 4 个月
maintenance = round(
recency(lastPublish, halfLife=120d) × 0.6 +
recency(lastPush, halfLife=90d) × 0.4
)
// recency(t, halfLife) = 100 × exp(-ageDays / halfLife) 为什么 npm+GitHub 双源?npm 发版可能滞后于 GitHub 提交,反之亦然。
📦 Quality(文档质量) · 权重 20%
6 个文档信号加分(满分 100):
| 信号 | 加分 |
|---|---|
| description > 20 字 | +15 |
| description > 60 字 | +10 |
| README > 500 字 | +20 |
| README > 3000 字 | +15 |
| keywords ≥ 3 | +10 |
| 含 dsh-plugin keyword | +10 |
| License 有效(非 SEE LICENSE IN ...) | +10 |
| GitHub License 明确 | +10 |
🔒 Security(安全) · 权重 15%
基础分 50,信号加减分(满分 100):
security = 50 // baseline
+ trustedPublisher.oidcConfigId ? 25 : 0
+ publisher.username ? 5 : 0
+ /audit|sandbox|permission|allowlist/.test(desc) ? 15 : 0
- /eval|exec|child_process/.test(desc) && !/safe|sandbox/ ? 10 : 0
- gh.archived ? 30 : 0
// clamp to [0, 100] 局限性:这是启发式安全审计,不是真实代码审查。真实安全评估请用专业的 dsh-plugin-audit 或 Snyk。
🔌 DSH Compat(DSH 兼容性) · 权重 20%
检测 package.json 里 DSH 标准字段:
dsh_compat = 30 // baseline(挂了 dsh-plugin 标签就算)
+ package.dsh ? 30 : 0
+ package.dsh.bundle.patch ? 15 : 0
+ package.dsh.client.platform ? 5 : 0
+ engines.dsh ? 10 : 0
+ (deps 或 peerDeps 包含 @deepseek-ai/dsh) ? 10 : 0
+ exports['./cordis.patch.yml'] ? 5 : 0
// clamp to [0, 100] cordis patch 是 DSH 插件标准格式:见 deepseek-ai/deepseek-harness 文档。
等级阈值
当前分布(2226 插件)
边界情况
🆕 没有下载量的新插件怎么办?
weekly_downloads=0 → popularity=0。整体分会被压低,除非 maintenance/quality/dsh_compat 很高。 这是合理的"冷启动惩罚"——新插件需要时间证明自己。
📦 没有 GitHub 仓库的包怎么办?
gh=null → maintenance 只算 npm publish;quality/security 不算 GitHub 信号。 会比有 GitHub 的包略低,但不会被直接降到 D 级。
🔒 Archived 包会被惩罚吗?
会。security 直接 -30 分。这是有意的——我们不希望团队误装已不维护的包。
🤔 怎么反馈评分不准?
在 GitHub Issues 提:
(1) 插件名;(2) 你认为应该的分数;(3) 理由。算法在 scripts/lib/score.mjs,可直接 PR 改公式。
📝 想调整权重?
改 scripts/lib/score.mjs 里的权重,跑 node scripts/build-data.mjs 重算。完全可复现。