浅念 9732e1b684 fix(source): 中间段符号链接逃逸堵截(无条件 realpath);注释口径修正
- validateInputPath 原先只在末段是符号链接时 realpath——中间目录段含 junction
  (链接在白名单内、目标在外,Windows 免特权可构造)时词法前缀判定被绕过,
  会读到白名单外内容(评审 PoC 复现)。改为 lstat 存在性探测后无条件
  realpath(abs),整条路径解析到物理位置再做白名单与类型判定;断链场景
  realpath 抛 ENOENT 仍归入 INPUT_NOT_FOUND(语义不变)
- 回归测试:中间段 junction 逃逸用例(incoming/junc → pkg-outside/escape.xml,
  断言 PATH_NOT_ALLOWED + 零落库);已对修复前代码验证为红(逃逸被接受)、
  修复后绿
- 注释口径修正:registerSource 的"任何失败零落库零复制"只在校验阶段成立——
  摄取中途失败不回滚已落位副本(content-addressed、幂等无害),但 DB 写入
  在全部摄取完成后才开始,任何失败零落库不变
- 计划勾选:Task 7 "CLI 执行机制(钉死)"(已实现并双命令冒烟验证)

全套 261 测试绿(+1);typecheck / lint 绿

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 12:47:07 +08:00
2026-10-20 20:56:26 +08:00

SiteForge

WordPress 站点到静态站点迁移引擎:读取 WXR/Sitemap/媒体归档 → 清洗入不可变内容库 → 主题化构建为自包含静态站点(Astro),全程可审计、可复现、契约冻结。

快速开始

前置:Node.js >= 22、Docker、corepack。

corepack enable                      # 激活 pnpm(或自行安装 pnpm@10)
pnpm install                         # 安装依赖
pnpm db:up                           # 启动 PostgreSQL 16(宿主端口 5434,等 healthcheck 就绪)
pnpm db:migrate                      # 开发库全量迁移(apps/api/drizzle)
pnpm db:test                         # 一键验收:起库 + 跑全部测试(测试用临时库,开发库零写入)

日常质量门(等价于 CI):

pnpm lint && pnpm typecheck && pnpm test

说明:集成测试由 vitest globalSetup 自动创建临时库 sf_test_<ts> 并注入 DATABASE_URL_TEST,结束即 DROP——勿在 .env 手动设置该变量。

目录结构

apps/api/            NestJS standalone 骨架 + Drizzle schema/迁移(21 表,数据库约束即规格)
packages/contracts/  UniversalRow / Route / Render / Theme 跨源契约(冻结,变更须升版)
tests/               单元 + 集成测试(fixtures:WXR/Sitemap/媒体样例)
infra/               docker-compose:PostgreSQL 16(端口 5434,避开 cms 项目 5433)
scripts/             migrate-test.sh 等运维脚本
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~015):docs/adr/
  • 基线证据(环境/真实 WXR):docs/evidence/

当前状态

  • 阶段 1 已完成:契约冻结、21 表数据模型全量落地(不可变触发器/唯一约束/CHECK 均落数据库并被 75 项测试锁定)、空环境一键启动+迁移验收通过。
  • 下一步:阶段 2——WXR 适配器(流式 SAX 解析 → UniversalRow),计划基于阶段 1 经验另立。
S
Description
No description provided
Readme 203 KiB