dsh-plugin-mesh
别名:插件生态图、生态扇区图、生态图、plugin ecosystem map
把带 dsh 系列 GitHub 标签的仓库按功能铺成一张可交互的生态扇区图:圆心是官方仓库,19 个功能扇区、61 条细枝规则、三类连线。它是独立静态站点 + Python 采集器,不是 DSH 插件;与本站是「自动全景 × 人工核实」的互补关系。
它是什么
按功能组织的 DSH 生态全景图:把打了 dsh 系列话题的 GitHub 仓库抓下来,铺成一张以 deepseek-ai/deepseek-harness 为圆心的扇区图。
它在 README 里自己声明:「这不是 DSH 插件,不依赖 DSH 运行时;它是一个独立的静态前端 + Python 采集后端。」 ——所以本站把它收在资源源里(sourceKind: tool),不收进插件分区。
| 项 | 值 |
|---|---|
| 仓库 | WTStarMark/dsh-plugin-mesh |
| 代码构成 | 静态前端(原生 JS,零依赖)+ Python 采集后端 |
| 许可 | MIT |
| 版本 | README 徽章自称 v0.4.0 |
| 在线地址 | <http://104.129.51.126/>(裸 IP + HTTP,可能变动) |
| 仓库创建 | 2026-10-02(GitHub API 实读) |
它抓什么、按什么分类
- 采集面(README 列举):
dsh·dsh-desktop·dsh-plugin·dsh-plugin-desktop·dsh-plugin-market·dsh-plugins; - 圆心固定为官方仓库
deepseek-ai/deepseek-harness; - 19 个功能扇区 + 61 条细枝规则(每个扇区下 2~5 条细枝),按功能而不是按标签分组;
- 三类连线:同作者(默认开)、同扇区近邻、主题共现。度数上限只裁主题边,owner 边豁免 (否则同一作者的项目会「断线」);
- 节点位置由可播种 PRNG 决定,同一 seed 逐点可复现;
- 点扇区可放大:该扇区铺满整圆、圆内按细枝重新分扇。
几个值得学的产品细节
写在正文里,因为它们是这个项目最有价值的部分(不是数据,是做法):
- README 里的预览图由真实数据生成(
node tools/snapshot-svg.mjs复用前端的布局与配色代码), README 里那句原话是「不会出现『README 里的图还是三个版本前』的情况」——本站的预览截图目前全是手工的; - 筛选只「淡化」不移除、位置不变——图上这比隐藏更友好(本站在分区页做的是隐藏);
- 访问统计拿不到接口时整栏隐藏,不留一个空壳组件。
与本站的关系
互补,不是竞争:
- 它回答「生态里有什么、彼此像不像」——自动、立刻更新、覆盖所有打了话题的仓库;
- 本站回答「这是什么、凭什么这么说、谁在维护」——人工核实、逐条出处、可认领。
两边的口径差异要说清:它的扇区划分是机器规则推断,不能当作事实引用;本站在词条里引用它时, 只把它当外部来源。反过来,没打话题的仓库不会出现在它的图里(启动器、整合包、规范这类 项目往往不打插件话题),那正是本站人工分区的价值所在。
我核实到的
| 项 | 实测值 | 核实方式(2026-10-02) |
|---|---|---|
| 仓库存在、话题、许可、创建时间 | topics = dsh / dsh-plugin / dsh-plugin-desktop / dsh-plugins;MIT;created 2026-10-02T04:53:38Z | GitHub API 实读 |
| README 全文(本节所有自称数字与功能) | 已读原文 | GitHub API 取 README 并解码 |
| 在线站点可达 | http://104.129.51.126/ → HTTP 200 | curl |
| 站点资源 | /styles.css 200(3.5KB)、/src/app.js 200(2.1KB,ES module) | curl |
| 它自己的预览图快照 | docs/preview-light.svg(313KB,1400×1400,2625 个 <circle> + 19 个 <path>);但所有 circle 的 cx/cy 都是 700,即全部塌在圆心 | 取原文解码后本地渲染,只渲染出圆心那一个圆;再用它自己的 tools/snapshot-svg.mjs 现跑一遍,2625 个 circle 的 cx 仍然只有 1 个不同值——不是提交陈旧,是渲染器本身的问题 |
| 预览图 bug 的根因 | tools/snapshot-svg.mjs 画圆与连线时取 layout.x[i] / layout.y[i],那是动画中的当前位置,静态渲染时还全在圆心;目标位置在 layout.tx / layout.ty。把 6 处改成 tx / ty 后重跑:不同 cx 值 1 → 2160,布局正常展开 | 本地克隆里改一行验证(没有动他们的仓库)。讽刺的是,他们自己的 src/links.js 注释就写着这个坑:「必须用目标位置:入场动画没跑完时 x/y 还全叠在圆心」 |
| 仓库结构 | 61 个文件;顶层 backend / data / docs / src / tests / tools + index.html + styles.css | GitHub API 文件树 |
| 数据集本体 | data/mesh.json(3.1MB):meta.generatedAt=2026-10-01T17:00:42Z、kind=hourly-crawl、2625 个节点 / 3968 条边 | 克隆仓库后本地解析 |
| 边的类型 | 只有两类:topic=3204、owner=764(第三类 neighbor 是前端按布局现算的) | 同上,按 type 计数 |
| 节点字段 | id / name / owner / stars / forks / language / license / archived / topics / matchedTags / category / subcategory / degree…没有依赖或兼容字段 | 遍历节点字段 |
| 采集器读什么 | 只读 GitHub Search API 的仓库元数据;在整个 Python 后端里搜 package.json/dependencies/manifest/requires 零命中 | 源码检索 |
它连的是什么关系(这一节是回答「是不是插件关系图」)
是关系图,但连的是「关联」,不是「依赖」。 三类边各有来源(src/links.js 的注释与实现):
| 边类型 | 条数 | 依据 | 它回答的问题 |
|---|---|---|---|
topic 主题共现 | 3204 | 稀有话题共享(超级话题已按 hubThreshold 排除) | 「这两条像不像」 |
owner 同作者 | 764 | owner 相同(ownerStarEdges 55 条为星标归并) | 「这是谁家的」 |
neighbor 同扇区近邻 | 前端现算 | 布局距离(源码原话:「位置相近 ⇒ 功能相近」) | 纯视觉,不是语义 |
每条边还带一个 via 字段说明理由,例如 {source: "imsai-sh/awesome-deepseek-harness-plugins", target: "imsai-sh/dsh-1024store", type: "topic", weight: 7, via: ["plugin-directory","registry","catalog","plugin-hub"]} ——这是它设计上最值得学的一处:边是可解释的。
它里面没有的东西(也就是这类图最容易被误以为有的东西):没有任何一条「A 依赖 B / A 是 B 的前置 / A 与 B 不兼容 / A 替代 B」。 节点里没有依赖字段,采集器也不读任何清单文件(见上表实测)。所以它是 「生态相似度 + 归属」网络图,不是模组依赖图那样的有向语义关系图。
未核实 / 未声明
- 实体浏览器里的最终渲染:无头浏览器里页面能加载并显示「正在载入抽样数据…/运行正常 初始化…缩放 1.00」, 但我没有拿到 canvas 的最终绘制结果,所以「图很漂亮」这句我不替它背书——请自己在浏览器里看。
- README 预览快照坏了,根因已定位:
tools/snapshot-svg.mjs用了layout.x/y(动画中的当前位置) 而不是layout.tx/ty(目标位置)。在本地克隆里把 6 处改成tx/ty后重跑, 不同cx值从 1 变成 2160,布局正常展开——所以这是他们仓库里一个可复现的小 bug, 不是数据问题(复现命令:node tools/snapshot-svg.mjs --size 1400 --theme dark)。 修正后生成的图我也拿到了(暗色/亮色各一张,供本页事实核对用)。 - 它到底收录了多少仓库:线上站点停在载入状态,无头浏览器里没拿到数字; 但仓库里就有数据集本体(
data/mesh.json3.1MB,2625 个节点、3968 条边,hourly-crawl快照) 与一份字段级契约(docs/data-contract.md,含meta/tags/hubs/clusters/nodes/edges)。 所以「无从对接」这句是我先前写错了:数据是开放的,只是没挂在线上站点上 (线上/data/repos.json仍返回 403)。本站暂时没有为它写adapter——因为它的边是相似度, 不是我们要的那些语义关系(见上一节)。 - 扇区与细枝规则是否准确:61 条规则的具体内容未逐条核实;机器分类必然有误判,引用需谨慎。
- 访问统计 API:README 说「同端口最小 API:访问数 / 同时在线,拿不到接口时整栏隐藏」, 接口路径与隐私口径未核实。
- 许可只核到仓库根:MIT(GitHub API 报的 SPDX)——前端与后端是否有例外条款未逐文件核对。
对本站的两个后续启示(不是承诺)
- 关系数据:本站
relations目前是空的,做「关系图」会是一张空图;先按可核实的关系把 前置 / 推荐 / 替代 / 联动填起来,比先做图更重要。 - 对外数据契约:本站已经在公网发布机读数据(
/data/registry.json、/data/reverse/plugins.json、/data/entries/<kind>-<n>.json、/data/zones/<id>.json,实测均 200),但没有写成契约文档; 要谈「谁接谁的数据」之前,先把这份契约写出来。
信息表
- category
- ecosystem.source
- howto
- 读者:直接开在线地址看全景 <http://104.129.51.126/>(作者自己的地址,http + 裸 IP,随时可能变;本站另有一份原样托管的副本,见插件分区的「全量插件生态图」);点任一扇区会放大成整圆、扇区内的细枝重新分扇。 仓库作者:它按 GitHub **话题**采集,所以把自己的仓库打上 `dsh` / `dsh-plugin` / `dsh-plugins` / `dsh-desktop` / `dsh-plugin-desktop` / `dsh-plugin-market` 里的任一个,下一轮采集就会出现在图上——不需要向任何人申请。 想自己跑:`git clone` 后 `npm run serve:lan`(零依赖,只要 Node ≥ 20);采集需要 `GITHUB_TOKEN`,`python3 backend/collect.py --loop --interval 3600` 常驻。
- license
- MIT
- linkOut
- http://104.129.51.126/
- provides
- repo、topics、language、archived、owner、sector、branch、edges
- relation
- complementary
- sourceKind
- tool
- updatedAt
- 2026-10-02
- url
- https://github.com/WTStarMark/dsh-plugin-mesh
- zones
- plugins
标签:可视化、生态图、外部源
按标签浏览:外部源(4)