sig
  module Host :
    sig
      type t = Ketrew_pure.Host.t
      val parse : string -> Ketrew.EDSL.Host.t
      val tmp_on_localhost : Ketrew.EDSL.Host.t
      val ssh :
        ?add_ssh_options:string list ->
        ?playground:string ->
        ?port:int ->
        ?user:string -> ?name:string -> string -> Ketrew.EDSL.Host.t
      val cmdliner_term :
        ?doc:string ->
        [ `Flag of string list | `Required of int ] ->
        Ketrew.EDSL.Host.t Cmdliner.Term.t
    end
  module Program :
    sig
      type t = Ketrew_pure.Program.t
      val sh : string -> Ketrew.EDSL.Program.t
      val shf :
        ('a, unit, string, Ketrew.EDSL.Program.t) Pervasives.format4 -> 'a
      val exec : string list -> Ketrew.EDSL.Program.t
      val ( && ) :
        Ketrew.EDSL.Program.t ->
        Ketrew.EDSL.Program.t -> Ketrew.EDSL.Program.t
      val chain : Ketrew.EDSL.Program.t list -> Ketrew.EDSL.Program.t
    end
  module Condition :
    sig
      type t = Ketrew_pure.Target.Condition.t
      val ( && ) :
        Ketrew.EDSL.Condition.t ->
        Ketrew.EDSL.Condition.t -> Ketrew.EDSL.Condition.t
      val chain_and : Ketrew.EDSL.Condition.t list -> Ketrew.EDSL.Condition.t
      val program :
        ?returns:int ->
        ?host:Ketrew.EDSL.Host.t ->
        Ketrew.EDSL.Program.t -> Ketrew.EDSL.Condition.t
      module Volume :
        sig
          type t = Ketrew_pure.Target.Volume.t
          type structure = Ketrew_pure.Target.Volume.structure
          val create :
            host:Ketrew.EDSL.Host.t ->
            root:string ->
            Ketrew.EDSL.Condition.Volume.structure ->
            Ketrew.EDSL.Condition.Volume.t
          val file : string -> Ketrew.EDSL.Condition.Volume.structure
          val dir :
            string ->
            Ketrew.EDSL.Condition.Volume.structure list ->
            Ketrew.EDSL.Condition.Volume.structure
        end
      val volume_exists :
        Ketrew.EDSL.Condition.Volume.t -> Ketrew.EDSL.Condition.t
      val volume_size_greater_of_equal :
        Ketrew.EDSL.Condition.Volume.t -> int -> Ketrew.EDSL.Condition.t
    end
  module Build_process : sig type t = Ketrew_pure.Target.Build_process.t end
  val daemonize :
    ?starting_timeout:float ->
    ?call_script:(string -> string list) ->
    ?using:[ `Nohup_setsid | `Python_daemon ] ->
    ?host:Ketrew.EDSL.Host.t ->
    ?no_log_is_ok:bool ->
    Ketrew.EDSL.Program.t -> Ketrew.EDSL.Build_process.t
  val lsf :
    ?host:Ketrew.EDSL.Host.t ->
    ?queue:string ->
    ?name:string ->
    ?wall_limit:string ->
    ?processors:[ `Min of int | `Min_max of int * int ] ->
    ?project:string ->
    ?request_memory:[ `GB of int | `MB of int ] ->
    ?raw_options:string list ->
    Ketrew.EDSL.Program.t -> Ketrew.EDSL.Build_process.t
  val pbs :
    ?host:Ketrew.EDSL.Host.t ->
    ?queue:string ->
    ?name:string ->
    ?wall_limit:[ `Hours of float ] ->
    ?processors:int ->
    ?email_user:[ `Always of string | `Never ] ->
    ?shell:string -> Ketrew.EDSL.Program.t -> Ketrew.EDSL.Build_process.t
  val yarn_application :
    ?host:Ketrew.EDSL.Host.t ->
    ?daemonize_using:[ `Nohup_setsid | `Python_daemon ] ->
    ?daemon_start_timeout:float ->
    Ketrew.EDSL.Program.t -> Ketrew.EDSL.Build_process.t
  val yarn_distributed_shell :
    ?host:Ketrew.EDSL.Host.t ->
    ?daemonize_using:[ `Nohup_setsid | `Python_daemon ] ->
    ?daemon_start_timeout:float ->
    ?hadoop_bin:string ->
    ?distributed_shell_shell_jar:string ->
    ?container_vcores:int ->
    container_memory:[ `GB of int | `MB of int | `Raw of string ] ->
    timeout:[ `Raw of string | `Seconds of int ] ->
    application_name:string ->
    Ketrew.EDSL.Program.t -> Ketrew.EDSL.Build_process.t
  module Internal_representation :
    sig
      type t =
          < activate : unit; add_recursive_tags : string list -> unit;
            add_tags : string list -> unit;
            depends_on : Ketrew.EDSL.Internal_representation.t list;
            get_recursive_tags : string list;
            id : Ketrew_pure.Internal_pervasives.Unique_id.t; name : 
            string;
            on_failure_activate : Ketrew.EDSL.Internal_representation.t list;
            on_success_activate : Ketrew.EDSL.Internal_representation.t list;
            render : Ketrew_pure.Target.t >
    end
  type 'a product = 'a
    constraint 'a = < is_done : Ketrew.EDSL.Condition.t option; .. >
  type 'a workflow_node =
      < product : 'Ketrew.EDSL.product;
        render : Ketrew.EDSL.Internal_representation.t >
    constraint 'a = < is_done : Ketrew.EDSL.Condition.t option; .. >
  type workflow_edge
  val depends_on :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> Ketrew.EDSL.workflow_edge
  val on_success_activate :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> Ketrew.EDSL.workflow_edge
  val on_failure_activate :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> Ketrew.EDSL.workflow_edge
  type ensures_option =
      [ `Is_verified of Ketrew.EDSL.Condition.t | `Nothing | `Product_is_done ]
  val workflow_node :
    ?name:string ->
    ?active:bool ->
    ?make:Ketrew.EDSL.Build_process.t ->
    ?ensures:Ketrew.EDSL.ensures_option ->
    ?metadata:[ `String of string ] ->
    ?equivalence:Ketrew_pure.Target.Equivalence.t ->
    ?tags:string list ->
    ?edges:Ketrew.EDSL.workflow_edge list ->
    (< is_done : Ketrew.EDSL.Condition.t option; .. > as 'a)
    Ketrew.EDSL.product -> 'Ketrew.EDSL.workflow_node
  type not_already_done = < is_done : Ketrew.EDSL.Condition.t option >
  val without_product : Ketrew.EDSL.not_already_done
  type single_file =
      < exists : Ketrew_pure.Target.Condition.t; host : Ketrew.EDSL.Host.t;
        is_bigger_than : int -> Ketrew_pure.Target.Condition.t;
        is_done : Ketrew_pure.Target.Condition.t option; path : string >
  val single_file :
    ?host:Ketrew.EDSL.Host.t ->
    string -> Ketrew.EDSL.single_file Ketrew.EDSL.product
  type list_of_files =
      < is_done : Ketrew_pure.Target.Condition.t option;
        paths : string list >
  val list_of_files :
    ?host:Ketrew.EDSL.Host.t ->
    string list -> Ketrew.EDSL.list_of_files Ketrew.EDSL.product
  type unknown_product = < is_done : Ketrew.EDSL.Condition.t option >
  val forget_product :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node ->
    Ketrew.EDSL.unknown_product Ketrew.EDSL.workflow_node
  val workflow_to_string :
    ?ansi_colors:bool ->
    ?indentation:int ->
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> string
  val add_tags :
    ?recursive:bool ->
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> string list -> unit
  val node_id :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> string
  val node_name :
    < is_done : Ketrew.EDSL.Condition.t option; .. >
    Ketrew.EDSL.workflow_node -> string
  class type user_artifact =
    object
      method exists : Ketrew_pure.Target.Condition.t
      method is_bigger_than : int -> Ketrew_pure.Target.Condition.t
      method path : string
    end
  val file : ?host:Ketrew.EDSL.Host.t -> string -> Ketrew.EDSL.user_artifact
  val unit : Ketrew.EDSL.user_artifact
  class type user_target =
    object
      method activate : unit
      method add_recursive_tags : string list -> unit
      method add_tags : string list -> unit
      method depends_on : Ketrew.EDSL.user_target list
      method get_recursive_tags : string list
      method id : Ketrew_pure.Internal_pervasives.Unique_id.t
      method is_active : bool
      method metadata : [ `String of string ] option
      method name : string
      method on_failure_activate : Ketrew.EDSL.user_target list
      method on_success_activate : Ketrew.EDSL.user_target list
      method product : Ketrew.EDSL.user_artifact
      method render : Ketrew_pure.Target.t
    end
  val target :
    ?active:bool ->
    ?depends_on:Ketrew.EDSL.user_target list ->
    ?make:Ketrew.EDSL.Build_process.t ->
    ?done_when:Ketrew_pure.Target.Condition.t ->
    ?metadata:[ `String of string ] ->
    ?product:Ketrew.EDSL.user_artifact ->
    ?equivalence:Ketrew_pure.Target.Equivalence.t ->
    ?on_failure_activate:Ketrew.EDSL.user_target list ->
    ?on_success_activate:Ketrew.EDSL.user_target list ->
    ?tags:string list -> string -> Ketrew.EDSL.user_target
  val file_target :
    ?depends_on:Ketrew.EDSL.user_target list ->
    ?make:Ketrew.EDSL.Build_process.t ->
    ?metadata:[ `String of string ] ->
    ?name:string ->
    ?host:Ketrew.EDSL.Host.t ->
    ?equivalence:Ketrew_pure.Target.Equivalence.t ->
    ?on_failure_activate:Ketrew.EDSL.user_target list ->
    ?on_success_activate:Ketrew.EDSL.user_target list ->
    ?tags:string list -> string -> Ketrew.EDSL.user_target
  val to_display_string :
    ?ansi_colors:bool ->
    ?indentation:int -> Ketrew.EDSL.user_target -> string
end