💎

.clinerules自動生成により、ClineにRailsの最新DBスキーマ情報を認識させる

に公開

ClineにRailsの最新DBスキーマ情報を認識させたい

LLM側は事前学習した知識としてRails自体の規約を把握していますが、当然ながら我々が作っているRailsアプリケーション固有のドメイン知識は持っていません。

そのため、Railsのコードを書いてもらうには常に最新のDBスキーマ情報を認識していて貰いたいです。プロンプトに「schema.rbを参照して」といった指示を含めることもできますが、その場合「指示に従って schema.rb を読みに行く」という無駄なやり取りが発生してしまうので、私は以下のように .clinerules を自動生成することで初めから schema.rb の内容をLLMに渡すようにしています。

erb によるテンプレートの作成

Clineは .clinerules 単体ファイルの他に、.clinerules フォルダの読み込みにも対応しています(公式ドキュメント
今回は以下のようにフォルダ配置を利用し、動的に生成したいルールに関してはERBファイルとしてテンプレートを用意します。

$ tree .clinerules
.clinerules
├── 01_project-brief.md
├── 02_database-table-definitions.md
├── 02_database-table-definitions.md.erb
└── 03_rspec-coding-guideline.md

この例では、02_database-table-definitions.md.erb がそれに該当します。

# データベースにおけるテーブル定義一覧

このRailsアプリケーションで使用されているモデルのテーブル定義(schema.rb)を以下に示します。

```schema.rb
<%=
File.read(File.join(Rails.root, 'db', 'schema.rb')).
lines.
reject { |line| line =~ /^\s*#.*$/ }. # コメント行を除外
reject { |line| line =~ /^\s*$/ }. # 空行を除外
join
%>```

ERBテンプレートからMarkdownファイルを生成するRakeタスクを定義

lib/tasks/cline.rake として、以下のようなRakeタスクを作成します。

namespace :cline do
  desc 'Generate .clinerules/*.md from ./clinerules/*.md.erb'
  task update_rules: :environment do
    files = Dir.glob(Rails.root.join('.clinerules/*.md.erb').to_s)
    files.each do |src_path|
      dst_path = src_path.sub(/\.erb\z/, '')
      # ERBテンプレートの読み込み
      template = File.read(src_path)

      # ERBテンプレートのレンダリング
      renderer = ERB.new(template, trim_mode: '-')
      output = renderer.result

      # .mdへの書き込み
      File.write(dst_path, output)
      puts "#{dst_path} has been successfully updated."
    end
  end
end

# db:migrateをフックして.clinerulesを更新する
Rake::Task['db:migrate'].enhance do
  Rake::Task['cline:update_rules'].invoke
end

これにより、bin/rails cline:update_rules を実行すればERBテンプレートから schema.rb の定義を含む Markdown ファイルを自動生成できます。また、bin/rails db:migrate にフックして自動的に更新されるため、基本的には手動でコマンドを実行する必要すらないでしょう。

注意点として、2025/04/24現在のバージョンのClineは .clinerules フォルダに配置されたファイルは拡張子に依らず参照してしまうため、設定からERBファイルの参照はオフにしておきましょう。

面倒であれば、ERBテンプレートファイルは .clinerules_templates などの別フォルダに配置しておいても良いかもしれません。

Discussion