sig
  val init : unit -> unit
  val toggle_verbose : unit -> unit
  type +'a menu_item
  val menu_item :
    ?char:char -> ?log:SmartPrint.t -> '-> 'Ketrew.Interaction.menu_item
  val menu :
    ?max_per_page:int ->
    ?always_there:'Ketrew.Interaction.menu_item list ->
    sentence:SmartPrint.t ->
    'Ketrew.Interaction.menu_item list ->
    ('a, [> `Failure of string ]) Unix_io.t
  val open_in_dollar_editor : string -> (unit, 'a) Unix_io.Deferred_result.t
  val view_in_dollar_editor :
    ?extension:string ->
    string ->
    (unit, [> `IO of [> `Write_file_exn of string * exn ] ])
    Unix_io.Deferred_result.t
  val ask_for_edition :
    ?extension:string ->
    string ->
    (string,
     [> `IO of
          [> `Read_file_exn of Unix_io.IO.path * exn
           | `Write_file_exn of Unix_io.IO.path * exn ] ])
    Unix_io.Deferred_result.t
  val get_key : unit -> (char, [> `Failure of string ]) Unix_io.t
  val build_sublist_of_targets :
    client:Ketrew.Client.t ->
    list_name:string ->
    all_log:SmartPrint.t ->
    go_verb:SmartPrint.t ->
    filter:(Ketrew_pure.Target.t -> bool) ->
    ([> `Cancel | `Go of string list ],
     [> `Client of Ketrew.Client.Error.t
      | `Database of Trakeva.Error.t
      | `Failure of string
      | `IO of
          [> `Read_file_exn of string * exn | `Write_file_exn of string * exn ]
      | `Missing_data of string
      | `System of [> `File_info of string ] * [> `Exn of exn ]
      | `Target of [> `Deserilization of string ] ])
    Unix_io.t
  val make_target_menu :
    targets:Ketrew_pure.Target.t list ->
    ?filter_target:(Ketrew_pure.Target.t -> bool) ->
    unit -> [> `Go of string ] Ketrew.Interaction.menu_item list
  val run_with_quit_key :
    < start : (unit, [> `Failure of string ] as 'start_error)
              Unix_io.Deferred_result.t;
      stop : unit > ->
    (unit, 'start_error) Unix_io.Deferred_result.t
end