docs: ADR-017/README/阶段4移交清单

- ADR-017 导入管道决策五项:幂等双轨身份键(六列快照行+五列内容身份)与
  canonical.ts 共享 checksum 输入域/收编 UPDATE 语义;自建 term((domain,nicename)
  兜底 + auto: 前缀 + name 回退 + 双序终态等价含 null-id 收编);counts 键全局
  命名空间求和聚合;stale 回收维持 created_at 近似 + 24h 不加心跳列(REST 化重审)
  与报告 issues 封顶;编排串行分派契约(锚点依赖推导)
- README:快速开始加 sf import 全链示例(register→import);当前状态更新
  (阶段 3 完成:192 条目真实落库/二导幂等 0 新修订/333 测试);ADR-001~017
- Plan 3 计划文档:Task 8 勾选 + 验收 6 项全过核验 + 文末新增"移交 Plan 4 清单"
  8 项(publish 命令/Render Snapshot 六文件/pilot-minimal 六类页面+Astro 五禁/
  Preview Server/最小门禁/导入产物消费接口与副本路径/续传项/度量基线 51.8s·20.3s·304MiB)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-21 21:20:21 +08:00
parent a7177afde7
commit 6d9f7b6ad7
3 changed files with 74 additions and 18 deletions
+14 -8
View File
@@ -14,11 +14,16 @@ pnpm db:migrate # 开发库全量迁移(apps/api/drizzle
pnpm db:test # 一键验收:起库 + 跑全部测试(测试用临时库,开发库零写入)
```
WXR 适配器(阶段 2)速览——`pnpm sf` CLI(tsx 直吃 TS,无需构建):
`pnpm sf` CLI 速览(tsx 直吃 TS,无需构建)——阶段 2 探测/登记 + 阶段 3 导入:
```bash
pnpm sf wxr:probe --wxr path/to/export.xml # 只读诊断:流式解析→映射→清洗→计数报告(不入库)
pnpm sf source:register --site <key> --wxr <path> [--sitemap <path>] [--media <dir>] # 快照登记(content-addressed、幂等)
pnpm sf source:register --site <key> --wxr <path> [--sitemap <path>] [--media <dir>] [--media-map <json>] # 快照登记(content-addressed、幂等)
pnpm sf import --site <key> [--snapshot <id>] [--products-path /products/] [--news-path /news/] # 导入落库(幂等 job + JSON/HTML 报告)
# 全链示例(register → import;同快照重复 import 复用既有 job 不重跑)
pnpm sf source:register --site demo --wxr storage/incoming/export.xml --media storage/incoming/media --media-map storage/incoming/media-map.json
pnpm sf import --site demo # 报告落 artifacts/import/<jobId>/reports/import.{json,html}
```
日常质量门(等价于 CI):
@@ -32,12 +37,12 @@ pnpm lint && pnpm typecheck && pnpm test
## 目录结构
```
apps/api/ NestJS standalone 骨架 + Drizzle schema/迁移(21 表,数据库约束即规格)+ source 快照登记
apps/api/ NestJS standalone 骨架 + Drizzle schema/迁移(21 表,数据库约束即规格)+ source 快照登记 + 导入管道(四写入器编排)
packages/contracts/ UniversalRow / Route / Render / Theme 跨源契约(冻结,变更须升版)
packages/adapter-wordpress/ WXR 适配器(saxes 流式解析 + PHP unserialize + 映射 + HTML 白名单清洗,纯函数无 DB)
tests/ 单元 + 集成测试(fixtures:WXR/Sitemap/媒体样例)
infra/ docker-compose:PostgreSQL 16(端口 5434,避开 cms 项目 5433)
scripts/ migrate-test.sh 等运维脚本 · sf.ts(source:register / wxr:probe CLI)
scripts/ migrate-test.sh 等运维脚本 · sf.ts(wxr:probe / source:register / import CLI)
docs/ adr/ 决策记录 · evidence/ 基线证据 · superpowers/ 规格与计划
```
@@ -45,11 +50,12 @@ docs/ adr/ 决策记录 · evidence/ 基线证据 · superpowers/
- 设计基线(表结构/技术决策/阶段划分):`docs/superpowers/specs/2026-10-20-siteforge-vertical-slice-design-v2.md`
- 阶段 0+1 实施计划:`docs/superpowers/plans/2026-10-20-slice-foundation-phase0-1.md`
- 架构决策记录(ADR-001~016):`docs/adr/`
- 基线证据(环境/真实 WXR):`docs/evidence/`
- 架构决策记录(ADR-001~017):`docs/adr/`
- 基线证据(环境/真实 WXR/阶段 3 导入验收):`docs/evidence/`
## 当前状态
- **阶段 1 已完成**:契约冻结、21 表数据模型全量落地(不可变触发器/唯一约束/CHECK 均落数据库并被 75 项测试锁定)、空环境一键启动+迁移验收通过。
- **阶段 2 已完成**:WXR 流式适配器(saxes 流式解析 → PHP unserialize → UniversalRow 映射 → HTML 白名单清洗 → 导入前报告)、`source:register` 快照登记(content-addressed、幂等)与 `pnpm sf` CLI;263 测试全绿,真实 hesupipe WXR(5.5MB)冒烟 18 项计数对照全过(峰值堆 62MiB < 100MiB,证据见 `docs/evidence/phase2-smoke.md`)。
- **下一步:阶段 3**——内容/分类/媒体入库(source_records 落库、稳定身份 upsert、checksum skip、route_registry 生成);输入清单见 Plan 2 文末"移交阶段 3 清单"。
- **阶段 2 已完成**:WXR 流式适配器(saxes 流式解析 → PHP unserialize → UniversalRow 映射 → HTML 白名单清洗 → 导入前报告)、`source:register` 快照登记(content-addressed、幂等)与 `pnpm sf` CLI;真实 hesupipe WXR(5.5MB)冒烟 18 项计数对照全过(峰值堆 62MiB < 100MiB,证据见 `docs/evidence/phase2-smoke.md`)。
- **阶段 3 已完成**:内容导入管道(`sf import`——content/term/media/route 四家写入器串行编排、稳定身份双轨幂等、checksum skip、route_registry §6.1 全表处置、JSON+HTML 导入报告与错误封顶);真实 hesupipe 全量导入验收通过——192 内容条目/1122 source_records/927 terms/2772 routes 落库,二导幂等(0 新修订)、published 指针全程未动(ADR-010),333 测试全绿(证据见 `docs/evidence/phase3-import.md`)。
- **下一步:阶段 4**——content:publish 命令 + Render Snapshot + pilot-minimal 主题 + Astro 构建 + 本地 Preview;输入清单见 Plan 3 文末"移交 Plan 4 清单"。