.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