diff --git a/docs/superpowers/plans/2026-10-20-slice-wxr-adapter-phase2.md b/docs/superpowers/plans/2026-10-20-slice-wxr-adapter-phase2.md index 7765d42..816b564 100644 --- a/docs/superpowers/plans/2026-10-20-slice-wxr-adapter-phase2.md +++ b/docs/superpowers/plans/2026-10-20-slice-wxr-adapter-phase2.md @@ -50,7 +50,7 @@ cms-one/ - [ ] Step 2 实现 `WxrLimits` 接口 + `DEFAULT_WXR_LIMITS` 常量(as const)+ 类型锁(照 contracts 单源派生先例锁值域) - [ ] Step 3 绿 → commit `feat(adapter-wp): 包骨架与限额契约` -### Task 2: PHP unserialize 受限解析器 +### Task 2: PHP unserialize 受限解析器 ✅ 完成(5550952 + 修复 4f90b63,双审通过;108 测试;**实施者纠正了计划中 UTF-8/UTF-16 等价性的错误前提**(CJK 数据源会全军覆没),按字节宽度正确实现并测试钉死;审查修复:phpValueToJson 防 Map JSON 陷阱、错误摘录、PhpError 基类) **Files:** Create `src/parse/php-unserialize.ts`;Test `test/php-unserialize.test.ts` @@ -89,6 +89,7 @@ cms-one/ - nav_menu_item / wpcf7_contact_form / elementor_library / wp_navigation → **UnsupportedResult**(带类型与原因),不产 UniversalRow - **canonical status 值域**:publish/draft/future/pending/private/trash/inherit → 原样;未知值 → 'unknown' + issue(测试钉死映射表) - **property 断言**:每条产出 row 的 sourceId/sourceType 非空字符串、taxonomyRefs/attachmentRefs 元素形状合法、rawLocation 存在 + - **Task 2 审查移交的补测**:d: 作数组键拒绝、s: 内容含 NUL、数字串键 s:1:"0" 形状归属(→Map)、1MB 性能烟雾(防 O(n²) 回归) - 注:publishedAt/modifiedAt/title 本阶段留在 knownFields(UniversalRow 顶层提升是阶段 3 导入映射的事,有意不提前) - [ ] Step 2 实现 `mapItem(item, config): MappedResult`(config: 类型路由表 {post:'wp:post', page:'wp:page', product:'wp:product', attachment:'wp:attachment'} + site locale)——纯函数 - [ ] Step 3 绿 → commit `feat(adapter-wp): WXR→UniversalRow 映射器(status 值域/悬空保留/unsupported 分流)`