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.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +76 -0
- data/.github/workflows/release.yml +24 -0
- data/.rubocop_todo.yml +122 -0
- data/CHANGELOG.md +9 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +140 -0
- data/Rakefile +12 -0
- data/exe/ruby_coded +6 -0
- data/lib/ruby_coded/auth/auth_manager.rb +145 -0
- data/lib/ruby_coded/auth/callback_servlet.rb +41 -0
- data/lib/ruby_coded/auth/credentials_store.rb +35 -0
- data/lib/ruby_coded/auth/oauth_callback_server.rb +38 -0
- data/lib/ruby_coded/auth/pkce.rb +19 -0
- data/lib/ruby_coded/auth/providers/anthropic.rb +32 -0
- data/lib/ruby_coded/auth/providers/openai.rb +55 -0
- data/lib/ruby_coded/chat/app/event_dispatch.rb +78 -0
- data/lib/ruby_coded/chat/app.rb +104 -0
- data/lib/ruby_coded/chat/command_handler/agent_commands.rb +53 -0
- data/lib/ruby_coded/chat/command_handler/history_commands.rb +38 -0
- data/lib/ruby_coded/chat/command_handler/model_commands.rb +91 -0
- data/lib/ruby_coded/chat/command_handler/plan_commands.rb +112 -0
- data/lib/ruby_coded/chat/command_handler/token_commands.rb +128 -0
- data/lib/ruby_coded/chat/command_handler/token_formatting.rb +26 -0
- data/lib/ruby_coded/chat/command_handler.rb +89 -0
- data/lib/ruby_coded/chat/help.txt +28 -0
- data/lib/ruby_coded/chat/input_handler/modal_inputs.rb +102 -0
- data/lib/ruby_coded/chat/input_handler/normal_mode_input.rb +116 -0
- data/lib/ruby_coded/chat/input_handler.rb +39 -0
- data/lib/ruby_coded/chat/llm_bridge/plan_mode.rb +73 -0
- data/lib/ruby_coded/chat/llm_bridge/streaming_retries.rb +86 -0
- data/lib/ruby_coded/chat/llm_bridge/tool_call_handling.rb +129 -0
- data/lib/ruby_coded/chat/llm_bridge.rb +131 -0
- data/lib/ruby_coded/chat/model_filter.rb +115 -0
- data/lib/ruby_coded/chat/plan_clarification_parser.rb +38 -0
- data/lib/ruby_coded/chat/renderer/chat_panel.rb +128 -0
- data/lib/ruby_coded/chat/renderer/chat_panel_input.rb +56 -0
- data/lib/ruby_coded/chat/renderer/chat_panel_thinking.rb +124 -0
- data/lib/ruby_coded/chat/renderer/model_selector.rb +96 -0
- data/lib/ruby_coded/chat/renderer/plan_clarifier.rb +112 -0
- data/lib/ruby_coded/chat/renderer/plan_clarifier_layout.rb +42 -0
- data/lib/ruby_coded/chat/renderer/status_bar.rb +47 -0
- data/lib/ruby_coded/chat/renderer.rb +64 -0
- data/lib/ruby_coded/chat/state/message_assistant.rb +77 -0
- data/lib/ruby_coded/chat/state/message_token_tracking.rb +57 -0
- data/lib/ruby_coded/chat/state/messages.rb +70 -0
- data/lib/ruby_coded/chat/state/model_selection.rb +79 -0
- data/lib/ruby_coded/chat/state/plan_tracking.rb +140 -0
- data/lib/ruby_coded/chat/state/scrollable.rb +42 -0
- data/lib/ruby_coded/chat/state/token_cost.rb +128 -0
- data/lib/ruby_coded/chat/state/tool_confirmation.rb +129 -0
- data/lib/ruby_coded/chat/state.rb +205 -0
- data/lib/ruby_coded/config/user_config.rb +110 -0
- data/lib/ruby_coded/errors/auth_error.rb +12 -0
- data/lib/ruby_coded/initializer/cover.rb +29 -0
- data/lib/ruby_coded/initializer.rb +52 -0
- data/lib/ruby_coded/plugins/base.rb +44 -0
- data/lib/ruby_coded/plugins/command_completion/input_extension.rb +30 -0
- data/lib/ruby_coded/plugins/command_completion/plugin.rb +27 -0
- data/lib/ruby_coded/plugins/command_completion/renderer_extension.rb +54 -0
- data/lib/ruby_coded/plugins/command_completion/state_extension.rb +90 -0
- data/lib/ruby_coded/plugins/registry.rb +88 -0
- data/lib/ruby_coded/plugins.rb +21 -0
- data/lib/ruby_coded/strategies/api_key_strategy.rb +39 -0
- data/lib/ruby_coded/strategies/base.rb +37 -0
- data/lib/ruby_coded/strategies/oauth_strategy.rb +106 -0
- data/lib/ruby_coded/tools/agent_cancelled_error.rb +7 -0
- data/lib/ruby_coded/tools/agent_iteration_limit_error.rb +7 -0
- data/lib/ruby_coded/tools/base_tool.rb +50 -0
- data/lib/ruby_coded/tools/create_directory_tool.rb +34 -0
- data/lib/ruby_coded/tools/delete_path_tool.rb +50 -0
- data/lib/ruby_coded/tools/edit_file_tool.rb +40 -0
- data/lib/ruby_coded/tools/list_directory_tool.rb +53 -0
- data/lib/ruby_coded/tools/plan_system_prompt.rb +72 -0
- data/lib/ruby_coded/tools/read_file_tool.rb +54 -0
- data/lib/ruby_coded/tools/registry.rb +66 -0
- data/lib/ruby_coded/tools/run_command_tool.rb +75 -0
- data/lib/ruby_coded/tools/system_prompt.rb +32 -0
- data/lib/ruby_coded/tools/tool_rejected_error.rb +7 -0
- data/lib/ruby_coded/tools/write_file_tool.rb +31 -0
- data/lib/ruby_coded/version.rb +10 -0
- data/lib/ruby_coded.rb +16 -0
- data/sig/ruby_coded.rbs +4 -0
- 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,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
|
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
|
data/sig/ruby_coded.rbs
ADDED
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: []
|