roast-ai 0.4.9 → 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 (194) 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 +18 -18
  10. data/Gemfile.lock +46 -57
  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/demo/Gemfile +4 -0
  21. data/dsl/demo/Gemfile.lock +120 -0
  22. data/dsl/demo/cogs/local.rb +15 -0
  23. data/dsl/demo/simple_external_cog.rb +17 -0
  24. data/dsl/json_output.rb +28 -0
  25. data/dsl/map.rb +55 -0
  26. data/dsl/map_reduce.rb +37 -0
  27. data/dsl/map_with_index.rb +49 -0
  28. data/dsl/next_break.rb +40 -0
  29. data/dsl/next_break_parallel.rb +44 -0
  30. data/dsl/outputs.rb +39 -0
  31. data/dsl/outputs_bang.rb +36 -0
  32. data/dsl/parallel_map.rb +37 -0
  33. data/dsl/plugin-gem-example/.gitignore +8 -0
  34. data/dsl/plugin-gem-example/Gemfile +13 -0
  35. data/dsl/plugin-gem-example/Gemfile.lock +178 -0
  36. data/dsl/plugin-gem-example/lib/other.rb +17 -0
  37. data/dsl/plugin-gem-example/lib/plugin_gem_example.rb +5 -0
  38. data/dsl/plugin-gem-example/lib/simple.rb +15 -0
  39. data/dsl/plugin-gem-example/lib/version.rb +10 -0
  40. data/dsl/plugin-gem-example/plugin-gem-example.gemspec +28 -0
  41. data/dsl/prompts/simple_prompt.md.erb +3 -0
  42. data/dsl/prototype.rb +10 -4
  43. data/dsl/repeat_loop_results.rb +53 -0
  44. data/dsl/ruby_cog.rb +72 -0
  45. data/dsl/simple_agent.rb +18 -0
  46. data/dsl/simple_chat.rb +26 -0
  47. data/dsl/simple_repeat.rb +29 -0
  48. data/dsl/skip.rb +36 -0
  49. data/dsl/step_communication.rb +10 -5
  50. data/dsl/targets_and_params.rb +57 -0
  51. data/dsl/temperature.rb +17 -0
  52. data/dsl/temporary_directory.rb +22 -0
  53. data/dsl/tutorial/01_your_first_workflow/README.md +179 -0
  54. data/dsl/tutorial/01_your_first_workflow/configured_chat.rb +33 -0
  55. data/dsl/tutorial/01_your_first_workflow/hello.rb +23 -0
  56. data/dsl/tutorial/02_chaining_cogs/README.md +310 -0
  57. data/dsl/tutorial/02_chaining_cogs/code_review.rb +104 -0
  58. data/dsl/tutorial/02_chaining_cogs/session_resumption.rb +92 -0
  59. data/dsl/tutorial/02_chaining_cogs/simple_chain.rb +84 -0
  60. data/dsl/tutorial/03_targets_and_params/README.md +230 -0
  61. data/dsl/tutorial/03_targets_and_params/multiple_targets.rb +65 -0
  62. data/dsl/tutorial/03_targets_and_params/single_target.rb +65 -0
  63. data/dsl/tutorial/04_configuration_options/README.md +209 -0
  64. data/dsl/tutorial/04_configuration_options/control_display_and_temperature.rb +104 -0
  65. data/dsl/tutorial/04_configuration_options/simple_config.rb +68 -0
  66. data/dsl/tutorial/05_control_flow/README.md +156 -0
  67. data/dsl/tutorial/05_control_flow/conditional_execution.rb +62 -0
  68. data/dsl/tutorial/05_control_flow/handling_failures.rb +77 -0
  69. data/dsl/tutorial/06_reusable_scopes/README.md +172 -0
  70. data/dsl/tutorial/06_reusable_scopes/accessing_scope_outputs.rb +126 -0
  71. data/dsl/tutorial/06_reusable_scopes/basic_scope.rb +63 -0
  72. data/dsl/tutorial/06_reusable_scopes/parameterized_scope.rb +78 -0
  73. data/dsl/tutorial/07_processing_collections/README.md +152 -0
  74. data/dsl/tutorial/07_processing_collections/basic_map.rb +70 -0
  75. data/dsl/tutorial/07_processing_collections/parallel_map.rb +74 -0
  76. data/dsl/tutorial/08_iterative_workflows/README.md +231 -0
  77. data/dsl/tutorial/08_iterative_workflows/basic_repeat.rb +57 -0
  78. data/dsl/tutorial/08_iterative_workflows/conditional_break.rb +57 -0
  79. data/dsl/tutorial/09_async_cogs/README.md +197 -0
  80. data/dsl/tutorial/09_async_cogs/basic_async.rb +38 -0
  81. data/dsl/tutorial/README.md +222 -0
  82. data/dsl/working_directory.rb +16 -0
  83. data/exe/roast +1 -1
  84. data/internal/documentation/architectural-notes.md +115 -0
  85. data/internal/documentation/doc-comments-external.md +686 -0
  86. data/internal/documentation/doc-comments-internal.md +342 -0
  87. data/internal/documentation/doc-comments.md +211 -0
  88. data/lib/roast/dsl/cog/config.rb +280 -4
  89. data/lib/roast/dsl/cog/input.rb +73 -0
  90. data/lib/roast/dsl/cog/output.rb +313 -0
  91. data/lib/roast/dsl/cog/registry.rb +71 -0
  92. data/lib/roast/dsl/cog/stack.rb +3 -2
  93. data/lib/roast/dsl/cog/store.rb +11 -8
  94. data/lib/roast/dsl/cog.rb +108 -31
  95. data/lib/roast/dsl/cog_input_context.rb +44 -0
  96. data/lib/roast/dsl/cog_input_manager.rb +156 -0
  97. data/lib/roast/dsl/cogs/agent/config.rb +465 -0
  98. data/lib/roast/dsl/cogs/agent/input.rb +81 -0
  99. data/lib/roast/dsl/cogs/agent/output.rb +59 -0
  100. data/lib/roast/dsl/cogs/agent/provider.rb +51 -0
  101. data/lib/roast/dsl/cogs/agent/providers/claude/claude_invocation.rb +185 -0
  102. data/lib/roast/dsl/cogs/agent/providers/claude/message.rb +73 -0
  103. data/lib/roast/dsl/cogs/agent/providers/claude/messages/assistant_message.rb +36 -0
  104. data/lib/roast/dsl/cogs/agent/providers/claude/messages/result_message.rb +61 -0
  105. data/lib/roast/dsl/cogs/agent/providers/claude/messages/system_message.rb +47 -0
  106. data/lib/roast/dsl/cogs/agent/providers/claude/messages/text_message.rb +36 -0
  107. data/lib/roast/dsl/cogs/agent/providers/claude/messages/tool_result_message.rb +47 -0
  108. data/lib/roast/dsl/cogs/agent/providers/claude/messages/tool_use_message.rb +46 -0
  109. data/lib/roast/dsl/cogs/agent/providers/claude/messages/unknown_message.rb +27 -0
  110. data/lib/roast/dsl/cogs/agent/providers/claude/messages/user_message.rb +37 -0
  111. data/lib/roast/dsl/cogs/agent/providers/claude/tool_result.rb +51 -0
  112. data/lib/roast/dsl/cogs/agent/providers/claude/tool_use.rb +48 -0
  113. data/lib/roast/dsl/cogs/agent/providers/claude.rb +31 -0
  114. data/lib/roast/dsl/cogs/agent/stats.rb +92 -0
  115. data/lib/roast/dsl/cogs/agent/usage.rb +62 -0
  116. data/lib/roast/dsl/cogs/agent.rb +75 -0
  117. data/lib/roast/dsl/cogs/chat/config.rb +453 -0
  118. data/lib/roast/dsl/cogs/chat/input.rb +92 -0
  119. data/lib/roast/dsl/cogs/chat/output.rb +64 -0
  120. data/lib/roast/dsl/cogs/chat/session.rb +68 -0
  121. data/lib/roast/dsl/cogs/chat.rb +81 -0
  122. data/lib/roast/dsl/cogs/cmd.rb +291 -27
  123. data/lib/roast/dsl/cogs/ruby.rb +171 -0
  124. data/lib/roast/dsl/command_runner.rb +191 -0
  125. data/lib/roast/dsl/config_context.rb +2 -47
  126. data/lib/roast/dsl/config_manager.rb +143 -0
  127. data/lib/roast/dsl/control_flow.rb +41 -0
  128. data/lib/roast/dsl/execution_context.rb +9 -0
  129. data/lib/roast/dsl/execution_manager.rb +267 -0
  130. data/lib/roast/dsl/nil_assertions.rb +23 -0
  131. data/lib/roast/dsl/system_cog/params.rb +32 -0
  132. data/lib/roast/dsl/system_cog.rb +36 -0
  133. data/lib/roast/dsl/system_cogs/call.rb +162 -0
  134. data/lib/roast/dsl/system_cogs/map.rb +448 -0
  135. data/lib/roast/dsl/system_cogs/repeat.rb +242 -0
  136. data/lib/roast/dsl/workflow.rb +123 -0
  137. data/lib/roast/dsl/workflow_context.rb +20 -0
  138. data/lib/roast/dsl/workflow_params.rb +24 -0
  139. data/lib/roast/sorbet_runtime_stub.rb +154 -0
  140. data/lib/roast/tools/apply_diff.rb +1 -3
  141. data/lib/roast/tools/cmd.rb +4 -3
  142. data/lib/roast/tools/read_file.rb +1 -1
  143. data/lib/roast/tools/update_files.rb +1 -1
  144. data/lib/roast/tools/write_file.rb +1 -1
  145. data/lib/roast/version.rb +1 -1
  146. data/lib/roast/workflow/base_workflow.rb +4 -0
  147. data/lib/roast/workflow/step_loader.rb +14 -2
  148. data/lib/roast-ai.rb +4 -0
  149. data/lib/roast.rb +60 -22
  150. data/{roast.gemspec → roast-ai.gemspec} +10 -13
  151. data/sorbet/config +1 -0
  152. data/sorbet/rbi/gems/async@2.34.0.rbi +1577 -0
  153. data/sorbet/rbi/gems/cli-kit@5.2.0.rbi +2063 -0
  154. data/sorbet/rbi/gems/{cli-ui@2.3.0.rbi → cli-ui@2.7.0-6bdefd1d06305e5d6ae312ac76f9c88f88658dda.rbi} +1418 -1013
  155. data/sorbet/rbi/gems/console@1.34.2.rbi +1193 -0
  156. data/sorbet/rbi/gems/fiber-annotation@0.2.0.rbi +50 -0
  157. data/sorbet/rbi/gems/fiber-local@1.1.0.rbi +35 -0
  158. data/sorbet/rbi/gems/fiber-storage@1.0.1.rbi +41 -0
  159. data/sorbet/rbi/gems/io-event@1.14.0.rbi +724 -0
  160. data/sorbet/rbi/gems/marcel@1.1.0.rbi +239 -0
  161. data/sorbet/rbi/gems/metrics@0.15.0.rbi +9 -0
  162. data/sorbet/rbi/gems/ruby_llm@1.8.2.rbi +5703 -0
  163. data/sorbet/rbi/gems/traces@0.18.2.rbi +9 -0
  164. data/sorbet/rbi/shims/lib/roast/dsl/cog_input_context.rbi +1197 -0
  165. data/sorbet/rbi/shims/lib/roast/dsl/config_context.rbi +314 -2
  166. data/sorbet/rbi/shims/lib/roast/dsl/execution_context.rbi +498 -0
  167. data/sorbet/tapioca/config.yml +6 -0
  168. data/sorbet/tapioca/require.rb +2 -0
  169. metadata +198 -34
  170. data/dsl/less_simple.rb +0 -112
  171. data/dsl/simple.rb +0 -8
  172. data/lib/roast/dsl/cog_execution_context.rb +0 -29
  173. data/lib/roast/dsl/cogs/graph.rb +0 -53
  174. data/lib/roast/dsl/cogs.rb +0 -65
  175. data/lib/roast/dsl/executor.rb +0 -82
  176. data/lib/roast/dsl/workflow_execution_context.rb +0 -47
  177. data/sorbet/rbi/gems/cgi@0.5.0.rbi +0 -2961
  178. data/sorbet/rbi/gems/claude_swarm@0.1.19.rbi +0 -568
  179. data/sorbet/rbi/gems/cli-kit@5.0.1.rbi +0 -1991
  180. data/sorbet/rbi/gems/dry-configurable@1.3.0.rbi +0 -672
  181. data/sorbet/rbi/gems/dry-core@1.1.0.rbi +0 -1894
  182. data/sorbet/rbi/gems/dry-inflector@1.2.0.rbi +0 -659
  183. data/sorbet/rbi/gems/dry-initializer@3.2.0.rbi +0 -781
  184. data/sorbet/rbi/gems/dry-logic@1.6.0.rbi +0 -1127
  185. data/sorbet/rbi/gems/dry-schema@1.14.1.rbi +0 -3727
  186. data/sorbet/rbi/gems/dry-types@1.8.3.rbi +0 -3969
  187. data/sorbet/rbi/gems/fast-mcp-annotations@1.5.3.rbi +0 -1588
  188. data/sorbet/rbi/gems/mime-types-data@3.2025.0617.rbi +0 -136
  189. data/sorbet/rbi/gems/mime-types@3.7.0.rbi +0 -1342
  190. data/sorbet/rbi/gems/rack@2.2.18.rbi +0 -5659
  191. data/sorbet/rbi/gems/rbs-inline@0.12.0.rbi +0 -2170
  192. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +0 -435
  193. data/sorbet/rbi/gems/yard@0.9.37.rbi +0 -18492
  194. data/sorbet/rbi/shims/lib/roast/dsl/workflow_execution_context.rbi +0 -11
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.9
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
@@ -121,6 +163,20 @@ dependencies:
121
163
  - - "~>"
122
164
  - !ruby/object:Gem::Version
123
165
  version: '1.2'
166
+ - !ruby/object:Gem::Dependency
167
+ name: ruby_llm
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
124
180
  - !ruby/object:Gem::Dependency
125
181
  name: sqlite3
126
182
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +228,7 @@ executables:
172
228
  extensions: []
173
229
  extra_rdoc_files: []
174
230
  files:
231
+ - ".claude/commands/docs/write-comments.md"
175
232
  - ".claude/settings.json"
176
233
  - ".github/CODEOWNERS"
177
234
  - ".github/workflows/ci.yaml"
@@ -188,6 +245,7 @@ files:
188
245
  - Gemfile.lock
189
246
  - LICENSE.md
190
247
  - README.md
248
+ - README_LEGACY.md
191
249
  - Rakefile
192
250
  - bin/console
193
251
  - bin/roast
@@ -197,14 +255,79 @@ files:
197
255
  - bin/srb-rbi
198
256
  - bin/tapioca
199
257
  - claude-swarm.yml
258
+ - dev.yml
200
259
  - docs/AGENT_STEPS.md
201
260
  - docs/INSTRUMENTATION.md
202
261
  - docs/ITERATION_SYNTAX.md
203
262
  - docs/VALIDATION.md
204
- - dsl/less_simple.rb
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
268
+ - dsl/demo/Gemfile
269
+ - dsl/demo/Gemfile.lock
270
+ - dsl/demo/cogs/local.rb
271
+ - dsl/demo/simple_external_cog.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
281
+ - dsl/plugin-gem-example/.gitignore
282
+ - dsl/plugin-gem-example/Gemfile
283
+ - dsl/plugin-gem-example/Gemfile.lock
284
+ - dsl/plugin-gem-example/lib/other.rb
285
+ - dsl/plugin-gem-example/lib/plugin_gem_example.rb
286
+ - dsl/plugin-gem-example/lib/simple.rb
287
+ - dsl/plugin-gem-example/lib/version.rb
288
+ - dsl/plugin-gem-example/plugin-gem-example.gemspec
289
+ - dsl/prompts/simple_prompt.md.erb
205
290
  - dsl/prototype.rb
206
- - dsl/simple.rb
291
+ - dsl/repeat_loop_results.rb
292
+ - dsl/ruby_cog.rb
293
+ - dsl/simple_agent.rb
294
+ - dsl/simple_chat.rb
295
+ - dsl/simple_repeat.rb
296
+ - dsl/skip.rb
207
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
208
331
  - examples/README.md
209
332
  - examples/available_tools_demo/README.md
210
333
  - examples/available_tools_demo/analyze_files/prompt.md
@@ -228,19 +351,64 @@ files:
228
351
  - exe/roast
229
352
  - gemfiles/activesupport7.gemfile
230
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
231
359
  - lib/roast.rb
232
360
  - lib/roast/dsl.rb
233
361
  - lib/roast/dsl/cog.rb
234
362
  - lib/roast/dsl/cog/config.rb
363
+ - lib/roast/dsl/cog/input.rb
364
+ - lib/roast/dsl/cog/output.rb
365
+ - lib/roast/dsl/cog/registry.rb
235
366
  - lib/roast/dsl/cog/stack.rb
236
367
  - lib/roast/dsl/cog/store.rb
237
- - lib/roast/dsl/cog_execution_context.rb
238
- - lib/roast/dsl/cogs.rb
368
+ - lib/roast/dsl/cog_input_context.rb
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
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
239
395
  - lib/roast/dsl/cogs/cmd.rb
240
- - lib/roast/dsl/cogs/graph.rb
396
+ - lib/roast/dsl/cogs/ruby.rb
397
+ - lib/roast/dsl/command_runner.rb
241
398
  - lib/roast/dsl/config_context.rb
242
- - lib/roast/dsl/executor.rb
243
- - lib/roast/dsl/workflow_execution_context.rb
399
+ - lib/roast/dsl/config_manager.rb
400
+ - lib/roast/dsl/control_flow.rb
401
+ - lib/roast/dsl/execution_context.rb
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
409
+ - lib/roast/dsl/workflow.rb
410
+ - lib/roast/dsl/workflow_context.rb
411
+ - lib/roast/dsl/workflow_params.rb
244
412
  - lib/roast/error.rb
245
413
  - lib/roast/errors.rb
246
414
  - lib/roast/factories/api_provider_factory.rb
@@ -266,6 +434,7 @@ files:
266
434
  - lib/roast/resources/url_resource.rb
267
435
  - lib/roast/services/context_threshold_checker.rb
268
436
  - lib/roast/services/token_counting_service.rb
437
+ - lib/roast/sorbet_runtime_stub.rb
269
438
  - lib/roast/tools.rb
270
439
  - lib/roast/tools/apply_diff.rb
271
440
  - lib/roast/tools/ask_user.rb
@@ -355,7 +524,7 @@ files:
355
524
  - lib/roast/workflow/workflow_initializer.rb
356
525
  - lib/roast/workflow/workflow_runner.rb
357
526
  - lib/roast/workflow_diagram_generator.rb
358
- - roast.gemspec
527
+ - roast-ai.gemspec
359
528
  - rubocop/cop/roast.rb
360
529
  - rubocop/cop/roast/use_cmd_runner.rb
361
530
  - schema/workflow.json
@@ -374,42 +543,38 @@ files:
374
543
  - sorbet/rbi/gems/activesupport@8.0.2.rbi
375
544
  - sorbet/rbi/gems/addressable@2.8.7.rbi
376
545
  - sorbet/rbi/gems/ast@2.4.3.rbi
546
+ - sorbet/rbi/gems/async@2.34.0.rbi
377
547
  - sorbet/rbi/gems/base64@0.3.0.rbi
378
548
  - sorbet/rbi/gems/benchmark@0.4.1.rbi
379
549
  - sorbet/rbi/gems/bigdecimal@3.2.2.rbi
380
- - sorbet/rbi/gems/cgi@0.5.0.rbi
381
- - sorbet/rbi/gems/claude_swarm@0.1.19.rbi
382
- - sorbet/rbi/gems/cli-kit@5.0.1.rbi
383
- - 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
384
552
  - sorbet/rbi/gems/coderay@1.1.3.rbi
385
553
  - sorbet/rbi/gems/concurrent-ruby@1.3.5.rbi
386
554
  - sorbet/rbi/gems/connection_pool@2.5.3.rbi
555
+ - sorbet/rbi/gems/console@1.34.2.rbi
387
556
  - sorbet/rbi/gems/crack@1.0.0.rbi
388
557
  - sorbet/rbi/gems/diff-lcs@1.6.2.rbi
389
558
  - sorbet/rbi/gems/docile@1.4.1.rbi
390
559
  - sorbet/rbi/gems/dotenv@3.1.8.rbi
391
560
  - sorbet/rbi/gems/drb@2.2.3.rbi
392
- - sorbet/rbi/gems/dry-configurable@1.3.0.rbi
393
- - sorbet/rbi/gems/dry-core@1.1.0.rbi
394
- - sorbet/rbi/gems/dry-inflector@1.2.0.rbi
395
- - sorbet/rbi/gems/dry-initializer@3.2.0.rbi
396
- - sorbet/rbi/gems/dry-logic@1.6.0.rbi
397
- - sorbet/rbi/gems/dry-schema@1.14.1.rbi
398
- - sorbet/rbi/gems/dry-types@1.8.3.rbi
399
561
  - sorbet/rbi/gems/erubi@1.13.1.rbi
400
562
  - sorbet/rbi/gems/event_stream_parser@1.0.0.rbi
401
563
  - sorbet/rbi/gems/faraday-multipart@1.1.1.rbi
402
564
  - sorbet/rbi/gems/faraday-net_http@3.4.1.rbi
403
565
  - sorbet/rbi/gems/faraday-retry@2.3.2.rbi
404
566
  - sorbet/rbi/gems/faraday@2.13.1.rbi
405
- - sorbet/rbi/gems/fast-mcp-annotations@1.5.3.rbi
406
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
407
571
  - sorbet/rbi/gems/formatador@1.1.0.rbi
408
572
  - sorbet/rbi/gems/guard-compat@1.2.1.rbi
409
573
  - sorbet/rbi/gems/guard-minitest@2.4.6.rbi
410
574
  - sorbet/rbi/gems/guard@2.19.1.rbi
411
575
  - sorbet/rbi/gems/hashdiff@1.2.0.rbi
412
576
  - sorbet/rbi/gems/i18n@1.14.7.rbi
577
+ - sorbet/rbi/gems/io-event@1.14.0.rbi
413
578
  - sorbet/rbi/gems/json-schema@5.1.1.rbi
414
579
  - sorbet/rbi/gems/json@2.12.2.rbi
415
580
  - sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi
@@ -417,9 +582,9 @@ files:
417
582
  - sorbet/rbi/gems/listen@3.9.0.rbi
418
583
  - sorbet/rbi/gems/logger@1.7.0.rbi
419
584
  - sorbet/rbi/gems/lumberjack@1.2.10.rbi
585
+ - sorbet/rbi/gems/marcel@1.1.0.rbi
420
586
  - sorbet/rbi/gems/method_source@1.1.0.rbi
421
- - sorbet/rbi/gems/mime-types-data@3.2025.0617.rbi
422
- - sorbet/rbi/gems/mime-types@3.7.0.rbi
587
+ - sorbet/rbi/gems/metrics@0.15.0.rbi
423
588
  - sorbet/rbi/gems/minitest-rg@5.3.0.rbi
424
589
  - sorbet/rbi/gems/minitest@5.25.5.rbi
425
590
  - sorbet/rbi/gems/mocha@2.7.1.rbi
@@ -436,14 +601,12 @@ files:
436
601
  - sorbet/rbi/gems/pry@0.15.2.rbi
437
602
  - sorbet/rbi/gems/public_suffix@6.0.2.rbi
438
603
  - sorbet/rbi/gems/racc@1.8.1.rbi
439
- - sorbet/rbi/gems/rack@2.2.18.rbi
440
604
  - sorbet/rbi/gems/rainbow@3.1.1.rbi
441
605
  - sorbet/rbi/gems/raix@1.0.2.rbi
442
606
  - sorbet/rbi/gems/rake@13.3.0.rbi
443
607
  - sorbet/rbi/gems/rb-fsevent@0.11.2.rbi
444
608
  - sorbet/rbi/gems/rb-inotify@0.11.1.rbi
445
609
  - sorbet/rbi/gems/rbi@0.3.6.rbi
446
- - sorbet/rbi/gems/rbs-inline@0.12.0.rbi
447
610
  - sorbet/rbi/gems/rbs@3.9.4.rbi
448
611
  - sorbet/rbi/gems/regexp_parser@2.10.0.rbi
449
612
  - sorbet/rbi/gems/rexml@3.4.2.rbi
@@ -455,6 +618,7 @@ files:
455
618
  - sorbet/rbi/gems/ruby-openai@8.1.0.rbi
456
619
  - sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi
457
620
  - sorbet/rbi/gems/ruby2_keywords@0.0.5.rbi
621
+ - sorbet/rbi/gems/ruby_llm@1.8.2.rbi
458
622
  - sorbet/rbi/gems/securerandom@0.4.1.rbi
459
623
  - sorbet/rbi/gems/shellany@0.0.1.rbi
460
624
  - sorbet/rbi/gems/simplecov-html@0.13.2.rbi
@@ -464,17 +628,17 @@ files:
464
628
  - sorbet/rbi/gems/sqlite3@2.7.0.rbi
465
629
  - sorbet/rbi/gems/tapioca@0.16.11.rbi
466
630
  - sorbet/rbi/gems/thor@1.4.0.rbi
631
+ - sorbet/rbi/gems/traces@0.18.2.rbi
467
632
  - sorbet/rbi/gems/tzinfo@2.0.6.rbi
468
633
  - sorbet/rbi/gems/unicode-display_width@3.1.4.rbi
469
634
  - sorbet/rbi/gems/unicode-emoji@4.0.4.rbi
470
635
  - sorbet/rbi/gems/uri@1.0.3.rbi
471
636
  - sorbet/rbi/gems/vcr@6.3.1.rbi
472
637
  - sorbet/rbi/gems/webmock@3.25.1.rbi
473
- - sorbet/rbi/gems/yard-sorbet@0.9.0.rbi
474
- - sorbet/rbi/gems/yard@0.9.37.rbi
475
638
  - sorbet/rbi/gems/zeitwerk@2.7.3.rbi
639
+ - sorbet/rbi/shims/lib/roast/dsl/cog_input_context.rbi
476
640
  - sorbet/rbi/shims/lib/roast/dsl/config_context.rbi
477
- - sorbet/rbi/shims/lib/roast/dsl/workflow_execution_context.rbi
641
+ - sorbet/rbi/shims/lib/roast/dsl/execution_context.rbi
478
642
  - sorbet/rbi/todo.rbi
479
643
  - sorbet/tapioca/config.yml
480
644
  - sorbet/tapioca/require.rb
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
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,29 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Roast
5
- module DSL
6
- # Contains the cogs already executed in this run.
7
- class CogExecutionContext
8
- # Raises if you access a cog in an execution block that hasn't already been run.
9
- class IncompleteCogExecutionAccessError < StandardError; end
10
-
11
- def initialize(cogs, bound_names)
12
- @cogs = cogs
13
- bind_cog_methods(bound_names)
14
- end
15
-
16
- private
17
-
18
- def bind_cog_methods(bound_names)
19
- bound_names.map do |name|
20
- define_singleton_method(name.to_sym, ->(name) do
21
- @cogs[name].tap do |cog|
22
- raise IncompleteCogExecutionAccessError unless cog.ran?
23
- end.output
24
- end)
25
- end
26
- end
27
- end
28
- end
29
- 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) { (Roast::DSL::Cogs::Graph) -> void } -> void
12
- def initialize(name, &block)
13
- @name = name
14
- @block = block
15
- @graph = Roast::Graph.new
16
- super(name, proc {})
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
- #: (Roast::DSL::Cogs::Graph) -> 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
@@ -1,65 +0,0 @@
1
- # typed: false
2
- # frozen_string_literal: true
3
-
4
- module Roast
5
- module DSL
6
- module Cogs
7
- class << self
8
- #: (String) -> void
9
- def load_all_for(rube_rb_fpath)
10
- rube_rb_fpath = File.expand_path(rube_rb_fpath)
11
- all_cog_files(rube_rb_fpath).each do |cog_fpath|
12
- require cog_fpath
13
- end
14
- bind_all_cog_invokers
15
- end
16
-
17
- #: () -> Array[Class]
18
- def all_cog_classes
19
- # rubocop:disable Sorbet/ConstantsFromStrings
20
- Roast::DSL::Cogs.constants.map do |cog_class_name|
21
- Roast::DSL::Cogs.const_get(cog_class_name)
22
- end
23
- # rubocop:enable Sorbet/ConstantsFromStrings
24
- end
25
-
26
- private
27
-
28
- #: () -> void
29
- def bind_all_cog_invokers
30
- all_cog_classes.each do |cog_class|
31
- # At some point we may want to tuck this all into a Roast::DSL::Binding/Scope/Context to avoid polluting toplevel.
32
- TOPLEVEL_BINDING.eval(binding_string_for(cog_class))
33
- end
34
- end
35
-
36
- #: (Class) -> String
37
- def binding_string_for(cog_class)
38
- <<~RUBY
39
- def #{cog_class.method_name}(*args, **kwargs, &block)
40
- #{cog_class.name}.invoke(*args, **kwargs, &block)
41
- end
42
- RUBY
43
- end
44
-
45
- #: (String) -> Array[String]
46
- def all_cog_files(rube_rb_fpath)
47
- dirs = [project_cogs_dir(rube_rb_fpath), internal_cogs_dir]
48
- dirs.map do |dir|
49
- Dir.glob(File.join(dir, "*.rb")) # Just toplevel .rb files
50
- end.flatten
51
- end
52
-
53
- #: (String) -> String
54
- def project_cogs_dir(rube_rb_fpath)
55
- File.join(File.dirname(rube_rb_fpath), "cogs")
56
- end
57
-
58
- #: () -> String
59
- def internal_cogs_dir
60
- File.join(File.dirname(__FILE__), "cogs")
61
- end
62
- end
63
- end
64
- end
65
- end