用途
该技能用于管理 React Native 应用中 SQLite 数据库模式版本的发布流程,确保每次发布新版本时,不会有用户设备丢失数据。它定义了一套必须遵守的发布仪式(release ritual),涵盖快照、待定版本管理、已发布版本冻结、路径测试、恢复演练以及设备升级验证等环节。
主要能力
- 发布前快照:在应用打开路径中,通过
VACUUM INTO '<file>.v<from>.bak'备份数据库文件,并通过恢复演练在真实文件上验证备份可用。 - 仅一个待定版本:每次发布只允许一个比账本更新的迁移步骤;步骤文件按 1..N 编号且无间隔,
MIGRATIONS列表按顺序列出这些文件。 - 已发布即冻结:
contracts/schema-ledger.json记录每个发布到设备的版本及其步骤文件和固定装置的 sha256 哈希(基于发布时的 git ref),已发布的步骤或固定装置不允许任何修改,包括注释、格式化或 lint 自动修复。 - 待定版本的固定装置:待定版本的
db-vN.sql从其写入的数据库导出,并设置user_version = N;固定装置必须包含恶意行(转义单引号、非 ASCII 字母、emoji)。 - 内容测试:从版本 2 开始,每个版本需要一个内容测试,加载
db-v(N-1).sql,执行迁移,然后逐行比较存储值,包括未改动的表。 - 所有从-到路径验证:空文件及所有冻结固定装置升级到后续每个版本,必须得到该版本的冻结模式、保留所有行并通过完整性与外键检查。
- 强制失败演练:模拟步骤中途失败、已提交的错误步骤被撤销、旧版本打开升级文件等场景,确保恢复路径可靠。
- 发布确认与记录:任何商店、TestFlight、Play 测试、EAS 预览构建或 EAS Update(包括预览频道)都视为已发布;只有在开发者确认发布且版本离开本机后,才运行
record-shipped.mjs --yes记录版本。 - 禁止回滚到已发布版本之前:不允许重新发布旧代码、旧 TestFlight 构建、
eas update:rollback或回滚 EAS Update 投放;出错应通过新版本向前修复。 - 恢复仅在应用停止时进行:
restore-snapshot.mjs检查副本,将app.db、-wal、-shm移动到kept-<time>/,并读回结果;恢复后只有固定构建可以启动。 - 设备升级证明:在命名 iOS 模拟器和 Android 模拟器上,用上一版本构建、已有数据、新版本覆盖安装,验证升级成功。
- EAS Update 特殊规则:包含模式步骤的 EAS Update 需要先在相同 JavaScript 的 Release 构建上证明无崩溃,再发布到预览频道(视为已发布,需确认并记录),在持有数据的预览构建上无崩溃运行后,才能以分阶段投放方式进入生产。
使用方式
- 阅读
references/release-ritual.md,了解已发布含义、账本、待定版本和回滚规则。 - 首次使用时,复制
templates/contracts/和templates/test/sqlite/;已有发布版本的应用运行record-shipped.mjs . --adopt --build '<first build>' --ref <newest release tag>并确认。 - 运行
check-migration.mjs .确保基线通过。 - 先写内容测试,再写迁移步骤,参考
examples/v0002-pending/。 - 使用
inspect-database.mjs --dump冻结待定固定装置,记录校验和与FIXTURES条目。 - 运行
npx jest test/sqlite --ci --maxWorkers=2和check-migration.mjs .直到通过。 - 在命名的 iOS 模拟器和 Android 模拟器上证明升级。
- 提交步骤、测试、固定装置、校验和及仓库变更,附带
Gate-Change:尾注。 - 停止并询问开发者是否发布;只有确认后才发布构建或更新(使用
eas-build-and-submit、ios-release-testflight、android-release-play、ota-updates等相关技能)。 - 发布后运行
record-shipped.mjs . --build '<build>' --ref <commit or tag>(先演练,再加--yes),并提交账本。 - 若待定步骤在开发或 QA 设备上出错,阅读
references/restore-on-device.md,运行restore-snapshot.mjs --udid <udid> --bundle-id <id>(或--serial <serial> --package <id>,或--dir <folder>),展示计划并确认后加--yes。 - 最后运行
check-migration.mjs .直到输出RESULT: PASS。
适用场景
- 使用 React Native 和 SQLite 进行数据库模式迁移,并通过 EAS 构建或 EAS Update 发布的应用。
- 需要严格保证迁移安全、可回滚、可审计的团队。
- 已有
src/data/migrations/migrations.ts和持久化层(来自persistence-and-migrations技能)的项目。
限制
- 没有
src/data/migrations/migrations.ts时技能不适用,输出NOT APPLICABLE。 - 依赖
persistence-and-migrations技能提供的运行器、打开路径、快照和步骤文件等基础。 - 不涉及具体收费、价格或平台效果信息,这些暂未提供。
- 所有命令和代码内容必须按原文使用,不得修改。