plugins/ocaml-dev/skills/ocaml-docs/SKILL.md
Fixing odoc documentation warnings and errors. Use when running dune build @doc, resolving reference syntax issues, cross-package references, ambiguous references, hidden fields, or @raise tags in OCaml documentation.
npx skillsauth add avsm/ocaml-claude-marketplace ocaml-docsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when fixing odoc documentation warnings, typically from dune build @doc.
Prerequisites: This skill covers odoc v3 syntax which is not yet in released versions of dune or odoc. You need:
Use path-based disambiguation {!Path.To.kind-Name} rather than {!kind:Path.To.Name}:
(* Correct *)
{!Jsont.exception-Error}
{!Proto.Incoming.t.constructor-Message}
{!module-Foo.module-type-Bar.exception-Baz}
(* Incorrect *)
{!exception:Jsont.Error}
{!constructor:Proto.Incoming.t.Message}
This allows disambiguation at any position in the path.
module- for modulestype- for typesval- for valuesexception- for exceptionsconstructor- for variant constructorsfield- for record fieldsmodule-type- for module typesWhen odoc cannot resolve a reference to another package, add a documentation dependency in dune-project:
(package
(name mypackage)
...
(documentation (depends other-package)))
Do NOT convert doc references {!Foo} to code markup [Foo] - this loses the hyperlink.
When referencing modules from another library in the same package, use the full path through re-exported modules.
Example: If claude.mli has module Proto = Proto, reference proto modules as {!Proto.Incoming} not {!Incoming}.
If odoc reports "Couldn't find X" where X is the last path component:
.mlimodule X = X to the parent's .mli if missingWhen odoc warns about ambiguity (e.g., both an exception and module named Error):
{!Jsont.exception-Error} (* for the exception *)
{!Jsont.module-Error} (* for the module *)
For @raise documentation tags, use the exception path with disambiguation:
@raise Jsont.exception-Error
@raise Tomlt.Toml.Error.exception-Error
The @ character is interpreted as a tag marker in odoc. When you need a literal @ in documentation text (e.g., describing @-mentions), escape it with a backslash:
(* Correct - escaped @ *)
(** User was \@-mentioned *)
(** Mentioned via \@all/\@everyone *)
(* Incorrect - will produce "Stray '@'" or "Unknown tag" warnings *)
(** User was @-mentioned *)
(** Mentioned via @all *)
When odoc warns about "Hidden fields in type 'Foo.Bar.t': field_name", it means a record field uses a type that odoc can't resolve in the documentation.
Diagnosis:
.mli fileuri : Uri.t).mliFix Option 1: Re-export the module in the wrapper .mli:
(** RFC 3986 URI parsing *)
module Uri = Uri
Fix Option 2: If you only want to expose the type (not the whole module), use @canonical:
Add a type alias in the wrapper .mli:
type uri = Uri.t
Add @canonical to the original type's documentation:
(* In uri.mli *)
type t
(** A URI. @canonical Requests.uri *)
This tells odoc to link Uri.t to Requests.uri in the generated documentation.
| Error Pattern | Meaning | Fix |
|--------------|---------|-----|
| unresolvedroot(X) | X not found as root module | Check library dependencies, add documentation depends |
| Couldn't find "Y" after valid path | Y doesn't exist at that location | Verify module structure, check exports |
| Reference to 'X' is ambiguous | Multiple items named X | Add kind qualifier (e.g., exception-X) |
| Hidden fields in type ... : field | Field's type not resolvable | Re-export the type's module in wrapper .mli |
dune clean before dune build @doc to ensure fresh builds.mli file to see what modules are exportedtools
Working with the OxCaml extensions to OCaml. Use when the oxcaml compiler is available and you need high-performance, unboxing, stack allocation, data-race-free parallelism
development
Creating OCaml library tutorials using .mld documentation format with MDX executable examples. Use when discussing tutorials, documentation, .mld files, MDX, or interactive documentation.
development
Testing strategies for OCaml libraries. Use when discussing tests, alcotest, eio mocks, test structure, or test-driven development in OCaml projects.
development
Security hardening for OCaml libraries through systematic vulnerability research. Use when Claude needs to: (1) Research CVEs in similar implementations (C, Rust, Go, Python) and add regression tests, (2) Add fuzz tests for parsers and encoders, (3) Audit integer handling and buffer operations, (4) Test boundary conditions and malformed input, (5) Review cryptographic usage, (6) Add defensive checks against common vulnerability classes