Repository navigation
dsh-seam: [插件开发支持工具] DSH 兼容性检查及问题定位 #13379
Replies: 4 comments 1 reply
|
谢谢把两者的边界写得这么清楚——尤其是「能启动不等于没坏」这句。懒加载的命令、稍后才注册的事件回调,运行时确实覆盖不到;这一点我在 补充几点可能对你有用的事实,也顺便让找过来的人少踩坑。 一处需要修正的描述
这里容易让人以为它做的是「真启动」的 PR 检查。准确说是两件不同的事:
所以和
两者失败模式不重叠,这点你判断对了。我这边测不到的正是「启动没跑到但代码是坏的」,你那边测不到的正是「包本身装不上」。 一个可以直接抄的做法如果你的 现在改成按 semver 排序 + 角色标注:最新版、高于最新版才纳入的 tag、上一条发布线。alpha 那种落后于 latest 的会被丢弃并记录原因。 对应到 关于互补如果你愿意,我可以在 顺便:
举这个例子是想说:作者侧工具如果给出会让用户改坏配置的建议,杀伤力比漏报大。你那边 |
|
感谢详尽的补充,尤其是对 PR Action 的纠正——我回头读了 关于 dist-tag 的坑也记下了。 互挂链接的提议很好,我这就在 README 的“检查边界与职责划分”一节加上指向 |
|
改得比我期待的还快——谢谢回头去读了
尤其「不产生任何『建议你去改配置』的输出」这一点是对的。这正是我那个案例的病灶:那条告警本身是误报,但它引导用户去改一个会让应用起不来的环境变量。工具有写入能力不可怕,可怕的是把判断错误包装成建议交给人去执行。 我这边已经做了
EasonMWS/dsh-plugin-health@46f6478 写的是具体的分工,不是客套:
开头一句我特意写实了:启动试运行只覆盖 profile 启动时走到的路径,插件可以启动得很干净,却仍然被同一次升级弄坏。 关于 tag 名你说「tag 名只应该参与『跟随』,不应该参与任何『判断』」——这个区分比我原话更准,我要借用。 我们踩的具体形态是:把 一件小事
祝顺利。有需要我这边配合验证的,直接说。 |
|
顺着「能启动不等于没坏」这句往下补一个维度:能启动、类型也对,但功能静默空转。 我是 dsh-nce( 这个维度的形状我的 0.1.0 装完之后面板能打开、不报错,但是空的。
两个工具都没错,只是「数据/资源能不能被解析出来」既不在源码↔类型契约里,也不在启动行为里。而它的成本比启动失败更高:启动失败用户会来提 issue,空白用户会直接卸载且不吭声。 我的三道防线(可抄)1. 每一级回退都要过内容校验,不是目录存在就算数 数据目录三级回退: 2. 解析失败要抛错,不要返回空
3. E2E 断言「有内容」,而且跑在一次性 HOME 里 dsh plugin --profile e2e add dsh-nce # 全新 HOME
# 然后直接读运行时 dataDir 下的 index.json,断言课程数 = 144只断言「装上且能加载」测不出上面那个 bug,要断言装完之后的实际内容量。 4. 数据包与主包解耦,让「缺数据」降级成「少内容」而不是「装坏」 教材走独立 npm 包 边界(这套什么时候不该用)
给工具定位的一点想法如果两位想把这一面也纳进去,最便宜的不是去检查资源文件,而是要求插件在 manifest 里声明一个就绪探针(比如 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
TL;DR:给 DSH 插件作者用的编译期兼容性检查工具,非 DSH 用户向。使用简单,接入友好。在插件目录跑一行命令,就可检查插件用到的 DSH 接口在新版本下有没有破坏性变更,并定位到源码具体行号。
仓库:https://github.com/YMoose/dsh-seam(MIT)· tested with DSH 0.2.2-rc.1 ·
npx github:YMoose/dsh-seam#v0.1.0一、已有工具与 dsh-seam 的定位
围绕 DSH 升级与插件兼容,社区里已经有几件工具,各自负责不同环节:
dsh-seam具体做两件事:scan:从插件源码 AST 提取真实用到的依赖面——读了哪些字段、注入了哪些服务、监听和触发了哪些事件、哪些as断言绕过了类型检查——输出报告或生成coupling.json契约文件。verify:按这份契约生成类型探针,对已安装的@deepseek-ai/*的.d.ts做编译检查,上游删字段、把非空改成可空、改事件签名,都会定位回你源码的file:line。边界(它不做什么):
dsh-plugin-health的领域。两者是互补关系:
dsh-plugin-health回答“还能不能启动”,dsh-seam回答“坏在我源码哪一行”。能启动不等于没坏——懒加载的命令、稍后才触发的事件回调,启动阶段不一定跑到,类型检查能覆盖全程序的调用面。二、怎么接入使用
1. 本地跑一次检查(零配置)
在插件仓库根目录直接用
npx跑,不需要改仓库文件:当上游出现破坏性变更时(例如
@deepseek-ai/dsh-agent将Agent.session从Session改成Session | undefined),verify的真实报错输出:2. 挂进 CI 持续检查
先在插件目录生成并提交
coupling.json:然后在 GitHub Actions 里加一步:
这样每次 PR 都能自动拦住两件事:改了源码但忘了更新依赖契约、或者升级
@deepseek-ai/*后破坏了插件依赖的接口类型(monorepo 支持加--recursive逐包检查)。如果需要连无类型标注的隐含依赖也一并锁住,可以用sync把契约测试同步进插件仓库配合单测跑,具体步骤见仓库 README。我自己维护的两个插件(
dsh-log-enhance、dsh-editor-socket)已经接入了这套检查。如果在你的插件上跑出误报或漏报,或者有其他 bug 和功能需求,欢迎直接提 issue。All reactions