Skip to content

Commit 1ef4eb8

Browse files
committed
feat(tiny-dancer): full platform matrix — add musl (Alpine) + Windows ARM64
Extends the build/publish workflow from 5 to 8 environments: - linux-x64-musl, linux-arm64-musl (Alpine/Docker) via napi --use-napi-cross - win32-arm64-msvc (Windows on ARM) via rustup target cross-compile index.js now detects musl vs glibc at load time (process.report glibc header) and routes to the correct binary; adds win32-arm64. package.json bumped to 0.1.20 with all 8 optionalDependencies lock-stepped. Co-Authored-By: claude-flow <ruv@ruv.net>
1 parent b88010b commit 1ef4eb8

3 files changed

Lines changed: 81 additions & 21 deletions

File tree

.github/workflows/build-tiny-dancer.yml

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,35 @@ jobs:
3636
- host: ubuntu-22.04
3737
target: x86_64-unknown-linux-gnu
3838
platform: linux-x64-gnu
39+
extraFlags: ""
40+
- host: ubuntu-22.04
41+
target: x86_64-unknown-linux-musl
42+
platform: linux-x64-musl
43+
extraFlags: "--use-napi-cross"
3944
- host: ubuntu-22.04
4045
target: aarch64-unknown-linux-gnu
4146
platform: linux-arm64-gnu
47+
extraFlags: ""
48+
- host: ubuntu-22.04
49+
target: aarch64-unknown-linux-musl
50+
platform: linux-arm64-musl
51+
extraFlags: "--use-napi-cross"
4252
- host: macos-14
4353
target: x86_64-apple-darwin
4454
platform: darwin-x64
55+
extraFlags: ""
4556
- host: macos-14
4657
target: aarch64-apple-darwin
4758
platform: darwin-arm64
59+
extraFlags: ""
4860
- host: windows-2022
4961
target: x86_64-pc-windows-msvc
5062
platform: win32-x64-msvc
63+
extraFlags: ""
64+
- host: windows-2022
65+
target: aarch64-pc-windows-msvc
66+
platform: win32-arm64-msvc
67+
extraFlags: ""
5168

5269
name: Build Tiny Dancer ${{ matrix.settings.platform }}
5370
runs-on: ${{ matrix.settings.host }}
@@ -84,7 +101,7 @@ jobs:
84101
- name: Build native module
85102
working-directory: npm/packages/tiny-dancer
86103
run: |
87-
npx napi build --platform --release --cargo-cwd ../../../crates/ruvector-tiny-dancer-node --target ${{ matrix.settings.target }}
104+
npx napi build --platform --release --cargo-cwd ../../../crates/ruvector-tiny-dancer-node --target ${{ matrix.settings.target }} ${{ matrix.settings.extraFlags }}
88105
env:
89106
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
90107

@@ -179,10 +196,22 @@ jobs:
179196
OS="linux"; CPU="x64"; LIBC='"libc": ["glibc"],'
180197
NODE_NAME="ruvector-tiny-dancer.linux-x64-gnu.node"
181198
;;
199+
linux-x64-musl)
200+
OS="linux"; CPU="x64"; LIBC='"libc": ["musl"],'
201+
NODE_NAME="ruvector-tiny-dancer.linux-x64-musl.node"
202+
;;
182203
linux-arm64-gnu)
183204
OS="linux"; CPU="arm64"; LIBC='"libc": ["glibc"],'
184205
NODE_NAME="ruvector-tiny-dancer.linux-arm64-gnu.node"
185206
;;
207+
linux-arm64-musl)
208+
OS="linux"; CPU="arm64"; LIBC='"libc": ["musl"],'
209+
NODE_NAME="ruvector-tiny-dancer.linux-arm64-musl.node"
210+
;;
211+
win32-arm64-msvc)
212+
OS="win32"; CPU="arm64"; LIBC=""
213+
NODE_NAME="ruvector-tiny-dancer.win32-arm64-msvc.node"
214+
;;
186215
darwin-x64)
187216
OS="darwin"; CPU="x64"; LIBC=""
188217
NODE_NAME="ruvector-tiny-dancer.darwin-x64.node"

npm/packages/tiny-dancer/index.js

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,59 @@
11
const { platform, arch } = process;
22
const path = require('path');
33

4-
// Platform mapping for @ruvector/tiny-dancer
4+
/**
5+
* Detect whether this Linux runtime is musl (Alpine) rather than glibc.
6+
* Uses the Node process report header, which exposes `glibcVersionRuntime`
7+
* only on glibc systems. No glibc runtime => musl.
8+
*/
9+
function isMusl() {
10+
if (platform !== 'linux') return false;
11+
try {
12+
const report = typeof process.report?.getReport === 'function'
13+
? process.report.getReport()
14+
: null;
15+
const header = report && report.header;
16+
if (header && typeof header.glibcVersionRuntime === 'string') {
17+
return false; // glibc present
18+
}
19+
return true; // no glibc runtime reported => musl
20+
} catch {
21+
return false; // default to glibc on any detection failure
22+
}
23+
}
24+
25+
// Platform mapping for @ruvector/tiny-dancer. Linux entries are functions so
26+
// libc (glibc vs musl) is resolved at load time.
527
const platformMap = {
6-
'linux': {
7-
'x64': { package: '@ruvector/tiny-dancer-linux-x64-gnu', file: 'ruvector-tiny-dancer.linux-x64-gnu.node' },
8-
'arm64': { package: '@ruvector/tiny-dancer-linux-arm64-gnu', file: 'ruvector-tiny-dancer.linux-arm64-gnu.node' }
28+
linux: {
29+
x64: () => isMusl()
30+
? { package: '@ruvector/tiny-dancer-linux-x64-musl', file: 'ruvector-tiny-dancer.linux-x64-musl.node' }
31+
: { package: '@ruvector/tiny-dancer-linux-x64-gnu', file: 'ruvector-tiny-dancer.linux-x64-gnu.node' },
32+
arm64: () => isMusl()
33+
? { package: '@ruvector/tiny-dancer-linux-arm64-musl', file: 'ruvector-tiny-dancer.linux-arm64-musl.node' }
34+
: { package: '@ruvector/tiny-dancer-linux-arm64-gnu', file: 'ruvector-tiny-dancer.linux-arm64-gnu.node' },
935
},
10-
'darwin': {
11-
'x64': { package: '@ruvector/tiny-dancer-darwin-x64', file: 'ruvector-tiny-dancer.darwin-x64.node' },
12-
'arm64': { package: '@ruvector/tiny-dancer-darwin-arm64', file: 'ruvector-tiny-dancer.darwin-arm64.node' }
36+
darwin: {
37+
x64: () => ({ package: '@ruvector/tiny-dancer-darwin-x64', file: 'ruvector-tiny-dancer.darwin-x64.node' }),
38+
arm64: () => ({ package: '@ruvector/tiny-dancer-darwin-arm64', file: 'ruvector-tiny-dancer.darwin-arm64.node' }),
39+
},
40+
win32: {
41+
x64: () => ({ package: '@ruvector/tiny-dancer-win32-x64-msvc', file: 'ruvector-tiny-dancer.win32-x64-msvc.node' }),
42+
arm64: () => ({ package: '@ruvector/tiny-dancer-win32-arm64-msvc', file: 'ruvector-tiny-dancer.win32-arm64-msvc.node' }),
1343
},
14-
'win32': {
15-
'x64': { package: '@ruvector/tiny-dancer-win32-x64-msvc', file: 'ruvector-tiny-dancer.win32-x64-msvc.node' }
16-
}
1744
};
1845

1946
function loadNativeModule() {
20-
const platformInfo = platformMap[platform]?.[arch];
47+
const resolve = platformMap[platform]?.[arch];
48+
const platformInfo = typeof resolve === 'function' ? resolve() : null;
2149

2250
if (!platformInfo) {
2351
throw new Error(
2452
`Unsupported platform: ${platform}-${arch}\n` +
2553
`@ruvector/tiny-dancer native module is available for:\n` +
26-
`- Linux (x64, ARM64)\n` +
27-
`- macOS (x64, ARM64)\n` +
28-
`- Windows (x64)\n\n` +
54+
`- Linux x64/ARM64 (glibc and musl/Alpine)\n` +
55+
`- macOS x64/ARM64\n` +
56+
`- Windows x64/ARM64\n\n` +
2957
`Install the package for your platform:\n` +
3058
` npm install @ruvector/tiny-dancer`
3159
);

npm/packages/tiny-dancer/package.json

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ruvector/tiny-dancer",
3-
"version": "0.1.19",
3+
"version": "0.1.20",
44
"description": "Neural router for AI agent orchestration - FastGRNN-based intelligent routing with circuit breaker, uncertainty estimation, and hot-reload",
55
"main": "index.js",
66
"types": "index.d.ts",
@@ -31,11 +31,14 @@
3131
"@napi-rs/cli": "^2.18.0"
3232
},
3333
"optionalDependencies": {
34-
"@ruvector/tiny-dancer-linux-x64-gnu": "0.1.19",
35-
"@ruvector/tiny-dancer-linux-arm64-gnu": "0.1.19",
36-
"@ruvector/tiny-dancer-darwin-x64": "0.1.19",
37-
"@ruvector/tiny-dancer-darwin-arm64": "0.1.19",
38-
"@ruvector/tiny-dancer-win32-x64-msvc": "0.1.19"
34+
"@ruvector/tiny-dancer-linux-x64-gnu": "0.1.20",
35+
"@ruvector/tiny-dancer-linux-x64-musl": "0.1.20",
36+
"@ruvector/tiny-dancer-linux-arm64-gnu": "0.1.20",
37+
"@ruvector/tiny-dancer-linux-arm64-musl": "0.1.20",
38+
"@ruvector/tiny-dancer-darwin-x64": "0.1.20",
39+
"@ruvector/tiny-dancer-darwin-arm64": "0.1.20",
40+
"@ruvector/tiny-dancer-win32-x64-msvc": "0.1.20",
41+
"@ruvector/tiny-dancer-win32-arm64-msvc": "0.1.20"
3942
},
4043
"publishConfig": {
4144
"access": "public"

0 commit comments

Comments
 (0)