From 85162eed58681336ed41995776cbeda2643001b4 Mon Sep 17 00:00:00 2001 From: rUv Date: Wed, 25 Feb 2026 12:36:03 +0000 Subject: [PATCH] fix: include prebuilt binaries in @ruvector/gnn platform packages (#195) The darwin-arm64 (and other non-linux) platform packages were published with only package.json and no .node binary. Root cause: napi build compiled all workspace cdylib crates instead of just ruvector-gnn-node, causing macOS CI runners to fail. Fixes: - Add --cargo-flags="-p ruvector-gnn-node" to scope napi build - Install @napi-rs/cli globally (matches working attention workflow) - Add linux-x64-musl and linux-arm64-musl to build matrix - Add binary existence verification before npm publish - Bump to v0.1.24 for all platform packages Closes #195 Co-Authored-By: claude-flow --- .github/workflows/build-gnn.yml | 53 +++++++++++++++++-- .../npm/darwin-arm64/package.json | 2 +- .../npm/darwin-x64/package.json | 2 +- .../npm/linux-arm64-gnu/package.json | 2 +- .../npm/linux-arm64-musl/package.json | 2 +- .../npm/linux-x64-gnu/package.json | 2 +- .../npm/linux-x64-musl/package.json | 2 +- .../npm/win32-x64-msvc/package.json | 2 +- crates/ruvector-gnn-node/package.json | 16 +++--- 9 files changed, 65 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build-gnn.yml b/.github/workflows/build-gnn.yml index c94ed532a..e2411effc 100644 --- a/.github/workflows/build-gnn.yml +++ b/.github/workflows/build-gnn.yml @@ -34,9 +34,15 @@ jobs: - host: ubuntu-22.04 target: x86_64-unknown-linux-gnu platform: linux-x64-gnu + - host: ubuntu-22.04 + target: x86_64-unknown-linux-musl + platform: linux-x64-musl - host: ubuntu-22.04 target: aarch64-unknown-linux-gnu platform: linux-arm64-gnu + - host: ubuntu-22.04 + target: aarch64-unknown-linux-musl + platform: linux-arm64-musl - host: macos-14 target: x86_64-apple-darwin platform: darwin-x64 @@ -69,12 +75,27 @@ jobs: with: key: gnn-${{ matrix.settings.target }} - - name: Install cross-compilation tools (Linux ARM64) + - name: Install cross-compilation tools (Linux ARM64 GNU) if: matrix.settings.platform == 'linux-arm64-gnu' run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu + - name: Install cross-compilation tools (Linux x64 musl) + if: matrix.settings.platform == 'linux-x64-musl' + run: | + sudo apt-get update + sudo apt-get install -y musl-tools + + - name: Install cross-compilation tools (Linux ARM64 musl) + if: matrix.settings.platform == 'linux-arm64-musl' + run: | + sudo apt-get update + sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu musl-tools + + - name: Install NAPI-RS CLI + run: npm install -g @napi-rs/cli + - name: Install dependencies working-directory: crates/ruvector-gnn-node run: npm install --ignore-scripts --omit=optional --force @@ -82,9 +103,10 @@ jobs: - name: Build native module working-directory: crates/ruvector-gnn-node run: | - npx napi build --platform --release --target ${{ matrix.settings.target }} + napi build --platform --release --target ${{ matrix.settings.target }} --cargo-flags="-p ruvector-gnn-node" env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER: aarch64-linux-gnu-gcc - name: Find built .node files (debug) shell: bash @@ -160,16 +182,24 @@ jobs: PKG_DIR="npm-pkg/gnn-${platform}" mkdir -p "$PKG_DIR" - # Determine OS and CPU + # Determine OS, CPU, and binary name case "$platform" in linux-x64-gnu) OS="linux"; CPU="x64"; LIBC='"libc": ["glibc"],' NODE_NAME="ruvector-gnn.linux-x64-gnu.node" ;; + linux-x64-musl) + OS="linux"; CPU="x64"; LIBC='"libc": ["musl"],' + NODE_NAME="ruvector-gnn.linux-x64-musl.node" + ;; linux-arm64-gnu) OS="linux"; CPU="arm64"; LIBC='"libc": ["glibc"],' NODE_NAME="ruvector-gnn.linux-arm64-gnu.node" ;; + linux-arm64-musl) + OS="linux"; CPU="arm64"; LIBC='"libc": ["musl"],' + NODE_NAME="ruvector-gnn.linux-arm64-musl.node" + ;; darwin-x64) OS="darwin"; CPU="x64"; LIBC="" NODE_NAME="ruvector-gnn.darwin-x64.node" @@ -207,8 +237,25 @@ jobs: } EOF + # Verify binary exists before publish + if [ ! -f "$PKG_DIR/$NODE_NAME" ]; then + echo "ERROR: Binary $NODE_NAME missing from $PKG_DIR" + ls -la "$PKG_DIR/" + exit 1 + fi + + echo "Binary size: $(wc -c < "$PKG_DIR/$NODE_NAME") bytes" + # Publish cd "$PKG_DIR" npm publish --access public || echo "Failed to publish @ruvector/gnn-${platform}" cd ../.. done + + - name: Publish main @ruvector/gnn package + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + working-directory: crates/ruvector-gnn-node + run: | + npm install --ignore-scripts --omit=optional --force + npm publish --access public || echo "Failed to publish @ruvector/gnn" diff --git a/crates/ruvector-gnn-node/npm/darwin-arm64/package.json b/crates/ruvector-gnn-node/npm/darwin-arm64/package.json index 3515f5917..0be7205fa 100644 --- a/crates/ruvector-gnn-node/npm/darwin-arm64/package.json +++ b/crates/ruvector-gnn-node/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-darwin-arm64", - "version": "0.1.23", + "version": "0.1.24", "os": [ "darwin" ], diff --git a/crates/ruvector-gnn-node/npm/darwin-x64/package.json b/crates/ruvector-gnn-node/npm/darwin-x64/package.json index a82d171ae..3f1a3e23b 100644 --- a/crates/ruvector-gnn-node/npm/darwin-x64/package.json +++ b/crates/ruvector-gnn-node/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-darwin-x64", - "version": "0.1.23", + "version": "0.1.24", "os": [ "darwin" ], diff --git a/crates/ruvector-gnn-node/npm/linux-arm64-gnu/package.json b/crates/ruvector-gnn-node/npm/linux-arm64-gnu/package.json index d506e9ead..4e9e1bb07 100644 --- a/crates/ruvector-gnn-node/npm/linux-arm64-gnu/package.json +++ b/crates/ruvector-gnn-node/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-linux-arm64-gnu", - "version": "0.1.23", + "version": "0.1.24", "os": [ "linux" ], diff --git a/crates/ruvector-gnn-node/npm/linux-arm64-musl/package.json b/crates/ruvector-gnn-node/npm/linux-arm64-musl/package.json index 8012e83f7..664314fad 100644 --- a/crates/ruvector-gnn-node/npm/linux-arm64-musl/package.json +++ b/crates/ruvector-gnn-node/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-linux-arm64-musl", - "version": "0.1.23", + "version": "0.1.24", "os": [ "linux" ], diff --git a/crates/ruvector-gnn-node/npm/linux-x64-gnu/package.json b/crates/ruvector-gnn-node/npm/linux-x64-gnu/package.json index 38ea73739..c7470e026 100644 --- a/crates/ruvector-gnn-node/npm/linux-x64-gnu/package.json +++ b/crates/ruvector-gnn-node/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-linux-x64-gnu", - "version": "0.1.23", + "version": "0.1.24", "os": [ "linux" ], diff --git a/crates/ruvector-gnn-node/npm/linux-x64-musl/package.json b/crates/ruvector-gnn-node/npm/linux-x64-musl/package.json index d23af9331..dd5a6528a 100644 --- a/crates/ruvector-gnn-node/npm/linux-x64-musl/package.json +++ b/crates/ruvector-gnn-node/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-linux-x64-musl", - "version": "0.1.23", + "version": "0.1.24", "os": [ "linux" ], diff --git a/crates/ruvector-gnn-node/npm/win32-x64-msvc/package.json b/crates/ruvector-gnn-node/npm/win32-x64-msvc/package.json index ecd1d54c1..6872614b1 100644 --- a/crates/ruvector-gnn-node/npm/win32-x64-msvc/package.json +++ b/crates/ruvector-gnn-node/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn-win32-x64-msvc", - "version": "0.1.23", + "version": "0.1.24", "os": [ "win32" ], diff --git a/crates/ruvector-gnn-node/package.json b/crates/ruvector-gnn-node/package.json index 4afb59ce8..100eab511 100644 --- a/crates/ruvector-gnn-node/package.json +++ b/crates/ruvector-gnn-node/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/gnn", - "version": "0.1.23", + "version": "0.1.24", "description": "Graph Neural Network capabilities for Ruvector - Node.js bindings", "main": "index.js", "types": "index.d.ts", @@ -51,12 +51,12 @@ "access": "public" }, "optionalDependencies": { - "@ruvector/gnn-win32-x64-msvc": "0.1.23", - "@ruvector/gnn-darwin-x64": "0.1.23", - "@ruvector/gnn-linux-x64-gnu": "0.1.23", - "@ruvector/gnn-linux-x64-musl": "0.1.23", - "@ruvector/gnn-linux-arm64-gnu": "0.1.23", - "@ruvector/gnn-linux-arm64-musl": "0.1.23", - "@ruvector/gnn-darwin-arm64": "0.1.23" + "@ruvector/gnn-win32-x64-msvc": "0.1.24", + "@ruvector/gnn-darwin-x64": "0.1.24", + "@ruvector/gnn-linux-x64-gnu": "0.1.24", + "@ruvector/gnn-linux-x64-musl": "0.1.24", + "@ruvector/gnn-linux-arm64-gnu": "0.1.24", + "@ruvector/gnn-linux-arm64-musl": "0.1.24", + "@ruvector/gnn-darwin-arm64": "0.1.24" } } \ No newline at end of file