← Back to home@moyuqing-man

dsh-plugin-community-source

DSH 插件社区:把 GitHub Discussions 变成插件讨论区、Issues 变成 bug 汇报入口、Stars 变成评分,插件详情页里就能看到社区在说什么。纯 JS、零原生依赖。 / A community layer for DSH plugins — discussions, bug inbox and ratings, right inside the plugin detail page.

Stars
0
Language
JavaScript
Created
Oct 13, 2026
Updated
Oct 14, 2026

Introduction

DSH 插件社区 · 方案文档

注意,该项目由ai进行开发,但是功能没问题,试手作品

一句话:市场已经过剩,社区还是空的。 本方案不做第 N 个插件市场,而做市场之上的那一层——讨论、信任、沉淀与协作。 社区本身是一个 DSH 插件,但它的本质是一个「联合其他插件的联合插件」:不重复收录,只桥接与组织。

仓库:源码与这 8 份方案文档 → moyuqing-man/dsh-plugin-community-source(本地就是这个目录);社区仓库(Discussions 分类 / Issue 与讨论表单 / 行为准则)→ moyuqing-man/dsh-plugin-community(本地是 m0/community-repo/)。两个仓库各自独立推送。

⚠️ 当前版本是 demo(0.1.0),不是稳定版。


1. 一页摘要

维度结论
交付物方案文档 + 可执行的 POC 验证脚本 + 已开工的插件本体(poc/、plugin/;全部零依赖、纯 JS)
载体GitHub Discussions = 论坛,Issues = bug 汇报,Stars = 评分,Releases = 版本
登录GitHub Device Flow——8 位验证码,无回调域名、无 client secret、手机端友好
权限匿名可读,登录可写(发帖 / 评论 / 投票)
技术形态DSH 插件,双形态交付:① client slot 注入版 ② host 侧独立 HTTP 页面版 ③ JSON API
手机端对 dsh-android 天然兼容;对 dsh-phone-pair 主动兼容(靠独立页面形态);对原生客户端提供 JSON API
硬约束纯 JS、零原生依赖——这是能跑在 Android host 上的唯一前提
不做什么不重复收录插件目录、不做第二个注册系统、不做三个手机端 App

2. 文档导航

文档回答什么问题
01-定位与生态分析为什么已经有市场了还要做社区?差异化在哪?不做什么?
02-总体架构系统怎么分层?双形态交付怎么落地?数据怎么流?
03-插件实现规格用真实源码实测出来的 DSH 插件契约;路由表、槽位表、工具表
04-身份与登录GitHub 注册流程怎么简化到「点一下 + 输 8 位码」
05-界面与交互设计页面长什么样?挂在哪些官方槽位上?关键流程怎么走?
06-手机端兼容三套手机方案能不能兼容插件?不能的话我们怎么主动兼容?
07-路线图与验收分几个里程碑?怎么算做完了?风险有哪些?
08-GitHub-API-契约实测:哪些免登录能读、哪些必须要 token、限额卡在哪、POC 怎么跑
poc/ 验证器可执行:一条命令把 08 的每条结论复现成证据(POC-0/1/2/3/4/6)
m0/ 启动包可交付:M0 验证结论 + 可直接推上 GitHub 的社区仓库地基(分类 / 表单 / 首发帖)
plugin/ 插件本体可运行、已真机装载、已发布到 npm(dsh-plugin-community@0.1.0):M1 + M2 + M3 + M4 已跑通——多源索引(6 个源,默认开 2 个)、索引质量治理(sort=smart 把框架本体与聚合清单降级,?sort=stars 仍是纯 star 排序)、/community 页面(关掉 JS 也能看,带类型/分类/排序 chips)、作者资料页 /community/u?login=、/api/v1/community/* JSON API、缓存与陈旧降级、GitHub Device Flow 登录与发帖/评论/表态/单帖读取、client 半边七个座位(侧栏入口 / 主面板双页签含发帖·评论·点赞 / 插件详情页区块与标签 / 设置页 / 登录浮层 / 4 个 Agent 工具的自定义卡片)、中英双语(?lang= + 设置页可切换);221 个测试全绿;英文版见 plugin/README.en.md

3. 核心设计主张

主张一 · 社区是「联合插件」,不是「另一个市场」。 已有市场(DSH-Plugins-Marketplace ★175、dsh-find-plugin ★183、dsh-plugin-subscriptions ★448 等)已经把「发现」这个问题解决得很好,而且各自还在做 CI 索引与审核规范。社区重复造一个目录只会内卷。社区要做的是读它们的索引,然后在其上叠加它们都不做的事:讨论、评价、问题追踪、经验沉淀。

主张二 · GitHub 已经是最好的后端,只是缺一个入口。 评分不用自建投票系统,Stars 就是。Bug 不用自建工单,Issues 就是。论坛不用自建帖子表,Discussions 就是。本方案的工程量几乎全部集中在桥接层与界面层,而不是后端服务。

主张三 · 登录必须是「Device Flow」。 自建注册要邮箱、密码、验证码、找回流程;GitHub OAuth 回调要域名、要 HTTPS、要 client secret。而 GitHub Device Flow 只要一个 client_id,用户看到 8 位码、点个链接、输码、授权——在手机上比在电脑上还顺手。这是本方案能同时服务桌面与手机的关键。

主张四 · UI 必须能脱离 client 插件图独立存在。 现有手机方案中,dsh-phone-pair 的前端是构建时快照,而 DSH 的 client 插件是运行时注入的——两者大概率对不上,结果就是「插件 UI 不显示」。所以社区页必须同时提供一条不依赖 slot 注入的路径:host 侧 webServer.register 直接渲染一个独立页面,任何浏览器/WebView 直接访问 URL 就能用。这条路径同时天然服务原生客户端(换成 JSON API)。


4. 与用户原始设想的一致与修正

原始设想本方案说明
社区本身是「插件联合其他插件的联合插件」✅ 采纳为核心主张一落地为「不收录目录,只读别人的目录 + 叠加讨论层」
DSH 插件只做界面和链接层✅ 采纳host 半边只做 API 桥接与缓存,client 半边只做界面
GitHub 已有 star 做评分、Issues 做 bug✅ 采纳直接用,不自建
简化 GitHub 注册流程✅ 强化升级为 Device Flow,8 位码
评论需要登录✅ 采纳匿名可读、登录可写
论坛用 GitHub Discussions✅ 采纳Categories 直接映射为板块
做手机版 harness↩️ 修正已完成调研:B 站已有的手机方案能兼容插件(dsh-android 是同源真 DSH),因此不做手机端,改为主动兼容已有方案

5. 关键事实速查(后续文档反复引用)

生态规模:聚合 7 个源(dsh.so 10099 · radar 301 · GitHub topic · awesome-dsh-plugin 4579 · 岚叔目录 655 · npm · dsh.works),候选池 13061 条。市场不是不够,是太多。

Android 可行性的决定性证据:yhm080315-sudo/dsh-android 把完整 DSH 打进 APK(自带 Node + bionic 二进制),README 原文——「WebView 里是真正的 DSH Web 界面——不是重写的,是同源代码」「主界面、插件、皮肤、agent 全部跟桌面端一致」,对比表中「第三方插件 ✅」。

但代价是:任何依赖预编译 .node 的 npm 包在 Android 上没有版本;grep/glob 需特殊处理(@vscode/ripgrep-android-arm64 npm 不发布)。→ 本方案的零原生依赖红线由此而来。

client 插件图是否为空的判据:页面 HTML 34846 字节 = 正常,3709 字节 = 插件图为空。这条判据在验证手机端兼容性时会直接用到。

插件契约(实测自真实插件源码):host 半边 dsh.bundle.patch + export const name/inject/Config + export function apply(ctx, config);client 半边 dsh.client + export const inject = ['slots'] + ctx.slots.inject(name, () => ctx.slots.register({ name, id, order }, Component))。详细规格见 03。

GitHub API 能力边界(实测,见 08):

结论实测值
Discussions 有 REST 读接口,完全免登录GET /repos/{o}/{r}/discussions ✅ 200,含 body/category/comments/answer_chosen_at/author_association
写只能走 GraphQL✅ 对照实验钉死:未认证 POST /discussions → 404 Not Found,而 POST /issues → 401 Requires authentication(存在但需鉴权=401、不存在=404);createDiscussion 是 GraphQL mutation
未认证限额REST 60/小时且按来源 IP;search 10/分钟;GraphQL 为 0
认证后5,000/小时(PAT / OAuth App / GitHub App user token 共享同一池)
内容创建≤80/分钟 且 ≤500/小时,网页操作也计入
正确的 scoperead:user public_repo —— read:discussion / write:discussion 不是 scope,不存在
Device Flow不需要 client_secret;expires_in=900、interval=5;验证码提交限 50/小时/应用
生态健康度npm 周下载量有公开 API 且不吃 GitHub 配额;dependents 数无公开 API(实测 404)
GET /rate_limit自身不消耗配额(实测 delta=0)→ 免费的预算探针,配额门控就靠它
304 / ETag 条件请求照样计入配额(delta=1,3/3 复现)——省带宽,不省配额;推翻了「304 免费」的常见说法

6. 阅读顺序建议

  • 只想知道结论 → 本文第 1 节 + 01 第 1 节
  • 要评估可行性 → 03(契约是否够用)+ 06(手机端是否真能跑)
  • 要评估工作量 → 02 第 6 节 + 07
  • 要开始动手 → 03 + 05 + 07

7. 许可证

MIT,© 2026 moyuqing-man。方案文档、POC 脚本与插件本体同一个许可证。

插件本体(plugin/)另有一份同样的 plugin/LICENSE, 因为它会被单独发到 npm,而 npm 包只会带上自己目录内的文件。 社区仓库(m0/community-repo/ → moyuqing-man/dsh-plugin-community)也放了同样的 LICENSE——它是独立仓库,许可证不会跟着父目录走。