roast-ai 0.2.0 → 0.2.2
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/.github/workflows/ci.yaml +5 -1
- data/.gitignore +29 -1
- data/CHANGELOG.md +36 -0
- data/CLAUDE.md +5 -0
- data/CLAUDE_NOTES.md +68 -0
- data/Gemfile.lock +3 -4
- data/README.md +235 -10
- data/docs/ITERATION_SYNTAX.md +31 -3
- data/examples/case_when/README.md +58 -0
- data/examples/case_when/detect_language/prompt.md +16 -0
- data/examples/case_when/workflow.yml +58 -0
- data/examples/direct_coerce_syntax/README.md +32 -0
- data/examples/direct_coerce_syntax/workflow.yml +36 -0
- data/examples/grading/generate_recommendations/output.txt +6 -6
- data/examples/grading/workflow.yml +6 -4
- data/examples/json_handling/README.md +32 -0
- data/examples/json_handling/workflow.yml +52 -0
- data/examples/pre_post_processing/README.md +111 -0
- data/examples/pre_post_processing/analyze_test_file/prompt.md +23 -0
- data/examples/pre_post_processing/improve_test_coverage/prompt.md +17 -0
- data/examples/pre_post_processing/optimize_test_performance/prompt.md +25 -0
- data/examples/pre_post_processing/post_processing/aggregate_metrics/prompt.md +31 -0
- data/examples/pre_post_processing/post_processing/cleanup_environment/prompt.md +28 -0
- data/examples/pre_post_processing/post_processing/generate_summary_report/prompt.md +32 -0
- data/examples/pre_post_processing/post_processing/output.txt +24 -0
- data/examples/pre_post_processing/pre_processing/gather_baseline_metrics/prompt.md +26 -0
- data/examples/pre_post_processing/pre_processing/setup_test_environment/prompt.md +11 -0
- data/examples/pre_post_processing/validate_changes/prompt.md +24 -0
- data/examples/pre_post_processing/workflow.yml +21 -0
- data/examples/single_target_prepost/README.md +36 -0
- data/examples/single_target_prepost/post_processing/output.txt +27 -0
- data/examples/single_target_prepost/pre_processing/gather_dependencies/prompt.md +11 -0
- data/examples/single_target_prepost/workflow.yml +20 -0
- data/examples/smart_coercion_defaults/README.md +65 -0
- data/examples/smart_coercion_defaults/workflow.yml +44 -0
- data/examples/step_configuration/README.md +87 -0
- data/examples/step_configuration/workflow.yml +60 -0
- data/gemfiles/activesupport7.gemfile +4 -0
- data/gemfiles/activesupport8.gemfile +4 -0
- data/lib/roast/tools/grep.rb +13 -4
- data/lib/roast/tools/search_file.rb +2 -2
- data/lib/roast/tools.rb +16 -1
- data/lib/roast/value_objects/uri_base.rb +49 -0
- data/lib/roast/value_objects.rb +1 -0
- data/lib/roast/version.rb +1 -1
- data/lib/roast/workflow/api_configuration.rb +9 -1
- data/lib/roast/workflow/base_iteration_step.rb +22 -3
- data/lib/roast/workflow/base_step.rb +40 -3
- data/lib/roast/workflow/base_workflow.rb +4 -1
- data/lib/roast/workflow/case_executor.rb +49 -0
- data/lib/roast/workflow/case_step.rb +82 -0
- data/lib/roast/workflow/command_executor.rb +5 -2
- data/lib/roast/workflow/conditional_step.rb +6 -43
- data/lib/roast/workflow/configuration.rb +4 -2
- data/lib/roast/workflow/configuration_loader.rb +14 -0
- data/lib/roast/workflow/error_handler.rb +18 -0
- data/lib/roast/workflow/expression_evaluator.rb +86 -0
- data/lib/roast/workflow/iteration_executor.rb +18 -0
- data/lib/roast/workflow/prompt_step.rb +4 -1
- data/lib/roast/workflow/repeat_step.rb +2 -2
- data/lib/roast/workflow/step_executor_coordinator.rb +50 -8
- data/lib/roast/workflow/step_loader.rb +21 -7
- data/lib/roast/workflow/step_type_resolver.rb +16 -0
- data/lib/roast/workflow/workflow_execution_context.rb +39 -0
- data/lib/roast/workflow/workflow_executor.rb +22 -2
- data/lib/roast/workflow/workflow_initializer.rb +11 -2
- data/lib/roast/workflow/workflow_runner.rb +127 -5
- data/lib/roast/workflow.rb +1 -0
- data/lib/roast.rb +7 -1
- data/roast.gemspec +1 -1
- data/schema/workflow.json +41 -0
- metadata +40 -5
@@ -48,10 +48,30 @@ module Roast
|
|
48
48
|
|
49
49
|
delegate :workflow, :config_hash, :context_path, to: :context
|
50
50
|
|
51
|
+
# Initialize a new WorkflowExecutor
|
52
|
+
#
|
53
|
+
# @param workflow [BaseWorkflow] The workflow instance to execute
|
54
|
+
# @param config_hash [Hash] The workflow configuration
|
55
|
+
# @param context_path [String] The base path for the workflow
|
56
|
+
# @param error_handler [ErrorHandler] Optional custom error handler
|
57
|
+
# @param step_loader [StepLoader] Optional custom step loader
|
58
|
+
# @param command_executor [CommandExecutor] Optional custom command executor
|
59
|
+
# @param interpolator [Interpolator] Optional custom interpolator
|
60
|
+
# @param state_manager [StateManager] Optional custom state manager
|
61
|
+
# @param iteration_executor [IterationExecutor] Optional custom iteration executor
|
62
|
+
# @param conditional_executor [ConditionalExecutor] Optional custom conditional executor
|
63
|
+
# @param step_orchestrator [StepOrchestrator] Optional custom step orchestrator
|
64
|
+
# @param step_executor_coordinator [StepExecutorCoordinator] Optional custom step executor coordinator
|
65
|
+
# @param phase [Symbol] The execution phase - determines where to load steps from
|
66
|
+
# Valid values:
|
67
|
+
# - :steps (default) - Load steps from the main steps directory
|
68
|
+
# - :pre_processing - Load steps from the pre_processing directory
|
69
|
+
# - :post_processing - Load steps from the post_processing directory
|
51
70
|
def initialize(workflow, config_hash, context_path,
|
52
71
|
error_handler: nil, step_loader: nil, command_executor: nil,
|
53
72
|
interpolator: nil, state_manager: nil, iteration_executor: nil,
|
54
|
-
conditional_executor: nil, step_orchestrator: nil, step_executor_coordinator: nil
|
73
|
+
conditional_executor: nil, step_orchestrator: nil, step_executor_coordinator: nil,
|
74
|
+
phase: :steps)
|
55
75
|
# Create context object to reduce data clump
|
56
76
|
@context = WorkflowContext.new(
|
57
77
|
workflow: workflow,
|
@@ -61,7 +81,7 @@ module Roast
|
|
61
81
|
|
62
82
|
# Dependencies with defaults
|
63
83
|
@error_handler = error_handler || ErrorHandler.new
|
64
|
-
@step_loader = step_loader || StepLoader.new(workflow, config_hash, context_path)
|
84
|
+
@step_loader = step_loader || StepLoader.new(workflow, config_hash, context_path, phase: phase)
|
65
85
|
@command_executor = command_executor || CommandExecutor.new(logger: @error_handler)
|
66
86
|
@interpolator = interpolator || Interpolator.new(workflow, logger: @error_handler)
|
67
87
|
@state_manager = state_manager || StateManager.new(workflow, logger: @error_handler)
|
@@ -81,11 +81,19 @@ module Roast
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
def client_options
|
85
|
+
{
|
86
|
+
access_token: @configuration.api_token,
|
87
|
+
uri_base: @configuration.uri_base&.to_s,
|
88
|
+
}.compact
|
89
|
+
end
|
90
|
+
|
84
91
|
def configure_openrouter_client
|
85
92
|
$stderr.puts "Configuring OpenRouter client with token from workflow"
|
86
93
|
require "open_router"
|
87
94
|
|
88
|
-
client = OpenRouter::Client.new(
|
95
|
+
client = OpenRouter::Client.new(client_options)
|
96
|
+
|
89
97
|
Raix.configure do |config|
|
90
98
|
config.openrouter_client = client
|
91
99
|
end
|
@@ -96,7 +104,8 @@ module Roast
|
|
96
104
|
$stderr.puts "Configuring OpenAI client with token from workflow"
|
97
105
|
require "openai"
|
98
106
|
|
99
|
-
client = OpenAI::Client.new(
|
107
|
+
client = OpenAI::Client.new(client_options)
|
108
|
+
|
100
109
|
Raix.configure do |config|
|
101
110
|
config.openai_client = client
|
102
111
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/notifications"
|
4
|
+
require "erb"
|
4
5
|
require "roast/workflow/replay_handler"
|
5
6
|
require "roast/workflow/workflow_executor"
|
6
7
|
require "roast/workflow/output_handler"
|
7
8
|
require "roast/workflow/base_workflow"
|
9
|
+
require "roast/workflow/dot_access_hash"
|
8
10
|
|
9
11
|
module Roast
|
10
12
|
module Workflow
|
@@ -14,6 +16,7 @@ module Roast
|
|
14
16
|
@configuration = configuration
|
15
17
|
@options = options
|
16
18
|
@output_handler = OutputHandler.new
|
19
|
+
@execution_context = WorkflowExecutionContext.new
|
17
20
|
end
|
18
21
|
|
19
22
|
def run_for_files(files)
|
@@ -21,22 +24,65 @@ module Roast
|
|
21
24
|
$stderr.puts "WARNING: Ignoring target parameter because files were provided: #{@configuration.target}"
|
22
25
|
end
|
23
26
|
|
27
|
+
# Execute pre-processing steps once before any targets
|
28
|
+
if @configuration.pre_processing.any?
|
29
|
+
$stderr.puts "Running pre-processing steps..."
|
30
|
+
run_pre_processing
|
31
|
+
end
|
32
|
+
|
33
|
+
# Execute main workflow for each file
|
24
34
|
files.each do |file|
|
25
35
|
$stderr.puts "Running workflow for file: #{file}"
|
26
36
|
run_single_workflow(file.strip)
|
27
37
|
end
|
38
|
+
|
39
|
+
# Execute post-processing steps once after all targets
|
40
|
+
if @configuration.post_processing.any?
|
41
|
+
$stderr.puts "Running post-processing steps..."
|
42
|
+
run_post_processing
|
43
|
+
end
|
28
44
|
end
|
29
45
|
|
30
46
|
def run_for_targets
|
31
|
-
|
32
|
-
|
33
|
-
|
47
|
+
# Split targets by line and clean up
|
48
|
+
target_lines = @configuration.target.lines.map(&:strip).reject(&:empty?)
|
49
|
+
|
50
|
+
# Execute pre-processing steps once before any targets
|
51
|
+
if @configuration.pre_processing.any?
|
52
|
+
$stderr.puts "Running pre-processing steps..."
|
53
|
+
run_pre_processing
|
54
|
+
end
|
55
|
+
|
56
|
+
# Execute main workflow for each target
|
57
|
+
target_lines.each do |file|
|
58
|
+
$stderr.puts "Running workflow for file: #{file}"
|
59
|
+
run_single_workflow(file)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Execute post-processing steps once after all targets
|
63
|
+
if @configuration.post_processing.any?
|
64
|
+
$stderr.puts "Running post-processing steps..."
|
65
|
+
run_post_processing
|
34
66
|
end
|
35
67
|
end
|
36
68
|
|
37
69
|
def run_targetless
|
38
70
|
$stderr.puts "Running targetless workflow"
|
71
|
+
|
72
|
+
# Execute pre-processing steps
|
73
|
+
if @configuration.pre_processing.any?
|
74
|
+
$stderr.puts "Running pre-processing steps..."
|
75
|
+
run_pre_processing
|
76
|
+
end
|
77
|
+
|
78
|
+
# Execute main workflow
|
39
79
|
run_single_workflow(nil)
|
80
|
+
|
81
|
+
# Execute post-processing steps
|
82
|
+
if @configuration.post_processing.any?
|
83
|
+
$stderr.puts "Running post-processing steps..."
|
84
|
+
run_post_processing
|
85
|
+
end
|
40
86
|
end
|
41
87
|
|
42
88
|
# Public for backward compatibility with tests
|
@@ -63,11 +109,59 @@ module Roast
|
|
63
109
|
private
|
64
110
|
|
65
111
|
def run_single_workflow(file)
|
66
|
-
|
112
|
+
# Pass pre-processing data to target workflows
|
113
|
+
# Flatten the structure to remove the 'output' intermediary
|
114
|
+
pre_processing_data = @execution_context.pre_processing_output.raw_output.merge(
|
115
|
+
final_output: @execution_context.pre_processing_output.final_output,
|
116
|
+
)
|
117
|
+
workflow = create_workflow(file, pre_processing_data: pre_processing_data)
|
67
118
|
execute_workflow(workflow)
|
119
|
+
|
120
|
+
# Store workflow output in execution context
|
121
|
+
@execution_context.add_target_output(file, workflow.output_manager)
|
122
|
+
end
|
123
|
+
|
124
|
+
def run_pre_processing
|
125
|
+
# Create a workflow for pre-processing (no specific file target)
|
126
|
+
workflow = create_workflow(nil)
|
127
|
+
|
128
|
+
# Execute pre-processing steps
|
129
|
+
executor = WorkflowExecutor.new(workflow, @configuration.config_hash, @configuration.context_path, phase: :pre_processing)
|
130
|
+
executor.execute_steps(@configuration.pre_processing)
|
131
|
+
|
132
|
+
# Store pre-processing output in execution context
|
133
|
+
@execution_context.pre_processing_output.output = workflow.output_manager.raw_output
|
134
|
+
@execution_context.pre_processing_output.final_output = workflow.output_manager.final_output
|
135
|
+
end
|
136
|
+
|
137
|
+
def run_post_processing
|
138
|
+
# Create a workflow for post-processing with access to all results
|
139
|
+
workflow = create_workflow(nil)
|
140
|
+
|
141
|
+
# Pass execution context data to post-processing workflow
|
142
|
+
# Make pre_processing available as a top-level DotNotationHash with flattened structure
|
143
|
+
pre_processing_data = @execution_context.pre_processing_output.raw_output.merge(
|
144
|
+
final_output: @execution_context.pre_processing_output.final_output,
|
145
|
+
)
|
146
|
+
workflow.instance_variable_set(:@pre_processing, DotAccessHash.new(pre_processing_data))
|
147
|
+
workflow.define_singleton_method(:pre_processing) { @pre_processing }
|
148
|
+
|
149
|
+
# Keep targets in output for now
|
150
|
+
workflow.output[:targets] = @execution_context.target_outputs.transform_values(&:to_h)
|
151
|
+
|
152
|
+
# Execute post-processing steps
|
153
|
+
executor = WorkflowExecutor.new(workflow, @configuration.config_hash, @configuration.context_path, phase: :post_processing)
|
154
|
+
executor.execute_steps(@configuration.post_processing)
|
155
|
+
|
156
|
+
# Apply output.txt template if it exists
|
157
|
+
apply_post_processing_template(workflow)
|
158
|
+
|
159
|
+
# Save post-processing outputs
|
160
|
+
@output_handler.save_final_output(workflow)
|
161
|
+
@output_handler.write_results(workflow)
|
68
162
|
end
|
69
163
|
|
70
|
-
def create_workflow(file)
|
164
|
+
def create_workflow(file, pre_processing_data: nil)
|
71
165
|
BaseWorkflow.new(
|
72
166
|
file,
|
73
167
|
name: @configuration.basename,
|
@@ -75,6 +169,7 @@ module Roast
|
|
75
169
|
resource: @configuration.resource,
|
76
170
|
session_name: @configuration.name,
|
77
171
|
configuration: @configuration,
|
172
|
+
pre_processing_data:,
|
78
173
|
).tap do |workflow|
|
79
174
|
workflow.output_file = @options[:output] if @options[:output].present?
|
80
175
|
workflow.verbose = @options[:verbose] if @options[:verbose].present?
|
@@ -82,6 +177,33 @@ module Roast
|
|
82
177
|
workflow.pause_step_name = @options[:pause] if @options[:pause].present?
|
83
178
|
end
|
84
179
|
end
|
180
|
+
|
181
|
+
def apply_post_processing_template(workflow)
|
182
|
+
# Check for output.txt template in post_processing directory
|
183
|
+
template_path = File.join(@configuration.context_path, "post_processing", "output.txt")
|
184
|
+
return unless File.exist?(template_path)
|
185
|
+
|
186
|
+
# Prepare data for template
|
187
|
+
template_data = {
|
188
|
+
pre_processing: DotAccessHash.new(@execution_context.pre_processing_output.to_h),
|
189
|
+
targets: @execution_context.target_outputs.transform_values { |v| DotAccessHash.new(v.to_h) },
|
190
|
+
output: DotAccessHash.new(workflow.output_manager.raw_output),
|
191
|
+
final_output: workflow.final_output,
|
192
|
+
}
|
193
|
+
|
194
|
+
# Create binding for ERB template with access to template data
|
195
|
+
template_binding = binding
|
196
|
+
template_data.each do |key, value|
|
197
|
+
template_binding.local_variable_set(key, value)
|
198
|
+
end
|
199
|
+
|
200
|
+
# Apply template and append to final output
|
201
|
+
template_content = File.read(template_path)
|
202
|
+
rendered_output = ERB.new(template_content, trim_mode: "-").result(template_binding)
|
203
|
+
workflow.append_to_final_output(rendered_output)
|
204
|
+
rescue => e
|
205
|
+
$stderr.puts "Warning: Failed to apply post-processing output template: #{e.message}"
|
206
|
+
end
|
85
207
|
end
|
86
208
|
end
|
87
209
|
end
|
data/lib/roast/workflow.rb
CHANGED
@@ -7,6 +7,7 @@ require "roast/workflow/repeat_step"
|
|
7
7
|
require "roast/workflow/each_step"
|
8
8
|
require "roast/workflow/base_workflow"
|
9
9
|
require "roast/workflow/configuration"
|
10
|
+
require "roast/workflow/workflow_execution_context"
|
10
11
|
require "roast/workflow/workflow_executor"
|
11
12
|
require "roast/workflow/configuration_parser"
|
12
13
|
require "roast/workflow/validator"
|
data/lib/roast.rb
CHANGED
@@ -28,7 +28,13 @@ module Roast
|
|
28
28
|
raise Thor::Error, "Workflow configuration file is required" if paths.empty?
|
29
29
|
|
30
30
|
workflow_path, *files = paths
|
31
|
-
|
31
|
+
|
32
|
+
expanded_workflow_path = if workflow_path.include?("workflow.yml")
|
33
|
+
File.expand_path(workflow_path)
|
34
|
+
else
|
35
|
+
File.expand_path("roast/#{workflow_path}/workflow.yml")
|
36
|
+
end
|
37
|
+
|
32
38
|
raise Thor::Error, "Expected a Roast workflow configuration file, got directory: #{expanded_workflow_path}" if File.directory?(expanded_workflow_path)
|
33
39
|
|
34
40
|
Roast::Workflow::ConfigurationParser.new(expanded_workflow_path, files, options.transform_keys(&:to_sym)).begin!
|
data/roast.gemspec
CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
37
|
spec.require_paths = ["lib"]
|
38
38
|
|
39
|
-
spec.add_dependency("activesupport", "
|
39
|
+
spec.add_dependency("activesupport", ">= 7.0")
|
40
40
|
spec.add_dependency("cli-ui")
|
41
41
|
spec.add_dependency("diff-lcs", "~> 1.5")
|
42
42
|
spec.add_dependency("faraday-retry")
|
data/schema/workflow.json
CHANGED
@@ -41,6 +41,13 @@
|
|
41
41
|
]
|
42
42
|
}
|
43
43
|
},
|
44
|
+
"pre_processing": {
|
45
|
+
"type": "array",
|
46
|
+
"description": "Steps executed once before any targets are processed",
|
47
|
+
"items": {
|
48
|
+
"$ref": "#/properties/steps/items"
|
49
|
+
}
|
50
|
+
},
|
44
51
|
"steps": {
|
45
52
|
"type": "array",
|
46
53
|
"items": {
|
@@ -172,10 +179,44 @@
|
|
172
179
|
}
|
173
180
|
},
|
174
181
|
"required": ["unless", "then"]
|
182
|
+
},
|
183
|
+
{
|
184
|
+
"type": "object",
|
185
|
+
"properties": {
|
186
|
+
"case": {
|
187
|
+
"type": "string",
|
188
|
+
"description": "Expression to evaluate. Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content."
|
189
|
+
},
|
190
|
+
"when": {
|
191
|
+
"type": "object",
|
192
|
+
"description": "Map of case values to steps to execute when matched",
|
193
|
+
"additionalProperties": {
|
194
|
+
"type": "array",
|
195
|
+
"items": {
|
196
|
+
"$ref": "#/properties/steps/items"
|
197
|
+
}
|
198
|
+
}
|
199
|
+
},
|
200
|
+
"else": {
|
201
|
+
"type": "array",
|
202
|
+
"items": {
|
203
|
+
"$ref": "#/properties/steps/items"
|
204
|
+
},
|
205
|
+
"description": "Steps to execute when no when clauses match"
|
206
|
+
}
|
207
|
+
},
|
208
|
+
"required": ["case", "when"]
|
175
209
|
}
|
176
210
|
]
|
177
211
|
}
|
178
212
|
},
|
213
|
+
"post_processing": {
|
214
|
+
"type": "array",
|
215
|
+
"description": "Steps executed once after all targets have been processed",
|
216
|
+
"items": {
|
217
|
+
"$ref": "#/properties/steps/items"
|
218
|
+
}
|
219
|
+
},
|
179
220
|
"proceed?": {
|
180
221
|
"type": "object",
|
181
222
|
"properties": {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roast-ai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
@@ -13,16 +13,16 @@ dependencies:
|
|
13
13
|
name: activesupport
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - "
|
16
|
+
- - ">="
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: '
|
18
|
+
version: '7.0'
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
|
-
- - "
|
23
|
+
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: '
|
25
|
+
version: '7.0'
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: cli-ui
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- ".ruby-version"
|
125
125
|
- CHANGELOG.md
|
126
126
|
- CLAUDE.md
|
127
|
+
- CLAUDE_NOTES.md
|
127
128
|
- CODE_OF_CONDUCT.md
|
128
129
|
- CONTRIBUTING.md
|
129
130
|
- Gemfile
|
@@ -141,10 +142,15 @@ files:
|
|
141
142
|
- examples/api_workflow/prompt.md
|
142
143
|
- examples/api_workflow/transform_data/prompt.md
|
143
144
|
- examples/api_workflow/workflow.yml
|
145
|
+
- examples/case_when/README.md
|
146
|
+
- examples/case_when/detect_language/prompt.md
|
147
|
+
- examples/case_when/workflow.yml
|
144
148
|
- examples/conditional/README.md
|
145
149
|
- examples/conditional/check_condition/prompt.md
|
146
150
|
- examples/conditional/simple_workflow.yml
|
147
151
|
- examples/conditional/workflow.yml
|
152
|
+
- examples/direct_coerce_syntax/README.md
|
153
|
+
- examples/direct_coerce_syntax/workflow.yml
|
148
154
|
- examples/dot_notation/README.md
|
149
155
|
- examples/dot_notation/workflow.yml
|
150
156
|
- examples/exit_on_error/README.md
|
@@ -195,16 +201,38 @@ files:
|
|
195
201
|
- examples/iteration/update_fix_count/prompt.md
|
196
202
|
- examples/iteration/verify_fix/prompt.md
|
197
203
|
- examples/iteration/workflow.yml
|
204
|
+
- examples/json_handling/README.md
|
205
|
+
- examples/json_handling/workflow.yml
|
198
206
|
- examples/openrouter_example/README.md
|
199
207
|
- examples/openrouter_example/analyze_input/prompt.md
|
200
208
|
- examples/openrouter_example/generate_response/prompt.md
|
201
209
|
- examples/openrouter_example/workflow.yml
|
210
|
+
- examples/pre_post_processing/README.md
|
211
|
+
- examples/pre_post_processing/analyze_test_file/prompt.md
|
212
|
+
- examples/pre_post_processing/improve_test_coverage/prompt.md
|
213
|
+
- examples/pre_post_processing/optimize_test_performance/prompt.md
|
214
|
+
- examples/pre_post_processing/post_processing/aggregate_metrics/prompt.md
|
215
|
+
- examples/pre_post_processing/post_processing/cleanup_environment/prompt.md
|
216
|
+
- examples/pre_post_processing/post_processing/generate_summary_report/prompt.md
|
217
|
+
- examples/pre_post_processing/post_processing/output.txt
|
218
|
+
- examples/pre_post_processing/pre_processing/gather_baseline_metrics/prompt.md
|
219
|
+
- examples/pre_post_processing/pre_processing/setup_test_environment/prompt.md
|
220
|
+
- examples/pre_post_processing/validate_changes/prompt.md
|
221
|
+
- examples/pre_post_processing/workflow.yml
|
202
222
|
- examples/rspec_to_minitest/README.md
|
203
223
|
- examples/rspec_to_minitest/analyze_spec/prompt.md
|
204
224
|
- examples/rspec_to_minitest/create_minitest/prompt.md
|
205
225
|
- examples/rspec_to_minitest/run_and_improve/prompt.md
|
206
226
|
- examples/rspec_to_minitest/workflow.md
|
207
227
|
- examples/rspec_to_minitest/workflow.yml
|
228
|
+
- examples/single_target_prepost/README.md
|
229
|
+
- examples/single_target_prepost/post_processing/output.txt
|
230
|
+
- examples/single_target_prepost/pre_processing/gather_dependencies/prompt.md
|
231
|
+
- examples/single_target_prepost/workflow.yml
|
232
|
+
- examples/smart_coercion_defaults/README.md
|
233
|
+
- examples/smart_coercion_defaults/workflow.yml
|
234
|
+
- examples/step_configuration/README.md
|
235
|
+
- examples/step_configuration/workflow.yml
|
208
236
|
- examples/workflow_generator/README.md
|
209
237
|
- examples/workflow_generator/analyze_user_request/prompt.md
|
210
238
|
- examples/workflow_generator/create_workflow_files/prompt.md
|
@@ -212,6 +240,8 @@ files:
|
|
212
240
|
- examples/workflow_generator/info_from_roast.rb
|
213
241
|
- examples/workflow_generator/workflow.yml
|
214
242
|
- exe/roast
|
243
|
+
- gemfiles/activesupport7.gemfile
|
244
|
+
- gemfiles/activesupport8.gemfile
|
215
245
|
- lib/roast.rb
|
216
246
|
- lib/roast/errors.rb
|
217
247
|
- lib/roast/factories/api_provider_factory.rb
|
@@ -241,6 +271,7 @@ files:
|
|
241
271
|
- lib/roast/value_objects.rb
|
242
272
|
- lib/roast/value_objects/api_token.rb
|
243
273
|
- lib/roast/value_objects/step_name.rb
|
274
|
+
- lib/roast/value_objects/uri_base.rb
|
244
275
|
- lib/roast/value_objects/workflow_path.rb
|
245
276
|
- lib/roast/version.rb
|
246
277
|
- lib/roast/workflow.rb
|
@@ -248,6 +279,8 @@ files:
|
|
248
279
|
- lib/roast/workflow/base_iteration_step.rb
|
249
280
|
- lib/roast/workflow/base_step.rb
|
250
281
|
- lib/roast/workflow/base_workflow.rb
|
282
|
+
- lib/roast/workflow/case_executor.rb
|
283
|
+
- lib/roast/workflow/case_step.rb
|
251
284
|
- lib/roast/workflow/command_executor.rb
|
252
285
|
- lib/roast/workflow/conditional_executor.rb
|
253
286
|
- lib/roast/workflow/conditional_step.rb
|
@@ -258,6 +291,7 @@ files:
|
|
258
291
|
- lib/roast/workflow/dot_access_hash.rb
|
259
292
|
- lib/roast/workflow/each_step.rb
|
260
293
|
- lib/roast/workflow/error_handler.rb
|
294
|
+
- lib/roast/workflow/expression_evaluator.rb
|
261
295
|
- lib/roast/workflow/expression_utils.rb
|
262
296
|
- lib/roast/workflow/file_state_repository.rb
|
263
297
|
- lib/roast/workflow/interpolator.rb
|
@@ -287,6 +321,7 @@ files:
|
|
287
321
|
- lib/roast/workflow/step_type_resolver.rb
|
288
322
|
- lib/roast/workflow/validator.rb
|
289
323
|
- lib/roast/workflow/workflow_context.rb
|
324
|
+
- lib/roast/workflow/workflow_execution_context.rb
|
290
325
|
- lib/roast/workflow/workflow_executor.rb
|
291
326
|
- lib/roast/workflow/workflow_initializer.rb
|
292
327
|
- lib/roast/workflow/workflow_runner.rb
|