Back to list
avsm

ocaml-project-setup

by avsm

Anil's OCaml Claude plugin collection

13🍴 3📅 Jan 17, 2026

SKILL.md


name: ocaml-project-setup description: "Standards for OCaml project metadata files. Use when initializing a new OCaml library/module, preparing for opam release, setting up CI, discussing project structure, or ensuring proper .mli/.ocamlformat files exist." license: ISC

OCaml Project Setup

Required Files

Every OCaml project needs:

FilePurpose
dune-projectBuild configuration, opam generation
dune (root)Top-level build rules
.ocamlformatCode formatting (required)
.gitignoreVCS ignores
LICENSE.mdLicense file
README.mdProject documentation
CI configGitHub Actions / GitLab CI / Tangled

Interface Files (.mli)

Every library module must have an .mli file for:

  • Clear API boundaries
  • Proper encapsulation
  • Documentation surface
(* lib/user.mli *)

(** User management.

    This module provides types and functions for user operations. *)

type t
(** A user. *)

val create : name:string -> email:string -> t
(** [create ~name ~email] creates a new user. *)

val name : t -> string
(** [name u] is the user's name. *)

val pp : t Fmt.t
(** [pp] is a pretty-printer for users. *)

Documentation style:

  • Functions: [name args] is/does ...
  • Values: [name] is ...
  • End with period

Standard Module Interface

For modules with a central type t:

type t
val v : ... -> t                           (* pure constructor *)
val create : ... -> (t, Error.t) result    (* constructor with I/O *)
val pp : t Fmt.t                           (* pretty-printer - required *)
val equal : t -> t -> bool                 (* equality *)
val compare : t -> t -> int                (* comparison *)
val of_json : Yojson.Safe.t -> (t, string) result
val to_json : t -> Yojson.Safe.t

OCamlFormat Configuration

Required: .ocamlformat in project root.

version = 0.28.1

Run dune fmt before every commit.

Logging Setup

Each module using logging should declare a source:

let log_src = Logs.Src.create "project.module"
module Log = (val Logs.src_log log_src : Logs.LOG)

Log levels:

  • Log.app - Always shown (startup)
  • Log.err - Critical errors
  • Log.warn - Potential issues
  • Log.info - Informational
  • Log.debug - Verbose debugging

User Configuration

Read from ~/.claude/ocaml-config.json:

{
  "author": { "name": "Name", "email": "email@example.com" },
  "license": "ISC",
  "ci_platform": "github",
  "git_hosting": { "type": "github", "org": "username" },
  "ocaml_version": "5.2.0"
}

License Headers

Every source file starts with license header:

(*---------------------------------------------------------------------------
  Copyright (c) {{YEAR}} {{AUTHOR}}. All rights reserved.
  SPDX-License-Identifier: ISC
 ---------------------------------------------------------------------------*)

Project Structure

project/
├── dune-project
├── dune
├── .ocamlformat
├── .gitignore
├── LICENSE.md
├── README.md
├── lib/
│   ├── dune
│   ├── foo.ml
│   └── foo.mli         # Required for every .ml
├── bin/
│   ├── dune
│   └── main.ml
├── test/
│   ├── dune
│   ├── test.ml
│   └── test_foo.ml
└── .github/workflows/  # or .gitlab-ci.yml

dune-project

(lang dune 3.16)
(name project_name)
(generate_opam_files true)
(maintenance_intent "(latest)")

(package
 (name project_name)
 (synopsis "Short description")
 (description "Longer description")
 (depends
  (ocaml (>= 5.2))
  (alcotest :with-test)))

Note: Don't add (version ...) - added at release time.

Templates

See templates/ directory for:

  • dune-project.template
  • dune-root.template
  • ci-github.yml
  • ci-gitlab.yml
  • ci-tangled.yml
  • gitignore
  • ocamlformat
  • LICENSE-ISC.md
  • LICENSE-MIT.md
  • README.template.md

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon