sig
  type plugin = Kernel | Plugin of string
  type ident = private {
    plugin : Package.plugin;
    package : string list;
    name : string;
  }
  type jtype =
      Jany
    | Jnull
    | Jboolean
    | Jnumber
    | Jstring
    | Jalpha
    | Jtag of string
    | Jkey of string
    | Jindex of string
    | Joption of Package.jtype
    | Jdict of Package.jtype
    | Jlist of Package.jtype
    | Jarray of Package.jtype
    | Jtuple of Package.jtype list
    | Junion of Package.jtype list
    | Jrecord of (string * Package.jtype) list
    | Jdata of Package.ident
    | Jenum of Package.ident
    | Jself
  type fieldInfo = {
    fd_name : string;
    fd_type : Package.jtype;
    fd_descr : Markdown.text;
  }
  type tagInfo = {
    tg_name : string;
    tg_label : Markdown.text;
    tg_descr : Markdown.text;
  }
  type paramInfo =
      P_value of Package.jtype
    | P_named of Package.fieldInfo list
  type requestInfo = {
    rq_kind : [ `EXEC | `GET | `SET ];
    rq_input : Package.paramInfo;
    rq_output : Package.paramInfo;
    rq_signals : string list;
  }
  type arrayInfo = { arr_key : string; arr_kind : Package.jtype; }
  type declKindInfo =
      D_signal
    | D_type of Package.jtype
    | D_enum of Package.tagInfo list
    | D_record of Package.fieldInfo list
    | D_request of Package.requestInfo
    | D_value of Package.jtype
    | D_state of Package.jtype
    | D_array of Package.arrayInfo
    | D_safe of Package.ident * Package.jtype
    | D_loose of Package.ident * Package.jtype
    | D_order of Package.ident * Package.jtype
  type declInfo = {
    d_ident : Package.ident;
    d_descr : Markdown.text;
    d_kind : Package.declKindInfo;
  }
  type packageInfo = {
    p_plugin : Package.plugin;
    p_package : string list;
    p_title : string;
    p_descr : Markdown.text;
    p_readme : string option;
    p_content : Package.declInfo list;
  }
  val pp_plugin : Stdlib.Format.formatter -> Package.plugin -> unit
  val pp_pkgname : Stdlib.Format.formatter -> Package.packageInfo -> unit
  val pp_ident : Stdlib.Format.formatter -> Package.ident -> unit
  val pp_jtype : Stdlib.Format.formatter -> Package.jtype -> unit
  val derived :
    ?prefix:string -> ?suffix:string -> Package.ident -> Package.ident
  module Derived :
    sig
      val signal : Package.ident -> Package.ident
      val getter : Package.ident -> Package.ident
      val setter : Package.ident -> Package.ident
      val data : Package.ident -> Package.ident
      val fetch : Package.ident -> Package.ident
      val reload : Package.ident -> Package.ident
      val safe : Package.ident -> Package.ident
      val loose : Package.ident -> Package.ident
      val order : Package.ident -> Package.ident
      val decode : safe:bool -> Package.ident -> Package.ident
    end
  module IdMap :
    sig
      type key = ident
      type +!'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val mem : key -> 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
      val singleton : key -> '-> 'a t
      val remove : key -> 'a t -> 'a t
      val merge :
        (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
      val union : (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val for_all : (key -> '-> bool) -> 'a t -> bool
      val exists : (key -> '-> bool) -> 'a t -> bool
      val filter : (key -> '-> bool) -> 'a t -> 'a t
      val filter_map : (key -> '-> 'b option) -> 'a t -> 'b t
      val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
      val cardinal : 'a t -> int
      val bindings : 'a t -> (key * 'a) list
      val min_binding : 'a t -> key * 'a
      val min_binding_opt : 'a t -> (key * 'a) option
      val max_binding : 'a t -> key * 'a
      val max_binding_opt : 'a t -> (key * 'a) option
      val choose : 'a t -> key * 'a
      val choose_opt : 'a t -> (key * 'a) option
      val split : key -> 'a t -> 'a t * 'a option * 'a t
      val find : key -> 'a t -> 'a
      val find_opt : key -> 'a t -> 'a option
      val find_first : (key -> bool) -> 'a t -> key * 'a
      val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val find_last : (key -> bool) -> 'a t -> key * 'a
      val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
      val to_seq : 'a t -> (key * 'a) Seq.t
      val to_rev_seq : 'a t -> (key * 'a) Seq.t
      val to_seq_from : key -> 'a t -> (key * 'a) Seq.t
      val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t
      val of_seq : (key * 'a) Seq.t -> 'a t
    end
  module Scope :
    sig
      type t
      val create : Package.plugin -> Package.Scope.t
      val reserve : Package.Scope.t -> string -> unit
      val declare : Package.Scope.t -> Package.ident -> unit
      val use : Package.Scope.t -> Package.ident -> unit
      val resolve : Package.Scope.t -> string Package.IdMap.t
    end
  val isRecursive : Package.jtype -> bool
  val visit_jtype : (Package.ident -> unit) -> Package.jtype -> unit
  val visit_field : (Package.ident -> unit) -> Package.fieldInfo -> unit
  val visit_param : (Package.ident -> unit) -> Package.paramInfo -> unit
  val visit_request : (Package.ident -> unit) -> Package.requestInfo -> unit
  val visit_dkind : (Package.ident -> unit) -> Package.declKindInfo -> unit
  val visit_decl : (Package.ident -> unit) -> Package.declInfo -> unit
  val visit_package_decl :
    (Package.ident -> unit) -> Package.packageInfo -> unit
  val visit_package_used :
    (Package.ident -> unit) -> Package.packageInfo -> unit
  type package
  val package :
    ?plugin:string ->
    ?name:string ->
    title:string ->
    ?descr:Markdown.text -> ?readme:string -> unit -> Package.package
  val declare :
    package:Package.package ->
    name:string -> ?descr:Markdown.text -> Package.declKindInfo -> unit
  val declare_id :
    package:Package.package ->
    name:string ->
    ?descr:Markdown.text -> Package.declKindInfo -> Package.ident
  val update :
    package:Package.package -> name:string -> Package.declKindInfo -> unit
  val iter : (Package.packageInfo -> unit) -> unit
  val resolve :
    ?keywords:string list -> Package.packageInfo -> string Package.IdMap.t
  val field : Package.fieldInfo -> string * Package.jtype
  val name_of_pkg : ?sep:string -> Package.plugin -> string list -> string
  val name_of_pkginfo : ?sep:string -> Package.packageInfo -> string
  val name_of_package : ?sep:string -> Package.package -> string
  val name_of_ident : ?sep:string -> Package.ident -> string
  type pp = { self : Markdown.text; ident : Package.ident -> Markdown.text; }
  val litteral : string -> Markdown.text
  val md_jtype : Package.pp -> Package.jtype -> Markdown.text
  val md_tags : ?title:string -> Package.tagInfo list -> Markdown.table
  val md_fields :
    ?title:string -> Package.pp -> Package.fieldInfo list -> Markdown.table
end