roast-ai 1.0.2 → 1.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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/commands/docs/write-comments.md +1 -1
  3. data/.rubocop.yml +12 -1
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +149 -34
  6. data/README.md +56 -3
  7. data/examples/agent_with_multiple_prompts.rb +27 -0
  8. data/examples/custom_logging.rb +4 -2
  9. data/examples/demo/Gemfile.lock +49 -15
  10. data/examples/plugin-gem-example/Gemfile.lock +19 -15
  11. data/examples/simple_chat.rb +1 -1
  12. data/examples/simple_pi_agent.rb +18 -0
  13. data/internal/rubocop/cop/roast/no_test_class_nesting.rb +126 -0
  14. data/internal/rubocop/rubocop-roast.yml +6 -0
  15. data/internal/workflows/maintenance/branch_docs_impact.rb +97 -0
  16. data/internal/workflows/maintenance/deprecated_models_docs_updater.rb +78 -0
  17. data/lib/roast/cog/config.rb +1 -1
  18. data/lib/roast/cog/output.rb +2 -1
  19. data/lib/roast/cog/registry.rb +3 -3
  20. data/lib/roast/cog_input_manager.rb +28 -7
  21. data/lib/roast/cogs/agent/config.rb +2 -2
  22. data/lib/roast/cogs/agent/input.rb +20 -22
  23. data/lib/roast/cogs/agent/providers/claude/claude_invocation.rb +13 -5
  24. data/lib/roast/cogs/agent/providers/claude/messages/result_message.rb +1 -1
  25. data/lib/roast/cogs/agent/providers/claude/tool_result.rb +344 -4
  26. data/lib/roast/cogs/agent/providers/claude/tool_use.rb +356 -1
  27. data/lib/roast/cogs/agent/providers/claude.rb +16 -3
  28. data/lib/roast/cogs/agent/providers/pi/messages/tool_call_message.rb +60 -0
  29. data/lib/roast/cogs/agent/providers/pi/messages/tool_result_message.rb +57 -0
  30. data/lib/roast/cogs/agent/providers/pi/pi_invocation.rb +352 -0
  31. data/lib/roast/cogs/agent/providers/pi.rb +41 -0
  32. data/lib/roast/cogs/agent/stats.rb +29 -0
  33. data/lib/roast/cogs/agent/usage.rb +22 -0
  34. data/lib/roast/cogs/agent.rb +5 -6
  35. data/lib/roast/cogs/chat/config.rb +28 -2
  36. data/lib/roast/cogs/chat.rb +82 -10
  37. data/lib/roast/event.rb +1 -0
  38. data/lib/roast/event_monitor.rb +35 -3
  39. data/lib/roast/log.rb +21 -0
  40. data/lib/roast/log_formatter.rb +9 -7
  41. data/lib/roast/version.rb +1 -1
  42. data/lib/roast.rb +1 -3
  43. data/roast-ai.gemspec +2 -1
  44. data/sorbet/rbi/gems/activesupport@8.0.2.rbi +549 -383
  45. data/sorbet/rbi/gems/addressable@2.8.7.rbi +46 -44
  46. data/sorbet/rbi/gems/ast@2.4.3.rbi +7 -6
  47. data/sorbet/rbi/gems/async@2.34.0.rbi +21 -3
  48. data/sorbet/rbi/gems/benchmark@0.4.1.rbi +7 -7
  49. data/sorbet/rbi/gems/bigdecimal@3.2.2.rbi +198 -1
  50. data/sorbet/rbi/gems/concurrent-ruby@1.3.5.rbi +405 -328
  51. data/sorbet/rbi/gems/console@1.34.2.rbi +2 -2
  52. data/sorbet/rbi/gems/docile@1.4.1.rbi +30 -30
  53. data/sorbet/rbi/gems/drb@2.2.3.rbi +25 -25
  54. data/sorbet/rbi/gems/erubi@1.13.1.rbi +2 -0
  55. data/sorbet/rbi/gems/faraday-net_http@3.4.2.rbi +2 -77
  56. data/sorbet/rbi/gems/faraday-retry@2.3.2.rbi +2 -57
  57. data/sorbet/rbi/gems/faraday@2.14.1.rbi +382 -75
  58. data/sorbet/rbi/gems/guard-compat@1.2.1.rbi +1 -110
  59. data/sorbet/rbi/gems/guard-minitest@2.4.6.rbi +0 -139
  60. data/sorbet/rbi/gems/guard@2.19.1.rbi +38 -38
  61. data/sorbet/rbi/gems/hashdiff@1.2.0.rbi +3 -3
  62. data/sorbet/rbi/gems/i18n@1.14.7.rbi +53 -29
  63. data/sorbet/rbi/gems/io-event@1.14.0.rbi +67 -10
  64. data/sorbet/rbi/gems/json@2.18.1.rbi +227 -5
  65. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +83 -0
  66. data/sorbet/rbi/gems/listen@3.9.0.rbi +7 -7
  67. data/sorbet/rbi/gems/logger@1.7.0.rbi +3 -3
  68. data/sorbet/rbi/gems/lumberjack@1.2.10.rbi +21 -21
  69. data/sorbet/rbi/gems/marcel@1.1.0.rbi +1 -1
  70. data/sorbet/rbi/gems/minitest-rg@5.3.0.rbi +0 -96
  71. data/sorbet/rbi/gems/minitest@5.25.5.rbi +1 -16
  72. data/sorbet/rbi/gems/net-http@0.9.1.rbi +27 -19
  73. data/sorbet/rbi/gems/netrc@0.11.0.rbi +18 -0
  74. data/sorbet/rbi/gems/notiffany@0.1.3.rbi +20 -20
  75. data/sorbet/rbi/gems/ostruct@0.6.2.rbi +149 -15
  76. data/sorbet/rbi/gems/parser@3.3.8.0.rbi +141 -139
  77. data/sorbet/rbi/gems/prism@1.4.0.rbi +922 -864
  78. data/sorbet/rbi/gems/public_suffix@6.0.2.rbi +56 -35
  79. data/sorbet/rbi/gems/racc@1.8.1.rbi +10 -2
  80. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +12 -12
  81. data/sorbet/rbi/gems/rake@13.3.0.rbi +219 -318
  82. data/sorbet/rbi/gems/{rbi@0.3.6.rbi → rbi@0.3.9.rbi} +612 -2267
  83. data/sorbet/rbi/gems/{rbs@3.9.4.rbi → rbs@4.0.0.dev.5.rbi} +2013 -680
  84. data/sorbet/rbi/gems/regexp_parser@2.10.0.rbi +151 -113
  85. data/sorbet/rbi/gems/require-hooks@0.2.3.rbi +110 -0
  86. data/sorbet/rbi/gems/rexml@3.4.2.rbi +24 -51
  87. data/sorbet/rbi/gems/rubocop-ast@1.45.1.rbi +506 -815
  88. data/sorbet/rbi/gems/rubocop-sorbet@0.10.5.rbi +16 -16
  89. data/sorbet/rbi/gems/rubocop@1.77.0.rbi +2692 -2327
  90. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +8 -8
  91. data/sorbet/rbi/gems/ruby_llm@1.8.2.rbi +38 -23
  92. data/sorbet/rbi/gems/securerandom@0.4.1.rbi +1 -1
  93. data/sorbet/rbi/gems/simplecov-html@0.13.2.rbi +2 -131
  94. data/sorbet/rbi/gems/simplecov@0.22.0.rbi +28 -127
  95. data/sorbet/rbi/gems/{spoom@1.6.3.rbi → spoom@1.7.11.rbi} +1139 -2246
  96. data/sorbet/rbi/gems/sqlite3@2.9.0.rbi +91 -1
  97. data/sorbet/rbi/gems/{tapioca@0.16.11.rbi → tapioca@0.17.10.rbi} +721 -835
  98. data/sorbet/rbi/gems/thor@1.4.0.rbi +53 -53
  99. data/sorbet/rbi/gems/tsort@0.2.0.rbi +393 -0
  100. data/sorbet/rbi/gems/type_toolkit@0.0.5.rbi +49 -0
  101. data/sorbet/rbi/gems/tzinfo@2.0.6.rbi +144 -143
  102. data/sorbet/rbi/gems/uri@1.1.1.rbi +7 -7
  103. data/sorbet/rbi/gems/vcr@6.3.1.rbi +53 -36
  104. data/sorbet/rbi/gems/webmock@3.25.1.rbi +38 -13
  105. data/sorbet/rbi/gems/zeitwerk@2.7.3.rbi +39 -272
  106. data/sorbet/rbi/shims/lib/roast/execution_context.rbi +3 -3
  107. data/tutorial/01_your_first_workflow/README.md +9 -5
  108. data/tutorial/01_your_first_workflow/configured_chat.rb +1 -1
  109. data/tutorial/02_chaining_cogs/README.md +2 -2
  110. data/tutorial/02_chaining_cogs/code_review.rb +1 -1
  111. data/tutorial/02_chaining_cogs/session_resumption.rb +1 -1
  112. data/tutorial/03_targets_and_params/README.md +1 -1
  113. data/tutorial/04_configuration_options/README.md +2 -2
  114. data/tutorial/08_iterative_workflows/README.md +1 -1
  115. data/tutorial/README.md +1 -1
  116. metadata +39 -17
  117. data/docs/AGENT_STEPS.md +0 -288
  118. data/docs/INSTRUMENTATION.md +0 -243
  119. data/docs/ITERATION_SYNTAX.md +0 -147
  120. data/docs/VALIDATION.md +0 -178
  121. data/lib/roast/nil_assertions.rb +0 -23
  122. /data/internal/documentation/{architectural-notes.md → comments/architectural-notes.md} +0 -0
  123. /data/internal/documentation/{doc-comments-external.md → comments/doc-comments-external.md} +0 -0
  124. /data/internal/documentation/{doc-comments-internal.md → comments/doc-comments-internal.md} +0 -0
  125. /data/internal/documentation/{doc-comments.md → comments/doc-comments.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 309884973e075e4d94e5eb7ea3b3192ebe5cbcf5d08a60312c1054f9567d4eb9
4
- data.tar.gz: b79c03de093e577e77b480e7c67ac5dd510572eeb51887ea9147a03474a6f76a
3
+ metadata.gz: a6062453625ebfdec9aa48a51e5fa8e99deef186142adad84038a6587eba49e5
4
+ data.tar.gz: c95063f6f8ad36084ee36b73e8830f50147e65970e7005a26eea375e33f1a4a1
5
5
  SHA512:
6
- metadata.gz: 78d6f38126192dd69853a1bfe8bfe15c5f8ee6ee34f4cf998af534ff215c7a774e0af250409de94027ae36ed0b159a624ad6c4f1c837c40dfc24b72a8b6fe1cd
7
- data.tar.gz: f36f8a9ad38f0c4e8d0ee15b88c212a59d831613024d9825f362fceba8619d1ad27289142e5f47c53300ac6036753733b7c4c5d3cc27781efbc21f54c63b69de
6
+ metadata.gz: 8272e051e7a093aa6486d9ece57ec3981a93ca92266464ffc72fb2db85f56bf7f27dd9b9be47b3c327771e384e2fa7758b9172f90e51d88ae36ff7bd3a66ed27
7
+ data.tar.gz: fd1c2df5ce3fe87049d30212cfcd6d93f5bb79519a0efc2a519a57a6bb1e1b29837aa0cb4ac80f30cebe0cfab5ac40994ce1beaec2f16ee0fdc1db713b0ffcb4
@@ -8,7 +8,7 @@ Accepts either:
8
8
 
9
9
  ## Task
10
10
 
11
- Following the guidelines in `internal/documentation/`:
11
+ Following the guidelines in `internal/documentation/comments/`:
12
12
 
13
13
  1. **Determine documentation type:**
14
14
  - For Config, Input, Output classes → Use `doc-comments-external.md` (user-facing, thorough)
data/.rubocop.yml CHANGED
@@ -1,7 +1,14 @@
1
- inherit_from: .rubocop_todo.yml
1
+ inherit_from:
2
+ - .rubocop_todo.yml
3
+ - internal/rubocop/rubocop-roast.yml
4
+
5
+ require:
6
+ - ./internal/rubocop/cop/roast/no_test_class_nesting
2
7
 
3
8
  plugins:
4
9
  - rubocop-sorbet
10
+ - type_toolkit:
11
+ require_path: rubocop-type_toolkit
5
12
 
6
13
  inherit_gem:
7
14
  rubocop-shopify: rubocop.yml
@@ -30,6 +37,10 @@ Sorbet/FalseSigil:
30
37
  - "examples/**/*"
31
38
  - "lib/roast/sorbet_runtime_stub.rb"
32
39
 
40
+ Style/ClassAndModuleChildren:
41
+ Exclude:
42
+ - 'test/**/*.rb'
43
+
33
44
  Style/MethodCallWithArgsParentheses:
34
45
  Enabled: true
35
46
  Exclude:
data/Gemfile CHANGED
@@ -17,9 +17,9 @@ group :development, :test do
17
17
  gem "rubocop-shopify", require: false
18
18
  gem "rubocop-sorbet", require: false
19
19
  gem "simplecov", require: false
20
- gem "sorbet", "~> 0.5.12414", require: false
20
+ gem "sorbet", ">= 0.6.12698", require: false
21
21
  gem "sqlite3", require: false
22
- gem "tapioca", "~> 0.16.11", require: false
22
+ gem "tapioca", ">= 0.17.8", require: false
23
23
  gem "vcr", require: false
24
24
  gem "webmock", require: false
25
25
  end
data/Gemfile.lock CHANGED
@@ -1,17 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roast-ai (1.0.2)
4
+ roast-ai (1.2.0)
5
5
  activesupport (~> 8.0)
6
6
  async (>= 2.34)
7
7
  rainbow (>= 3.0.0)
8
- ruby_llm (>= 1.8)
8
+ ruby_llm (>= 1.13)
9
+ type_toolkit (>= 0.0.5)
9
10
  zeitwerk (>= 2.6)
10
11
 
11
12
  GEM
12
13
  remote: https://rubygems.org/
13
14
  specs:
14
- activesupport (8.0.2)
15
+ activesupport (8.0.4.1)
15
16
  base64
16
17
  benchmark (>= 0.3)
17
18
  bigdecimal
@@ -20,12 +21,12 @@ GEM
20
21
  drb
21
22
  i18n (>= 1.6, < 2)
22
23
  logger (>= 1.4.2)
23
- minitest (>= 5.1)
24
+ minitest (>= 5.1, < 6)
24
25
  securerandom (>= 0.3)
25
26
  tzinfo (~> 2.0, >= 2.0.5)
26
27
  uri (>= 0.13.1)
27
- addressable (2.8.7)
28
- public_suffix (>= 2.0.2, < 7.0)
28
+ addressable (2.9.0)
29
+ public_suffix (>= 2.0.2, < 8.0)
29
30
  ast (2.4.3)
30
31
  async (2.34.0)
31
32
  console (~> 1.29)
@@ -34,11 +35,11 @@ GEM
34
35
  metrics (~> 0.12)
35
36
  traces (~> 0.18)
36
37
  base64 (0.3.0)
37
- benchmark (0.4.1)
38
- bigdecimal (3.2.2)
38
+ benchmark (0.5.0)
39
+ bigdecimal (4.1.2)
39
40
  coderay (1.1.3)
40
- concurrent-ruby (1.3.5)
41
- connection_pool (2.5.3)
41
+ concurrent-ruby (1.3.7)
42
+ connection_pool (3.0.2)
42
43
  console (1.34.2)
43
44
  fiber-annotation
44
45
  fiber-local (~> 1.1)
@@ -50,13 +51,13 @@ GEM
50
51
  drb (2.2.3)
51
52
  erubi (1.13.1)
52
53
  event_stream_parser (1.0.0)
53
- faraday (2.14.1)
54
+ faraday (2.14.3)
54
55
  faraday-net_http (>= 2.0, < 3.5)
55
56
  json
56
57
  logger
57
58
  faraday-multipart (1.1.1)
58
59
  multipart-post (~> 2.0)
59
- faraday-net_http (3.4.2)
60
+ faraday-net_http (3.4.4)
60
61
  net-http (~> 0.5)
61
62
  faraday-retry (2.3.2)
62
63
  faraday (~> 2.0)
@@ -83,10 +84,10 @@ GEM
83
84
  guard-compat (~> 1.2)
84
85
  minitest (>= 3.0)
85
86
  hashdiff (1.2.0)
86
- i18n (1.14.7)
87
+ i18n (1.15.2)
87
88
  concurrent-ruby (~> 1.0)
88
89
  io-event (1.14.0)
89
- json (2.18.1)
90
+ json (2.20.0)
90
91
  language_server-protocol (3.17.0.5)
91
92
  lint_roller (1.1.0)
92
93
  listen (3.9.0)
@@ -119,19 +120,22 @@ GEM
119
120
  pry (0.15.2)
120
121
  coderay (~> 1.1)
121
122
  method_source (~> 1.0)
122
- public_suffix (6.0.2)
123
+ public_suffix (7.0.5)
123
124
  racc (1.8.1)
124
125
  rainbow (3.1.1)
125
126
  rake (13.3.0)
126
127
  rb-fsevent (0.11.2)
127
128
  rb-inotify (0.11.1)
128
129
  ffi (~> 1.0)
129
- rbi (0.3.6)
130
+ rbi (0.3.9)
130
131
  prism (~> 1.0)
131
132
  rbs (>= 3.4.4)
132
- rbs (3.9.4)
133
+ rbs (4.0.0.dev.5)
133
134
  logger
135
+ prism (>= 1.3.0)
136
+ tsort
134
137
  regexp_parser (2.10.0)
138
+ require-hooks (0.2.3)
135
139
  rexml (3.4.2)
136
140
  rubocop (1.77.0)
137
141
  json (~> 2.3)
@@ -154,15 +158,17 @@ GEM
154
158
  rubocop (>= 1.75.2)
155
159
  ruby-progressbar (1.13.0)
156
160
  ruby2_keywords (0.0.5)
157
- ruby_llm (1.8.2)
161
+ ruby_llm (1.15.0)
158
162
  base64
159
163
  event_stream_parser (~> 1)
160
164
  faraday (>= 1.10.0)
161
165
  faraday-multipart (>= 1)
162
166
  faraday-net_http (>= 1)
163
167
  faraday-retry (>= 1)
164
- marcel (~> 1.0)
168
+ marcel (~> 1)
169
+ ruby_llm-schema (~> 0)
165
170
  zeitwerk (~> 2)
171
+ ruby_llm-schema (0.3.0)
166
172
  securerandom (0.4.1)
167
173
  shellany (0.0.1)
168
174
  simplecov (0.22.0)
@@ -171,35 +177,41 @@ GEM
171
177
  simplecov_json_formatter (~> 0.1)
172
178
  simplecov-html (0.13.2)
173
179
  simplecov_json_formatter (0.1.4)
174
- sorbet (0.5.12414)
175
- sorbet-static (= 0.5.12414)
176
- sorbet-runtime (0.5.12414)
177
- sorbet-static (0.5.12414-universal-darwin)
178
- sorbet-static (0.5.12414-x86_64-linux)
179
- sorbet-static-and-runtime (0.5.12414)
180
- sorbet (= 0.5.12414)
181
- sorbet-runtime (= 0.5.12414)
182
- spoom (1.6.3)
180
+ sorbet (0.6.12984)
181
+ sorbet-static (= 0.6.12984)
182
+ sorbet-runtime (0.6.12984)
183
+ sorbet-static (0.6.12984-universal-darwin)
184
+ sorbet-static (0.6.12984-x86_64-linux)
185
+ sorbet-static-and-runtime (0.6.12984)
186
+ sorbet (= 0.6.12984)
187
+ sorbet-runtime (= 0.6.12984)
188
+ spoom (1.7.11)
183
189
  erubi (>= 1.10.0)
184
190
  prism (>= 0.28.0)
185
191
  rbi (>= 0.3.3)
192
+ rbs (>= 4.0.0.dev.4)
186
193
  rexml (>= 3.2.6)
187
194
  sorbet-static-and-runtime (>= 0.5.10187)
188
195
  thor (>= 0.19.2)
189
196
  sqlite3 (2.9.0-arm64-darwin)
190
197
  sqlite3 (2.9.0-x86_64-linux-gnu)
191
- tapioca (0.16.11)
198
+ tapioca (0.17.10)
192
199
  benchmark
193
200
  bundler (>= 2.2.25)
194
201
  netrc (>= 0.11.0)
195
202
  parallel (>= 1.21.0)
196
- rbi (~> 0.2)
203
+ rbi (>= 0.3.7)
204
+ require-hooks (>= 0.2.2)
197
205
  sorbet-static-and-runtime (>= 0.5.11087)
198
- spoom (>= 1.2.0)
206
+ spoom (>= 1.7.9)
199
207
  thor (>= 1.2.0)
200
208
  yard-sorbet
201
209
  thor (1.4.0)
202
210
  traces (0.18.2)
211
+ tsort (0.2.0)
212
+ type_toolkit (0.0.5)
213
+ lint_roller
214
+ rubocop (>= 1.72.0)
203
215
  tzinfo (2.0.6)
204
216
  concurrent-ruby (~> 1.0)
205
217
  unicode-display_width (3.1.4)
@@ -212,7 +224,7 @@ GEM
212
224
  addressable (>= 2.8.0)
213
225
  crack (>= 0.3.2)
214
226
  hashdiff (>= 0.4.0, < 2.0.0)
215
- yard (0.9.37)
227
+ yard (0.9.42)
216
228
  yard-sorbet (0.9.0)
217
229
  sorbet-runtime
218
230
  yard
@@ -233,11 +245,114 @@ DEPENDENCIES
233
245
  rubocop-shopify
234
246
  rubocop-sorbet
235
247
  simplecov
236
- sorbet (~> 0.5.12414)
248
+ sorbet (>= 0.6.12698)
237
249
  sqlite3
238
- tapioca (~> 0.16.11)
250
+ tapioca (>= 0.17.8)
239
251
  vcr
240
252
  webmock
241
253
 
254
+ CHECKSUMS
255
+ activesupport (8.0.4.1) sha256=822187e99ebca3e90bf03e6ccef5b57447592657f6b1676ccaaa25794ebfc7e6
256
+ addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
257
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
258
+ async (2.34.0) sha256=65ab207d4575c05bb6c5bac430f9f8d372d8288686e68e89f44eba094c77e1c1
259
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
260
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
261
+ bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
262
+ coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
263
+ concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
264
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
265
+ console (1.34.2) sha256=1c036abf606ccec83f9dc28f0c31710fe5936ffe7ba5d235ae2865590a482d58
266
+ crack (1.0.0) sha256=c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49
267
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
268
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
269
+ erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
270
+ event_stream_parser (1.0.0) sha256=a2683bab70126286f8184dc88f7968ffc4028f813161fb073ec90d171f7de3c8
271
+ faraday (2.14.3) sha256=1882247e6766615c8220b4392bf1d27f6ebb63d8e28267587cef1fb0bf37f278
272
+ faraday-multipart (1.1.1) sha256=77a18ff40149030fd1aef55bb4fc7a67ce46419a8a3fcd010e28c2526e8d8903
273
+ faraday-net_http (3.4.4) sha256=0e78af151747ed1b00f33e25973b4bc220d7f16c00c39676817c8b12331eb588
274
+ faraday-retry (2.3.2) sha256=2402d2029032ebd238a2046221e67f6ef0da78c5a8ce8cd4f8b9c62e4d6451d1
275
+ ffi (1.17.2-arm64-darwin) sha256=54dd9789be1d30157782b8de42d8f887a3c3c345293b57ffb6b45b4d1165f813
276
+ ffi (1.17.2-x86_64-linux-gnu) sha256=05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea
277
+ fiber-annotation (0.2.0) sha256=7abfadf1d119f508867d4103bf231c0354d019cc39a5738945dec2edadaf6c03
278
+ fiber-local (1.1.0) sha256=c885f94f210fb9b05737de65d511136ea602e00c5105953748aa0f8793489f06
279
+ fiber-storage (1.0.1) sha256=f48e5b6d8b0be96dac486332b55cee82240057065dc761c1ea692b2e719240e1
280
+ formatador (1.1.0) sha256=54e23e2af4d60bb9327c7fac62b29968e4cf28cee0111f726d0bdeadc85e06d0
281
+ guard (2.19.1) sha256=b8bc52694be3d8b26730280de7dcec7fe92ea1cff3414246fe96af3f23580f3d
282
+ guard-compat (1.2.1) sha256=3ad21ab0070107f92edfd82610b5cdc2fb8e368851e72362ada9703443d646fe
283
+ guard-minitest (2.4.6) sha256=d89e83d029447c13b191599085d24b6e2fe61e402d275e46491cd3e82f561572
284
+ hashdiff (1.2.0) sha256=c984f13e115bfc9953332e8e83bd9d769cfde9944e2d54e07eb9df7b76e140b5
285
+ i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5
286
+ io-event (1.14.0) sha256=e52abe4fa1f48e8b4311aa252c4b1f466716a038d01ff7ae83c72385bb209436
287
+ json (2.20.0) sha256=9362bc6e55a952b056abf9167cf053358181c904cb70cd6eee0808ea830fc32b
288
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
289
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
290
+ listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67
291
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
292
+ lumberjack (1.2.10) sha256=bbfe951629341095028ecbf1ad496b58bec3f8bcad6fe35a203a377839c42b6c
293
+ marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee
294
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
295
+ metrics (0.15.0) sha256=61ded5bac95118e995b1bc9ed4a5f19bc9814928a312a85b200abbdac9039072
296
+ minitest (5.25.5) sha256=391b6c6cb43a4802bfb7c93af1ebe2ac66a210293f4a3fb7db36f2fc7dc2c756
297
+ minitest-rg (5.3.0) sha256=12a1b0ecdd71bc484cff1c65a4a51bdee3a64109bfc8133b67146edbd2ac8f6f
298
+ mocha (2.7.1) sha256=8f7d538d5d3ebc75fc788b3d92fbab913a93a78462d2a3ce99d1bdde7af7f851
299
+ multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
300
+ nenv (0.3.0) sha256=d9de6d8fb7072228463bf61843159419c969edb34b3cef51832b516ae7972765
301
+ net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
302
+ netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f
303
+ notiffany (0.1.3) sha256=d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738
304
+ ostruct (0.6.2) sha256=6d7302a299e400a2c248d6ce0dad18fc3a5714e8096facc25ffd0c54ee57cfc0
305
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
306
+ parser (3.3.8.0) sha256=2476364142b307fa5a1b1ece44f260728be23858a9c71078e956131a75453c45
307
+ prism (1.4.0) sha256=dc0e3e00e93160213dc2a65519d9002a4a1e7b962db57d444cf1a71565bb703e
308
+ pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b
309
+ public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
310
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
311
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
312
+ rake (13.3.0) sha256=96f5092d786ff412c62fde76f793cc0541bd84d2eb579caa529aa8a059934493
313
+ rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
314
+ rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
315
+ rbi (0.3.9) sha256=d6a187bd0b376e999d3d82a5e5798a61178be98b894b7b35741c14162c9ea015
316
+ rbs (4.0.0.dev.5) sha256=273938e5a9c7f06b041be583588f2aa1976149bda2ce213e33e129c51534e174
317
+ regexp_parser (2.10.0) sha256=cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61
318
+ require-hooks (0.2.3) sha256=224be5b4be0fd2a47cb73286c500da366704a54ec195b6627366380c950efac8
319
+ rexml (3.4.2) sha256=1384268554a37af5da5279431ca3f2f37d46f09ffdd6c95e17cc84c83ea7c417
320
+ roast-ai (1.2.0)
321
+ rubocop (1.77.0) sha256=1f360b4575ef7a124be27b0dfffa227a2b2d9420d22d4fd8bf179d702bcc88c0
322
+ rubocop-ast (1.45.1) sha256=94042e49adc17f187ba037b33f941ba7398fede77cdf4bffafba95190a473a3e
323
+ rubocop-shopify (2.17.1) sha256=03850eb1a9c4d1f9f0ac1d8d5aa51bb47a149e532cfb5e8d02ac6a90c8800a5f
324
+ rubocop-sorbet (0.10.5) sha256=221672c096616d908a06aadd5111bfaab6d3c990d2a1caf2714cdec6514f4795
325
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
326
+ ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef
327
+ ruby_llm (1.15.0) sha256=ca207465bca1cca007010a79fce500d4012b1fbe188b025040cd37b884fb98af
328
+ ruby_llm-schema (0.3.0) sha256=a591edc5ca1b7f0304f0e2261de61ba4b3bea17be09f5cf7558153adfda3dec6
329
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
330
+ shellany (0.0.1) sha256=0e127a9132698766d7e752e82cdac8250b6adbd09e6c0a7fbbb6f61964fedee7
331
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
332
+ simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
333
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
334
+ sorbet (0.6.12984) sha256=f7b03699d62eeec2d0ea685e7c27334e81de11842a119d5fc01031112d7c3656
335
+ sorbet-runtime (0.6.12984) sha256=3fff20a5b147a2e191210563d61886ac121fc1cd8b5e0faf6bc18873139e0fe4
336
+ sorbet-static (0.6.12984-universal-darwin) sha256=0ac0a696cbcf422f4fe590064db9a2248fae50ed96094504be72a2709a63ae23
337
+ sorbet-static (0.6.12984-x86_64-linux) sha256=39c03af15badb204d640fbc6398bee171f4026377f31cba08cdb381091159c57
338
+ sorbet-static-and-runtime (0.6.12984) sha256=281b39ef61aee83551333df581a8d53737bc39df19e09e9cbe01ca8f8b93826f
339
+ spoom (1.7.11) sha256=4e27384af6d3fde5aadc0287c51e6f76c0802259cbb3b6a67603bf718352f4cf
340
+ sqlite3 (2.9.0-arm64-darwin) sha256=a917bd9b84285766ff3300b7d79cd583f5a067594c8c1263e6441618c04a6ed3
341
+ sqlite3 (2.9.0-x86_64-linux-gnu) sha256=72fff9bd750070ba3af695511ba5f0e0a2d8a9206f84869640b3e99dfaf3d5a5
342
+ tapioca (0.17.10) sha256=880a682ca8314f798dd09e9f104134fbf1a713c13be51f7dd4741dd434e6471b
343
+ thor (1.4.0) sha256=8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d
344
+ traces (0.18.2) sha256=80f1649cb4daace1d7174b81f3b3b7427af0b93047759ba349960cb8f315e214
345
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
346
+ type_toolkit (0.0.5) sha256=5bb0b6b656728da43db0e1a1a48e99a41e70851ce660ac5759dd077473bd1875
347
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
348
+ unicode-display_width (3.1.4) sha256=8caf2af1c0f2f07ec89ef9e18c7d88c2790e217c482bfc78aaa65eadd5415ac1
349
+ unicode-emoji (4.0.4) sha256=2c2c4ef7f353e5809497126285a50b23056cc6e61b64433764a35eff6c36532a
350
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
351
+ vcr (6.3.1) sha256=37b56e157e720446a3f4d2d39919cabef8cb7b6c45936acffd2ef8229fec03ed
352
+ webmock (3.25.1) sha256=ab9d5d9353bcbe6322c83e1c60a7103988efc7b67cd72ffb9012629c3d396323
353
+ yard (0.9.42) sha256=4e2be01f8623556093497731d44c801e600d7c9759ec7a35a2dd5dd83bbbba68
354
+ yard-sorbet (0.9.0) sha256=03d1aa461b9e9c82b886919a13aa3e09fcf4d1852239d2967ed97e92723ffe21
355
+ zeitwerk (2.7.3) sha256=b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85
356
+
242
357
  BUNDLED WITH
243
358
  2.6.8
data/README.md CHANGED
@@ -47,7 +47,7 @@ bin/roast execute analyze_codebase.rb
47
47
 
48
48
  ## Core Cogs
49
49
 
50
- - **`chat`** - Send prompts to cloud-based LLMs (OpenAI, Anthropic, Gemini, etc.)
50
+ - **`chat`** - Send prompts to cloud-based LLMs (OpenAI, Anthropic, Perplexity & Gemini)
51
51
  - **`agent`** - Run local coding agents with filesystem access (Claude Code CLI, etc.)
52
52
  - **`ruby`** - Execute custom Ruby code within workflows
53
53
  - **`cmd`** - Run shell commands and capture output
@@ -69,8 +69,61 @@ gem 'roast-ai'
69
69
  ## Requirements
70
70
 
71
71
  - Ruby 3.0+
72
- - API keys for your AI provider (OpenAI/Anthropic)
73
- - Claude Code CLI installed (for agent cog)
72
+ - API keys or local credentials for your AI provider
73
+ - Claude Code CLI installed (for the default agent provider)
74
+
75
+ ## Provider Configuration
76
+
77
+ Roast provider settings are configured in workflow `config` blocks. There is not currently a CLI flag or environment variable that changes the default provider globally; edit the workflow config to select a different provider.
78
+
79
+ ### Chat cog
80
+
81
+ The `chat` cog currently supports the OpenAI provider. It uses `OPENAI_API_KEY` by default, and `OPENAI_API_BASE` can override the default base URL (`https://api.openai.com/v1`).
82
+
83
+ ```bash
84
+ export OPENAI_API_KEY=...
85
+ ```
86
+
87
+ You can also configure chat settings directly in a workflow:
88
+
89
+ ```ruby
90
+ config do
91
+ chat do
92
+ provider :openai
93
+ model "gpt-4o-mini"
94
+ end
95
+ end
96
+ ```
97
+
98
+ ### Agent cog
99
+
100
+ The `agent` cog runs local agent CLIs. It defaults to `:claude` and currently supports:
101
+
102
+ - `:claude` - Claude Code CLI
103
+ - `:pi` - Pi CLI
104
+
105
+ Select a provider in the workflow config:
106
+
107
+ ```ruby
108
+ config do
109
+ agent do
110
+ provider :pi
111
+ end
112
+ end
113
+ ```
114
+
115
+ Agent providers must be installed and authenticated according to their own CLI requirements.
116
+
117
+ ## Configuration
118
+
119
+ Roast currently supports four LLM providers for the `chat` cog: **OpenAI**, **Anthropic**, **Perplexity** and **Gemini**.
120
+
121
+ - Set `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `PERPLEXITY_API_KEY` and/or `GEMINI_API_KEY` in your environment.
122
+ - Optionally set `OPENAI_API_BASE`, `ANTHROPIC_API_BASE` and/or `GEMINI_API_BASE` to override the default endpoint. Perplexity does not support base URL override.
123
+
124
+ The default model is set per-provider and can only be overridden inside a `config` block. See the [tutorial](https://github.com/Shopify/roast/blob/main/tutorial/01_your_first_workflow/README.md#adding-configuration) for examples.
125
+
126
+ The `agent` cog is powered by the Claude Code CLI by default, which handles its own authentication.
74
127
 
75
128
  ## Getting Started
76
129
 
@@ -0,0 +1,27 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ #: self as Roast::Workflow
5
+
6
+ config do
7
+ agent do
8
+ provider :claude
9
+ model "haiku"
10
+ show_prompt!
11
+ dump_raw_agent_messages_to "tmp/claude-messages2.log"
12
+ end
13
+ end
14
+
15
+ execute do
16
+ agent(:multi_step) do
17
+ [
18
+ "What is 2+2?",
19
+ "Now multiply that by 3",
20
+ "Now subtract 5"
21
+ ]
22
+ end
23
+ ruby do
24
+ answer = agent!(:multi_step).integer!
25
+ puts "((2 + 2) * 3) - 5 = #{answer}"
26
+ end
27
+ end
@@ -12,9 +12,11 @@
12
12
  # Log to standard output, always at the DEBUG level
13
13
  Roast::Log.logger = Logger.new($stdout).tap { |logger| logger.level = ::Logger::DEBUG }
14
14
 
15
- # Format log lines in a particular way
15
+ # Format log lines in a particular way. `msg` may be a String or a
16
+ # Roast::Log::Message (stdout/stderr output is wrapped to carry its type),
17
+ # so normalise with #to_s before formatting.
16
18
  Roast::Log.logger.formatter = proc do |severity, time, progname, msg|
17
- "#{severity[0..0]}, #{msg.strip} (at #{time})\n"
19
+ "#{severity[0..0]}, #{msg.to_s.strip} (at #{time})\n"
18
20
  end
19
21
 
20
22
 
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- roast-ai (1.0.2)
4
+ roast-ai (1.2.0)
5
5
  activesupport (~> 8.0)
6
6
  async (>= 2.34)
7
7
  rainbow (>= 3.0.0)
8
- ruby_llm (>= 1.8)
8
+ ruby_llm (>= 1.13)
9
+ type_toolkit (>= 0.0.5)
9
10
  zeitwerk (>= 2.6)
10
11
 
11
12
  PATH
@@ -17,7 +18,7 @@ PATH
17
18
  GEM
18
19
  remote: https://rubygems.org/
19
20
  specs:
20
- activesupport (8.0.3)
21
+ activesupport (8.0.4.1)
21
22
  base64
22
23
  benchmark (>= 0.3)
23
24
  bigdecimal
@@ -26,10 +27,11 @@ GEM
26
27
  drb
27
28
  i18n (>= 1.6, < 2)
28
29
  logger (>= 1.4.2)
29
- minitest (>= 5.1)
30
+ minitest (>= 5.1, < 6)
30
31
  securerandom (>= 0.3)
31
32
  tzinfo (~> 2.0, >= 2.0.5)
32
33
  uri (>= 0.13.1)
34
+ ast (2.4.3)
33
35
  async (2.34.0)
34
36
  console (~> 1.29)
35
37
  fiber-annotation
@@ -37,23 +39,23 @@ GEM
37
39
  metrics (~> 0.12)
38
40
  traces (~> 0.18)
39
41
  base64 (0.3.0)
40
- benchmark (0.4.1)
41
- bigdecimal (3.3.1)
42
- concurrent-ruby (1.3.5)
43
- connection_pool (2.5.4)
42
+ benchmark (0.5.0)
43
+ bigdecimal (4.1.2)
44
+ concurrent-ruby (1.3.7)
45
+ connection_pool (3.0.2)
44
46
  console (1.34.2)
45
47
  fiber-annotation
46
48
  fiber-local (~> 1.1)
47
49
  json
48
50
  drb (2.2.3)
49
51
  event_stream_parser (1.0.0)
50
- faraday (2.14.1)
52
+ faraday (2.14.3)
51
53
  faraday-net_http (>= 2.0, < 3.5)
52
54
  json
53
55
  logger
54
56
  faraday-multipart (1.1.1)
55
57
  multipart-post (~> 2.0)
56
- faraday-net_http (3.4.2)
58
+ faraday-net_http (3.4.4)
57
59
  net-http (~> 0.5)
58
60
  faraday-retry (2.3.2)
59
61
  faraday (~> 2.0)
@@ -61,31 +63,63 @@ GEM
61
63
  fiber-local (1.1.0)
62
64
  fiber-storage
63
65
  fiber-storage (1.0.1)
64
- i18n (1.14.7)
66
+ i18n (1.14.8)
65
67
  concurrent-ruby (~> 1.0)
66
68
  io-event (1.14.0)
67
- json (2.18.1)
69
+ json (2.20.0)
70
+ language_server-protocol (3.17.0.5)
71
+ lint_roller (1.1.0)
68
72
  logger (1.7.0)
69
73
  marcel (1.1.0)
70
74
  metrics (0.15.0)
71
- minitest (5.26.0)
75
+ minitest (5.27.0)
72
76
  multipart-post (2.4.1)
73
77
  net-http (0.9.1)
74
78
  uri (>= 0.11.1)
79
+ parallel (1.28.0)
80
+ parser (3.3.11.1)
81
+ ast (~> 2.4.1)
82
+ racc
83
+ prism (1.9.0)
84
+ racc (1.8.1)
75
85
  rainbow (3.1.1)
76
- ruby_llm (1.8.2)
86
+ regexp_parser (2.11.3)
87
+ rubocop (1.86.0)
88
+ json (~> 2.3)
89
+ language_server-protocol (~> 3.17.0.2)
90
+ lint_roller (~> 1.1.0)
91
+ parallel (~> 1.10)
92
+ parser (>= 3.3.0.2)
93
+ rainbow (>= 2.2.2, < 4.0)
94
+ regexp_parser (>= 2.9.3, < 3.0)
95
+ rubocop-ast (>= 1.49.0, < 2.0)
96
+ ruby-progressbar (~> 1.7)
97
+ unicode-display_width (>= 2.4.0, < 4.0)
98
+ rubocop-ast (1.49.1)
99
+ parser (>= 3.3.7.2)
100
+ prism (~> 1.7)
101
+ ruby-progressbar (1.13.0)
102
+ ruby_llm (1.15.0)
77
103
  base64
78
104
  event_stream_parser (~> 1)
79
105
  faraday (>= 1.10.0)
80
106
  faraday-multipart (>= 1)
81
107
  faraday-net_http (>= 1)
82
108
  faraday-retry (>= 1)
83
- marcel (~> 1.0)
109
+ marcel (~> 1)
110
+ ruby_llm-schema (~> 0)
84
111
  zeitwerk (~> 2)
112
+ ruby_llm-schema (0.4.0)
85
113
  securerandom (0.4.1)
86
114
  traces (0.18.2)
115
+ type_toolkit (0.0.5)
116
+ lint_roller
117
+ rubocop (>= 1.72.0)
87
118
  tzinfo (2.0.6)
88
119
  concurrent-ruby (~> 1.0)
120
+ unicode-display_width (3.2.0)
121
+ unicode-emoji (~> 4.1)
122
+ unicode-emoji (4.2.0)
89
123
  uri (1.1.1)
90
124
  zeitwerk (2.7.3)
91
125