roast-ai 0.1.7 → 0.2.1

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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yaml +1 -1
  3. data/CHANGELOG.md +49 -1
  4. data/CLAUDE.md +20 -0
  5. data/CLAUDE_NOTES.md +68 -0
  6. data/Gemfile +1 -0
  7. data/Gemfile.lock +9 -6
  8. data/README.md +159 -26
  9. data/bin/roast +27 -0
  10. data/docs/ITERATION_SYNTAX.md +147 -0
  11. data/examples/case_when/README.md +58 -0
  12. data/examples/case_when/detect_language/prompt.md +16 -0
  13. data/examples/case_when/workflow.yml +58 -0
  14. data/examples/conditional/README.md +161 -0
  15. data/examples/conditional/check_condition/prompt.md +1 -0
  16. data/examples/conditional/simple_workflow.yml +15 -0
  17. data/examples/conditional/workflow.yml +23 -0
  18. data/examples/direct_coerce_syntax/README.md +32 -0
  19. data/examples/direct_coerce_syntax/workflow.yml +36 -0
  20. data/examples/dot_notation/README.md +37 -0
  21. data/examples/dot_notation/workflow.yml +44 -0
  22. data/examples/exit_on_error/README.md +50 -0
  23. data/examples/exit_on_error/analyze_lint_output/prompt.md +9 -0
  24. data/examples/exit_on_error/apply_fixes/prompt.md +2 -0
  25. data/examples/exit_on_error/workflow.yml +19 -0
  26. data/examples/grading/workflow.yml +10 -4
  27. data/examples/iteration/IMPLEMENTATION.md +88 -0
  28. data/examples/iteration/README.md +68 -0
  29. data/examples/iteration/analyze_complexity/prompt.md +22 -0
  30. data/examples/iteration/generate_recommendations/prompt.md +21 -0
  31. data/examples/iteration/generate_report/prompt.md +129 -0
  32. data/examples/iteration/implement_fix/prompt.md +25 -0
  33. data/examples/iteration/prioritize_issues/prompt.md +24 -0
  34. data/examples/iteration/prompts/analyze_file.md +28 -0
  35. data/examples/iteration/prompts/generate_summary.md +24 -0
  36. data/examples/iteration/prompts/update_report.md +29 -0
  37. data/examples/iteration/prompts/write_report.md +22 -0
  38. data/examples/iteration/read_file/prompt.md +9 -0
  39. data/examples/iteration/select_next_issue/prompt.md +25 -0
  40. data/examples/iteration/simple_workflow.md +39 -0
  41. data/examples/iteration/simple_workflow.yml +58 -0
  42. data/examples/iteration/update_fix_count/prompt.md +26 -0
  43. data/examples/iteration/verify_fix/prompt.md +29 -0
  44. data/examples/iteration/workflow.yml +42 -0
  45. data/examples/json_handling/README.md +32 -0
  46. data/examples/json_handling/workflow.yml +52 -0
  47. data/examples/openrouter_example/workflow.yml +2 -2
  48. data/examples/smart_coercion_defaults/README.md +65 -0
  49. data/examples/smart_coercion_defaults/workflow.yml +44 -0
  50. data/examples/step_configuration/README.md +87 -0
  51. data/examples/step_configuration/workflow.yml +60 -0
  52. data/examples/workflow_generator/README.md +27 -0
  53. data/examples/workflow_generator/analyze_user_request/prompt.md +34 -0
  54. data/examples/workflow_generator/create_workflow_files/prompt.md +32 -0
  55. data/examples/workflow_generator/get_user_input/prompt.md +14 -0
  56. data/examples/workflow_generator/info_from_roast.rb +22 -0
  57. data/examples/workflow_generator/workflow.yml +35 -0
  58. data/lib/roast/errors.rb +9 -0
  59. data/lib/roast/factories/api_provider_factory.rb +61 -0
  60. data/lib/roast/helpers/function_caching_interceptor.rb +1 -1
  61. data/lib/roast/helpers/minitest_coverage_runner.rb +1 -1
  62. data/lib/roast/helpers/prompt_loader.rb +50 -1
  63. data/lib/roast/resources/base_resource.rb +7 -0
  64. data/lib/roast/resources.rb +6 -6
  65. data/lib/roast/tools/ask_user.rb +40 -0
  66. data/lib/roast/tools/cmd.rb +1 -1
  67. data/lib/roast/tools/search_file.rb +1 -1
  68. data/lib/roast/tools.rb +11 -1
  69. data/lib/roast/value_objects/api_token.rb +49 -0
  70. data/lib/roast/value_objects/step_name.rb +39 -0
  71. data/lib/roast/value_objects/workflow_path.rb +77 -0
  72. data/lib/roast/value_objects.rb +5 -0
  73. data/lib/roast/version.rb +1 -1
  74. data/lib/roast/workflow/api_configuration.rb +61 -0
  75. data/lib/roast/workflow/base_iteration_step.rb +184 -0
  76. data/lib/roast/workflow/base_step.rb +44 -27
  77. data/lib/roast/workflow/base_workflow.rb +76 -73
  78. data/lib/roast/workflow/case_executor.rb +49 -0
  79. data/lib/roast/workflow/case_step.rb +82 -0
  80. data/lib/roast/workflow/command_executor.rb +88 -0
  81. data/lib/roast/workflow/conditional_executor.rb +50 -0
  82. data/lib/roast/workflow/conditional_step.rb +59 -0
  83. data/lib/roast/workflow/configuration.rb +35 -158
  84. data/lib/roast/workflow/configuration_loader.rb +78 -0
  85. data/lib/roast/workflow/configuration_parser.rb +13 -248
  86. data/lib/roast/workflow/context_path_resolver.rb +43 -0
  87. data/lib/roast/workflow/dot_access_hash.rb +198 -0
  88. data/lib/roast/workflow/each_step.rb +86 -0
  89. data/lib/roast/workflow/error_handler.rb +97 -0
  90. data/lib/roast/workflow/expression_evaluator.rb +78 -0
  91. data/lib/roast/workflow/expression_utils.rb +36 -0
  92. data/lib/roast/workflow/file_state_repository.rb +3 -2
  93. data/lib/roast/workflow/interpolator.rb +34 -0
  94. data/lib/roast/workflow/iteration_executor.rb +103 -0
  95. data/lib/roast/workflow/llm_boolean_coercer.rb +55 -0
  96. data/lib/roast/workflow/output_handler.rb +35 -0
  97. data/lib/roast/workflow/output_manager.rb +77 -0
  98. data/lib/roast/workflow/parallel_executor.rb +49 -0
  99. data/lib/roast/workflow/prompt_step.rb +4 -1
  100. data/lib/roast/workflow/repeat_step.rb +75 -0
  101. data/lib/roast/workflow/replay_handler.rb +123 -0
  102. data/lib/roast/workflow/resource_resolver.rb +77 -0
  103. data/lib/roast/workflow/session_manager.rb +6 -2
  104. data/lib/roast/workflow/state_manager.rb +97 -0
  105. data/lib/roast/workflow/step_executor_coordinator.rb +221 -0
  106. data/lib/roast/workflow/step_executor_factory.rb +47 -0
  107. data/lib/roast/workflow/step_executor_registry.rb +79 -0
  108. data/lib/roast/workflow/step_executors/base_step_executor.rb +23 -0
  109. data/lib/roast/workflow/step_executors/hash_step_executor.rb +43 -0
  110. data/lib/roast/workflow/step_executors/parallel_step_executor.rb +54 -0
  111. data/lib/roast/workflow/step_executors/string_step_executor.rb +29 -0
  112. data/lib/roast/workflow/step_finder.rb +97 -0
  113. data/lib/roast/workflow/step_loader.rb +155 -0
  114. data/lib/roast/workflow/step_orchestrator.rb +45 -0
  115. data/lib/roast/workflow/step_runner.rb +23 -0
  116. data/lib/roast/workflow/step_type_resolver.rb +133 -0
  117. data/lib/roast/workflow/workflow_context.rb +60 -0
  118. data/lib/roast/workflow/workflow_executor.rb +90 -209
  119. data/lib/roast/workflow/workflow_initializer.rb +112 -0
  120. data/lib/roast/workflow/workflow_runner.rb +87 -0
  121. data/lib/roast/workflow.rb +3 -0
  122. data/lib/roast.rb +96 -3
  123. data/roast.gemspec +2 -1
  124. data/schema/workflow.json +112 -0
  125. metadata +112 -4
data/schema/workflow.json CHANGED
@@ -87,6 +87,118 @@
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"]
175
+ },
176
+ {
177
+ "type": "object",
178
+ "properties": {
179
+ "case": {
180
+ "type": "string",
181
+ "description": "Expression to evaluate. Can be a Ruby expression in {{...}}, a bash command in $(...), a step name, or prompt content."
182
+ },
183
+ "when": {
184
+ "type": "object",
185
+ "description": "Map of case values to steps to execute when matched",
186
+ "additionalProperties": {
187
+ "type": "array",
188
+ "items": {
189
+ "$ref": "#/properties/steps/items"
190
+ }
191
+ }
192
+ },
193
+ "else": {
194
+ "type": "array",
195
+ "items": {
196
+ "$ref": "#/properties/steps/items"
197
+ },
198
+ "description": "Steps to execute when no when clauses match"
199
+ }
200
+ },
201
+ "required": ["case", "when"]
90
202
  }
91
203
  ]
92
204
  }
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.1
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
@@ -110,6 +124,7 @@ files:
110
124
  - ".ruby-version"
111
125
  - CHANGELOG.md
112
126
  - CLAUDE.md
127
+ - CLAUDE_NOTES.md
113
128
  - CODE_OF_CONDUCT.md
114
129
  - CONTRIBUTING.md
115
130
  - Gemfile
@@ -118,13 +133,30 @@ files:
118
133
  - README.md
119
134
  - Rakefile
120
135
  - bin/console
136
+ - bin/roast
121
137
  - docs/INSTRUMENTATION.md
138
+ - docs/ITERATION_SYNTAX.md
122
139
  - examples/api_workflow/README.md
123
140
  - examples/api_workflow/fetch_api_data/prompt.md
124
141
  - examples/api_workflow/generate_report/prompt.md
125
142
  - examples/api_workflow/prompt.md
126
143
  - examples/api_workflow/transform_data/prompt.md
127
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
148
+ - examples/conditional/README.md
149
+ - examples/conditional/check_condition/prompt.md
150
+ - examples/conditional/simple_workflow.yml
151
+ - examples/conditional/workflow.yml
152
+ - examples/direct_coerce_syntax/README.md
153
+ - examples/direct_coerce_syntax/workflow.yml
154
+ - examples/dot_notation/README.md
155
+ - examples/dot_notation/workflow.yml
156
+ - examples/exit_on_error/README.md
157
+ - examples/exit_on_error/analyze_lint_output/prompt.md
158
+ - examples/exit_on_error/apply_fixes/prompt.md
159
+ - examples/exit_on_error/workflow.yml
128
160
  - examples/grading/analyze_coverage/prompt.md
129
161
  - examples/grading/calculate_final_grade.rb
130
162
  - examples/grading/format_result.rb
@@ -151,6 +183,26 @@ files:
151
183
  - examples/interpolation/sample.rb
152
184
  - examples/interpolation/workflow.md
153
185
  - examples/interpolation/workflow.yml
186
+ - examples/iteration/IMPLEMENTATION.md
187
+ - examples/iteration/README.md
188
+ - examples/iteration/analyze_complexity/prompt.md
189
+ - examples/iteration/generate_recommendations/prompt.md
190
+ - examples/iteration/generate_report/prompt.md
191
+ - examples/iteration/implement_fix/prompt.md
192
+ - examples/iteration/prioritize_issues/prompt.md
193
+ - examples/iteration/prompts/analyze_file.md
194
+ - examples/iteration/prompts/generate_summary.md
195
+ - examples/iteration/prompts/update_report.md
196
+ - examples/iteration/prompts/write_report.md
197
+ - examples/iteration/read_file/prompt.md
198
+ - examples/iteration/select_next_issue/prompt.md
199
+ - examples/iteration/simple_workflow.md
200
+ - examples/iteration/simple_workflow.yml
201
+ - examples/iteration/update_fix_count/prompt.md
202
+ - examples/iteration/verify_fix/prompt.md
203
+ - examples/iteration/workflow.yml
204
+ - examples/json_handling/README.md
205
+ - examples/json_handling/workflow.yml
154
206
  - examples/openrouter_example/README.md
155
207
  - examples/openrouter_example/analyze_input/prompt.md
156
208
  - examples/openrouter_example/generate_response/prompt.md
@@ -161,8 +213,20 @@ files:
161
213
  - examples/rspec_to_minitest/run_and_improve/prompt.md
162
214
  - examples/rspec_to_minitest/workflow.md
163
215
  - examples/rspec_to_minitest/workflow.yml
216
+ - examples/smart_coercion_defaults/README.md
217
+ - examples/smart_coercion_defaults/workflow.yml
218
+ - examples/step_configuration/README.md
219
+ - examples/step_configuration/workflow.yml
220
+ - examples/workflow_generator/README.md
221
+ - examples/workflow_generator/analyze_user_request/prompt.md
222
+ - examples/workflow_generator/create_workflow_files/prompt.md
223
+ - examples/workflow_generator/get_user_input/prompt.md
224
+ - examples/workflow_generator/info_from_roast.rb
225
+ - examples/workflow_generator/workflow.yml
164
226
  - exe/roast
165
227
  - lib/roast.rb
228
+ - lib/roast/errors.rb
229
+ - lib/roast/factories/api_provider_factory.rb
166
230
  - lib/roast/helpers.rb
167
231
  - lib/roast/helpers/function_caching_interceptor.rb
168
232
  - lib/roast/helpers/logger.rb
@@ -178,6 +242,7 @@ files:
178
242
  - lib/roast/resources/none_resource.rb
179
243
  - lib/roast/resources/url_resource.rb
180
244
  - lib/roast/tools.rb
245
+ - lib/roast/tools/ask_user.rb
181
246
  - lib/roast/tools/cmd.rb
182
247
  - lib/roast/tools/coding_agent.rb
183
248
  - lib/roast/tools/grep.rb
@@ -185,18 +250,61 @@ files:
185
250
  - lib/roast/tools/search_file.rb
186
251
  - lib/roast/tools/update_files.rb
187
252
  - lib/roast/tools/write_file.rb
253
+ - lib/roast/value_objects.rb
254
+ - lib/roast/value_objects/api_token.rb
255
+ - lib/roast/value_objects/step_name.rb
256
+ - lib/roast/value_objects/workflow_path.rb
188
257
  - lib/roast/version.rb
189
258
  - lib/roast/workflow.rb
259
+ - lib/roast/workflow/api_configuration.rb
260
+ - lib/roast/workflow/base_iteration_step.rb
190
261
  - lib/roast/workflow/base_step.rb
191
262
  - lib/roast/workflow/base_workflow.rb
263
+ - lib/roast/workflow/case_executor.rb
264
+ - lib/roast/workflow/case_step.rb
265
+ - lib/roast/workflow/command_executor.rb
266
+ - lib/roast/workflow/conditional_executor.rb
267
+ - lib/roast/workflow/conditional_step.rb
192
268
  - lib/roast/workflow/configuration.rb
269
+ - lib/roast/workflow/configuration_loader.rb
193
270
  - lib/roast/workflow/configuration_parser.rb
271
+ - lib/roast/workflow/context_path_resolver.rb
272
+ - lib/roast/workflow/dot_access_hash.rb
273
+ - lib/roast/workflow/each_step.rb
274
+ - lib/roast/workflow/error_handler.rb
275
+ - lib/roast/workflow/expression_evaluator.rb
276
+ - lib/roast/workflow/expression_utils.rb
194
277
  - lib/roast/workflow/file_state_repository.rb
278
+ - lib/roast/workflow/interpolator.rb
279
+ - lib/roast/workflow/iteration_executor.rb
280
+ - lib/roast/workflow/llm_boolean_coercer.rb
281
+ - lib/roast/workflow/output_handler.rb
282
+ - lib/roast/workflow/output_manager.rb
283
+ - lib/roast/workflow/parallel_executor.rb
195
284
  - lib/roast/workflow/prompt_step.rb
285
+ - lib/roast/workflow/repeat_step.rb
286
+ - lib/roast/workflow/replay_handler.rb
287
+ - lib/roast/workflow/resource_resolver.rb
196
288
  - lib/roast/workflow/session_manager.rb
289
+ - lib/roast/workflow/state_manager.rb
197
290
  - lib/roast/workflow/state_repository.rb
291
+ - lib/roast/workflow/step_executor_coordinator.rb
292
+ - lib/roast/workflow/step_executor_factory.rb
293
+ - lib/roast/workflow/step_executor_registry.rb
294
+ - lib/roast/workflow/step_executors/base_step_executor.rb
295
+ - lib/roast/workflow/step_executors/hash_step_executor.rb
296
+ - lib/roast/workflow/step_executors/parallel_step_executor.rb
297
+ - lib/roast/workflow/step_executors/string_step_executor.rb
298
+ - lib/roast/workflow/step_finder.rb
299
+ - lib/roast/workflow/step_loader.rb
300
+ - lib/roast/workflow/step_orchestrator.rb
301
+ - lib/roast/workflow/step_runner.rb
302
+ - lib/roast/workflow/step_type_resolver.rb
198
303
  - lib/roast/workflow/validator.rb
304
+ - lib/roast/workflow/workflow_context.rb
199
305
  - lib/roast/workflow/workflow_executor.rb
306
+ - lib/roast/workflow/workflow_initializer.rb
307
+ - lib/roast/workflow/workflow_runner.rb
200
308
  - roast.gemspec
201
309
  - schema/workflow.json
202
310
  - shipit.rubygems.yml
@@ -222,7 +330,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
330
  - !ruby/object:Gem::Version
223
331
  version: '0'
224
332
  requirements: []
225
- rubygems_version: 3.6.8
333
+ rubygems_version: 3.6.9
226
334
  specification_version: 4
227
335
  summary: A framework for executing structured AI workflows in Ruby
228
336
  test_files: []