Module: RailsAiBridge

Defined in:
lib/rails_ai_bridge.rb,
lib/rails_ai_bridge/doctor.rb,
lib/rails_ai_bridge/engine.rb,
lib/rails_ai_bridge/server.rb,
lib/rails_ai_bridge/service.rb,
lib/rails_ai_bridge/version.rb,
lib/rails_ai_bridge/watcher.rb,
lib/rails_ai_bridge/resources.rb,
lib/rails_ai_bridge/config/mcp.rb,
lib/rails_ai_bridge/middleware.rb,
lib/rails_ai_bridge/config/auth.rb,
lib/rails_ai_bridge/doctor/check.rb,
lib/rails_ai_bridge/introspector.rb,
lib/rails_ai_bridge/config/output.rb,
lib/rails_ai_bridge/config/server.rb,
lib/rails_ai_bridge/configuration.rb,
lib/rails_ai_bridge/fingerprinter.rb,
lib/rails_ai_bridge/service/result.rb,
lib/rails_ai_bridge/service_errors.rb,
lib/rails_ai_bridge/tools/get_gems.rb,
lib/rails_ai_bridge/tools/get_view.rb,
lib/rails_ai_bridge/mcp/auth_result.rb,
lib/rails_ai_bridge/tools/base_tool.rb,
lib/rails_ai_bridge/context_provider.rb,
lib/rails_ai_bridge/exclusion_helper.rb,
lib/rails_ai_bridge/tools/get_config.rb,
lib/rails_ai_bridge/tools/get_routes.rb,
lib/rails_ai_bridge/tools/get_schema.rb,
lib/rails_ai_bridge/mcp/authenticator.rb,
lib/rails_ai_bridge/tools/search_code.rb,
lib/rails_ai_bridge/http_transport_app.rb,
lib/rails_ai_bridge/tools/get_stimulus.rb,
lib/rails_ai_bridge/view_file_analyzer.rb,
lib/rails_ai_bridge/tools/get_test_info.rb,
lib/rails_ai_bridge/config/introspection.rb,
lib/rails_ai_bridge/mcp/http_rate_limiter.rb,
lib/rails_ai_bridge/tools/get_controllers.rb,
lib/rails_ai_bridge/tools/get_conventions.rb,
lib/rails_ai_bridge/mcp/auth/base_strategy.rb,
lib/rails_ai_bridge/mcp/auth/strategies/jwt.rb,
lib/rails_ai_bridge/mcp/http_structured_log.rb,
lib/rails_ai_bridge/tools/get_model_details.rb,
lib/rails_ai_bridge/model_semantic_classifier.rb,
lib/rails_ai_bridge/watcher/watch_directories.rb,
lib/rails_ai_bridge/introspectors/gem_registry.rb,
lib/rails_ai_bridge/serializers/providers/base.rb,
lib/rails_ai_bridge/watcher/bridge_regenerator.rb,
lib/rails_ai_bridge/serializers/context_summary.rb,
lib/rails_ai_bridge/serializers/formatters/base.rb,
lib/rails_ai_bridge/serializers/json_serializer.rb,
lib/rails_ai_bridge/tools/schema/full_formatter.rb,
lib/rails_ai_bridge/tools/search_code/formatter.rb,
lib/rails_ai_bridge/assistant_formats_preference.rb,
lib/rails_ai_bridge/doctor/checkers/base_checker.rb,
lib/rails_ai_bridge/doctor/checkers/gems_checker.rb,
lib/rails_ai_bridge/doctor/checkers/i18n_checker.rb,
lib/rails_ai_bridge/tools/schema/table_formatter.rb,
lib/rails_ai_bridge/doctor/checkers/tests_checker.rb,
lib/rails_ai_bridge/doctor/checkers/views_checker.rb,
lib/rails_ai_bridge/serializers/providers/factory.rb,
lib/rails_ai_bridge/tools/get_view/base_formatter.rb,
lib/rails_ai_bridge/tools/get_view/full_formatter.rb,
lib/rails_ai_bridge/doctor/checkers/models_checker.rb,
lib/rails_ai_bridge/doctor/checkers/routes_checker.rb,
lib/rails_ai_bridge/doctor/checkers/schema_checker.rb,
lib/rails_ai_bridge/introspectors/api_introspector.rb,
lib/rails_ai_bridge/introspectors/gem_introspector.rb,
lib/rails_ai_bridge/introspectors/job_introspector.rb,
lib/rails_ai_bridge/services/configuration_service.rb,
lib/rails_ai_bridge/tools/schema/summary_formatter.rb,
lib/rails_ai_bridge/doctor/checkers/ripgrep_checker.rb,
lib/rails_ai_bridge/introspectors/auth_introspector.rb,
lib/rails_ai_bridge/introspectors/i18n_introspector.rb,
lib/rails_ai_bridge/introspectors/test_introspector.rb,
lib/rails_ai_bridge/introspectors/view_introspector.rb,
lib/rails_ai_bridge/serializers/markdown_serializer.rb,
lib/rails_ai_bridge/serializers/regeneration_footer.rb,
lib/rails_ai_bridge/tools/schema/standard_formatter.rb,
lib/rails_ai_bridge/introspectors/model_introspector.rb,
lib/rails_ai_bridge/introspectors/route_introspector.rb,
lib/rails_ai_bridge/introspectors/seeds_introspector.rb,
lib/rails_ai_bridge/introspectors/turbo_introspector.rb,
lib/rails_ai_bridge/mcp/auth/strategies/bearer_token.rb,
lib/rails_ai_bridge/services/file_management_service.rb,
lib/rails_ai_bridge/tools/get_view/summary_formatter.rb,
lib/rails_ai_bridge/introspectors/config_introspector.rb,
lib/rails_ai_bridge/introspectors/convention_detector.rb,
lib/rails_ai_bridge/introspectors/devops_introspector.rb,
lib/rails_ai_bridge/introspectors/engine_introspector.rb,
lib/rails_ai_bridge/introspectors/schema_introspector.rb,
lib/rails_ai_bridge/tools/get_view/standard_formatter.rb,
lib/rails_ai_bridge/doctor/checkers/migrations_checker.rb,
lib/rails_ai_bridge/services/app_introspection_service.rb,
lib/rails_ai_bridge/tools/model_details/full_formatter.rb,
lib/generators/rails_ai_bridge/install/profile_resolver.rb,
lib/rails_ai_bridge/doctor/checkers/controllers_checker.rb,
lib/rails_ai_bridge/introspectors/stimulus_introspector.rb,
lib/rails_ai_bridge/serializers/context_file_serializer.rb,
lib/rails_ai_bridge/services/context_generation_service.rb,
lib/generators/rails_ai_bridge/install/install_generator.rb,
lib/rails_ai_bridge/introspectors/migration_introspector.rb,
lib/rails_ai_bridge/introspectors/rake_task_introspector.rb,
lib/rails_ai_bridge/serializers/formatters/sections/base.rb,
lib/rails_ai_bridge/serializers/provider_document_header.rb,
lib/rails_ai_bridge/doctor/checkers/context_files_checker.rb,
lib/rails_ai_bridge/doctor/checkers/mcp_buildable_checker.rb,
lib/rails_ai_bridge/doctor/checkers/view_mcp_tool_checker.rb,
lib/rails_ai_bridge/introspectors/controller_introspector.rb,
lib/rails_ai_bridge/introspectors/middleware_introspector.rb,
lib/rails_ai_bridge/serializers/formatters/providers/base.rb,
lib/rails_ai_bridge/serializers/shared_assistant_guidance.rb,
lib/rails_ai_bridge/tools/model_details/summary_formatter.rb,
lib/rails_ai_bridge/introspectors/action_text_introspector.rb,
lib/rails_ai_bridge/serializers/providers/codex_serializer.rb,
lib/rails_ai_bridge/serializers/providers/rules_serializer.rb,
lib/rails_ai_bridge/tools/get_view/specific_view_formatter.rb,
lib/rails_ai_bridge/tools/model_details/standard_formatter.rb,
lib/rails_ai_bridge/doctor/checkers/bridge_metadata_checker.rb,
lib/rails_ai_bridge/serializers/providers/claude_serializer.rb,
lib/rails_ai_bridge/serializers/providers/gemini_serializer.rb,
lib/rails_ai_bridge/introspectors/non_ar_models_introspector.rb,
lib/rails_ai_bridge/serializers/providers/copilot_serializer.rb,
lib/rails_ai_bridge/serializers/providers/rules_orchestrator.rb,
lib/rails_ai_bridge/doctor/checkers/stimulus_mcp_tool_checker.rb,
lib/rails_ai_bridge/introspectors/action_mailbox_introspector.rb,
lib/rails_ai_bridge/introspectors/active_storage_introspector.rb,
lib/rails_ai_bridge/introspectors/asset_pipeline_introspector.rb,
lib/rails_ai_bridge/introspectors/database_stats_introspector.rb,
lib/rails_ai_bridge/introspectors/multi_database_introspector.rb,
lib/rails_ai_bridge/introspectors/schema/static_schema_parser.rb,
lib/rails_ai_bridge/serializers/providers/windsurf_serializer.rb,
lib/rails_ai_bridge/tools/model_details/non_ar_models_appendix.rb,
lib/rails_ai_bridge/tools/model_details/single_model_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/api_formatter.rb,
lib/rails_ai_bridge/serializers/providers/claude_rules_serializer.rb,
lib/rails_ai_bridge/serializers/providers/cursor_rules_serializer.rb,
lib/rails_ai_bridge/serializers/formatters/sections/auth_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/gems_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/i18n_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/jobs_formatter.rb,
lib/rails_ai_bridge/serializers/providers/base_provider_serializer.rb,
lib/rails_ai_bridge/serializers/providers/codex_support_serializer.rb,
lib/rails_ai_bridge/serializers/formatters/sections/seeds_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/tests_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/turbo_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/views_formatter.rb,
lib/rails_ai_bridge/serializers/providers/windsurf_rules_serializer.rb,
lib/rails_ai_bridge/serializers/formatters/sections/assets_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/config_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/devops_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/models_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/routes_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/schema_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/header_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/engines_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/section_formatter.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/line_enforcer.rb,
lib/rails_ai_bridge/serializers/providers/mcp_tool_reference_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/mcp_guide_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/middleware_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/migrations_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/rake_tasks_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/action_text_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/controllers_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/conventions_formatter.rb,
lib/rails_ai_bridge/serializers/providers/copilot_instructions_serializer.rb,
lib/rails_ai_bridge/serializers/formatters/sections/app_overview_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/codex_footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/codex_header_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/rules_footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/rules_header_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/claude_footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/claude_header_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/gemini_footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/gemini_header_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/action_mailbox_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/active_storage_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/sections/multi_database_formatter.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/model_line_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/copilot_footer_formatter.rb,
lib/rails_ai_bridge/serializers/formatters/providers/copilot_header_formatter.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_document_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/stack_overview_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_architecture_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_notable_gems_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_model_section_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_stack_overview_builder.rb,
lib/rails_ai_bridge/serializers/providers/collaborators/rules_key_considerations_builder.rb

Defined Under Namespace

Modules: Config, ExclusionHelper, Generators, Introspectors, Mcp, Resources, Serializers, ServiceErrors, Services, Tools Classes: AssistantFormatsPreference, Configuration, ConfigurationError, ContextProvider, Doctor, Engine, Error, Fingerprinter, HttpTransportApp, IntrospectionError, Introspector, Middleware, ModelSemanticClassifier, Server, Service, ViewFileAnalyzer, Watcher

Constant Summary collapse

VERSION =
'3.0.0'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configurationRailsAiBridge::Configuration

Returns the mutable gem configuration object.

Returns:



23
24
25
# File 'lib/rails_ai_bridge.rb', line 23

def configuration
  @configuration ||= Configuration.new
end

Class Method Details

.configure {|configuration| ... } ⇒ void

This method returns an undefined value.

Yields the global configuration for mutation.

Yield Parameters:



31
32
33
# File 'lib/rails_ai_bridge.rb', line 31

def configure
  yield(configuration)
end

.generate_context(app = nil, **options) ⇒ Hash{Symbol => Array<String>}

Generate context files (CLAUDE.md, .cursorrules, etc.)

Parameters:

  • app (Rails::Application, nil) (defaults to: nil)

    app to introspect, defaults to Rails.application

  • options (Hash)

    keyword options

Options Hash (**options):

  • :format (Symbol, Array<Symbol>)

    output format(s); defaults to +:all+

  • :split_rules (Boolean)

    whether to generate per-assistant rule directories; defaults to +true+

  • :on_conflict (:overwrite, :skip, :prompt, #call)

    behaviour when a file exists with different content. +:overwrite+ (default) silently replaces; +:skip+ keeps the existing file; +:prompt+ asks via stdin; any callable receives the filepath and returns truthy to overwrite.

Returns:

  • (Hash{Symbol => Array<String>})

    files grouped under +:written+ and +:skipped+

Raises:

  • (ArgumentError)

    when an unknown option key is passed



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rails_ai_bridge.rb', line 57

def generate_context(app = nil, **options)
  allowed = %i[format split_rules on_conflict].to_set
  unknown = options.keys.to_set - allowed
  raise ArgumentError, "Unknown option(s): #{unknown.to_a.join(', ')}" if unknown.any?

  app ||= Rails.application
  context = introspect(app)
  Serializers::ContextFileSerializer.new(context,
                                         format: options.fetch(:format, :all),
                                         split_rules: options.fetch(:split_rules, true),
                                         on_conflict: options.fetch(:on_conflict, :overwrite)).call
end

.introspect(app = nil, only: nil) ⇒ Hash

Quick access to introspect the current Rails app Returns a hash of all discovered context.

Parameters:

  • app (Rails::Application, nil) (defaults to: nil)

    app to introspect, defaults to Rails.application

  • only (Array<Symbol>, nil) (defaults to: nil)

    optional subset of introspector keys to run

Returns:

  • (Hash)

    introspection payload with enabled sections



41
42
43
44
# File 'lib/rails_ai_bridge.rb', line 41

def introspect(app = nil, only: nil)
  app ||= Rails.application
  Introspector.new(app).call(only: only)
end

.start_mcp_server(app = nil, transport: :stdio) ⇒ void

This method returns an undefined value.

Start the MCP server programmatically

Parameters:

  • app (Rails::Application, nil) (defaults to: nil)

    app to serve, defaults to Rails.application

  • transport (Symbol) (defaults to: :stdio)

    transport type (:stdio or :http)

Raises:



76
77
78
79
# File 'lib/rails_ai_bridge.rb', line 76

def start_mcp_server(app = nil, transport: :stdio)
  app ||= Rails.application
  Server.new(app, transport: transport).start
end

.validate_auto_mount_configuration!void

This method returns an undefined value.

Raises ConfigurationError if +auto_mount+ is enabled in production without explicit opt-in and token.

Raises:



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/rails_ai_bridge.rb', line 85

def validate_auto_mount_configuration!
  cfg = configuration
  return unless cfg.auto_mount
  return unless Rails.env.production? || cfg.mcp.require_auth_in_production

  unless cfg.allow_auto_mount_in_production
    raise ConfigurationError,
          'rails_ai_bridge: auto_mount is disabled in production unless you set allow_auto_mount_in_production = true'
  end

  return if Mcp::Authenticator.any_configured?

  raise ConfigurationError,
        'rails_ai_bridge: auto_mount in production requires an auth mechanism ' \
        "(http_mcp_token, mcp_token_resolver, mcp_jwt_decoder, or ENV['#{Mcp::Authenticator::TOKEN_ENV_KEY}'])"
end

.validate_http_mcp_server_in_production!void

This method returns an undefined value.

Raises ConfigurationError when starting the standalone HTTP MCP server in production without a token.

Also enforces RailsAiBridge::Config::Mcp#require_auth_in_production when +true+, regardless of Rails env.

Raises:



108
109
110
111
112
113
114
115
# File 'lib/rails_ai_bridge.rb', line 108

def validate_http_mcp_server_in_production!
  return unless Rails.env.production? || configuration.mcp.require_auth_in_production
  return if Mcp::Authenticator.any_configured?

  raise ConfigurationError,
        'rails_ai_bridge: HTTP MCP in production requires an auth mechanism ' \
        "(http_mcp_token, mcp_token_resolver, mcp_jwt_decoder, or ENV['#{Mcp::Authenticator::TOKEN_ENV_KEY}'])"
end