@reset @sethvargo Have a preference on this? I currently have a local patch to berks that looks like this:

```ruby
    def resolve
      graph.populate_store
      graph.populate(berksfile.sources)

      Solve::GecodeSolver.new(graph, demand_array, {}).dump_problem

      Solve.it!(graph, demand_array, ENV['DEBUG_RESOLVER'] ? { ui: Berkshelf.ui } : {}).collect do |name, version|
        dependency = get_demand(name) || Dependency.new(berksfile, name)
        dependency.locked_version = version

        dependency
      end
    rescue Solve::Errors::NoSolutionError => e
      Solve::GecodeSolver.new(graph, demand_array, {}).find_unsatisfiable_demands

      raise NoSolutionError.new(demands, e.to_s)
    end
```

It would be simple enough to pass in the ui object there and convert the `puts` statements in this method to `ui.say()`, or I could pass back a data structure and let berks handle the output.