roast-ai 0.4.10 → 0.5.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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/commands/docs/write-comments.md +36 -0
  3. data/.github/CODEOWNERS +1 -1
  4. data/.github/workflows/ci.yaml +10 -6
  5. data/.gitignore +0 -1
  6. data/.rubocop.yml +7 -1
  7. data/CLAUDE.md +2 -2
  8. data/CONTRIBUTING.md +2 -0
  9. data/Gemfile +19 -18
  10. data/Gemfile.lock +35 -58
  11. data/README.md +118 -1432
  12. data/README_LEGACY.md +1464 -0
  13. data/Rakefile +39 -4
  14. data/dev.yml +29 -0
  15. data/dsl/agent_sessions.rb +20 -0
  16. data/dsl/async_cogs.rb +49 -0
  17. data/dsl/async_cogs_complex.rb +67 -0
  18. data/dsl/call.rb +44 -0
  19. data/dsl/collect_from.rb +72 -0
  20. data/dsl/json_output.rb +28 -0
  21. data/dsl/map.rb +55 -0
  22. data/dsl/map_reduce.rb +37 -0
  23. data/dsl/map_with_index.rb +49 -0
  24. data/dsl/next_break.rb +40 -0
  25. data/dsl/next_break_parallel.rb +44 -0
  26. data/dsl/outputs.rb +39 -0
  27. data/dsl/outputs_bang.rb +36 -0
  28. data/dsl/parallel_map.rb +37 -0
  29. data/dsl/prompts/simple_prompt.md.erb +3 -0
  30. data/dsl/prototype.rb +5 -7
  31. data/dsl/repeat_loop_results.rb +53 -0
  32. data/dsl/ruby_cog.rb +72 -0
  33. data/dsl/simple_agent.rb +18 -0
  34. data/dsl/simple_chat.rb +15 -1
  35. data/dsl/simple_repeat.rb +29 -0
  36. data/dsl/skip.rb +36 -0
  37. data/dsl/step_communication.rb +2 -3
  38. data/dsl/targets_and_params.rb +57 -0
  39. data/dsl/temperature.rb +17 -0
  40. data/dsl/temporary_directory.rb +22 -0
  41. data/dsl/tutorial/01_your_first_workflow/README.md +179 -0
  42. data/dsl/tutorial/01_your_first_workflow/configured_chat.rb +33 -0
  43. data/dsl/tutorial/01_your_first_workflow/hello.rb +23 -0
  44. data/dsl/tutorial/02_chaining_cogs/README.md +310 -0
  45. data/dsl/tutorial/02_chaining_cogs/code_review.rb +104 -0
  46. data/dsl/tutorial/02_chaining_cogs/session_resumption.rb +92 -0
  47. data/dsl/tutorial/02_chaining_cogs/simple_chain.rb +84 -0
  48. data/dsl/tutorial/03_targets_and_params/README.md +230 -0
  49. data/dsl/tutorial/03_targets_and_params/multiple_targets.rb +65 -0
  50. data/dsl/tutorial/03_targets_and_params/single_target.rb +65 -0
  51. data/dsl/tutorial/04_configuration_options/README.md +209 -0
  52. data/dsl/tutorial/04_configuration_options/control_display_and_temperature.rb +104 -0
  53. data/dsl/tutorial/04_configuration_options/simple_config.rb +68 -0
  54. data/dsl/tutorial/05_control_flow/README.md +156 -0
  55. data/dsl/tutorial/05_control_flow/conditional_execution.rb +62 -0
  56. data/dsl/tutorial/05_control_flow/handling_failures.rb +77 -0
  57. data/dsl/tutorial/06_reusable_scopes/README.md +172 -0
  58. data/dsl/tutorial/06_reusable_scopes/accessing_scope_outputs.rb +126 -0
  59. data/dsl/tutorial/06_reusable_scopes/basic_scope.rb +63 -0
  60. data/dsl/tutorial/06_reusable_scopes/parameterized_scope.rb +78 -0
  61. data/dsl/tutorial/07_processing_collections/README.md +152 -0
  62. data/dsl/tutorial/07_processing_collections/basic_map.rb +70 -0
  63. data/dsl/tutorial/07_processing_collections/parallel_map.rb +74 -0
  64. data/dsl/tutorial/08_iterative_workflows/README.md +231 -0
  65. data/dsl/tutorial/08_iterative_workflows/basic_repeat.rb +57 -0
  66. data/dsl/tutorial/08_iterative_workflows/conditional_break.rb +57 -0
  67. data/dsl/tutorial/09_async_cogs/README.md +197 -0
  68. data/dsl/tutorial/09_async_cogs/basic_async.rb +38 -0
  69. data/dsl/tutorial/README.md +222 -0
  70. data/dsl/working_directory.rb +16 -0
  71. data/exe/roast +1 -1
  72. data/internal/documentation/architectural-notes.md +115 -0
  73. data/internal/documentation/doc-comments-external.md +686 -0
  74. data/internal/documentation/doc-comments-internal.md +342 -0
  75. data/internal/documentation/doc-comments.md +211 -0
  76. data/lib/roast/dsl/cog/config.rb +274 -3
  77. data/lib/roast/dsl/cog/input.rb +53 -10
  78. data/lib/roast/dsl/cog/output.rb +297 -8
  79. data/lib/roast/dsl/cog/registry.rb +35 -3
  80. data/lib/roast/dsl/cog/stack.rb +1 -1
  81. data/lib/roast/dsl/cog/store.rb +5 -5
  82. data/lib/roast/dsl/cog.rb +70 -14
  83. data/lib/roast/dsl/cog_input_context.rb +36 -1
  84. data/lib/roast/dsl/cog_input_manager.rb +116 -7
  85. data/lib/roast/dsl/cogs/agent/config.rb +465 -0
  86. data/lib/roast/dsl/cogs/agent/input.rb +81 -0
  87. data/lib/roast/dsl/cogs/agent/output.rb +59 -0
  88. data/lib/roast/dsl/cogs/agent/provider.rb +51 -0
  89. data/lib/roast/dsl/cogs/agent/providers/claude/claude_invocation.rb +185 -0
  90. data/lib/roast/dsl/cogs/agent/providers/claude/message.rb +73 -0
  91. data/lib/roast/dsl/cogs/agent/providers/claude/messages/assistant_message.rb +36 -0
  92. data/lib/roast/dsl/cogs/agent/providers/claude/messages/result_message.rb +61 -0
  93. data/lib/roast/dsl/cogs/agent/providers/claude/messages/system_message.rb +47 -0
  94. data/lib/roast/dsl/cogs/agent/providers/claude/messages/text_message.rb +36 -0
  95. data/lib/roast/dsl/cogs/agent/providers/claude/messages/tool_result_message.rb +47 -0
  96. data/lib/roast/dsl/cogs/agent/providers/claude/messages/tool_use_message.rb +46 -0
  97. data/lib/roast/dsl/cogs/agent/providers/claude/messages/unknown_message.rb +27 -0
  98. data/lib/roast/dsl/cogs/agent/providers/claude/messages/user_message.rb +37 -0
  99. data/lib/roast/dsl/cogs/agent/providers/claude/tool_result.rb +51 -0
  100. data/lib/roast/dsl/cogs/agent/providers/claude/tool_use.rb +48 -0
  101. data/lib/roast/dsl/cogs/agent/providers/claude.rb +31 -0
  102. data/lib/roast/dsl/cogs/agent/stats.rb +92 -0
  103. data/lib/roast/dsl/cogs/agent/usage.rb +62 -0
  104. data/lib/roast/dsl/cogs/agent.rb +75 -0
  105. data/lib/roast/dsl/cogs/chat/config.rb +453 -0
  106. data/lib/roast/dsl/cogs/chat/input.rb +92 -0
  107. data/lib/roast/dsl/cogs/chat/output.rb +64 -0
  108. data/lib/roast/dsl/cogs/chat/session.rb +68 -0
  109. data/lib/roast/dsl/cogs/chat.rb +59 -56
  110. data/lib/roast/dsl/cogs/cmd.rb +248 -61
  111. data/lib/roast/dsl/cogs/ruby.rb +171 -0
  112. data/lib/roast/dsl/command_runner.rb +191 -0
  113. data/lib/roast/dsl/config_manager.rb +58 -11
  114. data/lib/roast/dsl/control_flow.rb +41 -0
  115. data/lib/roast/dsl/execution_manager.rb +162 -32
  116. data/lib/roast/dsl/nil_assertions.rb +23 -0
  117. data/lib/roast/dsl/system_cog/params.rb +32 -0
  118. data/lib/roast/dsl/system_cog.rb +36 -0
  119. data/lib/roast/dsl/system_cogs/call.rb +162 -0
  120. data/lib/roast/dsl/system_cogs/map.rb +448 -0
  121. data/lib/roast/dsl/system_cogs/repeat.rb +242 -0
  122. data/lib/roast/dsl/workflow.rb +26 -16
  123. data/lib/roast/dsl/workflow_context.rb +20 -0
  124. data/lib/roast/dsl/workflow_params.rb +24 -0
  125. data/lib/roast/sorbet_runtime_stub.rb +154 -0
  126. data/lib/roast/tools/apply_diff.rb +1 -3
  127. data/lib/roast/tools/cmd.rb +4 -3
  128. data/lib/roast/tools/read_file.rb +1 -1
  129. data/lib/roast/tools/update_files.rb +1 -1
  130. data/lib/roast/tools/write_file.rb +1 -1
  131. data/lib/roast/version.rb +1 -1
  132. data/lib/roast/workflow/base_workflow.rb +4 -0
  133. data/lib/roast/workflow/step_loader.rb +14 -2
  134. data/lib/roast-ai.rb +4 -0
  135. data/lib/roast.rb +58 -21
  136. data/{roast.gemspec → roast-ai.gemspec} +9 -13
  137. data/sorbet/rbi/gems/async@2.34.0.rbi +1577 -0
  138. data/sorbet/rbi/gems/cli-kit@5.2.0.rbi +2063 -0
  139. data/sorbet/rbi/gems/{cli-ui@2.3.0.rbi → cli-ui@2.7.0-6bdefd1d06305e5d6ae312ac76f9c88f88658dda.rbi} +1418 -1013
  140. data/sorbet/rbi/gems/console@1.34.2.rbi +1193 -0
  141. data/sorbet/rbi/gems/fiber-annotation@0.2.0.rbi +50 -0
  142. data/sorbet/rbi/gems/fiber-local@1.1.0.rbi +35 -0
  143. data/sorbet/rbi/gems/fiber-storage@1.0.1.rbi +41 -0
  144. data/sorbet/rbi/gems/io-event@1.14.0.rbi +724 -0
  145. data/sorbet/rbi/gems/metrics@0.15.0.rbi +9 -0
  146. data/sorbet/rbi/gems/traces@0.18.2.rbi +9 -0
  147. data/sorbet/rbi/shims/lib/roast/dsl/cog_input_context.rbi +1185 -5
  148. data/sorbet/rbi/shims/lib/roast/dsl/config_context.rbi +311 -5
  149. data/sorbet/rbi/shims/lib/roast/dsl/execution_context.rbi +486 -5
  150. data/sorbet/tapioca/config.yml +6 -0
  151. data/sorbet/tapioca/require.rb +2 -0
  152. metadata +157 -30
  153. data/dsl/less_simple.rb +0 -112
  154. data/dsl/scoped_executors.rb +0 -28
  155. data/dsl/simple.rb +0 -8
  156. data/lib/roast/dsl/cogs/execute.rb +0 -46
  157. data/lib/roast/dsl/cogs/graph.rb +0 -53
  158. data/sorbet/rbi/gems/cgi@0.5.0.rbi +0 -2961
  159. data/sorbet/rbi/gems/claude_swarm@0.1.19.rbi +0 -568
  160. data/sorbet/rbi/gems/cli-kit@5.0.1.rbi +0 -1991
  161. data/sorbet/rbi/gems/dry-configurable@1.3.0.rbi +0 -672
  162. data/sorbet/rbi/gems/dry-core@1.1.0.rbi +0 -1894
  163. data/sorbet/rbi/gems/dry-inflector@1.2.0.rbi +0 -659
  164. data/sorbet/rbi/gems/dry-initializer@3.2.0.rbi +0 -781
  165. data/sorbet/rbi/gems/dry-logic@1.6.0.rbi +0 -1127
  166. data/sorbet/rbi/gems/dry-schema@1.14.1.rbi +0 -3727
  167. data/sorbet/rbi/gems/dry-types@1.8.3.rbi +0 -3969
  168. data/sorbet/rbi/gems/fast-mcp-annotations@1.5.3.rbi +0 -1588
  169. data/sorbet/rbi/gems/mime-types-data@3.2025.0617.rbi +0 -136
  170. data/sorbet/rbi/gems/mime-types@3.7.0.rbi +0 -1342
  171. data/sorbet/rbi/gems/rack@2.2.19.rbi +0 -5676
  172. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +0 -435
  173. data/sorbet/rbi/gems/yard@0.9.37.rbi +0 -18492
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.10
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
@@ -23,34 +23,62 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '7.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: async
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.34'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.34'
40
+ - !ruby/object:Gem::Dependency
41
+ name: benchmark
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.4.1
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.4.1
26
54
  - !ruby/object:Gem::Dependency
27
55
  name: cli-kit
28
56
  requirement: !ruby/object:Gem::Requirement
29
57
  requirements:
30
58
  - - "~>"
31
59
  - !ruby/object:Gem::Version
32
- version: '5.0'
60
+ version: '5.2'
33
61
  type: :runtime
34
62
  prerelease: false
35
63
  version_requirements: !ruby/object:Gem::Requirement
36
64
  requirements:
37
65
  - - "~>"
38
66
  - !ruby/object:Gem::Version
39
- version: '5.0'
67
+ version: '5.2'
40
68
  - !ruby/object:Gem::Dependency
41
69
  name: cli-ui
42
70
  requirement: !ruby/object:Gem::Requirement
43
71
  requirements:
44
- - - '='
72
+ - - "~>"
45
73
  - !ruby/object:Gem::Version
46
- version: 2.3.0
74
+ version: '2.7'
47
75
  type: :runtime
48
76
  prerelease: false
49
77
  version_requirements: !ruby/object:Gem::Requirement
50
78
  requirements:
51
- - - '='
79
+ - - "~>"
52
80
  - !ruby/object:Gem::Version
53
- version: 2.3.0
81
+ version: '2.7'
54
82
  - !ruby/object:Gem::Dependency
55
83
  name: diff-lcs
56
84
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +135,20 @@ dependencies:
107
135
  - - "~>"
108
136
  - !ruby/object:Gem::Version
109
137
  version: 1.0.2
138
+ - !ruby/object:Gem::Dependency
139
+ name: rake
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 13.3.0
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 13.3.0
110
152
  - !ruby/object:Gem::Dependency
111
153
  name: ruby-graphviz
112
154
  requirement: !ruby/object:Gem::Requirement
@@ -186,6 +228,7 @@ executables:
186
228
  extensions: []
187
229
  extra_rdoc_files: []
188
230
  files:
231
+ - ".claude/commands/docs/write-comments.md"
189
232
  - ".claude/settings.json"
190
233
  - ".github/CODEOWNERS"
191
234
  - ".github/workflows/ci.yaml"
@@ -202,6 +245,7 @@ files:
202
245
  - Gemfile.lock
203
246
  - LICENSE.md
204
247
  - README.md
248
+ - README_LEGACY.md
205
249
  - Rakefile
206
250
  - bin/console
207
251
  - bin/roast
@@ -211,15 +255,29 @@ files:
211
255
  - bin/srb-rbi
212
256
  - bin/tapioca
213
257
  - claude-swarm.yml
258
+ - dev.yml
214
259
  - docs/AGENT_STEPS.md
215
260
  - docs/INSTRUMENTATION.md
216
261
  - docs/ITERATION_SYNTAX.md
217
262
  - docs/VALIDATION.md
263
+ - dsl/agent_sessions.rb
264
+ - dsl/async_cogs.rb
265
+ - dsl/async_cogs_complex.rb
266
+ - dsl/call.rb
267
+ - dsl/collect_from.rb
218
268
  - dsl/demo/Gemfile
219
269
  - dsl/demo/Gemfile.lock
220
270
  - dsl/demo/cogs/local.rb
221
271
  - dsl/demo/simple_external_cog.rb
222
- - dsl/less_simple.rb
272
+ - dsl/json_output.rb
273
+ - dsl/map.rb
274
+ - dsl/map_reduce.rb
275
+ - dsl/map_with_index.rb
276
+ - dsl/next_break.rb
277
+ - dsl/next_break_parallel.rb
278
+ - dsl/outputs.rb
279
+ - dsl/outputs_bang.rb
280
+ - dsl/parallel_map.rb
223
281
  - dsl/plugin-gem-example/.gitignore
224
282
  - dsl/plugin-gem-example/Gemfile
225
283
  - dsl/plugin-gem-example/Gemfile.lock
@@ -228,11 +286,48 @@ files:
228
286
  - dsl/plugin-gem-example/lib/simple.rb
229
287
  - dsl/plugin-gem-example/lib/version.rb
230
288
  - dsl/plugin-gem-example/plugin-gem-example.gemspec
289
+ - dsl/prompts/simple_prompt.md.erb
231
290
  - dsl/prototype.rb
232
- - dsl/scoped_executors.rb
233
- - dsl/simple.rb
291
+ - dsl/repeat_loop_results.rb
292
+ - dsl/ruby_cog.rb
293
+ - dsl/simple_agent.rb
234
294
  - dsl/simple_chat.rb
295
+ - dsl/simple_repeat.rb
296
+ - dsl/skip.rb
235
297
  - dsl/step_communication.rb
298
+ - dsl/targets_and_params.rb
299
+ - dsl/temperature.rb
300
+ - dsl/temporary_directory.rb
301
+ - dsl/tutorial/01_your_first_workflow/README.md
302
+ - dsl/tutorial/01_your_first_workflow/configured_chat.rb
303
+ - dsl/tutorial/01_your_first_workflow/hello.rb
304
+ - dsl/tutorial/02_chaining_cogs/README.md
305
+ - dsl/tutorial/02_chaining_cogs/code_review.rb
306
+ - dsl/tutorial/02_chaining_cogs/session_resumption.rb
307
+ - dsl/tutorial/02_chaining_cogs/simple_chain.rb
308
+ - dsl/tutorial/03_targets_and_params/README.md
309
+ - dsl/tutorial/03_targets_and_params/multiple_targets.rb
310
+ - dsl/tutorial/03_targets_and_params/single_target.rb
311
+ - dsl/tutorial/04_configuration_options/README.md
312
+ - dsl/tutorial/04_configuration_options/control_display_and_temperature.rb
313
+ - dsl/tutorial/04_configuration_options/simple_config.rb
314
+ - dsl/tutorial/05_control_flow/README.md
315
+ - dsl/tutorial/05_control_flow/conditional_execution.rb
316
+ - dsl/tutorial/05_control_flow/handling_failures.rb
317
+ - dsl/tutorial/06_reusable_scopes/README.md
318
+ - dsl/tutorial/06_reusable_scopes/accessing_scope_outputs.rb
319
+ - dsl/tutorial/06_reusable_scopes/basic_scope.rb
320
+ - dsl/tutorial/06_reusable_scopes/parameterized_scope.rb
321
+ - dsl/tutorial/07_processing_collections/README.md
322
+ - dsl/tutorial/07_processing_collections/basic_map.rb
323
+ - dsl/tutorial/07_processing_collections/parallel_map.rb
324
+ - dsl/tutorial/08_iterative_workflows/README.md
325
+ - dsl/tutorial/08_iterative_workflows/basic_repeat.rb
326
+ - dsl/tutorial/08_iterative_workflows/conditional_break.rb
327
+ - dsl/tutorial/09_async_cogs/README.md
328
+ - dsl/tutorial/09_async_cogs/basic_async.rb
329
+ - dsl/tutorial/README.md
330
+ - dsl/working_directory.rb
236
331
  - examples/README.md
237
332
  - examples/available_tools_demo/README.md
238
333
  - examples/available_tools_demo/analyze_files/prompt.md
@@ -256,6 +351,11 @@ files:
256
351
  - exe/roast
257
352
  - gemfiles/activesupport7.gemfile
258
353
  - gemfiles/activesupport8.gemfile
354
+ - internal/documentation/architectural-notes.md
355
+ - internal/documentation/doc-comments-external.md
356
+ - internal/documentation/doc-comments-internal.md
357
+ - internal/documentation/doc-comments.md
358
+ - lib/roast-ai.rb
259
359
  - lib/roast.rb
260
360
  - lib/roast/dsl.rb
261
361
  - lib/roast/dsl/cog.rb
@@ -267,15 +367,48 @@ files:
267
367
  - lib/roast/dsl/cog/store.rb
268
368
  - lib/roast/dsl/cog_input_context.rb
269
369
  - lib/roast/dsl/cog_input_manager.rb
370
+ - lib/roast/dsl/cogs/agent.rb
371
+ - lib/roast/dsl/cogs/agent/config.rb
372
+ - lib/roast/dsl/cogs/agent/input.rb
373
+ - lib/roast/dsl/cogs/agent/output.rb
374
+ - lib/roast/dsl/cogs/agent/provider.rb
375
+ - lib/roast/dsl/cogs/agent/providers/claude.rb
376
+ - lib/roast/dsl/cogs/agent/providers/claude/claude_invocation.rb
377
+ - lib/roast/dsl/cogs/agent/providers/claude/message.rb
378
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/assistant_message.rb
379
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/result_message.rb
380
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/system_message.rb
381
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/text_message.rb
382
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/tool_result_message.rb
383
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/tool_use_message.rb
384
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/unknown_message.rb
385
+ - lib/roast/dsl/cogs/agent/providers/claude/messages/user_message.rb
386
+ - lib/roast/dsl/cogs/agent/providers/claude/tool_result.rb
387
+ - lib/roast/dsl/cogs/agent/providers/claude/tool_use.rb
388
+ - lib/roast/dsl/cogs/agent/stats.rb
389
+ - lib/roast/dsl/cogs/agent/usage.rb
270
390
  - lib/roast/dsl/cogs/chat.rb
391
+ - lib/roast/dsl/cogs/chat/config.rb
392
+ - lib/roast/dsl/cogs/chat/input.rb
393
+ - lib/roast/dsl/cogs/chat/output.rb
394
+ - lib/roast/dsl/cogs/chat/session.rb
271
395
  - lib/roast/dsl/cogs/cmd.rb
272
- - lib/roast/dsl/cogs/execute.rb
273
- - lib/roast/dsl/cogs/graph.rb
396
+ - lib/roast/dsl/cogs/ruby.rb
397
+ - lib/roast/dsl/command_runner.rb
274
398
  - lib/roast/dsl/config_context.rb
275
399
  - lib/roast/dsl/config_manager.rb
400
+ - lib/roast/dsl/control_flow.rb
276
401
  - lib/roast/dsl/execution_context.rb
277
402
  - lib/roast/dsl/execution_manager.rb
403
+ - lib/roast/dsl/nil_assertions.rb
404
+ - lib/roast/dsl/system_cog.rb
405
+ - lib/roast/dsl/system_cog/params.rb
406
+ - lib/roast/dsl/system_cogs/call.rb
407
+ - lib/roast/dsl/system_cogs/map.rb
408
+ - lib/roast/dsl/system_cogs/repeat.rb
278
409
  - lib/roast/dsl/workflow.rb
410
+ - lib/roast/dsl/workflow_context.rb
411
+ - lib/roast/dsl/workflow_params.rb
279
412
  - lib/roast/error.rb
280
413
  - lib/roast/errors.rb
281
414
  - lib/roast/factories/api_provider_factory.rb
@@ -301,6 +434,7 @@ files:
301
434
  - lib/roast/resources/url_resource.rb
302
435
  - lib/roast/services/context_threshold_checker.rb
303
436
  - lib/roast/services/token_counting_service.rb
437
+ - lib/roast/sorbet_runtime_stub.rb
304
438
  - lib/roast/tools.rb
305
439
  - lib/roast/tools/apply_diff.rb
306
440
  - lib/roast/tools/ask_user.rb
@@ -390,7 +524,7 @@ files:
390
524
  - lib/roast/workflow/workflow_initializer.rb
391
525
  - lib/roast/workflow/workflow_runner.rb
392
526
  - lib/roast/workflow_diagram_generator.rb
393
- - roast.gemspec
527
+ - roast-ai.gemspec
394
528
  - rubocop/cop/roast.rb
395
529
  - rubocop/cop/roast/use_cmd_runner.rb
396
530
  - schema/workflow.json
@@ -409,42 +543,38 @@ files:
409
543
  - sorbet/rbi/gems/activesupport@8.0.2.rbi
410
544
  - sorbet/rbi/gems/addressable@2.8.7.rbi
411
545
  - sorbet/rbi/gems/ast@2.4.3.rbi
546
+ - sorbet/rbi/gems/async@2.34.0.rbi
412
547
  - sorbet/rbi/gems/base64@0.3.0.rbi
413
548
  - sorbet/rbi/gems/benchmark@0.4.1.rbi
414
549
  - sorbet/rbi/gems/bigdecimal@3.2.2.rbi
415
- - sorbet/rbi/gems/cgi@0.5.0.rbi
416
- - sorbet/rbi/gems/claude_swarm@0.1.19.rbi
417
- - sorbet/rbi/gems/cli-kit@5.0.1.rbi
418
- - sorbet/rbi/gems/cli-ui@2.3.0.rbi
550
+ - sorbet/rbi/gems/cli-kit@5.2.0.rbi
551
+ - sorbet/rbi/gems/cli-ui@2.7.0-6bdefd1d06305e5d6ae312ac76f9c88f88658dda.rbi
419
552
  - sorbet/rbi/gems/coderay@1.1.3.rbi
420
553
  - sorbet/rbi/gems/concurrent-ruby@1.3.5.rbi
421
554
  - sorbet/rbi/gems/connection_pool@2.5.3.rbi
555
+ - sorbet/rbi/gems/console@1.34.2.rbi
422
556
  - sorbet/rbi/gems/crack@1.0.0.rbi
423
557
  - sorbet/rbi/gems/diff-lcs@1.6.2.rbi
424
558
  - sorbet/rbi/gems/docile@1.4.1.rbi
425
559
  - sorbet/rbi/gems/dotenv@3.1.8.rbi
426
560
  - sorbet/rbi/gems/drb@2.2.3.rbi
427
- - sorbet/rbi/gems/dry-configurable@1.3.0.rbi
428
- - sorbet/rbi/gems/dry-core@1.1.0.rbi
429
- - sorbet/rbi/gems/dry-inflector@1.2.0.rbi
430
- - sorbet/rbi/gems/dry-initializer@3.2.0.rbi
431
- - sorbet/rbi/gems/dry-logic@1.6.0.rbi
432
- - sorbet/rbi/gems/dry-schema@1.14.1.rbi
433
- - sorbet/rbi/gems/dry-types@1.8.3.rbi
434
561
  - sorbet/rbi/gems/erubi@1.13.1.rbi
435
562
  - sorbet/rbi/gems/event_stream_parser@1.0.0.rbi
436
563
  - sorbet/rbi/gems/faraday-multipart@1.1.1.rbi
437
564
  - sorbet/rbi/gems/faraday-net_http@3.4.1.rbi
438
565
  - sorbet/rbi/gems/faraday-retry@2.3.2.rbi
439
566
  - sorbet/rbi/gems/faraday@2.13.1.rbi
440
- - sorbet/rbi/gems/fast-mcp-annotations@1.5.3.rbi
441
567
  - sorbet/rbi/gems/ffi@1.17.2.rbi
568
+ - sorbet/rbi/gems/fiber-annotation@0.2.0.rbi
569
+ - sorbet/rbi/gems/fiber-local@1.1.0.rbi
570
+ - sorbet/rbi/gems/fiber-storage@1.0.1.rbi
442
571
  - sorbet/rbi/gems/formatador@1.1.0.rbi
443
572
  - sorbet/rbi/gems/guard-compat@1.2.1.rbi
444
573
  - sorbet/rbi/gems/guard-minitest@2.4.6.rbi
445
574
  - sorbet/rbi/gems/guard@2.19.1.rbi
446
575
  - sorbet/rbi/gems/hashdiff@1.2.0.rbi
447
576
  - sorbet/rbi/gems/i18n@1.14.7.rbi
577
+ - sorbet/rbi/gems/io-event@1.14.0.rbi
448
578
  - sorbet/rbi/gems/json-schema@5.1.1.rbi
449
579
  - sorbet/rbi/gems/json@2.12.2.rbi
450
580
  - sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi
@@ -454,8 +584,7 @@ files:
454
584
  - sorbet/rbi/gems/lumberjack@1.2.10.rbi
455
585
  - sorbet/rbi/gems/marcel@1.1.0.rbi
456
586
  - sorbet/rbi/gems/method_source@1.1.0.rbi
457
- - sorbet/rbi/gems/mime-types-data@3.2025.0617.rbi
458
- - sorbet/rbi/gems/mime-types@3.7.0.rbi
587
+ - sorbet/rbi/gems/metrics@0.15.0.rbi
459
588
  - sorbet/rbi/gems/minitest-rg@5.3.0.rbi
460
589
  - sorbet/rbi/gems/minitest@5.25.5.rbi
461
590
  - sorbet/rbi/gems/mocha@2.7.1.rbi
@@ -472,7 +601,6 @@ files:
472
601
  - sorbet/rbi/gems/pry@0.15.2.rbi
473
602
  - sorbet/rbi/gems/public_suffix@6.0.2.rbi
474
603
  - sorbet/rbi/gems/racc@1.8.1.rbi
475
- - sorbet/rbi/gems/rack@2.2.19.rbi
476
604
  - sorbet/rbi/gems/rainbow@3.1.1.rbi
477
605
  - sorbet/rbi/gems/raix@1.0.2.rbi
478
606
  - sorbet/rbi/gems/rake@13.3.0.rbi
@@ -500,14 +628,13 @@ files:
500
628
  - sorbet/rbi/gems/sqlite3@2.7.0.rbi
501
629
  - sorbet/rbi/gems/tapioca@0.16.11.rbi
502
630
  - sorbet/rbi/gems/thor@1.4.0.rbi
631
+ - sorbet/rbi/gems/traces@0.18.2.rbi
503
632
  - sorbet/rbi/gems/tzinfo@2.0.6.rbi
504
633
  - sorbet/rbi/gems/unicode-display_width@3.1.4.rbi
505
634
  - sorbet/rbi/gems/unicode-emoji@4.0.4.rbi
506
635
  - sorbet/rbi/gems/uri@1.0.3.rbi
507
636
  - sorbet/rbi/gems/vcr@6.3.1.rbi
508
637
  - sorbet/rbi/gems/webmock@3.25.1.rbi
509
- - sorbet/rbi/gems/yard-sorbet@0.9.0.rbi
510
- - sorbet/rbi/gems/yard@0.9.37.rbi
511
638
  - sorbet/rbi/gems/zeitwerk@2.7.3.rbi
512
639
  - sorbet/rbi/shims/lib/roast/dsl/cog_input_context.rbi
513
640
  - sorbet/rbi/shims/lib/roast/dsl/config_context.rbi
data/dsl/less_simple.rb DELETED
@@ -1,112 +0,0 @@
1
- # typed: false
2
- # frozen_string_literal: true
3
-
4
- #### cmd
5
-
6
- # Passing just the command to execute will run it and return the output
7
- cmd <<~SHELLSTEP
8
- echo "raw run without storing, should see me once""
9
- SHELLSTEP
10
-
11
- # Passing a name finds or creates an object and returns that
12
- cmd_cog = cmd(:hello)
13
- puts "This is our new cmd_cog named ':hello': #{cmd_cog}"
14
-
15
- # We can set a command to run for later
16
- cmd(:set_and_run).set("echo 'set_and_run, should see me once'")
17
- cmd(:set_and_run).run
18
-
19
- # Similarly, we can run immediately and then re-run later
20
- cmd(:run_and_rerun).run("echo 'run_and_rerun, should see me twice'")
21
- cmd(:run_and_rerun).run
22
-
23
- #### graph
24
-
25
- # We can open and re-open a graph, and then execute it
26
- graph(:updatable) do |graph|
27
- graph.node(:open_cmd) do |state|
28
- state[:open] = cmd("echo 'From a node added in first open, should see me once'")
29
- end
30
- end
31
-
32
- graph(:updatable) do |graph|
33
- graph.node(:reopen_cmd) do |state|
34
- state[:reopen] = cmd("echo 'From a node added in reopen, should see me once'")
35
- end
36
- end
37
-
38
- graph(:yea).execute
39
-
40
- # We can also just populate and execute a graph in one go by calling graph.execute in the block.
41
- graph(:define_and_exec) do |graph|
42
- graph.node(:hi) do |state|
43
- state[:hi_msg] = cmd("echo 'hi msg'")
44
- end
45
-
46
- graph.execute
47
- end
48
-
49
- # We can have subgraphs, because why not
50
- graph(:outer) do |graph|
51
- graph.subgraph(:inner) do |subgraph|
52
- subgraph.node(:inner_node) do |inner_state|
53
- inner_state[:foo] = cmd("echo 'inner_state foo'")
54
- end
55
- end
56
-
57
- graph.node(:outer) do |outer_state|
58
- outer_state[:bar] = cmd("echo 'outer_state bar'")
59
- end
60
-
61
- graph.execute
62
- end
63
-
64
- # We can specify our own edges
65
- graph(:edges) do |graph|
66
- graph.node(:thing1) do |state|
67
- state[:thing1] = cmd("echo 'thing1'")
68
- end
69
-
70
- graph.node(:thing2) do |state|
71
- state[:thing2] = cmd("echo 'thing2'")
72
- end
73
-
74
- graph.edge(from: :START, to: :thing1)
75
- graph.edge(from: :thing1, to: :thing2)
76
- graph.edge(from: :thing2, to: :DONE)
77
-
78
- graph.execute
79
- end
80
-
81
- # We can have parallel execution
82
- graph(:parallel) do |graph|
83
- graph.node(:thing1) do |state|
84
- state[:thing1] = cmd("sleep 0.5 && echo 'parallel thing1'")
85
- end
86
-
87
- graph.node(:thing2) do |state|
88
- state[:thing2] = cmd("sleep 0.5 && echo 'parallel thing2'")
89
- end
90
-
91
- graph.edge(from: :START, to: [:thing1, :thing2])
92
- graph.edge(from: [:thing1, :thing2], to: :DONE)
93
-
94
- graph.execute
95
- end
96
-
97
- # We can have edges that are defined with a block
98
- graph(:quantum) do |graph|
99
- graph.node(:thing1) do |state|
100
- state[:thing1] = cmd("echo 'quantum thing1'")
101
- end
102
-
103
- graph.edge(from: :START) do |_state|
104
- :thing1
105
- end
106
-
107
- graph.edge(from: :thing1) do |_state|
108
- :DONE
109
- end
110
-
111
- graph.execute
112
- end
@@ -1,28 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- #: self as Roast::DSL::Workflow
5
-
6
- config do
7
- cmd do
8
- print_all!
9
- end
10
- end
11
-
12
- execute(:capitalize_a_random_word) do
13
- cmd(:word) { "shuf /usr/share/dict/words -n 1" }
14
- cmd(:capitalize) do |my|
15
- word = cmd(:word).out.strip
16
- my.command = "sh"
17
- my.args << "-c"
18
- my.args << "echo '#{word}' | tr '[:lower:]' '[:upper:]'"
19
- end
20
- end
21
-
22
- execute do
23
- cmd(:before) { "echo '--> before'" }
24
- execute { :capitalize_a_random_word }
25
- execute { :capitalize_a_random_word }
26
- execute { :capitalize_a_random_word }
27
- cmd(:after) { "echo '--> after'" }
28
- end
data/dsl/simple.rb DELETED
@@ -1,8 +0,0 @@
1
- # typed: false
2
- # frozen_string_literal: true
3
-
4
- # This is a dead simple workflow that calls two commands
5
- cmd <<~CMDSTEP
6
- echo "I have no idea what's going on"
7
- CMDSTEP
8
- cmd "pwd"
@@ -1,46 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Roast
5
- module DSL
6
- module Cogs
7
- class Execute < Cog
8
- class Input < Cog::Input
9
- #: Symbol?
10
- attr_accessor :scope
11
-
12
- #: () -> void
13
- def initialize
14
- super
15
- @scope = nil
16
- end
17
-
18
- #: () -> void
19
- def validate!
20
- raise Cog::Input::InvalidInputError, "'scope' is required" unless scope.present?
21
- end
22
-
23
- #: (Symbol) -> void
24
- def coerce(input_return_value)
25
- self.scope = input_return_value
26
- end
27
- end
28
-
29
- #: (Symbol, ^(Input) -> untyped, ^(Input) -> void) -> void
30
- def initialize(name, cog_input_proc, trigger)
31
- # NOTE: Sorbet expects the proc passed to super to be declared as taking a Cog::Input explicitly,
32
- # not a subclass of Cog::Input.
33
- cog_input_proc = cog_input_proc #: as ^(Cog::Input) -> untyped
34
- super(name, cog_input_proc)
35
- @trigger = trigger
36
- end
37
-
38
- #: (Input) -> Cog::Output
39
- def execute(input)
40
- @trigger.call(input)
41
- Cog::Output.new
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,53 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Roast
5
- module DSL
6
- module Cogs
7
- class Graph < Roast::DSL::Cog
8
- #: Proc
9
- attr_reader :block
10
-
11
- #: (Symbol) { (Cog::Input) -> untyped } -> void
12
- def initialize(name, &block)
13
- @name = name
14
- @block = block
15
- @graph = Roast::Graph.new
16
- super(name, block)
17
- end
18
-
19
- #: () -> void
20
- def on_invoke
21
- populate!(@graph)
22
- end
23
-
24
- #: () -> Symbol
25
- def store_id
26
- @name.to_sym
27
- end
28
-
29
- #: (Roast::DSL::Cog) -> void
30
- def update(other)
31
- return unless other.is_a?(Roast::DSL::Cogs::Graph)
32
-
33
- return if other.block.nil?
34
-
35
- other.populate!(@graph)
36
- end
37
-
38
- # Populates the provided graph in-place, with the definition of how to populate in the block
39
- #: (Cog::Input) -> void
40
- def populate!(graph)
41
- return if @block.nil?
42
-
43
- @block.call(graph)
44
- end
45
-
46
- #: () -> void
47
- def execute
48
- @graph.execute
49
- end
50
- end
51
- end
52
- end
53
- end