sig
  type command
  val command :
    ?env:string array ->
    ?verbose:bool ->
    ?name:string ->
    ?metadata:(string * string) list ->
    ?dir:string ->
    ?allow_stdin:bool ->
    ?text:string -> string -> string list -> OpamProcess.command
  val string_of_command : OpamProcess.command -> string
  val text_of_command : OpamProcess.command -> string option
  val is_verbose_command : OpamProcess.command -> bool
  val make_command_text :
    ?color:OpamGlobals.text_style ->
    string -> ?args:string list -> string -> string
  type t = {
    p_name : string;
    p_args : string list;
    p_pid : int;
    p_cwd : string;
    p_time : float;
    p_stdout : string option;
    p_stderr : string option;
    p_env : string option;
    p_info : string option;
    p_metadata : (string * string) list;
    p_verbose : bool;
  }
  type result = {
    r_code : int;
    r_signal : int option;
    r_duration : float;
    r_info : (string * string) list;
    r_stdout : string list;
    r_stderr : string list;
    r_cleanup : string list;
  }
  val run : OpamProcess.command -> OpamProcess.result
  val run_background : OpamProcess.command -> OpamProcess.t
  val dry_run_background : OpamProcess.command -> OpamProcess.t
  val wait : OpamProcess.t -> OpamProcess.result
  val dontwait : OpamProcess.t -> OpamProcess.result option
  val wait_one : OpamProcess.t list -> OpamProcess.t * OpamProcess.result
  val dry_wait_one : OpamProcess.t list -> OpamProcess.t * OpamProcess.result
  val interrupt : OpamProcess.t -> unit
  val is_success : OpamProcess.result -> bool
  val is_failure : OpamProcess.result -> bool
  val cleanup : ?force:bool -> OpamProcess.result -> unit
  val read_lines : string -> string list
  val string_of_result :
    ?color:OpamGlobals.text_style -> OpamProcess.result -> string
  module Job :
    sig
      module Op :
        sig
          type 'a job =
              Done of 'a
            | Run of OpamProcess.command *
                (OpamProcess.result -> 'OpamProcess.Job.Op.job)
          val ( @@> ) :
            OpamProcess.command ->
            (OpamProcess.result -> 'OpamProcess.Job.Op.job) ->
            'OpamProcess.Job.Op.job
          val ( @@+ ) :
            'OpamProcess.Job.Op.job ->
            ('-> 'OpamProcess.Job.Op.job) -> 'OpamProcess.Job.Op.job
          val ( @@| ) :
            'OpamProcess.Job.Op.job ->
            ('-> 'b) -> 'OpamProcess.Job.Op.job
        end
      val run : 'OpamProcess.Job.Op.job -> 'a
      val dry_run : 'OpamProcess.Job.Op.job -> 'a
      val catch :
        (exn -> 'OpamProcess.Job.Op.job) ->
        'OpamProcess.Job.Op.job -> 'OpamProcess.Job.Op.job
      val ignore_errors :
        default:'->
        ?message:string ->
        'OpamProcess.Job.Op.job -> 'OpamProcess.Job.Op.job
      val finally :
        (unit -> unit) ->
        'OpamProcess.Job.Op.job -> 'OpamProcess.Job.Op.job
      val of_list :
        ?keep_going:bool ->
        OpamProcess.command list ->
        (OpamProcess.command * OpamProcess.result) option
        OpamProcess.Job.Op.job
      val with_text :
        string -> 'OpamProcess.Job.Op.job -> 'OpamProcess.Job.Op.job
    end
  type 'a job = 'OpamProcess.Job.Op.job
end