Class: RosettAi::Plugins::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/rosett_ai/plugins/registry.rb

Overview

Dynamic, multi-type plugin registry.

Plugins self-register via RosettAi::Plugins::Registry.register(:engine, 'claude', MyModule). External plugin gems are discovered via Gem.find_files — install a gem, and it becomes available automatically.

Replaces the hardcoded ENGINES and BACKENDS maps from RosettAi::Engines::Registry and RosettAi::Compiler::Backend.

Defined Under Namespace

Classes: PluginNotFoundError

Constant Summary collapse

PLUGIN_TYPES =
[:engine, :gui, :mcp].freeze

Class Method Summary collapse

Class Method Details

.available(type) ⇒ Array<String>

Returns sorted list of registered plugin names.

Parameters:

  • type (Symbol)

    plugin type

Returns:

  • (Array<String>)

    sorted list of registered plugin names



37
38
39
40
# File 'lib/rosett_ai/plugins/registry.rb', line 37

def available(type)
  validate_type!(type)
  @plugins[type].keys.sort
end

.discover!Object

Discover and load all installed plugin gems.

Scans for rosett_ai_engine/*/register.rb, rosett_ai_gui/*/register.rb, and rosett_ai_mcp/*/register.rb across all gem load paths. Each register.rb is expected to call Registry.register.



72
73
74
75
76
77
78
79
# File 'lib/rosett_ai/plugins/registry.rb', line 72

def discover!
  return if @discovered

  discover_type('rosett_ai_engine')
  discover_type('rosett_ai_gui')
  discover_type('rosett_ai_mcp')
  @discovered = true
end

.enginesObject

Convenience accessors for each plugin type.



63
# File 'lib/rosett_ai/plugins/registry.rb', line 63

def engines = @plugins[:engine]

.guisObject



64
# File 'lib/rosett_ai/plugins/registry.rb', line 64

def guis    = @plugins[:gui]

.mcpsObject



65
# File 'lib/rosett_ai/plugins/registry.rb', line 65

def mcps    = @plugins[:mcp]

.plugin_module(type, name) ⇒ Module

Returns the registered plugin module.

Parameters:

  • type (Symbol)

    plugin type

  • name (String, Symbol)

    plugin identifier

Returns:

  • (Module)

    the registered plugin module

Raises:



46
47
48
49
50
51
52
# File 'lib/rosett_ai/plugins/registry.rb', line 46

def plugin_module(type, name)
  validate_type!(type)
  @plugins[type].fetch(name.to_s) do
    raise PluginNotFoundError,
          "Unknown #{type} plugin: #{name}. Available: #{available(type).join(', ')}"
  end
end

.register(type, name, plugin_module) ⇒ Object

Register a plugin module under a type and name.

Parameters:

  • type (Symbol)

    one of :engine, :gui, :mcp

  • name (String, Symbol)

    plugin identifier

  • plugin_module (Module)

    the module including the appropriate contract



30
31
32
33
# File 'lib/rosett_ai/plugins/registry.rb', line 30

def register(type, name, plugin_module)
  validate_type!(type)
  @plugins[type][name.to_s] = plugin_module
end

.registered?(type, name) ⇒ Boolean

Parameters:

  • type (Symbol)

    plugin type

  • name (String, Symbol)

    plugin identifier

Returns:

  • (Boolean)


57
58
59
60
# File 'lib/rosett_ai/plugins/registry.rb', line 57

def registered?(type, name)
  validate_type!(type)
  @plugins[type].key?(name.to_s)
end

.reset!Object

Reset the registry. Intended for testing only.



82
83
84
85
# File 'lib/rosett_ai/plugins/registry.rb', line 82

def reset!
  @plugins = Hash.new { |h, k| h[k] = {} }
  @discovered = false
end