--- name: athena-migrate description: > 把 v9.5.5 项目的 .ai_state/ 升级到 v9.6 schema (INDEX + details/ 重构)。 effort: xhigh disable-model-invocation: true --- # /athena-migrate — v9.5.5 → v9.6 迁移 参考: ## 前置检查 ```bash test -d .ai_state || { echo "[migrate] 无 .ai_state, 请先 /athena-init"; exit 1; } test -f .ai_state/_index.md && grep -q 'schema_version: "9.6"' .ai_state/_index.md && { echo "[migrate] 已是 v9.6 schema, 无需迁移"; exit 0; } ``` ## 迁移算法 ### Step 1: 备份 ```bash mkdir -p .ai_state/.legacy-v9.5 cp -r .ai_state/{tasks.md,design.md,progress.md,lessons.md,handoff.md,project.json,reviews,hook-trace.jsonl,compact-snapshot.json} .ai_state/.legacy-v9.5/ 2>/dev/null || true echo "[migrate] 旧文件已备份到 .ai_state/.legacy-v9.5/" ``` ### Step 2: 创建 details/ 目录 ```bash mkdir -p .ai_state/details/reviews mkdir -p .ai_state/details/tasks-archive ``` ### Step 3: 迁移文件 | v9.5.5 路径 | v9.6 路径 | 备注 | |---|---|---| | `.ai_state/tasks.md` | `.ai_state/details/tasks-current.md` | 改名 | | `.ai_state/design.md` | `.ai_state/details/design.md` | 平移 | | `.ai_state/progress.md` | `.ai_state/details/progress.md` | 平移 | | `.ai_state/lessons.md` | `.ai_state/details/lessons.md` | 平移 | | `.ai_state/handoff.md` | `.ai_state/details/handoff.md` | 平移 | | `.ai_state/reviews/sprint-N.md` | `.ai_state/details/reviews/sprint-N.md` | 平移 | | `.ai_state/project.json` | (merge 到 _index.md frontmatter) | 转 markdown frontmatter | | `.ai_state/hook-trace.jsonl` | `.ai_state/hook-trace.jsonl` | 保持原位置 | | `.ai_state/compact-snapshot.json` | (删, v9.6 改写到 _index.md.snapshots) | 删除 | ```bash # 平移 [ -f .ai_state/tasks.md ] && mv .ai_state/tasks.md .ai_state/details/tasks-current.md for f in design.md progress.md lessons.md handoff.md; do [ -f .ai_state/$f ] && mv .ai_state/$f .ai_state/details/$f done [ -d .ai_state/reviews ] && mv .ai_state/reviews .ai_state/details/reviews [ -f .ai_state/compact-snapshot.json ] && rm .ai_state/compact-snapshot.json ``` ### Step 4: 生成 _index.md 从 `.ai_state/project.json` 读 path/stage/sprint/tech_stack/test_cmd/build_cmd/lint_cmd/dev_cmd/conventions/gotchas, 写入新 _index.md frontmatter。 ```bash # 用 node 脚本生成 _index.md (避免手写 yaml escape 出错) node -e ' const fs = require("fs"); const path = require("path"); let proj = {}; try { proj = JSON.parse(fs.readFileSync(".ai_state/.legacy-v9.5/project.json","utf8")); } catch(e) {} const sprint = proj.sprint || 0; // 计算 counts let tasks_pending = 0, tasks_done = 0, tasks_blocked = 0; try { const t = fs.readFileSync(".ai_state/details/tasks-current.md","utf8"); tasks_pending = (t.match(/^- \[ \]/gm) || []).length; tasks_done = (t.match(/^- \[x\]/gm) || []).length; } catch(e) {} let progress_entries = 0, latest_progress = ""; try { const lines = fs.readFileSync(".ai_state/details/progress.md","utf8").split("\n").filter(l => l.trim().length > 0 && !l.startsWith("