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.
- checksums.yaml +4 -4
- data/.reek.yml +55 -34
- data/.rubocop.yml +1 -5
- data/.rubocop_todo.yml +7 -0
- data/AGENTS.md +10 -3
- data/CHANGELOG.md +222 -0
- data/CLAUDE.md +3 -3
- data/README.md +155 -53
- data/docs/BEST_PRACTICES.md +15 -13
- data/docs/GUIDE.md +258 -53
- data/docs/devin-setup.md +264 -0
- data/docs/gem-general-improvements.md +162 -0
- data/docs/offline-mode.md +121 -0
- data/docs/port-registry-resolution.md +172 -0
- data/docs/registry-resolution.md +274 -0
- data/docs/skill-registry-guide.md +361 -0
- data/lib/generators/rails_ai_bridge/help/help_generator.rb +32 -0
- data/lib/generators/rails_ai_bridge/install/command_help.rb +48 -0
- data/lib/generators/rails_ai_bridge/install/install_generator.rb +107 -53
- data/lib/generators/rails_ai_bridge/install/profile_resolver.rb +2 -2
- data/lib/rails_ai_bridge/assistant_formats_preference.rb +1 -1
- data/lib/rails_ai_bridge/cache_warmer.rb +42 -0
- data/lib/rails_ai_bridge/config/introspection.rb +46 -13
- data/lib/rails_ai_bridge/config/registry.rb +99 -0
- data/lib/rails_ai_bridge/config/rubydex.rb +9 -1
- data/lib/rails_ai_bridge/configuration.rb +15 -3
- data/lib/rails_ai_bridge/context_provider.rb +7 -5
- data/lib/rails_ai_bridge/doctor/checkers/bridge_freshness_checker.rb +137 -0
- data/lib/rails_ai_bridge/doctor.rb +1 -0
- data/lib/rails_ai_bridge/engine.rb +35 -1
- data/lib/rails_ai_bridge/fingerprinter/cached_snapshot.rb +78 -0
- data/lib/rails_ai_bridge/fingerprinter.rb +49 -0
- data/lib/rails_ai_bridge/freshness_header.rb +132 -0
- data/lib/rails_ai_bridge/introspector/parallel_runner.rb +136 -0
- data/lib/rails_ai_bridge/introspector/timed_runner.rb +47 -0
- data/lib/rails_ai_bridge/introspector.rb +139 -22
- data/lib/rails_ai_bridge/introspectors/controller_introspector/filter_extractor.rb +62 -0
- data/lib/rails_ai_bridge/introspectors/controller_introspector.rb +2 -25
- data/lib/rails_ai_bridge/introspectors/convention_detector.rb +8 -3
- data/lib/rails_ai_bridge/introspectors/model_introspector/association_extractor.rb +70 -0
- data/lib/rails_ai_bridge/introspectors/model_introspector/callback_extractor.rb +54 -0
- data/lib/rails_ai_bridge/introspectors/model_introspector/method_extractor.rb +44 -0
- data/lib/rails_ai_bridge/introspectors/model_introspector/source_macro_extractor.rb +223 -0
- data/lib/rails_ai_bridge/introspectors/model_introspector.rb +8 -110
- data/lib/rails_ai_bridge/introspectors/model_semantic_enrichment.rb +9 -9
- data/lib/rails_ai_bridge/introspectors/non_ar_models_introspector.rb +3 -2
- data/lib/rails_ai_bridge/introspectors/route_introspector.rb +84 -40
- data/lib/rails_ai_bridge/introspectors/semantic_introspector.rb +2 -2
- data/lib/rails_ai_bridge/registry/frontmatter_parser.rb +80 -0
- data/lib/rails_ai_bridge/registry/pack_definition.rb +23 -0
- data/lib/rails_ai_bridge/registry/pack_detector.rb +107 -0
- data/lib/rails_ai_bridge/registry/pack_resolver.rb +202 -0
- data/lib/rails_ai_bridge/registry/rake_presenter.rb +93 -0
- data/lib/rails_ai_bridge/registry/registry_manifest.rb +52 -0
- data/lib/rails_ai_bridge/registry/resolver.rb +246 -0
- data/lib/rails_ai_bridge/registry/resolver_cache.rb +69 -0
- data/lib/rails_ai_bridge/registry/skill_source_resolver.rb +299 -0
- data/lib/rails_ai_bridge/registry/source_parser.rb +102 -0
- data/lib/rails_ai_bridge/registry/tile_manifest.rb +129 -0
- data/lib/rails_ai_bridge/registry/truncatable.rb +37 -0
- data/lib/rails_ai_bridge/registry.rb +105 -0
- data/lib/rails_ai_bridge/rubydex_adapter/incremental_indexer.rb +316 -0
- data/lib/rails_ai_bridge/rubydex_adapter/indexer.rb +9 -3
- data/lib/rails_ai_bridge/rubydex_adapter/method_counter.rb +7 -8
- data/lib/rails_ai_bridge/rubydex_adapter/serializer.rb +79 -34
- data/lib/rails_ai_bridge/rubydex_adapter.rb +110 -14
- data/lib/rails_ai_bridge/serializers/context_file_serializer.rb +101 -23
- data/lib/rails_ai_bridge/serializers/formatters/sections/semantic_formatter.rb +28 -17
- data/lib/rails_ai_bridge/serializers/providers/{windsurf_rules_serializer.rb → devin_rules_serializer.rb} +10 -10
- data/lib/rails_ai_bridge/serializers/providers/{windsurf_serializer.rb → devin_serializer.rb} +6 -6
- data/lib/rails_ai_bridge/serializers/providers/factory.rb +2 -2
- data/lib/rails_ai_bridge/serializers/providers/rules_serializer.rb +2 -83
- data/lib/rails_ai_bridge/server.rb +3 -1
- data/lib/rails_ai_bridge/tasks/rails_ai_bridge.rake +213 -39
- data/lib/rails_ai_bridge/tools/list_registry.rb +170 -0
- data/lib/rails_ai_bridge/tools/resolve_skill.rb +141 -0
- data/lib/rails_ai_bridge/tools/search_code/ripgrep_search.rb +116 -0
- data/lib/rails_ai_bridge/tools/search_code/ruby_search.rb +100 -0
- data/lib/rails_ai_bridge/tools/search_code/validator.rb +152 -0
- data/lib/rails_ai_bridge/tools/search_code.rb +30 -249
- data/lib/rails_ai_bridge/tools/search_semantic.rb +2 -2
- data/lib/rails_ai_bridge/version.rb +1 -1
- data/lib/rails_ai_bridge.rb +3 -0
- data/rails-ai-bridge.gemspec +4 -5
- data/server.json +1 -1
- metadata +61 -11
- data/docs/roadmap-context-assistants.md +0 -88
- data/docs/roadmap-mcp-v2.md +0 -45
- data/docs/roadmaps.md +0 -84
- data/resume.md +0 -181
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c78af79aba88ce31b9ea2d0f0c2de1e14782f5a0d2fbc9ccae9a879c86020ad8
|
|
4
|
+
data.tar.gz: 736de35b4fa3413752e77b3ebc37abf5628c697c7855561985031d7a06b53783
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
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/` —
|
|
13
|
-
- `lib/rails_ai_bridge/serializers/` — Output formatters (Codex, claude_rules, cursor_rules,
|
|
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/`, `.
|
|
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 -->
|