社区插件市场一周观察:82 个项目、三类方案、四起启动事故(附普查表) #3395
cwy433-png
started this conversation in
General
Replies: 1 comment
|
普查很扎实,证据到文件行号,收藏了。补一个视角:市场/目录/管理器把"找到、装上、管好"做得很成熟,但**"信不信得过"这一维,目前几乎看不到成体系的做法**。 其实各家都意识到了信任的重要性,而且各有贡献:目录把边界讲得很清楚(收录不代表背书)、实测类做到了"能不能跑起来"的硬证据、安装侧把操作层安全做得很深(固定来源、回滚、守护)。但纵向看,还差一环:"是谁发布的、有没有被改、依赖有没有已知漏洞"——这三问目前还没有一个统一、可验证、可互认的口径,主要靠各自声明和用户自查。 生态到 82 个项目、上千插件这个规模,这一环会从加分项变成必需品——npm/Anaconda 的投毒教训,智能体生态危害面更大(插件可接触真实系统)。 现在社区已有项目在做这个方向(如 #3350 的 dshlib 图书馆):目录 + 信任层——身份认证分级(内容指纹→来源→发行→多方交叉验证,DID 承载)、自研扫描 + 第三方复核 + 依赖漏洞三维度、每插件独立扫描报告页全公开。目前已收录 401 插件:第三方复核 305 个(232 通过/73 提示均列待人工审,无确认恶意)、依赖抽查 10 个(2 个有已知漏洞已标注)。 一个想法:如果"身份声明 + 扫描结果"有个可比口径(统一格式、时间戳、可失效),各家的独到之处就能互相衔接、互认,而不是每个市场重新收集一遍。机制草稿在 #3192(CHA2A 规范讨论),欢迎拍砖。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
DeepSeek Harness(dsh)发布快一周了。作为以"万物皆插件"为设计哲学的 deepseek 专武,自由度和可定制化程度很高,但目前没有官方插件市场。于是社区上了:到 8 月 19 日,至少有八十来个项目在尝试解决这个问题。
一、解决方案有三类,头部效应显著
挂着"插件市场"名号的项目主要分三类:
市场和目录有重叠(有的仓库同时发两个包),合计 82 个项目。
做目录的拿到了 7.7 倍于做市场的星。 32 个市场里一半不到 6 星。
头部飞轮明显。 star 最多的是目录类的 awesome-dsh-plugin/awesome-dsh-plugin(网站 https://awesome-dsh-plugin.com ),收录约 1.5k 条,上午 9k 左右、18:40 已到 9.7k,占了目录类星数大头,且已被 dsh-subscribe、Sanqi-normal 等市场类插件引用为数据源。同作者 @fkysly 的市场插件 dsh-market/dsh-market 也从上午 1k 涨到 1.2k。
大部分是个人项目。 75% 的项目只有 1 个贡献者。AI 时代实现非常快,生产力过剩,发现需求、占领心智可能更重要。
(注:目录类多靠 PR 收录,每个来加一行的作者都算一个贡献者,头部几份清单动辄九十几人;市场类没有这种机制,两边贡献者数不可直接比。)
名字撞得厉害。 39 个候选里,
dsh-plugin-marketplace5 个、dsh-plugin-market5 个、dsh-plugin-store3 个,dsh-market/dsh-plugin-hub/dsh-plugins-store各 2 个;归一化连字符和单复数后 12 个项目挤在同一个名字上,npm 包名也开始撞。另有 29 个仓库是awesome-dsh-plugin的各种变体。二、工作机制:索引 – 安装 – 管理
一个"市场"做三层事:索引(插件名单从哪来)、安装(怎么把包弄到机器上)、管理(装完之后的报错处理、卸载等)。
索引:近万个插件,哪些真能用?
各家首页报的收录数口径差很多:三千九、四千七、两千五……差异在收录标准。
星数最高的那份清单的规则是:提一个 PR、加一个 YAML(仓库地址、名字、分类、一句英文描述),现在 1494 条。一个插件一个文件,PR 不互撞,README 脚本生成,定时扫失效链接。它数的是"有多少人交了 YAML"。
另一份 AdamPlatin123/awesome-dsh-plugins(1238 星)做了很实在的事:把插件逐个丢进容器真装一遍,看能不能跑起来。数字分层报(截止 8 月 19 日下午):
注意入池有 star 门槛(少数稀缺类别豁免),所以 979/1673 这个通过率是"高星那批"的成绩,不能推算全部 9247 个;剩下七千多个低星的还没人测过。
安装:自己打补丁 vs 调官方命令
dsh 装插件是两步走:
node_modules;只做第一步,包躺在磁盘上 dsh 不看它;只做第二步,名单里有而文件不在,整棵插件树加载失败,起不来。
麻烦在于第二步有两个登记处:profile
package.json里的dsh.profile.bundles(官方文档说"从不需要手写,由dsh plugin命令维护"),以及同目录的cordis.patch.yml(留给用户自己改的配置层)。官方安装命令只动前者;自己实现安装的市场,有的动前者、有的动后者、有的都动。所以第一个分岔是:这两步交给官方,还是自己动手? 32 个市场的选择:
需要编译的源码会影响安装。 有些插件放的是源码,装时要先编译,靠包里脚本自动跑;pnpm 10 起默认不信任这类脚本(能执行任意代码),第一次装会失败,要用户去配置里手写"允许这个包跑脚本"再装一次。至少四家市场把这步自动化了——省掉一次失败重试,也可以说替用户写了那句"我允许"。
管理:不只是市场,更是管理器
头部市场已经不只是浏览安装页:会区分已安装 / 已安装未生效 / 校验没过 / 要重启才生效;装前先看插件是不是命令行用的,是的话拦一下提示装进网页版可能无效甚至导致启动失败;pnpm 内部走到哪步、下了多少字节透传到界面;装坏了有诊断面板查冲突和加载顺序,生成一段话让你交给 agent 去修。
三、已出现的"装完插件 dsh 起不来"案例
本仓库 discussion 里三起、某市场自己的 issue 区一起:
追加配置时写出非法 YAML。 配置文件
cordis.patch.yml默认内容是空数组[],市场在它后面直接追加- insert:条目,语法冲突,用户升级完开机即报failed to parse overlay … YAMLException。已修:作者在 CHANGELOG v1.5.2 写了成因和恢复方法——手动删掉单独那行[]即可。原帖:bradeGithub/DSH-Plugins-Marketplace#73(同根因 #71)。在 dsh 自己的安装目录里跑了 npm。 npm 会清掉它认为多余的包,而 dsh 一批核心包是运行时注入、没写在依赖清单里,被当垃圾清掉,
dsh web报ERR_MODULE_NOT_FOUND: Cannot find package '@deepseek-ai/cordis-plugin-group'。触发方至今没查清——官方命令走 pnpm、在 profile 目录执行,不会碰全局安装。原帖:#3230;更早的同类报告 #2081。插件写进了加载清单,但入口文件不存在。
plugin tree failed to load … Cannot find module '…/profiles/web/node_modules/<pkg>/lib/index.js',就是"只做了第二步"。原帖:#3239。市场装完/更新后,同一个 loader id 被登记了两次。
duplicate loader entry id: storage——两个包都声明了 id 为storage的条目,互斥。用户手动从dsh.profile.bundles里删掉一个能起来,但下次在市场里装/更新任意插件,官方dsh plugin的 reconcile 会把它静默写回去(dependencies 里有、且声明了dsh.bundle.patch的包一律加回 bundles,只加不删),再次崩溃,用户会以为是新装的插件有问题。原帖:#3263。这几起背后是同一个官方层面的行为:profile 里一个坏条目就让整棵插件树 fail-fast、起不来,没有跳过或降级路径;第四起还多了一层——官方 reconcile 与用户手改之间没有协商,市场的每次操作都可能把手改撤销。相关讨论已有 #880、#1197,以及提案 #2603(逐个插件捕获错误 + 可操作提示)。市场类插件越多,这条路径被触发的机会也越多,值得在官方层面考虑。
解法
装插件前备份 profile 下这两个文件:
前者是官方命令维护的插件清单,后者是你自己的配置层,不同市场往不同地方写,两个都要留。装完先别关终端,另开窗口跑一次
dsh web确认能起来再走;真出问题把两个文件还原回去,多半能启动。附录:普查原始数据(2026-08-19 09:54 UTC 抓取)
安装方式:A 调官方 CLI · B 自己实现 · C 混合 · D 只复制命令给用户。「dsh.bundle」= 项目自身是否按官方格式声明插件清单。「贡献者」已排除 bot,百分比为头号贡献者占比。各表内"不计入"与"仅站点"的行已沉底。
展开/收起 四张表
三类对比
市场类(39 个候选,计入 32)
src/dsh-cli.ts:511 spawn dsh plugin自己 clone → 复制进 node_modules → 正则追加 patchsrc/shared/install-runner.ts spawn dsh pluginlib/host.js:650 spawn … plugin addsrc/index.ts:2254 pnpm add · :852 写 cordis.patch.ymllib/index.js:1283 pnpm add · :122 addBundleToManifest()lib/index.js runner(execPath,[cliPath,'plugin',…])plugin-manager/lib/index.js:114 spawnCmd('dsh',…)installer.ts:168 dsh plugin add · :112 git clonelib/index.js:557 quote([…,'plugin','--profile',…])host/index.ts:700 pnpm add --ignore-scripts → cpSync → reconcileBundle()profile-operations.ts:673 add --save-exact · :697 bundles.push()client.tsx:631 session.prompt(…,'queue')command.ts spawn(execPath,[entry,'plugin',…])host/index.ts execFile('pnpm',['dsh','plugin',…])src/index.ts:400 runDsh(['plugin',…])plugin-marketplace-service.cjs replaceDirectory + ensureProfilePatchsrc/index.js:488 官方优先,失败回退 pnpm + patch 合并install.ts:315 pnpmRun(['add',spec]) + 自己改 bundlescore.ts:644 spawn npx dsh plugin · :897 写 patch · :462 改 allowBuildsindex.js:191 execFile(node,[bin,'plugin',…]) · :141 ensureMounted()src/host.js:314 'dsh plugin --profile … add'installer.js:75 ['plugin','--profile',…]installer.js:5 pnpm add · :512 npm pack + tar · :39 重写 patchmutations.ts:65 ['plugin','--profile',…]install.js:132 ['plugin','--profile',…]host/installer.ts:5 pnpm add · :431 git clone 回退market-server.js:169 ['dlx','@deepseek-ai/dsh','plugin',…]gateway.ts:542 runPnpm(['add',spec]) · profile-ops.ts:148 addBundle()lib/index.js:621 run(bin,['add',spec]) · :644 appendFile patchsrc/dsh.mjs:103 plugin --profile add|remove|install --offlineclient/src/index.ts:106 ['pnpm','add',spec]InstallCard.tsx:33 clipboard.writeTextstore.js:712 clipboard.writeTextcli/src/index.ts:389 runProcess('dsh',…)lib/index.js:429 fetch(downloadUrl) · :363 生成 static.patch.ymlinstance-manager.ts:305 docker exec … pnpm addSKILL.md §3 让 agent 跑 dsh plugin add目录类(31 个有仓库 + 3 个仅站点;另 1 个不计入)
管理器类(9 个)
All reactions