scripts/docs-audit/affected-docs.mjs 从变更文件推导包根时只特判了 packages/plugins/*:
let m = f.match(/^(packages\/plugins\/[^/]+)\//) || f.match(/^(packages\/[^/]+)\//);
但这个仓库有 7 个「容器目录」—— 自身没有 package.json、下面才是真包:
| 容器目录 |
嵌套包数 |
packages/plugins/ |
18 ← 唯一被特判的 |
packages/services/ |
16 |
packages/connectors/ |
4 |
packages/apps/ |
3 |
packages/qa/ |
3 |
packages/triggers/ |
3 |
packages/adapters/ |
1 |
于是除 plugins 外的 30 个包,改动都会被归到父目录。
症状就在 #4161 的 drift 评论里
那条评论说 "This PR changes 2 package(s): packages/services, @objectstack/spec" —— 该 PR 改的是 packages/services/service-automation,本该报成 @objectstack/service-automation。报出目录名,就是这个 bug 的直接证据。
两个后果,漏报是严重的那个
packages/services/ 没有 package.json,所以:
const pj = join(repoRoot, dir, 'package.json'); // packages/services/package.json — 不存在
if (existsSync(pj)) { name = ... } // → name 保持 null
1. npm 名那条匹配臂整个失效。 匹配逻辑是:
if (name && text.includes(name)) hits.push(name);
else if (text.includes(dir)) hits.push(dir);
name 为 null,就只剩路径 token packages/services 可匹配。任何只提 @objectstack/service-automation、不提该路径的文档都会被漏掉。
实测这个漏报确实存在 —— 3 篇:
content/docs/automation/flows.mdx
content/docs/releases/implementation-status.mdx
content/docs/releases/v9.mdx
第一篇是和 wait 节点改动最相关的那一篇。#4161 里它们之所以出现在清单上,纯粹是因为该 PR 同时改了 packages/spec、被 @objectstack/spec 捞到了。一个只改 service-automation 的 PR 会一篇都不报。
这个方向正是工具自己声明要避免的:README 和 #4091 的 changeset 都写着 "over-inclusion is preferred over misses"。
2. 顺带的噪声。 路径 token packages/services 会匹配任何提到该目录下任意路径的文档,所以一个 service-automation 的改动会连带捞出 audit / settings / storage 等服务的文档。这个方向无害(过度包含是设计选择),但归因是错的 —— _(via packages/services)_ 没告诉读者是哪个包。
修法
不要硬编码那 7 个目录名。 那本身就是 #3786 排查的「手抄清单 + 保持同步」形状 —— 新增一个容器目录时它会再次静默失效。应当从文件系统推导:取变更文件路径上最深的、含 package.json 的祖先目录。这样 plugins 的特判也一并消失,而不是再加 6 条。
顺带一提,#4091 给这个脚本加的 --self-test 覆盖不到这条路径 —— 它只钉了 isTestFile 匹配器。守卫自身的守卫有个自己的洞。修的时候应把包根推导也纳入自检,至少含:直接子包(packages/spec)、每类嵌套包(packages/services/x、packages/plugins/y)、以及一个「容器目录本身绝不该成为包根」的断言。
未包含
@objectstack/spec 在 #4161 上匹配 108 篇文档 —— 那是设计如此的过度包含(spec 几乎在每篇文档里都被提到),不是 bug,本 issue 不涉及。
相关
scripts/docs-audit/affected-docs.mjs从变更文件推导包根时只特判了packages/plugins/*:但这个仓库有 7 个「容器目录」—— 自身没有
package.json、下面才是真包:packages/plugins/packages/services/packages/connectors/packages/apps/packages/qa/packages/triggers/packages/adapters/于是除
plugins外的 30 个包,改动都会被归到父目录。症状就在 #4161 的 drift 评论里
那条评论说 "This PR changes 2 package(s):
packages/services,@objectstack/spec" —— 该 PR 改的是packages/services/service-automation,本该报成@objectstack/service-automation。报出目录名,就是这个 bug 的直接证据。两个后果,漏报是严重的那个
packages/services/没有package.json,所以:1. npm 名那条匹配臂整个失效。 匹配逻辑是:
name为 null,就只剩路径 tokenpackages/services可匹配。任何只提@objectstack/service-automation、不提该路径的文档都会被漏掉。实测这个漏报确实存在 —— 3 篇:
第一篇是和 wait 节点改动最相关的那一篇。#4161 里它们之所以出现在清单上,纯粹是因为该 PR 同时改了
packages/spec、被@objectstack/spec捞到了。一个只改service-automation的 PR 会一篇都不报。这个方向正是工具自己声明要避免的:README 和 #4091 的 changeset 都写着 "over-inclusion is preferred over misses"。
2. 顺带的噪声。 路径 token
packages/services会匹配任何提到该目录下任意路径的文档,所以一个service-automation的改动会连带捞出 audit / settings / storage 等服务的文档。这个方向无害(过度包含是设计选择),但归因是错的 ——_(via packages/services)_没告诉读者是哪个包。修法
不要硬编码那 7 个目录名。 那本身就是 #3786 排查的「手抄清单 + 保持同步」形状 —— 新增一个容器目录时它会再次静默失效。应当从文件系统推导:取变更文件路径上最深的、含
package.json的祖先目录。这样plugins的特判也一并消失,而不是再加 6 条。顺带一提,#4091 给这个脚本加的
--self-test覆盖不到这条路径 —— 它只钉了isTestFile匹配器。守卫自身的守卫有个自己的洞。修的时候应把包根推导也纳入自检,至少含:直接子包(packages/spec)、每类嵌套包(packages/services/x、packages/plugins/y)、以及一个「容器目录本身绝不该成为包根」的断言。未包含
@objectstack/spec在 #4161 上匹配 108 篇文档 —— 那是设计如此的过度包含(spec 几乎在每篇文档里都被提到),不是 bug,本 issue 不涉及。相关
--self-test;本 bug 与那次改动无关,是更早就存在的