关于 extract-engine
extract-engine 是将 Rails 应用中的现有代码迁入 engine 的技能,面向渐进式代码拆分。它强调每次提取一个边界明确的部分、保持行为不变,并通过适配器处理宿主依赖和回归测试。
主要功能
- 01规划有限范围的代码提取
- 02分析依赖与边界
- 03先迁移领域逻辑,再迁移 Web 层
- 04用适配器隔离宿主依赖
- 05设置回归测试检查点
适用场景
- 01从 Rails 应用提取服务
- 02通过适配器隔离宿主依赖
- 03规划渐进式 engine 迁移
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ igmarin/ rails-agent-skills --skill extract-engine安装后在 Claude Code 中输入/extract-engine确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/checklist.jsonexamples.mdreferences/adapter_examples.md详细介绍
提取 Engine
当任务是将现有代码从 Rails 应用移至 engine 时,使用此技能。 优先采用渐进式提取,而非大规模重写。先保留行为,再改进设计。
快速参考
| 阶段 | 重点 |
|---|---|
| 准备 | 确定边界清晰的功能和宿主依赖项 |
| 逻辑 | 首先迁移稳定的领域逻辑(PORO、服务) |
| 接缝 | 为宿主依赖项添加适配器/配置 |
| Web | 最后迁移控制器、路由、视图 |
硬性门槛
DO NOT extract and change behavior in the same step.
Extraction must preserve existing behavior; refactoring and improvements belong in a separate step after the move is complete and verified.
核心流程
- 确定要提取的边界清晰的功能——一项职责明确的功能。
- 列出对宿主应用的硬依赖(模型、服务、配置)。
- 定义未来的 engine 边界和宿主契约。
- 首先迁移稳定的领域逻辑:PORO、服务、值对象、策略、查询对象。暂缓处理直接引用宿主模型、身份验证、路由归属和资源集成。
- 为宿主拥有的依赖项添加适配器或配置接缝。用配置值、适配器对象或服务接口替换硬编码的宿主引用。
- 只有在接缝明确后,才迁移控制器、路由、视图或任务。
- 在每个切片的整个过程中,确保回归测试持续通过。
每个切片都必须具备:一项职责明确的功能、尽可能少的新公共 API、通过的回归测试,以及明确的下一步。
扩展资源
注意事项
| 注意事项 | 应对方法 |
|---|---|
| 一次提取过多内容 | 每一步只处理一个边界清晰的切片 |
| engine 中直接引用宿主 | 使用适配器或配置 |
| 将行为变更与提取混在一起 | 先保留行为;之后再重构 |
| 引入循环依赖 | 每个切片开始前验证导入关系图 |
| 宿主契约不明确 | 明确记录并测试宿主应用契约 |
示例
第一个切片(迁移 PORO,暂不迁移宿主模型):
mkdir -p my_engine/app/services/my_engine
mv app/services/pricing/calculator.rb my_engine/app/services/my_engine/pricing_calculator.rb
# Before (in host app): module Pricing; class Calculator
# After (in engine):
module MyEngine
class PricingCalculator
def initialize(line_items)
@line_items = line_items
end
def total
@line_items.sum { |item| item.price * item.quantity }
end
end
end
继续之前,确认回归测试仍然通过:
bundle exec rspec spec/services/pricing/ spec/requests/orders/
宿主依赖项的适配器:
module MyEngine
def self.current_user_for(request)
config.current_user_provider.call(request)
end
end
# usage
OrderCreator.for_request(request) # resolves via MyEngine.current_user_for(request)
输出风格
- 每次提出一个小而边界清晰的提取切片。
- 概述要迁移的文件、新边界,以及要运行的回归测试。
- 语言——除非另有明确要求,否则必须使用英语。
集成
| 技能 | 何时串联 |
|---|---|
| create-engine | 提取后设计 engine 结构、宿主契约和命名空间 |
| test-engine | Dummy 应用、回归测试、集成验证 |
| refactor-code | 在提取切片之前或之后进行保留行为的重构 |
评论
支持 Markdown