Uh oh!
There was an error while loading. Please reload this page.
fix(docs,scripts): 清掉 9 条包 README 死链,并让链接门禁认站内绝对 URL (#3603) - #3629
Merged
Conversation
内容半件:9 条 `/docs/packages/*` 等死链逐条查证后处置 —— 6 条查无对应 文档页(auth / collaboration / i18n / mobile / permissions / providers) 删掉该行,3 条改指真实页(react → /docs/core/schema-renderer, vscode-extension 的 Schema Reference → /docs/api/schema-reference、 Component Library → /docs/components)。 门禁半件第 2 层:`judgeHref()` 此前对任何带 scheme 的 href 直接放行, 所以写成本站绝对 URL 的路由从不校验,而同一条路由写成 `/docs/...` 则严格 校验。现在剥掉 origin 后交给同一个 `routeExists()`,`/docs` 的严格性与 `apps/site` 路由表原样继承。这是通用修复而非包 README 特判:`content/docs` 自己就写了 6 条这种 URL。落地前实测 11 条、零死链。 门禁半件第 1 层(SCAN_ROOTS 追加包 README)**未做**,理由见 #3622: 先量后付的仓规下,实测那一行会额外红 11 条,分布在本单从未触及的 5 个包。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
The latest updates on your projects. Learn more about Vercel for GitHub. |
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
marked this pull request as ready for review
August 7, 2026 16:28
This was referenced Aug 7, 2026
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 7, 2026
akarma-synetal pushed a commit
to akarma-synetal/objectui
that referenced
this pull request
Aug 10, 2026
… 条死链 (objectstack-ai#3622) (objectstack-ai#3649) * feat(scripts): check-doc-links 扫描面第四扩 packages/*/README.md,并付清入场价的 11 条死链 (objectstack-ai#3622) 先量后付的第四次:红账先清零,再加扫描行,门禁首跑对真仓即绿。 11 条死链逐条查证后处置(全部改指实测存在的真实页,零删除): - 三条 /api/PKG(components/core/react)——站点从来没有这个路由段 (apps/site/app/api 下只有 search/route.ts)。components 改指 /docs/components(Component Gallery,objectstack-ai#3629 给 vscode-extension 用过 的同一页),core 改指 /docs/api(站点自称的 API Reference 总页), react 改指 /docs/core/schema-renderer(它主导出的参考页)。 - 四条指向 content/docs 下无 index 页的目录(core/fields/layout x2)—— fumadocs 不为裸目录生成路由,objectstack-ai#3603 正文的复核脚本把裸目录也算作候选 才误判为绿。core 改指 /docs/guide/architecture(Package Structure 一节 逐包说明 @object-ui/core),fields 改指 /docs/guide/fields(Field Registry, 正是该包的文档),layout 的 API Reference 改指 /docs/layout/app-shell、 Links 改指 /docs/guide/layout。 - /docs/types 完全不存在 → 改指 /docs/api/schema-reference,该页开头写着 「All types are available from @object-ui/types」。 - /examples 不是站点路由(objectstack-ai#3490 已确认)→ 改指 github.com/objectstack-ai/objectui/tree/main/examples,与 content/docs/utilities/vscode-extension.mdx 里同一条链接的写法一致。 - 两条磁盘路径:docs/SHADCN_SYNC.md 从未存在,真正的完整指南是同包的 README_SHADCN_SYNC.md(278 行);vscode-extension 没有 LICENSE 文件 (39 个包里 4 个没有),按该 README 已有的仓根文件写法改指 blob/main/LICENSE。 扫描行沿用 disk 规则:包 README 在 npm 与 GitHub 上被阅读,相对链接是 磁盘路径语义,与 examples/README/CONTRIBUTING/ROADMAP/docs 同类,无需新 规则类。同一条理由也决定了上面修好的站内链接必须保留 origin——GitHub 与 npm 都把开头的 / 解析到它们自己的域名。 该行是表里唯一带通配符的一条,故 collectFiles 增加 expandWildcard():只 认整段的 *,再复杂的写法直接抛错而不是静默匹配零个路径——扫描面被悄悄 丢掉是这个门禁唯一不能有的失效模式。 测试:SCAN_ROOTS 的 toEqual 与逐根 count 扩写;新根另加「可判定 href 数」 下限(200 条,其中 47 条站内绝对 URL),因为文件数只能证明通配符展开了, 证明不了这批文件里有东西可判;新增 7 条用例覆盖四种死链形状、通配符展开、 只收 README 的边界、packages/node_modules 排除、disk 与 docs 规则的对照对, 以及非整段通配符抛错。 逆向验证(方向先定后跑):植入两条死链(相对磁盘路径 + 站内绝对 URL 各一) → 门禁红,正是那 2 条;仅撤掉扫描行、死链留在原地 → 绿,证明是该行在干活; 还原后 7 根全绿。测试层同样验证:撤行后恰好 7 条用例红,唯二直接调 collectFiles 的两条保持绿——与预测一致。 不加 changeset:改的是包 README 的链接与 CI 脚本,不触发任何包的版本 发布,与 objectstack-ai#3589/objectstack-ai#3629 仓例一致。 Fixesobjectstack-ai#3622Fixesobjectstack-ai#3603 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt * docs(scripts): 头注释里 11 条的处置措辞改准 — 全部改指,一条没删 原句写成「Each was resolved to a real page, or dropped where none exists」, 但本次 11 条逐条都找到了实测存在的对位页面,零删除。措辞改准,并点明与 objectstack-ai#3603 那 9 条的差别:那 6 条删掉是因为它们假设了一整个从未写过的 /docs/packages/... 命名空间,本单这 11 条各自都有真实归属。 顺带把「七个包,其中五个 objectstack-ai#3603 从未打开」一句的中英夹缠语序理顺。纯注释, 零行为改动。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit
to akarma-synetal/objectui
that referenced
this pull request
Aug 10, 2026
…ai#3587) (objectstack-ai#3648) (objectstack-ai#3656) 两处注释称 lychee 是「weekly cron with continue-on-error」,结论「gates nothing」对,机制反了:check-links.yml 里没有任何 continue-on-error,第 77 行 是 fail: true,`on:` 只有 workflow_dispatch + schedule('17 4 * * 0'),push 与 pull_request 被注释掉并附 ⛔ Do NOT enable(objectstack-ai#3213 ruling B)。按错误理由行事的 人会去摘一行不存在的 continue-on-error,而真实风险相反 —— 取消注释 pull_request: 会让它立刻变成走网络的硬门禁。 改成同一文件 :194 起已有的正确表述(objectstack-ai#3589 头注释措辞):schedule + workflow_dispatch、无 PR 触发器,所以它谁也拦不住。 同时删掉 judgeHref() 里被逐字复制两遍的那 4 行注释(objectstack-ai#3629 合并时的重复粘贴)。 纯注释改动,零行为变化;test 那处只改说明文字,断言未动。scripts/ 非发布包且 无用户可见变化,故无 changeset。 Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes-part-of #3603
分段交付。内容半件全交;门禁半件只交第 2 层(
judgeHref解析站内绝对 URL),第 1 层(SCAN_ROOTS追加包 README)按实测结论回队列,单独开在 #3622 —— 理由在第四节,是本 PR 最需要复核的判断。PM 裁决要求的前置实测已做:
git log origin/main确认 #3589 已落 main(6632114bc,SCAN_ROOTS打印 6 roots),worktree 基线即含它,门禁半件不与任何在途 PR 同文件。一、内容半件:9 条逐条处置
按 fumadocs 候选拼写(
x.mdx/x.md/x/index.mdx/x/index.md)在content/docs下逐个查证。查不到对应文档页的删该行(指向不存在的页面比不给链接更糟,分诊已确认此 fallback);查到的改指真实页。packages/auth/README.md:223/docs/packages/auth@object-ui/auth的文档页;AuthProvider/AuthGuard在content/docs零命中。blocks/authentication.mdx是「Authentication Blocks」登录表单 block 图库,与本包(Provider、守卫、token)不是一个主题,指过去会误导packages/collaboration/README.md:132/docs/packages/collaborationLiveCursors/PresenceAvatars零命中packages/i18n/README.md:152/docs/packages/i18nuseObjectTranslation仅在guide/public-forms.md顺带出现,I18nProvider仅在 architecture-overview / troubleshooting 顺带出现,都不是 i18n 的文档页packages/mobile/README.md:143/docs/packages/mobileuseBreakpoint/MobileProvider零命中packages/permissions/README.md:137/docs/packages/permissionsPermissionGuard/usePermissions零命中packages/providers/README.md:82/docs/packages/providerspackages/react/README.md:243/docs/packages/react/docs/core/schema-renderercontent/docs/core/一带」,查证属实:core/schema-renderer.mdx标题 "SchemaRenderer"、描述 "Core component for rendering JSON schemas into React components",正是本包 README 开篇自述的头号导出packages/vscode-extension/README.md:188/docs/protocol/overview/docs/api/schema-referenceapi/schema-reference.md标题正是 "Schema Type Reference"packages/vscode-extension/README.md:189/docs/api/components/docs/componentscomponents/index.md标题正是 "Component Gallery"(packages/components/README.md早已用这条路由)6 删 3 改。删掉的那 6 行所在的
## Links尾块保留其余 5 条(npm / Changelog / Issues / Contributing / Roadmap),README 正文本身就是这些包当前的文档。复核脚本(issue 正文同款,改为对工作树跑)输出:
dead links: 0。二、门禁半件第 2 层:站内绝对 URL 解回站内路由
judgeHref()此前对任何带 scheme 的 href 直接return null,唯一例外是SELF_REPO_BLOB_RE。于是https://www.objectui.org/docs/guide/plugins从不校验,而同一条路由写成/docs/guide/plugins则严格校验 —— 两者只差一个 origin,而 origin 恰恰是这个脚本唯一能确定的部分。实现是通用的,不特判包 README:剥掉 origin,把剩下的绝对站内路径原样交给同一个
routeExists()。因此两个分支都原样继承 ——/docs的严格性(.../docs/guide/foo.md被拒的理由与/docs/guide/foo.md完全相同)与apps/site路由表(/examples无路由则拒)。这一点在测试里是两条INHERITS ...断言,实现若改成"另起一套判断"它们会红。两种 host 拼写都认(本仓
www.objectui.org与裸objectui.org都在用);正则两端锚定,objectui.org.example.com这种仿冒 host 不会误借本仓路由表(有专门一条测试)。落地前实测:全部扫描面共 11 条站内绝对 URL,零死链 —— 与 #3589 同形状(门禁到货即绿),对照 #3479(16 个死目标)/ #3490(18 个)那种「门禁与欠账同时到货」。其中 6 条就在
content/docs自己,这正是分诊说的「这一层对所有扫描面都成立」—— 不是包 README 专属问题。反空绿
本次没有新增扫描根,所以既有的仓库级 "has no broken internal links" 断言即使解析层完全不干活也照样绿。为此新增一条计数下限:实测 11 条(其中
content/docs贡献 6 条、带/docs路径 3 条)必须真的被siteAbsoluteRoute()认出来,否则上面那条绿毫无意义。这是本 PR 最重要的一条测试。新增/改写:8 条新 case,既有
labels all seven checks distinctly扩成 eight、HINTS 键表扩成 8 键。三、逆向验证(方向先定,后跑)
预测方向为常规方向(改前绿 / 改后红),理由:这是对一个此前被
EXTERNAL_HREF_RE无条件跳过的形状新增的检查 —— 既不存在 canonical-first 的??链(故不属 inverted 家族),新判定喂的也是谓词而非计数(故不属「诊断变多」家族)。content/docs/index.md与根README.md各植入一条死的站内绝对 URL,解析层在site-absolute-url,两个面各一条Found 2 broken links——[site-absolute-url] content/docs/index.md:89+[site-absolute-url] README.md:518,hint 正常打印judgeHref里的解析分支Links are valid across 6 scan roots.exit=0 —— 两条死链被静默放行,正是改前行为Links are valid across 6 scan roots.,git status干净四、⚠️ 门禁半件第 1 层没有做 —— 请优先复核这一节
PM 的预测是「内容半件清干净后,门禁首跑对真仓应为绿」。这个预测对第 2 层成立,对第 1 层被实测证伪,所以我停在文件面边界上,没有硬凑。
在 9 条已清干净之后,把
disk规则的包 README 扫描根加上去,仍会红 11 条,分布在本单文件面之外的 5 个包(components / core / fields / layout / types),外加 react、vscode-extension 各一条不同的行:/api/core、/api/react、/api/components(无此路由)、/docs/core、/docs/fields、/docs/layout(真目录但无 index 页,故无路由)、/docs/types、/examples(均不存在),以及两条磁盘路径../../docs/SHADCN_SYNC.md、./LICENSE(文件不在)。其中
/docs/core、/docs/fields、/docs/layout值得单独点名:issue 正文的复核脚本把它们判成了绿,因为那段脚本把裸目录也算作 fumadocs 候选(候选数组的最后一项rel)。门禁不这么算,而且它是对的 ——routeCandidates()只有四种拼写,既有 pin 测试rejects a relative link to a directory that has no index page就是这条规则。实测content/docs/下core/fields/layout/rfcs确实没有 index 页。所以这一类的真实规模是 20 条,不是 9 条。按本文件头注释自 #3572 起写死的规矩 ——「先量扫描面,单独付清红账,再加那一行」—— 红账应单独付,故第 1 层连同它的 11 条欠账开在 #3622(已挂为 #3603 的子 issue,自动进派发池)。头注释里新增了一节 "Measured and NOT bought",把这个测量结果和 issue 编号写死,避免下一个人不量就加行、撞上一片意外的红。
文件面偏差(1 个文件,主动声明)
content/docs/guide/ci-cd-pipeline.md不在派发单列出的文件面里,但本 PR 改了它:该页用一张表逐条描述这个门禁判定哪些 href 形状,原文写「Four checks, by href shape」,我的改动使其变成事实错误。#3589 改同一处行为时也同步改了这个文件(它是那次 diff 的三个文件之一),AGENTS.md 准则 #2「docs 不反映代码就不算完成」也指向同一结论。改动限于新增跨扫描面两形状的说明表 + 一处覆盖面描述,未动其它内容;已确认无在途 PR 触碰该文件。若判定越界,可要求我拆出。五、验证
消费半径清点:
check-doc-links的消费方为docs-links.yml/ci.yml/check-links.yml、CONTRIBUTING.md、content/docs/guide/ci-cd-pipeline.md、lychee.toml与 3 个测试文件,全部跑过或核对过。CONTRIBUTING.md明确写着「read them there instead of trusting a list copied into prose」,无需同步。changeset:不加,与仓例一致 —— #3602(纯 README 死链修复)与 #3589(纯门禁脚本 + 测试)都没有 changeset。
Generated by Claude Code