extract-engine について
extract-engineは、Railsアプリケーションの既存コードをengineへ移すためのスキルです。小さな単位で動作を保ったまま抽出し、ホスト依存をアダプターで扱いながら回帰テストを続けます。
主な機能
- 01範囲を限定した抽出計画
- 02依存関係と境界の分析
- 03Web層より先にドメインロジックを移行
- 04ホスト依存向けアダプター
- 05回帰テストのチェックポイント
活用シーン
- 01Railsアプリからサービスを抽出
- 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詳細
抽出エンジン
既存のコードを Rails アプリからエンジンに移すタスクでは、このスキルを使用してください。 一度にすべてを書き換えるのではなく、段階的な抽出を優先してください。まず動作を維持し、その後に設計を改善します。
クイックリファレンス
| フェーズ | 焦点 |
|---|---|
| 準備 | 境界のある機能とホストの依存関係を特定する |
| ロジック | 安定したドメインロジック(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.
基本プロセス
- 抽出する境界のある機能を特定します。一貫性のある責務をひとつ選びます。
- ホストアプリへの強い依存関係(モデル、サービス、設定)をリストアップします。
- 将来のエンジン境界とホストとの契約を定義します。
- 安定したドメインロジックを最初に移します。PORO、サービス、値オブジェクト、ポリシー、クエリオブジェクトが対象です。ホストモデルへの直接参照、認証、ルートの所有、アセットの統合は後回しにします。
- ホストが所有する依存関係に対して、アダプターまたは設定の境界を追加します。ハードコードされたホスト参照を、設定値、アダプターオブジェクト、またはサービスインターフェースに置き換えます。
- 境界が明確になってから、コントローラー、ルート、ビュー、ジョブを移します。
- 各段階を通じて、回帰テストがすべて成功する状態を維持します。
各段階には、一貫性のある責務、最小限の新しい公開 API、成功する回帰テスト、明確な次のステップが必要です。
拡張リソース
落とし穴
| 落とし穴 | 対処方法 |
|---|---|
| 一度に多くを抽出する | 各ステップで境界のある範囲をひとつに絞る |
| エンジン内からホストを直接参照する | アダプターまたは設定を使用する |
| 抽出と動作変更を同時に行う | まず動作を維持し、その後にリファクタリングする |
| 循環依存を導入する | 各段階の前にインポートグラフを確認する |
| ホストとの契約が暗黙的である | ホストアプリとの契約を明示的に文書化し、テストする |
例
最初の段階(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 | 抽出後のエンジン構造、ホストとの契約、名前空間の設計 |
| test-engine | ダミーアプリ、回帰テスト、統合の検証 |
| refactor-code | 抽出段階の前後に行う、動作を維持したリファクタリング |
コメント
Markdown 対応