Module: Roast::Tools::CodingAgent

Extended by:
CodingAgent
Includes:
Helpers::MetadataAccess
Included in:
CodingAgent
Defined in:
lib/roast/tools/coding_agent.rb

Defined Under Namespace

Classes: CodingAgentError

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::MetadataAccess

#set_current_step_metadata, #step_metadata

Class Attribute Details

.configured_commandObject

Returns the value of attribute configured_command.



18
19
20
# File 'lib/roast/tools/coding_agent.rb', line 18

def configured_command
  @configured_command
end

.configured_optionsObject

Returns the value of attribute configured_options.



18
19
20
# File 'lib/roast/tools/coding_agent.rb', line 18

def configured_options
  @configured_options
end

Class Method Details

.included(base) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/roast/tools/coding_agent.rb', line 20

def included(base)
  base.class_eval do
    function(
      :coding_agent,
      "AI-powered coding agent that runs an instance of the Claude Code agent with the given prompt. If the agent is iterating on previous work, set continue to true.",
      prompt: { type: "string", description: "The prompt to send to Claude Code" },
      include_context_summary: { type: "boolean", description: "Whether to set a summary of the current workflow context as system directive (default: false)", required: false },
      continue: { type: "boolean", description: "Whether to continue where the previous coding agent left off or start with a fresh context (default: false, start fresh)", required: false },
      retries: { type: "integer", description: "Number of times to retry the coding agent invocation if it terminates with an error (default: 0, no retry)", required: false },
    ) do |params|
      Roast::Tools::CodingAgent.call(
        params[:prompt],
        include_context_summary: params[:include_context_summary].presence || false,
        continue: params[:continue].presence || false,
        retries: params[:retries],
      )
    end
  end
end

.post_configuration_setup(base, config = {}) ⇒ Object

Called after configuration is loaded



41
42
43
44
45
# File 'lib/roast/tools/coding_agent.rb', line 41

def post_configuration_setup(base, config = {})
  self.configured_command = config[CONFIG_CODING_AGENT_COMMAND]
  # Store any other configuration options (like model)
  self.configured_options = config.except(CONFIG_CODING_AGENT_COMMAND)
end

Instance Method Details

#call(prompt, include_context_summary: false, continue: false, retries: nil) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/roast/tools/coding_agent.rb', line 48

def call(prompt, include_context_summary: false, continue: false, retries: nil)
  # Use configured retries as default, fall back to 0 if not configured
  retries ||= CodingAgent.configured_options[:retries] || CodingAgent.configured_options["retries"] || 0
  (retries + 1).times do |iteration|
    Roast::Helpers::Logger.info("🤖 Running CodingAgent#{iteration > 0 ? ", attempt #{iteration + 1} of #{retries + 1}" : ""}\n")
    return run_claude_code(prompt, include_context_summary:, continue:)
  rescue CodingAgentError => e
    raise e if iteration >= retries

    Roast::Helpers::Logger.warn("🤖 Retrying after error running CodingAgent: #{e.message}")
    Roast::Helpers::Logger.debug(e.backtrace.join("\n") + "\n") if ENV["DEBUG"]
  end
  Roast::Helpers::Logger.error("🤖 CodingAgent did not complete successfully after multiple retries")
rescue StandardError => e
  "🤖 Error running CodingAgent: #{e.message}".tap do |error_message|
    Roast::Helpers::Logger.error(error_message + "\n")
    Roast::Helpers::Logger.debug(e.backtrace.join("\n") + "\n") if ENV["DEBUG"]
  end
end