rails_console_ai 0.13.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 (44) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +95 -0
  3. data/LICENSE +21 -0
  4. data/README.md +328 -0
  5. data/app/controllers/rails_console_ai/application_controller.rb +28 -0
  6. data/app/controllers/rails_console_ai/sessions_controller.rb +16 -0
  7. data/app/helpers/rails_console_ai/sessions_helper.rb +56 -0
  8. data/app/models/rails_console_ai/session.rb +23 -0
  9. data/app/views/layouts/rails_console_ai/application.html.erb +84 -0
  10. data/app/views/rails_console_ai/sessions/index.html.erb +57 -0
  11. data/app/views/rails_console_ai/sessions/show.html.erb +66 -0
  12. data/config/routes.rb +4 -0
  13. data/lib/generators/rails_console_ai/install_generator.rb +26 -0
  14. data/lib/generators/rails_console_ai/templates/initializer.rb +79 -0
  15. data/lib/rails_console_ai/channel/base.rb +23 -0
  16. data/lib/rails_console_ai/channel/console.rb +457 -0
  17. data/lib/rails_console_ai/channel/slack.rb +182 -0
  18. data/lib/rails_console_ai/configuration.rb +185 -0
  19. data/lib/rails_console_ai/console_methods.rb +277 -0
  20. data/lib/rails_console_ai/context_builder.rb +120 -0
  21. data/lib/rails_console_ai/conversation_engine.rb +1142 -0
  22. data/lib/rails_console_ai/engine.rb +5 -0
  23. data/lib/rails_console_ai/executor.rb +461 -0
  24. data/lib/rails_console_ai/providers/anthropic.rb +122 -0
  25. data/lib/rails_console_ai/providers/base.rb +118 -0
  26. data/lib/rails_console_ai/providers/bedrock.rb +171 -0
  27. data/lib/rails_console_ai/providers/local.rb +112 -0
  28. data/lib/rails_console_ai/providers/openai.rb +114 -0
  29. data/lib/rails_console_ai/railtie.rb +34 -0
  30. data/lib/rails_console_ai/repl.rb +65 -0
  31. data/lib/rails_console_ai/safety_guards.rb +207 -0
  32. data/lib/rails_console_ai/session_logger.rb +90 -0
  33. data/lib/rails_console_ai/slack_bot.rb +473 -0
  34. data/lib/rails_console_ai/storage/base.rb +27 -0
  35. data/lib/rails_console_ai/storage/file_storage.rb +63 -0
  36. data/lib/rails_console_ai/tools/code_tools.rb +126 -0
  37. data/lib/rails_console_ai/tools/memory_tools.rb +136 -0
  38. data/lib/rails_console_ai/tools/model_tools.rb +95 -0
  39. data/lib/rails_console_ai/tools/registry.rb +478 -0
  40. data/lib/rails_console_ai/tools/schema_tools.rb +60 -0
  41. data/lib/rails_console_ai/version.rb +3 -0
  42. data/lib/rails_console_ai.rb +214 -0
  43. data/lib/tasks/rails_console_ai.rake +7 -0
  44. metadata +152 -0
@@ -0,0 +1,214 @@
1
+ require 'rails_console_ai/version'
2
+ require 'rails_console_ai/configuration'
3
+
4
+ module RailsConsoleAI
5
+ GUIDE_KEY = 'rails_console_ai.md'.freeze
6
+
7
+ class << self
8
+ def configuration
9
+ @configuration ||= Configuration.new
10
+ end
11
+
12
+ def configure
13
+ yield(configuration) if block_given?
14
+ end
15
+
16
+ def reset_configuration!
17
+ @configuration = Configuration.new
18
+ reset_storage!
19
+ end
20
+
21
+ def storage
22
+ @storage ||= begin
23
+ adapter = configuration.storage_adapter
24
+ if adapter
25
+ adapter
26
+ else
27
+ require 'rails_console_ai/storage/file_storage'
28
+ Storage::FileStorage.new
29
+ end
30
+ end
31
+ end
32
+
33
+ def reset_storage!
34
+ @storage = nil
35
+ end
36
+
37
+ def logger
38
+ @logger ||= if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
39
+ Rails.logger
40
+ else
41
+ require 'logger'
42
+ Logger.new($stderr, progname: 'RailsConsoleAI')
43
+ end
44
+ end
45
+
46
+ def logger=(log)
47
+ @logger = log
48
+ end
49
+
50
+ def current_user
51
+ @current_user
52
+ end
53
+
54
+ def current_user=(name)
55
+ @current_user = name
56
+ end
57
+
58
+ def status
59
+ c = configuration
60
+ key = c.resolved_api_key
61
+ masked_key = if key.nil? || key.empty? || key == 'no-key'
62
+ c.provider == :local ? "\e[32m(not required)\e[0m" : "\e[31m(not set)\e[0m"
63
+ else
64
+ key[0..6] + '...' + key[-4..-1]
65
+ end
66
+
67
+ lines = []
68
+ lines << "\e[36m[RailsConsoleAI v#{VERSION}]\e[0m"
69
+ lines << " Provider: #{c.provider}"
70
+ lines << " Model: #{c.resolved_model}"
71
+ lines << " API key: #{masked_key}"
72
+ lines << " Local URL: #{c.local_url}" if c.provider == :local
73
+ lines << " Max tokens: #{c.max_tokens || '(auto)'}"
74
+ lines << " Temperature: #{c.temperature}"
75
+ lines << " Timeout: #{c.timeout}s"
76
+ lines << " Max tool rounds:#{c.max_tool_rounds}"
77
+ lines << " Auto-execute: #{c.auto_execute}"
78
+ guards = c.safety_guards
79
+ if guards.empty?
80
+ lines << " Safe mode: \e[33m(no guards configured)\e[0m"
81
+ else
82
+ status = guards.enabled? ? "\e[32mON\e[0m" : "\e[31mOFF\e[0m"
83
+ lines << " Safe mode: #{status} (#{guards.names.join(', ')})"
84
+ end
85
+ lines << " Memories: #{c.memories_enabled}"
86
+ lines << " Session logging:#{session_table_status}"
87
+ lines << " Debug: #{c.debug}"
88
+ $stdout.puts lines.join("\n")
89
+ nil
90
+ end
91
+
92
+ def setup!
93
+ conn = session_connection
94
+ table = 'rails_console_ai_sessions'
95
+
96
+ if conn.table_exists?(table)
97
+ $stdout.puts "\e[32mRailsConsoleAI: #{table} already exists. Run RailsConsoleAI.teardown! first to recreate.\e[0m"
98
+ else
99
+ conn.create_table(table) do |t|
100
+ t.text :query, null: false
101
+ t.text :conversation, null: false
102
+ t.integer :input_tokens, default: 0
103
+ t.integer :output_tokens, default: 0
104
+ t.string :user_name, limit: 255
105
+ t.string :mode, limit: 20, null: false
106
+ t.text :code_executed
107
+ t.text :code_output
108
+ t.text :code_result
109
+ t.text :console_output
110
+ t.boolean :executed, default: false
111
+ t.string :provider, limit: 50
112
+ t.string :model, limit: 100
113
+ t.string :name, limit: 255
114
+ t.integer :duration_ms
115
+ t.datetime :created_at, null: false
116
+ end
117
+
118
+ conn.add_index(table, :created_at)
119
+ conn.add_index(table, :user_name)
120
+ conn.add_index(table, :name)
121
+
122
+ $stdout.puts "\e[32mRailsConsoleAI: created #{table} table.\e[0m"
123
+ end
124
+ rescue => e
125
+ $stderr.puts "\e[31mRailsConsoleAI setup failed: #{e.class}: #{e.message}\e[0m"
126
+ end
127
+
128
+ def migrate!
129
+ conn = session_connection
130
+ table = 'rails_console_ai_sessions'
131
+
132
+ unless conn.table_exists?(table)
133
+ $stderr.puts "\e[33mRailsConsoleAI: #{table} does not exist. Run RailsConsoleAI.setup! first.\e[0m"
134
+ return
135
+ end
136
+
137
+ migrations = []
138
+
139
+ unless conn.column_exists?(table, :name)
140
+ conn.add_column(table, :name, :string, limit: 255)
141
+ conn.add_index(table, :name) unless conn.index_exists?(table, :name)
142
+ migrations << 'name'
143
+ end
144
+
145
+ unless conn.column_exists?(table, :slack_thread_ts)
146
+ conn.add_column(table, :slack_thread_ts, :string, limit: 255)
147
+ conn.add_index(table, :slack_thread_ts) unless conn.index_exists?(table, :slack_thread_ts)
148
+ migrations << 'slack_thread_ts'
149
+ end
150
+
151
+ if migrations.empty?
152
+ $stdout.puts "\e[32mRailsConsoleAI: #{table} is up to date.\e[0m"
153
+ else
154
+ $stdout.puts "\e[32mRailsConsoleAI: added columns: #{migrations.join(', ')}.\e[0m"
155
+ end
156
+ rescue => e
157
+ $stderr.puts "\e[31mRailsConsoleAI migrate failed: #{e.class}: #{e.message}\e[0m"
158
+ end
159
+
160
+ def teardown!
161
+ conn = session_connection
162
+ table = 'rails_console_ai_sessions'
163
+
164
+ unless conn.table_exists?(table)
165
+ $stdout.puts "\e[33mRailsConsoleAI: #{table} does not exist, nothing to remove.\e[0m"
166
+ return
167
+ end
168
+
169
+ count = conn.select_value("SELECT COUNT(*) FROM #{conn.quote_table_name(table)}")
170
+ $stdout.print "\e[33mDrop #{table} (#{count} sessions)? [y/N] \e[0m"
171
+ answer = $stdin.gets.to_s.strip.downcase
172
+
173
+ unless answer == 'y' || answer == 'yes'
174
+ $stdout.puts "\e[33mCancelled.\e[0m"
175
+ return
176
+ end
177
+
178
+ conn.drop_table(table)
179
+ $stdout.puts "\e[32mRailsConsoleAI: dropped #{table}.\e[0m"
180
+ rescue => e
181
+ $stderr.puts "\e[31mRailsConsoleAI teardown failed: #{e.class}: #{e.message}\e[0m"
182
+ end
183
+
184
+ private
185
+
186
+ def session_table_status
187
+ return 'disabled' unless configuration.session_logging
188
+ conn = session_connection
189
+ if conn.table_exists?('rails_console_ai_sessions')
190
+ count = conn.select_value("SELECT COUNT(*) FROM #{conn.quote_table_name('rails_console_ai_sessions')}")
191
+ "\e[32m#{count} sessions\e[0m"
192
+ else
193
+ "\e[33mtable missing (run RailsConsoleAI.setup!)\e[0m"
194
+ end
195
+ rescue
196
+ "\e[33munavailable\e[0m"
197
+ end
198
+
199
+ def session_connection
200
+ klass = configuration.connection_class
201
+ if klass
202
+ klass = Object.const_get(klass) if klass.is_a?(String)
203
+ klass.connection
204
+ else
205
+ ActiveRecord::Base.connection
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ if defined?(Rails::Railtie)
212
+ require 'rails_console_ai/railtie'
213
+ require 'rails_console_ai/engine'
214
+ end
@@ -0,0 +1,7 @@
1
+ namespace :rails_console_ai do
2
+ desc "Start the RailsConsoleAI Slack bot (Socket Mode)"
3
+ task slack: :environment do
4
+ require 'rails_console_ai/slack_bot'
5
+ RailsConsoleAI::SlackBot.new.start
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_console_ai
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ platform: ruby
6
+ authors:
7
+ - Cortfr
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '5.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '5.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: faraday
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: webmock
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '12.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '12.0'
82
+ description: An LLM-powered agent for your Rails console. Ask questions in natural
83
+ language, get executable Ruby code.
84
+ email: cortfr@gmail.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - CHANGELOG.md
90
+ - LICENSE
91
+ - README.md
92
+ - app/controllers/rails_console_ai/application_controller.rb
93
+ - app/controllers/rails_console_ai/sessions_controller.rb
94
+ - app/helpers/rails_console_ai/sessions_helper.rb
95
+ - app/models/rails_console_ai/session.rb
96
+ - app/views/layouts/rails_console_ai/application.html.erb
97
+ - app/views/rails_console_ai/sessions/index.html.erb
98
+ - app/views/rails_console_ai/sessions/show.html.erb
99
+ - config/routes.rb
100
+ - lib/generators/rails_console_ai/install_generator.rb
101
+ - lib/generators/rails_console_ai/templates/initializer.rb
102
+ - lib/rails_console_ai.rb
103
+ - lib/rails_console_ai/channel/base.rb
104
+ - lib/rails_console_ai/channel/console.rb
105
+ - lib/rails_console_ai/channel/slack.rb
106
+ - lib/rails_console_ai/configuration.rb
107
+ - lib/rails_console_ai/console_methods.rb
108
+ - lib/rails_console_ai/context_builder.rb
109
+ - lib/rails_console_ai/conversation_engine.rb
110
+ - lib/rails_console_ai/engine.rb
111
+ - lib/rails_console_ai/executor.rb
112
+ - lib/rails_console_ai/providers/anthropic.rb
113
+ - lib/rails_console_ai/providers/base.rb
114
+ - lib/rails_console_ai/providers/bedrock.rb
115
+ - lib/rails_console_ai/providers/local.rb
116
+ - lib/rails_console_ai/providers/openai.rb
117
+ - lib/rails_console_ai/railtie.rb
118
+ - lib/rails_console_ai/repl.rb
119
+ - lib/rails_console_ai/safety_guards.rb
120
+ - lib/rails_console_ai/session_logger.rb
121
+ - lib/rails_console_ai/slack_bot.rb
122
+ - lib/rails_console_ai/storage/base.rb
123
+ - lib/rails_console_ai/storage/file_storage.rb
124
+ - lib/rails_console_ai/tools/code_tools.rb
125
+ - lib/rails_console_ai/tools/memory_tools.rb
126
+ - lib/rails_console_ai/tools/model_tools.rb
127
+ - lib/rails_console_ai/tools/registry.rb
128
+ - lib/rails_console_ai/tools/schema_tools.rb
129
+ - lib/rails_console_ai/version.rb
130
+ - lib/tasks/rails_console_ai.rake
131
+ homepage: https://github.com/cortfr/rails_console_ai
132
+ licenses:
133
+ - MIT
134
+ metadata: {}
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '2.5'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubygems_version: 3.6.7
150
+ specification_version: 4
151
+ summary: AI-powered Rails console assistant
152
+ test_files: []