sig
  type status =
      [ `Exited of int
      | `Signaled of Core.Signal.t
      | `Stopped of Core.Signal.t
      | `Timeout of Core.Std.Time.Span.t ]
  type t
  type result = {
    command : Shell.Process.t;
    status : Shell.Process.status;
    stdout : string;
    stderr : string;
  }
  exception Failed of Shell.Process.result
  val to_string : Shell.Process.t -> string
  val status_to_string : Shell.Process.status -> string
  val format_failed : Shell.Process.result -> string
  val cmd : string -> string list -> Shell.Process.t
  val shell : string -> Shell.Process.t
  val remote :
    ?user:string -> host:string -> Shell.Process.t -> Shell.Process.t
  type 'a reader
  val content : string Shell.Process.reader
  val discard : unit Shell.Process.reader
  val lines : string list Shell.Process.reader
  val head : string Shell.Process.reader
  val run :
    ?timeout:Core.Std.Time.Span.t option ->
    ?working_dir:string ->
    ?expect:int list ->
    ?verbose:bool ->
    ?echo:bool ->
    ?input:string -> Shell.Process.t -> 'Shell.Process.reader -> 'a
  val test :
    ?timeout:Core.Std.Time.Span.t option ->
    ?working_dir:string ->
    ?verbose:bool ->
    ?echo:bool ->
    ?input:string ->
    ?true_v:int list -> ?false_v:int list -> Shell.Process.t -> bool
end