
Plate 项目 Lexical 测试收割用可移植测试索引驱动 Slate v2 行为移植【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate导读本文讲解 plate 仓库中docs/editor-test-harvester/lexical/这套测试收割test harvest工作流的核心索引——test-index.md它以文件级分类category、行为家族family与落地目标target三要素把上游 Lexical 仓库中 137 个可移植测试文件、1996 个test/describe/it行为指针组织成一张可检索、可审计的移植地图。读完本文你将掌握这份索引的结构与行指针语义、它与全量清单inventory.md和处理台账slate-processing-ledger.md如何协同以及如何在本仓库中用它定位哪些上游行为值得移植、哪些应拒绝、哪些归 Plate 所有为 Slate v2 的测试基建做 source-read 与 apply 决策。一、收割工作流的整体布局三份文档如何分工在 docs/editor-test-harvester/lexical 目录下共有三份相互引用的文档构成一条完整流水线文档作用与 test-index.md 的关系inventory.md全量清单用一条rg命令枚举上游 Lexical 仓库所有测试文件并逐一分类是索引的上游只有被标记为portable或portable-mixed的 runnable 文件才会进入索引test-index.md可移植测试名称索引为每个可移植文件提取全部test/describe/it行给出文件:行号指针本文主体inventory.md明确声明portable 与 portable-mixed 的可运行行已收录进 test-name indexslate-processing-ledger.md处理台账为每个索引文件给出already-applied/covered/defer/plate-owned/reject等最终裁决是索引的消费端用索引的行指针做 source-read再回填裁决索引头部自带 provenance 元数据source report: ./report.md报告文件不在本仓库内属于上游生成物、target: ../lexical指向被收割的上游 Lexical 源码树同样不在 plate 仓库内、generated_at: 2026-05-08、last_consolidated_at: 2026-05-09。头部还记录了合并校验结果可运行可移植文件数仍为 137、提取行数仍为 1996无缺失或过期索引文件——这保证了索引与上游源码的同步性可被持续复核。二、索引规模与质量底线137 个文件、1996 个行为指针test-index.md在头部给出三个关键统计这是评估移植工作量的第一手数据Indexed runnable portable and portable-mixed files: 137. Extracted test/describe/it lines: 1996. Files with zero extracted names: 0.解读137 个文件全部是inventory.md中判定为portable124 个或portable-mixed13 个的可运行文件。product-shell33、harness12、skip89三类被排除在索引之外。1996 行指针每个指针形如路径:行号describe/test/it: 标题粒度到单个测试用例。0 个空文件不存在有文件但未提取到任何测试名的漏网之鱼索引完整性有硬性校验。此外头部特别说明了一个提取器细节提取器按行指针记录 literal字面量、dynamic动态模板和 multiline多行标题。dynamic 行如test: testing ${scenario[2]}: ...仍需在 apply 前阅读本地源码以还原真实语义但它们不再被仅按文件名路由的方式隐藏——也就是说索引保证了每条动态标题至少有一个可追溯的锚点文件:行号读者可以回到源码展开模板变量。索引中大量dynamic or multiline title占位即属于此类例如AutoLinks.spec.mjs:33、Composition.spec.mjs:176、LexicalMarkdown.test.ts:818。三、文件条目的三要素元数据category / family / target每个文件条目在测试清单之前固定给出三行元数据这是本索引最有操作价值的部分。以第一个条目为例## ../lexical/packages/lexical-code-shiki/src/__tests__/unit/LexicalCodeNodeTabs.test.ts category: portable family: core package behavior target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transportcategory移植可行性等级索引中实际出现的取值有portable与portable-mixed两种这也是它叫Portable Test-Name Index的原因portable文件中的行为可在纯模型层验证优先落入 Slate v2 的packages/slate/test属于直接可移植portable-mixed文件是产品/插件 e2e 或混合场景但其中包含可分离的便携不变量invariant。例如AutoLinks.spec.mjs、Autocomplete.spec.mjs、CharacterLimit.spec.mjs等被标为portable-mixed其 target 通常是packages/slate/test仅当行为依赖 DOM/运行时传输时才补充浏览器证明。注意portable-mixed不等于拒绝。台账里对混合文件的做法是从产品文件中拆分出原始不变量split a raw invariant out of a product file。family行为家族family把 137 个文件归并到少量语义桶便于按主题批量检索。结合 inventory.md 的完整行表可以归纳出以下家族及其在索引中的分布family代表文件说明core package behaviorLexicalCodeNode.test.ts、LexicalHistory.test.tsx、LexicalHtml.test.ts、LexicalHeadingNode.test.ts、LexicalQuoteNode.test.ts、lexical-list/src/__tests__/unit/utils.test.ts核心包/编辑器单元行为多数 target 指向packages/slate/testserialization-parsing / marks-inlineLexicalListItemNode.test.ts、LexicalListNode.test.ts、formatList.test.ts、LexicalMarkdown.test.ts、CodeBlock.spec.mjs、TextFormatting.spec.mjs、ClearFormatting.spec.mjs、ElementFormat.spec.mjs、Headings*.spec.mjs、Indentation.spec.mjs、List.spec.mjs、Markdown.spec.mjs序列化/解析/富文本格式通常同时指向slate/test、slate-history/test与 playwrightrichtext.test.tsclipboard-paste / browser-engineHTMLCopyAndPaste.spec.mjs、ImageHTMLCopyAndPaste.spec.mjs、LinksHTMLCopyAndPaste.spec.mjs、ListsHTMLCopyAndPaste.spec.mjs、TablesHTMLCopyAndPaste.spec.mjs、TextFormatHTMLCopyAndPaste.spec.mjs、ContextMenuCopyAndPaste.spec.mjs、CopyAndPaste.spec.mjs、ListsCopyAndPaste.spec.mjs、Extensions.spec.mjs、LexicalTabNode.test.ts*、HTMLCopyAndPaste.test.ts剪贴板与粘贴target 指向slate/test/clipboard-contract.ts、slate-dom/test/clipboard-boundary.test.ts、playwrightpaste-html.test.tsselection-dom-mapping / void-atomAutoLinks.spec.mjs、Hashtags.spec.mjs、HorizontalRule.spec.mjs、Keywords.spec.mjs、Links.spec.mjs、Mentions.spec.mjs、Navigation.spec.mjs、Selection.spec.mjs、LexicalSelection.test.*、LexicalCaret.test.ts选择/DOM 映射与 void/原子节点target 增加slate-react/test/editable-behavior.test.tsxbeforeinput-input / browser-engineAutoScroll.spec.mjs、Events.spec.mjs、Focus.spec.mjs、Keyboard.spec.mjs、KeyboardShortcuts.spec.mjs、Mutations.spec.mjs、TextEntry.spec.mjs输入运行时target 指向slate-react/test/model-input-strategy-contract.test.ts与 playwright stressime-composition / history-undo-redoComposition.spec.mjs、regression/8153-safari-ime-delete-selection.spec.mjsIME 合成与撤销栈target 增加slate-browser/src/playwright/ime.ts与slate-history/testcollaboration-remote / history-undo-redoCollaboration.spec.mjs协作target 为slate/test/collab-history-runtime-contract.ts 未来 slate-yjs 浏览器车道tables-grid / selection-dom-mappingTables.spec.mjs、LexicalTableCellNode.test.ts、LexicalTableNode.test.tsx、LexicalTableSelection.test.tsx、LexicalTableUtils.test.ts等表格target 指向 playwrighttables.test.ts与slate/test/transforms/insertFragmentportable editor behaviorDraggableBlock.spec.mjs、Images.spec.mjs、Placeholder.spec.mjs、Tab.spec.mjs、绝大多数regression/*.spec.mjs通用便携编辑行为多数仅指向packages/slate/testmixed portable invariantAutocomplete.spec.mjs、CharacterLimit.spec.mjs、ColumnLayoutBackspaceAtEnd.spec.mjs、DateTime.spec.mjs、Emoticons.spec.mjs、EquationNode.spec.mjs、MaxLength.spec.mjs、SpecialTexts.spec.mjs、Toolbar.spec.mjs混合便携不变量target 为packages/slate/test 按需浏览器证明target落地坐标target明确给出这份文件的行为应该移植到哪里。它反复出现的几种坐标在 slate-processing-ledger.md 的Current Slate Owners一节有完整定义Slate 所有者路径核心模型与查询不变量.tmp/slate-v2/packages/slate/test剪贴板模型/DOM 契约.tmp/slate-v2/packages/slate/test/clipboard-contract.ts、.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts文本单元.tmp/slate-v2/packages/slate/test/text-units-contract.ts输入运行时策略.tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.tsDOM 修复策略.tmp/slate-v2/packages/slate-react/test/dom-repair-policy-contract.ts浏览器压力行.tmp/slate-v2/playwright/stress/generated-editing.test.ts粘贴 HTML 浏览器语料.tmp/slate-v2/playwright/integration/examples/paste-html.test.ts富文本浏览器行为.tmp/slate-v2/playwright/integration/examples/richtext.test.ts表格浏览器包含性.tmp/slate-v2/playwright/integration/examples/tables.test.ts协作/历史基座.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts、.tmp/slate-v2/packages/slate-history/test/history-contract.ts值得注意的规则默认优先落在模型层packages/slate/test只有当行为依赖 DOM/运行时传输时才补浏览器证明add focused browser proof only when behavior depends on DOM/runtime transport。这是整个收割策略的基石——先锁模型不变量再按需加浏览器行。四、行指针的语义与检索方式索引的每一行测试记录格式统一为- ../lexical/包/路径.test.ts:行号 describe/test/it: 标题三种前缀分别对应测试框架的三层结构describe测试分组如LexicalCodeNode tests、Tabs、Markdown、ListExtensiontest/it具体用例二者等价it是 BDD 风格别名索引同时保留两种原样拼写例如LexicalListItemNode.test.ts:1296的it: indents and outdents list item标题可能是 literal、dynamic含${...}模板或 multiline跨行。文件:行号指针是关键——它允许任何 Agent 或工程师通过search_in_files或直接read_file回到上游源码做source-read通读源码还原 dynamic 标题的真实参数矩阵。例如LexicalCodeNodeTabs.test.ts:96的testing ${scenario[2]}: ${scenario[0]} ${scenario[1]} (${direction})必须在源码中展开scenario数组才能知道它覆盖了哪些 Tab 缩进方向组合。五、按家族深入索引覆盖的行为全貌以下按家族给出索引中的代表性文件与其核心用例全部取自test-index.md的真实行指针行号即索引中记录的上游行号。5.1 核心包行为core package behavior代码块 TabLexicalCodeNodeTabs.test.tscode-shiki 47/49/96 行覆盖 describeLexicalCodeNode tests/Tabs与场景化 Tab 用例lexical-code包的同名文件结构相同。LexicalCodeNode.test.ts是索引中最长的核心文件之一覆盖构造、createDOM/updateDOM、exportJSONschema、insertNewAfter、$createCodeNode以及大量 Tab/缩进用例can tab with collapsed/non-collapsed selection179/215、单行/多行 indent/outdent239/279/319/357、code blocks can shift lines459/479、arrows与rtl code lines513/514下的MOVE_TO_END/MOVE_TO_START视觉移动537/559以及回归can be registered after initial editor state (regression #7014)1007。历史LexicalHistory.test.tsx覆盖after clearing、Redo after Quote Node、change, undo, redo, undo, change序列352、undoStack selection points to the same editor437、Changes to TextNode leaf are detected properly #6409481以及SharedHistoryExtension父编辑器创建541/542。HTML 序列化LexicalHtml.test.ts覆盖[Lexical - HTML]的具名用例42、Use provided selection64、Default selection (undefined) should serialize entire editor state111、段落对齐优先级186、DocumentFragment导出216。富文本节点LexicalHeadingNode.test.ts覆盖构造/DOM/insertNewAfter空/中/尾101/123/147、setTag173、h2 插入段落后219LexicalQuoteNode.test.ts覆盖 QuoteNode 全生命周期。工具lexical-list/src/__tests__/unit/utils.test.ts覆盖 1/2/5 层列表深度17/35/68、getTopListNode直接/非直接/深层嵌套113/144/176、isLastItemInList四种嵌套组合214/249/275/310。LexicalUtilsInsertNodeToNearestRoot.test.tsx与LexicalUtilsSplitNode.test.tsx覆盖最近根插入与 split 抛错。5.2 序列化、解析与标记serialization-parsing / marks-inline列表LexicalListItemNode.test.ts是索引中行数最密集的文件之一覆盖构造/DOM、replace()首/中/尾/唯一项239/294/323/354、remove()的兄弟嵌套矩阵401/469/549/629/718/828/939、insertNewAfter()非空列表项1063-1204、setIndent()与小数缩进1296/1356、列表分割编号重置/保留1415/1455。LexicalListNode.test.ts覆盖append()/splice()包装转换214-308、checklist 转 bullet341、嵌套清理367、子类化$config462。列表格式化formatList.test.ts覆盖insertList的空/有子 root 选择84/106、shadow root 选择131、$handleListInsertParagraph空项退出/空白退出/非空白扩展/装饰器扩展/分割235-343、$handleIndent嵌套子表创建389、$handleOutdent嵌套移除424。MarkdownLexicalMarkdown.test.ts覆盖嵌套代码围栏往返1044/1080、动态围栏计算1117、list marker 记忆1146-1217、Enter 触发1246-1326、normalizeMarkdown的shouldMergeAdjacentLines两档1381/1507、硬换行导入1601/1641、空白保留默认模式1682-1747。MarkdownTransformers.test.ts覆盖 LINK 前置文本保留53/68、贪婪抑制90、链接内不建链接123。清除格式ClearFormatting.spec.mjs覆盖 BIU 清除39、链接/引文样式保留60、hashtag/mention 保留107、对齐与缩进清除188-252、跨段落清除279。代码块 e2eCodeBlock.spec.mjs覆盖 markdown 建块36、已有文本包裹108、多段/部分段落转换173/234、行内转换300、语言切换351、缩进保持423、Tab 行缩进515、多行 (un)indent603、optionarrow行移动924、边界选择防护1111、CMD/CtrlLeft/Right1267。标题/引用/格式 e2eHeadingsBackspaceAtStart.spec.mjs19、HeadingsEnterAtEnd.spec.mjs18、HeadingsEnterInMiddle.spec.mjs23分别锁定首标题 Backspace 无操作、末尾 Enter 变段落、中间 Enter 分裂ElementFormat.spec.mjs覆盖链接内缩进/对齐26与空段居中59Indentation.spec.mjs覆盖最大深度461-1007与负缩进回归1007List.spec.mjs覆盖 checklist 焦点选项79/120、嵌套列表、backspace 出缩进224/316、类型互转1446-1831、markdown 起始编号2270、空项 Enter 出表2318等Markdown.spec.mjs覆盖样式化 markdown 快捷输入219-333、undo/redo308、内嵌转换763-1055、list marker 保持1055/1069。文本格式TextFormatting.spec.mjs覆盖加粗/斜体快捷键39/93、选中加粗147、三连击不污染下段203、字号增减532-639、字体族660、多段选择格式化817、回归 #24391093、工具栏激活态1144、#25231182、多行忽略换行1240。5.3 剪贴板与粘贴clipboard-paste / browser-engine索引中有一整组CopyAndPaste语料HTML 语料CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs覆盖多行 HTML 额外换行25、带 BR 的代码块53、段落夹在水平线之间135、段落中间贴顶层元素199ImageHTMLCopyAndPaste.spec.mjs覆盖 figurefigcaption31、图片粘贴134、多图粘贴undo172LinksHTMLCopyAndPaste.spec.mjs覆盖 anchor 粘贴37、链接前/后粘贴99、局部内容选择粘贴130、空链接 #3193166、文本进链接/链接进文本/格式化文本进链接/链接进链接/多块进链接213-366ListsHTMLCopyAndPaste.spec.mjs覆盖列表元素24、Lexical 嵌套列表93、直接嵌套 ul129、li 混合内容217、checklist299、列表中段中间贴372、列表内嵌套 div425TablesHTMLCopyAndPaste.spec.mjs覆盖 Google Docs24/95、Quip161、Google Sheets233、Merge Grids306、嵌套块与行内 HTML434、合并单元格与不等行534、空行691TextFormatHTMLCopyAndPaste.spec.mjs覆盖 BIU20与 highlight70。Lexical 原生语料CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs29/56覆盖右键复制粘贴CopyAndPaste.spec.mjs覆盖基础复制35、标题复制222、段落进引用875、Google Docs/MS Word 字号905/933、剪切空选区保留剪贴板965ListsCopyAndPaste.spec.mjs覆盖部分列表项复制33/139、列表内粘贴280-533、列表末段落766。5.4 IME、合成与输入运行时ime / beforeinput / inputComposition.spec.mjs是 IME 语料最全的文件平假名35、阿拉伯语变音符88、IME 输入平假名174、行间258、加粗内371、emoji 间445、mention 尾/中部636/746、mention 后打字不破坏852、hashtag920、撤销取消1078、浮动工具栏不显示1211、typeahead 不关闭1276、韩语多节点替换1325。AutoScroll.spec.mjs输入时自动滚动17。Events.spec.mjsmacOS 自动大写21、emoji 后双空格句号 #395396。Focus.spec.mjsTab 移出编辑器20、点击外部保持选择34。Keyboard.spec.mjs与KeyboardShortcuts.spec.mjs格式/对齐/字号快捷键、清格式、代码块切换、缩进186-335。Mutations.spec.mjs文本 mutation 观察器管理选择53、DOM 恢复156。TextEntry.spec.mjs文本插入替换49、段间插段113、单词删除353、首段 backspace395、空段与新行选择600。回归8153-safari-ime-delete-selection.spec.mjsSafari IME 结束后 CmdA 全选删除39、ShiftArrowUp 多段删除73。5.5 选择、内联原子与 voidselection-dom-mapping / void-atomAutoLinks.spec.mjsURL 化文本转链接32、邮箱63、非空格破坏链接92、粘贴 URL 建链156/191、去重225、多链接263/300、非法链接拒绝607/655、unlink 再 link694、标点保留755、emoji 破坏896、Enter 不插多余段955。Hashtags.spec.mjs单个/相邻/批量 hashtag30/90/195、格式继承269、无效 hashtag 跳过 #5703329、粘贴多匹配420、导入导出多匹配444。HorizontalRule.spec.mjs创建并移动选择37、文本节点尾加 HR158、中间分裂文本210、列表内分裂272/341、复制粘贴399、空段删除保留 HR489。Images.spec.mjs装饰器创建与选择移动40、增删219、任意 URL 添加391、拖放442/535、选择同步 #2901577、Node selection 多选替换615、尺寸计算770、SVG 渲染820。Keywords.spec.mjs、Links.spec.mjs、Mentions.spec.mjs、Navigation.spec.mjs、Selection.spec.mjs、SelectionAlwaysOnDisplay.spec.mjs分别覆盖关键词装饰器、链接全生命周期转换/段落边界插入/Enter/图片链接/属性粘贴39-2411、mention 输入删除矩阵、键盘导航段落/行/词/emoji 逐词、选择全域焦点、行删除、RTL 装饰器、表格选择包含、格式持久化、失焦保留选择。单元层LexicalSelection.test.tsx、LexicalSelectionHelpers.test.ts、$sliceSelectedTextNodeContent.test.ts、LexicalCaret.test.ts、docs-traversals.test.ts覆盖选择克隆/切片/rebasing、样式补丁、块类型设置、caret 遍历与点排序。5.6 表格tables-gridTables.spec.mjs是索引中最大的单文件193 行指针覆盖工具栏插入93、单元格输入137、首/末格退出185/231、嵌套表退出276/304、键盘导航622-761、Table selection 选择/样式/复制/清除795-1244、合并/拆分单元格2013-3077、行列插入删除与合并冲突3222-4263、列头合并4521、粘贴嵌套表开关5841-7127、RTL/范围选择包含7638-7909。单元层LexicalTableCellNode.test.ts覆盖thscope 头推断285-350、LexicalTableExtension.test.ts覆盖嵌套表开关101/141与colWidths规整366-410、LexicalTableMobileSelection.test.tsx覆盖触摸选择、LexicalTableUtils.test.ts覆盖列移动与越界 no-op。5.7 回归族regression/*索引收录了 20 个按 issue 号命名的回归文件是历史缺陷即行为资产的体现1055-fast-typing-undo、1083-backspace-with-element-at-front、1113-link-newline-at-end、1258-delete-forward、1384-insert-nodes、1730-delete-backword、221-editing-hashtags、230-navigation-around-hashtags、231-empty-text-nodes、3136-insert-nodes-adjacent-to-inline、3433-merge-markdown-lists、379-backspace-with-mentions、399-open-line、429-swapping-emoji、4661-insert-column-selection、4697-repeated-table-selection、4872-full-row-span-cell-merge、4876-unmerge-cell、5251-paste-into-inline-element、5583-select-list-followed-by-element-node、6870-table-left-arrow-selection、6974-delete-character-backward、7163-graphemes、7246-delete-character-backward-list、7266-column-header-merged-cells、7319-delete-character-backward-nodeselection、7354-firefox-decorator-paste、7635-SELECTION_INSERT_CLIPBOARD_NODES_COMMAND、8153-safari-ime-delete-selection。这些文件通常在family上归类为portable editor behavior、selection-dom-mapping / void-atom或ime-composition / history-undo-redo。六、与 inventory.md 的配合分类如何决定进不进索引inventory.md 的核心是一条可复现的清单命令rg --files ../lexical \ | rg (^|/)(__tests__|test|tests|spec|e2e|integration|playwright|cypress|wdio|fixtures)(/|$)|\\.(test|spec)\\.[cm]?[jt]sx?$ \ | rg -v (^|/)(dist|build|coverage|node_modules|vendor|fixtures/generated|__snapshots__)(/|$)第一段枚举测试路径第二段匹配测试目录/文件命名第三段排除构建产物与快照。运行结果给出封闭计数Counts: total 271; runnable 196; fixture/support 75; portable 124; portable-mixed 13; product-shell 33; harness 12; skip 89; uncertain 0.分类决策树由Reason列可见portable包单元行为带便携不变量 → 进入 test-index.mdportable-mixed产品/插件 e2e 但含便携不变量行 → 进入 test-index.mdproduct-shell示例应用/框架集成外壳 → 不进索引除非日后拆出原始不变量harness测试辅助工具 → 只借技术不借行为skip工具链/打包/发布/ESM fixture/eslint 插件等 → 无 Slate targetuncertain0 行无争议。清单还提供Plate-Owned Overlay路由表例如lexical-link/src/__tests__/*与AutoLinks.spec.mjs归 Plate link/autolink 包lexical-list与List.spec.mjs归 Plate list/checklistlexical-markdown与Markdown.spec.mjs归 Plate markdown 序列化包Hashtags/Keywords/DateTime/Emoticons/EquationNode/CharacterLimit/Images 归 Plate 特性插件包React Composer/typeahead/工具栏外壳归 Plate React 人体工学。这条规则与台账的plate-owned状态一一对应。七、与 processing-ledger 的配合从索引到裁决的闭环slate-processing-ledger.md 是索引的消费产物其状态词汇表Status Vocabulary必须与索引配合理解状态含义already-applied所选 apply 车道已添加或加强对应 Slate v2 证明covered现有 Slate v2 已有足够证明行除非后续审计发现漂移refactor-existing加强/拆分/重命名现有 Slate 测试优先于复制create-new新增 Slate v2 单元/浏览器行defer行为有效但需要真机设备、yjs 浏览器、表格模型或后续 ownerplate-owned行为应归 Plate 而非原始 Slate需指明 Plate 包/文档/示例/backlog ownerreject非便携的原始 Slate 行为目标台账的总体裁决Verdict与索引完全对齐271 个清单行、137 个可运行 portable/portable-mixed 文件、1996 个行指针全部被说明无遗漏、无过期、无未解决行。核心方法论是一句话Do not copy Lexical tests one-for-one. Keep the invariant, steal the strongest proof shape, and reject Lexical internals.不要一对一复制 Lexical 测试保留不变量、借鉴最强证明形态、拒绝 Lexical 内部实现细节。台账用Row-Level Source Read子节展示了索引行指针如何被消费例如LexicalHistory.test.tsx:352change, undo, redo, undo, change→already-applied新增证明undo 后的新编辑清除 redo 历史且 redo 变为 no-opLexicalHtml.test.ts:64Use provided selection→covered现有writeSelection证明已覆盖CodeBlock.spec.mjs:173多段转代码块→covered/refactor-existing快照 wrap 与浏览器控制已覆盖。这说明索引不只是目录而是每一条裁决的追溯依据。台账末尾给出未来 apply 切片的验证门控命令verification gates路径指向外部.tmp/slate-v2工作树作为说明保留cd /Users/zbeyens/git/slate-v2 bun test ./packages/slate/test/text-units-contract.ts bun test ./packages/slate-dom/test/clipboard-boundary.ts bun test ./packages/slate-history/test/history-contract.ts PLAYWRIGHT_RETRIES0 bunx playwright test playwright/integration/examples/paste-html.test.ts --projectchromium PLAYWRIGHT_RETRIES0 bunx playwright test playwright/integration/examples/tables.test.ts --projectchromium PLAYWRIGHT_RETRIES0 bunx playwright test playwright/stress/generated-editing.test.ts --projectchromium -g accepted-family bun check以及真机设备证明门控cd /Users/zbeyens/git/slate-v2 SLATE_BROWSER_RAW_MOBILE_REQUIRED1 bun test:mobile-device-proof:raw八、实操指南在本仓库中使用这份索引按家族检索若你在为 Slate v2 的选择/内联原子层补测试先用search_in_files在 docs/editor-test-harvester/lexical/test-index.md 中检索family: selection-dom-mapping / void-atom即可一次性拿到该家族全部候选文件与其target坐标。定位具体行为用文件:行号指针回到上游源码做 source-read还原 dynamic/multiline 标题的真实参数把不变量与 Slate 现有契约对比。对照裁决打开 slate-processing-ledger.md按文件名查该行为的最终状态——already-applied/covered表示已有归属defer/plate-owned/reject表示不要直接移植。校验清单需要确认上游是否新增测试文件时重跑 inventory.md 中的rg清单命令再比对索引头部的 137/1996 统计。执行验证apply 后按台账的验证门控命令跑模型层bun test与 Playwright 浏览器行最后bun check通过才视为闭环。结语test-index.md不是一份普通的测试清单而是 plate 项目跨编辑器收割工程方法的浓缩用category判断可移植性、用family聚合行为主题、用target指定落地坐标、用文件:行号指针保证每条行为都可回源审计。它与 inventory.md全量分类和 slate-processing-ledger.md逐行裁决共同构成一条枚举 → 索引 → source-read → 裁决 → apply → 验证的完整流水线。对于任何想要为 Slate v2 补齐可移植行为证明、或理解 plate 如何吸收上游编辑器测试资产的开发者这份索引都是入口而其背后的方法论同样适用于本仓库对 portabletext、prosemirror、tiptap、yjs-collaboration 等其他编辑器家族的收割工作见 docs/editor-test-harvester 目录结构。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考