Class: RailsAiBridge::Serializers::Providers::CursorRulesSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_ai_bridge/serializers/providers/cursor_rules_serializer.rb

Overview

Generates .cursor/rules/*.mdc files in the Cursor MDC format (YAML frontmatter, focused bodies). Complements legacy .cursorrules from RulesSerializer.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ CursorRulesSerializer

Returns a new instance of CursorRulesSerializer.

Parameters:



13
14
15
# File 'lib/rails_ai_bridge/serializers/providers/cursor_rules_serializer.rb', line 13

def initialize(context)
  @context = context
end

Instance Attribute Details

#contextHash (readonly)

Returns Introspection context passed to serializers.

Returns:

  • (Hash)

    Introspection context passed to serializers.



10
11
12
# File 'lib/rails_ai_bridge/serializers/providers/cursor_rules_serializer.rb', line 10

def context
  @context
end

Instance Method Details

#call(output_dir) ⇒ Hash<Symbol, Array<String>>

Writes MDC rule files under .cursor/rules/ when content changes.

Parameters:

  • output_dir (String)

    Root directory where .cursor/rules is created.

Returns:

  • (Hash<Symbol, Array<String>>)

    +:written+ and +:skipped+ arrays of absolute file paths.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rails_ai_bridge/serializers/providers/cursor_rules_serializer.rb', line 21

def call(output_dir)
  rules_dir = File.join(output_dir, '.cursor', 'rules')
  FileUtils.mkdir_p(rules_dir)

  written = []
  skipped = []

  files = {
    'rails-engineering.mdc' => render_engineering_rule,
    'rails-project.mdc' => render_project_rule,
    'rails-models.mdc' => render_models_rule,
    'rails-controllers.mdc' => render_controllers_rule,
    'rails-mcp-tools.mdc' => render_mcp_tools_rule
  }

  files.each do |filename, content|
    next unless content

    filepath = File.join(rules_dir, filename)
    if File.exist?(filepath) && File.read(filepath) == content
      skipped << filepath
    else
      File.write(filepath, content)
      written << filepath
    end
  end

  { written: written, skipped: skipped }
end