···11+ISC License
22+33+Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>
44+55+Permission to use, copy, modify, and distribute this software for any
66+purpose with or without fee is hereby granted, provided that the above
77+copyright notice and this permission notice appear in all copies.
88+99+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1010+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1111+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1212+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1313+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1414+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1515+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+46
README.md
···11+# project-name - Brief Project Title
22+33+Brief introduction paragraph explaining what this library/tool does and its main purpose.
44+55+## Key Features
66+77+- Feature 1: Description
88+- Feature 2: Description
99+- Feature 3: Description
1010+1111+## Usage
1212+1313+```ocaml
1414+(* Basic usage example *)
1515+let example () =
1616+ (* Show simple, practical usage *)
1717+ ()
1818+```
1919+2020+For more advanced usage:
2121+2222+```ocaml
2323+(* More complex example *)
2424+let advanced_example () =
2525+ (* Show additional features *)
2626+ ()
2727+```
2828+2929+## Installation
3030+3131+```
3232+opam install project-name
3333+```
3434+3535+## Documentation
3636+3737+API documentation is available at [project URL] or via:
3838+3939+```
4040+opam install project-name
4141+odig doc project-name
4242+```
4343+4444+## License
4545+4646+ISC
+259
SKILL.md
···11+---
22+name: ocaml-metadata
33+description: Standards for OCaml project metadata files. Use when initialising a new OCaml library/module, preparing for opam release, setting up testing infrastructure, or searching the OCaml ecosystem for dependencies. Not for normal code edits.
44+license: ISC
55+---
66+77+# OCaml Project Metadata Standards
88+99+## When to Use This Skill
1010+1111+Invoke this skill when:
1212+1313+1. **Initializing a new OCaml project** - Setting up dune-project, LICENSE, README, CI, etc.
1414+2. **Preparing for opam release** - Ensuring all metadata is correct for publication
1515+3. **Setting up testing infrastructure** - Especially for Eio-based libraries that need mock testing
1616+4. **Searching the OCaml ecosystem** - Finding and fetching dependency sources for reference
1717+5. **Adding third-party source references** - Using `opam source` to study library implementations
1818+1919+**Do not use for:**
2020+- Regular code edits or bug fixes
2121+- Simple function additions
2222+- Refactoring existing code
2323+2424+## License Header
2525+2626+All projects use the ISC license (see LICENSE.md in this directory).
2727+2828+Every OCaml source file must start with this license header:
2929+3030+```ocaml
3131+(*---------------------------------------------------------------------------
3232+ Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3333+ SPDX-License-Identifier: ISC
3434+ ---------------------------------------------------------------------------*)
3535+```
3636+3737+## Build System (Dune)
3838+3939+Use Dune for builds with automatic opam file generation enabled.
4040+4141+**Required file:** `dune-project`
4242+- See the `dune-project` file in this skill directory for a reference template
4343+- Update project name, synopsis, description, and dependencies as needed
4444+- Always set `(generate_opam_files true)`
4545+- Use `(maintenance_intent "(latest)")` for actively maintained projects
4646+- **Do not add a `(version ...)` field** - this will be added at release time
4747+- **For Tangled projects, do not use `(source ...)` stanza** - if the project URL is tangled.org or git remote is not github.com (e.g., git.recoil.org), omit the source field entirely
4848+- You can determine the project SSH url from the git remote origin; if it
4949+ is not a github.com URL, then it's probably tangled. For Tangled projects, follow the specific URL schema
5050+ shown in the same dune-project file here, with URLs going to https://tangled.org/
5151+5252+**Required file:** `dune` (root)
5353+- See the `dune` file in this skill directory for a reference template
5454+- Include `(data_only_dirs third_party)` to ignore fetched dependency sources
5555+- Add other project-wide Dune configuration as needed
5656+5757+## Version Control
5858+5959+**Required file:** `.gitignore`
6060+- See the `.gitignore` file in this skill directory for a reference template
6161+- Always include `third_party/` to exclude fetched dependency sources
6262+- Include standard OCaml build artifacts (`_build/`, `*.install`, etc.)
6363+- Include editor and OS-specific files (`.DS_Store`, `.vscode/`, etc.)
6464+6565+## Code Formatting
6666+6767+Use OCamlFormat with default styling.
6868+6969+**Required file:** `.ocamlformat`
7070+- Copy the `.ocamlformat` file from this skill directory
7171+- Current version: 0.28.1
7272+7373+## Testing
7474+7575+**Reference:** See `TESTS.md` in this skill directory for detailed testing strategies.
7676+7777+**Key points:**
7878+- Use Alcotest for test framework
7979+- **For Eio-based libraries:** Use Eio mock infrastructure (`Eio_mock`) instead of real I/O
8080+- Fetch dependency sources (e.g., eio) to understand mock APIs: see `SOURCES.md`
8181+- Prefer unit tests with mocks over integration tests
8282+- Test edge cases by injecting errors through mocks
8383+8484+**Test directory structure:**
8585+```
8686+test/
8787+├── dune # Test configuration
8888+├── test_mylib.ml # Unit tests (with mocks)
8989+└── test_integration.ml # Integration tests (minimal)
9090+```
9191+9292+Add test dependencies to `dune-project`:
9393+```lisp
9494+(depends
9595+ ; ...
9696+ (alcotest (and :with-test (>= 1.7.0)))
9797+ (eio_main :with-test) ; if using Eio
9898+)
9999+```
100100+101101+## Third-Party Sources
102102+103103+**Reference:** See `SOURCES.md` in this skill directory for complete workflow.
104104+105105+When developing, you may want to fetch dependency sources for reference:
106106+107107+```bash
108108+mkdir -p third_party
109109+cd third_party
110110+opam source <package-name>
111111+cd ..
112112+```
113113+114114+**Required setup:**
115115+- Add `(data_only_dirs third_party)` to root `dune` file
116116+- Add `third_party/` to `.gitignore`
117117+- Generate `third_party/llms.txt` summary for discoverability
118118+119119+This is especially useful for:
120120+- Understanding Eio mock APIs for testing
121121+- Studying implementation patterns
122122+- Referencing complex APIs
123123+124124+## Continuous Integration
125125+126126+Use Tangled.org for CI.
127127+128128+**Required file:** `.tangled/workflows/build.yml`
129129+- Copy from `.tangled/workflows/build.yml` in this skill directory if it doesn't exist
130130+- The default workflow includes: opam init, aoah-opam-repo overlay addition, dependency installation, build, test, and documentation generation
131131+- The workflow automatically adds the aoah-opam-repo overlay for development dependencies
132132+- If the project has special test requirements beyond standard opam tests, document them in the README and update build.yml accordingly
133133+134134+## Documentation
135135+136136+**Required file:** `README.md`
137137+- See the `README.md` file in this skill directory for a reference template
138138+- Include: project title, brief description, key features, usage examples, installation instructions, and license
139139+- Keep it concise but informative
140140+- Use code examples to show practical usage
141141+- Update the template with project-specific information
142142+143143+**Documentation builds (`dune build @doc`):**
144144+- When building documentation locally, warnings about unresolved references to third-party libraries (including standard library modules like `Random`, `String`, etc.) are **expected and OK**
145145+- These warnings appear because dune doesn't have access to external library documentation during local builds
146146+- Example warning: `Warning: Failed to resolve reference unresolvedroot(Random).float`
147147+- These references will be properly resolved when the package is built on OCaml.org's documentation infrastructure, which has access to all dependencies
148148+- **Do not attempt to fix these warnings** by removing or modifying the cross-references in documentation comments
149149+150150+## Opam Overlay Repository
151151+152152+When developing packages that need to be available for CI before official release, add them to the overlay opam repository at `~/src/git/knot/aoah-opam-repo`.
153153+154154+### Adding Dev Packages to Overlay
155155+156156+**Location:** `~/src/git/knot/aoah-opam-repo`
157157+158158+**Structure:** Follow standard opam repository layout:
159159+```
160160+packages/
161161+├── package-name/
162162+│ └── package-name.dev/
163163+│ └── opam
164164+```
165165+166166+**Version:** Always use `.dev` as the version suffix for development packages.
167167+168168+### Workflow for Adding a Package
169169+170170+1. **Read the source opam files** from the development repository to get metadata
171171+2. **Create package directory structure:**
172172+ ```bash
173173+ mkdir -p ~/src/git/knot/aoah-opam-repo/packages/<package-name>/<package-name>.dev
174174+ ```
175175+176176+3. **Create the opam file** at `packages/<package-name>/<package-name>.dev/opam`:
177177+ - Copy all metadata from the source opam file (synopsis, description, maintainer, authors, license, dependencies, build instructions)
178178+ - Add `dev-repo` field pointing to the git repository
179179+ - Add `url` stanza with git source and branch:
180180+ ```
181181+ url {
182182+ src: "git+https://tangled.org/@anil.recoil.org/<repo-name>.git#main"
183183+ }
184184+ ```
185185+ - For packages from the same repository (e.g., `yamlrw`, `yamlrw-eio`, `yamlrw-unix`):
186186+ - Use `{= version}` for same-repo dependencies (e.g., `"yamlrw" {= version}`)
187187+ - All point to the same git repository URL
188188+189189+4. **Handle multi-package repositories:**
190190+ - If a repository generates multiple opam files (e.g., `yamlrw.opam`, `yamlrw-eio.opam`), create separate package directories for each
191191+ - Each package gets its own `packages/<name>/<name>.dev/opam` entry
192192+ - All packages from the same repo share the same `url.src` value
193193+194194+### Example: Adding yamlrw Packages
195195+196196+For a repository with multiple packages (`yamlrw.opam`, `yamlrw-eio.opam`, `yamlrw-unix.opam`):
197197+198198+```bash
199199+# Create directory structure
200200+cd ~/src/git/knot/aoah-opam-repo
201201+mkdir -p packages/yamlrw/yamlrw.dev
202202+mkdir -p packages/yamlrw-eio/yamlrw-eio.dev
203203+mkdir -p packages/yamlrw-unix/yamlrw-unix.dev
204204+205205+# Each opam file includes:
206206+# - Original metadata from source opam file
207207+# - dev-repo: "git+https://tangled.org/@anil.recoil.org/ocaml-yamlrw.git"
208208+# - url { src: "git+https://tangled.org/@anil.recoil.org/ocaml-yamlrw.git#main" }
209209+# - For yamlrw-eio and yamlrw-unix: "yamlrw" {= version} dependency
210210+```
211211+212212+### Using the Overlay Repository
213213+214214+Add the overlay to your opam configuration:
215215+```bash
216216+opam repository add aoah-dev ~/src/git/knot/aoah-opam-repo
217217+```
218218+219219+This makes `.dev` versions available for installation:
220220+```bash
221221+opam install bytesrw-eio.dev
222222+opam install yamlrw.dev yamlrw-eio.dev
223223+```
224224+225225+### Notes
226226+227227+- Always use HTTPS URLs for `dev-repo` and `url.src` fields (e.g., `https://tangled.org/...`)
228228+- Track the `main` branch by default unless specified otherwise
229229+- Preserve all original metadata and dependencies from source opam files
230230+- Use `{= version}` for intra-repository dependencies to ensure version consistency
231231+232232+## File Checklist for New Projects
233233+234234+When initializing a new OCaml project, ensure these files exist:
235235+236236+**Essential files:**
237237+- [ ] `README.md` - Project documentation and usage examples
238238+- [ ] `dune-project` - Build configuration with opam file generation
239239+- [ ] `dune` (root) - With `(data_only_dirs third_party)` if using third-party sources
240240+- [ ] `.ocamlformat` - Code formatting configuration
241241+- [ ] `.gitignore` - Should include `third_party/` if fetching sources
242242+- [ ] `LICENSE.md` - ISC license
243243+- [ ] `.tangled/workflows/build.yml` - CI configuration
244244+- [ ] Source files with proper license headers
245245+246246+**Test files:**
247247+- [ ] `test/dune` - Test executable configuration
248248+- [ ] `test/test_*.ml` - Test files (prefer mocks for Eio-based code)
249249+250250+**Optional (for development):**
251251+- [ ] `third_party/` - Fetched dependency sources (not committed to git)
252252+- [ ] `third_party/llms.txt` - Summary of available third-party sources
253253+254254+**For development packages:**
255255+- [ ] Add `.dev` package to `~/src/git/knot/aoah-opam-repo` overlay repository
256256+257257+**Reference documentation in this skill:**
258258+- `TESTS.md` - Detailed testing strategies and Eio mock usage
259259+- `SOURCES.md` - How to fetch and manage third-party sources
+118
SOURCES.md
···11+# Fetching Third-Party Sources for Analysis
22+33+When developing a library, it's often helpful to have the source code of dependencies available for local analysis and reference.
44+55+## Setting Up Third-Party Sources
66+77+### 1. Search for Packages
88+99+Find packages using opam search:
1010+1111+```bash
1212+opam search <package-name>
1313+```
1414+1515+### 2. Fetch Sources into third_party/
1616+1717+Download package sources into a `third_party/` directory:
1818+1919+```bash
2020+mkdir -p third_party
2121+cd third_party && opam source <package-name> && cd ..
2222+```
2323+2424+**IMPORTANT**: Use `&&` to chain commands in a single bash call, or use separate sequential calls to avoid nested directories. The command above will create a directory like `third_party/<package-name>.<version>/` with the full source code.
2525+2626+After running `opam source`, the package will be extracted to `third_party/<package-name>.<version>/` where you can read the source files directly.
2727+2828+### 3. Configure Dune to Ignore third_party/
2929+3030+Add to your root `dune` file (or create one if it doesn't exist):
3131+3232+```lisp
3333+(data_only_dirs third_party)
3434+```
3535+3636+This tells Dune to ignore the `third_party/` directory during builds, treating it as data-only.
3737+3838+### 4. Add to .gitignore
3939+4040+Add the following to your `.gitignore` file:
4141+4242+```gitignore
4343+# Third-party sources (fetch locally with opam source)
4444+third_party/
4545+```
4646+4747+### 5. Generate llms.txt Summary
4848+4949+After fetching sources, generate an `llms.txt` summary in the third_party directory for easier reference:
5050+5151+```bash
5252+# Create a summary of the library structure
5353+find third_party/<package-name>.<version> -name "*.mli" -o -name "*.ml" | head -20 > third_party/llms.txt
5454+echo "" >> third_party/llms.txt
5555+echo "=== Key Modules ===" >> third_party/llms.txt
5656+find third_party/<package-name>.<version> -name "*.mli" | xargs -I {} basename {} .mli >> third_party/llms.txt
5757+```
5858+5959+A better approach is to use the package's documentation:
6060+6161+```bash
6262+# If the package has good documentation, reference that
6363+echo "Package: <package-name>" > third_party/llms.txt
6464+echo "Location: third_party/<package-name>.<version>" >> third_party/llms.txt
6565+echo "Documentation: See README.md and .mli files" >> third_party/llms.txt
6666+echo "" >> third_party/llms.txt
6767+echo "=== Main Modules ===" >> third_party/llms.txt
6868+find third_party/<package-name>.<version> -name "*.mli" -exec basename {} \; | sort >> third_party/llms.txt
6969+```
7070+7171+## Example Workflow
7272+7373+```bash
7474+# Search for eio package
7575+opam search eio
7676+7777+# Create third_party directory
7878+mkdir -p third_party
7979+cd third_party
8080+8181+# Fetch eio sources
8282+opam source eio
8383+8484+# Return to project root
8585+cd ..
8686+8787+# Add to root dune file
8888+echo "(data_only_dirs third_party)" >> dune
8989+9090+# Add to .gitignore
9191+echo "third_party/" >> .gitignore
9292+9393+# Generate llms.txt summary
9494+cat > third_party/llms.txt << EOF
9595+Package: eio
9696+Location: third_party/eio.*
9797+Purpose: Effects-based I/O library for OCaml
9898+9999+Key modules available in .mli files for reference.
100100+EOF
101101+```
102102+103103+## When to Fetch Sources
104104+105105+Fetch third-party sources when you need to:
106106+- Understand how to use complex APIs
107107+- Reference implementation patterns
108108+- Study mock/test infrastructure (e.g., Eio.Mock)
109109+- Debug interactions with dependencies
110110+- Learn from well-written code
111111+112112+## Notes
113113+114114+- Sources are fetched based on your current opam switch
115115+- Sources are not committed to git (listed in .gitignore)
116116+- Each developer can fetch sources as needed
117117+- Dune ignores these directories completely (data_only_dirs)
118118+- Update llms.txt when adding new third-party sources for better discoverability
+224
TESTS.md
···11+# Testing Strategies for OCaml Libraries
22+33+## Overview
44+55+Testing strategies vary based on your library's dependencies and I/O requirements. This guide covers different approaches with special attention to Eio-based libraries.
66+77+## General Testing Setup
88+99+### Basic Test Structure
1010+1111+Tests typically use Alcotest:
1212+1313+```ocaml
1414+let test_basic () =
1515+ Alcotest.(check int) "same ints" 42 (21 + 21)
1616+1717+let suite = [
1818+ "basic", `Quick, test_basic;
1919+]
2020+2121+let () = Alcotest.run "MyLibrary" [
2222+ "suite1", suite;
2323+]
2424+```
2525+2626+### Test Dependencies
2727+2828+Add to your `dune-project` package stanza:
2929+3030+```lisp
3131+(depends
3232+ ; ... other deps ...
3333+ (alcotest (and :with-test (>= 1.7.0)))
3434+ (eio_main :with-test) ; if using Eio
3535+)
3636+```
3737+3838+## Testing Eio-Based Libraries
3939+4040+### Using Eio Mock Infrastructure
4141+4242+If your library uses Eio, **prefer using Eio's mock infrastructure** for testing rather than running real I/O operations. This provides:
4343+- Deterministic tests
4444+- No actual filesystem/network operations
4545+- Better error injection and edge case testing
4646+- Faster test execution
4747+4848+### Step 1: Fetch Eio Sources
4949+5050+Before writing Eio tests, fetch the Eio sources to understand the mock APIs:
5151+5252+```bash
5353+mkdir -p third_party
5454+cd third_party
5555+opam source eio
5656+cd ..
5757+5858+# Add to root dune file
5959+echo "(data_only_dirs third_party)" >> dune
6060+6161+# Add to .gitignore
6262+echo "third_party/" >> .gitignore
6363+```
6464+6565+### Step 2: Study Eio Mock APIs
6666+6767+Key files to review in `third_party/eio.*/`:
6868+- `lib_eio/mock/` - Mock implementations
6969+- `tests/` - Example test patterns
7070+- Look for `Eio.Mock.*` modules
7171+7272+Common mock modules:
7373+- `Eio_mock.Backend` - Mock backend for testing
7474+- `Eio_mock.Clock` - Deterministic clock
7575+- `Eio_mock.Flow` - Mock flows/streams
7676+- Mock filesystem, network, etc.
7777+7878+### Step 3: Write Tests Using Mocks
7979+8080+Example test structure for an Eio-based library:
8181+8282+```ocaml
8383+(* test/test_mylib.ml *)
8484+8585+let test_with_mock_fs () =
8686+ Eio_mock.Backend.run @@ fun () ->
8787+ let fs = Eio_mock.Flow.make "mock-fs" in
8888+ (* Your test using the mock filesystem *)
8989+ Alcotest.(check bool) "operation succeeded" true true
9090+9191+let test_with_mock_clock () =
9292+ Eio_mock.Backend.run @@ fun () ->
9393+ let clock = Eio_mock.Clock.make () in
9494+ (* Test time-dependent operations *)
9595+ Eio_mock.Clock.advance clock 1.0;
9696+ (* Check results after time advance *)
9797+ Alcotest.(check bool) "timed out correctly" true true
9898+9999+let suite = [
100100+ "mock filesystem", `Quick, test_with_mock_fs;
101101+ "mock clock", `Quick, test_with_mock_clock;
102102+]
103103+104104+let () = Alcotest.run "MyLibrary" [
105105+ "eio-mocks", suite;
106106+]
107107+```
108108+109109+### Step 4: Integration Tests with eio_main
110110+111111+For integration tests that need real I/O (fewer of these):
112112+113113+```ocaml
114114+let test_real_io () =
115115+ Eio_main.run @@ fun env ->
116116+ (* Use real env#fs, env#clock, etc. *)
117117+ (* Clean up any test files/state after *)
118118+ ()
119119+```
120120+121121+## Testing Strategies by Library Type
122122+123123+### Pure Libraries (No I/O)
124124+125125+- Use simple Alcotest cases
126126+- Focus on property-based testing if appropriate
127127+- No special infrastructure needed
128128+129129+### Libraries with Filesystem I/O
130130+131131+**If using Eio:**
132132+- Use `Eio_mock` filesystem
133133+- Study `third_party/eio.*/` for patterns
134134+135135+**If not using Eio:**
136136+- Create temporary directories in tests
137137+- Clean up in test teardown
138138+- Use `Filename.temp_file` and similar
139139+140140+### Libraries with Network I/O
141141+142142+**If using Eio:**
143143+- Use `Eio_mock` network mocks
144144+- Test connection failures, timeouts
145145+- No actual network calls in unit tests
146146+147147+**If not using Eio:**
148148+- Mock at the protocol level
149149+- Use loopback interfaces if needed
150150+- Prefer unit tests over integration tests
151151+152152+### Libraries with Time/Concurrency
153153+154154+**If using Eio:**
155155+- Use `Eio_mock.Clock` for deterministic time
156156+- Advance time explicitly in tests
157157+- Test races and timeouts reliably
158158+159159+**If using Lwt/Async:**
160160+- Use testing utilities from those libraries
161161+- Be careful with timing-dependent tests
162162+163163+## Test Organization
164164+165165+```
166166+project/
167167+├── lib/
168168+│ └── mylib.ml
169169+├── test/
170170+│ ├── dune # Test executable configuration
171171+│ ├── test_mylib.ml # Unit tests
172172+│ └── test_integration.ml # Integration tests (if needed)
173173+└── third_party/ # Fetched sources for reference
174174+ ├── eio.*/ # Eio source (if applicable)
175175+ └── llms.txt # Summary of available sources
176176+```
177177+178178+### Test dune file
179179+180180+```lisp
181181+(test
182182+ (name test_mylib)
183183+ (libraries mylib alcotest eio_main))
184184+```
185185+186186+## Best Practices
187187+188188+1. **Prefer mocks over real I/O** - Tests should be fast and deterministic
189189+2. **Fetch dependency sources** - Understand mock APIs by reading source
190190+3. **Study existing tests** - Look at `third_party/eio.*/tests/` for patterns
191191+4. **Keep integration tests minimal** - Most tests should use mocks
192192+5. **Clean up resources** - Even in tests, clean up temp files/state
193193+6. **Test edge cases** - Use mocks to inject errors and edge conditions
194194+195195+## Running Tests
196196+197197+```bash
198198+# Run all tests
199199+dune runtest
200200+201201+# Run tests verbosely
202202+dune runtest --verbose
203203+204204+# Run specific test
205205+dune exec -- test/test_mylib.exe
206206+207207+# Run with coverage (if configured)
208208+dune runtest --instrument-with bisect_ppx
209209+```
210210+211211+## Continuous Integration
212212+213213+The default `.tangled/workflows/build.yml` includes test steps:
214214+215215+```yaml
216216+- name: switch-test
217217+ command: |
218218+ opam install . --confirm-level=unsafe-yes --deps-only --with-test
219219+- name: test
220220+ command: |
221221+ opam exec -- dune runtest --verbose
222222+```
223223+224224+If you need additional test setup (e.g., fetching sources for test development), document it in the README but **do not** add it to CI (sources should not be required for running tests, only for understanding how to write them).
···11+(lang dune 3.20)
22+33+(name my-library) ; Update with your library name
44+55+(generate_opam_files true)
66+77+(license ISC)
88+(authors "Anil Madhavapeddy")
99+(homepage "https://tangled.org/@anil.recoil.org/my-library") ; Update with your project URL
1010+(maintainers "Anil Madhavapeddy <anil@recoil.org>")
1111+(bug_reports "https://tangled.org/@anil.recoil.org/my-library/issues") ; Update with your project URL
1212+(maintenance_intent "(latest)")
1313+1414+; NOTE: Do NOT add a (source ...) field for Tangled projects
1515+; Tangled uses the homepage/bug_reports URLs to determine the source repository
1616+1717+(package
1818+ (name my-library) ; Update with your library name
1919+ (synopsis "Brief one-line description of your library") ; Update with your synopsis
2020+ (description
2121+ "Longer description of your library. \
2222+ Explain what it does, its main features, \
2323+ and how it should be used.") ; Update with your description
2424+ (depends
2525+ (ocaml (>= 5.1.0))
2626+ ; Add your runtime dependencies here
2727+ ; Example: (lwt (>= 5.0))
2828+ ; Example: (cmdliner (>= 1.2.0))
2929+ (odoc :with-doc)
3030+ ; Add your test dependencies here
3131+ ; Example: (alcotest (and :with-test (>= 1.7.0)))
3232+ ))