浅念
|
586d715455
|
feat(source): 输入登记服务与 sf CLI(content-addressed 快照)
- registerSource(db, input):wxr/sitemap/媒体目录三类输入登记为 content-addressed
快照——流式 copy+sha256 单遍双算(64KB 块),副本落
storage/snapshots/<kind>/<sha256前2>/<sha256>(文件)或 <sha256>/(媒体整树),
后续任务只读副本;UNIQUE(site,kind,sha256) 幂等(重复登记复用既有行)
- media_bundle 哈希钉死:排序相对路径('/' 归一)+ 每文件 sha256 → canonical
JSON(键排序无空白)→ 再 sha256;不含 mtime、不依赖遍历顺序;完整清单
(path/bytes/sha256)入 metadata jsonb;符号链接(含 junction)跳过并记录
- site 按 key select-then-insert upsert(23505 竞态重查);connection 判重键
(site_id,name) 为应用层 select-then-insert(表无库级唯一,注释注明)
- 路径安全:输入 realpath 后须在 allowedRoots 白名单内(缺省 storage/incoming),
ENOENT/越界/类型不符抛带 code 的 SourceRegisterError;全部输入先校验后摄取,
任何失败零落库零复制
- 报告落 artifacts/register/<runId>/reports/register.json(runId=时间戳+随机;
输入清单/哈希/大小/耗时)
- scripts/sf.ts(commander):wxr:probe 只读诊断(任意可读路径,IO/损坏文件出
报告不崩——Task 6 fatalError 契约)出 JSON/HTML 报告;source:register 调服务
出摘要。CLI 机制钉死:根 devDep tsx + 根 script sf + commander 根依赖,TS 源码
直连(@sf/* 经 tsconfig paths,不经 dist)
- source.module.ts:Nest 注册 SourceRegisterService(standalone context 用);
register.service.ts 刻意零装饰器(CLI/测试直 import 不拉 reflect-metadata)
- launder 类型垫片改经 triple-slash 引用随 html.ts 进任意编译程序(apps/api 与
根程序直连适配器源码的新场景);apps/api 增 @sf/adapter-wp workspace 依赖与
paths 映射(register.service 消费 ADAPTER_VERSION 单源)
- 测试 +7(tests/integration/source-register.test.ts,临时库 + tmpdir storage/
报告根 finally 清理):三输入登记/清单哈希定义对拍/重复登记幂等/mtime 排除/
副本布局与内容一致/路径安全六分支/junction 跳过/报告契约;全套 260 绿
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-21 12:31:15 +08:00 |
|
浅念
|
494beadf94
|
chore: 终审 Minor 清理——@types/node 钉 22、contracts 构建排除测试、helpers 盲区注记、计划收口注记
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 21:08:34 +08:00 |
|
浅念
|
f1c181de02
|
test(db): 空库一键迁移验收 + globalSetup 临时库 + 公共夹具收敛(阶段1验收)
- vitest globalSetup:每次运行 CREATE sf_test_<ts> 临时库 → drizzle-orm 程序化迁移器
全量迁移(apps/api/src/db/migrate.ts,drizzle-kit 无法指向运行时建库)→ 设
DATABASE_URL_TEST 让 getDb() 自动回退到临时库;teardown DROP(WITH FORCE)。
有 default 导出时 vitest 不捕获具名 teardown,故用双具名导出。
- db.full-migrate.test.ts:21 表齐 + 四张不可变触发器在库 + sf_test_* 护栏断言
(current_database 不符即红,杜绝静默连开发库)。
- helpers.ts 收敛:rand/rejectionMessage/createSiteFixture/withImmutableCleanup/
withTestDb,Task 6–12 七文件内联版替换为 import(断言、对照组、清场顺序不变)。
- scripts/migrate-test.sh:docker compose up --wait + pnpm test 一键验收。
- 实证:75 测试全绿(72+3);开发库 21 表行数总和 0(零写入);无 sf_test_* 残留。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 20:43:13 +08:00 |
|
浅念
|
e905cba729
|
feat(db): 0006 构建/验收/审计域 + 追加式审计
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 20:24:18 +08:00 |
|
浅念
|
2b017ed197
|
feat(db): 0005 路由注册表——exact/collision 双键 + NULLS NOT DISTINCT 唯一
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 20:14:46 +08:00 |
|
浅念
|
1cc0dcc57f
|
feat(db): 0004 媒体域——assets/usages 双唯一
media_assets 双唯一 UNIQUE(site_id, source_url) / UNIQUE(site_id, public_path)
+ status 四值 enum + source_id 可空;media_usages 复合主键
(media_asset_id, content_revision_id, field_path),无独立 id/时间戳(spec §5.5)。
vitest fileParallelism: false——不可变表清场 DISABLE/ENABLE TRIGGER 是库级 DDL,
与并行文件的不可变断言竞态(实测 media 清场窗口内 content 断言偶发放行);
串行执行消除竞态,套件仅数秒。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 20:02:57 +08:00 |
|
浅念
|
bc1dcc2ef9
|
feat(db): 0003 分类域——taxonomy/term/content_terms
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 19:48:04 +08:00 |
|
浅念
|
3b45219bbd
|
feat(db): 0002 内容域——entry/locale/revision + 修订不可变 + 回填 content_entry FK
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 19:36:19 +08:00 |
|
浅念
|
32ceba58f0
|
feat(db): 0001 来源域——connection/snapshot/job/record + 快照不可变触发器
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 19:27:31 +08:00 |
|
浅念
|
63830f249e
|
feat(db): 0000 站点域——sites/site_config_revisions + 唯一约束
drizzle-kit 首个迁移从 0000 起编号(计划文案写 0001,以实际产出为准)。
迁移文件 + meta/_journal.json + snapshot 一并入库。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 19:17:16 +08:00 |
|
浅念
|
30c78800e0
|
chore(workspace): pnpm monorepo 骨架 + vitest 冒烟
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 17:36:33 +08:00 |
|
浅念
|
2f1d594034
|
fix(fixtures): 修正 wppop_sections PHP 序列化长度前缀(审查发现);记录悬空图库引用为有意设计
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 17:30:25 +08:00 |
|
浅念
|
681163be97
|
test(fixtures): 脱敏最小 WXR/sitemap/媒体夹具(全虚构)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-10-20 17:26:17 +08:00 |
|