Refactor 是一个以“只改结构、不改行为”为核心的重构技能,资料中明确说明:重构改变的是结构,不是行为;发现 bug 也不顺带修复,而是记录下来留给单独的修复,保持现状。
用途 用于在保证现有行为不变的前提下调整代码结构,适用于被要求执行“refactor”“clean up”等任务时。
主要流程与能力
- 固定当前行为:找到覆盖该代码公共接口的测试——即通过 program.parseAsync(['node', 'td', ...]) 运行的命令,或导出的 helper。对没有测试覆盖的行为,补充一个当前即可通过的测试,断言代码今天实际做了什么。运行这些测试,直到将要触及的每个行为都有通过的测试。
- 先删除死代码:在能够证明的情况下移除无人到达的代码,例如用 rg 搜索每个名称确认没有调用方,包括 src/index.ts 中的懒加载命令注册表和 scripts/ 目录。删除后运行测试,通过即完成。
- 一次只移动一个概念:每次做一个结构性改动,运行固定行为的测试,然后重复。迁移所有调用方并删除旧 API,不留下兼容层。命令名、flag、--json 输出结构和错误码是用户脚本与 agent 依赖的内容,SKILL_CONTENT 也记录了它们:必须保留,或者停下来询问(改动它们属于破坏性 feat!: 发布)。每一步测试通过、且没有调用方使用旧形式,才算完成。
- 不要改动测试:现有测试可以改变到达代码的方式(导入路径、名称、调用点),但不能改变输入或断言,包括每一个期望输出字符串。如果期望值发生变化,说明行为变了:停下来并说明。
- 只有更好读才保留:指出哪些地方变得更容易阅读或修改。如果说不出来,就回退。能够用一句话说明,才算完成。
- 验证:运行 npm run verify,然后按 verify 格式报告。说明哪些测试固定了行为,并确认 git diff 显示没有任何测试输入或断言被改动。
适用场景 适合在已有测试保障下清理和调整代码结构、删除死代码、迁移调用方并消除旧 API 的场合。
限制 不能改变行为,不能顺带修复 bug;不能修改测试的输入与断言;命令名、flag、--json 输出结构与错误码等公共契约需保留或先询问;若重构后无法说明可读性提升,应回退。