commits
The READMEs all share the standard install/overlay snippet, but the
sh blocks lacked the "<!-- $MDX skip -->" directive. `dune test`
would shell out to `opam install` against the live switch, which
either prompts interactively or fails with a package conflict —
either way diffing as a test failure.
Bulk-add skip directives in front of every install/overlay block.
Also collapse the doubled "non-deterministic + skip" stack on three
READMEs (memtrace, ocaml-dpop, ocaml-pid1, ocaml-yaml, merlint) where
`skip` already implies the runtime is bypassed.
Renaming packages to nox-* pushed several (libraries ...) lines past
dune fmt's wrap threshold, so dune fmt now spreads them one-per-line.
No semantic changes.
Renames 35 packages to make blacksun forks distinguishable from their
opam-repository upstreams. Module names (Git.x, Tls.x, ...) stay bare;
opam package names and dune (public_name) findlib references move to
nox-X. After this commit, zero local package names overlap with
opam-repository.
Renamed:
- nox-git, nox-irmin
- nox-crypto, nox-crypto-pk, nox-crypto-rng, nox-crypto-ec
- nox-tls, nox-tls-eio, nox-tar, nox-tar-eio, nox-tty, nox-tty-eio
- nox-arp, nox-ca-certs, nox-cbor, nox-cookie, nox-crc, nox-csv
- nox-gpt, nox-hkdf, nox-http, nox-jwt, nox-kdf, nox-loc
- nox-memtrace, nox-pds, nox-sexp, nox-slack, nox-toml
- nox-websocket, nox-x509, nox-xdge, nox-yaml
Also drops orphan tar-mirage and tar-unix opam templates that had no
matching package stanza.
38 subtrees lacked a (source ...) stanza in their dune-project, so
their generated .opam files had no dev-repo: field. That broke
downstream tooling that uses dev-repo to identify the subtree
(notably the root.opam external-dep filter, which couldn't tell
internal packages from external ones).
Add (source (tangled gazagnaire.org/<subtree>)) to each, matching
the URL configured in sources.toml. dune regenerates dev-repo:,
homepage: and bug-reports: in every affected .opam.
bin/dune uses all five. Surfaced by `dune build -p precommit`.
Pure formatting changes from `dune fmt`: doc comment placement moves
from above the binding to below it for `type`s, multi-line `match`
expressions collapse onto one line where they fit, and infix operator
applications pick up spaces (`Soup.($?)` -> `Soup.( $? )`). No
semantic changes.
Warning 69 (unused-field, mutable-never-assigned). Four independent
record fields were flagged as mutable but the code only mutates their
referents in place, never rebinds the record slot itself:
- ocaml-wal/lib/wal.ml: [t.file] (the Eio file resource; methods call
Eio.File.pwrite_all etc., the slot is set once at open time).
- ocaml-block/lib/block.ml: [Memory.state.data] (the backing bytes,
written via Bytes.blit_string; [Bytes.t] is already mutable).
- ocaml-sse/lib/sse.ml: [Parser.t.data_buf] (a Buffer.t, written via
Buffer.add_*; the slot never changes).
- ocaml-zephyr/lib/zephyr.ml: drop [mode : Read | Write] entirely —
set at open-time, read nowhere. The open_read / open_write
constructors already distinguish the two call shapes, so mode
tracking was redundant.
Structural move per the new E521 rule and cram skill:
- Each package's cram tests now live under test/cram/, with shared
shell setup at test/cram/helpers.sh (auto-sourced by dune 3.21's
setup_scripts) and driver exes in test/cram/helpers/.
- Packages migrated: ocaml-git, ocaml-tty, ocaml-vlog, xdge,
ocaml-precommit, ocaml-publicsuffix, ocaml-requests, monopam, irmin.
- ocaml-tty's cram was actively broken; fixed and the driver rewritten
to use Tty.Progress.render.
- irmin: adds scrub_hash/scrub_time helper scripts for normalising
non-deterministic output (dune cram has no glob/regex matching).
Tests cover the pure surface: empty, add, remove (single + keeps
others), pp, and load on a missing file. The Skills.Config helpers had
no coverage at all before this.
Generate .opam.template files with x-quality-* fields based on
detected package features:
- x-quality-build: has lib/ with .ml files
- x-quality-test: has test/ with .ml files
- x-quality-fuzz: has fuzz/ with .ml files
- x-quality-interop: has test/interop/ directory
- x-quality-cram: has test/*.t/ directories
These fields are picked up by dune's opam generation and will be
checked by merlint E910 for consistency.
Also: add fmt dep to ocaml-sse/lib/dune (Fmt.pf used without dep).
monopam quality — scans packages for quality features, caches by
git commit hash. 166 packages: build=163, test=162, fuzz=94,
interop=39, doc=42.
Standard vocabulary based on crates.io categories, erratique/opam
conventions, and monorepo domain coverage:
Org: org:blacksun
Domain: aerospace, codec, crypto, network, storage, git, merkle
Purpose: cli, test, bench, format, log, system
Protocol: ccsds, uslp, cop1, sdls, sle, atproto, tls, http, json, binary
Cross-cutting: eio, simulation, math, compression
Tags placed in dune-project (package ...) stanzas via (tags ...).
Propagated to .opam files by dune's opam generation.
- Update .ocamlformat to 0.29.0 across all 591 files
- csvt: reuse single Buffer.t for field reads (no alloc per field)
- sexpt: Obj members decoded from stream into Dict, typed Variant GADT
- Reformat all source files for 0.29.0
Migrate all consumers to the new wire API:
- wire.c library → wire.3d (Wire_c → Wire_3d)
- Wire.struct_/module_ → Wire.Everparse.struct_/module_
- Wire.Codec: record/|+/seal → Codec.v with Field.v and $
- Wire.bf_uint* → Wire.U8/U16/U16be/U32/U32be
- Wire.UInt32 → Wire.Private.UInt32
- Wire.cases → Wire.lookup, Wire.map now uses labeled args
- Wire.Codec.decode now returns result
- Add wire pin to root.opam.template
Remove genuinely stale deps (merlin, duration, digestif, eio_main,
dune-configurator, printbox, printbox-text, tls-eio, ocamlformat,
bytesrw-eio) and add missing library declarations to dune files
(eio+logs in ocaml-oci/src, logs in ocaml-git/lib+bin).
Keep js_of_ocaml in space-ground (needed for modes js) and add it
to implicit_deps in lint since it's a compiler, not a library.
Adds 108 missing dependency declarations across 52 packages.
Most common missing dep was fmt (38 packages), followed by wire,
eio, and bytesrw. Also improves lint output with tty tables and
better subtree filtering display.
ocaml-tty (92→0):
- E205: Printf→Fmt in gen_corpus.ml, test_progress.ml, minimal_progress.ml
- E330: rename tree_view→view in tree.ml
- E400/E405/E410: add missing docs in color.mli, style.mli, border.mli,
table.mli, width.mli; fuzz_tty.mli module doc
- E600/E617: create 9 test_*.mli files; lowercase all suite names
- E618: add explicit modules list to test stanza in test/dune
- E718/E725: create fuzz/fuzz.ml runner; suite name "tty"
ocaml-wire (109→0):
- E005: extract parse_bf_field, check_all_zeros, encode_bf_accum helpers
- E010: extract emit_field_constraint helpers to reduce nesting in gen_c.ml
- E205: Format→Fmt in test_wire.ml (40 occurrences)
- E216: invalid_arg (Fmt.str) → Fmt.invalid_arg
- E330: rename wire_size_of_* → size_of_* in wire.ml/wire.mli
- E400/E405/E410: add docs in fuzz_wire.mli, diff_gen.mli, wire.mli, wire_c.mli
- E605/E600: create test/c, test/diff-gen, test/diff test files + mlis
Fix callers of renamed APIs across monorepo:
- Tty.Progress.create → Tty.Progress.v
- Tty.Panel.create_lines → Tty.Panel.lines
- Tty.Table.create → Tty.Table.v
- Xdge.create → Xdge.v
All test suite names now follow the convention: lowercase snake_case
matching the test filename. Changes:
- crowbar examples: 'crowbar' → filename (calendar/fpath/map/pprint/uunf)
- irmin: uppercase suites → lowercase
- memtrace: uppercase/mismatched → lowercase matching filename
- monopam/ocaml-agent/ocaml-aos/ocaml-conpool/ocaml-cookeio/ocaml-crow:
uppercase → lowercase
- ocaml-crypto: 'cipher' → 'crypto'
- ocaml-github-oauth: 'github-oauth' → 'github_oauth'
- ocaml-jsonwt/ocaml-linkedin/ocaml-merlin: mismatch fixed
- ocaml-oci: rename test_OS.ml/.mli → test_os.ml/.mli, suite 'OS' → 'os'
- ocaml-precommit: 'hooks' → 'precommit'
- ocaml-sexpt: 'dune_codec' → 'dune'
- ocaml-slack: 'md' → 'markdown'
- ocaml-sle: 'FCLTU' → 'fcltu'
- ocaml-space-packet: 'space-packet' → 'space_packet'
- ocaml-tls: 'tls-eio'/'tls-unix' → snake_case
- ocaml-tomlt: 'tomlt-*' → snake_case
Replace Alcotest.fail (Fmt.str ...) with Alcotest.failf in test_huri.
Apply dune fmt formatting across precommit, requests, qemu, and
publicsuffix packages.
Rename find_self -> self, make_connection_pools -> connection_pools.
Auto-formatting and structural improvements from dune fmt across
precommit, publicsuffix, punycode, and requests packages.
Rename make_commit_row -> commit_row, get_static_entry -> static_entry,
make_h2_direct_response -> h2_direct_response, make_h2_conn_response ->
h2_conn_response, make_h2_alpn_response -> h2_alpn_response.
Extract helpers to reduce deep nesting in 7 functions:
- display_ai_commits: extract make_commit_row helper
- write_query: extract write_values helper
- of_identifier: extract parse_params_loop, extract_query_name,
make_derived_component, resolve_ident_with_params
- verify: move check_not_future/check_max_age_helper to module level,
flatten nested match with Option.fold
- decode (h2_hpack): remove begin/end, compound saw_first_header guard
- request (one.ml): extract make_h2_direct_response helper
- request_internal: extract make_h2_conn_response/make_h2_alpn_response
Add labeled arguments to functions with multiple boolean parameters
in precommit and ocurl to prevent argument-order confusion. Inline
cmdliner wrappers to keep Term.$ positional application working.
Also rename h2 hpack/huffman internal accessors (encode_entry, get_static_entry).
Replace failwith (Fmt.str ...) with Fmt.failwith, and introduce err_*
helper functions for Error (Fmt.str ...) patterns across pid1, precommit,
qemu (qmp_protocol, vm), and requests (tls_config, websocket).
Rename create/make to v in rpmsg, error, proxy, auth, version, and
other modules. Fix doc style issues in error.mli, requests.mli, and
expect_continue.mli. Update all callers.
Strip get_/make_/find_/create_ from 138 function definitions and all
call sites across ocaml-pds, ocaml-pid1, ocaml-precommit,
ocaml-publicsuffix, ocaml-qemu, ocaml-requests, ocaml-retry, and
ocaml-rpmsg. Use Module.v for constructors per the E331 convention.
Add missing periods to doc comments, fix [name] format mismatches,
and add pp pretty-printer to Publicsuffix.t.
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
- E410: fix doc style for of_string_exn, v, inflate, bool_codec,
access_token_url and 5 repository.mli @param missing periods
- E415: add pp to Config, Index, Repository types
- E510: add Logs source to Subtree module
- E331 auto-fixes: Config rename get_all→all, get_bool→bool,
get_int→int, find_sections→sections, get_remotes→remotes,
get_remote→remote, get_branches→branches, get_user→user;
cascading updates in repository, tests, fuzz, monopam, precommit
- Auto-fixes in freebox, gpt, hap
Modernize the memtrace package for the monorepo: convert Printf to Fmt,
restructure tests into alcotest pattern with suite exports, add cmdliner
term (--memtrace, --memtrace-rate, --memtrace-context), and add
argv-peeking trace_if_requested. Integrate Memtrace.term into setup
terms across all binaries that previously called trace_if_requested().
Add memtrace instrumentation to merlint, prune, crow, bottler, agent,
precommit, and uniboot. Refactor merlint's Command module from
Unix.open_process_in to Eio.Process.spawn for proper fiber scheduling.
Log external commands at INFO level (-v) and command output at DEBUG
level (-vv). Show dune build stderr in -vv mode instead of suppressing
with 2>/dev/null.
Promote cram test output to match current precommit init behavior:
absolute paths in dry-run, proper error messages and exit codes for
missing git repos and OCaml projects.
- License -> Licence
- color -> colour (in prose, not API/code)
- behavior -> behaviour
- analyze -> analyse
- organized -> organised
- Remove marketing buzzwords (leveraging)
- Remove emojis from prose
Convert all packages from:
(source (uri https://tangled.org/handle/repo))
to:
(source (tangled handle/repo))
This uses dune 3.21's native tangled support for cleaner source
declarations. Also removes redundant homepage/bug_reports fields
that are auto-generated from tangled sources.
- Add ctx type bundling cwd and fs for consistent filesystem access
- find_git_projects now returns git root when running from subdirectory
- Consolidate is_inside_git_repo to use find_git_root (remove duplication)
- collect_dirs handles "no repos found" error centrally
- Better init messaging: distinguish between no repos, no OCaml projects,
and already configured
When running `precommit check` or `precommit fix` from a subdirectory
of a git repository (e.g., projects/fprime-ocaml when .git is at the
parent), the commands now correctly walk up the filesystem to find the
git root.
Changes:
- Add is_inside_git_repo to detect when cwd is inside a git repo
- Update find_git_projects to include directories inside git repos
- Update find_git_root to use absolute paths and full filesystem
- Update current_branch, backup_branch, rewrite_ai_attribution to
use find_git_root for locating the git repository
- Handle filesystem permission errors gracefully when walking up
When checking for AI attribution, precommit now reads ~/.gitconfig
as a fallback when the local repo doesn't have user.email configured.
This ensures only the current user's commits are flagged, not commits
from other verse members.
Renamed parameters for clarity: ~cwd for working directory, ~fs for
filesystem root (needed for absolute paths like ~/.gitconfig).
Add -C DIR option to all commands (init, status, check, fix) to change
to a directory before running, similar to git's -C option.
precommit:
- Use ocaml-git for check_ai_attribution, rewrite_ai_attribution
- Use ocaml-git for current_branch, backup_branch
- Remove unused ~process_mgr parameter from API
- Only check/rewrite commits from the current git user (by email)
forks:
- Use Git.Repository.get_remote_url for remote_exists
- Use Git.Repository.add_remote for add_remote
- Use Git.Repository.read_ref for get_ref_commit
- Use Git.Rev_list for is_ancestor, merge_base, count_commits_between
Network operations (git fetch) remain as CLI calls since ocaml-git
doesn't support network I/O.
- Add find_oldest_ai_commit to locate the first commit needing rewrite
- Use commit range (oldest^..HEAD) instead of rewriting entire history
- Process multiple repos in parallel with Eio.Fiber.all
This dramatically speeds up `precommit fix` for repos where AI
attribution is only in recent commits.
- Rename directory: ocaml-build-info -> monopam-info
- Rename module: Mono_info -> Monopam_info
- Rename package: ocaml-build-info -> monopam-info
- Update all consumers to use new module name
- Remove "Skipping pull" log noise from push output
Use double quotes instead of single quotes for author name comparisons
inside the single-quoted env-filter string. Single quotes cannot be
nested inside single-quoted strings.
Rename ocaml-version to ocaml-build-info with Mono_info module.
All homebrew binaries now use Mono_info.version for consistent
version reporting across the monorepo.
The library wraps dune-build-info and falls back to git hash
in dev mode. Can be extended with SBOM or other metadata later.
Fixes sed failing on patterns containing forward slashes like URLs.
- Fix sed quoting bug (use double quotes for msg-filter, single for sed pattern)
- Add detection and rewriting of commits authored by Claude/Claude Code
- Rewrite AI authors to current git user via --env-filter
Rewrites commit messages using git filter-branch to strip
backup/<branch>-before-fix-<timestamp> before rewriting and
requires interactive confirmation (skip with --yes).
Refactors check/fix to share the commit-finding and table display
logic via find_and_display_ai_commits.
- Add find_git_projects to recursively discover git repos from a root dir
- Update collect_dirs to use recursive scanning instead of one-level list_subdirs
- Replace per-project bullet+table check output with a single table indexed by project
Replace ⚠ with ● for cleaner visual appearance. Remove unused warning
function.
- Truncate long commit subjects to terminal width
- Use emoji indicators for init feedback
- precommit: Move directory column first as primary key
- ocurl: Add Tty.Table for HTTP headers display
- oci: Replace PrintBox with Tty.Table for image listing
- agent: Add Tty.Table for TODO list display with colored status
All CLI tools now use the tty library for tables, providing
consistent styled output across the monorepo.
- json-logs: Add ~app, ~auto, ~base parameters for base fields
- json-logs: Auto-include hostname and pid in JSON output
- vlog: Add --log-tag KEY=VALUE flag for custom base tags
- vlog: Use json-logs by default, allow disabling with ~json_reporter:None
- Update meross, matter, mdns, claude-skills, precommit to use vlog
JSON output now includes automatic fields (hostname, pid, app) plus
any custom tags from --log-tag flags, useful for log aggregation.
The previous logic skipped creating .ocamlformat when --force was used,
which was backwards. Now it always creates .ocamlformat if missing when
fmt hooks are requested.
The READMEs all share the standard install/overlay snippet, but the
sh blocks lacked the "<!-- $MDX skip -->" directive. `dune test`
would shell out to `opam install` against the live switch, which
either prompts interactively or fails with a package conflict —
either way diffing as a test failure.
Bulk-add skip directives in front of every install/overlay block.
Also collapse the doubled "non-deterministic + skip" stack on three
READMEs (memtrace, ocaml-dpop, ocaml-pid1, ocaml-yaml, merlint) where
`skip` already implies the runtime is bypassed.
Renames 35 packages to make blacksun forks distinguishable from their
opam-repository upstreams. Module names (Git.x, Tls.x, ...) stay bare;
opam package names and dune (public_name) findlib references move to
nox-X. After this commit, zero local package names overlap with
opam-repository.
Renamed:
- nox-git, nox-irmin
- nox-crypto, nox-crypto-pk, nox-crypto-rng, nox-crypto-ec
- nox-tls, nox-tls-eio, nox-tar, nox-tar-eio, nox-tty, nox-tty-eio
- nox-arp, nox-ca-certs, nox-cbor, nox-cookie, nox-crc, nox-csv
- nox-gpt, nox-hkdf, nox-http, nox-jwt, nox-kdf, nox-loc
- nox-memtrace, nox-pds, nox-sexp, nox-slack, nox-toml
- nox-websocket, nox-x509, nox-xdge, nox-yaml
Also drops orphan tar-mirage and tar-unix opam templates that had no
matching package stanza.
38 subtrees lacked a (source ...) stanza in their dune-project, so
their generated .opam files had no dev-repo: field. That broke
downstream tooling that uses dev-repo to identify the subtree
(notably the root.opam external-dep filter, which couldn't tell
internal packages from external ones).
Add (source (tangled gazagnaire.org/<subtree>)) to each, matching
the URL configured in sources.toml. dune regenerates dev-repo:,
homepage: and bug-reports: in every affected .opam.
Warning 69 (unused-field, mutable-never-assigned). Four independent
record fields were flagged as mutable but the code only mutates their
referents in place, never rebinds the record slot itself:
- ocaml-wal/lib/wal.ml: [t.file] (the Eio file resource; methods call
Eio.File.pwrite_all etc., the slot is set once at open time).
- ocaml-block/lib/block.ml: [Memory.state.data] (the backing bytes,
written via Bytes.blit_string; [Bytes.t] is already mutable).
- ocaml-sse/lib/sse.ml: [Parser.t.data_buf] (a Buffer.t, written via
Buffer.add_*; the slot never changes).
- ocaml-zephyr/lib/zephyr.ml: drop [mode : Read | Write] entirely —
set at open-time, read nowhere. The open_read / open_write
constructors already distinguish the two call shapes, so mode
tracking was redundant.
Structural move per the new E521 rule and cram skill:
- Each package's cram tests now live under test/cram/, with shared
shell setup at test/cram/helpers.sh (auto-sourced by dune 3.21's
setup_scripts) and driver exes in test/cram/helpers/.
- Packages migrated: ocaml-git, ocaml-tty, ocaml-vlog, xdge,
ocaml-precommit, ocaml-publicsuffix, ocaml-requests, monopam, irmin.
- ocaml-tty's cram was actively broken; fixed and the driver rewritten
to use Tty.Progress.render.
- irmin: adds scrub_hash/scrub_time helper scripts for normalising
non-deterministic output (dune cram has no glob/regex matching).
Generate .opam.template files with x-quality-* fields based on
detected package features:
- x-quality-build: has lib/ with .ml files
- x-quality-test: has test/ with .ml files
- x-quality-fuzz: has fuzz/ with .ml files
- x-quality-interop: has test/interop/ directory
- x-quality-cram: has test/*.t/ directories
These fields are picked up by dune's opam generation and will be
checked by merlint E910 for consistency.
Also: add fmt dep to ocaml-sse/lib/dune (Fmt.pf used without dep).
Standard vocabulary based on crates.io categories, erratique/opam
conventions, and monorepo domain coverage:
Org: org:blacksun
Domain: aerospace, codec, crypto, network, storage, git, merkle
Purpose: cli, test, bench, format, log, system
Protocol: ccsds, uslp, cop1, sdls, sle, atproto, tls, http, json, binary
Cross-cutting: eio, simulation, math, compression
Tags placed in dune-project (package ...) stanzas via (tags ...).
Propagated to .opam files by dune's opam generation.
Migrate all consumers to the new wire API:
- wire.c library → wire.3d (Wire_c → Wire_3d)
- Wire.struct_/module_ → Wire.Everparse.struct_/module_
- Wire.Codec: record/|+/seal → Codec.v with Field.v and $
- Wire.bf_uint* → Wire.U8/U16/U16be/U32/U32be
- Wire.UInt32 → Wire.Private.UInt32
- Wire.cases → Wire.lookup, Wire.map now uses labeled args
- Wire.Codec.decode now returns result
- Add wire pin to root.opam.template
Remove genuinely stale deps (merlin, duration, digestif, eio_main,
dune-configurator, printbox, printbox-text, tls-eio, ocamlformat,
bytesrw-eio) and add missing library declarations to dune files
(eio+logs in ocaml-oci/src, logs in ocaml-git/lib+bin).
Keep js_of_ocaml in space-ground (needed for modes js) and add it
to implicit_deps in lint since it's a compiler, not a library.
ocaml-tty (92→0):
- E205: Printf→Fmt in gen_corpus.ml, test_progress.ml, minimal_progress.ml
- E330: rename tree_view→view in tree.ml
- E400/E405/E410: add missing docs in color.mli, style.mli, border.mli,
table.mli, width.mli; fuzz_tty.mli module doc
- E600/E617: create 9 test_*.mli files; lowercase all suite names
- E618: add explicit modules list to test stanza in test/dune
- E718/E725: create fuzz/fuzz.ml runner; suite name "tty"
ocaml-wire (109→0):
- E005: extract parse_bf_field, check_all_zeros, encode_bf_accum helpers
- E010: extract emit_field_constraint helpers to reduce nesting in gen_c.ml
- E205: Format→Fmt in test_wire.ml (40 occurrences)
- E216: invalid_arg (Fmt.str) → Fmt.invalid_arg
- E330: rename wire_size_of_* → size_of_* in wire.ml/wire.mli
- E400/E405/E410: add docs in fuzz_wire.mli, diff_gen.mli, wire.mli, wire_c.mli
- E605/E600: create test/c, test/diff-gen, test/diff test files + mlis
Fix callers of renamed APIs across monorepo:
- Tty.Progress.create → Tty.Progress.v
- Tty.Panel.create_lines → Tty.Panel.lines
- Tty.Table.create → Tty.Table.v
- Xdge.create → Xdge.v
All test suite names now follow the convention: lowercase snake_case
matching the test filename. Changes:
- crowbar examples: 'crowbar' → filename (calendar/fpath/map/pprint/uunf)
- irmin: uppercase suites → lowercase
- memtrace: uppercase/mismatched → lowercase matching filename
- monopam/ocaml-agent/ocaml-aos/ocaml-conpool/ocaml-cookeio/ocaml-crow:
uppercase → lowercase
- ocaml-crypto: 'cipher' → 'crypto'
- ocaml-github-oauth: 'github-oauth' → 'github_oauth'
- ocaml-jsonwt/ocaml-linkedin/ocaml-merlin: mismatch fixed
- ocaml-oci: rename test_OS.ml/.mli → test_os.ml/.mli, suite 'OS' → 'os'
- ocaml-precommit: 'hooks' → 'precommit'
- ocaml-sexpt: 'dune_codec' → 'dune'
- ocaml-slack: 'md' → 'markdown'
- ocaml-sle: 'FCLTU' → 'fcltu'
- ocaml-space-packet: 'space-packet' → 'space_packet'
- ocaml-tls: 'tls-eio'/'tls-unix' → snake_case
- ocaml-tomlt: 'tomlt-*' → snake_case
Extract helpers to reduce deep nesting in 7 functions:
- display_ai_commits: extract make_commit_row helper
- write_query: extract write_values helper
- of_identifier: extract parse_params_loop, extract_query_name,
make_derived_component, resolve_ident_with_params
- verify: move check_not_future/check_max_age_helper to module level,
flatten nested match with Option.fold
- decode (h2_hpack): remove begin/end, compound saw_first_header guard
- request (one.ml): extract make_h2_direct_response helper
- request_internal: extract make_h2_conn_response/make_h2_alpn_response
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
- E410: fix doc style for of_string_exn, v, inflate, bool_codec,
access_token_url and 5 repository.mli @param missing periods
- E415: add pp to Config, Index, Repository types
- E510: add Logs source to Subtree module
- E331 auto-fixes: Config rename get_all→all, get_bool→bool,
get_int→int, find_sections→sections, get_remotes→remotes,
get_remote→remote, get_branches→branches, get_user→user;
cascading updates in repository, tests, fuzz, monopam, precommit
- Auto-fixes in freebox, gpt, hap
Modernize the memtrace package for the monorepo: convert Printf to Fmt,
restructure tests into alcotest pattern with suite exports, add cmdliner
term (--memtrace, --memtrace-rate, --memtrace-context), and add
argv-peeking trace_if_requested. Integrate Memtrace.term into setup
terms across all binaries that previously called trace_if_requested().
Add memtrace instrumentation to merlint, prune, crow, bottler, agent,
precommit, and uniboot. Refactor merlint's Command module from
Unix.open_process_in to Eio.Process.spawn for proper fiber scheduling.
Log external commands at INFO level (-v) and command output at DEBUG
level (-vv). Show dune build stderr in -vv mode instead of suppressing
with 2>/dev/null.
- Add ctx type bundling cwd and fs for consistent filesystem access
- find_git_projects now returns git root when running from subdirectory
- Consolidate is_inside_git_repo to use find_git_root (remove duplication)
- collect_dirs handles "no repos found" error centrally
- Better init messaging: distinguish between no repos, no OCaml projects,
and already configured
When running `precommit check` or `precommit fix` from a subdirectory
of a git repository (e.g., projects/fprime-ocaml when .git is at the
parent), the commands now correctly walk up the filesystem to find the
git root.
Changes:
- Add is_inside_git_repo to detect when cwd is inside a git repo
- Update find_git_projects to include directories inside git repos
- Update find_git_root to use absolute paths and full filesystem
- Update current_branch, backup_branch, rewrite_ai_attribution to
use find_git_root for locating the git repository
- Handle filesystem permission errors gracefully when walking up
When checking for AI attribution, precommit now reads ~/.gitconfig
as a fallback when the local repo doesn't have user.email configured.
This ensures only the current user's commits are flagged, not commits
from other verse members.
Renamed parameters for clarity: ~cwd for working directory, ~fs for
filesystem root (needed for absolute paths like ~/.gitconfig).
precommit:
- Use ocaml-git for check_ai_attribution, rewrite_ai_attribution
- Use ocaml-git for current_branch, backup_branch
- Remove unused ~process_mgr parameter from API
- Only check/rewrite commits from the current git user (by email)
forks:
- Use Git.Repository.get_remote_url for remote_exists
- Use Git.Repository.add_remote for add_remote
- Use Git.Repository.read_ref for get_ref_commit
- Use Git.Rev_list for is_ancestor, merge_base, count_commits_between
Network operations (git fetch) remain as CLI calls since ocaml-git
doesn't support network I/O.
- precommit: Move directory column first as primary key
- ocurl: Add Tty.Table for HTTP headers display
- oci: Replace PrintBox with Tty.Table for image listing
- agent: Add Tty.Table for TODO list display with colored status
All CLI tools now use the tty library for tables, providing
consistent styled output across the monorepo.
- json-logs: Add ~app, ~auto, ~base parameters for base fields
- json-logs: Auto-include hostname and pid in JSON output
- vlog: Add --log-tag KEY=VALUE flag for custom base tags
- vlog: Use json-logs by default, allow disabling with ~json_reporter:None
- Update meross, matter, mdns, claude-skills, precommit to use vlog
JSON output now includes automatic fields (hostname, pid, app) plus
any custom tags from --log-tag flags, useful for log aggregation.