From 9f77a6d544e652778daf7e8ce4d3c6bb06e9c705 Mon Sep 17 00:00:00 2001 From: Dave Thompson Date: Mon, 31 Aug 2026 20:58:19 -0400 Subject: [PATCH] release: prepare v0.2.3 Generated by OpenAI Codex via Codex under supervision of @3leapsdave Co-Authored-By: OpenAI Codex Role: devlead Committer-of-Record: @3leapsdave --- .github/workflows/ci.yml | 6 +- .github/workflows/typescript-bindings.yml | 12 +- CHANGELOG.md | 27 +++- Cargo.lock | 16 +- Cargo.toml | 12 +- README.md | 33 ++-- RELEASE_CHECKLIST.md | 76 +++++++--- RELEASE_NOTES.md | 96 ++++++------ VERSION | 2 +- bindings/typescript/sysprims/README.md | 10 +- .../sysprims/npm/darwin-arm64/package.json | 2 +- .../sysprims/npm/linux-arm64-gnu/package.json | 2 +- .../npm/linux-arm64-musl/package.json | 2 +- .../sysprims/npm/linux-x64-gnu/package.json | 2 +- .../sysprims/npm/linux-x64-musl/package.json | 2 +- .../npm/win32-arm64-msvc/package.json | 2 +- .../sysprims/npm/win32-x64-msvc/package.json | 2 +- .../typescript/sysprims/package-lock.json | 142 ++---------------- bindings/typescript/sysprims/package.json | 16 +- docs/releases/v0.2.3.md | 66 ++++++++ 20 files changed, 267 insertions(+), 261 deletions(-) create mode 100644 docs/releases/v0.2.3.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 976228e..610d087 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,11 @@ jobs: run: cargo install cbindgen --version ${{ env.CBINDGEN_VERSION }} --locked - name: Install TypeScript tooling working-directory: bindings/typescript/sysprims - run: npm ci + run: | + # Use npm install instead of npm ci because release-prep branches + # point optionalDependencies at same-version platform packages before + # those packages exist in the npm registry. + npm install --omit=optional - name: Generate current C header run: cbindgen --config cbindgen.toml --crate sysprims-ffi --output "${RUNNER_TEMP}/sysprims.h" - name: Check capability, export, and documentation drift diff --git a/.github/workflows/typescript-bindings.yml b/.github/workflows/typescript-bindings.yml index 10445e6..704d8c4 100644 --- a/.github/workflows/typescript-bindings.yml +++ b/.github/workflows/typescript-bindings.yml @@ -76,7 +76,11 @@ jobs: bun-version: 1.3.3 - name: Install Node dependencies working-directory: bindings/typescript/sysprims - run: npm ci + run: | + # Use npm install instead of npm ci because release-prep branches + # point optionalDependencies at same-version platform packages before + # those packages exist in the npm registry. + npm install --omit=optional - name: Build package, native addon, and behavior tests working-directory: bindings/typescript/sysprims run: npm run clean && npm run build && npm run build:native && npm run build:test @@ -130,7 +134,11 @@ jobs: cache-dependency-path: bindings/typescript/sysprims/package-lock.json - name: Install Node dependencies working-directory: bindings/typescript/sysprims - run: npm ci + run: | + # Use npm install instead of npm ci because release-prep branches + # point optionalDependencies at same-version platform packages before + # those packages exist in the npm registry. + npm install --omit=optional - name: Install musl toolchain if: endsWith(matrix.target, '-musl') run: sudo apt-get update && sudo apt-get install --yes musl-tools diff --git a/CHANGELOG.md b/CHANGELOG.md index 722cd8d..d68fe61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.3] - 2026-09-01 + +### Added + +- Cargo publication metadata for the five Rust library crates: + `sysprims-core`, `sysprims-signal`, `sysprims-session`, `sysprims-proc`, + and `sysprims-timeout`. +- Crate-local README files for the Rust library crates so crates.io package + pages have standalone summaries. +- `make release-check`, which validates version coherence and constructs the + workspace Cargo packages without publishing. +- Release checklist steps for crates.io publication order and negative + controls that keep the CLI, C FFI crate, and TypeScript N-API crate + unpublished as Rust crates. + +### Changed + +- Workspace-internal Cargo dependency pins now carry the release version + alongside their local paths, so published library crates resolve correctly. +- Pull-request TypeScript validation installs dev tooling with + `npm install --omit=optional`, allowing release-prep branches to reference + same-version platform packages before those packages exist in the npm + registry. + ## [0.2.2] - 2026-08-30 ### Added @@ -740,7 +764,8 @@ TypeScript bindings parity release for proc/ports/signals. Node.js developers no - Signal tests now use deterministic patterns: reject pid=0, spawn-and-kill for terminate/forceKill - Eliminates flakiness from arbitrary PIDs that may exist on CI runners -[Unreleased]: https://github.com/3leaps/sysprims/compare/v0.2.2...HEAD +[Unreleased]: https://github.com/3leaps/sysprims/compare/v0.2.3...HEAD +[0.2.3]: https://github.com/3leaps/sysprims/compare/v0.2.2...v0.2.3 [0.2.2]: https://github.com/3leaps/sysprims/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/3leaps/sysprims/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/3leaps/sysprims/compare/v0.1.20...v0.2.0 diff --git a/Cargo.lock b/Cargo.lock index c2422e8..8e0f7bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -684,7 +684,7 @@ dependencies = [ [[package]] name = "sysprims-cli" -version = "0.2.2" +version = "0.2.3" dependencies = [ "assert_cmd", "clap", @@ -702,7 +702,7 @@ dependencies = [ [[package]] name = "sysprims-core" -version = "0.2.2" +version = "0.2.3" dependencies = [ "rsfulmen", "thiserror", @@ -711,7 +711,7 @@ dependencies = [ [[package]] name = "sysprims-ffi" -version = "0.2.2" +version = "0.2.3" dependencies = [ "serde", "serde_json", @@ -724,7 +724,7 @@ dependencies = [ [[package]] name = "sysprims-proc" -version = "0.2.2" +version = "0.2.3" dependencies = [ "libc", "serde", @@ -736,7 +736,7 @@ dependencies = [ [[package]] name = "sysprims-session" -version = "0.2.2" +version = "0.2.3" dependencies = [ "libc", "sysprims-core", @@ -744,7 +744,7 @@ dependencies = [ [[package]] name = "sysprims-signal" -version = "0.2.2" +version = "0.2.3" dependencies = [ "libc", "rsfulmen", @@ -754,7 +754,7 @@ dependencies = [ [[package]] name = "sysprims-timeout" -version = "0.2.2" +version = "0.2.3" dependencies = [ "libc", "rsfulmen", @@ -769,7 +769,7 @@ dependencies = [ [[package]] name = "sysprims-ts-napi" -version = "0.2.2" +version = "0.2.3" dependencies = [ "napi", "napi-build", diff --git a/Cargo.toml b/Cargo.toml index 9f25179..4a02632 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ ] [workspace.package] -version = "0.2.2" +version = "0.2.3" edition = "2021" rust-version = "1.88.0" license = "MIT OR Apache-2.0" @@ -22,11 +22,11 @@ authors = ["3leaps Architecture Council"] publish = false [workspace.dependencies] -sysprims-core = { version = "0.2.2", path = "crates/sysprims-core" } -sysprims-timeout = { version = "0.2.2", path = "crates/sysprims-timeout" } -sysprims-signal = { version = "0.2.2", path = "crates/sysprims-signal" } -sysprims-proc = { version = "0.2.2", path = "crates/sysprims-proc" } -sysprims-session = { version = "0.2.2", path = "crates/sysprims-session" } +sysprims-core = { version = "0.2.3", path = "crates/sysprims-core" } +sysprims-timeout = { version = "0.2.3", path = "crates/sysprims-timeout" } +sysprims-signal = { version = "0.2.3", path = "crates/sysprims-signal" } +sysprims-proc = { version = "0.2.3", path = "crates/sysprims-proc" } +sysprims-session = { version = "0.2.3", path = "crates/sysprims-session" } # Fulmen Ecosystem # NOTE: Pinned to ensure stable semantics across bindings and avoid accidental diff --git a/README.md b/README.md index b7b5bc0..cc94e95 100644 --- a/README.md +++ b/README.md @@ -75,31 +75,34 @@ degradation is exposed in structured output so automation can detect it. ## Quick Start -### v0.2.2 Release Coordinates +### v0.2.3 Release Coordinates -The core release and its language packages share version `0.2.2`, but each +The core release and its language packages share version `0.2.3`, but each ecosystem resolves that version through its own coordinate. Publication workflows run from the verified core tag. | Surface | Pin | | --- | --- | -| Rust workspace | Repository tag `v0.2.2` | -| Go module | `github.com/3leaps/sysprims/bindings/go/sysprims@v0.2.2` | -| TypeScript | `npm install @3leaps/sysprims@0.2.2` | -| PTY adapter | A separate [`sysprims-pty`](https://github.com/3leaps/sysprims-pty) release tag that pins core v0.2.2 | - -The canonical `v0.2.2` and path-prefixed -`bindings/go/sysprims/v0.2.2` tags identify the same core commit. +| Rust crates | `sysprims-core`, `sysprims-signal`, `sysprims-session`, `sysprims-proc`, and `sysprims-timeout` at `0.2.3` | +| Rust workspace | Repository tag `v0.2.3` | +| Go module | `github.com/3leaps/sysprims/bindings/go/sysprims@v0.2.3` | +| TypeScript | `npm install @3leaps/sysprims@0.2.3` | +| PTY adapter | A separate [`sysprims-pty`](https://github.com/3leaps/sysprims-pty) release tag that pins core v0.2.3 | + +The canonical `v0.2.3` and path-prefixed +`bindings/go/sysprims/v0.2.3` tags identify the same core commit. `sysprims-pty` has an independent version and tag lifecycle; it is not included -in the core tag. +in the core tag. Only the five Rust library crates are published to crates.io; +the CLI, C FFI crate, and TypeScript N-API crate are release-built but not +published as Rust crates. ### As a Rust Library ```toml [dependencies] -sysprims-timeout = { git = "https://github.com/3leaps/sysprims", tag = "v0.2.2" } -sysprims-signal = { git = "https://github.com/3leaps/sysprims", tag = "v0.2.2" } -sysprims-proc = { git = "https://github.com/3leaps/sysprims", tag = "v0.2.2" } +sysprims-timeout = "0.2.3" +sysprims-signal = "0.2.3" +sysprims-proc = "0.2.3" ``` ```rust @@ -410,8 +413,8 @@ if (err == SYSPRIMS_OK) { | Language | Status | Package | | ---------- | ---------------- | --------------------------------------------------------- | -| Go | Available | `github.com/3leaps/sysprims/bindings/go/sysprims@v0.2.2` | -| TypeScript | Available | `npm install @3leaps/sysprims@0.2.2` | +| Go | Available | `github.com/3leaps/sysprims/bindings/go/sysprims@v0.2.3` | +| TypeScript | Available | `npm install @3leaps/sysprims@0.2.3` | | Python | Planned (v0.2.x) | `pip install sysprims` | ### As a Go Library diff --git a/RELEASE_CHECKLIST.md b/RELEASE_CHECKLIST.md index 55937c7..e36da00 100644 --- a/RELEASE_CHECKLIST.md +++ b/RELEASE_CHECKLIST.md @@ -111,6 +111,11 @@ This document walks maintainers through the build/sign/upload flow for each sysp ```bash gh workflow run "TypeScript Bindings" --ref main ``` + - Pull-request TypeScript validation uses `npm install --omit=optional` rather than + `npm ci` because release-prep branches reference same-version platform packages + before the npm publication workflow has created them. Do not switch these PR + validation jobs back to `npm ci` unless the release process also changes how + platform optional dependencies are staged. - [ ] Create and push tags (must point to the SAME commit): @@ -136,6 +141,18 @@ Notes: - Python (PyPI) and TypeScript (npm) do not use git tags for version resolution in the same way. - See `docs/decisions/ADR-0012-language-bindings-distribution.md` and `docs/guides/language-bindings.md` for details. +### Required Post-Tag Execution Order + +After both tags are pushed, keep release execution in this order: + +1. Verify the tag-triggered release workflow and optional validation workflow. +2. Publish the five crates.io library crates in dependency order. +3. Download, checksum, sign, verify, upload, and publish the GitHub release assets. +4. Run TypeScript N-API prebuilds and npm publication from the verified tag. + +If any step fails or produces unexpected artifacts, pause before moving to the +next step. + ### CI Verification - [ ] Wait for GitHub Actions release workflow to complete @@ -169,31 +186,8 @@ Notes: - windows-amd64 → `x86_64-pc-windows-gnu` (msys2/MinGW-w64) - windows-arm64 → `aarch64-pc-windows-gnullvm` (llvm-mingw), since v0.1.16 - TypeScript bindings (run AFTER signing, from the tag ref): - 1. Run prebuilds workflow on the tag (builds N-API binaries for all platforms): - - ```bash - VERSION=$(cat VERSION) - gh workflow run "TypeScript N-API Prebuilds" --ref "v${VERSION}" - ``` - - Wait for completion. This builds `.node` binaries and stages npm package directories. - - 2. Run npm publish workflow on the tag (requires OIDC trusted publishing): - ```bash - VERSION=$(cat VERSION) - gh workflow run "TypeScript npm Publish" --ref "v${VERSION}" - ``` - The workflow validates: - - Running from a `v*` tag ref (required for OIDC and environment protection) - - Node.js >= 22.14.0 and npm >= 11.5.1 for npm trusted publishing - - VERSION file and package.json match the tag - - Prebuilds were built from the same commit as the tag - - Note: npm publish uses OIDC trusted publishing (no NPM_TOKEN). The workflow must run - from a tag ref to satisfy the `publish-npm` environment protection rules, and the - publish job intentionally uses Node.js 24 even though validation/prebuild jobs remain - on Node.js 20. + Do not run TypeScript prebuild or npm publication workflows yet; they run + after crates.io publication and signed GitHub release upload. Integrity rule: anything we intentionally publish as a release asset must be covered by the signed checksum manifests. @@ -357,6 +351,38 @@ export SYSPRIMS_GPG_HOMEDIR=/path/to/gpg/homedir # optional gh release edit v$(cat VERSION) --draft=false ``` +### TypeScript bindings publication (after signing/upload) + +Run these only after crates.io publication is complete and the signed GitHub +release assets have been uploaded and published. + +1. Run prebuilds workflow on the tag (builds N-API binaries for all platforms): + + ```bash + VERSION=$(cat VERSION) + gh workflow run "TypeScript N-API Prebuilds" --ref "v${VERSION}" + ``` + + Wait for completion. This builds `.node` binaries and stages npm package directories. + +2. Run npm publish workflow on the tag (requires OIDC trusted publishing): + + ```bash + VERSION=$(cat VERSION) + gh workflow run "TypeScript npm Publish" --ref "v${VERSION}" + ``` + + The workflow validates: + - Running from a `v*` tag ref (required for OIDC and environment protection) + - Node.js >= 22.14.0 and npm >= 11.5.1 for npm trusted publishing + - VERSION file and package.json match the tag + - Prebuilds were built from the same commit as the tag + +Note: npm publish uses OIDC trusted publishing (no NPM_TOKEN). The workflow must +run from a tag ref to satisfy the `publish-npm` environment protection rules, +and the publish job intentionally uses Node.js 24 even though +validation/prebuild jobs remain on Node.js 20. + ## 3. Post-Release Verification - [ ] Verify release is public: `gh release view v$(cat VERSION)` diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index b1bc021..b1b65f9 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -6,6 +6,52 @@ --- +## v0.2.3 - 2026-09-01 + +**Status:** Cargo Publication Enablement + +v0.2.3 enables crates.io publication for the Rust library surface while keeping +the command-line, C FFI, and TypeScript native implementation crates private to +the repository release workflow. + +### Highlights + +- **Rust library publication**: `sysprims-core`, `sysprims-signal`, + `sysprims-session`, `sysprims-proc`, and `sysprims-timeout` opt in to Cargo + publication with standalone crate README files and repository metadata. +- **Private implementation crates**: `sysprims-cli`, `sysprims-ffi`, and + `sysprims-ts-napi` remain unpublished as Rust crates. +- **Versioned workspace dependencies**: internal Cargo path dependencies carry + the same release version so published crates resolve through crates.io. +- **Release dry-run target**: `make release-check` validates the version pack + and constructs Cargo package tarballs without publishing. +- **Release checklist update**: crates.io publication order and negative + controls are documented for the first upload. +- **TypeScript CI install mode**: pull-request validation omits optional + same-version platform packages until the npm release workflow publishes them. + +### Release Coordinates + +- Rust crates: `sysprims-core`, `sysprims-signal`, `sysprims-session`, + `sysprims-proc`, and `sysprims-timeout` at `0.2.3`. +- Rust workspace: repository tag `v0.2.3`. +- Go module: path-prefixed tag `bindings/go/sysprims/v0.2.3` on the same + commit. +- TypeScript: `@3leaps/sysprims@0.2.3`, published from the verified core tag. + +### Upgrade Notes + +- Rust consumers can switch the five public library crates from git-tag + dependencies to crates.io versions after publication. +- The first crates.io upload must publish in dependency order: + `sysprims-core`, then `sysprims-signal` and `sysprims-session`, then + `sysprims-proc`, then `sysprims-timeout`. +- TypeScript platform packages are still produced by the tag-based npm + workflows; they are not installed during pull-request validation before + publication. + +--- + ## v0.2.2 - 2026-08-30 **Status:** Prepared PTY Containment @@ -105,54 +151,4 @@ non-escape. - No portable-PTY companion crate or downstream consumer integration ships in this release. ---- - -## v0.2.0 - Pending - -**Status:** Process Containment Release - -v0.2.0 adds an owned process-containment lifecycle for Rust PTY and supervisor -integrations, structured point-in-time cleanup evidence, and additive -TypeScript parity and numeric-safety enforcement. It also removes PID-only -Windows Job ownership. - -### Highlights - -- **Owned containment**: retain the child and process-group or Job capability - through normal completion, forced termination, and active-guard cleanup. -- **Reliability reporting**: distinguish `guaranteed`, `unproven`, and - `best_effort` tree cleanup. -- **Identity safety**: bind cleanup to captured PID, start time, executable, - process group, and session evidence. -- **Completion evidence**: report point-in-time `Empty`, `Survivors`, or - `Unknown` membership with platform provenance after owned-containment cleanup. -- **TypeScript parity**: opt into descendant environment and thread details, - with default-off behavior and permission-aware visibility. -- **TypeScript safety**: reject invalid PID, process-group, signal, depth, - duration, port, and filter values before coercion or native loading, then - revalidate them at the N-API boundary. -- **Projection drift enforcement**: generate and check the public TypeScript - declaration shape, N-API inventory, C comparison surface, and API reference. -- **Runtime matrix**: exercise native behavior under Node.js 18, Node.js 22, - and Bun 1.3.3 on Linux x64, macOS arm64, and Windows x64. -- **Schema update**: timeout result schema v1.1 includes `unproven` reliability. - -### Upgrade Notes - -- Rust consumers exhaustively matching `TreeKillReliability` must add the - `Unproven` variant. -- Windows `spawn_in_group` now returns `NotSupported`; use an owned guard - integration. Guaranteed Windows spawn remains unavailable until - create-suspended Job assignment is implemented. -- Dropping an active `ContainmentGuard` terminates its contained processes. -- Completion evidence does not upgrade acquisition reliability, and returned - survivor PIDs are evidence rather than safe signaling targets. -- Completion evidence and owned containment remain Rust-only in this release; - no JavaScript owned-containment or timeout lifecycle is added. -- Dependency-major upgrades are intentionally excluded from this release. -- Go and TypeScript native artifacts for all supported platforms must be - regenerated from the final tag-target commit before publication. - ---- - _Older releases are archived in `docs/releases/`._ diff --git a/VERSION b/VERSION index ee1372d..7179039 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.2 +0.2.3 diff --git a/bindings/typescript/sysprims/README.md b/bindings/typescript/sysprims/README.md index 1a4c173..326f8da 100644 --- a/bindings/typescript/sysprims/README.md +++ b/bindings/typescript/sysprims/README.md @@ -18,11 +18,11 @@ Runtime support: ## Installation ```bash -npm install @3leaps/sysprims@0.2.2 +npm install @3leaps/sysprims@0.2.3 ``` The package and its platform-specific native packages are published from the -verified `v0.2.2` repository tag. +verified `v0.2.3` repository tag. For local development from this repository: @@ -60,8 +60,10 @@ directly to `node scripts/public-api.js check`. `make typescript-api-check` remains a standalone repository target rather than part of `make check`: the general Rust gate does not install Node dependencies. -Pull-request CI runs `npm ci` before the drift check and also generates a fresh -C header for comparison with current Rust exports. +Pull-request CI installs dev tooling with `npm install --omit=optional` before +the drift check because release-prep branches reference same-version platform +packages before those packages exist in the npm registry. CI also generates a +fresh C header for comparison with current Rust exports. ## API diff --git a/bindings/typescript/sysprims/npm/darwin-arm64/package.json b/bindings/typescript/sysprims/npm/darwin-arm64/package.json index fb48bb4..62bf572 100644 --- a/bindings/typescript/sysprims/npm/darwin-arm64/package.json +++ b/bindings/typescript/sysprims/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-darwin-arm64", - "version": "0.2.2", + "version": "0.2.3", "os": [ "darwin" ], diff --git a/bindings/typescript/sysprims/npm/linux-arm64-gnu/package.json b/bindings/typescript/sysprims/npm/linux-arm64-gnu/package.json index 5f1d87a..b6bf476 100644 --- a/bindings/typescript/sysprims/npm/linux-arm64-gnu/package.json +++ b/bindings/typescript/sysprims/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-linux-arm64-gnu", - "version": "0.2.2", + "version": "0.2.3", "os": [ "linux" ], diff --git a/bindings/typescript/sysprims/npm/linux-arm64-musl/package.json b/bindings/typescript/sysprims/npm/linux-arm64-musl/package.json index e19f6f3..1f9fedc 100644 --- a/bindings/typescript/sysprims/npm/linux-arm64-musl/package.json +++ b/bindings/typescript/sysprims/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-linux-arm64-musl", - "version": "0.2.2", + "version": "0.2.3", "os": [ "linux" ], diff --git a/bindings/typescript/sysprims/npm/linux-x64-gnu/package.json b/bindings/typescript/sysprims/npm/linux-x64-gnu/package.json index cdcd495..71c96a6 100644 --- a/bindings/typescript/sysprims/npm/linux-x64-gnu/package.json +++ b/bindings/typescript/sysprims/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-linux-x64-gnu", - "version": "0.2.2", + "version": "0.2.3", "os": [ "linux" ], diff --git a/bindings/typescript/sysprims/npm/linux-x64-musl/package.json b/bindings/typescript/sysprims/npm/linux-x64-musl/package.json index 8cf0ae0..8d31e33 100644 --- a/bindings/typescript/sysprims/npm/linux-x64-musl/package.json +++ b/bindings/typescript/sysprims/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-linux-x64-musl", - "version": "0.2.2", + "version": "0.2.3", "os": [ "linux" ], diff --git a/bindings/typescript/sysprims/npm/win32-arm64-msvc/package.json b/bindings/typescript/sysprims/npm/win32-arm64-msvc/package.json index 87972a6..ccb9f97 100644 --- a/bindings/typescript/sysprims/npm/win32-arm64-msvc/package.json +++ b/bindings/typescript/sysprims/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-win32-arm64-msvc", - "version": "0.2.2", + "version": "0.2.3", "os": [ "win32" ], diff --git a/bindings/typescript/sysprims/npm/win32-x64-msvc/package.json b/bindings/typescript/sysprims/npm/win32-x64-msvc/package.json index a63c707..afed4fb 100644 --- a/bindings/typescript/sysprims/npm/win32-x64-msvc/package.json +++ b/bindings/typescript/sysprims/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims-win32-x64-msvc", - "version": "0.2.2", + "version": "0.2.3", "os": [ "win32" ], diff --git a/bindings/typescript/sysprims/package-lock.json b/bindings/typescript/sysprims/package-lock.json index 5015341..2730fb8 100644 --- a/bindings/typescript/sysprims/package-lock.json +++ b/bindings/typescript/sysprims/package-lock.json @@ -1,12 +1,12 @@ { "name": "@3leaps/sysprims", - "version": "0.2.2", + "version": "0.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@3leaps/sysprims", - "version": "0.2.2", + "version": "0.2.3", "license": "MIT OR Apache-2.0", "devDependencies": { "@napi-rs/cli": "^2.18.4", @@ -17,137 +17,13 @@ "node": ">=18" }, "optionalDependencies": { - "@3leaps/sysprims-darwin-arm64": "0.2.2", - "@3leaps/sysprims-linux-arm64-gnu": "0.2.2", - "@3leaps/sysprims-linux-arm64-musl": "0.2.2", - "@3leaps/sysprims-linux-x64-gnu": "0.2.2", - "@3leaps/sysprims-linux-x64-musl": "0.2.2", - "@3leaps/sysprims-win32-arm64-msvc": "0.2.2", - "@3leaps/sysprims-win32-x64-msvc": "0.2.2" - } - }, - "node_modules/@3leaps/sysprims-darwin-arm64": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-darwin-arm64/-/sysprims-darwin-arm64-0.2.2.tgz", - "integrity": "sha512-lZUEcL8lwAL9RoYkICAxDb31sT4CiFj0KQ+/Ld3ytFAUsm11fxQeehWdLEjCXCWwHxPn8eVzMAB0J8q+ALeiMw==", - "cpu": [ - "arm64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-linux-arm64-gnu": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-linux-arm64-gnu/-/sysprims-linux-arm64-gnu-0.2.2.tgz", - "integrity": "sha512-HlXA/+P43DHEE1VvdfQA9uQj50XwN0Z89yplyfxkG98oqgOkg0tb2cQjANhD+TCImSB2lVMekiY6ANn58lgyQg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-linux-arm64-musl": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-linux-arm64-musl/-/sysprims-linux-arm64-musl-0.2.2.tgz", - "integrity": "sha512-rbXH2f12koNup/dGoHCvSKsZG8eW1Mv5IJQJhopb/Kqmy4LTECkhWg5aGpxKJCISpPL43ZPf8cmMgNlOSNgcHg==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-linux-x64-gnu": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-linux-x64-gnu/-/sysprims-linux-x64-gnu-0.2.2.tgz", - "integrity": "sha512-LWl0WudAa4zF7V67EGbGCLfrSBd75pQpaBJjaBhFnsQ7xerH6cvSvatXT1h2rkDAuVE1jIEsBktjsWnoWFOb3g==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-linux-x64-musl": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-linux-x64-musl/-/sysprims-linux-x64-musl-0.2.2.tgz", - "integrity": "sha512-e9IAXG7JUmYj2eMek58439rI9A/pr/ns5OdNotuVPqDs+TDF+hNUVTy5qudcTVUFxf/Oi4QW3meAuaP/bOsRlw==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-win32-arm64-msvc": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-win32-arm64-msvc/-/sysprims-win32-arm64-msvc-0.2.2.tgz", - "integrity": "sha512-Pq047X5PC3o1+zo9t43Nz9E/5QgjlqnCsf5FAEMvvnzxz+Z3rRumhclx7P0qsGVaJcww0OuEQjZufwJkbtaKNw==", - "cpu": [ - "arm64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@3leaps/sysprims-win32-x64-msvc": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@3leaps/sysprims-win32-x64-msvc/-/sysprims-win32-x64-msvc-0.2.2.tgz", - "integrity": "sha512-BleN/fCNMjXdycTySB7pGglJbkYSMfwuGBj9BGuKWfXxYuTTtMpsk9+pNUskh8J/p5W39uGtXB8mO233YC64hw==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "@3leaps/sysprims-darwin-arm64": "0.2.3", + "@3leaps/sysprims-linux-arm64-gnu": "0.2.3", + "@3leaps/sysprims-linux-arm64-musl": "0.2.3", + "@3leaps/sysprims-linux-x64-gnu": "0.2.3", + "@3leaps/sysprims-linux-x64-musl": "0.2.3", + "@3leaps/sysprims-win32-arm64-msvc": "0.2.3", + "@3leaps/sysprims-win32-x64-msvc": "0.2.3" } }, "node_modules/@napi-rs/cli": { diff --git a/bindings/typescript/sysprims/package.json b/bindings/typescript/sysprims/package.json index 1a97766..d75c229 100644 --- a/bindings/typescript/sysprims/package.json +++ b/bindings/typescript/sysprims/package.json @@ -1,6 +1,6 @@ { "name": "@3leaps/sysprims", - "version": "0.2.2", + "version": "0.2.3", "description": "GPL-free cross-platform process utilities (TypeScript bindings via Node-API native addon)", "license": "MIT OR Apache-2.0", "repository": { @@ -51,13 +51,13 @@ }, "dependencies": {}, "optionalDependencies": { - "@3leaps/sysprims-linux-x64-gnu": "0.2.2", - "@3leaps/sysprims-linux-x64-musl": "0.2.2", - "@3leaps/sysprims-linux-arm64-gnu": "0.2.2", - "@3leaps/sysprims-linux-arm64-musl": "0.2.2", - "@3leaps/sysprims-darwin-arm64": "0.2.2", - "@3leaps/sysprims-win32-x64-msvc": "0.2.2", - "@3leaps/sysprims-win32-arm64-msvc": "0.2.2" + "@3leaps/sysprims-linux-x64-gnu": "0.2.3", + "@3leaps/sysprims-linux-x64-musl": "0.2.3", + "@3leaps/sysprims-linux-arm64-gnu": "0.2.3", + "@3leaps/sysprims-linux-arm64-musl": "0.2.3", + "@3leaps/sysprims-darwin-arm64": "0.2.3", + "@3leaps/sysprims-win32-x64-msvc": "0.2.3", + "@3leaps/sysprims-win32-arm64-msvc": "0.2.3" }, "devDependencies": { "@napi-rs/cli": "^2.18.4", diff --git a/docs/releases/v0.2.3.md b/docs/releases/v0.2.3.md new file mode 100644 index 0000000..28b1023 --- /dev/null +++ b/docs/releases/v0.2.3.md @@ -0,0 +1,66 @@ +# v0.2.3 - 2026-09-01 + +**Status:** Cargo Publication Enablement + +v0.2.3 prepares the Rust library crates for crates.io publication while keeping +repository-built implementation surfaces out of Cargo publication. The release +does not add new process-control APIs. + +## Highlights + +- **Cargo-published library crates**: + `sysprims-core`, `sysprims-signal`, `sysprims-session`, `sysprims-proc`, + and `sysprims-timeout` now carry publication metadata, crate-local README + files, and versioned internal dependency pins. +- **Unpublished implementation crates**: + `sysprims-cli`, `sysprims-ffi`, and `sysprims-ts-napi` remain + `publish = false`; they continue to ship through the CLI, FFI, Go, and + TypeScript release workflows rather than crates.io. +- **Release dry-run target**: + `make release-check` validates version coherence and builds Cargo package + tarballs without running `cargo publish`. +- **Documented crates.io sequence**: + the release checklist records first-upload order and negative controls for + the unpublished crates. +- **Release-prep TypeScript validation**: + pull-request CI installs TypeScript dev tooling with + `npm install --omit=optional` so same-version platform packages can be + referenced before the npm publication workflow creates them. + +## Release Coordinates + +| Surface | v0.2.3 coordinate | +| --- | --- | +| Rust crates | `sysprims-core`, `sysprims-signal`, `sysprims-session`, `sysprims-proc`, `sysprims-timeout` at `0.2.3` | +| Rust workspace | Repository tag `v0.2.3` | +| Go module | Path-prefixed tag `bindings/go/sysprims/v0.2.3` on the same commit | +| TypeScript | `@3leaps/sysprims@0.2.3`, published from the verified `v0.2.3` tag | +| PTY adapter | Separate `sysprims-pty` release lifecycle after any required core pin update | + +## Cargo Publication Order + +Publish only after the exact `v0.2.3` tag is on `origin` and points at the +intended release commit. + +1. `sysprims-core` +2. `sysprims-signal` +3. `sysprims-session` +4. `sysprims-proc` +5. `sysprims-timeout` + +Confirm each predecessor is visible through `cargo info --registry crates-io` +before publishing the next dependent crate. On the first upload of these crate +names, dependent dry-runs are expected to fail until predecessor crates are +indexed. + +Do not publish `sysprims-cli`, `sysprims-ffi`, or `sysprims-ts-napi` to +crates.io. + +## Upgrade Notes + +- Rust consumers can move from git-tag dependencies to crates.io versions for + the five public library crates after publication. +- Go and TypeScript consumers keep using their existing release coordinates. +- TypeScript optional platform packages are built and published by tag-based + npm workflows; release-prep PR validation intentionally omits them before + publication.