Files
cms-website/README.md
T
浅念 6d9f7b6ad7 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>
2026-10-21 21:20:21 +08:00

62 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SiteForge
WordPress 站点到静态站点迁移引擎:读取 WXR/Sitemap/媒体归档 → 清洗入不可变内容库 → 主题化构建为自包含静态站点(Astro),全程可审计、可复现、契约冻结。
## 快速开始
前置:Node.js >= 22.12、Docker、[corepack](https://nodejs.org/api/corepack.html)。
```bash
corepack enable # 激活 pnpm(或自行安装 pnpm@10)
pnpm install # 安装依赖
pnpm db:up # 启动 PostgreSQL 16(宿主端口 5434,等 healthcheck 就绪)
pnpm db:migrate # 开发库全量迁移(apps/api/drizzle)
pnpm db:test # 一键验收:起库 + 跑全部测试(测试用临时库,开发库零写入)
```
`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>] [--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):
```bash
pnpm lint && pnpm typecheck && pnpm test
```
说明:集成测试由 vitest `globalSetup` 自动创建临时库 `sf_test_<ts>` 并注入 `DATABASE_URL_TEST`,结束即 DROP——勿在 `.env` 手动设置该变量。
## 目录结构
```
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(wxr:probe / source:register / import CLI)
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~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;真实 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 清单"。