Migrations
Migrations 模块包含 11 个迁移脚本,管理 Claude Code 跨版本升级时的配置兼容性。迁移场景包括:模型别名演进(Fennec→Opus、Sonnet 4.5→4.6 等模型代际切换)、设置项迁移(autoUpdates、bypassPermissions 等从旧格式迁移到新 settings 系统)、用户偏好重置(Pro 用户默认模型切换、autoMode 重新确认)。每个迁移脚本是幂等的、条件触发的,并通过 analytics 记录迁移事件。
职责与设计理念
职责说明
配置迁移引擎,管理模型别名、设置项和用户偏好的版本演进
设计理念
迁移即演进——每个迁移脚本是一次"时间旅行",将旧世界的状态安全地带到新世界。幂等性是迁移的第一法则,条件触发避免误伤。
架构决策
为什么迁移脚本必须是幂等的?
所有迁移脚本可安全重复执行
用户可能在迁移过程中中断(如 ctrl+c),下次启动时迁移会重新执行。幂等性保证重复执行不会产生副作用(如重复写入配置)。每个迁移先检查前置条件,不满足则直接返回。
文件清单
| 文件名 | 用途 |
|---|---|
| migrateSonnet45ToSonnet46.ts | 模型迁移:Sonnet 4.5 → 4.6 别名切换 |
| migrateFennecToOpus.ts | 模型迁移:Fennec 代号 → Opus 正式名 |
| migrateAutoUpdatesToSettings.ts | 设置迁移:自动更新配置迁移到新 settings 系统 |
| migrateBypassPermissionsAcceptedToSettings.ts | 设置迁移:权限绕过配置迁移 |
| migrateReplBridgeEnabledToRemoteControlAtStartup.ts | 设置迁移:REPL 桥接配置重命名 |
| resetAutoModeOptInForDefaultOffer.ts | 偏好重置:自动模式确认状态重置 |
使用场景
Claude Code 版本升级后首次启动
自动执行所有待运行的迁移脚本,静默完成配置兼容性调整
Anthropic 发布新模型
迁移脚本将用户的旧模型别名自动切换到新模型,无需手动操作
依赖关系
- Bootstrap — 全局状态容器与会话生命周期管理,维护运行时的单一真相源
关键代码片段
条件触发的模型迁移
export function migrateSonnet45ToSonnet46(): void {
// 三重守卫:API 提供商 + 订阅类型 + 当前模型
if (getAPIProvider() !== 'firstParty') return
if (!isProSubscriber() && !isMaxSubscriber()) return
const model = getSettingsForSource('userSettings')?.model
if (model !== 'claude-sonnet-4-5-20250929') return
// 幂等迁移:显式版本号 → 别名
updateSettingsForSource('userSettings', { model: 'sonnet' })
if (config.numStartups > 1) {
saveGlobalConfig(c => ({
...c, sonnet45To46MigrationTimestamp: Date.now()
}))
}
logEvent('tengu_sonnet45_to_46_migration', { from_model: model })
} 三重守卫(API 提供商 + 订阅类型 + 当前模型)确保迁移精准触发
技术笔记
edge-case
新用户跳过通知
numStartups > 1 检查区分新用户和老用户。新用户(首次启动)不需要看到"模型已迁移"的通知,因为他们没有旧模型的心智模型。