commits
Sync opam package metadata including x-maintenance-intent
and external dependency specifications.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Git operations:
- Add retry logic with exponential backoff for HTTP 5xx errors
- Retry on RPC failures, curl errors, connection issues
- 3 retries with 2s/4s/8s delays before failing
- Apply to clone, fetch, pull, push, and subtree operations
Sources registry (sources.toml):
- New module for tracking package URL overrides
- default_url_base for deriving URLs from subtree names
- Per-package entries with url, upstream, branch, reason
Verse config:
- Add knot field for git push server (e.g., "git.recoil.org")
- Default to "git.recoil.org" if not present in config
- Auto-write knot to config file if missing
URL handling:
- Remove hardcoded anil.recoil.org references
- Derive git push server from handle or use configured knot
- Generic SSH URL normalization in forks.ml
Sync resilience:
- Skip failed clones in merge/subtree phases instead of crashing
- Track successfully fetched repos separately from failures
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use pattern match for gitdir parsing instead of String.sub
- Use List.filter_map instead of filter + map
- Simplify empty string check (s <> "" vs String.length)
# Conflicts:
# lib/client.ml
Client.run was using Seq.iter which waits for EOF, but the Claude CLI
only sends EOF when it exits, and it waits for stdin to close first.
This caused a deadlock where both sides waited for the other.
Now run explicitly stops after receiving Complete, matching the behavior
of receive_all.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update ocaml-claudeio bindings with new Opus model variants from the
Python SDK: Opus_4_5 (claude-opus-4-5) and Opus_4_1 (claude-opus-4-1).
Switch poe bot to use Opus 4.5 for both message handling and changelog
generation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Example and test executables should not be installed as public binaries.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduces in-process MCP servers for custom tool definitions, matching the
Python Claude Agent SDK's approach. Built-in tools (Read, Write, Bash, etc.)
are handled by Claude CLI, while custom tools are executed via MCP servers.
New modules:
- Tool: Custom tool definitions with schema helpers
- schema_string, schema_int, schema_object, schema_array, etc.
- text_result, error_result for formatting responses
- create for defining tools with typed handlers
- Mcp_server: In-process MCP server implementation
- JSONRPC protocol for initialize, tools/list, tools/call
- Automatic tool dispatch based on registered handlers
Integration:
- Options.with_mcp_server to register MCP servers
- Client routes Mcp_message control requests to registered servers
- Tools accessible as mcp__<server_name>__<tool_name>
Testing:
- Consolidated test suite with 30 alcotest cases
- Coverage for Protocol, Tool, Mcp_server, Tool_input, structured errors
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Git operations:
- Add retry logic with exponential backoff for HTTP 5xx errors
- Retry on RPC failures, curl errors, connection issues
- 3 retries with 2s/4s/8s delays before failing
- Apply to clone, fetch, pull, push, and subtree operations
Sources registry (sources.toml):
- New module for tracking package URL overrides
- default_url_base for deriving URLs from subtree names
- Per-package entries with url, upstream, branch, reason
Verse config:
- Add knot field for git push server (e.g., "git.recoil.org")
- Default to "git.recoil.org" if not present in config
- Auto-write knot to config file if missing
URL handling:
- Remove hardcoded anil.recoil.org references
- Derive git push server from handle or use configured knot
- Generic SSH URL normalization in forks.ml
Sync resilience:
- Skip failed clones in merge/subtree phases instead of crashing
- Track successfully fetched repos separately from failures
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Client.run was using Seq.iter which waits for EOF, but the Claude CLI
only sends EOF when it exits, and it waits for stdin to close first.
This caused a deadlock where both sides waited for the other.
Now run explicitly stops after receiving Complete, matching the behavior
of receive_all.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduces in-process MCP servers for custom tool definitions, matching the
Python Claude Agent SDK's approach. Built-in tools (Read, Write, Bash, etc.)
are handled by Claude CLI, while custom tools are executed via MCP servers.
New modules:
- Tool: Custom tool definitions with schema helpers
- schema_string, schema_int, schema_object, schema_array, etc.
- text_result, error_result for formatting responses
- create for defining tools with typed handlers
- Mcp_server: In-process MCP server implementation
- JSONRPC protocol for initialize, tools/list, tools/call
- Automatic tool dispatch based on registered handlers
Integration:
- Options.with_mcp_server to register MCP servers
- Client routes Mcp_message control requests to registered servers
- Tools accessible as mcp__<server_name>__<tool_name>
Testing:
- Consolidated test suite with 30 alcotest cases
- Coverage for Protocol, Tool, Mcp_server, Tool_input, structured errors
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>