Skip to content

finding: assertCanonicalVitestInvocation does not cover the 11 packages that own a vitest.config.ts — measured: a package-cwd run in plugin-grid is NOT refused #5313

Description

@os-support-ai

发现于 #4815 的实施(选运行方式时读了这段守卫)。不在 #4815 范围内,单独记录。

事实(实测 origin/main @ de4e29a,worktree objectui-issue-4815)

scripts/vitest-invocation-guard.mjs 的文件头声称覆盖是全量的:

Called from the top of vitest.config.mts, so it covers EVERY entry point into this repo's Vitest ... (Every per-package vitest.config.ts re-exports the root config, and a package without one — e.g. packages/app-shell — resolves upward to it, so no package-level path skips this file.)

括号里那句对 11 个包不成立。按「文件里是否出现 vitest.config.mts / assertCanonicalVitestInvocation / 上溯 import」分类 packages/*/vitest.config.{ts,mts}(17 个文件):

  • re-export(6):components、core、fields、plugin-dashboard、react、types
  • 自带独立 defineConfig(11):plugin-calendar、plugin-charts、plugin-detail、plugin-form、plugin-gantt、plugin-grid、plugin-kanban、plugin-list、plugin-map、plugin-timeline、plugin-view

这 11 个文件都是自足的 defineConfig({...}),不 import 根配置,因此不调用守卫

实测确认(不是读代码推断):

cd packages/plugin-grid && pnpm exec vitest run src/__tests__/bulkParamToField.test.ts
RUN v4.1.10 /home/user/objectui-issue-4815/packages/plugin-grid <- Vitest root ≠ 仓库根
Test Files 1 passed (1)
Tests 15 passed (15)

守卫的原则是「Any run whose Vitest root is not the repo root is refused」。这次运行的 Vitest root 就是包目录,没有被拒,退出码 0。

为什么值得记

守卫存在的理由是两种静默假绿(#3378 包内 cwd 收集了别人的文件、#3288 path filter 被 -- 吃掉)。这 11 个包正是唯一仍然可能踩到它们的地方,却是守卫唯一管不到的地方 —— 而文件头那句话会让下一个人相信已经管到了。危害不是「守卫没生效」这一件事,是一句可证伪的覆盖声明为假:读到它的人不会再去验证。

本次只测了带显式 path filter 的形态(它收集的确实是我点名的文件)。未测:这 11 个包下的裸 pnpm exec vitest run 是否会命中 #3378 那种「收集到 22 个别人的文件并报绿」—— 各包本地配置没有根配置的 projects 与绝对路径 apps/console,collect 行为可能与根配置不同,需要实测再下结论,别照抄 #3378 的数字。

#3240 的关系

#3240(open)问的是「哪些包真的需要本地配置」。本单不等于它,也不依赖它的答案:即便结论是这 11 个包都该保留本地配置,守卫要么应当覆盖它们,要么应当停止声称已覆盖。两条最小修法(任选,都不必等 #3240):

  1. 11 个本地配置各自 import 并调用 assertCanonicalVitestInvocation(与 6 个 re-export 包同构);
  2. 或先把文件头那句话改成实测为真的措辞,把洞显式记在守卫里。

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:queue

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions