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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yaml +5 -1
  3. data/.gitignore +29 -1
  4. data/CHANGELOG.md +36 -0
  5. data/CLAUDE.md +5 -0
  6. data/CLAUDE_NOTES.md +68 -0
  7. data/Gemfile.lock +3 -4
  8. data/README.md +235 -10
  9. data/docs/ITERATION_SYNTAX.md +31 -3
  10. data/examples/case_when/README.md +58 -0
  11. data/examples/case_when/detect_language/prompt.md +16 -0
  12. data/examples/case_when/workflow.yml +58 -0
  13. data/examples/direct_coerce_syntax/README.md +32 -0
  14. data/examples/direct_coerce_syntax/workflow.yml +36 -0
  15. data/examples/grading/generate_recommendations/output.txt +6 -6
  16. data/examples/grading/workflow.yml +6 -4
  17. data/examples/json_handling/README.md +32 -0
  18. data/examples/json_handling/workflow.yml +52 -0
  19. data/examples/pre_post_processing/README.md +111 -0
  20. data/examples/pre_post_processing/analyze_test_file/prompt.md +23 -0
  21. data/examples/pre_post_processing/improve_test_coverage/prompt.md +17 -0
  22. data/examples/pre_post_processing/optimize_test_performance/prompt.md +25 -0
  23. data/examples/pre_post_processing/post_processing/aggregate_metrics/prompt.md +31 -0
  24. data/examples/pre_post_processing/post_processing/cleanup_environment/prompt.md +28 -0
  25. data/examples/pre_post_processing/post_processing/generate_summary_report/prompt.md +32 -0
  26. data/examples/pre_post_processing/post_processing/output.txt +24 -0
  27. data/examples/pre_post_processing/pre_processing/gather_baseline_metrics/prompt.md +26 -0
  28. data/examples/pre_post_processing/pre_processing/setup_test_environment/prompt.md +11 -0
  29. data/examples/pre_post_processing/validate_changes/prompt.md +24 -0
  30. data/examples/pre_post_processing/workflow.yml +21 -0
  31. data/examples/single_target_prepost/README.md +36 -0
  32. data/examples/single_target_prepost/post_processing/output.txt +27 -0
  33. data/examples/single_target_prepost/pre_processing/gather_dependencies/prompt.md +11 -0
  34. data/examples/single_target_prepost/workflow.yml +20 -0
  35. data/examples/smart_coercion_defaults/README.md +65 -0
  36. data/examples/smart_coercion_defaults/workflow.yml +44 -0
  37. data/examples/step_configuration/README.md +87 -0
  38. data/examples/step_configuration/workflow.yml +60 -0
  39. data/gemfiles/activesupport7.gemfile +4 -0
  40. data/gemfiles/activesupport8.gemfile +4 -0
  41. data/lib/roast/tools/grep.rb +13 -4
  42. data/lib/roast/tools/search_file.rb +2 -2
  43. data/lib/roast/tools.rb +16 -1
  44. data/lib/roast/value_objects/uri_base.rb +49 -0
  45. data/lib/roast/value_objects.rb +1 -0
  46. data/lib/roast/version.rb +1 -1
  47. data/lib/roast/workflow/api_configuration.rb +9 -1
  48. data/lib/roast/workflow/base_iteration_step.rb +22 -3
  49. data/lib/roast/workflow/base_step.rb +40 -3
  50. data/lib/roast/workflow/base_workflow.rb +4 -1
  51. data/lib/roast/workflow/case_executor.rb +49 -0
  52. data/lib/roast/workflow/case_step.rb +82 -0
  53. data/lib/roast/workflow/command_executor.rb +5 -2
  54. data/lib/roast/workflow/conditional_step.rb +6 -43
  55. data/lib/roast/workflow/configuration.rb +4 -2
  56. data/lib/roast/workflow/configuration_loader.rb +14 -0
  57. data/lib/roast/workflow/error_handler.rb +18 -0
  58. data/lib/roast/workflow/expression_evaluator.rb +86 -0
  59. data/lib/roast/workflow/iteration_executor.rb +18 -0
  60. data/lib/roast/workflow/prompt_step.rb +4 -1
  61. data/lib/roast/workflow/repeat_step.rb +2 -2
  62. data/lib/roast/workflow/step_executor_coordinator.rb +50 -8
  63. data/lib/roast/workflow/step_loader.rb +21 -7
  64. data/lib/roast/workflow/step_type_resolver.rb +16 -0
  65. data/lib/roast/workflow/workflow_execution_context.rb +39 -0
  66. data/lib/roast/workflow/workflow_executor.rb +22 -2
  67. data/lib/roast/workflow/workflow_initializer.rb +11 -2
  68. data/lib/roast/workflow/workflow_runner.rb +127 -5
  69. data/lib/roast/workflow.rb +1 -0
  70. data/lib/roast.rb +7 -1
  71. data/roast.gemspec +1 -1
  72. data/schema/workflow.json +41 -0
  73. 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(access_token: @configuration.api_token)
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(access_token: @configuration.api_token)
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
- @configuration.target.lines.each do |file|
32
- $stderr.puts "Running workflow for file: #{file.strip}"
33
- run_single_workflow(file.strip)
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
- workflow = create_workflow(file)
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
@@ -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
- expanded_workflow_path = File.expand_path(workflow_path)
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", "~> 8.0")
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.0
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: '8.0'
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: '8.0'
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