Skip to content

Commit 7e7291d

Browse files
authored
chore: remove npm CLI packaging (#690)
#### Overview Remove the Node-launcher-based npm distribution of the NeMo Relay CLI. Native binaries, shell and PowerShell installers, Cargo installation, and PyPI `nemo-relay-cli-bin` wheels remain supported; Node.js bindings and OpenClaw npm packages are unchanged. - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. #### Details - Simplify `scripts/package-cli-bin.py` and its tests to produce only PyPI wheels. - Remove npm CLI workspaces, lockfile entries, version-bump logic, CI artifacts, publication jobs, and path filters. - Remove npm CLI installation guidance and update release documentation to describe the retired npm packages. - Preserve native CLI release binaries and wheels, plus the existing Node.js binding and OpenClaw npm release paths. This intentionally removes the supported npm installation path for the CLI. Deprecating the already-published npm packages remains a post-merge registry operation so package history is retained. Validation: - Focused CLI wheel packaging unit tests: 3 passed. - `npm ci --ignore-scripts --audit=false --fund=false`. - `just test-python` in isolated user configuration: 614 passed, 45 skipped. - `just test-node` in isolated user configuration: 349 passed. - `just docs` and `just docs-linkcheck` (zero errors; existing external redirect check returned HTTP 403 warning). - `uv run pre-commit run --all-files`. #### Where should the reviewer start? Start with `scripts/package-cli-bin.py` and `.github/workflows/ci_rust.yml`, which show the packaging and release-automation boundary after npm CLI removal. Then review `RELEASING.md` for the maintainer-facing retirement guidance. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Closes RELAY-665 ## Summary by CodeRabbit * **Chores** * Discontinued npm CLI package distribution. CI/CD workflows updated to remove npm artifact validation, publishing, and uploads; now publish only Python wheel and Node.js packages. * Refactored CLI packaging script and configuration to support PyPI wheel distribution exclusively. * Simplified package workspace by removing npm CLI package module. * **Documentation** * Updated installation documentation, release guides, and README to remove npm CLI installation instructions. Authors: - Will Killian (https://github.com/willkill07) Approvers: - Maryam Najafian (https://github.com/mnajafian-nv) URL: #690
1 parent 42f68fa commit 7e7291d

14 files changed

Lines changed: 36 additions & 343 deletions

File tree

.github/ci-path-filters.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ rust_package:
5959
- 'crates/ffi/nemo_relay.h'
6060
- 'crates/ffi/src/**'
6161
- 'justfile'
62-
- 'packages/cli-bin/**'
6362
- 'python/cli-bin/**'
6463
- 'rust-toolchain.toml'
6564
- 'scripts/package-cli-bin.py'
@@ -82,10 +81,8 @@ node_package:
8281
- 'justfile'
8382
- 'package.json'
8483
- 'package-lock.json'
85-
- 'packages/cli-bin/**'
8684
- 'pyproject.toml'
8785
- 'rust-toolchain.toml'
88-
- 'scripts/package-cli-bin.py'
8986
- 'scripts/package-node-bin.py'
9087
- 'uv.lock'
9188

@@ -132,7 +129,6 @@ dependencies:
132129
- 'integrations/**/package.json'
133130
- 'package.json'
134131
- 'package-lock.json'
135-
- 'packages/cli-bin/**'
136132
- 'pyproject.toml'
137133
- 'python/cli-bin/**'
138134
- 'scripts/licensing/**'

.github/workflows/ci.yaml

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,10 @@ jobs:
310310
cli_binaries=(nemo-relay-cli-*)
311311
cli_wheels=(nemo_relay_cli_bin-*.whl)
312312
python_api_wheels=(nemo_relay-*.whl)
313-
cli_npm=(nemo-relay-bin-npm-*.tgz)
314313
node_npm=(nemo-relay-node-npm-*.tgz)
315314
expect_count 7 "CLI binary" "${cli_binaries[@]}"
316315
expect_count 7 "CLI wheel" "${cli_wheels[@]}"
317316
expect_count 7 "Python API wheel" "${python_api_wheels[@]}"
318-
expect_count 8 "CLI npm" "${cli_npm[@]}"
319317
expect_count 8 "Node npm" "${node_npm[@]}"
320318
321319
mapfile -t distribution_assets < <(
@@ -523,13 +521,6 @@ jobs:
523521
name: openclaw-npm
524522
path: openclaw-package/
525523

526-
- name: Download CLI npm artifacts
527-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
528-
with:
529-
pattern: cli-npm-package-*
530-
merge-multiple: true
531-
path: cli-packages/
532-
533524
- name: Select npm dist-tag
534525
run: |
535526
set -e
@@ -558,25 +549,6 @@ jobs:
558549
npm publish "./$metapackage" --access public --tag "${NEMO_RELAY_NPM_DIST_TAG}"
559550
fi
560551
561-
- name: Publish CLI packages to npm
562-
run: |
563-
set -euo pipefail
564-
version="${{ github.ref_name }}"
565-
for pkg in cli-packages/nemo-relay-bin-npm-{linux-x64,linux-arm64,linux-x64-musl,linux-arm64-musl,darwin-arm64,win32-x64,win32-arm64}-${version}.tgz; do
566-
name="$(tar xOf "$pkg" package/package.json | node -p 'JSON.parse(require("fs").readFileSync(0, "utf8")).name')"
567-
if npm view "${name}@${version}" version --registry https://registry.npmjs.org >/dev/null 2>&1; then
568-
echo "${name} ${version} already exists on npm; skipping"
569-
continue
570-
fi
571-
npm publish "./$pkg" --access public --tag "${NEMO_RELAY_NPM_DIST_TAG}"
572-
done
573-
launcher="cli-packages/nemo-relay-bin-npm-${version}.tgz"
574-
if npm view "nemo-relay-cli-bin@${version}" version --registry https://registry.npmjs.org >/dev/null 2>&1; then
575-
echo "nemo-relay-cli-bin ${version} already exists on npm; skipping"
576-
else
577-
npm publish "./$launcher" --access public --tag "${NEMO_RELAY_NPM_DIST_TAG}"
578-
fi
579-
580552
- name: Publish OpenClaw plugin package to npm
581553
run: |
582554
set -euo pipefail

.github/workflows/ci_rust.yml

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ jobs:
327327
mkdir -p "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli"
328328
cp "$source" "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli/${asset}"
329329
330-
- name: Package CLI binary for PyPI and npm
330+
- name: Package CLI binary for PyPI
331331
working-directory: ${{ env.NEMO_RELAY_CI_WORKSPACE }}
332332
run: |
333333
set -euo pipefail
@@ -343,16 +343,11 @@ jobs:
343343
fi
344344
rm -rf "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-packages"
345345
mkdir -p "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-packages"
346-
args=(
347-
--binary "$source"
348-
--target "$target"
349-
--version "$version"
346+
python scripts/package-cli-bin.py \
347+
--binary "$source" \
348+
--target "$target" \
349+
--version "$version" \
350350
--output-dir "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-packages"
351-
)
352-
if [ "${{ matrix.platform }}" = "linux-amd64" ]; then
353-
args+=(--npm-launcher)
354-
fi
355-
python scripts/package-cli-bin.py "${args[@]}"
356351
357352
- name: Install and run CLI wheel
358353
if: ${{ !endsWith(matrix.target, '-musl') }}
@@ -402,10 +397,3 @@ jobs:
402397
name: cli-python-wheel-${{ matrix.platform }}
403398
path: ${{ env.NEMO_RELAY_CI_WORKSPACE_TMP }}/cli-packages/*.whl
404399
if-no-files-found: error
405-
406-
- name: Upload CLI npm artifact
407-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
408-
with:
409-
name: cli-npm-package-${{ matrix.platform }}
410-
path: ${{ env.NEMO_RELAY_CI_WORKSPACE_TMP }}/cli-packages/*.tgz
411-
if-no-files-found: error

.gitlab-ci.yml

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ collect:github-artifacts:
6868
fi
6969
export GH_TOKEN="${NEMO_RELAY_CI_GITHUB_TOKEN}"
7070
71-
mkdir -p collected/wheels collected/sdists collected/node collected/cli-npm downloaded
71+
mkdir -p collected/wheels collected/sdists collected/node downloaded
7272
7373
tag="${CI_COMMIT_TAG:-}"
7474
if [ -z "$tag" ]; then
@@ -133,15 +133,13 @@ collect:github-artifacts:
133133
134134
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --pattern 'wheel-*' --dir downloaded/wheels
135135
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --pattern 'cli-python-wheel-*' --dir downloaded/cli-wheels
136-
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --pattern 'cli-npm-package-*' --dir downloaded/cli-npm
137136
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --name 'plugin-wheel' --dir downloaded/wheels
138137
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --name 'python-sdist' --dir downloaded/sdists
139138
gh run download "$run_id" --repo "$NEMO_RELAY_CI_GITHUB_REPOSITORY" --pattern 'node-npm-package-*' --dir downloaded/node
140139
141140
find downloaded/wheels -type f -name '*.whl' -exec cp {} collected/wheels/ \;
142141
find downloaded/cli-wheels -type f -name '*.whl' -exec cp {} collected/wheels/ \;
143142
find downloaded/sdists -type f -name 'nemo_relay-*.tar.gz' -exec cp {} collected/sdists/ \;
144-
find downloaded/cli-npm -type f -name '*.tgz' -exec cp {} collected/cli-npm/ \;
145143
find downloaded/node -type f -name '*.tgz' -exec cp {} collected/node/ \;
146144
147145
if ! ls collected/wheels/*.whl >/dev/null 2>&1; then
@@ -156,10 +154,6 @@ collect:github-artifacts:
156154
echo "Error: collected GitHub Node artifacts did not contain any .tgz files." >&2
157155
exit 1
158156
fi
159-
if ! ls collected/cli-npm/*.tgz >/dev/null 2>&1; then
160-
echo "Error: collected GitHub CLI npm artifacts did not contain any .tgz files." >&2
161-
exit 1
162-
fi
163157
164158
{
165159
printf '{\n'
@@ -177,7 +171,6 @@ collect:github-artifacts:
177171
- collected/wheels/*.whl
178172
- collected/sdists/nemo_relay-*.tar.gz
179173
- collected/node/*.tgz
180-
- collected/cli-npm/*.tgz
181174
- collected/github-run.json
182175

183176
publish:artifactory:wheels:
@@ -337,8 +330,3 @@ publish:artifactory:npm:
337330
npm publish --tag dev "$package"
338331
done
339332
npm publish --tag dev "collected/node/nemo-relay-node-npm-${CI_COMMIT_TAG}.tgz"
340-
for platform in linux-x64 linux-arm64 linux-x64-musl linux-arm64-musl darwin-arm64 win32-x64 win32-arm64; do
341-
package="collected/cli-npm/nemo-relay-bin-npm-${platform}-${CI_COMMIT_TAG}.tgz"
342-
npm publish --tag dev "$package"
343-
done
344-
npm publish --tag dev "collected/cli-npm/nemo-relay-bin-npm-${CI_COMMIT_TAG}.tgz"

README.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,6 @@ Install the prebuilt CLI from PyPI:
5858
pip install nemo-relay-cli-bin
5959
```
6060

61-
Install the prebuilt CLI from npm:
62-
63-
```bash
64-
npm install --global nemo-relay-cli-bin
65-
```
66-
6761
Python API users can install the matching CLI through the optional extra:
6862

6963
```bash

RELEASING.md

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@ The release pipeline publishes these package surfaces from a tag push:
3232
|---|---|
3333
| crates.io | `nemo-relay-types`, `nemo-relay-plugin`, `nemo-relay-worker-proto`, `nemo-relay-worker`, `nemo-relay`, `nemo-relay-adaptive`, `nemo-relay-pii-redaction`, `nemo-relay-switchyard`, `nemo-relay-ffi`, `nemo-relay-cli` |
3434
| PyPI | `nemo-relay` wheels and source distribution, `nemo-relay-plugin` and `nemo-relay-cli-bin` wheels |
35-
| npm | `nemo-relay-node` and its seven platform packages, `nemo-relay-openclaw`, `nemo-relay-cli-bin`, and its seven platform packages |
36-
| GitHub Releases | CLI binaries, `nemo-relay` and `nemo-relay-cli-bin` wheels, CLI and Node npm tarballs, and checksums |
35+
| npm | `nemo-relay-node` and its seven platform packages, and `nemo-relay-openclaw` |
36+
| GitHub Releases | CLI binaries, `nemo-relay` and `nemo-relay-cli-bin` wheels, Node npm tarballs, and checksums |
3737
| Fern | The documentation site |
3838

3939
Go remains source-first. There is no separate Go package-manager publication
4040
step in the repository release workflow.
4141

42+
The former npm `nemo-relay-cli-bin` metapackage and its seven platform
43+
packages are retired and must not be republished.
44+
4245
The mirrored GitLab pipeline also publishes the same tag's collected package
4346
artifacts to NVIDIA Artifactory. It is driven by the tag push, not by a GitLab
4447
pipeline schedule.
@@ -61,9 +64,8 @@ NeMo Relay versions are anchored on the workspace SemVer in the repository root
6164
lock entries and must be updated with it.
6265
- `integrations/openclaw/package.json` carries the base npm version for the
6366
OpenClaw plugin package and must stay aligned with the same release version.
64-
- `packages/cli-bin/package.json` and `python/cli-bin/pyproject.toml` carry the
65-
base CLI package versions in their registry-specific SemVer and PEP 440
66-
spellings. The `nemo-relay[cli]` extra must pin the exact PyPI version.
67+
- `python/cli-bin/pyproject.toml` carries the base CLI package version in its
68+
PEP 440 spelling. The `nemo-relay[cli]` extra must pin the exact PyPI version.
6769
- The Python package version is derived at packaging time. `pyproject.toml`
6870
stays `dynamic = ["version"]` in the repository, and the packaging recipe
6971
writes a concrete version into `pyproject.toml` and `crates/python/Cargo.toml`
@@ -151,11 +153,6 @@ Before you create a release tag, confirm the following:
151153
`nemo-relay-node-linux-x64-musl`, `nemo-relay-node-linux-arm64-musl`,
152154
`nemo-relay-node-darwin-arm64`, `nemo-relay-node-win32-x64-msvc`, and
153155
`nemo-relay-node-win32-arm64-msvc`
154-
- npm trusted publishers are configured for `nemo-relay-cli-bin` and
155-
`nemo-relay-cli-bin-linux-x64`, `nemo-relay-cli-bin-linux-arm64`,
156-
`nemo-relay-cli-bin-linux-x64-musl`, `nemo-relay-cli-bin-linux-arm64-musl`,
157-
`nemo-relay-cli-bin-darwin-arm64`, `nemo-relay-cli-bin-win32-x64`, and
158-
`nemo-relay-cli-bin-win32-arm64`
159156
5. The GitHub Release entry is ready to become the only canonical release-notes
160157
surface.
161158

@@ -182,7 +179,7 @@ The helper updates:
182179
4. [`integrations/openclaw/package.json`](integrations/openclaw/package.json)
183180
and the `integrations/openclaw` entry in the root
184181
[`package-lock.json`](package-lock.json) to the same release version.
185-
5. The Python and npm `nemo-relay-cli-bin` metadata, including the exact
182+
5. The Python `nemo-relay-cli-bin` metadata, including the exact
186183
`nemo-relay[cli]` dependency version.
187184
Review docs and snippets that mention explicit versions, including:
188185

@@ -268,18 +265,15 @@ The release pipeline then:
268265
- `package-python-plugin` builds the `nemo-relay-plugin` wheel.
269266
- The Rust CLI matrix builds GNU Linux binaries in manylinux containers and
270267
musl Linux binaries natively, validates each in its matching container, and
271-
packages each prebuilt binary as a
272-
`nemo-relay-cli-bin` wheel and npm platform package, and creates the npm
273-
launcher package once.
268+
packages each prebuilt binary as a `nemo-relay-cli-bin` wheel.
274269
- The distribution release-asset job uploads the CLI binaries, `nemo-relay`
275-
API wheels, CLI wheels, CLI npm packages, and split Node npm packages.
270+
API wheels, CLI wheels, and split Node npm packages.
276271
`SHA256SUMS` covers every attached distribution artifact, and raw CLI
277272
binaries also receive individual `.sha256` files for installer
278273
compatibility.
279274
GitHub-facing npm artifacts use
280-
`nemo-relay-bin-npm[-<os>-<cpu>]-<version>.tgz` for the CLI and
281-
`nemo-relay-node-npm[-<os>-<cpu>]-<version>.tgz` for Node.js; their
282-
registry package names remain in the tarball manifests.
275+
`nemo-relay-node-npm[-<os>-<cpu>]-<version>.tgz`; their registry package
276+
names remain in the tarball manifests.
283277
4. Publishes packages from the top-level workflow after the reusable packaging
284278
jobs complete:
285279
- `publish-rust` stamps Cargo workspace versions from the release tag, then
@@ -293,8 +287,8 @@ The release pipeline then:
293287
artifacts plus the `nemo-relay-plugin` and `nemo-relay-cli-bin` wheels,
294288
then uploads them to PyPI with trusted publishing from the top-level
295289
workflow
296-
- `publish-npm` publishes the Node.js and CLI native packages before their
297-
metapackages, then publishes the OpenClaw package, through npm trusted
290+
- `publish-npm` publishes the Node.js native packages before their
291+
metapackage, then publishes the OpenClaw package, through npm trusted
298292
publishing from the top-level workflow
299293
- Stable tags publish to the npm `latest` dist-tag
300294
- Prerelease tags such as `0.1.0-rc.1` publish to the npm `next`
@@ -329,8 +323,7 @@ npm trusted publishing has its own registry-side constraints:
329323

330324
- Each npm package can only have one trusted publisher configured at a time.
331325
- Configure trusted publishers for `nemo-relay-node`, all seven Node platform
332-
packages, `nemo-relay-openclaw`, `nemo-relay-cli-bin`, and all seven CLI
333-
platform packages before pushing a release tag.
326+
packages, and `nemo-relay-openclaw` before pushing a release tag.
334327
- npm trusted publishing currently supports GitHub-hosted runners, not
335328
self-hosted runners.
336329

@@ -363,8 +356,8 @@ After the release is live, verify:
363356
are visible on crates.io.
364357
2. The `nemo-relay` and `nemo-relay-cli-bin` wheels are visible on PyPI, and
365358
`pip install "nemo-relay[cli]"` exposes `nemo-relay`.
366-
3. The `nemo-relay-node`, its seven platform packages, `nemo-relay-openclaw`,
367-
`nemo-relay-cli-bin`, and its seven platform packages are visible on npm.
359+
3. The `nemo-relay-node`, its seven platform packages, and
360+
`nemo-relay-openclaw` are visible on npm.
368361
4. The Unix and Windows installers resolve the new stable tag and verify
369362
matching CLI release asset checksums on their supported platforms.
370363
5. The Fern documentation site shows the expected version and release notes.

crates/cli/README.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,6 @@ Install the prebuilt CLI from PyPI:
6868
pip install nemo-relay-cli-bin
6969
```
7070

71-
Install the prebuilt CLI from npm:
72-
73-
```bash
74-
npm install --global nemo-relay-cli-bin
75-
```
76-
7771
Install the Python API and matching CLI with the optional extra:
7872

7973
```bash

docs/getting-started/installation.mdx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ pip install "nemo-relay[cli]"
4545
```
4646
</Tab>
4747

48-
<Tab title="npm">
49-
```bash
50-
npm install --global nemo-relay-cli-bin
51-
```
52-
</Tab>
53-
5448
<Tab title="Unix shell">
5549
```bash
5650
curl -fsSL https://raw.githubusercontent.com/NVIDIA/NeMo-Relay/main/install.sh | sh
@@ -114,9 +108,9 @@ user `PATH`; the Unix installer does not edit shell configuration.
114108
Use the GNU target on glibc-based distributions such as Ubuntu, Debian, and
115109
RHEL. Use the musl target on Alpine Linux and other musl-based systems. The
116110
Unix shell installer intentionally selects the portable musl target on Linux.
117-
For package versions that publish the corresponding artifacts, `pip`, `uv`, and
118-
`npm` automatically select a target compatible with the host CPU and C library
119-
on supported platforms.
111+
For package versions that publish the corresponding artifacts, `pip` and `uv`
112+
automatically select a target compatible with the host CPU and C library on
113+
supported platforms.
120114

121115
The installer reports the detected operating system and architecture when no
122116
matching asset exists. Intel macOS is not supported because no matching release
@@ -186,7 +180,7 @@ new download before replacing the binary in the selected installation directory.
186180

187181
### Alternative Installation Methods
188182

189-
The PyPI, npm, and installer methods install the same CLI release with a binary
183+
The PyPI and installer methods install the same CLI release with a binary
190184
compatible with the host platform. Use Cargo on unsupported platforms or when
191185
you prefer to build from source:
192186

justfile

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,6 @@ set_node_package_versions() {
564564
local version="$1"
565565
set_npm_package_version crates/node/package.json package-lock.json "$version" crates/node
566566
set_npm_package_version integrations/openclaw/package.json package-lock.json "$version" integrations/openclaw
567-
set_npm_package_version packages/cli-bin/package.json package-lock.json "$version" packages/cli-bin
568567
set_npm_package_dependency_version integrations/openclaw/package.json package-lock.json integrations/openclaw nemo-relay-node "$version"
569568
}
570569
@@ -1769,8 +1768,8 @@ package-python-plugin:
17691768
exit 1
17701769
fi
17711770
1772-
# Package a prebuilt CLI binary for PyPI and npm.
1773-
package-cli-bin binary target version package_dir npm_launcher="false":
1771+
# Package a prebuilt CLI binary for PyPI.
1772+
package-cli-bin binary target version package_dir:
17741773
#!/usr/bin/env bash
17751774
set -euo pipefail
17761775
cd "$NEMO_RELAY_REPO_ROOT"
@@ -1780,7 +1779,4 @@ package-cli-bin binary target version package_dir npm_launcher="false":
17801779
--version "{{ version }}"
17811780
--output-dir "{{ package_dir }}"
17821781
)
1783-
if [[ "{{ npm_launcher }}" == "true" ]]; then
1784-
args+=(--npm-launcher)
1785-
fi
17861782
uv run --no-project python scripts/package-cli-bin.py "${args[@]}"

0 commit comments

Comments
 (0)