roast-ai 0.1.6 → 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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yaml +1 -1
  3. data/CHANGELOG.md +48 -0
  4. data/CLAUDE.md +20 -0
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +11 -6
  7. data/README.md +225 -13
  8. data/bin/roast +27 -0
  9. data/docs/INSTRUMENTATION.md +42 -1
  10. data/docs/ITERATION_SYNTAX.md +119 -0
  11. data/examples/conditional/README.md +161 -0
  12. data/examples/conditional/check_condition/prompt.md +1 -0
  13. data/examples/conditional/simple_workflow.yml +15 -0
  14. data/examples/conditional/workflow.yml +23 -0
  15. data/examples/dot_notation/README.md +37 -0
  16. data/examples/dot_notation/workflow.yml +44 -0
  17. data/examples/exit_on_error/README.md +50 -0
  18. data/examples/exit_on_error/analyze_lint_output/prompt.md +9 -0
  19. data/examples/exit_on_error/apply_fixes/prompt.md +2 -0
  20. data/examples/exit_on_error/workflow.yml +19 -0
  21. data/examples/grading/workflow.yml +5 -1
  22. data/examples/iteration/IMPLEMENTATION.md +88 -0
  23. data/examples/iteration/README.md +68 -0
  24. data/examples/iteration/analyze_complexity/prompt.md +22 -0
  25. data/examples/iteration/generate_recommendations/prompt.md +21 -0
  26. data/examples/iteration/generate_report/prompt.md +129 -0
  27. data/examples/iteration/implement_fix/prompt.md +25 -0
  28. data/examples/iteration/prioritize_issues/prompt.md +24 -0
  29. data/examples/iteration/prompts/analyze_file.md +28 -0
  30. data/examples/iteration/prompts/generate_summary.md +24 -0
  31. data/examples/iteration/prompts/update_report.md +29 -0
  32. data/examples/iteration/prompts/write_report.md +22 -0
  33. data/examples/iteration/read_file/prompt.md +9 -0
  34. data/examples/iteration/select_next_issue/prompt.md +25 -0
  35. data/examples/iteration/simple_workflow.md +39 -0
  36. data/examples/iteration/simple_workflow.yml +58 -0
  37. data/examples/iteration/update_fix_count/prompt.md +26 -0
  38. data/examples/iteration/verify_fix/prompt.md +29 -0
  39. data/examples/iteration/workflow.yml +42 -0
  40. data/examples/openrouter_example/workflow.yml +2 -2
  41. data/examples/workflow_generator/README.md +27 -0
  42. data/examples/workflow_generator/analyze_user_request/prompt.md +34 -0
  43. data/examples/workflow_generator/create_workflow_files/prompt.md +32 -0
  44. data/examples/workflow_generator/get_user_input/prompt.md +14 -0
  45. data/examples/workflow_generator/info_from_roast.rb +22 -0
  46. data/examples/workflow_generator/workflow.yml +35 -0
  47. data/lib/roast/errors.rb +9 -0
  48. data/lib/roast/factories/api_provider_factory.rb +61 -0
  49. data/lib/roast/helpers/function_caching_interceptor.rb +1 -1
  50. data/lib/roast/helpers/minitest_coverage_runner.rb +1 -1
  51. data/lib/roast/helpers/prompt_loader.rb +50 -1
  52. data/lib/roast/resources/base_resource.rb +7 -0
  53. data/lib/roast/resources.rb +6 -6
  54. data/lib/roast/tools/ask_user.rb +40 -0
  55. data/lib/roast/tools/cmd.rb +1 -1
  56. data/lib/roast/tools/search_file.rb +1 -1
  57. data/lib/roast/tools/update_files.rb +413 -0
  58. data/lib/roast/tools.rb +12 -1
  59. data/lib/roast/value_objects/api_token.rb +49 -0
  60. data/lib/roast/value_objects/step_name.rb +39 -0
  61. data/lib/roast/value_objects/workflow_path.rb +77 -0
  62. data/lib/roast/value_objects.rb +5 -0
  63. data/lib/roast/version.rb +1 -1
  64. data/lib/roast/workflow/api_configuration.rb +61 -0
  65. data/lib/roast/workflow/base_iteration_step.rb +165 -0
  66. data/lib/roast/workflow/base_step.rb +4 -24
  67. data/lib/roast/workflow/base_workflow.rb +76 -73
  68. data/lib/roast/workflow/command_executor.rb +88 -0
  69. data/lib/roast/workflow/conditional_executor.rb +50 -0
  70. data/lib/roast/workflow/conditional_step.rb +96 -0
  71. data/lib/roast/workflow/configuration.rb +35 -158
  72. data/lib/roast/workflow/configuration_loader.rb +78 -0
  73. data/lib/roast/workflow/configuration_parser.rb +13 -248
  74. data/lib/roast/workflow/context_path_resolver.rb +43 -0
  75. data/lib/roast/workflow/dot_access_hash.rb +198 -0
  76. data/lib/roast/workflow/each_step.rb +86 -0
  77. data/lib/roast/workflow/error_handler.rb +97 -0
  78. data/lib/roast/workflow/expression_utils.rb +36 -0
  79. data/lib/roast/workflow/file_state_repository.rb +3 -2
  80. data/lib/roast/workflow/interpolator.rb +34 -0
  81. data/lib/roast/workflow/iteration_executor.rb +85 -0
  82. data/lib/roast/workflow/llm_boolean_coercer.rb +55 -0
  83. data/lib/roast/workflow/output_handler.rb +35 -0
  84. data/lib/roast/workflow/output_manager.rb +77 -0
  85. data/lib/roast/workflow/parallel_executor.rb +49 -0
  86. data/lib/roast/workflow/repeat_step.rb +75 -0
  87. data/lib/roast/workflow/replay_handler.rb +123 -0
  88. data/lib/roast/workflow/resource_resolver.rb +77 -0
  89. data/lib/roast/workflow/session_manager.rb +6 -2
  90. data/lib/roast/workflow/state_manager.rb +97 -0
  91. data/lib/roast/workflow/step_executor_coordinator.rb +205 -0
  92. data/lib/roast/workflow/step_executor_factory.rb +47 -0
  93. data/lib/roast/workflow/step_executor_registry.rb +79 -0
  94. data/lib/roast/workflow/step_executors/base_step_executor.rb +23 -0
  95. data/lib/roast/workflow/step_executors/hash_step_executor.rb +43 -0
  96. data/lib/roast/workflow/step_executors/parallel_step_executor.rb +54 -0
  97. data/lib/roast/workflow/step_executors/string_step_executor.rb +29 -0
  98. data/lib/roast/workflow/step_finder.rb +97 -0
  99. data/lib/roast/workflow/step_loader.rb +154 -0
  100. data/lib/roast/workflow/step_orchestrator.rb +45 -0
  101. data/lib/roast/workflow/step_runner.rb +23 -0
  102. data/lib/roast/workflow/step_type_resolver.rb +117 -0
  103. data/lib/roast/workflow/workflow_context.rb +60 -0
  104. data/lib/roast/workflow/workflow_executor.rb +90 -209
  105. data/lib/roast/workflow/workflow_initializer.rb +112 -0
  106. data/lib/roast/workflow/workflow_runner.rb +87 -0
  107. data/lib/roast/workflow.rb +3 -0
  108. data/lib/roast.rb +96 -3
  109. data/roast.gemspec +3 -1
  110. data/schema/workflow.json +85 -0
  111. metadata +112 -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.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
@@ -23,6 +23,34 @@ 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'
40
+ - !ruby/object:Gem::Dependency
41
+ name: diff-lcs
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.5'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.5'
26
54
  - !ruby/object:Gem::Dependency
27
55
  name: faraday-retry
28
56
  requirement: !ruby/object:Gem::Requirement
@@ -57,14 +85,14 @@ dependencies:
57
85
  requirements:
58
86
  - - "~>"
59
87
  - !ruby/object:Gem::Version
60
- version: 0.8.4
88
+ version: 0.8.6
61
89
  type: :runtime
62
90
  prerelease: false
63
91
  version_requirements: !ruby/object:Gem::Requirement
64
92
  requirements:
65
93
  - - "~>"
66
94
  - !ruby/object:Gem::Version
67
- version: 0.8.4
95
+ version: 0.8.6
68
96
  - !ruby/object:Gem::Dependency
69
97
  name: thor
70
98
  requirement: !ruby/object:Gem::Requirement
@@ -104,13 +132,25 @@ files:
104
132
  - README.md
105
133
  - Rakefile
106
134
  - bin/console
135
+ - bin/roast
107
136
  - docs/INSTRUMENTATION.md
137
+ - docs/ITERATION_SYNTAX.md
108
138
  - examples/api_workflow/README.md
109
139
  - examples/api_workflow/fetch_api_data/prompt.md
110
140
  - examples/api_workflow/generate_report/prompt.md
111
141
  - examples/api_workflow/prompt.md
112
142
  - examples/api_workflow/transform_data/prompt.md
113
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
114
154
  - examples/grading/analyze_coverage/prompt.md
115
155
  - examples/grading/calculate_final_grade.rb
116
156
  - examples/grading/format_result.rb
@@ -137,6 +177,24 @@ files:
137
177
  - examples/interpolation/sample.rb
138
178
  - examples/interpolation/workflow.md
139
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
140
198
  - examples/openrouter_example/README.md
141
199
  - examples/openrouter_example/analyze_input/prompt.md
142
200
  - examples/openrouter_example/generate_response/prompt.md
@@ -147,8 +205,16 @@ files:
147
205
  - examples/rspec_to_minitest/run_and_improve/prompt.md
148
206
  - examples/rspec_to_minitest/workflow.md
149
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
150
214
  - exe/roast
151
215
  - lib/roast.rb
216
+ - lib/roast/errors.rb
217
+ - lib/roast/factories/api_provider_factory.rb
152
218
  - lib/roast/helpers.rb
153
219
  - lib/roast/helpers/function_caching_interceptor.rb
154
220
  - lib/roast/helpers/logger.rb
@@ -164,24 +230,66 @@ files:
164
230
  - lib/roast/resources/none_resource.rb
165
231
  - lib/roast/resources/url_resource.rb
166
232
  - lib/roast/tools.rb
233
+ - lib/roast/tools/ask_user.rb
167
234
  - lib/roast/tools/cmd.rb
168
235
  - lib/roast/tools/coding_agent.rb
169
236
  - lib/roast/tools/grep.rb
170
237
  - lib/roast/tools/read_file.rb
171
238
  - lib/roast/tools/search_file.rb
239
+ - lib/roast/tools/update_files.rb
172
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
173
245
  - lib/roast/version.rb
174
246
  - lib/roast/workflow.rb
247
+ - lib/roast/workflow/api_configuration.rb
248
+ - lib/roast/workflow/base_iteration_step.rb
175
249
  - lib/roast/workflow/base_step.rb
176
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
177
254
  - lib/roast/workflow/configuration.rb
255
+ - lib/roast/workflow/configuration_loader.rb
178
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
179
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
180
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
181
273
  - lib/roast/workflow/session_manager.rb
274
+ - lib/roast/workflow/state_manager.rb
182
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
183
288
  - lib/roast/workflow/validator.rb
289
+ - lib/roast/workflow/workflow_context.rb
184
290
  - lib/roast/workflow/workflow_executor.rb
291
+ - lib/roast/workflow/workflow_initializer.rb
292
+ - lib/roast/workflow/workflow_runner.rb
185
293
  - roast.gemspec
186
294
  - schema/workflow.json
187
295
  - shipit.rubygems.yml
@@ -207,7 +315,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
315
  - !ruby/object:Gem::Version
208
316
  version: '0'
209
317
  requirements: []
210
- rubygems_version: 3.6.8
318
+ rubygems_version: 3.6.9
211
319
  specification_version: 4
212
320
  summary: A framework for executing structured AI workflows in Ruby
213
321
  test_files: []