rails-ai-bridge 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.reek.yml +55 -34
  3. data/.rubocop.yml +1 -5
  4. data/.rubocop_todo.yml +7 -0
  5. data/AGENTS.md +10 -3
  6. data/CHANGELOG.md +222 -0
  7. data/CLAUDE.md +3 -3
  8. data/README.md +155 -53
  9. data/docs/BEST_PRACTICES.md +15 -13
  10. data/docs/GUIDE.md +258 -53
  11. data/docs/devin-setup.md +264 -0
  12. data/docs/gem-general-improvements.md +162 -0
  13. data/docs/offline-mode.md +121 -0
  14. data/docs/port-registry-resolution.md +172 -0
  15. data/docs/registry-resolution.md +274 -0
  16. data/docs/skill-registry-guide.md +361 -0
  17. data/lib/generators/rails_ai_bridge/help/help_generator.rb +32 -0
  18. data/lib/generators/rails_ai_bridge/install/command_help.rb +48 -0
  19. data/lib/generators/rails_ai_bridge/install/install_generator.rb +107 -53
  20. data/lib/generators/rails_ai_bridge/install/profile_resolver.rb +2 -2
  21. data/lib/rails_ai_bridge/assistant_formats_preference.rb +1 -1
  22. data/lib/rails_ai_bridge/cache_warmer.rb +42 -0
  23. data/lib/rails_ai_bridge/config/introspection.rb +46 -13
  24. data/lib/rails_ai_bridge/config/registry.rb +99 -0
  25. data/lib/rails_ai_bridge/config/rubydex.rb +9 -1
  26. data/lib/rails_ai_bridge/configuration.rb +15 -3
  27. data/lib/rails_ai_bridge/context_provider.rb +7 -5
  28. data/lib/rails_ai_bridge/doctor/checkers/bridge_freshness_checker.rb +137 -0
  29. data/lib/rails_ai_bridge/doctor.rb +1 -0
  30. data/lib/rails_ai_bridge/engine.rb +35 -1
  31. data/lib/rails_ai_bridge/fingerprinter/cached_snapshot.rb +78 -0
  32. data/lib/rails_ai_bridge/fingerprinter.rb +49 -0
  33. data/lib/rails_ai_bridge/freshness_header.rb +132 -0
  34. data/lib/rails_ai_bridge/introspector/parallel_runner.rb +136 -0
  35. data/lib/rails_ai_bridge/introspector/timed_runner.rb +47 -0
  36. data/lib/rails_ai_bridge/introspector.rb +139 -22
  37. data/lib/rails_ai_bridge/introspectors/controller_introspector/filter_extractor.rb +62 -0
  38. data/lib/rails_ai_bridge/introspectors/controller_introspector.rb +2 -25
  39. data/lib/rails_ai_bridge/introspectors/convention_detector.rb +8 -3
  40. data/lib/rails_ai_bridge/introspectors/model_introspector/association_extractor.rb +70 -0
  41. data/lib/rails_ai_bridge/introspectors/model_introspector/callback_extractor.rb +54 -0
  42. data/lib/rails_ai_bridge/introspectors/model_introspector/method_extractor.rb +44 -0
  43. data/lib/rails_ai_bridge/introspectors/model_introspector/source_macro_extractor.rb +223 -0
  44. data/lib/rails_ai_bridge/introspectors/model_introspector.rb +8 -110
  45. data/lib/rails_ai_bridge/introspectors/model_semantic_enrichment.rb +9 -9
  46. data/lib/rails_ai_bridge/introspectors/non_ar_models_introspector.rb +3 -2
  47. data/lib/rails_ai_bridge/introspectors/route_introspector.rb +84 -40
  48. data/lib/rails_ai_bridge/introspectors/semantic_introspector.rb +2 -2
  49. data/lib/rails_ai_bridge/registry/frontmatter_parser.rb +80 -0
  50. data/lib/rails_ai_bridge/registry/pack_definition.rb +23 -0
  51. data/lib/rails_ai_bridge/registry/pack_detector.rb +107 -0
  52. data/lib/rails_ai_bridge/registry/pack_resolver.rb +202 -0
  53. data/lib/rails_ai_bridge/registry/rake_presenter.rb +93 -0
  54. data/lib/rails_ai_bridge/registry/registry_manifest.rb +52 -0
  55. data/lib/rails_ai_bridge/registry/resolver.rb +246 -0
  56. data/lib/rails_ai_bridge/registry/resolver_cache.rb +69 -0
  57. data/lib/rails_ai_bridge/registry/skill_source_resolver.rb +299 -0
  58. data/lib/rails_ai_bridge/registry/source_parser.rb +102 -0
  59. data/lib/rails_ai_bridge/registry/tile_manifest.rb +129 -0
  60. data/lib/rails_ai_bridge/registry/truncatable.rb +37 -0
  61. data/lib/rails_ai_bridge/registry.rb +105 -0
  62. data/lib/rails_ai_bridge/rubydex_adapter/incremental_indexer.rb +316 -0
  63. data/lib/rails_ai_bridge/rubydex_adapter/indexer.rb +9 -3
  64. data/lib/rails_ai_bridge/rubydex_adapter/method_counter.rb +7 -8
  65. data/lib/rails_ai_bridge/rubydex_adapter/serializer.rb +79 -34
  66. data/lib/rails_ai_bridge/rubydex_adapter.rb +110 -14
  67. data/lib/rails_ai_bridge/serializers/context_file_serializer.rb +101 -23
  68. data/lib/rails_ai_bridge/serializers/formatters/sections/semantic_formatter.rb +28 -17
  69. data/lib/rails_ai_bridge/serializers/providers/{windsurf_rules_serializer.rb → devin_rules_serializer.rb} +10 -10
  70. data/lib/rails_ai_bridge/serializers/providers/{windsurf_serializer.rb → devin_serializer.rb} +6 -6
  71. data/lib/rails_ai_bridge/serializers/providers/factory.rb +2 -2
  72. data/lib/rails_ai_bridge/serializers/providers/rules_serializer.rb +2 -83
  73. data/lib/rails_ai_bridge/server.rb +3 -1
  74. data/lib/rails_ai_bridge/tasks/rails_ai_bridge.rake +213 -39
  75. data/lib/rails_ai_bridge/tools/list_registry.rb +170 -0
  76. data/lib/rails_ai_bridge/tools/resolve_skill.rb +141 -0
  77. data/lib/rails_ai_bridge/tools/search_code/ripgrep_search.rb +116 -0
  78. data/lib/rails_ai_bridge/tools/search_code/ruby_search.rb +100 -0
  79. data/lib/rails_ai_bridge/tools/search_code/validator.rb +152 -0
  80. data/lib/rails_ai_bridge/tools/search_code.rb +30 -249
  81. data/lib/rails_ai_bridge/tools/search_semantic.rb +2 -2
  82. data/lib/rails_ai_bridge/version.rb +1 -1
  83. data/lib/rails_ai_bridge.rb +3 -0
  84. data/rails-ai-bridge.gemspec +4 -5
  85. data/server.json +1 -1
  86. metadata +61 -11
  87. data/docs/roadmap-context-assistants.md +0 -88
  88. data/docs/roadmap-mcp-v2.md +0 -45
  89. data/docs/roadmaps.md +0 -84
  90. data/resume.md +0 -181
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70c4f4fa10f3ab710b0fc739366e9b68f30c309ad18759c8f7d0e25f5c5ba9c1
4
- data.tar.gz: 6efeb017419fd80d4c4ea28631640067f46823b29f9e42a7a92fddb95dfcb2f9
3
+ metadata.gz: c78af79aba88ce31b9ea2d0f0c2de1e14782f5a0d2fbc9ccae9a879c86020ad8
4
+ data.tar.gz: 736de35b4fa3413752e77b3ebc37abf5628c697c7855561985031d7a06b53783
5
5
  SHA512:
6
- metadata.gz: 30f13fd84f004af9056801f31444b657f57278628b49ce2fb9ee4e77a1ba2845dbc91f3e1f2092c42205f321d328f4b07a92a645d22e3095098a3a02be40975a
7
- data.tar.gz: b8ca2fde28e9c545c8cd38359e56382d17dd0d942164d3ce3c26bb52cef3a575e34abc32e7f04321888898b40c44b21dc6cb2f962a62f54d51f8255928ff808c
6
+ metadata.gz: f7204bde6b731db642cedb0d3748e413f3c8f6496633328f1450412fdce6aa1127ca7fbaef443b061068f8d66177c5878f35e72a4bd75b21f8ec20f496e6c261
7
+ data.tar.gz: 93f710a0ceeba7a6b55fe6323b22ae1b980424ac301877b13a9d8e2f8e63a064500e5db86db30330b7347649f2774ca9d0655e82704008d568fe4e858e2b33b2
data/.reek.yml CHANGED
@@ -19,6 +19,12 @@ detectors:
19
19
  - RailsAiBridge::Config::Introspection#search_code_allowed_file_types
20
20
  - RailsAiBridge::Config::Introspection#search_code_pattern_max_bytes
21
21
  - RailsAiBridge::Config::Introspection#search_code_timeout_seconds
22
+ - RailsAiBridge::Config::Introspection#snapshot_ttl
23
+ - RailsAiBridge::Config::Introspection#cache_warm_on_boot
24
+ - RailsAiBridge::Config::Introspection#parallel_introspection
25
+ - RailsAiBridge::Config::Introspection#parallel_pool_size
26
+ - RailsAiBridge::Config::Introspection#parallel_timeout_seconds
27
+ - RailsAiBridge::Fingerprinter::CachedSnapshot#snapshot_ttl
22
28
  - RailsAiBridge::Config::Mcp#authorize
23
29
  - RailsAiBridge::Config::Mcp#http_log_json
24
30
  - RailsAiBridge::Config::Mcp#mode
@@ -47,6 +53,8 @@ detectors:
47
53
  - RailsAiBridge::Config::Rubydex#rubydex_index_path
48
54
  - RailsAiBridge::Config::Rubydex#semantic_context_depth
49
55
  - RailsAiBridge::Config::Rubydex#semantic_introspector_enabled
56
+ - RailsAiBridge::Config::Rubydex#rubydex_incremental_threshold
57
+ - RailsAiBridge::Config::Rubydex#rubydex_persist_index
50
58
  - RailsAiBridge#configuration
51
59
  BooleanParameter:
52
60
  exclude:
@@ -60,6 +68,7 @@ detectors:
60
68
  exclude:
61
69
  - RailsAiBridge::ContextProvider#rebuild
62
70
  - RailsAiBridge::Doctor::Checkers::BaseChecker#check
71
+ - RailsAiBridge::RubydexAdapter#apply_failure_state
63
72
  - RailsAiBridge::Doctor#initialize
64
73
  - RailsAiBridge::Introspectors::MiddlewareIntrospector#categorize_middleware
65
74
  - RailsAiBridge::Mcp::HttpRateLimiter#initialize
@@ -72,10 +81,12 @@ detectors:
72
81
  - RailsAiBridge::Watcher#initialize
73
82
  - RailsAiBridge::RubydexAdapter#declaration_to_hash
74
83
  - RailsAiBridge::Services::FileManagementService#validate_path!
84
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#build
75
85
  DataClump:
76
86
  exclude:
77
87
  - RailsAiBridge::Serializers::RegenerationFooter
78
88
  - RailsAiBridge::Introspectors::SemanticIntrospector
89
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer
79
90
  DuplicateMethodCall:
80
91
  exclude:
81
92
  - RailsAiBridge::Config::Introspection#excluded_table?
@@ -90,11 +101,13 @@ detectors:
90
101
  - RailsAiBridge::HttpTransportApp#build
91
102
  - RailsAiBridge::Introspector#app_name
92
103
  - RailsAiBridge::Introspector#call
104
+ - RailsAiBridge::Introspector::ParallelRunner#resolve_future
105
+ - RailsAiBridge::Introspector::TimedRunner#self.call
106
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#reindex
93
107
  - RailsAiBridge::Introspectors::ActiveStorageIntrospector#extract_attachments
94
108
  - RailsAiBridge::Introspectors::ControllerIntrospector#call
95
109
  - RailsAiBridge::Introspectors::ControllerIntrospector#discover_controllers
96
110
  - RailsAiBridge::Introspectors::ControllerIntrospector#eager_load_controllers!
97
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
98
111
  - RailsAiBridge::Introspectors::ConventionDetector#detect_architecture
99
112
  - RailsAiBridge::Introspectors::DatabaseStatsIntrospector#call
100
113
  - RailsAiBridge::Introspectors::EngineIntrospector#discover_mounted_engines
@@ -110,11 +123,7 @@ detectors:
110
123
  - RailsAiBridge::Introspectors::ModelIntrospector#call
111
124
  - RailsAiBridge::Introspectors::ModelIntrospector#discover_models
112
125
  - RailsAiBridge::Introspectors::ModelIntrospector#eager_load_models!
113
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_associations
114
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_callbacks
115
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_source_macros
116
126
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#extract_semantic_summary
117
- - RailsAiBridge::Introspectors::ModelSemanticEnrichment#find_similar_models
118
127
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#detect_model_connections
119
128
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#discover_databases
120
129
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#collect_safe_object_space_entries
@@ -122,7 +131,6 @@ detectors:
122
131
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#eager_load_app_models_dir
123
132
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#safe_to_process?
124
133
  - RailsAiBridge::Introspectors::RakeTaskIntrospector#parse_rake_file
125
- - RailsAiBridge::Introspectors::RouteIntrospector#detect_api_namespaces
126
134
  - RailsAiBridge::Introspectors::RouteIntrospector#detect_mounted_engines
127
135
  - RailsAiBridge::Introspectors::RouteIntrospector#extract_routes
128
136
  - RailsAiBridge::Introspectors::SemanticIntrospector#detect_code_patterns
@@ -239,7 +247,6 @@ detectors:
239
247
  - RailsAiBridge::Introspectors::ConfigIntrospector#detect_cache_store
240
248
  - RailsAiBridge::Introspectors::ConfigIntrospector#extract_credentials_keys
241
249
  - RailsAiBridge::Introspectors::ConfigIntrospector#extract_middleware
242
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
243
250
  - RailsAiBridge::Introspectors::ConventionDetector#detect_patterns
244
251
  - RailsAiBridge::Introspectors::ConventionDetector#scan_directory_structure
245
252
  - RailsAiBridge::Introspectors::DevOpsIntrospector#extract_docker_info
@@ -251,7 +258,6 @@ detectors:
251
258
  - RailsAiBridge::Introspectors::MiddlewareIntrospector#discover_custom_middleware
252
259
  - RailsAiBridge::Introspectors::MigrationIntrospector#pending_migrations
253
260
  - RailsAiBridge::Introspectors::ModelIntrospector#discover_models
254
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_source_macros
255
261
  - RailsAiBridge::Introspectors::ModelIntrospector#extract_validations
256
262
  - RailsAiBridge::Introspectors::ModelIntrospector#model_table_excluded?
257
263
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#find_similar_models
@@ -272,6 +278,8 @@ detectors:
272
278
  - RailsAiBridge::Introspectors::ViewIntrospector#detect_template_engines
273
279
  - RailsAiBridge::RubydexAdapter#constant_references
274
280
  - RailsAiBridge::RubydexAdapter#count_methods
281
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#find_modified_files
282
+ - RailsAiBridge::RubydexAdapter#indexer_options
275
283
  - RailsAiBridge::RubydexAdapter#declaration_to_hash
276
284
  - RailsAiBridge::RubydexAdapter#definition_to_hash
277
285
  - RailsAiBridge::RubydexAdapter#format_location
@@ -334,6 +342,7 @@ detectors:
334
342
  - RailsAiBridge::Tools::GetView::FullFormatter
335
343
  - RailsAiBridge::Tools::GetView::StandardFormatter
336
344
  - RailsAiBridge::Tools::GetView::SummaryFormatter
345
+ - RailsAiBridge::Fingerprinter::CachedSnapshot
337
346
  IrresponsibleModule:
338
347
  exclude:
339
348
  - RailsAiBridge::Generators::InstallGenerator
@@ -349,6 +358,7 @@ detectors:
349
358
  - RailsAiBridge::Doctor::Checkers::BaseChecker#check
350
359
  - RailsAiBridge::Doctor::Checkers::BaseChecker#new_check
351
360
  - RailsAiBridge::Mcp::HttpStructuredLog#emit
361
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#initialize
352
362
  - RailsAiBridge::Serializers::ContextFileSerializer#generate_split_rules
353
363
  - RailsAiBridge::Serializers::ProviderDocumentHeader#call
354
364
  - RailsAiBridge::Tools::GetRoutes#self.call
@@ -363,12 +373,13 @@ detectors:
363
373
  - RailsAiBridge::Tools::SearchCode#self.process_file_for_search
364
374
  - RailsAiBridge::Tools::SearchCode#self.search_with_ripgrep
365
375
  - RailsAiBridge::Tools::SearchCode#self.search_with_ruby
376
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#call
377
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#build
378
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#reindex
366
379
  ManualDispatch:
367
380
  exclude:
368
381
  - RailsAiBridge::Introspector#app_name
369
382
  - RailsAiBridge::Introspectors::ConfigIntrospector#extract_credentials_keys
370
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_action_condition
371
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
372
383
  - RailsAiBridge::Introspectors::MigrationIntrospector#pending_migrations
373
384
  - RailsAiBridge::Introspectors::ModelIntrospector#extract_enums
374
385
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#discover_databases
@@ -385,7 +396,14 @@ detectors:
385
396
  - RailsAiBridge::RubydexAdapter#descendants
386
397
  - RailsAiBridge::RubydexAdapter#format_location
387
398
  - RailsAiBridge::RubydexAdapter#safe_count
399
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#patch_graph
400
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#re_index_file
401
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#remove_from_graph
388
402
  - RailsAiBridge::Services::FileManagementService#default_allowed_base_dir
403
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#apply_incremental_changes
404
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#reindex_file
405
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#remove_file
406
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#log_error
389
407
  MissingSafeMethod:
390
408
  exclude:
391
409
  - RailsAiBridge::AssistantFormatsPreference
@@ -397,6 +415,7 @@ detectors:
397
415
  - RailsAiBridge::Services::FileManagementService
398
416
  - RailsAiBridge::Tools::BaseTool
399
417
  - RailsAiBridge::Watcher::BridgeRegenerator
418
+ - RailsAiBridge::Fingerprinter::CachedSnapshot
400
419
  NestedIterators:
401
420
  exclude:
402
421
  - RailsAiBridge::Fingerprinter#snapshot
@@ -405,15 +424,11 @@ detectors:
405
424
  - RailsAiBridge::Introspectors::ActionTextIntrospector#extract_rich_text_fields
406
425
  - RailsAiBridge::Introspectors::ActiveStorageIntrospector#detect_direct_upload
407
426
  - RailsAiBridge::Introspectors::ActiveStorageIntrospector#extract_attachments
408
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
409
427
  - RailsAiBridge::Introspectors::DevOpsIntrospector#extract_procfile
410
428
  - RailsAiBridge::Introspectors::EngineIntrospector#discover_mounted_engines
411
429
  - RailsAiBridge::Introspectors::GemIntrospector#categorize_gems
412
430
  - RailsAiBridge::Introspectors::JobIntrospector#extract_channels
413
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_callbacks
414
- - RailsAiBridge::Introspectors::ModelSemanticEnrichment#find_similar_models
415
431
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#detect_model_connections
416
- - RailsAiBridge::Introspectors::RouteIntrospector#group_by_controller
417
432
  - RailsAiBridge::Introspectors::SeedsIntrospector#detect_seeded_models
418
433
  - RailsAiBridge::Introspectors::TestIntrospector#detect_test_helpers
419
434
  - RailsAiBridge::Introspectors::TurboIntrospector#extract_turbo_frames
@@ -444,8 +459,10 @@ detectors:
444
459
  - RailsAiBridge::Tools::SearchSemantic#self.format_results
445
460
  NilCheck:
446
461
  exclude:
462
+ - RailsAiBridge::Registry::DeprecatedEntry#removed_in?
447
463
  - RailsAiBridge::AssistantFormatsPreference#formats_for_default_bridge_task
448
464
  - RailsAiBridge::Config::Introspection#excluded_table?
465
+ - RailsAiBridge::RubydexAdapter#sanitize_index_path
449
466
  - RailsAiBridge::Config::Mcp#effective_http_rate_limit_max_requests
450
467
  - RailsAiBridge::Generators::InstallGenerator#profile_from_option
451
468
  - RailsAiBridge::Introspectors::ControllerIntrospector#discover_controllers
@@ -485,10 +502,12 @@ detectors:
485
502
  - RailsAiBridge::Config::Introspection
486
503
  - RailsAiBridge::Config::Mcp
487
504
  - RailsAiBridge::Config::Output
505
+ - RailsAiBridge::Config::Rubydex
488
506
  - RailsAiBridge::Config::Server
489
507
  - RailsAiBridge::Configuration
490
508
  - RailsAiBridge::Mcp::HttpRateLimiter
491
509
  - RailsAiBridge::RubydexAdapter
510
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer
492
511
  - RailsAiBridge::Tools::GetModelDetails::ResponseFormatter
493
512
  - RailsAiBridge::Tools::GetRoutes::ResponseFormatter
494
513
  - RailsAiBridge::Tools::GetSchema::ResponseFormatter
@@ -497,6 +516,7 @@ detectors:
497
516
  - RailsAiBridge::Generators::InstallGenerator
498
517
  - RailsAiBridge::Introspectors::ModelIntrospector
499
518
  - RailsAiBridge::RubydexAdapter
519
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer
500
520
  - RailsAiBridge::Serializers::Providers::BaseProviderSerializer
501
521
  TooManyConstants:
502
522
  exclude:
@@ -504,9 +524,13 @@ detectors:
504
524
  - RailsAiBridge::Server
505
525
  TooManyStatements:
506
526
  exclude:
527
+ - RailsAiBridge::Registry::FrontmatterParser#self.extract_frontmatter_lines
507
528
  - RailsAiBridge#validate_auto_mount_configuration!
508
529
  - RailsAiBridge::AssistantFormatsPreference#formats_for_default_bridge_task
509
530
  - RailsAiBridge::AssistantFormatsPreference#write!
531
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#call
532
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#patch_graph
533
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#run_reindex
510
534
  - RailsAiBridge::Config::Mcp#effective_http_rate_limit_max_requests
511
535
  - RailsAiBridge::ContextProvider#fetch
512
536
  - RailsAiBridge::ContextProvider#fetch_section
@@ -520,6 +544,10 @@ detectors:
520
544
  - RailsAiBridge::Generators::InstallGenerator#show_instructions
521
545
  - RailsAiBridge::HttpTransportApp#build
522
546
  - RailsAiBridge::Introspector#call
547
+ - RailsAiBridge::Introspector#run_single
548
+ - RailsAiBridge::Introspector::ParallelRunner#call
549
+ - RailsAiBridge::Introspector::ParallelRunner#resolve_future
550
+ - RailsAiBridge::Introspector::TimedRunner#self.call
523
551
  - RailsAiBridge::Introspectors::ActionMailboxIntrospector#extract_mailboxes
524
552
  - RailsAiBridge::Introspectors::ActionTextIntrospector#extract_rich_text_fields
525
553
  - RailsAiBridge::Introspectors::ActiveStorageIntrospector#detect_direct_upload
@@ -536,7 +564,6 @@ detectors:
536
564
  - RailsAiBridge::Introspectors::AuthIntrospector#scan_models_for
537
565
  - RailsAiBridge::Introspectors::ConfigIntrospector#detect_current_attributes
538
566
  - RailsAiBridge::Introspectors::ControllerIntrospector#call
539
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
540
567
  - RailsAiBridge::Introspectors::ConventionDetector#detect_architecture
541
568
  - RailsAiBridge::Introspectors::ConventionDetector#detect_patterns
542
569
  - RailsAiBridge::Introspectors::ConventionDetector#scan_directory_structure
@@ -559,10 +586,7 @@ detectors:
559
586
  - RailsAiBridge::Introspectors::MigrationIntrospector#migration_stats
560
587
  - RailsAiBridge::Introspectors::MigrationIntrospector#pending_migrations
561
588
  - RailsAiBridge::Introspectors::ModelIntrospector#call
562
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_associations
563
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_callbacks
564
589
  - RailsAiBridge::Introspectors::ModelIntrospector#extract_model_details
565
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_source_macros
566
590
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#calculate_complexity_score
567
591
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#extract_semantic_data
568
592
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#extract_semantic_summary
@@ -620,6 +644,11 @@ detectors:
620
644
  - RailsAiBridge::RubydexAdapter#index!
621
645
  - RailsAiBridge::RubydexAdapter#instance
622
646
  - RailsAiBridge::RubydexAdapter#search
647
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#call
648
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#reindex
649
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#update_mtimes
650
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#load_mtimes
651
+ - RailsAiBridge::RubydexAdapter#handle_index_result
623
652
  - RailsAiBridge::Serializers::ContextFileSerializer#call
624
653
  - RailsAiBridge::Serializers::ContextFileSerializer#generate_split_rules
625
654
  - RailsAiBridge::Serializers::ContextFileSerializer#serialize
@@ -774,7 +803,6 @@ detectors:
774
803
  - RailsAiBridge::Introspectors::ConfigIntrospector#extract_initializers
775
804
  - RailsAiBridge::Introspectors::ConfigIntrospector#extract_middleware
776
805
  - RailsAiBridge::Introspectors::ControllerIntrospector#call
777
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_filters
778
806
  - RailsAiBridge::Introspectors::ConventionDetector#detect_config_files
779
807
  - RailsAiBridge::Introspectors::ConventionDetector#detect_patterns
780
808
  - RailsAiBridge::Introspectors::DatabaseStatsIntrospector#call
@@ -796,11 +824,6 @@ detectors:
796
824
  - RailsAiBridge::Introspectors::MigrationIntrospector#migration_stats
797
825
  - RailsAiBridge::Introspectors::MigrationIntrospector#pending_migrations
798
826
  - RailsAiBridge::Introspectors::ModelIntrospector#call
799
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_public_class_methods
800
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_public_instance_methods
801
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_source_macros
802
- - RailsAiBridge::Introspectors::ModelIntrospector#sanitize_options
803
- - RailsAiBridge::Introspectors::ModelSemanticEnrichment#find_similar_models
804
827
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#call
805
828
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#detect_model_connections
806
829
  - RailsAiBridge::Introspectors::MultiDatabaseIntrospector#discover_replicas
@@ -809,9 +832,7 @@ detectors:
809
832
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#safe_to_process?
810
833
  - RailsAiBridge::Introspectors::RakeTaskIntrospector#call
811
834
  - RailsAiBridge::Introspectors::RakeTaskIntrospector#parse_rake_file
812
- - RailsAiBridge::Introspectors::RouteIntrospector#detect_api_namespaces
813
835
  - RailsAiBridge::Introspectors::RouteIntrospector#detect_mounted_engines
814
- - RailsAiBridge::Introspectors::RouteIntrospector#group_by_controller
815
836
  - RailsAiBridge::Introspectors::Schema::StaticSchemaParser#skip_table?
816
837
  - RailsAiBridge::Introspectors::SchemaIntrospector#table_names
817
838
  - RailsAiBridge::Introspectors::SeedsIntrospector#analyze_seeds_file
@@ -937,13 +958,20 @@ detectors:
937
958
  UtilityFunction:
938
959
  exclude:
939
960
  - RailsAiBridge::Doctor#compute_score
961
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#file_mtime
962
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#current_files
963
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#reindex_file
964
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#remove_file
965
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#threshold_exceeded?
966
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#mtimes_path
967
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#serialize_mtimes
968
+ - RailsAiBridge::RubydexAdapter::IncrementalIndexer#deserialize_mtimes
940
969
  - RailsAiBridge::Doctor::Checkers::BaseChecker#new_check
941
970
  - RailsAiBridge::Doctor::Checkers::StimulusMcpToolChecker#tool_registered?
942
971
  - RailsAiBridge::Doctor::Checkers::ViewMcpToolChecker#tool_registered?
943
972
  - RailsAiBridge::Introspectors::ControllerIntrospector#api_controller?
944
973
  - RailsAiBridge::Introspectors::ControllerIntrospector#discover_controllers
945
974
  - RailsAiBridge::Introspectors::ControllerIntrospector#eager_load_controllers!
946
- - RailsAiBridge::Introspectors::ControllerIntrospector#extract_action_condition
947
975
  - RailsAiBridge::Introspectors::ControllerIntrospector#extract_actions
948
976
  - RailsAiBridge::Introspectors::ControllerIntrospector#extract_concerns
949
977
  - RailsAiBridge::Introspectors::ControllerIntrospector#extract_respond_to
@@ -957,12 +985,8 @@ detectors:
957
985
  - RailsAiBridge::Introspectors::JobIntrospector#extract_mailers
958
986
  - RailsAiBridge::Introspectors::MigrationIntrospector#detect_migration_actions
959
987
  - RailsAiBridge::Introspectors::ModelIntrospector#eager_load_models!
960
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_associations
961
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_callbacks
962
988
  - RailsAiBridge::Introspectors::ModelIntrospector#extract_concerns
963
989
  - RailsAiBridge::Introspectors::ModelIntrospector#extract_enums
964
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_public_class_methods
965
- - RailsAiBridge::Introspectors::ModelIntrospector#extract_public_instance_methods
966
990
  - RailsAiBridge::Introspectors::ModelIntrospector#sanitize_options
967
991
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#calculate_complexity_score
968
992
  - RailsAiBridge::Introspectors::ModelSemanticEnrichment#extract_semantic_summary
@@ -974,9 +998,6 @@ detectors:
974
998
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#safe_to_process?
975
999
  - RailsAiBridge::Introspectors::NonArModelsIntrospector#sanitize_error_message
976
1000
  - RailsAiBridge::Introspectors::RakeTaskIntrospector#parse_rake_file
977
- - RailsAiBridge::Introspectors::RouteIntrospector#detect_api_namespaces
978
- - RailsAiBridge::Introspectors::RouteIntrospector#extract_constraints
979
- - RailsAiBridge::Introspectors::RouteIntrospector#group_by_controller
980
1001
  - RailsAiBridge::Introspectors::SchemaIntrospector#active_record_connected?
981
1002
  - RailsAiBridge::Introspectors::SchemaIntrospector#adapter_name
982
1003
  - RailsAiBridge::Introspectors::SchemaIntrospector#connection
data/.rubocop.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  plugins:
2
2
  - rubocop-rails
3
3
  - rubocop-rspec
4
-
5
4
  AllCops:
6
5
  TargetRubyVersion: 3.2
7
6
  NewCops: enable
@@ -10,19 +9,15 @@ AllCops:
10
9
  - "vendor/**/*"
11
10
  - "spec/internal/**/*"
12
11
  - "gemfiles/**/*"
13
-
14
12
  Naming/FileName:
15
13
  Exclude:
16
14
  - "lib/rails-ai-bridge.rb"
17
15
  Naming/RescuedExceptionsVariableName:
18
16
  PreferredName: error
19
-
20
17
  Style/Documentation:
21
18
  Enabled: false
22
-
23
19
  Metrics/ClassLength:
24
20
  Max: 240
25
-
26
21
  Metrics/BlockLength:
27
22
  Max: 120
28
23
  Exclude:
@@ -73,3 +68,4 @@ Metrics/CyclomaticComplexity:
73
68
  Max: 35
74
69
  Metrics/ParameterLists:
75
70
  Max: 6
71
+ inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,7 @@
1
+ Rails/ApplicationJob:
2
+ Exclude:
3
+ - 'spec/lib/rails_ai_bridge/introspectors/job_introspector_spec.rb'
4
+
5
+ Rails/ApplicationMailer:
6
+ Exclude:
7
+ - 'spec/lib/rails_ai_bridge/introspectors/job_introspector_spec.rb'
data/AGENTS.md CHANGED
@@ -9,8 +9,8 @@ structure to AI assistants via the Model Context Protocol (MCP).
9
9
  - `lib/rails_ai_bridge/configuration.rb` — User-facing config with presets (:standard, :full)
10
10
  - `lib/rails_ai_bridge/introspector.rb` — Orchestrates sub-introspectors
11
11
  - `lib/rails_ai_bridge/introspectors/` — Built-in introspector classes; `:standard` preset runs **9**, `:full` runs **26** (see `Configuration::PRESETS`). Registry: `Introspector::BUILTIN_INTROSPECTORS` (includes opt-in symbols such as `database_stats`, `non_ar_models` not listed in those presets).
12
- - `lib/rails_ai_bridge/tools/` — 11 built-in MCP tools using the official mcp SDK (hosts can add more via `additional_tools`)
13
- - `lib/rails_ai_bridge/serializers/` — Output formatters (Codex, claude_rules, cursor_rules, windsurf, windsurf_rules, copilot, copilot_instructions, rules, markdown, JSON)
12
+ - `lib/rails_ai_bridge/tools/` — 14 built-in MCP tools using the official mcp SDK (hosts can add more via `additional_tools`)
13
+ - `lib/rails_ai_bridge/serializers/` — Output formatters (Codex, claude_rules, cursor_rules, devin, devin_rules, copilot, copilot_instructions, rules, markdown, JSON)
14
14
  - `lib/rails_ai_bridge/resources.rb` — MCP resources (static data AI clients read directly)
15
15
  - `lib/rails_ai_bridge/server.rb` — MCP server configuration (stdio + HTTP transports)
16
16
  - `lib/rails_ai_bridge/middleware.rb` — Rack middleware for auto-mounting MCP HTTP endpoint
@@ -33,7 +33,7 @@ structure to AI assistants via the Model Context Protocol (MCP).
33
33
  9. **Introspector presets** — `:standard` (9 core) default, `:full` (26 introspectors; optional extras such as `database_stats`, `non_ar_models`) for power users
34
34
  10. **MCP auto-discovery** — `.mcp.json` generated by install generator
35
35
  11. **Compact by default** — context files ≤150 lines, MCP tools use `detail` parameter (summary/standard/full)
36
- 12. **Per-tool split rules** — `.Codex/rules/`, `.cursor/rules/`, `.windsurf/rules/`, `.github/instructions/`
36
+ 12. **Per-tool split rules** — `.Codex/rules/`, `.cursor/rules/`, `.devin/rules/`, `.github/instructions/`
37
37
 
38
38
  ## Testing
39
39
 
@@ -53,3 +53,10 @@ Uses combustion gem for testing Rails engine behavior in isolation.
53
53
  - All tools prefixed with `rails_` per MCP naming best practices
54
54
  - `generate_context` returns `{ written: [], skipped: [] }` hash
55
55
  - Zeitwerk autoloads all files — no `require_relative` needed for new classes
56
+
57
+ <!-- lean-ctx -->
58
+ ## lean-ctx
59
+
60
+ Prefer lean-ctx MCP tools over native equivalents for token savings.
61
+ Full rules: @LEAN-CTX.md
62
+ <!-- /lean-ctx -->