用途:为 gh aw fix 命令新增或更新 Go codemod(代码迁移规则)。
理解 fix 流水线:codemod 通过 GetAllCodemods() 一次性加载,按注册表顺序依次应用,每个 codemod 执行前会重新解析 frontmatter;codemod 必须返回 (newContent, applied, error),且对无操作输入安全。可先查看 pkg/cli/fix_command.go、pkg/cli/fix_codemods.go、pkg/cli/yaml_frontmatter_utils.go 与 pkg/cli/codemod_factory.go。
实现步骤:在 pkg/cli/ 新建 codemod_<feature>.go;用 logger.New("cli:codemod_<feature>") 添加包日志;实现 get<Feature>Codemod() Codemod 并填充 ID、Name、Description、IntroducedIn 等元数据。Apply 中先检查 frontmatter 前置条件,无需迁移时返回原内容与 applied=false;仅用 applyFrontmatterLineTransform 变换 frontmatter,保留注释、格式与 markdown 正文,避免有损重写或改动无关键。优先复用 findAndReplaceInLine、removeFieldFromBlock、removeParentBlockIfTrulyEmpty、newFieldRemovalCodemod、newMoveTopLevelKeyToOnBlockCodemod 等助手。若依赖外部数据或副作用,通过 ...WithDeps 构造函数注入以便测试 mock。最后在 GetAllCodemods() 中注册。
测试要求:新建 codemod_<feature>_test.go,覆盖元数据正确性、正常迁移、无操作、幂等、注释/缩进/markdown 正文保留、边界情况,以及 ...WithDeps 的成功与回退/错误路径。复杂度高时(表达式重写、类解析行为)按 codemod_steps_run_secrets_env_fuzz_test.go 模式添加 fuzz 测试。新增后更新 pkg/cli/fix_codemods_test.go 中的预期 ID 与顺序列表(顺序影响后续 codemod 观察到的变换)。
验证命令:先运行 go test -v ./pkg/cli -run Codemod -count=1 与 go test -v ./pkg/cli -run Fix -count=1,再运行 make build、make test-unit、make lint。质量要求:确定性、可重复运行安全、保守不改无关内容、迁移与无操作路径测试完整、已在注册表测试中注册并校验顺序。