SuperAPI AI 工具集

run-migration

编程与开发

查看项目

更新于 10-18 18:02

技能介绍

用途

该技能用于管理 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 构建上证明无崩溃,再发布到预览频道(视为已发布,需确认并记录),在持有数据的预览构建上无崩溃运行后,才能以分阶段投放方式进入生产。

使用方式

  1. 阅读 references/release-ritual.md,了解已发布含义、账本、待定版本和回滚规则。
  2. 首次使用时,复制 templates/contracts/ 和 templates/test/sqlite/;已有发布版本的应用运行 record-shipped.mjs . --adopt --build '<first build>' --ref <newest release tag> 并确认。
  3. 运行 check-migration.mjs . 确保基线通过。
  4. 先写内容测试,再写迁移步骤,参考 examples/v0002-pending/。
  5. 使用 inspect-database.mjs --dump 冻结待定固定装置,记录校验和与 FIXTURES 条目。
  6. 运行 npx jest test/sqlite --ci --maxWorkers=2 和 check-migration.mjs . 直到通过。
  7. 在命名的 iOS 模拟器和 Android 模拟器上证明升级。
  8. 提交步骤、测试、固定装置、校验和及仓库变更,附带 Gate-Change: 尾注。
  9. 停止并询问开发者是否发布;只有确认后才发布构建或更新(使用 eas-build-and-submit、ios-release-testflight、android-release-play、ota-updates 等相关技能)。
  10. 发布后运行 record-shipped.mjs . --build '<build>' --ref <commit or tag>(先演练,再加 --yes),并提交账本。
  11. 若待定步骤在开发或 QA 设备上出错,阅读 references/restore-on-device.md,运行 restore-snapshot.mjs --udid <udid> --bundle-id <id>(或 --serial <serial> --package <id>,或 --dir <folder>),展示计划并确认后加 --yes。
  12. 最后运行 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 技能提供的运行器、打开路径、快照和步骤文件等基础。
  • 不涉及具体收费、价格或平台效果信息,这些暂未提供。
  • 所有命令和代码内容必须按原文使用,不得修改。