🧮 评分公式

DSH Radar 怎么给每个插件打分?完全开源,欢迎质疑

评分完全基于公开数据(npm registry + GitHub API),无人工黑箱。 所有代码在 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 文档。

等级阈值

S
≥ 85
生产就绪
A
≥ 70
推荐使用
B
≥ 55
可用
C
≥ 40
谨慎
D
< 40
高风险

当前分布(2226 插件)

S
0
0.0%
A
1
0.0%
B
222
10.0%
C
546
24.5%
D
1457
65.5%

边界情况

🆕 没有下载量的新插件怎么办?

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 重算。完全可复现。