roast-ai 0.1.7 → 0.2.0

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yaml +1 -1
  3. data/CHANGELOG.md +40 -1
  4. data/CLAUDE.md +20 -0
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +9 -6
  7. data/README.md +81 -14
  8. data/bin/roast +27 -0
  9. data/docs/ITERATION_SYNTAX.md +119 -0
  10. data/examples/conditional/README.md +161 -0
  11. data/examples/conditional/check_condition/prompt.md +1 -0
  12. data/examples/conditional/simple_workflow.yml +15 -0
  13. data/examples/conditional/workflow.yml +23 -0
  14. data/examples/dot_notation/README.md +37 -0
  15. data/examples/dot_notation/workflow.yml +44 -0
  16. data/examples/exit_on_error/README.md +50 -0
  17. data/examples/exit_on_error/analyze_lint_output/prompt.md +9 -0
  18. data/examples/exit_on_error/apply_fixes/prompt.md +2 -0
  19. data/examples/exit_on_error/workflow.yml +19 -0
  20. data/examples/grading/workflow.yml +5 -1
  21. data/examples/iteration/IMPLEMENTATION.md +88 -0
  22. data/examples/iteration/README.md +68 -0
  23. data/examples/iteration/analyze_complexity/prompt.md +22 -0
  24. data/examples/iteration/generate_recommendations/prompt.md +21 -0
  25. data/examples/iteration/generate_report/prompt.md +129 -0
  26. data/examples/iteration/implement_fix/prompt.md +25 -0
  27. data/examples/iteration/prioritize_issues/prompt.md +24 -0
  28. data/examples/iteration/prompts/analyze_file.md +28 -0
  29. data/examples/iteration/prompts/generate_summary.md +24 -0
  30. data/examples/iteration/prompts/update_report.md +29 -0
  31. data/examples/iteration/prompts/write_report.md +22 -0
  32. data/examples/iteration/read_file/prompt.md +9 -0
  33. data/examples/iteration/select_next_issue/prompt.md +25 -0
  34. data/examples/iteration/simple_workflow.md +39 -0
  35. data/examples/iteration/simple_workflow.yml +58 -0
  36. data/examples/iteration/update_fix_count/prompt.md +26 -0
  37. data/examples/iteration/verify_fix/prompt.md +29 -0
  38. data/examples/iteration/workflow.yml +42 -0
  39. data/examples/openrouter_example/workflow.yml +2 -2
  40. data/examples/workflow_generator/README.md +27 -0
  41. data/examples/workflow_generator/analyze_user_request/prompt.md +34 -0
  42. data/examples/workflow_generator/create_workflow_files/prompt.md +32 -0
  43. data/examples/workflow_generator/get_user_input/prompt.md +14 -0
  44. data/examples/workflow_generator/info_from_roast.rb +22 -0
  45. data/examples/workflow_generator/workflow.yml +35 -0
  46. data/lib/roast/errors.rb +9 -0
  47. data/lib/roast/factories/api_provider_factory.rb +61 -0
  48. data/lib/roast/helpers/function_caching_interceptor.rb +1 -1
  49. data/lib/roast/helpers/minitest_coverage_runner.rb +1 -1
  50. data/lib/roast/helpers/prompt_loader.rb +50 -1
  51. data/lib/roast/resources/base_resource.rb +7 -0
  52. data/lib/roast/resources.rb +6 -6
  53. data/lib/roast/tools/ask_user.rb +40 -0
  54. data/lib/roast/tools/cmd.rb +1 -1
  55. data/lib/roast/tools/search_file.rb +1 -1
  56. data/lib/roast/tools.rb +11 -1
  57. data/lib/roast/value_objects/api_token.rb +49 -0
  58. data/lib/roast/value_objects/step_name.rb +39 -0
  59. data/lib/roast/value_objects/workflow_path.rb +77 -0
  60. data/lib/roast/value_objects.rb +5 -0
  61. data/lib/roast/version.rb +1 -1
  62. data/lib/roast/workflow/api_configuration.rb +61 -0
  63. data/lib/roast/workflow/base_iteration_step.rb +165 -0
  64. data/lib/roast/workflow/base_step.rb +4 -24
  65. data/lib/roast/workflow/base_workflow.rb +76 -73
  66. data/lib/roast/workflow/command_executor.rb +88 -0
  67. data/lib/roast/workflow/conditional_executor.rb +50 -0
  68. data/lib/roast/workflow/conditional_step.rb +96 -0
  69. data/lib/roast/workflow/configuration.rb +35 -158
  70. data/lib/roast/workflow/configuration_loader.rb +78 -0
  71. data/lib/roast/workflow/configuration_parser.rb +13 -248
  72. data/lib/roast/workflow/context_path_resolver.rb +43 -0
  73. data/lib/roast/workflow/dot_access_hash.rb +198 -0
  74. data/lib/roast/workflow/each_step.rb +86 -0
  75. data/lib/roast/workflow/error_handler.rb +97 -0
  76. data/lib/roast/workflow/expression_utils.rb +36 -0
  77. data/lib/roast/workflow/file_state_repository.rb +3 -2
  78. data/lib/roast/workflow/interpolator.rb +34 -0
  79. data/lib/roast/workflow/iteration_executor.rb +85 -0
  80. data/lib/roast/workflow/llm_boolean_coercer.rb +55 -0
  81. data/lib/roast/workflow/output_handler.rb +35 -0
  82. data/lib/roast/workflow/output_manager.rb +77 -0
  83. data/lib/roast/workflow/parallel_executor.rb +49 -0
  84. data/lib/roast/workflow/repeat_step.rb +75 -0
  85. data/lib/roast/workflow/replay_handler.rb +123 -0
  86. data/lib/roast/workflow/resource_resolver.rb +77 -0
  87. data/lib/roast/workflow/session_manager.rb +6 -2
  88. data/lib/roast/workflow/state_manager.rb +97 -0
  89. data/lib/roast/workflow/step_executor_coordinator.rb +205 -0
  90. data/lib/roast/workflow/step_executor_factory.rb +47 -0
  91. data/lib/roast/workflow/step_executor_registry.rb +79 -0
  92. data/lib/roast/workflow/step_executors/base_step_executor.rb +23 -0
  93. data/lib/roast/workflow/step_executors/hash_step_executor.rb +43 -0
  94. data/lib/roast/workflow/step_executors/parallel_step_executor.rb +54 -0
  95. data/lib/roast/workflow/step_executors/string_step_executor.rb +29 -0
  96. data/lib/roast/workflow/step_finder.rb +97 -0
  97. data/lib/roast/workflow/step_loader.rb +154 -0
  98. data/lib/roast/workflow/step_orchestrator.rb +45 -0
  99. data/lib/roast/workflow/step_runner.rb +23 -0
  100. data/lib/roast/workflow/step_type_resolver.rb +117 -0
  101. data/lib/roast/workflow/workflow_context.rb +60 -0
  102. data/lib/roast/workflow/workflow_executor.rb +90 -209
  103. data/lib/roast/workflow/workflow_initializer.rb +112 -0
  104. data/lib/roast/workflow/workflow_runner.rb +87 -0
  105. data/lib/roast/workflow.rb +3 -0
  106. data/lib/roast.rb +96 -3
  107. data/roast.gemspec +2 -1
  108. data/schema/workflow.json +85 -0
  109. metadata +97 -4
data/schema/workflow.json CHANGED
@@ -87,6 +87,91 @@
87
87
  }
88
88
  },
89
89
  "required": ["proceed?"]
90
+ },
91
+ {
92
+ "type": "object",
93
+ "properties": {
94
+ "repeat": {
95
+ "type": "object",
96
+ "properties": {
97
+ "steps": {
98
+ "type": "array",
99
+ "items": {
100
+ "$ref": "#/properties/steps/items"
101
+ }
102
+ },
103
+ "until": {
104
+ "type": "string",
105
+ "description": "Condition to evaluate after each iteration; loop stops when condition becomes true. Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content. Result will be coerced to boolean."
106
+ },
107
+ "max_iterations": {
108
+ "type": "integer",
109
+ "description": "Maximum number of iterations to prevent infinite loops",
110
+ "minimum": 1
111
+ }
112
+ },
113
+ "required": ["steps", "until"]
114
+ }
115
+ },
116
+ "required": ["repeat"]
117
+ },
118
+ {
119
+ "type": "object",
120
+ "properties": {
121
+ "each": {
122
+ "type": "string",
123
+ "description": "Input that resolves to a collection to iterate over. Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content. Result will be coerced to an iterable collection."
124
+ },
125
+ "as": {
126
+ "type": "string",
127
+ "description": "Variable name to assign each item during iteration"
128
+ },
129
+ "steps": {
130
+ "type": "array",
131
+ "items": {
132
+ "$ref": "#/properties/steps/items"
133
+ }
134
+ }
135
+ },
136
+ "required": ["each", "as", "steps"]
137
+ },
138
+ {
139
+ "type": "object",
140
+ "properties": {
141
+ "if": {
142
+ "type": "string",
143
+ "description": "Condition to evaluate. Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content. Result will be coerced to boolean."
144
+ },
145
+ "then": {
146
+ "type": "array",
147
+ "items": {
148
+ "$ref": "#/properties/steps/items"
149
+ }
150
+ },
151
+ "else": {
152
+ "type": "array",
153
+ "items": {
154
+ "$ref": "#/properties/steps/items"
155
+ }
156
+ }
157
+ },
158
+ "required": ["if", "then"]
159
+ },
160
+ {
161
+ "type": "object",
162
+ "properties": {
163
+ "unless": {
164
+ "type": "string",
165
+ "description": "Condition to evaluate (inverted). Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content. Result will be coerced to boolean."
166
+ },
167
+ "then": {
168
+ "type": "array",
169
+ "items": {
170
+ "$ref": "#/properties/steps/items"
171
+ }
172
+ }
173
+ },
174
+ "required": ["unless", "then"]
90
175
  }
91
176
  ]
92
177
  }
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.1.7
4
+ version: 0.2.0
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: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: cli-ui
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: diff-lcs
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -71,14 +85,14 @@ dependencies:
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: 0.8.4
88
+ version: 0.8.6
75
89
  type: :runtime
76
90
  prerelease: false
77
91
  version_requirements: !ruby/object:Gem::Requirement
78
92
  requirements:
79
93
  - - "~>"
80
94
  - !ruby/object:Gem::Version
81
- version: 0.8.4
95
+ version: 0.8.6
82
96
  - !ruby/object:Gem::Dependency
83
97
  name: thor
84
98
  requirement: !ruby/object:Gem::Requirement
@@ -118,13 +132,25 @@ files:
118
132
  - README.md
119
133
  - Rakefile
120
134
  - bin/console
135
+ - bin/roast
121
136
  - docs/INSTRUMENTATION.md
137
+ - docs/ITERATION_SYNTAX.md
122
138
  - examples/api_workflow/README.md
123
139
  - examples/api_workflow/fetch_api_data/prompt.md
124
140
  - examples/api_workflow/generate_report/prompt.md
125
141
  - examples/api_workflow/prompt.md
126
142
  - examples/api_workflow/transform_data/prompt.md
127
143
  - examples/api_workflow/workflow.yml
144
+ - examples/conditional/README.md
145
+ - examples/conditional/check_condition/prompt.md
146
+ - examples/conditional/simple_workflow.yml
147
+ - examples/conditional/workflow.yml
148
+ - examples/dot_notation/README.md
149
+ - examples/dot_notation/workflow.yml
150
+ - examples/exit_on_error/README.md
151
+ - examples/exit_on_error/analyze_lint_output/prompt.md
152
+ - examples/exit_on_error/apply_fixes/prompt.md
153
+ - examples/exit_on_error/workflow.yml
128
154
  - examples/grading/analyze_coverage/prompt.md
129
155
  - examples/grading/calculate_final_grade.rb
130
156
  - examples/grading/format_result.rb
@@ -151,6 +177,24 @@ files:
151
177
  - examples/interpolation/sample.rb
152
178
  - examples/interpolation/workflow.md
153
179
  - examples/interpolation/workflow.yml
180
+ - examples/iteration/IMPLEMENTATION.md
181
+ - examples/iteration/README.md
182
+ - examples/iteration/analyze_complexity/prompt.md
183
+ - examples/iteration/generate_recommendations/prompt.md
184
+ - examples/iteration/generate_report/prompt.md
185
+ - examples/iteration/implement_fix/prompt.md
186
+ - examples/iteration/prioritize_issues/prompt.md
187
+ - examples/iteration/prompts/analyze_file.md
188
+ - examples/iteration/prompts/generate_summary.md
189
+ - examples/iteration/prompts/update_report.md
190
+ - examples/iteration/prompts/write_report.md
191
+ - examples/iteration/read_file/prompt.md
192
+ - examples/iteration/select_next_issue/prompt.md
193
+ - examples/iteration/simple_workflow.md
194
+ - examples/iteration/simple_workflow.yml
195
+ - examples/iteration/update_fix_count/prompt.md
196
+ - examples/iteration/verify_fix/prompt.md
197
+ - examples/iteration/workflow.yml
154
198
  - examples/openrouter_example/README.md
155
199
  - examples/openrouter_example/analyze_input/prompt.md
156
200
  - examples/openrouter_example/generate_response/prompt.md
@@ -161,8 +205,16 @@ files:
161
205
  - examples/rspec_to_minitest/run_and_improve/prompt.md
162
206
  - examples/rspec_to_minitest/workflow.md
163
207
  - examples/rspec_to_minitest/workflow.yml
208
+ - examples/workflow_generator/README.md
209
+ - examples/workflow_generator/analyze_user_request/prompt.md
210
+ - examples/workflow_generator/create_workflow_files/prompt.md
211
+ - examples/workflow_generator/get_user_input/prompt.md
212
+ - examples/workflow_generator/info_from_roast.rb
213
+ - examples/workflow_generator/workflow.yml
164
214
  - exe/roast
165
215
  - lib/roast.rb
216
+ - lib/roast/errors.rb
217
+ - lib/roast/factories/api_provider_factory.rb
166
218
  - lib/roast/helpers.rb
167
219
  - lib/roast/helpers/function_caching_interceptor.rb
168
220
  - lib/roast/helpers/logger.rb
@@ -178,6 +230,7 @@ files:
178
230
  - lib/roast/resources/none_resource.rb
179
231
  - lib/roast/resources/url_resource.rb
180
232
  - lib/roast/tools.rb
233
+ - lib/roast/tools/ask_user.rb
181
234
  - lib/roast/tools/cmd.rb
182
235
  - lib/roast/tools/coding_agent.rb
183
236
  - lib/roast/tools/grep.rb
@@ -185,18 +238,58 @@ files:
185
238
  - lib/roast/tools/search_file.rb
186
239
  - lib/roast/tools/update_files.rb
187
240
  - lib/roast/tools/write_file.rb
241
+ - lib/roast/value_objects.rb
242
+ - lib/roast/value_objects/api_token.rb
243
+ - lib/roast/value_objects/step_name.rb
244
+ - lib/roast/value_objects/workflow_path.rb
188
245
  - lib/roast/version.rb
189
246
  - lib/roast/workflow.rb
247
+ - lib/roast/workflow/api_configuration.rb
248
+ - lib/roast/workflow/base_iteration_step.rb
190
249
  - lib/roast/workflow/base_step.rb
191
250
  - lib/roast/workflow/base_workflow.rb
251
+ - lib/roast/workflow/command_executor.rb
252
+ - lib/roast/workflow/conditional_executor.rb
253
+ - lib/roast/workflow/conditional_step.rb
192
254
  - lib/roast/workflow/configuration.rb
255
+ - lib/roast/workflow/configuration_loader.rb
193
256
  - lib/roast/workflow/configuration_parser.rb
257
+ - lib/roast/workflow/context_path_resolver.rb
258
+ - lib/roast/workflow/dot_access_hash.rb
259
+ - lib/roast/workflow/each_step.rb
260
+ - lib/roast/workflow/error_handler.rb
261
+ - lib/roast/workflow/expression_utils.rb
194
262
  - lib/roast/workflow/file_state_repository.rb
263
+ - lib/roast/workflow/interpolator.rb
264
+ - lib/roast/workflow/iteration_executor.rb
265
+ - lib/roast/workflow/llm_boolean_coercer.rb
266
+ - lib/roast/workflow/output_handler.rb
267
+ - lib/roast/workflow/output_manager.rb
268
+ - lib/roast/workflow/parallel_executor.rb
195
269
  - lib/roast/workflow/prompt_step.rb
270
+ - lib/roast/workflow/repeat_step.rb
271
+ - lib/roast/workflow/replay_handler.rb
272
+ - lib/roast/workflow/resource_resolver.rb
196
273
  - lib/roast/workflow/session_manager.rb
274
+ - lib/roast/workflow/state_manager.rb
197
275
  - lib/roast/workflow/state_repository.rb
276
+ - lib/roast/workflow/step_executor_coordinator.rb
277
+ - lib/roast/workflow/step_executor_factory.rb
278
+ - lib/roast/workflow/step_executor_registry.rb
279
+ - lib/roast/workflow/step_executors/base_step_executor.rb
280
+ - lib/roast/workflow/step_executors/hash_step_executor.rb
281
+ - lib/roast/workflow/step_executors/parallel_step_executor.rb
282
+ - lib/roast/workflow/step_executors/string_step_executor.rb
283
+ - lib/roast/workflow/step_finder.rb
284
+ - lib/roast/workflow/step_loader.rb
285
+ - lib/roast/workflow/step_orchestrator.rb
286
+ - lib/roast/workflow/step_runner.rb
287
+ - lib/roast/workflow/step_type_resolver.rb
198
288
  - lib/roast/workflow/validator.rb
289
+ - lib/roast/workflow/workflow_context.rb
199
290
  - lib/roast/workflow/workflow_executor.rb
291
+ - lib/roast/workflow/workflow_initializer.rb
292
+ - lib/roast/workflow/workflow_runner.rb
200
293
  - roast.gemspec
201
294
  - schema/workflow.json
202
295
  - shipit.rubygems.yml
@@ -222,7 +315,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
315
  - !ruby/object:Gem::Version
223
316
  version: '0'
224
317
  requirements: []
225
- rubygems_version: 3.6.8
318
+ rubygems_version: 3.6.9
226
319
  specification_version: 4
227
320
  summary: A framework for executing structured AI workflows in Ruby
228
321
  test_files: []