roast-ai 0.4.1 → 0.4.3

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +43 -0
  4. data/Gemfile +0 -1
  5. data/Gemfile.lock +48 -23
  6. data/README.md +228 -29
  7. data/examples/coding_agent_with_model.yml +20 -0
  8. data/examples/coding_agent_with_retries.yml +30 -0
  9. data/examples/grading/rb_test_runner +1 -1
  10. data/lib/roast/errors.rb +3 -0
  11. data/lib/roast/helpers/metadata_access.rb +39 -0
  12. data/lib/roast/helpers/timeout_handler.rb +1 -1
  13. data/lib/roast/tools/coding_agent.rb +99 -27
  14. data/lib/roast/tools/grep.rb +4 -0
  15. data/lib/roast/version.rb +1 -1
  16. data/lib/roast/workflow/agent_step.rb +57 -4
  17. data/lib/roast/workflow/base_workflow.rb +4 -2
  18. data/lib/roast/workflow/command_executor.rb +3 -1
  19. data/lib/roast/workflow/configuration_parser.rb +2 -0
  20. data/lib/roast/workflow/each_step.rb +5 -3
  21. data/lib/roast/workflow/input_step.rb +2 -0
  22. data/lib/roast/workflow/interpolator.rb +23 -1
  23. data/lib/roast/workflow/metadata_manager.rb +47 -0
  24. data/lib/roast/workflow/output_handler.rb +1 -0
  25. data/lib/roast/workflow/replay_handler.rb +8 -0
  26. data/lib/roast/workflow/shell_script_step.rb +115 -0
  27. data/lib/roast/workflow/sqlite_state_repository.rb +17 -17
  28. data/lib/roast/workflow/state_manager.rb +8 -0
  29. data/lib/roast/workflow/step_executor_coordinator.rb +43 -8
  30. data/lib/roast/workflow/step_executor_with_reporting.rb +2 -2
  31. data/lib/roast/workflow/step_loader.rb +55 -9
  32. data/lib/roast/workflow/workflow_executor.rb +3 -4
  33. data/lib/roast/workflow/workflow_initializer.rb +95 -4
  34. data/lib/roast/workflow/workflow_runner.rb +2 -2
  35. data/lib/roast.rb +2 -0
  36. data/roast.gemspec +3 -2
  37. metadata +36 -18
  38. data/lib/roast/workflow/step_orchestrator.rb +0 -48
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.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
@@ -23,6 +23,20 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '7.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: cli-kit
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: cli-ui
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -51,20 +65,6 @@ dependencies:
51
65
  - - "~>"
52
66
  - !ruby/object:Gem::Version
53
67
  version: '1.5'
54
- - !ruby/object:Gem::Dependency
55
- name: faraday-retry
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: '0'
61
- type: :runtime
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: '0'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: json-schema
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -94,7 +94,7 @@ dependencies:
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0.3'
96
96
  - !ruby/object:Gem::Dependency
97
- name: raix
97
+ name: raix-openai-eight
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
@@ -121,6 +121,20 @@ dependencies:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
123
  version: '1.2'
124
+ - !ruby/object:Gem::Dependency
125
+ name: sqlite3
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '2.6'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.6'
124
138
  - !ruby/object:Gem::Dependency
125
139
  name: thor
126
140
  requirement: !ruby/object:Gem::Requirement
@@ -245,6 +259,8 @@ files:
245
259
  - examples/cmd/explorer_workflow.png
246
260
  - examples/cmd/explorer_workflow.yml
247
261
  - examples/cmd/smart_tool_selection/prompt.md
262
+ - examples/coding_agent_with_model.yml
263
+ - examples/coding_agent_with_retries.yml
248
264
  - examples/conditional/README.md
249
265
  - examples/conditional/check_condition/prompt.md
250
266
  - examples/conditional/simple_workflow.png
@@ -428,6 +444,7 @@ files:
428
444
  - lib/roast/factories/api_provider_factory.rb
429
445
  - lib/roast/helpers/function_caching_interceptor.rb
430
446
  - lib/roast/helpers/logger.rb
447
+ - lib/roast/helpers/metadata_access.rb
431
448
  - lib/roast/helpers/minitest_coverage_runner.rb
432
449
  - lib/roast/helpers/path_resolver.rb
433
450
  - lib/roast/helpers/prompt_loader.rb
@@ -489,6 +506,7 @@ files:
489
506
  - lib/roast/workflow/interpolator.rb
490
507
  - lib/roast/workflow/iteration_executor.rb
491
508
  - lib/roast/workflow/llm_boolean_coercer.rb
509
+ - lib/roast/workflow/metadata_manager.rb
492
510
  - lib/roast/workflow/output_handler.rb
493
511
  - lib/roast/workflow/output_manager.rb
494
512
  - lib/roast/workflow/parallel_executor.rb
@@ -497,6 +515,7 @@ files:
497
515
  - lib/roast/workflow/replay_handler.rb
498
516
  - lib/roast/workflow/resource_resolver.rb
499
517
  - lib/roast/workflow/session_manager.rb
518
+ - lib/roast/workflow/shell_script_step.rb
500
519
  - lib/roast/workflow/sqlite_state_repository.rb
501
520
  - lib/roast/workflow/state_manager.rb
502
521
  - lib/roast/workflow/state_repository.rb
@@ -514,7 +533,6 @@ files:
514
533
  - lib/roast/workflow/step_finder.rb
515
534
  - lib/roast/workflow/step_loader.rb
516
535
  - lib/roast/workflow/step_name_extractor.rb
517
- - lib/roast/workflow/step_orchestrator.rb
518
536
  - lib/roast/workflow/step_runner.rb
519
537
  - lib/roast/workflow/step_type_resolver.rb
520
538
  - lib/roast/workflow/validation_command.rb
@@ -557,7 +575,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
557
575
  - !ruby/object:Gem::Version
558
576
  version: '0'
559
577
  requirements: []
560
- rubygems_version: 3.6.9
578
+ rubygems_version: 3.7.1
561
579
  specification_version: 4
562
580
  summary: A framework for executing structured AI workflows in Ruby
563
581
  test_files: []
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Roast
4
- module Workflow
5
- # Handles the orchestration of step execution, managing the flow and control
6
- # of individual steps without knowing how to execute them
7
- #
8
- # This class is specifically for executing CUSTOM steps defined in the workflow's
9
- # step directory (e.g., steps/*.rb files). It loads and executes Ruby step files
10
- # that define a `call` method.
11
- #
12
- # The primary method execute_step is used by StepExecutorCoordinator for
13
- # executing custom Ruby steps.
14
- #
15
- # TODO: Consider renaming this class to CustomStepOrchestrator to clarify its purpose
16
- class StepOrchestrator
17
- def initialize(workflow, step_loader, state_manager, error_handler, workflow_executor)
18
- @workflow = workflow
19
- @step_loader = step_loader
20
- @state_manager = state_manager
21
- @error_handler = error_handler
22
- @workflow_executor = workflow_executor
23
- end
24
-
25
- def execute_step(name, exit_on_error: true, step_key: nil, **options)
26
- resource_type = @workflow.respond_to?(:resource) ? @workflow.resource&.type : nil
27
-
28
- @error_handler.with_error_handling(name, resource_type: resource_type) do
29
- $stderr.puts "Executing: #{name} (Resource type: #{resource_type || "unknown"})"
30
-
31
- # Use step_key for loading if provided, otherwise use name
32
- load_key = step_key || name
33
- is_last_step = options[:is_last_step]
34
- step_object = @step_loader.load(name, step_key: load_key, is_last_step:, **options)
35
- step_result = step_object.call
36
-
37
- # Store result in workflow output
38
- @workflow.output[name] = step_result
39
-
40
- # Save state after each step
41
- @state_manager.save_state(name, step_result)
42
-
43
- step_result
44
- end
45
- end
46
- end
47
- end
48
- end