Skip to content

Commit 39e4688

Browse files
authored
Forward-merge release/0.7 into main
Forward-merge release/0.7 into main
2 parents c2c3db3 + ba13a12 commit 39e4688

93 files changed

Lines changed: 3341 additions & 874 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.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: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,28 @@ jobs:
254254
cache-bin: false
255255
save-if: false
256256

257+
- uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8
258+
with:
259+
version: ${{ steps.ci-config.outputs.uv_version }}
260+
261+
- uses: taiki-e/install-action@c070f87102a1c75b3183910f391c1cb887fe13c8 # v2.77.6
262+
with:
263+
tool: just@${{ steps.ci-config.outputs.just_version }}
264+
265+
- name: Set CLI binary version
266+
working-directory: ${{ env.NEMO_RELAY_CI_WORKSPACE }}
267+
env:
268+
REF_NAME: ${{ github.ref_name }}
269+
REF_TYPE: ${{ github.ref_type }}
270+
run: |
271+
set -euo pipefail
272+
version="$REF_NAME"
273+
if [[ "$REF_TYPE" != "tag" ]]; then
274+
version="$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -n1)+${GIT_COMMIT::8}"
275+
fi
276+
just set-cargo-version "$version"
277+
printf 'NEMO_RELAY_CLI_PACKAGE_VERSION=%s\n' "$version" >> "$GITHUB_ENV"
278+
257279
- name: Install musl tools
258280
if: ${{ startsWith(matrix.target, 'x86_64-unknown-linux-musl') || startsWith(matrix.target, 'aarch64-unknown-linux-musl') }}
259281
run: |
@@ -300,8 +322,17 @@ jobs:
300322
docker run --rm \
301323
--volume "${{ env.NEMO_RELAY_CI_WORKSPACE }}:${{ env.NEMO_RELAY_CI_WORKSPACE }}" \
302324
--workdir "${{ env.NEMO_RELAY_CI_WORKSPACE }}" \
325+
--env NEMO_RELAY_CI_WORKSPACE \
326+
--env NEMO_RELAY_CLI_PACKAGE_VERSION \
303327
"${{ matrix.runtime_image }}" \
304-
"${{ env.NEMO_RELAY_CI_WORKSPACE }}/target/${{ matrix.target }}/release/nemo-relay" --version
328+
/bin/sh -ec '
329+
actual="$("$NEMO_RELAY_CI_WORKSPACE/target/${{ matrix.target }}/release/nemo-relay" --version)"
330+
expected="nemo-relay $NEMO_RELAY_CLI_PACKAGE_VERSION"
331+
if [ "$actual" != "$expected" ]; then
332+
echo "Error: expected CLI version \"$expected\", got \"$actual\"" >&2
333+
exit 1
334+
fi
335+
'
305336
306337
- name: Stage CLI binary artifact
307338
working-directory: ${{ env.NEMO_RELAY_CI_WORKSPACE }}
@@ -327,7 +358,7 @@ jobs:
327358
mkdir -p "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli"
328359
cp "$source" "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli/${asset}"
329360
330-
- name: Package CLI binary for PyPI and npm
361+
- name: Package CLI binary for PyPI
331362
working-directory: ${{ env.NEMO_RELAY_CI_WORKSPACE }}
332363
run: |
333364
set -euo pipefail
@@ -337,22 +368,14 @@ jobs:
337368
binary="${binary}.exe"
338369
fi
339370
source="${NEMO_RELAY_CI_WORKSPACE}/target/${target}/release/${binary}"
340-
version="${{ github.ref_name }}"
341-
if [ "${{ github.ref_type }}" != "tag" ]; then
342-
version="$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -n1)+${GIT_COMMIT::8}"
343-
fi
371+
version="$NEMO_RELAY_CLI_PACKAGE_VERSION"
344372
rm -rf "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-packages"
345373
mkdir -p "${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-packages"
346-
args=(
347-
--binary "$source"
348-
--target "$target"
349-
--version "$version"
374+
python scripts/package-cli-bin.py \
375+
--binary "$source" \
376+
--target "$target" \
377+
--version "$version" \
350378
--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[@]}"
356379
357380
- name: Install and run CLI wheel
358381
if: ${{ !endsWith(matrix.target, '-musl') }}
@@ -369,7 +392,12 @@ jobs:
369392
venv_cli="${NEMO_RELAY_CI_WORKSPACE_TMP}/cli-wheel-venv/bin/nemo-relay"
370393
fi
371394
"$venv_python" -m pip install --force-reinstall --no-deps "${wheels[0]}"
372-
"$venv_cli" --version
395+
actual="$("$venv_cli" --version)"
396+
expected="nemo-relay $NEMO_RELAY_CLI_PACKAGE_VERSION"
397+
if [[ "$actual" != "$expected" ]]; then
398+
echo "Error: expected CLI version '$expected', got '$actual'" >&2
399+
exit 1
400+
fi
373401
374402
- name: Install and run CLI wheel on musllinux
375403
if: ${{ endsWith(matrix.target, '-musl') }}
@@ -380,13 +408,19 @@ jobs:
380408
--volume "${{ env.NEMO_RELAY_CI_WORKSPACE }}:${{ env.NEMO_RELAY_CI_WORKSPACE }}" \
381409
--workdir "${{ env.NEMO_RELAY_CI_WORKSPACE }}" \
382410
--env NEMO_RELAY_CI_WORKSPACE_TMP \
411+
--env NEMO_RELAY_CLI_PACKAGE_VERSION \
383412
"${{ matrix.runtime_image }}" \
384413
/bin/sh -ec '
385414
wheel="$(find "$NEMO_RELAY_CI_WORKSPACE_TMP/cli-packages" -maxdepth 1 -name "*.whl" -print -quit)"
386415
test -n "$wheel"
387416
/opt/python/cp311-cp311/bin/python -m venv /tmp/nemo-relay-cli-wheel-venv
388417
/tmp/nemo-relay-cli-wheel-venv/bin/python -m pip install --force-reinstall --no-deps "$wheel"
389-
/tmp/nemo-relay-cli-wheel-venv/bin/nemo-relay --version
418+
actual="$(/tmp/nemo-relay-cli-wheel-venv/bin/nemo-relay --version)"
419+
expected="nemo-relay $NEMO_RELAY_CLI_PACKAGE_VERSION"
420+
if [ "$actual" != "$expected" ]; then
421+
echo "Error: expected CLI version \"$expected\", got \"$actual\"" >&2
422+
exit 1
423+
fi
390424
'
391425
392426
- name: Upload CLI binary artifact
@@ -402,10 +436,3 @@ jobs:
402436
name: cli-python-wheel-${{ matrix.platform }}
403437
path: ${{ env.NEMO_RELAY_CI_WORKSPACE_TMP }}/cli-packages/*.whl
404438
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

0 commit comments

Comments
 (0)