oracle-migratelisted
Install: claude install-skill Huanyu-Hibiki/Huanyu-Skills
# /oracle-migrate — Schema 版本迁移
把用户 `.oracle-state.json` 从旧 `schema_version` 升级到 LATEST_SCHEMA。
## Overview
```
[Phase 0: 读 state + registry → 确定迁移链]
↓
[Phase 1: dry-run 展示计划,等确认]
↓
[Phase 2: 备份 → .oracle-state.json.backup-<timestamp>]
↓
[Phase 3: 按序应用每步迁移文件的 HOW 段]
↓
[Phase 4: 验证(能解析 + 版本正确 + 必填字段齐)]
↓
[Phase 5: 报告]
```
## Constants
- **REGISTRY_PATH = `migrations/registry.md`** — 版本链单一来源(LATEST_SCHEMA + 版本链表)
- **DRY_RUN_BY_DEFAULT = true**
- **BACKUP_BEFORE_WRITE = true**(备份保留至下次成功 init / 用户手动清理)
- **STOP_ON_STEP_FAILURE = true** — 失败停在中间版本,不前进不回滚
## Workflow
### Phase 0: 确定迁移链
1. 读 state → `current_version = state.schema_version`
2. 读 registry → `LATEST_SCHEMA`
3. `— to` 覆盖目标;`— from` 强制起点(schema 字段坏了的罕见场景)
4. 状态判断:相等 → "✅ 已是 target,无需迁移"退出;current > target → 报错"无法降级,请手动 cp git 快照或重新 init";小于 → 从版本链表算 `chain = [(from, to, file), ...]`
5. 某步在链表缺失 → 报错并列出已知版本,让用户检查
### Phase 1: dry-run
🔴 **CHECKPOINT**:dry-run 计划展示后停在确认门(DRY_RUN_BY_DEFAULT——没过这扇门不碰 state):
```
📋 迁移计划
当前: 1.0 → 目标: 1.1
[1/1] 1.0 → 1.1(MINOR)
<一句话描述> · 详见 migrations/1.0-to-1.1.md
⚠️ 备份位置: .oracle-state.json.backup-<timestamp>
继续?yes 执行 / no 退出 / detail 看每步具体改什么
```
### Phase 2: 备份
```bash
cp .oracle-state.json .oracle-state.json.backup-$(date +%s)
```
### Phase 3: 按序应用
对 chain 每步:
1. 读 `migrations/<file>` 的 `## HOW` 段
2. **按段内自然语言步骤逐项执行**——迁移是 AI 读 markdown 跑的,不是脚本
3. 每步完成:更新内存 schema_version = to + **原子写**(.tmp → rename)
4. 失败 → "❌ {file} 第 N 步失败:{error}。已停在 {last_success_