fix(spec): docs-gen 按 JSDoc 原有行布局渲染模块描述,并让裸路径改写跳过已成型链接 (#5553, #6136) - #6224
Conversation
#5553:渲染器丢掉全部空行、把剩下的每一源码行当成一个段落用 `\n\n` 连接, 任何跨行的 markdown 构造都被段落边界切断 —— 行内代码跨度不能跨空行,两边反引号 因此当字面量渲染。同一段还对全文无差别转义花括号,包括代码内部,而代码里反斜杠 不是转义符而是读者看得见的字符。改法是不再重写布局:去掉 ` * ` 边栏后保持原样, 段落切分交还给 markdown 自身;转义与链接解析收窄到正文,围栏/缩进代码块原样保留, 正文内由 tokenizer 把行内代码跨度挡在外面。 #6136:无标题 `{@link 路径}` 产出 `[路径](路由)`,链接文本就是那条路径;紧随其后的 裸路径改写器在整串上再跑一次,又把它包了一层。前后瞻表达不了「不在链接内部」, 故改为按 token 施加、排除已成型链接。 #6134 的取块规则一字未动:185 个带模块头的源文件仍全部渲染出描述,无一页增删。
保持源码行布局后,`data/date-macros`、`data/context-tokens` 里作者手写的
4 空格代码块被原样输出,而 MDX 为了让缩进用于排布 JSX,取消了 CommonMark 的
缩进代码块:这两页的花括号因此以正文身份进入编译器,`pnpm build` 报
"Could not parse expression with acorn"。改为重新输出成围栏代码块 —— 目标方言
里代码块只有这一种拼法。反过来若改成转义,读者会在本该是代码的地方看到 `\{`,
正是 #5553 要修的那条。
新增两条语料 pin:任何 MDX 会解析的位置都不得留下未转义花括号;渲染结果中
不得出现缩进代码块。二者任一都能挡住这次回归。
纯生成物。data/date-macros、data/context-tokens 的占位符示例由缩进块变为 围栏块,花括号不再转义。全量 216 张参考页均通过 @mdx-js/mdx 编译。
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckNo hand-written docs reference the 0 changed package(s). ✅ |
|
PM 验收:ACCEPT(内容),但暂不 ready —— 卡在一条排序约束上,理由见下。 内容验收依据取自 GitHub 侧读数:
⏸ 为什么现在不 ready#6211(#5340,长枚举省略)已在合并队列中,且同样重生成 所以按 #4675 的四步重建走,等 #6211 落 main 后再放行:merge main → checkout 生成物 → 先提交 merge → 整体重生成。届时我会唤回本单的 dev 补这一轮,CI 重跑后再 ready。 三项做得对、我希望成为本车道常规的
另外两件必须点名的:第一版实现本地全绿但打破 docs 构建(MDX 取消了 CommonMark 缩进代码块),是靠全量 MDX 编译语料抓住的,并补了 2 条本该先有的语料 pin;邻居门 范围合规:未触碰 范围外发现 #6229(裸 Generated by Claude Code |
生成物 `content/docs/references/**` 一律取 origin/main 版本(#4675 第二步: 生成树用 checkout 定向取一侧,不手工解冲突),使本合并提交成为确定性基线 —— 两侧各自从不同源码状态生成过,文本自动合并虽无冲突,得到的却是「陈旧组合」。 主线带入 #6211(#5340,内联长枚举省略,落点 `lib/format-type.ts`); 本分支落点 `lib/file-description.ts`,两者互不重叠。 注:本提交刻意以 `--no-verify` 落下 —— os-regen 钩子(正确地)指出生成物相对 源码已陈旧。#4675 要求合并与重跑分成两个提交以便分别 review,故此处保留陈旧 状态,由紧随其后的提交整体重跑 `gen:schema && gen:docs` 修正。PR head 上的 CI 校验的是最终树,不是这个中间提交。
纯生成物,由 `pnpm --filter @objectstack/spec build && … gen:docs` 在合并后的 源码树上整体产出(#4675 第四步),而非把两侧各自的生成物文本拼接。 与 #6211(#5340 内联长枚举省略)同树共存已核实: - 省略标记 `… +N more` 全语料 160 处,与 origin/main 完全一致(160)。 - 两者受影响页面交集 33 张,逐页复核 description 区(本 PR)与 type 单元格 (#6211)各自的效果同时在位。例如 integration/connector.mdx 第 68 行「另见」 为单个可点链接(#6136),同页 3 处 `… +N more`(#6211);security/explain.mdx 开篇跨行行内代码跨度完整(#5553),同页 4 处省略标记。 - 验收复跑:`[../[` 归零;按段落计未配对反引号归零;代码跨度内 `\{` 残留归零。 - 全量 216 张参考页经 @mdx-js/mdx 编译通过。 - 无页面新增或丢失开篇描述。
|
PM 验收:ACCEPT(重建轮通过) — 已 ready + auto-merge。 CI 复核(head 扣住这个 PR 是对的,而证据比我预期的更硬我此前的判断是「两棵生成树会合得干净却落地陈旧组合」。实测:merge 零冲突。也就是说,如果当时放行入队,它会一路绿灯合进去。 更有力的是独立的第二个信源: 我要求的那一格:两个改动同时存活,已验
|
PR #6224(#5553 / #6136)改了 build-docs 的模块描述行布局与裸路径链接改写, 并重写了全部参考页。本分支是后落地方,故按四步走:merge main → 重建 → check:generated 判定 → --fix 只重生成被证实陈旧的一项。 落点仍是本 sweep 的两张页(os-regen 合并驱动把它们记进 os-regen-pending): shared/expression.mdx 与 api/endpoint.mdx。新渲染器收掉了行间空行,方言表 因此首次渲染成一张真正的 markdown 表,而不是被空行拆散的六行。 内容核对:方言表 = cel / cron / template(无 js);endpoint 的 type / target / ApiMapping.transform 三行描述完整存活。 Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
Fixes #5553
Fixes #6136
两单同落
packages/spec/scripts/lib/file-description.ts(#5059/PR #6134 今日新建),同一条渲染链上的两条互不相干的缺陷,合并为一个 PR —— 分开派会各付一次content/docs/references/**重生成并互埋 diff。前提复核(先于实现,对 current origin/main)
两单正文都早于 #6134 的抽取,代码形状已移位,故逐条复核:
{@link ../x.zod.ts}被渲染成「链接套链接」—— 2 张已发布参考页正文里能直接看到 #6136 —— 完全成立。grep -rn '\[\.\./\[' content/docs/references/在 main 上仍返回automation/etl.mdx:54与integration/connector.mdx:102,两条正文与 issue 引用逐字一致。\{转义痕迹 #5553 —— 成立,但受害面从 5 页缩到 4 页。 按行段落切分与无差别花括号转义两处代码原封不动仍在。issue 点名的 5 张页面里,system/doc已不在其中:fix(spec): 参考页开篇只认「不属于任何符号」的模块级 doc block (#5059) #6134 的取块规则发现该文件的 header 紧跟export const DocSchema(即它记录的是那个符号),已停止发布 —— 属于前提在派发前自然消解,不是本 PR 的功劳。其余 4 张(automation/flow-function、security/explain、shared/expression、system/settings-client)按段落计的未配对反引号 8 处,复现无误。⛔ #6134 的取块规则一字未动:185 个带模块头的源文件修改前后都渲染出描述,无一页新增或丢失开篇描述(#6134 的验收标准,已作为语料 pin 固化)。
改法
两条缺陷根因同形:变换施加的粒度错了。
#5553。 渲染器丢掉全部空行、把剩下的每一源码行用
\n\n连接 —— 即宣布每一源码行自成一段。任何合法跨行的构造都被段落边界切断,而行内代码跨度不能跨空行,两边反引号因此当字面量渲染。同一段还对全文无差别转义花括号(含代码内部,那里反斜杠不是转义符而是读者看得见的字符)。改法是不再重写布局:去掉
*边栏后保持原样,段落切分交还 markdown 自身。issue 提的「连续非空行用空格连接」在语义上正是 markdown 的软换行规则,但字面照做会摧毁列表 —— 185 个带描述的源文件里 85 个写了列表。转义与链接解析收窄到正文:围栏/缩进代码块原样保留,正文内由 tokenizer 把行内代码跨度挡在外面。#6136。 无标题
{@link 路径}会产出一条 markdown 链接,而它的链接文本恰好就是那条路径本身;紧随其后的裸路径改写器在整串上再跑一次,匹配到链接文本里的路径,又把它包了一层。前后瞻表达不了「不在链接内部」,故改为按 token 施加、排除已成型链接。裸路径正则本身一字未改,修复完全来自 tokenize —— 括号内路径等既有渲染因此零附带变化。一处刻意不照抄源码布局:缩进(4 空格)代码块改用围栏输出。 MDX 为了让缩进用于排布 JSX,取消了 CommonMark 的缩进代码块,所以这种块会以正文身份进入编译器。
data/date-macros、data/context-tokens的占位符示例正是这样写的且几乎全是花括号 —— 保持缩进则Could not parse expression with acorn编译失败(第一版实现实测踩到,由全量 MDX 编译检查逮住);改成转义则读者在本该是代码的地方看到\{,正是 #5553 要修的那条。目标方言里代码块只有围栏一种拼法。反向验证(先定方向,再逐条恢复;红集必须不相交)
{@link}pin + 语料「链接套链接」(A∪B) ∩ C = ∅ —— 这就是「两条独立缺陷、不是一条」的证据,与 #6136 立单者在 #5059 报告里的论断一致。
一处预测落空,如实记录:我预测 A 会让「连续
@see保持独立块」变红,实际为绿 —— 把每行切成独立段落恰好也把那几行分开了,是巧合而非该 pin 失效。受影响的参考页(169 张)与归属
#6136 —— 2 张,各一行「另见」由「链接套链接」恢复为单个可点链接:
automation/etl.mdx:54→See also: [../integration/connector.zod.ts](/docs/references/integration/connector) for the Enterprise Connector layerintegration/connector.mdx:102→See also: [../automation/etl.zod.ts](/docs/references/automation/etl) for the ETL Pipeline layer (data engineering)#5553 —— 全部 169 张(上面 2 张同时含 #5553 改动)。按变化种类计:
automation/flow-function、security/explain、shared/expression、system/settings-client—— 每张 2 处→0。\{反斜杠残留清零(33 张):全语料 296 → 0;正文中合法转义的 28 处保留不动。@example样例此前被拆成每行一段并逐行转义,现为真正的代码块。data/date-macros、data/context-tokens。169 张页面完整清单(按 category)
顺带修好的邻居门(必须,不是顺手)
scripts/escape-mdx.test.ts的 #5452 语料门断言「行内代码跨度里花括号必须配平」,但按行提取跨度 —— 这只在模块 JSDoc 把每行当独立段落时才碰巧成立。本 PR 恢复行布局后跨度可以跨行,该门只看到开头半截,把正常跨行的跨度读成不配平并变红。改为按段落提取(空行仍是硬边界,因为代码跨度不能跨空行),并先把围栏块置空。#5452 自身的缺陷形态(同一行内被切成半对)报告方式不变,已用合成样例复核仍会报出。验证
pnpm --filter @objectstack/spec test—— 330 files / 8435 tests 全绿(pin 由 14 条扩到 28 条 + 2 条新语料门)。pnpm --filter @objectstack/spec typecheck—— 绿。check:docs232 files in sync ✅ /check:generated10 artifacts up to date ✅ /check:api-surfaceunchanged ✅。eslint三个改动文件 —— 绿;check:nul-bytes、check:doc-authoring、check:empty-changeset—— 绿。@mdx-js/mdx编译通过(216/216);已核对 origin/main 同样为绿,故这是「未引入回归」而非「修好了原有失败」。范围
content/docs/references/**重生成独立成 commit。未触碰build-docs.ts(#5853 下轮)、lib/format-type.ts(#5340)、lib/zod-graph.ts、build-schemas.ts(#5371)、任何*.zod.ts源码、content/docs/releases/。已加 changeset(@objectstack/spec: patch),与两个同类邻居 PR(#5550、#6134)一致。纯展示层,无运行时/协议/导出面语义变化。