ruby_coded 0.1.1

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 (85) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +76 -0
  3. data/.github/workflows/release.yml +24 -0
  4. data/.rubocop_todo.yml +122 -0
  5. data/CHANGELOG.md +9 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +140 -0
  9. data/Rakefile +12 -0
  10. data/exe/ruby_coded +6 -0
  11. data/lib/ruby_coded/auth/auth_manager.rb +145 -0
  12. data/lib/ruby_coded/auth/callback_servlet.rb +41 -0
  13. data/lib/ruby_coded/auth/credentials_store.rb +35 -0
  14. data/lib/ruby_coded/auth/oauth_callback_server.rb +38 -0
  15. data/lib/ruby_coded/auth/pkce.rb +19 -0
  16. data/lib/ruby_coded/auth/providers/anthropic.rb +32 -0
  17. data/lib/ruby_coded/auth/providers/openai.rb +55 -0
  18. data/lib/ruby_coded/chat/app/event_dispatch.rb +78 -0
  19. data/lib/ruby_coded/chat/app.rb +104 -0
  20. data/lib/ruby_coded/chat/command_handler/agent_commands.rb +53 -0
  21. data/lib/ruby_coded/chat/command_handler/history_commands.rb +38 -0
  22. data/lib/ruby_coded/chat/command_handler/model_commands.rb +91 -0
  23. data/lib/ruby_coded/chat/command_handler/plan_commands.rb +112 -0
  24. data/lib/ruby_coded/chat/command_handler/token_commands.rb +128 -0
  25. data/lib/ruby_coded/chat/command_handler/token_formatting.rb +26 -0
  26. data/lib/ruby_coded/chat/command_handler.rb +89 -0
  27. data/lib/ruby_coded/chat/help.txt +28 -0
  28. data/lib/ruby_coded/chat/input_handler/modal_inputs.rb +102 -0
  29. data/lib/ruby_coded/chat/input_handler/normal_mode_input.rb +116 -0
  30. data/lib/ruby_coded/chat/input_handler.rb +39 -0
  31. data/lib/ruby_coded/chat/llm_bridge/plan_mode.rb +73 -0
  32. data/lib/ruby_coded/chat/llm_bridge/streaming_retries.rb +86 -0
  33. data/lib/ruby_coded/chat/llm_bridge/tool_call_handling.rb +129 -0
  34. data/lib/ruby_coded/chat/llm_bridge.rb +131 -0
  35. data/lib/ruby_coded/chat/model_filter.rb +115 -0
  36. data/lib/ruby_coded/chat/plan_clarification_parser.rb +38 -0
  37. data/lib/ruby_coded/chat/renderer/chat_panel.rb +128 -0
  38. data/lib/ruby_coded/chat/renderer/chat_panel_input.rb +56 -0
  39. data/lib/ruby_coded/chat/renderer/chat_panel_thinking.rb +124 -0
  40. data/lib/ruby_coded/chat/renderer/model_selector.rb +96 -0
  41. data/lib/ruby_coded/chat/renderer/plan_clarifier.rb +112 -0
  42. data/lib/ruby_coded/chat/renderer/plan_clarifier_layout.rb +42 -0
  43. data/lib/ruby_coded/chat/renderer/status_bar.rb +47 -0
  44. data/lib/ruby_coded/chat/renderer.rb +64 -0
  45. data/lib/ruby_coded/chat/state/message_assistant.rb +77 -0
  46. data/lib/ruby_coded/chat/state/message_token_tracking.rb +57 -0
  47. data/lib/ruby_coded/chat/state/messages.rb +70 -0
  48. data/lib/ruby_coded/chat/state/model_selection.rb +79 -0
  49. data/lib/ruby_coded/chat/state/plan_tracking.rb +140 -0
  50. data/lib/ruby_coded/chat/state/scrollable.rb +42 -0
  51. data/lib/ruby_coded/chat/state/token_cost.rb +128 -0
  52. data/lib/ruby_coded/chat/state/tool_confirmation.rb +129 -0
  53. data/lib/ruby_coded/chat/state.rb +205 -0
  54. data/lib/ruby_coded/config/user_config.rb +110 -0
  55. data/lib/ruby_coded/errors/auth_error.rb +12 -0
  56. data/lib/ruby_coded/initializer/cover.rb +29 -0
  57. data/lib/ruby_coded/initializer.rb +52 -0
  58. data/lib/ruby_coded/plugins/base.rb +44 -0
  59. data/lib/ruby_coded/plugins/command_completion/input_extension.rb +30 -0
  60. data/lib/ruby_coded/plugins/command_completion/plugin.rb +27 -0
  61. data/lib/ruby_coded/plugins/command_completion/renderer_extension.rb +54 -0
  62. data/lib/ruby_coded/plugins/command_completion/state_extension.rb +90 -0
  63. data/lib/ruby_coded/plugins/registry.rb +88 -0
  64. data/lib/ruby_coded/plugins.rb +21 -0
  65. data/lib/ruby_coded/strategies/api_key_strategy.rb +39 -0
  66. data/lib/ruby_coded/strategies/base.rb +37 -0
  67. data/lib/ruby_coded/strategies/oauth_strategy.rb +106 -0
  68. data/lib/ruby_coded/tools/agent_cancelled_error.rb +7 -0
  69. data/lib/ruby_coded/tools/agent_iteration_limit_error.rb +7 -0
  70. data/lib/ruby_coded/tools/base_tool.rb +50 -0
  71. data/lib/ruby_coded/tools/create_directory_tool.rb +34 -0
  72. data/lib/ruby_coded/tools/delete_path_tool.rb +50 -0
  73. data/lib/ruby_coded/tools/edit_file_tool.rb +40 -0
  74. data/lib/ruby_coded/tools/list_directory_tool.rb +53 -0
  75. data/lib/ruby_coded/tools/plan_system_prompt.rb +72 -0
  76. data/lib/ruby_coded/tools/read_file_tool.rb +54 -0
  77. data/lib/ruby_coded/tools/registry.rb +66 -0
  78. data/lib/ruby_coded/tools/run_command_tool.rb +75 -0
  79. data/lib/ruby_coded/tools/system_prompt.rb +32 -0
  80. data/lib/ruby_coded/tools/tool_rejected_error.rb +7 -0
  81. data/lib/ruby_coded/tools/write_file_tool.rb +31 -0
  82. data/lib/ruby_coded/version.rb +10 -0
  83. data/lib/ruby_coded.rb +16 -0
  84. data/sig/ruby_coded.rbs +4 -0
  85. metadata +206 -0
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "read_file_tool"
4
+ require_relative "list_directory_tool"
5
+ require_relative "write_file_tool"
6
+ require_relative "edit_file_tool"
7
+ require_relative "create_directory_tool"
8
+ require_relative "delete_path_tool"
9
+ require_relative "run_command_tool"
10
+
11
+ module RubyCoded
12
+ module Tools
13
+ # Builds and manages the set of tools available to the LLM in agentic mode.
14
+ class Registry
15
+ READONLY_TOOL_CLASSES = [
16
+ ReadFileTool,
17
+ ListDirectoryTool
18
+ ].freeze
19
+
20
+ TOOL_CLASSES = [
21
+ *READONLY_TOOL_CLASSES,
22
+ WriteFileTool,
23
+ EditFileTool,
24
+ CreateDirectoryTool,
25
+ DeletePathTool,
26
+ RunCommandTool
27
+ ].freeze
28
+
29
+ def initialize(project_root:)
30
+ @project_root = project_root
31
+ end
32
+
33
+ def build_tools
34
+ @build_tools ||= TOOL_CLASSES.map { |klass| klass.new(project_root: @project_root) }
35
+ end
36
+
37
+ def build_readonly_tools
38
+ @build_readonly_tools ||= READONLY_TOOL_CLASSES.map { |klass| klass.new(project_root: @project_root) }
39
+ end
40
+
41
+ def safe_tool?(tool_call_name)
42
+ klass = find_tool_class(tool_call_name)
43
+ klass && klass.risk_level == BaseTool::SAFE_RISK
44
+ end
45
+
46
+ def risk_level_for(tool_call_name)
47
+ klass = find_tool_class(tool_call_name)
48
+ klass&.risk_level || BaseTool::DANGEROUS_RISK
49
+ end
50
+
51
+ private
52
+
53
+ # RubyLLM may send the tool name as the short form ("read_file_tool")
54
+ # or the full namespaced form ("ruby_coded--tools--read_file_tool").
55
+ # Match on the short class-derived name against the last segment.
56
+ def find_tool_class(tool_call_name)
57
+ short = tool_call_name.split("--").last
58
+ TOOL_CLASSES.find { |k| [short, tool_call_name].include?(tool_name_for(k)) }
59
+ end
60
+
61
+ def tool_name_for(klass)
62
+ klass.name.split("::").last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require_relative "base_tool"
5
+
6
+ module RubyCoded
7
+ module Tools
8
+ # Execute a shell command in the project directory and return its output
9
+ class RunCommandTool < BaseTool
10
+ description "Execute a shell command in the project directory and return its output"
11
+ risk :dangerous
12
+
13
+ TIMEOUT_SECONDS = 30
14
+ MAX_OUTPUT_CHARS = 5000
15
+
16
+ params do
17
+ string :command, description: "The shell command to execute"
18
+ end
19
+
20
+ def execute(command:)
21
+ stdout, stderr, status = run_with_timeout(command)
22
+
23
+ output = String.new
24
+ output << stdout unless stdout.empty?
25
+ output << "\nSTDERR:\n#{stderr}" unless stderr.empty?
26
+ output << "\nExit code: #{status.exitstatus}"
27
+
28
+ truncate_output(output)
29
+ rescue Errno::ENOENT => e
30
+ { error: "Command not found: #{e.message}" }
31
+ rescue StandardError => e
32
+ { error: "Command failed: #{e.message}" }
33
+ end
34
+
35
+ private
36
+
37
+ def run_with_timeout(command)
38
+ stdin, stdout_io, stderr_io, wait_thr = Open3.popen3(command, chdir: @project_root)
39
+ stdin.close
40
+
41
+ unless wait_thr.join(TIMEOUT_SECONDS)
42
+ kill_process(wait_thr.pid)
43
+ raise StandardError, "Command timed out after #{TIMEOUT_SECONDS} seconds"
44
+ end
45
+
46
+ [stdout_io.read, stderr_io.read, wait_thr.value]
47
+ ensure
48
+ [stdin, stdout_io, stderr_io].each { |io| io&.close unless io&.closed? }
49
+ end
50
+
51
+ def kill_process(pid)
52
+ Process.kill("TERM", pid)
53
+ sleep(0.5)
54
+ Process.kill("KILL", pid) if process_alive?(pid)
55
+ rescue Errno::ESRCH, Errno::EPERM
56
+ # Process already exited or not accessible
57
+ end
58
+
59
+ def process_alive?(pid)
60
+ Process.kill(0, pid)
61
+ true
62
+ rescue Errno::ESRCH, Errno::EPERM
63
+ false
64
+ end
65
+
66
+ def truncate_output(output)
67
+ if output.length > MAX_OUTPUT_CHARS
68
+ "#{output[0, MAX_OUTPUT_CHARS]}...(truncated, #{output.length} total characters)"
69
+ else
70
+ output
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyCoded
4
+ module Tools
5
+ module SystemPrompt # :nodoc:
6
+ TEMPLATE = <<~PROMPT
7
+ You are a coding assistant with access to the project directory: %<project_root>s
8
+
9
+ You have tools to interact with the file system. Use them when the user asks you to read, explore, create, modify, or delete files and directories.
10
+
11
+ Guidelines:
12
+ - Always use paths relative to the project root.
13
+ - Before making changes, read the relevant files to understand the current state.
14
+ - Explain what you plan to do before doing it.
15
+ - The user will be asked to confirm destructive operations (write, edit, delete).
16
+ - When listing directories, start with the project root to orient yourself.
17
+ - Be concise in your explanations but thorough in your actions.
18
+
19
+ Efficiency:
20
+ - You have a budget of %<max_write_rounds>d write/edit/delete tool calls that auto-resets when reached, and a hard limit of %<max_total_rounds>d total tool calls per request.
21
+ - Read operations (read_file, list_directory) do not count toward the write budget.
22
+ - Use edit_file for targeted changes — avoid rewriting entire files unnecessarily.
23
+ - If you receive a warning about approaching the total limit, wrap up the most critical changes first.
24
+ PROMPT
25
+
26
+ def self.build(project_root:, max_write_rounds: 50, max_total_rounds: 200)
27
+ format(TEMPLATE, project_root: project_root, max_write_rounds: max_write_rounds,
28
+ max_total_rounds: max_total_rounds)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyCoded
4
+ module Tools
5
+ class ToolRejectedError < StandardError; end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_tool"
4
+
5
+ module RubyCoded
6
+ module Tools
7
+ # Create a new file or overwrite an existing file with the given content
8
+ class WriteFileTool < BaseTool
9
+ description "Create a new file or overwrite an existing file with the given content"
10
+ risk :confirm
11
+
12
+ params do
13
+ string :path, description: "Relative file path from the project root"
14
+ string :content, description: "The full content to write into the file"
15
+ end
16
+
17
+ def execute(path:, content:)
18
+ full_path = validate_path!(path)
19
+ return full_path if full_path.is_a?(Hash)
20
+
21
+ dir = File.dirname(full_path)
22
+ FileUtils.mkdir_p(dir) unless File.directory?(dir)
23
+
24
+ File.write(full_path, content)
25
+ "File written: #{path} (#{content.bytesize} bytes)"
26
+ rescue SystemCallError => e
27
+ { error: "Failed to write #{path}: #{e.message}" }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This module contains the version of the RubyCoded gem
4
+ module RubyCoded
5
+ VERSION = "0.1.1"
6
+
7
+ def self.gem_version
8
+ Gem::Version.new(VERSION).freeze
9
+ end
10
+ end
data/lib/ruby_coded.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ruby_coded/version"
4
+ require_relative "ruby_coded/config/user_config"
5
+ require_relative "ruby_coded/auth/auth_manager"
6
+ require_relative "ruby_coded/initializer"
7
+ require_relative "ruby_coded/plugins"
8
+
9
+ raise "This gem requires Ruby 3.3.0 or higher" if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.3.0")
10
+
11
+ # Main module for the RubyCoded gem
12
+ module RubyCoded
13
+ def self.start
14
+ Initializer.new
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module RubyCoded
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_coded
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Cesar Rodriguez
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2026-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ratatui_ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby_llm
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.13'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.13'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-prompt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: unicode-display_width
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webrick
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: RubyCoded is a terminal-based AI coding assistant built in Ruby. It provides
84
+ a full TUI chat interface with support for multiple LLM providers (OpenAI, Anthropic,
85
+ etc.), an agent mode with filesystem tools for reading, writing, and editing project
86
+ files, a plan mode for structured task planning, and a plugin system for extensibility.
87
+ email:
88
+ - cesar.rodriguez.lara54@gmail.com
89
+ executables:
90
+ - ruby_coded
91
+ extensions: []
92
+ extra_rdoc_files: []
93
+ files:
94
+ - ".github/workflows/ci.yml"
95
+ - ".github/workflows/release.yml"
96
+ - ".rubocop_todo.yml"
97
+ - CHANGELOG.md
98
+ - CODE_OF_CONDUCT.md
99
+ - LICENSE.txt
100
+ - README.md
101
+ - Rakefile
102
+ - exe/ruby_coded
103
+ - lib/ruby_coded.rb
104
+ - lib/ruby_coded/auth/auth_manager.rb
105
+ - lib/ruby_coded/auth/callback_servlet.rb
106
+ - lib/ruby_coded/auth/credentials_store.rb
107
+ - lib/ruby_coded/auth/oauth_callback_server.rb
108
+ - lib/ruby_coded/auth/pkce.rb
109
+ - lib/ruby_coded/auth/providers/anthropic.rb
110
+ - lib/ruby_coded/auth/providers/openai.rb
111
+ - lib/ruby_coded/chat/app.rb
112
+ - lib/ruby_coded/chat/app/event_dispatch.rb
113
+ - lib/ruby_coded/chat/command_handler.rb
114
+ - lib/ruby_coded/chat/command_handler/agent_commands.rb
115
+ - lib/ruby_coded/chat/command_handler/history_commands.rb
116
+ - lib/ruby_coded/chat/command_handler/model_commands.rb
117
+ - lib/ruby_coded/chat/command_handler/plan_commands.rb
118
+ - lib/ruby_coded/chat/command_handler/token_commands.rb
119
+ - lib/ruby_coded/chat/command_handler/token_formatting.rb
120
+ - lib/ruby_coded/chat/help.txt
121
+ - lib/ruby_coded/chat/input_handler.rb
122
+ - lib/ruby_coded/chat/input_handler/modal_inputs.rb
123
+ - lib/ruby_coded/chat/input_handler/normal_mode_input.rb
124
+ - lib/ruby_coded/chat/llm_bridge.rb
125
+ - lib/ruby_coded/chat/llm_bridge/plan_mode.rb
126
+ - lib/ruby_coded/chat/llm_bridge/streaming_retries.rb
127
+ - lib/ruby_coded/chat/llm_bridge/tool_call_handling.rb
128
+ - lib/ruby_coded/chat/model_filter.rb
129
+ - lib/ruby_coded/chat/plan_clarification_parser.rb
130
+ - lib/ruby_coded/chat/renderer.rb
131
+ - lib/ruby_coded/chat/renderer/chat_panel.rb
132
+ - lib/ruby_coded/chat/renderer/chat_panel_input.rb
133
+ - lib/ruby_coded/chat/renderer/chat_panel_thinking.rb
134
+ - lib/ruby_coded/chat/renderer/model_selector.rb
135
+ - lib/ruby_coded/chat/renderer/plan_clarifier.rb
136
+ - lib/ruby_coded/chat/renderer/plan_clarifier_layout.rb
137
+ - lib/ruby_coded/chat/renderer/status_bar.rb
138
+ - lib/ruby_coded/chat/state.rb
139
+ - lib/ruby_coded/chat/state/message_assistant.rb
140
+ - lib/ruby_coded/chat/state/message_token_tracking.rb
141
+ - lib/ruby_coded/chat/state/messages.rb
142
+ - lib/ruby_coded/chat/state/model_selection.rb
143
+ - lib/ruby_coded/chat/state/plan_tracking.rb
144
+ - lib/ruby_coded/chat/state/scrollable.rb
145
+ - lib/ruby_coded/chat/state/token_cost.rb
146
+ - lib/ruby_coded/chat/state/tool_confirmation.rb
147
+ - lib/ruby_coded/config/user_config.rb
148
+ - lib/ruby_coded/errors/auth_error.rb
149
+ - lib/ruby_coded/initializer.rb
150
+ - lib/ruby_coded/initializer/cover.rb
151
+ - lib/ruby_coded/plugins.rb
152
+ - lib/ruby_coded/plugins/base.rb
153
+ - lib/ruby_coded/plugins/command_completion/input_extension.rb
154
+ - lib/ruby_coded/plugins/command_completion/plugin.rb
155
+ - lib/ruby_coded/plugins/command_completion/renderer_extension.rb
156
+ - lib/ruby_coded/plugins/command_completion/state_extension.rb
157
+ - lib/ruby_coded/plugins/registry.rb
158
+ - lib/ruby_coded/strategies/api_key_strategy.rb
159
+ - lib/ruby_coded/strategies/base.rb
160
+ - lib/ruby_coded/strategies/oauth_strategy.rb
161
+ - lib/ruby_coded/tools/agent_cancelled_error.rb
162
+ - lib/ruby_coded/tools/agent_iteration_limit_error.rb
163
+ - lib/ruby_coded/tools/base_tool.rb
164
+ - lib/ruby_coded/tools/create_directory_tool.rb
165
+ - lib/ruby_coded/tools/delete_path_tool.rb
166
+ - lib/ruby_coded/tools/edit_file_tool.rb
167
+ - lib/ruby_coded/tools/list_directory_tool.rb
168
+ - lib/ruby_coded/tools/plan_system_prompt.rb
169
+ - lib/ruby_coded/tools/read_file_tool.rb
170
+ - lib/ruby_coded/tools/registry.rb
171
+ - lib/ruby_coded/tools/run_command_tool.rb
172
+ - lib/ruby_coded/tools/system_prompt.rb
173
+ - lib/ruby_coded/tools/tool_rejected_error.rb
174
+ - lib/ruby_coded/tools/write_file_tool.rb
175
+ - lib/ruby_coded/version.rb
176
+ - sig/ruby_coded.rbs
177
+ homepage: https://github.com/MrCesar107/ruby_code
178
+ licenses:
179
+ - MIT
180
+ metadata:
181
+ allowed_push_host: https://rubygems.org
182
+ homepage_uri: https://github.com/MrCesar107/ruby_code
183
+ source_code_uri: https://github.com/MrCesar107/ruby_code
184
+ changelog_uri: https://github.com/MrCesar107/ruby_code/blob/main/CHANGELOG.md
185
+ rubygems_mfa_required: 'true'
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 3.3.0
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubygems_version: 3.5.22
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: AI-powered terminal coding assistant with agent mode, plan mode, and multi-provider
205
+ LLM support.
206
+ test_files: []