roast-ai 0.5.0 → 0.5.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ee882d792c1c09ecc9a023aa1f26825dff3442a8c4152da789078157e26540e
4
- data.tar.gz: 51d5d1238e32c5ad6ce9f3d24c3d224d0709da3f3da4e10905f75049dd02f6d7
3
+ metadata.gz: 45106bfcf14cd8dac143f9b31331d5c272cba04152390097debb22a466edd4cd
4
+ data.tar.gz: 8097250f8cc80405c0002928a946a0635c430e6d631de51f62487e356ec19891
5
5
  SHA512:
6
- metadata.gz: 440bdf957c01418d111bdea73de04b707baf7034f1277ddc5c78fa09ee68833cf1f4538d0f0a5eb691ece68f9c80ad9f159949b818658e4a97ef029a6ec999a3
7
- data.tar.gz: dc01a98d049b9fae42a28697bb09eacf9dc0766c734eafa6bd1bc1402d8c50109d79d5e03304a3e9914e92a718a4fbbd5cf58cbb7beeeee46a643aa167090e5a
6
+ metadata.gz: 9b6a836153aeeda05efd1c30b0be46453709bb9a4bb3480aed00b136da3ecd566f4b6d8a2ad6f88e5a19ee5774dfe42621a0239b7b0a5b3c0d192f29e25efc08
7
+ data.tar.gz: d4591075f64cc6e4ca0e14d0ea8555026f4bd3211fb6ebfd80c03c4a92897abbd47a0269e9f40e356a3b8e420165aa231d4e8196b7827c4cac6d3955c645b24c
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.4.2
1
+ 3.4.7
data/Gemfile CHANGED
@@ -14,6 +14,7 @@ gem "cli-ui", github: "Shopify/cli-ui", branch: "main"
14
14
  group :development, :test do
15
15
  gem "guard-minitest"
16
16
  gem "guard"
17
+ gem "minitest", "~> 5.0"
17
18
  gem "minitest-rg"
18
19
  gem "mocha"
19
20
  gem "rake", require: false
data/Gemfile.lock CHANGED
@@ -8,22 +8,22 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- roast-ai (0.5.0)
11
+ roast-ai (0.5.2)
12
12
  activesupport (>= 7.0)
13
- async (~> 2.34)
14
- benchmark (~> 0.4.1)
15
- cli-kit (~> 5.2)
16
- cli-ui (~> 2.7)
17
- diff-lcs (~> 1.5)
18
- json-schema
19
- open_router (~> 0.3)
13
+ async (>= 2.34)
14
+ benchmark (>= 0.4.1)
15
+ cli-kit (>= 5.2)
16
+ cli-ui (>= 2.7)
17
+ diff-lcs (>= 1.5)
18
+ json-schema (>= 5.1)
19
+ open_router (>= 0.3)
20
20
  raix (~> 1.0.2)
21
- rake (~> 13.3.0)
22
- ruby-graphviz (~> 1.2)
23
- ruby_llm
24
- sqlite3 (~> 2.6)
25
- thor (~> 1.3)
26
- zeitwerk (~> 2.6)
21
+ rake (>= 13.3.0)
22
+ ruby-graphviz (>= 1.2)
23
+ ruby_llm (>= 1.8)
24
+ sqlite3 (>= 2.6)
25
+ thor (>= 1.3)
26
+ zeitwerk (>= 2.6)
27
27
 
28
28
  GEM
29
29
  remote: https://rubygems.org/
@@ -267,6 +267,7 @@ DEPENDENCIES
267
267
  cli-ui!
268
268
  guard
269
269
  guard-minitest
270
+ minitest (~> 5.0)
270
271
  minitest-rg
271
272
  mocha
272
273
  rake
@@ -1,19 +1,22 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- roast-ai (0.4.9)
4
+ roast-ai (0.5.1)
5
5
  activesupport (>= 7.0)
6
- cli-kit (~> 5.0)
7
- cli-ui (= 2.3.0)
8
- diff-lcs (~> 1.5)
9
- json-schema
10
- open_router (~> 0.3)
11
- raix (~> 1.0.2)
12
- ruby-graphviz (~> 1.2)
13
- ruby_llm
14
- sqlite3 (~> 2.6)
15
- thor (~> 1.3)
16
- zeitwerk (~> 2.6)
6
+ async (>= 2.34)
7
+ benchmark (>= 0.4.1)
8
+ cli-kit (>= 5.2)
9
+ cli-ui (>= 2.7)
10
+ diff-lcs (>= 1.5)
11
+ json-schema (>= 5.1)
12
+ open_router (>= 0.3)
13
+ raix (>= 1.0.2)
14
+ rake (>= 13.3.0)
15
+ ruby-graphviz (>= 1.2)
16
+ ruby_llm (>= 1.8)
17
+ sqlite3 (>= 2.6)
18
+ thor (>= 1.3)
19
+ zeitwerk (>= 2.6)
17
20
 
18
21
  PATH
19
22
  remote: ../plugin-gem-example
@@ -38,14 +41,24 @@ GEM
38
41
  uri (>= 0.13.1)
39
42
  addressable (2.8.7)
40
43
  public_suffix (>= 2.0.2, < 7.0)
44
+ async (2.34.0)
45
+ console (~> 1.29)
46
+ fiber-annotation
47
+ io-event (~> 1.11)
48
+ metrics (~> 0.12)
49
+ traces (~> 0.18)
41
50
  base64 (0.3.0)
42
51
  benchmark (0.4.1)
43
52
  bigdecimal (3.3.1)
44
- cli-kit (5.0.1)
45
- cli-ui (~> 2.0)
46
- cli-ui (2.3.0)
53
+ cli-kit (5.2.0)
54
+ cli-ui (~> 2.4)
55
+ cli-ui (2.7.0)
47
56
  concurrent-ruby (1.3.5)
48
57
  connection_pool (2.5.4)
58
+ console (1.34.2)
59
+ fiber-annotation
60
+ fiber-local (~> 1.1)
61
+ json
49
62
  diff-lcs (1.6.2)
50
63
  dotenv (3.1.8)
51
64
  drb (2.2.3)
@@ -60,14 +73,20 @@ GEM
60
73
  net-http (>= 0.5.0)
61
74
  faraday-retry (2.3.2)
62
75
  faraday (~> 2.0)
76
+ fiber-annotation (0.2.0)
77
+ fiber-local (1.1.0)
78
+ fiber-storage
79
+ fiber-storage (1.0.1)
63
80
  i18n (1.14.7)
64
81
  concurrent-ruby (~> 1.0)
82
+ io-event (1.14.0)
65
83
  json (2.15.1)
66
84
  json-schema (6.0.0)
67
85
  addressable (~> 2.8)
68
86
  bigdecimal (~> 3.1)
69
87
  logger (1.7.0)
70
88
  marcel (1.1.0)
89
+ metrics (0.15.0)
71
90
  minitest (5.26.0)
72
91
  multipart-post (2.4.1)
73
92
  net-http (0.6.0)
@@ -85,6 +104,7 @@ GEM
85
104
  open_router (~> 0.2)
86
105
  ostruct
87
106
  ruby-openai (~> 8.1)
107
+ rake (13.3.1)
88
108
  rexml (3.4.4)
89
109
  ruby-graphviz (1.2.5)
90
110
  rexml
@@ -104,6 +124,7 @@ GEM
104
124
  securerandom (0.4.1)
105
125
  sqlite3 (2.7.4-arm64-darwin)
106
126
  thor (1.4.0)
127
+ traces (0.18.2)
107
128
  tzinfo (2.0.6)
108
129
  concurrent-ruby (~> 1.0)
109
130
  uri (1.0.4)
data/dsl/next_break.rb CHANGED
@@ -17,6 +17,11 @@ execute do
17
17
  puts "Iteration #{index}: #{iteration_results.presence || "did not run at all"}"
18
18
  end
19
19
  end
20
+
21
+ call(:once, run: :loop_body) do |my|
22
+ my.value = 1
23
+ my.index = 1
24
+ end
20
25
  end
21
26
 
22
27
  execute(:loop_body) do
data/dsl/simple_agent.rb CHANGED
@@ -7,7 +7,7 @@ config do
7
7
  agent do
8
8
  provider :claude
9
9
  model "haiku"
10
- initial_prompt "Always respond in haiku form"
10
+ append_system_prompt "Always respond in haiku form"
11
11
  show_prompt!
12
12
  dump_raw_agent_messages_to "tmp/claude-messages.log"
13
13
  end
data/exe/roast CHANGED
@@ -13,5 +13,5 @@ unshift_path.call("lib")
13
13
  require "bundler/setup"
14
14
  require "roast"
15
15
 
16
- $stderr.puts "🔥🔥🔥 Everyone loves a good roast 🔥🔥🔥\n\n"
16
+ $stderr.puts "🔥🔥🔥 Everyone loves a good roast 🔥🔥🔥\n\n" if $stderr.tty?
17
17
  Roast::CLI.start(ARGV)
@@ -231,7 +231,7 @@ module Roast
231
231
  #
232
232
  #: () -> bool
233
233
  def abort_on_failure?
234
- @values[:abort_on_failure] ||= true
234
+ !!@values[:abort_on_failure]
235
235
  end
236
236
 
237
237
  # Configure the cog to run external commands in the specified working directory
@@ -242,7 +242,9 @@ module Roast
242
242
  # ---
243
243
  #
244
244
  # __Important Note__: this configuration option only applies to external commands invoked by a cog
245
- # It does not affect the working directory in which Roast is running.
245
+ # It does not affect the working directory in which Roast is running. In fact, changing the working
246
+ # directory of the Roast process can have unpredictable results when running async cogs and/or
247
+ # parallel maps.
246
248
  #
247
249
  # ---
248
250
  #
@@ -132,39 +132,83 @@ module Roast
132
132
  @values[:model].presence
133
133
  end
134
134
 
135
- # Configure the cog with an initial prompt component that will be appended to the agent's system prompt
135
+ # Configure the cog with a custom system prompt that will completely replace the agent's
136
+ # default system prompt every time the agent is invoked
137
+ #
138
+ # #### See Also
139
+ # - `no_replace_system_prompt!`
140
+ # - `append_system_prompt`
141
+ #
142
+ #: (String) -> void
143
+ def replace_system_prompt(prompt)
144
+ @values[:replace_system_prompt] = prompt
145
+ end
146
+
147
+ # Configure the cog __not__ to replace the agent's default system prompt
148
+ #
149
+ # This is the default behaviour.
150
+ #
151
+ # #### See Also
152
+ # - `replace_system_prompt`
153
+ #
154
+ #: () -> void
155
+ def no_replace_system_prompt!
156
+ @values[:replace_system_prompt] = ""
157
+ end
158
+
159
+ # Get the validated, configured replacement system prompt
160
+ #
161
+ # Returns `nil` if the default system prompt should __not__ be replaced.
162
+ #
163
+ # #### See Also
164
+ # - `replace_system_prompt`
165
+ # - `no_replace_system_prompt!`
166
+ #
167
+ #: () -> String?
168
+ def valid_replace_system_prompt
169
+ @values[:replace_system_prompt].presence
170
+ end
171
+
172
+ # Configure the cog with a prompt component that will be appended to the agent's system prompt
136
173
  # every time the agent is invoked
137
174
  #
175
+ # Use this to add custom instructions while preserving the provider's default system prompt.
176
+ #
177
+ # This can also be combined with with `replace_system_prompt`.
178
+ #
138
179
  # #### See Also
139
- # - `no_initial_prompt!`
180
+ # - `no_append_system_prompt!`
181
+ # - `replace_system_prompt`
140
182
  #
141
183
  #: (String) -> void
142
- def initial_prompt(prompt)
143
- @values[:initial_prompt] = prompt
184
+ def append_system_prompt(prompt)
185
+ @values[:append_system_prompt] = prompt
144
186
  end
145
187
 
146
- # Configure the cog __not__ to append an initial prompt to the agent's system prompt when the agent is invoked
188
+ # Configure the cog __not__ to append anything to the agent's system prompt when the agent is invoked
189
+ #
190
+ # This is the default behaviour.
147
191
  #
148
192
  # #### See Also
149
- # - `initial_prompt`
193
+ # - `append_system_prompt`
150
194
  #
151
195
  #: () -> void
152
- def no_initial_prompt!
153
- @values[:initial_prompt] = ""
196
+ def no_append_system_prompt!
197
+ @values[:append_system_prompt] = ""
154
198
  end
155
199
 
156
- # Get the validated, configured initial prompt that will be appended to the agent's system prompt when
200
+ # Get the validated, configured prompt that will be appended to the agent's system prompt when
157
201
  # the agent is invoked
158
202
  #
159
203
  # Returns `nil` if __no__ prompt should be appended.
160
204
  #
161
205
  # #### See Also
162
- # - `initial_prompt`
163
- # - `no_initial_prompt!`
206
+ # - `append_system_prompt`
207
+ # - `no_append_system_prompt!`
164
208
  #
165
209
  #: () -> String?
166
- def valid_initial_prompt
167
- @values[:initial_prompt].presence
210
+ def valid_append_system_prompt
211
+ @values[:append_system_prompt].presence
168
212
  end
169
213
 
170
214
  # Configure the cog to apply the default set of system and user permissions when running the agent
@@ -58,7 +58,8 @@ module Roast
58
58
  def initialize(config, input)
59
59
  @base_command = config.valid_command #: (String | Array[String])?
60
60
  @model = config.valid_model #: String?
61
- @append_system_prompt = config.valid_initial_prompt #: String?
61
+ @append_system_prompt = config.valid_append_system_prompt #: String?
62
+ @replace_system_prompt = config.valid_replace_system_prompt #: String?
62
63
  @apply_permissions = config.apply_permissions? #: bool
63
64
  @working_directory = config.valid_working_directory #: Pathname?
64
65
  @prompt = input.valid_prompt! #: String
@@ -171,6 +172,7 @@ module Roast
171
172
  end
172
173
  command.push("-p", "--verbose", "--output-format", "stream-json")
173
174
  command.push("--model", @model) if @model
175
+ command.push("--system-prompt", @replace_system_prompt) if @replace_system_prompt
174
176
  command.push("--append-system-prompt", @append_system_prompt) if @append_system_prompt
175
177
  command.push("--fork-session", "--resume", @session) if @session.present?
176
178
  command << "--dangerously-skip-permissions" unless @apply_permissions
@@ -147,7 +147,7 @@ module Roast
147
147
  #
148
148
  #: () -> String
149
149
  def valid_base_url
150
- @values.fetch(:api_key, ENV[PROVIDERS.dig(valid_provider!, :base_url_env_var).not_nil!]) ||
150
+ @values.fetch(:base_url, ENV[PROVIDERS.dig(valid_provider!, :base_url_env_var).not_nil!]) ||
151
151
  PROVIDERS.dig(valid_provider!, :default_base_url)
152
152
  end
153
153
 
@@ -310,6 +310,9 @@ module Roast
310
310
  stdout_handler: stdout_handler,
311
311
  stderr_handler: stderr_handler,
312
312
  )
313
+ if !status.success? && config.fail_on_error?
314
+ raise ControlFlow::FailCog, "Process exited with status code #{status.exitstatus}"
315
+ end
313
316
 
314
317
  Output.new(stdout, stderr, status)
315
318
  end
@@ -65,7 +65,7 @@ module Roast
65
65
  stdin, stdout, stderr, wait_thread = Open3 #: as untyped
66
66
  .popen3(
67
67
  { "PWD" => working_directory&.to_s }.compact,
68
- *args,
68
+ *args.map(&:to_s),
69
69
  { chdir: working_directory }.compact,
70
70
  )
71
71
  stdin.puts stdin_content if stdin_content.present?
@@ -106,9 +106,10 @@ module Roast
106
106
  em.prepare!
107
107
  begin
108
108
  em.run!
109
- rescue ControlFlow::Break
109
+ rescue ControlFlow::Next, ControlFlow::Break
110
110
  # treat `break!` like `next!` in a `call` invocation
111
- # TODO: maybe do something with the message passed to break!
111
+ # just end the execution early and return like normal
112
+ # TODO: maybe do something with the message passed to next! or break!
112
113
  end
113
114
  Output.new(em)
114
115
  end
@@ -292,6 +292,9 @@ module Roast
292
292
  ems << em = create_execution_manager_for_map_item(run, item, index + input.initial_index)
293
293
  em.prepare!
294
294
  em.run!
295
+ rescue ControlFlow::Next
296
+ # TODO: do something with the message passed to next!
297
+ # proceed to next iteration
295
298
  rescue ControlFlow::Break
296
299
  # TODO: do something with the message passed to break!
297
300
  break
@@ -311,6 +314,9 @@ module Roast
311
314
  ems[index] = em = create_execution_manager_for_map_item(run, item, index + input.initial_index)
312
315
  em.prepare!
313
316
  em.run!
317
+ rescue ControlFlow::Next
318
+ # TODO: do something with the message passed to next!
319
+ # proceed to next iteration
314
320
  end
315
321
  end #: Array[Async::Task]
316
322
 
@@ -11,7 +11,7 @@ module Roast
11
11
  class InvalidCogReference < WorkflowError; end
12
12
 
13
13
  class << self
14
- #: (String, WorkflowParams) -> void
14
+ #: (String | Pathname, WorkflowParams) -> void
15
15
  def from_file(workflow_path, params)
16
16
  Dir.mktmpdir("roast-") do |tmpdir|
17
17
  workflow_context = WorkflowContext.new(params:, tmpdir:)
@@ -22,7 +22,7 @@ module Roast
22
22
  end
23
23
  end
24
24
 
25
- #: (String, WorkflowContext) -> void
25
+ #: (String | Pathname, WorkflowContext) -> void
26
26
  def initialize(workflow_path, workflow_context)
27
27
  @workflow_path = Pathname.new(workflow_path) #: Pathname
28
28
  @workflow_context = workflow_context #: WorkflowContext
@@ -7,7 +7,7 @@ require "minitest"
7
7
  # Disable the built-in `at_exit` hook for Minitest before anything else
8
8
  module Minitest
9
9
  class << self
10
- alias_method :original_at_exit, :at_exit
10
+ alias_method :original2_at_exit, :at_exit
11
11
  def at_exit(*)
12
12
  # Do nothing to prevent autorun hooks
13
13
  end
data/lib/roast/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Roast
5
- VERSION = "0.5.0"
5
+ VERSION = "0.5.2"
6
6
  end
data/lib/roast.rb CHANGED
@@ -83,12 +83,24 @@ module Roast
83
83
  workflow_path, *files = paths
84
84
 
85
85
  if options[:executor] == "dsl"
86
- $stderr.puts "⚠️ WARNING: You are using Roast 1.0 feature preview. This syntax has not yet been officially released and should not be considered fully stable."
86
+ $stderr.puts "⚠️ WARNING: You are using Roast 1.0 feature preview. This syntax has not yet been officially released and should not be considered fully stable." if $stderr.tty?
87
87
  targets, workflow_args, workflow_kwargs = parse_custom_workflow_args(files, ARGV)
88
88
  targets.unshift(options[:target]) if options[:target]
89
89
  workflow_params = Roast::DSL::WorkflowParams.new(targets, workflow_args, workflow_kwargs)
90
- Dir.chdir(ENV["ROAST_WORKING_DIRECTORY"] || Dir.pwd) do
91
- Roast::DSL::Workflow.from_file(workflow_path, workflow_params)
90
+
91
+ # If the workflow is running with a working directory specified to be different from the current directory
92
+ # from which Roast was run, and the workflow file if specified with a relative path, check for it relative
93
+ # to the current directory first, and then relative to the working directory specified for the workflow.
94
+ roast_working_directory = Pathname.new(File.expand_path(ENV["ROAST_WORKING_DIRECTORY"] || Dir.pwd))
95
+ workflow_path = Pathname.new(workflow_path)
96
+ real_workflow_path = if workflow_path.absolute? || workflow_path.exist?
97
+ workflow_path
98
+ else
99
+ roast_working_directory / workflow_path
100
+ end.realpath
101
+
102
+ Dir.chdir(roast_working_directory) do
103
+ Roast::DSL::Workflow.from_file(real_workflow_path, workflow_params)
92
104
  end
93
105
  else
94
106
  expanded_workflow_path = if workflow_path.include?("workflow.yml")
data/roast-ai.gemspec CHANGED
@@ -30,18 +30,18 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency("activesupport", ">= 7.0")
33
- spec.add_dependency("async", "~> 2.34")
34
- spec.add_dependency("benchmark", "~> 0.4.1")
35
- spec.add_dependency("cli-kit", "~> 5.2")
36
- spec.add_dependency("cli-ui", "~> 2.7")
37
- spec.add_dependency("diff-lcs", "~> 1.5")
38
- spec.add_dependency("json-schema")
39
- spec.add_dependency("open_router", "~> 0.3")
33
+ spec.add_dependency("async", ">= 2.34")
34
+ spec.add_dependency("benchmark", ">= 0.4.1")
35
+ spec.add_dependency("cli-kit", ">= 5.2")
36
+ spec.add_dependency("cli-ui", ">= 2.7")
37
+ spec.add_dependency("diff-lcs", ">= 1.5")
38
+ spec.add_dependency("json-schema", ">= 5.1")
39
+ spec.add_dependency("open_router", ">= 0.3")
40
40
  spec.add_dependency("raix", "~> 1.0.2")
41
- spec.add_dependency("rake", "~> 13.3.0") # NOTE: required by Thor
42
- spec.add_dependency("ruby-graphviz", "~> 1.2")
43
- spec.add_dependency("ruby_llm")
44
- spec.add_dependency("sqlite3", "~> 2.6")
45
- spec.add_dependency("thor", "~> 1.3")
46
- spec.add_dependency("zeitwerk", "~> 2.6")
41
+ spec.add_dependency("rake", ">= 13.3.0") # NOTE: required by Thor
42
+ spec.add_dependency("ruby-graphviz", ">= 1.2")
43
+ spec.add_dependency("ruby_llm", ">= 1.8")
44
+ spec.add_dependency("sqlite3", ">= 2.6")
45
+ spec.add_dependency("thor", ">= 1.3")
46
+ spec.add_dependency("zeitwerk", ">= 2.6")
47
47
  end
@@ -152,9 +152,11 @@ module Roast
152
152
  # - `model(string)` - Set the model to use
153
153
  # - `use_default_model!` - Use the provider's default model
154
154
  #
155
- # #### Configure the initial system prompt
156
- # - `initial_prompt(string)` - Set an initial prompt component to append to the agent's system prompt
157
- # - `no_initial_prompt!` - Don't append an initial prompt component
155
+ # #### Configure the system prompt
156
+ # - `replace_system_prompt(string)` - Completely replace the agent's default system prompt
157
+ # - `no_replace_system_prompt!` - Don't replace the default system prompt (default)
158
+ # - `append_system_prompt(string)` - Append a prompt component to the agent's system prompt
159
+ # - `no_append_system_prompt!` - Don't append to the system prompt (default)
158
160
  #
159
161
  # #### Configure the working directory
160
162
  # - `working_directory(path)` - Set the working directory for agent execution
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.5.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
@@ -27,70 +27,70 @@ dependencies:
27
27
  name: async
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.34'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '2.34'
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: benchmark
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.4.1
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.4.1
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: cli-kit
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '5.2'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
65
+ - - ">="
66
66
  - !ruby/object:Gem::Version
67
67
  version: '5.2'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: cli-ui
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - "~>"
72
+ - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '2.7'
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '2.7'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: diff-lcs
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - "~>"
86
+ - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '1.5'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ">="
94
94
  - !ruby/object:Gem::Version
95
95
  version: '1.5'
96
96
  - !ruby/object:Gem::Dependency
@@ -99,26 +99,26 @@ dependencies:
99
99
  requirements:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: '0'
102
+ version: '5.1'
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - ">="
108
108
  - !ruby/object:Gem::Version
109
- version: '0'
109
+ version: '5.1'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: open_router
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - "~>"
114
+ - - ">="
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0.3'
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - "~>"
121
+ - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0.3'
124
124
  - !ruby/object:Gem::Dependency
@@ -139,28 +139,28 @@ dependencies:
139
139
  name: rake
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - "~>"
142
+ - - ">="
143
143
  - !ruby/object:Gem::Version
144
144
  version: 13.3.0
145
145
  type: :runtime
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - "~>"
149
+ - - ">="
150
150
  - !ruby/object:Gem::Version
151
151
  version: 13.3.0
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: ruby-graphviz
154
154
  requirement: !ruby/object:Gem::Requirement
155
155
  requirements:
156
- - - "~>"
156
+ - - ">="
157
157
  - !ruby/object:Gem::Version
158
158
  version: '1.2'
159
159
  type: :runtime
160
160
  prerelease: false
161
161
  version_requirements: !ruby/object:Gem::Requirement
162
162
  requirements:
163
- - - "~>"
163
+ - - ">="
164
164
  - !ruby/object:Gem::Version
165
165
  version: '1.2'
166
166
  - !ruby/object:Gem::Dependency
@@ -169,54 +169,54 @@ dependencies:
169
169
  requirements:
170
170
  - - ">="
171
171
  - !ruby/object:Gem::Version
172
- version: '0'
172
+ version: '1.8'
173
173
  type: :runtime
174
174
  prerelease: false
175
175
  version_requirements: !ruby/object:Gem::Requirement
176
176
  requirements:
177
177
  - - ">="
178
178
  - !ruby/object:Gem::Version
179
- version: '0'
179
+ version: '1.8'
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: sqlite3
182
182
  requirement: !ruby/object:Gem::Requirement
183
183
  requirements:
184
- - - "~>"
184
+ - - ">="
185
185
  - !ruby/object:Gem::Version
186
186
  version: '2.6'
187
187
  type: :runtime
188
188
  prerelease: false
189
189
  version_requirements: !ruby/object:Gem::Requirement
190
190
  requirements:
191
- - - "~>"
191
+ - - ">="
192
192
  - !ruby/object:Gem::Version
193
193
  version: '2.6'
194
194
  - !ruby/object:Gem::Dependency
195
195
  name: thor
196
196
  requirement: !ruby/object:Gem::Requirement
197
197
  requirements:
198
- - - "~>"
198
+ - - ">="
199
199
  - !ruby/object:Gem::Version
200
200
  version: '1.3'
201
201
  type: :runtime
202
202
  prerelease: false
203
203
  version_requirements: !ruby/object:Gem::Requirement
204
204
  requirements:
205
- - - "~>"
205
+ - - ">="
206
206
  - !ruby/object:Gem::Version
207
207
  version: '1.3'
208
208
  - !ruby/object:Gem::Dependency
209
209
  name: zeitwerk
210
210
  requirement: !ruby/object:Gem::Requirement
211
211
  requirements:
212
- - - "~>"
212
+ - - ">="
213
213
  - !ruby/object:Gem::Version
214
214
  version: '2.6'
215
215
  type: :runtime
216
216
  prerelease: false
217
217
  version_requirements: !ruby/object:Gem::Requirement
218
218
  requirements:
219
- - - "~>"
219
+ - - ">="
220
220
  - !ruby/object:Gem::Version
221
221
  version: '2.6'
222
222
  description: Roast is a Ruby library for running structured AI workflows along with