Releases: 3leaps/ipcprims
v0.1.2
ipcprims v0.1.2
Release date: 2026-02-15
Lifecycle phase: alpha
License: MIT OR Apache-2.0
Summary
Release pipeline: multi-platform FFI build matrix, SBOM generation, and structured draft releases — matching the sysprims/docprims release pattern. Resolves the v0.1.1 known issue where release.yml was still the minimal v0.1.0 skeleton.
release.yml Rewrite
Complete rewrite from 4-job skeleton to 14 release-specific jobs (35 total including CI workflow_call).
Release Jobs
| Job | Runner | Purpose |
|---|---|---|
validate-version |
ubuntu-latest | Tag matches VERSION file, outputs version |
ci |
(workflow_call) | Full CI suite (21 jobs) |
verify-go-bindings-assets |
ubuntu-latest | Verify prebuilt libs for 7 platforms in Go module |
build-linux |
ubuntu-latest (container) | 4-target matrix (x64/arm64 x glibc/musl), CLI + FFI |
build-macos |
macos-latest | x64 + arm64, CLI + FFI, @rpath dylib fix |
build-windows |
windows-latest | MinGW/GNU x64, FFI only (CGo compat) |
build-windows-arm64 |
windows-latest-arm64-s | MSVC arm64, FFI only (self-hosted) |
build-windows-msvc |
windows-latest | MSVC x64 shared-only, FFI only |
cbindgen |
ubuntu-latest (container) | Generate ipcprims.h C header |
sbom |
ubuntu-latest (container) | CycloneDX SBOM via syft |
verify-ffi-shared-assets |
ubuntu-latest | Verify shared libs present, no musl shared |
package-ffi-bundle |
ubuntu-latest | Structured bundle with 8 platform dirs + MANIFEST.json |
publish-check |
ubuntu-latest | cargo package --workspace dry-run |
publish |
ubuntu-latest | Draft GitHub release with all artifacts + platform table |
CLI Artifacts (6 platforms)
| Platform | Archive |
|---|---|
| Linux x64 (glibc) | ipcprims-<version>-linux-amd64.tar.gz |
| Linux x64 (musl) | ipcprims-<version>-linux-amd64-musl.tar.gz |
| Linux arm64 (glibc) | ipcprims-<version>-linux-arm64.tar.gz |
| Linux arm64 (musl) | ipcprims-<version>-linux-arm64-musl.tar.gz |
| macOS x64 | ipcprims-<version>-darwin-amd64.tar.gz |
| macOS arm64 | ipcprims-<version>-darwin-arm64.tar.gz |
No Windows CLI — CLI requires Unix domain sockets (named pipe transport lands in v0.2.0).
FFI Bundle Structure
bundle/
lib/
linux-amd64/ static/ + shared/
linux-amd64-musl/ static/ only
linux-arm64/ static/ + shared/
linux-arm64-musl/ static/ only
darwin-amd64/ static/ + shared/
darwin-arm64/ static/ + shared/
windows-amd64/ static/ + shared/ (GNU + MSVC import libs)
windows-arm64/ static/ + shared/ (MSVC)
include/
ipcprims.h
MANIFEST.json
VERSION
LICENSE-MIT
LICENSE-APACHE
Build Patterns
- Linux:
cargo-zigbuildin goneat container, glibc 2.17 baseline for GNU targets, crt-static for musl - macOS: native cross-compile x64+arm64,
MACOSX_DEPLOYMENT_TARGET=11.0,install_name_tool -id @rpath/... - Windows: real Windows runners required (ring needs MSVC
lib.exe); MinGW/GNU for CGo compat, MSVC for arm64 and shared-only - SBOM: syft CycloneDX in sbom-tools container
Peer Crate Windows Compilation
cfg-gated ipcprims-peer Unix-specific imports behind #[cfg(unix)] so ipcprims-ffi compiles on all Windows targets:
connector.rs:UnixDomainSocketimport gated;#[cfg(not(unix))]returnsTransportError::ConnectwithUnsupportedlistener.rs:PeerListenerstruct uses#[cfg(unix)] socket/#[cfg(not(unix))] _unavailable: (); bind/accept returnUnsupported- Tests gated with
#[cfg(all(test, unix))] - No fake runtime support — non-Unix builds fail explicitly at the API boundary
This follows the IpcStreamInner::Unavailable placeholder pattern from ipcprims-transport. Full Windows implementation (named pipes) deferred to v0.2.0.
Adaptation from Brief
Windows x64 shared artifact names split into GNU and MSVC variants (ffi-shared-windows-amd64-gnu, ffi-shared-windows-amd64-msvc) to avoid upload-artifact name collision. Both are merged into bundle/lib/windows-amd64/shared/ in the final FFI bundle, preserving both import library variants for consumers.
Quality
- 122 tests passing (
cargo test --workspace --all-features) - Zero clippy warnings (
--all-features) make prepushgreen (fmt + clippy + goneat lint + test + cargo deny)- All dependencies permissively licensed
- actionlint passes on release.yml
Known Issues
- Go prebuilt libs: Not yet populated —
go-bindings.ymlmust run before tagging to create prebuilt libs PR (d4-02 pre-tag checklist). - Async API: Feature flags declared but no async code exists. Planned for v0.2.0.
- Transitive dep duplication:
getrandom(0.2 + 0.3) andwindows-sys(0.60 + 0.61) viajsonschemadep tree. No functional impact.
What's Next
- v0.1.2 pre-tag: Run
go-bindings.ymlvia workflow_dispatch, merge prebuilt libs PR, then tag - v0.2.0: Tokio-native async API, named pipe transport for Windows (full
IpcStreamInner::NamedPipevariant), TCP transport (per DDR-0001), CLI P2 commands
Release 0.1.1
ipcprims v0.1.1
Release date: 2026-02-15
Lifecycle phase: alpha
License: MIT OR Apache-2.0
Summary
Infrastructure release: cross-language binding scaffolds (FFI, Go, TypeScript) and CI/release pipeline maturation. No new Rust API surface — bindings wrap the existing v0.1.0 API.
New Crates
| Crate | Description |
|---|---|
ipcprims-ffi |
C-ABI exports (staticlib + cdylib) for listener, peer, frame, schema |
ipcprims-napi |
Node-API addon for @3leaps/ipcprims TypeScript package |
Bindings
FFI (C-ABI)
- Crate:
crates/ipcprims-ffi - Outputs: static library (
.a/.lib) and shared library (.so/.dylib/.dll) - C header generated by
cbindgen(ipcprims.h) - Smoke test:
tests/ffi/smoke.c - CI job: build + header generation + C compile on Linux and macOS
Go
- Module:
bindings/go/ipcprims(github.com/3leaps/ipcprims/bindings/go/ipcprims) - API:
Listener,Peer,SchemaRegistry, channel constants,Frametype - FFI bridge: CGo with platform-specific build tags
- Stub bridge: compiles on all platforms, returns
ErrFFIUnavailablewithout prebuilt libs - CI job:
go build,golangci-lint,go teston Linux and macOS - Prep workflow:
go-bindings.ymlbuilds FFI for all platforms and creates PR with prebuilt libs
TypeScript
- Package:
@3leaps/ipcprimsatbindings/typescript - API:
Listener,Peer,SchemaRegistry, channel constants - Runtime: NAPI-RS native addon with platform-specific optional dependencies
- Platforms: linux-x64-gnu, linux-x64-musl, linux-arm64-gnu, darwin-arm64, win32-x64-msvc
- CI job: build + test + typecheck on Linux and macOS
- Prebuild workflow:
typescript-napi-prebuilds.ymlbuilds.nodefiles for all 5 platforms - Publish workflow:
typescript-npm-publish.ymlwith OIDC trusted publishing
CI Changes
New Jobs in ci.yml
| Job | Runner | Description |
|---|---|---|
windows-cross-check |
ubuntu-latest | cargo check for 3 Windows targets (no SDK required) |
test-musl |
ubuntu-latest | Build + test on x86_64-unknown-linux-musl |
ffi |
ubuntu-latest, macos-latest | Build FFI crate, generate header, compile C smoke test |
go-bindings |
ubuntu-latest, macos-latest | Go build + lint + test |
typescript-bindings |
ubuntu-latest, macos-latest | NAPI build + test + typecheck |
New Workflows
| Workflow | Trigger | Purpose |
|---|---|---|
go-bindings.yml |
workflow_dispatch | Multi-platform FFI build + PR with prebuilt Go libs |
typescript-bindings.yml |
workflow_dispatch | Cross-platform TS test (4 OS + Alpine musl) |
typescript-napi-prebuilds.yml |
workflow_dispatch | Build .node prebuilds for 5 platforms |
typescript-npm-publish.yml |
workflow_dispatch | OIDC trusted npm publish |
Release Infrastructure
- Download script: now fetches FFI bundles (
ipcprims-ffi-*.tar.gz), C header (ipcprims.h), and SBOM (sbom-*.json) - Upload script: now uploads FFI bundles, standalone header, and SBOM
- Checksum script: patterns include standalone headers, libraries, and JSON metadata
- RELEASE_CHECKLIST.md: Go pre-tag workflow and TypeScript post-signing publish steps
- Makefile: binding workflow instructions replace placeholder stubs
Tooling
.github/actionlint.yaml: self-hosted runner label (ubuntu-latest-arm64-s)- Root
go.mod+go.work+internal/gowork/doc.go: repo-level Go workspace forgolangci-lintcompatibility .goneat/assess.yaml: Go linting note, shellcheck disabled (sysprims parity)
Fixes
- FFI
map_peer_error: wildcard catch-all for Cargo workspace feature unification (preventsE0004whenipcprims-napiactivatesPeerError::Schemaacross workspace) - FFI
ipc_schema_registry_free: suppressedneedless_returnlint on cfg-gated early return - TypeScript test: replaced
anytypes with typedNativePeer/NativeListenerinterfaces - TypeScript loader: replaced
&&chain with optional chaining
Quality
- 118 tests passing (
cargo test --workspace --all-features) - Zero clippy warnings (
--all-features) make prepushgreen (fmt + clippy + goneat lint + test + cargo deny)- All dependencies permissively licensed
Known Issues
- release.yml: Still uses minimal v0.1.0 skeleton (validate + create GitHub release). Multi-platform build matrix with FFI bundle packaging planned for v0.1.2.
- Go prebuilt libs: Not yet populated —
go-bindings.ymlcreates the PR. Stub bridge compiles but FFI calls returnErrFFIUnavailablewithout prebuilts. - Async API: Feature flags declared but no async code exists. Planned for v0.2.0.
- Transitive dep duplication:
getrandom(0.2 + 0.3) andwindows-sys(0.60 + 0.61) viajsonschemadep tree. No functional impact.
What's Next
- v0.1.2: Release pipeline rewrite — multi-platform FFI build matrix, SBOM generation, structured FFI bundle packaging, draft release with all artifacts
- v0.2.0: Tokio-native async API, TCP transport (per DDR-0001), CLI P2 commands
Release 0.1.0
ipcprims v0.1.0
Release date: 2026-02-13
Lifecycle phase: alpha
License: MIT OR Apache-2.0
Summary
First functional release of ipcprims — permissively licensed, cross-platform IPC primitives with framed messaging, channel multiplexing, schema validation, peer management, and a diagnostic CLI.
Highlights
- Transport layer: Unix domain socket transport with bind/accept/connect, hardened permissions (0o600), automatic socket cleanup on drop
- Frame codec: Length-prefixed wire format with 2-byte magic (
"IP"), 4-byte LE length, 2-byte LE channel ID; 8-byte header, 16 MiB default max payload - Channel system: Built-in channels (CONTROL=0, COMMAND=1, DATA=2, TELEMETRY=3, ERROR=4) with user-defined range 256-65535
- Framed reader/writer: Sync FrameReader/FrameWriter wrapping any
Read/Writestream; partial-read handling, WouldBlock propagation, configurable timeouts - Schema validation: JSON Schema 2020-12 validation at the transport boundary via SchemaRegistry; strict mode (
deny_unknown_fields), directory loading with symlink rejection and file-size limits - Peer management: Handshake protocol over CONTROL channel with version negotiation, channel intersection, and optional auth token; Peer API with send/recv/recv_on/request patterns, bounded per-channel buffering, control flood protection, graceful shutdown
- CLI: 8 commands —
listen,send,echo,info,doctor,envinfo,version(with--extended);--format json|table|pretty|raw, rsfulmen-aligned exit codes, tracing to stderr - Security review: 5 accepted SDRs (schema validation scope, peer/transport hardening, registry boundaries, auth token handling, ordering/replay boundary)
- Dogfooding: End-to-end CLI behavior matrix with P0-P3 findings all remediated
Crates
| Crate | Description |
|---|---|
ipcprims-transport |
Cross-platform IPC transport abstraction (UDS on Linux/macOS) |
ipcprims-frame |
Length-prefixed message framing with channel multiplexing |
ipcprims-schema |
Optional JSON Schema 2020-12 validation (behind schema feature) |
ipcprims-peer |
High-level peer connection management (behind peer feature) |
ipcprims |
Umbrella crate (re-exports) + CLI binary (behind cli feature) |
CLI Commands
| Command | Purpose |
|---|---|
listen |
Start a listener on a Unix domain socket |
send |
Connect and send a framed message (with --wait and --wait-timeout) |
echo |
Echo server for integration testing (with --validate for schema checks) |
info |
Connection diagnostics and peer status |
doctor |
Environment health check |
envinfo |
Build and platform metadata |
version |
Version with --extended provenance (git hash, target triple) |
Exit Codes
| Condition | Code |
|---|---|
| Success | 0 |
| Connection refused | 1 |
| Transport error | 3 |
| Health check failed | 30 |
| Permission denied | 50 |
| Schema validation / data invalid | 60 |
| Invalid arguments (usage) | 64 |
| Timeout | 124 |
| Internal error | 125 |
Wire Format
+----------+---------+---------+-----------------+
| Magic 2B | Len 4B | Chan 2B | Payload |
| "IP" | (LE) | (LE) | (Len bytes) |
+----------+---------+---------+-----------------+
Wire format is frozen for the 0.x series.
Platform Support
| Platform | Transport | Status |
|---|---|---|
| Linux x64/arm64 (glibc + musl) | UDS (abstract) | Primary |
| macOS arm64 | UDS (filesystem) | Supported |
| Windows x64 | Named pipes | Deferred to v0.2.0 |
Quality
- 118 tests passing (
cargo test --workspace --all-features) - Zero clippy warnings (
--all-features) - License-clean: all dependencies MIT/Apache-2.0/BSD/ISC (verified via
cargo deny) - Decision records: DDR-0001, DDR-0002, SDR-0001 through SDR-0005 (all Accepted)
Known Issues
- Async API: Feature flags (
async) are declared but no async code exists yet. Planned for v0.2.0. - Transitive dep duplication:
getrandom(0.2 + 0.3) andwindows-sys(0.60 + 0.61) appear as duplicates via thejsonschemadependency tree. No functional impact; tracked for supply chain awareness. - FFI:
cbindgen.tomlis present as a placeholder; theffi/crate does not exist yet. Planned for v0.2.0.
What's Next (v0.2.0)
- Tokio-native async API behind
asyncfeature flag - TCP transport behind feature flag (per DDR-0001)
- CLI P2 commands:
connect --interactive,monitor,bench - FFI crate + Go bindings
Decision Records
| ID | Title | Status |
|---|---|---|
| DDR-0001 | Transport Scope: IPC-First, Extensible | Accepted |
| DDR-0002 | CLI Design Precepts | Accepted |
| SDR-0001 | Schema Validation at IPC Boundary | Accepted |
| SDR-0002 | Peer and Transport Hardening Defaults | Accepted |
| SDR-0003 | Schema Registry Hardening Boundaries | Accepted |
| SDR-0004 | auth_token and Peer Credentials Boundary | Accepted |
| SDR-0005 | Ordering and Replay Boundary | Accepted |