Class: RailsAiBridge::Serializers::Providers::CopilotInstructionsSerializer

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

Overview

Generates .github/instructions/*.instructions.md files with applyTo front matter for GitHub Copilot path-scoped instructions.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ CopilotInstructionsSerializer

Returns a new instance of CopilotInstructionsSerializer.

Parameters:



13
14
15
# File 'lib/rails_ai_bridge/serializers/providers/copilot_instructions_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/copilot_instructions_serializer.rb', line 10

def context
  @context
end

Instance Method Details

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

Writes models, controllers, and MCP instruction files under .github/instructions/.

Parameters:

  • output_dir (String)

    Root directory where .github/instructions 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
# File 'lib/rails_ai_bridge/serializers/providers/copilot_instructions_serializer.rb', line 21

def call(output_dir)
  dir = File.join(output_dir, '.github', 'instructions')
  FileUtils.mkdir_p(dir)

  written = []
  skipped = []

  files = {
    'rails-models.instructions.md' => render_models_instructions,
    'rails-controllers.instructions.md' => render_controllers_instructions,
    'rails-mcp-tools.instructions.md' => render_mcp_tools_instructions
  }

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

    filepath = File.join(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