SuperAPI AI 工具集

codebase-migrate

编程与开发

查看项目

更新于 10-15 12:27

技能介绍

Codebase Migrate 是一个面向大规模代码库迁移与多文件重构的技能。它协调框架升级、API 重命名、配置重写和结构性重构,可跨数百个文件执行。本地代码修改由智能体驱动,Composio CLI 负责周边流程:跟踪问题、按批次创建 PR 并进行 CI 验证。

适用场景

  • 框架升级(React 17 → 19、Node 18 → 22、Django 4 → 5)。
  • 单体仓库中的 API 重命名(例如 getUserById → users.byId)。
  • 配置/格式迁移(webpack → vite、eslint → biome、jest → vitest)。
  • 任何需要以可审查切片方式交付的“200 个文件同样修改”任务。

前置条件

  • curl -fsSL https://composio.dev/install | bash
  • composio login
  • composio link github(用于 PR 与 CI 状态)
  • composio link linear(或 jira,用于迁移跟踪)

智能体将直接使用的本地工具:git、rg、jscodeshift/ts-morph/comby/ast-grep(按语言选择)以及你的测试运行器。

规划阶段

  1. 精确定义转换。反例:“迁移到 vitest”。正例:“将 jest.mock 替换为 vi.mock,将 jest.fn() 换成 vi.fn(),使用模板 X 将 jest.config.js 重命名为 vitest.config.ts”。
  2. 评估影响范围: rg -l 'jest.(mock|fn|spyOn)' | wc -l rg -l 'from "jest"' | sort
  3. 提交跟踪问题: composio execute LINEAR_CREATE_ISSUE -d '{ "teamId":"TEAM_ID", "title":"Migrate test runner: jest → vitest", "description":"Batches of ~25 files. Checkpoint after each PR lands green." }'

按可审查批次执行 循环:选取 N 个文件 → 转换 → 测试 → PR → 等待通过 → 合并 → 下一批。

批次辅助:匹配模式的前 25 个未处理文件

BATCH=$(rg -l 'jest.mock' | grep -v done.list | head -25) echo "$BATCH" > batch.list

智能体对 batch.list 运行 codemod,然后: git checkout -b migrate/vitest-batch-03 xargs < batch.list codemod-runner # 例如 jscodeshift / ts-morph / comby npm test -- --changed git add -A && git commit -m "migrate(test): jest → vitest (batch 3)" git push -u origin migrate/vitest-batch-03

composio execute GITHUB_CREATE_A_PULL_REQUEST -d '{ "owner":"acme","repo":"app", "head":"migrate/vitest-batch-03","base":"main", "title":"migrate(test): jest → vitest (batch 3)", "body":"Part of LIN-482. 25 files. Codemod: transforms/jest-to-vitest.ts." }'

随后轮询 CI 并在通过后合并: composio execute GITHUB_LIST_WORKFLOW_RUNS_FOR_A_REPOSITORY
-d '{"owner":"acme","repo":"app","branch":"migrate/vitest-batch-03"}'

工作流脚本 scripts/migrate-batch.ts,每批通过 composio run --file scripts/migrate-batch.ts -- --batch 3 运行: const batch = process.argv[process.argv.indexOf("--batch") + 1];

const pr = await execute("GITHUB_CREATE_A_PULL_REQUEST", { owner: "acme", repo: "app", head: migrate/vitest-batch-${batch}, base: "main", title: migrate(test): jest → vitest (batch ${batch}), body: Part of LIN-482. See transforms/jest-to-vitest.ts. });

await execute("LINEAR_CREATE_COMMENT", { issueId: "LIN-482", body: Opened PR #${pr.number}: ${pr.html_url} });

安全准则

  • 每个 PR 只做一种转换。切勿把重命名与格式变更混在一起。
  • 维护已迁移文件的 done.list,让下一批跳过它们。
  • 最后一批运行完整测试套件,即使每批 PR 只运行了 --changed。
  • 先 codemod,后手工编辑。如果 codemod 漏掉 3 个文件,手动修补并在 PR 正文中注明。
  • 按批次回滚,而非全局回滚。每个 PR 都应能干净地还原。

验证循环 每次合并后: rg 'jest.(mock|fn|spyOn)' | wc -l # 应趋近于 0 npm test # 完整套件 composio execute GITHUB_LIST_WORKFLOW_RUNS_FOR_A_REPOSITORY
-d '{"owner":"acme","repo":"app","branch":"main","event":"push"}'
| jq '.workflow_runs[0].conclusion'

故障排查

  • Codemod 正则匹配过多 → 改用基于 AST 的工具(ast-grep、ts-morph)进行结构化匹配。
  • 本地测试通过但 CI 失败 → 确保 Node/Python 版本一致;检查 .nvmrc / pyproject.toml。
  • PR 太大难以审查 → 将批次大小减半;维护者不会审查 800 行的 diff。
  • 批次间冲突 → 合并当前批次前先 rebase 未合并的批次;切勿对已合并批次强制推送。

完整 CLI 参考:docs.composio.dev/docs/cli