Skip to content

feat: add verified CLI installers#354

Merged
rapids-bot[bot] merged 18 commits into
NVIDIA:mainfrom
bbednarski9:feat/install-script
Jul 2, 2026
Merged

feat: add verified CLI installers#354
rapids-bot[bot] merged 18 commits into
NVIDIA:mainfrom
bbednarski9:feat/install-script

Conversation

@bbednarski9

@bbednarski9 bbednarski9 commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Overview

Add verified GitHub Release installation paths for the NeMo Relay CLI across every currently published Unix and Windows asset, without requiring Rust or cargo-binstall.

  • I confirm this contribution is my own work, or I have the right to submit it under this project’s license.
  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Details

  • Add install.ps1 for Windows PowerShell 5.1 and PowerShell 7: latest or NEMO_RELAY_VERSION selection, Windows x86_64/ARM64 detection, SHA-256 verification, atomic replacement, and idempotent user/current-process PATH updates that preserve expandable user-PATH values.
  • Extend install.sh for Git Bash, MSYS, Cygwin, and MINGW Windows targets while preserving the existing Unix installation flow.
  • Validate every published target with live installer tests: Linux x86_64/ARM64, macOS ARM64, and Windows x86_64/ARM64. Path filtering runs this matrix only when installer-related files change.
  • Make Fern the full installation reference: tab platform-specific installer commands and interface tables, document version pinning and custom-directory PATH behavior, fix the CLI README anchor, and add generic Hermes Agent plugin enablement that resolves the latest PyPI NeMo Relay release.

Validation:

  • sh -n install.sh, sh -n scripts/test-install.sh, and sh -n scripts/test-install-mocks.sh
  • sh scripts/test-install-mocks.sh — 8 scenarios passed
  • PowerShell parser validation plus a real pinned-to-latest Windows-asset replacement smoke test with checksum verification
  • Disposable Python 3.12 environment: unpinned hermes-agent and nemo-relay resolved nemo-relay==0.4.0; hermes plugins enable observability/nemo_relay succeeded
  • just docs
  • Targeted pre-commit checks passed. The full pre-commit run passed its non-attribution hooks, but the local Python attribution generator was interrupted after prolonged network-bound metadata retrieval.

Breaking changes: none.

Where should the reviewer start?

Start with install.ps1 for native Windows behavior, then review the full target matrix in .github/workflows/ci_check.yml and Fern’s installation page for the cross-platform commands, interface reference, and Hermes plugin setup.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

  • Relates to: none

Summary by CodeRabbit

  • New Features
    • Introduced one-command NeMo Relay CLI installers for Unix and Windows with automatic version selection, SHA-256 checksum verification, safe install/upgrade behavior, and configurable install locations.
  • Documentation
    • Updated installation guides and CLI README to reflect the curl/PowerShell installer flow, verification steps, platform/PATH behavior, and added a Hermes Agent integration section.
  • CI & Testing
    • Added conditional installer validation in CI across supported platforms/architectures, expanded live and mocked installer test coverage, and updated stable release post-checks.

Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@github-actions github-actions Bot added size:L PR is large Feature a new feature labels Jul 2, 2026
@bbednarski9 bbednarski9 marked this pull request as ready for review July 2, 2026 17:28
@bbednarski9 bbednarski9 requested review from a team and lvojtku as code owners July 2, 2026 17:28
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds cross-platform installer scripts, installer-focused CI gating and tests, and updates release and user docs for the new installation flow.

Changes

Installer rollout and CI gating

Layer / File(s) Summary
Shell installer setup and argument parsing
install.sh
Strict-mode setup, helper functions, argument parsing, and default install-dir resolution for the POSIX installer.
Version, platform, and install path resolution
install.sh
Resolves release version, maps OS/arch to targets, builds asset URLs, validates the install directory, and handles non-Windows PATH messaging.
Shell installer test harnesses
scripts/test-install.sh, scripts/test-install-mocks.sh, scripts/README.md
Adds live and mocked shell test coverage for interface validation, install flows, platform mapping, checksum/error handling, and command references.
PowerShell installer script
install.ps1
Adds the Windows installer with version/target resolution, download and checksum validation, binary replacement, PATH updates, and top-level error handling.
PowerShell installer test harness
scripts/test-install.ps1
Adds PowerShell assertions and scenarios covering help, version validation, install, PATH updates, and cleanup.
CI job wiring and path filters
.github/ci-path-filters.yml, .github/workflows/ci_check.yml, .github/workflows/ci_changes.yml, .github/workflows/ci.yaml
Adds installer path filters, threads run_installer through workflows, and adds installer CI jobs.
Documentation updates
README.md, RELEASING.md, crates/cli/README.md, docs/getting-started/installation.mdx, docs/nemo-relay-cli/about.mdx
Updates install and release docs for the new installer flow, checksum behavior, supported platforms, and Cargo/source fallback.

Estimated code review effort: 4 (Complex) | ~60 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the installer-focused changes.
Description check ✅ Passed The description matches the template with Overview, Details, reviewer start, and checklist items; only related issues is minimally filled.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci_check.yml:
- Around line 44-45: The Checkout step in the CI workflow is still using the
default actions/checkout behavior that persists git credentials, which is
unnecessary for this job. Update the checkout configuration in the workflow so
the Checkout step explicitly disables credential persistence by setting
persist-credentials to false on actions/checkout, keeping the rest of the
ci_check job unchanged.

In `@docs/getting-started/installation.mdx`:
- Around line 105-106: The rerun note in the installation guide hardcodes the
default binary path, which is inaccurate when a custom install directory is
chosen. Update the wording in the installation copy to refer to the binary in
the selected `--install-dir` destination, and make sure the sentence stays
consistent with the install flow described by the installer documentation.

In `@install.sh`:
- Around line 87-90: The installer’s curl-based network calls can hang
indefinitely because no timeout is set. Update the curl invocations used for the
latest release lookup, asset download, and checksum download in install.sh to
include both connection and overall timeout options, and make sure the existing
error handling still triggers through the release lookup and download helper
paths.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 9d038c9b-434c-41df-ac68-31ada5ac31bf

📥 Commits

Reviewing files that changed from the base of the PR and between ae15a68 and 0959310.

📒 Files selected for processing (9)
  • .github/workflows/ci_check.yml
  • README.md
  • RELEASING.md
  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • docs/nemo-relay-cli/about.mdx
  • install.sh
  • scripts/README.md
  • scripts/test-install.sh
📜 Review details
🧰 Additional context used
📓 Path-based instructions (29)
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)

Documentation must be updated if activation or usage changed

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links ...

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
**/{docs,examples,**/*.md,*.patch,*.diff,.github,*.sh,*.yaml,*.yml}

📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)

Update documentation, examples, CI configuration, and patch artifacts when performing rename operations

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • install.sh
  • scripts/test-install.sh
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
{scripts/**,third-party/**}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

{scripts/**,third-party/**}: For third-party integration or patch changes, run patch validation with ./scripts/apply-patches.sh --check and relevant integration tests. Keep root ./scripts/*.sh wrappers for third-party flows
Run third-party patch bootstrap with ./scripts/bootstrap-third-party.sh
Run third-party patch validation with ./scripts/apply-patches.sh --check

Files:

  • scripts/README.md
  • scripts/test-install.sh
{docs/**,README.md,CONTRIBUTING.md,**/*.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Run docs link validation with just docs-linkcheck when links change

Files:

  • scripts/README.md
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
{docs/**,README.md,**/Cargo.toml,**/package.json,**/*.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Ensure renamed public surfaces are reflected consistently in manifests and docs for large or public-facing changes

Files:

  • scripts/README.md
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
**/*.{md,mdx,py,sh,yaml,yml,toml,json}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Keep package names, repo references, and build commands current

Files:

  • scripts/README.md
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • install.sh
  • scripts/test-install.sh
**/*.{html,md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license header in HTML and Markdown files using HTML comment syntax

Files:

  • scripts/README.md
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant crate or package README when that surface changed

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
**/*.{rs,py,js,ts,tsx,jsx,go,sh,toml,yaml,yml,md}

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files. The project is Apache-2.0.

Files:

  • scripts/README.md
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • install.sh
  • scripts/test-install.sh
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • scripts/README.md
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/README.md
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • install.sh
  • scripts/test-install.sh
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.

Files:

  • scripts/README.md
  • .github/workflows/ci_check.yml
  • scripts/test-install.sh
.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

.github/workflows/*.{yml,yaml}: Put permissions: on each job that needs token access in GitHub Actions workflows
Avoid workflow-level permissions unless the repository intentionally centralizes them and the inheritance tradeoff is documented
Keep third-party actions pinned to full commit SHAs and preserve the readable version comment after the SHA
Prefer action-native or ecosystem-native caching over generic actions/cache
Use lockfiles or dependency manifests to drive cache invalidation in GitHub Actions workflows
Keep deploy and publish permissions isolated to the jobs that need them in GitHub Actions
Read both caller and callee when a workflow uses workflow_call in GitHub Actions
Put release-tag validation in the earliest practical caller job when the pipeline has tag-based publish behavior
Keep release-tag policy aligned with RELEASING.md: raw SemVer tags only, no leading v
contents: read is the default minimum permission for checkout-based build, test, docs, and packaging jobs
pull-requests: read is required for PR metadata lookup jobs in GitHub Actions workflows
pages: write and id-token: write should be limited to Pages deployment jobs and callers that invoke them through reusable workflows
For reusable workflows, the caller must grant every permission the called jobs require; the callee cannot elevate beyond what the caller provides
Prefer astral-sh/setup-uv cache support with cache-dependency-glob anchored to uv.lock
Prefer Swatinem/rust-cache with explicit shared-key and workspaces instead of ad hoc target-directory caching
Avoid caching generated outputs that can hide stale behavior unless the repo already relies on them deliberately

Files:

  • .github/workflows/ci_check.yml
.{github/workflows/*.{yml,yaml},gitlab-ci.yml}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Ensure CI workflows reference the same package names, install commands, and build commands as local development workflows

Files:

  • .github/workflows/ci_check.yml
{docs/**,README.md,CONTRIBUTING.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

{docs/**,README.md,CONTRIBUTING.md}: For docs-only changes, run targeted checks only if commands, package names, or examples changed. Use just docs for docs-site builds and just docs-linkcheck when links changed
Run docs site build with just docs

Files:

  • docs/nemo-relay-cli/about.mdx
  • README.md
  • docs/getting-started/installation.mdx
{docs/**,README.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Verify README and docs entry points still match current package names and paths for large or public-facing changes

Files:

  • docs/nemo-relay-cli/about.mdx
  • README.md
  • docs/getting-started/installation.mdx
{docs/**,examples/**,README.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Verify examples still run with documented commands for large or public-facing changes

Files:

  • docs/nemo-relay-cli/about.mdx
  • README.md
  • docs/getting-started/installation.mdx
**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close. Do not use HTML comments for MDX SPDX headers.

MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)

Files:

  • docs/nemo-relay-cli/about.mdx
  • docs/getting-started/installation.mdx
docs/**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update embedded documentation snippets, patch docs, and binding-support notes if examples or supported bindings changed

Files:

  • docs/nemo-relay-cli/about.mdx
  • docs/getting-started/installation.mdx
docs/**

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run just docs or ./scripts/build-docs.sh html to regenerate ignored Fern API reference pages before validation for documentation site changes

Files:

  • docs/nemo-relay-cli/about.mdx
  • docs/getting-started/installation.mdx
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.

Files:

  • docs/nemo-relay-cli/about.mdx
  • README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
{README.md,docs/getting-started/**/*.md}

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Update README.md, docs/getting-started/, or binding-level READMEs if behavior differs by language or usage changed

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update README.md to reflect current workspace members and top-level documentation when workspace structure changes

Files:

  • README.md
{README.md,docs/**/*.{md,rst,txt},fern/**/*}

📄 CodeRabbit inference engine (.agents/skills/prepare-code-freeze/SKILL.md)

Search and update documentation source for references to the old version in README.md, docs, and fern directories, updating current-version install commands, package examples, and configuration examples to <next-version>

Files:

  • README.md
RELEASING.md

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Ensure public packaging changes are reflected in release-facing documentation and RELEASING.md

Files:

  • RELEASING.md
{CHANGELOG.md,RELEASING.md,docs/**/*.md}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Release history and release notes must reference GitHub Releases, not CHANGELOG.md or docs pages

Files:

  • RELEASING.md
🧠 Learnings (1)
📚 Learning: 2026-05-03T04:23:07.497Z
Learnt from: willkill07
Repo: NVIDIA/NeMo-Flow PR: 46
File: .github/workflows/ci_rust.yml:31-64
Timestamp: 2026-05-03T04:23:07.497Z
Learning: In GitHub Actions workflow YAML, it’s valid to conditionally disable a service container by setting the service container’s `image` to an empty string (`''`) via a matrix variable (e.g., `redis_service_image: ''`). This intentionally makes the runner skip service initialization for that matrix entry rather than failing the job. When reviewing workflows, don’t flag this as an error if the workflow uses an empty `image` to disable the service on specific matrix entries (e.g., OS-specific setups); verify the `image` is sourced from the matrix variable and that the service is only expected to be available when a non-empty image is provided.

Applied to files:

  • .github/workflows/ci_check.yml
🪛 Shellcheck (0.11.0)
scripts/test-install.sh

[warning] 7-7: Remove space after = if trying to assign a value (for empty string, use var='' ... ).

(SC1007)

🪛 zizmor (1.26.1)
.github/workflows/ci_check.yml

[warning] 44-45: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🔇 Additional comments (11)
README.md (1)

54-67: LGTM!

RELEASING.md (1)

323-326: LGTM!

crates/cli/README.md (1)

54-97: LGTM!

docs/getting-started/installation.mdx (2)

33-43: LGTM!


57-104: LGTM!

Also applies to: 107-124

docs/nemo-relay-cli/about.mdx (1)

14-21: LGTM!

scripts/test-install.sh (2)

39-42: 🎯 Functional Correctness

Confirm assert_no_temporary_files behavior — non-obvious but correct.

set -- "$1"/.nemo-relay.* reassigns positional parameters via glob expansion, then reuses $1. Traced through: with no matches the pattern remains literal (fails -e), and with any match(es) $1 becomes an existing leftover file (glob results are typically sorted, so this catches leftovers regardless of which temp file remains). This works, but the reuse of $1 after set -- is easy to misread on a future edit.


136-260: LGTM! Good coverage of version precedence, platform mapping, checksum failure paths, replacement safety, and cleanup.

install.sh (1)

1-169: LGTM! Argument parsing, platform detection, checksum verification, and atomic install-via-mktemp+mv are all sound, and the version regex prevents any injection risk from user-supplied VERSION.

.github/workflows/ci_check.yml (1)

36-52: LGTM! Job is scoped to minimum contents: read permission with a pinned checkout action, and runs the syntax check plus test harness as intended.

scripts/README.md (1)

8-25: LGTM! Documentation accurately reflects the new test-install.sh script and directory layout, and follows monospace formatting conventions for filenames.

Comment thread .github/workflows/ci_check.yml
Comment thread docs/getting-started/installation.mdx Outdated
Comment thread install.sh Outdated
Comment thread install.sh Outdated
Comment thread docs/getting-started/installation.mdx
Comment thread docs/getting-started/installation.mdx

@mnajafian-nv mnajafian-nv left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM overall. Thanks for driving the installer path forward. Conditional approval pending review of the inline suggestions.

@willkill07 willkill07 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • environment-variable only configuration
  • support all platforms (example)
  • documentation:
    • clearly separate when to use install.sh vs cargo install vs cargo binstall
  • testing:
    • mock -> real testing
      • easier than you think
      • run command -> dump to text file
      • analyze file
    • should be done on all platforms
    • should only be done if install.sh changes

Comment thread .github/workflows/ci_check.yml
Comment thread crates/cli/README.md Outdated
Comment thread crates/cli/README.md Outdated
Comment thread crates/cli/README.md Outdated
Comment thread crates/cli/README.md
Comment thread docs/getting-started/installation.mdx Outdated
Comment thread docs/getting-started/installation.mdx
Comment thread scripts/README.md Outdated
Comment thread scripts/test-install.sh
Comment thread README.md Outdated
@willkill07 willkill07 added this to the 0.5 milestone Jul 2, 2026
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/getting-started/installation.mdx (1)

83-87: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Call out the PATH requirement after --install-dir.

The custom-directory example installs nemo-relay outside the default location, but the guide does not tell readers to add that directory to PATH before running the command. That makes the example easy to copy into a setup that still cannot find nemo-relay.

♻️ Proposed fix
 Install into another directory:
 
 ```bash
 curl -fsSL https://raw.githubusercontent.com/NVIDIA/NeMo-Relay/main/install.sh | sh -s -- --install-dir "$HOME/bin"

+If that directory is not on PATH, add it before running nemo-relay.

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @docs/getting-started/installation.mdx around lines 83 - 87, The custom
install example in the installation guide omits the PATH requirement, so readers
may install nemo-relay into a non-default directory and still be unable to run
it. Update the Install into another directory section to explicitly note that
after using --install-dir (for example with nemo-relay in the install
command), the target directory such as $HOME/bin must be added to PATH
before invoking the CLI.


</details>

<!-- cr-comment:v1:a126c4e616be4c8723cdbd62 -->

_Source: Path instructions_

</blockquote></details>

</blockquote></details>
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/getting-started/installation.mdx`:
- Around line 83-87: The custom install example in the installation guide omits
the PATH requirement, so readers may install `nemo-relay` into a non-default
directory and still be unable to run it. Update the `Install into another
directory` section to explicitly note that after using `--install-dir` (for
example with `nemo-relay` in the install command), the target directory such as
`$HOME/bin` must be added to `PATH` before invoking the CLI.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: e9d677dc-48ac-4b53-98ee-64143e3b6c82

📥 Commits

Reviewing files that changed from the base of the PR and between b30950b and 8255f74.

📒 Files selected for processing (4)
  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • install.sh
  • scripts/test-install.sh
📜 Review details
⏰ Context from checks skipped due to timeout. (21)
  • GitHub Check: Rust / Test (linux-amd64)
  • GitHub Check: Rust / Test (linux-arm64)
  • GitHub Check: Go / Test (windows-arm64)
  • GitHub Check: Rust / Test (macos-arm64)
  • GitHub Check: Node.js / Test (macos-arm64)
  • GitHub Check: Go / Test (linux-arm64)
  • GitHub Check: Rust / Test (windows-arm64)
  • GitHub Check: Rust / Test (windows-amd64)
  • GitHub Check: Go / Test (macos-arm64)
  • GitHub Check: Go / Test (windows-amd64)
  • GitHub Check: Python / Test (macos-arm64)
  • GitHub Check: Node.js / Test (linux-arm64)
  • GitHub Check: Python / Test (windows-arm64)
  • GitHub Check: Python / Test (linux-amd64)
  • GitHub Check: Go / Test (linux-amd64)
  • GitHub Check: Python / Test (linux-arm64)
  • GitHub Check: Node.js / Test (linux-amd64)
  • GitHub Check: Python / Test (windows-amd64)
  • GitHub Check: Node.js / Test (windows-arm64)
  • GitHub Check: Node.js / Test (windows-amd64)
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (15)
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • crates/cli/README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • crates/cli/README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • crates/cli/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • crates/cli/README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-technical-docs.md)

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links that pull readers away from a procedure unless the link is a p...

Files:

  • crates/cli/README.md
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files.

Files:

  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • install.sh
  • scripts/test-install.sh
**/*.{rs,go,js,ts,py,html,md,mdx,toml,yml,yaml,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all source files using the correct comment syntax for the file type.

Files:

  • crates/cli/README.md
  • docs/getting-started/installation.mdx
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/*.{md,mdx}: Prefer the documented public API rather than internal shortcuts.
Keep package names, repository references, and build commands current.
Update entry-point docs when examples or reading paths change.
Keep release-process and release-notes guidance in repository-maintainer docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md.
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work.
When detailed dynamic plugin guides exist, keep Rust native plugin examples, Python worker plugin examples, and grpc-v1 protocol details on separate pages.
Dynamic plugin manifests in docs and examples should use compat.relay = ">=0.5,<1.0" unless deliberately narrower.
Update relevant getting-started or reference docs when the associated behavior or examples change.
Ensure example commands still match current package names and paths.
Dynamic plugin entry pages should link to native, worker, Rust example, Python example, and protocol pages when those pages exist.
When the docs site changes, run just docs; ./scripts/build-docs.sh html remains the compatibility wrapper.

**/*.{md,mdx}: Document native and worker plugins as trusted extensions: native plugins are in-process and unsandboxed, while worker plugins provide process isolation but not a security sandbox.
When detailed dynamic plugin guides exist, keep Rust native, Python worker, and grpc-v1 protocol details on separate pages.

Files:

  • crates/cli/README.md
  • docs/getting-started/installation.mdx
**/README.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/README.md: Update README.md when entry points change.
Update relevant package or crate README.md files when examples or binding guidance changes.

Files:

  • crates/cli/README.md
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • install.sh
  • scripts/test-install.sh
**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)

**/*.mdx: In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close; do not use HTML comments for MDX SPDX headers.
New or regenerated MDX files must use {/* ... */} for top-of-file SPDX comments.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

docs/**/*.{md,mdx}: Keep documentation under docs/ valid for Fern tooling and external links, including Markdown/MDX link checks where applicable.
Update relevant reference docs and embedded examples when public behavior, bindings, examples, or workspace structure change.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)

Update documentation if activation or usage changes

Files:

  • docs/getting-started/installation.mdx
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.

Files:

  • docs/getting-started/installation.mdx
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.

Files:

  • scripts/test-install.sh
🔇 Additional comments (5)
install.sh (1)

16-29: LGTM!

Also applies to: 72-72

scripts/test-install.sh (2)

156-159: LGTM!

Also applies to: 188-189, 213-214, 225-226, 246-247, 261-262, 274-275


301-306: 🎯 Functional Correctness

No change needed for the empty-HOME case. install_dir is derived with ${HOME:+${HOME}/.local/bin}, so HOME="" leaves it empty and the install directory must not be empty guard is the right failure path.

crates/cli/README.md (1)

54-95: LGTM!

docs/getting-started/installation.mdx (1)

30-82: LGTM!

Also applies to: 89-114

Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Comment thread crates/cli/README.md Outdated
Comment thread docs/getting-started/installation.mdx Outdated
Comment thread docs/getting-started/installation.mdx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci_check.yml:
- Around line 74-75: The live installer test step is making unauthenticated
GitHub release/asset requests on every matrix runner, which can hit rate limits.
Update the installer test flow invoked by script/test-install.sh to pass an
authenticated GITHUB_TOKEN into the download logic so its curl calls use the
higher authenticated quota. If the shell script already supports headers or
env-based auth, wire that through in the CI workflow job and the installer
download path rather than leaving the Run live installer tests step
unauthenticated.

In `@install.ps1`:
- Around line 107-115: The Add-InstallDirectoryToPath function is reading and
rewriting the user PATH through Environment variables, which can flatten
expandable %VAR% segments; update this flow to preserve the original registry
value kind instead of round-tripping through
[Environment]::GetEnvironmentVariable and [Environment]::SetEnvironmentVariable.
Use the registry APIs directly for the user PATH entry in
Add-InstallDirectoryToPath, and keep the Add-ToPath logic for merging the
install directory while maintaining any existing REG_EXPAND_SZ segments.

In `@scripts/test-install.ps1`:
- Around line 70-88: The captured installer output is being wrapped by
Out-String at the default host width, which breaks long download-failure
assertions in CI. Update the two capture paths in test-install.ps1 that build
$script:RunOutput so the PowerShell output is collected with an explicit large
width, keeping long URLs and error text on one line. Use the existing
$PowerShell invocation and the shared $script:RunOutput capture logic to make
the Scenario 5 download assertion deterministic.

In `@scripts/test-install.sh`:
- Around line 72-98: `test_live_asset_404_preserves_existing_binary` should also
verify cleanup after the failed download path, since this is where
`download_file` and `checksum_file` are created before the 404 occurs; add the
same `assert_no_temporary_files` check used in
`test_live_latest_and_pinned_replacement` to confirm the trap removes temp
files. Also document that this test depends on
`test_live_latest_and_pinned_replacement` having already installed `nemo-relay
0.3.0` into `live_install_dir`, so its `preserved_version` assertion is not
relied on in isolation and future reordering/parallelization does not break it.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 739b8181-1b99-43fe-a1e7-69e44c645d33

📥 Commits

Reviewing files that changed from the base of the PR and between b30950b and 16be813.

📒 Files selected for processing (14)
  • .github/ci-path-filters.yml
  • .github/workflows/ci.yaml
  • .github/workflows/ci_changes.yml
  • .github/workflows/ci_check.yml
  • README.md
  • RELEASING.md
  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • install.ps1
  • install.sh
  • scripts/README.md
  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
  • scripts/test-install.sh
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Preview docs
⚠️ CI failures not shown inline (5)

GitHub Actions: Build pull request / Check _ Run: fix: complete installer validation

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Build pull request / CI Pipeline: fix: complete installer validation

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mfailed=false�[0m
 �[36;1m�[0m
 �[36;1mrequire_success() {�[0m
 �[36;1m  local name="$1"�[0m
 �[36;1m  local result="$2"�[0m
 �[36;1m  if [[ "$result" != "success" ]]; then�[0m
 �[36;1m    echo "Error: ${name} finished with result '${result}', expected success" >&2�[0m
 �[36;1m    failed=true�[0m
 �[36;1m  fi�[0m
 �[36;1m}�[0m
 �[36;1m�[0m
 �[36;1mallow_success_or_skipped() {�[0m
 �[36;1m  local name="$1"�[0m
 �[36;1m  local result="$2"�[0m
 �[36;1m  if [[ "$result" != "success" && "$result" != "skipped" ]]; then�[0m
 �[36;1m    echo "Error: ${name} finished with result '${result}', expected success or skipped" >&2�[0m
 �[36;1m    failed=true�[0m
 �[36;1m  fi�[0m
 �[36;1m}�[0m
 �[36;1m�[0m
 �[36;1mrequire_success "Changes" "$CHANGES_RESULT"�[0m
 �[36;1mrequire_success "Check" "$CHECK_RESULT"�[0m
 �[36;1m�[0m
 �[36;1mif [[ "$publish_packages" == "true" ]]; then�[0m
 �[36;1m  require_success "Rust" "$RUST_RESULT"�[0m
 �[36;1m  require_success "Node.js" "$NODE_RESULT"�[0m
 �[36;1m  require_success "Python" "$PYTHON_RESULT"�[0m
 �[36;1melse�[0m
 �[36;1m  allow_success_or_skipped "Rust" "$RUST_RESULT"�[0m
 �[36;1m  allow_success_or_skipped "Node.js" "$NODE_RESULT"�[0m
 �[36;1m  allow_success_or_skipped "Python" "$PYTHON_RESULT"�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1mallow_success_or_skipped "Go" "$GO_RESULT"�[0m
 �[36;1m�[0m
 �[36;1mif [[ "$failed" == "true" ]]; then�[0m
 �[36;1m  exit 1�[0m
 �[36;1mfi�[0m
 shell: /usr/bin/bash -e {0}
 env:
   CHANGES_RESULT: success
   CHECK_RESULT: failure
   RUST_RESULT: skipped
   GO_RESULT: skipped
   NODE_RESULT: skipped
   PYTHON_RESULT: skipped
   publish_packages: false
 ##[endgroup]
 Error: Check finished with result 'failure', expected success
 ##[error]Process completed with exit code 1.

GitHub Actions: Build pull request / 5_CI Pipeline.txt: fix: complete installer validation

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mfailed=false�[0m
 �[36;1m�[0m
 �[36;1mrequire_success() {�[0m
 �[36;1m  local name="$1"�[0m
 �[36;1m  local result="$2"�[0m
 �[36;1m  if [[ "$result" != "success" ]]; then�[0m
 �[36;1m    echo "Error: ${name} finished with result '${result}', expected success" >&2�[0m
 �[36;1m    failed=true�[0m
 �[36;1m  fi�[0m
 �[36;1m}�[0m
 �[36;1m�[0m
 �[36;1mallow_success_or_skipped() {�[0m
 �[36;1m  local name="$1"�[0m
 �[36;1m  local result="$2"�[0m
 �[36;1m  if [[ "$result" != "success" && "$result" != "skipped" ]]; then�[0m
 �[36;1m    echo "Error: ${name} finished with result '${result}', expected success or skipped" >&2�[0m
 �[36;1m    failed=true�[0m
 �[36;1m  fi�[0m
 �[36;1m}�[0m
 �[36;1m�[0m
 �[36;1mrequire_success "Changes" "$CHANGES_RESULT"�[0m
 �[36;1mrequire_success "Check" "$CHECK_RESULT"�[0m
 �[36;1m�[0m
 �[36;1mif [[ "$publish_packages" == "true" ]]; then�[0m
 �[36;1m  require_success "Rust" "$RUST_RESULT"�[0m
 �[36;1m  require_success "Node.js" "$NODE_RESULT"�[0m
 �[36;1m  require_success "Python" "$PYTHON_RESULT"�[0m
 �[36;1melse�[0m
 �[36;1m  allow_success_or_skipped "Rust" "$RUST_RESULT"�[0m
 �[36;1m  allow_success_or_skipped "Node.js" "$NODE_RESULT"�[0m
 �[36;1m  allow_success_or_skipped "Python" "$PYTHON_RESULT"�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1mallow_success_or_skipped "Go" "$GO_RESULT"�[0m
 �[36;1m�[0m
 �[36;1mif [[ "$failed" == "true" ]]; then�[0m
 �[36;1m  exit 1�[0m
 �[36;1mfi�[0m
 shell: /usr/bin/bash -e {0}
 env:
   CHANGES_RESULT: success
   CHECK_RESULT: failure
   RUST_RESULT: skipped
   GO_RESULT: skipped
   NODE_RESULT: skipped
   PYTHON_RESULT: skipped
   publish_packages: false
 ##[endgroup]
 Error: Check finished with result 'failure', expected success
 ##[error]Process completed with exit code 1.

GitHub Actions: Build pull request / Check _ Run: fix: complete installer validation

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Build pull request / 11_Check _ Run.txt: fix: complete installer validation

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m
🧰 Additional context used
📓 Path-based instructions (21)
.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

.github/workflows/*.{yml,yaml}: In GitHub Actions workflow files, put a permissions: block on each job that needs token access.
In GitHub Actions workflow files, avoid workflow-level permissions: unless the repository intentionally centralizes them and the inheritance tradeoff is documented.
In GitHub Actions workflow files, pin third-party actions to full commit SHAs and keep the readable version comment after the SHA.
In GitHub Actions workflow files, prefer action-native or ecosystem-native caching over generic actions/cache.
In GitHub Actions workflow files, drive cache invalidation from lockfiles or dependency manifests.
In GitHub Actions workflow files, keep deploy and publish permissions isolated to the jobs that need them.
When a workflow uses workflow_call, read both the caller and callee workflow files before changing or reviewing it.
When a pipeline has tag-based publish behavior, put release-tag validation in the earliest practical caller job.
In release-tag workflows, enforce repo policy that tags are raw SemVer only and do not start with v.
Keep Codecov component paths aligned with new crates, packages, and generated outputs; place dynamic plugin SDK/protocol paths in the plugin component.
For pure-Python plugin SDK packaging, produce a single wheel artifact instead of duplicating it across every platform matrix entry.
Use contents: read as the default minimum permission for checkout-based build, test, docs, and packaging jobs.
Use pull-requests: read for jobs that look up PR metadata.
Limit pages: write and id-token: write to Pages deployment jobs and any caller that invokes them through a reusable workflow.
For reusable workflows, the caller must grant every permission the called jobs require, because the callee cannot elevate beyond what the caller provides.
Prefer astral-sh/setup-uv cache support with cache-dependency-glob anchored to uv.lock.
Prefer Swatinem/rust-cache with explicit shared-key and workspaces instead...

Files:

  • .github/workflows/ci_changes.yml
  • .github/workflows/ci.yaml
  • .github/workflows/ci_check.yml
.github/**/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

justfile, Codecov, and CI package/test workflows must include new plugin crates and packages.

Files:

  • .github/workflows/ci_changes.yml
  • .github/workflows/ci.yaml
  • .github/ci-path-filters.yml
  • .github/workflows/ci_check.yml
.github/workflows/*.yml

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Ensure CI workflows use the same package names, install commands, and example commands as local workflows and documented usage.

Files:

  • .github/workflows/ci_changes.yml
  • .github/workflows/ci_check.yml
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.

Files:

  • .github/workflows/ci_changes.yml
  • .github/workflows/ci.yaml
  • scripts/test-install-mocks.sh
  • .github/ci-path-filters.yml
  • .github/workflows/ci_check.yml
  • scripts/test-install.ps1
  • scripts/test-install.sh
  • scripts/README.md
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • scripts/README.md
  • README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • scripts/README.md
  • README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • scripts/README.md
  • README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • scripts/README.md
  • README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-technical-docs.md)

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links that pull readers away from a procedure unless the link is a p...

Files:

  • crates/cli/README.md
  • RELEASING.md
  • scripts/README.md
  • README.md
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files.

Files:

  • crates/cli/README.md
  • scripts/test-install-mocks.sh
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • install.ps1
  • scripts/test-install.ps1
  • scripts/test-install.sh
  • scripts/README.md
  • README.md
  • install.sh
**/*.{rs,go,js,ts,py,html,md,mdx,toml,yml,yaml,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all source files using the correct comment syntax for the file type.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • scripts/README.md
  • README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/*.{md,mdx}: Prefer the documented public API rather than internal shortcuts.
Keep package names, repository references, and build commands current.
Update entry-point docs when examples or reading paths change.
Keep release-process and release-notes guidance in repository-maintainer docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md.
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work.
When detailed dynamic plugin guides exist, keep Rust native plugin examples, Python worker plugin examples, and grpc-v1 protocol details on separate pages.
Dynamic plugin manifests in docs and examples should use compat.relay = ">=0.5,<1.0" unless deliberately narrower.
Update relevant getting-started or reference docs when the associated behavior or examples change.
Ensure example commands still match current package names and paths.
Dynamic plugin entry pages should link to native, worker, Rust example, Python example, and protocol pages when those pages exist.
When the docs site changes, run just docs; ./scripts/build-docs.sh html remains the compatibility wrapper.

**/*.{md,mdx}: Document native and worker plugins as trusted extensions: native plugins are in-process and unsandboxed, while worker plugins provide process isolation but not a security sandbox.
When detailed dynamic plugin guides exist, keep Rust native, Python worker, and grpc-v1 protocol details on separate pages.

Files:

  • crates/cli/README.md
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • scripts/README.md
  • README.md
**/README.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/README.md: Update README.md when entry points change.
Update relevant package or crate README.md files when examples or binding guidance changes.

Files:

  • crates/cli/README.md
  • scripts/README.md
  • README.md
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • crates/cli/README.md
  • scripts/test-install-mocks.sh
  • RELEASING.md
  • docs/getting-started/installation.mdx
  • install.ps1
  • scripts/test-install.ps1
  • scripts/test-install.sh
  • scripts/README.md
  • README.md
  • install.sh
RELEASING.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Release-policy documentation should point to GitHub Releases as the only release-history source of truth.

Document release tags, release-note surfaces, and registry-facing version translation accurately in RELEASING.md.

Files:

  • RELEASING.md
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.

Files:

  • RELEASING.md
  • docs/getting-started/installation.mdx
  • README.md
**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)

**/*.mdx: In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close; do not use HTML comments for MDX SPDX headers.
New or regenerated MDX files must use {/* ... */} for top-of-file SPDX comments.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

docs/**/*.{md,mdx}: Keep documentation under docs/ valid for Fern tooling and external links, including Markdown/MDX link checks where applicable.
Update relevant reference docs and embedded examples when public behavior, bindings, examples, or workspace structure change.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)

Update documentation if activation or usage changes

Files:

  • docs/getting-started/installation.mdx
{README.md,docs/**/*.{md,rst,txt},fern/**/*}

📄 CodeRabbit inference engine (.agents/skills/prepare-code-freeze/SKILL.md)

Search and update documentation source for references to the old version in README.md, docs, and fern directories, updating current-version install commands, package examples, and configuration examples to <next-version>

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Keep README.md current with the workspace members and top-level documentation.

Files:

  • README.md
🧠 Learnings (1)
📚 Learning: 2026-05-03T04:23:07.497Z
Learnt from: willkill07
Repo: NVIDIA/NeMo-Flow PR: 46
File: .github/workflows/ci_rust.yml:31-64
Timestamp: 2026-05-03T04:23:07.497Z
Learning: In GitHub Actions workflow YAML, it’s valid to conditionally disable a service container by setting the service container’s `image` to an empty string (`''`) via a matrix variable (e.g., `redis_service_image: ''`). This intentionally makes the runner skip service initialization for that matrix entry rather than failing the job. When reviewing workflows, don’t flag this as an error if the workflow uses an empty `image` to disable the service on specific matrix entries (e.g., OS-specific setups); verify the `image` is sourced from the matrix variable and that the service is only expected to be available when a non-empty image is provided.

Applied to files:

  • .github/workflows/ci_changes.yml
  • .github/workflows/ci_check.yml
🪛 GitHub Actions: Build pull request / 12_Check _ Install script (Windows ARM64).txt
install.ps1

[error] 20-20: test-install.ps1 failed: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for aarch64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe


[error] 179-179: nemo-relay installer: could not download the expected CLI binary from the GitHub releases URL.

scripts/test-install.ps1

[error] 20-20: test-install.ps1 failed: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for aarch64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe


[error] 179-179: nemo-relay installer: could not download the expected CLI binary from the GitHub releases URL.

🪛 GitHub Actions: Build pull request / 14_Check _ Install script (macos-arm64).txt
scripts/test-install.sh

[error] 1-1: test-install.sh failed: nemo-relay installer could not resolve the latest stable release. curl failed with exit code 56: requested URL returned error 403.

install.sh

[error] 1-1: test-install.sh failed: nemo-relay installer could not resolve the latest stable release. curl failed with exit code 56: requested URL returned error 403.

🪛 GitHub Actions: Build pull request / 15_Check _ Install script (Windows x86_64).txt
install.ps1

[error] 20-20: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for x86_64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe

scripts/test-install.ps1

[error] 20-20: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for x86_64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe

🪛 GitHub Actions: Build pull request / Check _ Install script (macos-arm64)
scripts/test-install.sh

[error] 1-1: Install script failed while resolving the latest stable NeMo Relay release. curl returned (56) HTTP 403 when fetching the latest release URL. nemo-relay installer: could not resolve the latest stable release.

install.sh

[error] 1-1: Install script failed while resolving the latest stable NeMo Relay release. curl returned (56) HTTP 403 when fetching the latest release URL. nemo-relay installer: could not resolve the latest stable release.

🪛 GitHub Actions: Build pull request / Check _ Install script (Windows ARM64)
install.ps1

[error] 20-20: Command step failed: test-install.ps1 threw "FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for aarch64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe"


[error] 179-179: nemo-relay installer failed to download the CLI executable: https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe

scripts/test-install.ps1

[error] 20-20: Command step failed: test-install.ps1 threw "FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for aarch64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe"


[error] 179-179: nemo-relay installer failed to download the CLI executable: https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-aarch64-pc-windows-msvc-999.999.999.exe

🪛 GitHub Actions: Build pull request / Check _ Install script (Windows x86_64)
install.ps1

[error] 20-20: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for x86_64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe


[error] 179-179: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe

scripts/test-install.ps1

[error] 20-20: FAIL: expected 'could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/' in: Downloading NeMo Relay CLI 999.999.999 for x86_64-pc-windows-msvc... Exception: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe


[error] 179-179: nemo-relay installer: could not download https://github.com/NVIDIA/NeMo-Relay/releases/download/999.999.999/nemo-relay-cli-x86_64-pc-windows-msvc-999.999.999.exe

🪛 PSScriptAnalyzer (1.25.0)
install.ps1

[warning] 86-86: The cmdlet 'Download-File' uses an unapproved verb.

(PSUseApprovedVerbs)

scripts/test-install.ps1

[warning] 29-29: The cmdlet 'Assert-Contains' uses a plural noun. A singular noun should be used instead.

Suggested fix: Singularized correction of 'Assert-Contains'

(PSUseSingularNouns)


[warning] 33-33: The cmdlet 'Assert-PathContains' uses a plural noun. A singular noun should be used instead.

Suggested fix: Singularized correction of 'Assert-PathContains'

(PSUseSingularNouns)


[warning] 43-43: The cmdlet 'Assert-NoTemporaryFiles' uses a plural noun. A singular noun should be used instead.

Suggested fix: Singularized correction of 'Assert-NoTemporaryFiles'

(PSUseSingularNouns)

🪛 Shellcheck (0.11.0)
scripts/test-install-mocks.sh

[warning] 7-7: Remove space after = if trying to assign a value (for empty string, use var='' ... ).

(SC1007)


[warning] 129-129: Quotes/backslashes will be treated literally. Rewrite using set/"$@" or functions.

(SC2089)


[warning] 138-138: Quotes/backslashes in this variable will not be respected.

(SC2090)


[warning] 210-210: Quotes/backslashes will be treated literally. Rewrite using set/"$@" or functions.

(SC2089)


[warning] 211-211: Quotes/backslashes in this variable will not be respected.

(SC2090)

install.sh

[info] 211-227: Expressions don't expand in single quotes, use double quotes for that.

(SC2016)

🔇 Additional comments (16)
README.md (1)

53-69: LGTM!

RELEASING.md (1)

323-326: LGTM!

crates/cli/README.md (1)

6-27: LGTM!

docs/getting-started/installation.mdx (1)

33-158: LGTM!

install.sh (3)

11-33: LGTM!

Also applies to: 47-79, 81-105, 107-120, 121-152, 154-160, 161-172, 181-193, 194-198, 238-245


173-180: Timeout fix from the earlier review is in place.

curl_with_timeouts is now used for both the asset and checksum downloads, and the mocked test suite (scripts/test-install-mocks.sh) verifies --connect-timeout/--max-time are actually passed through. This addresses the previously raised concern about curl calls hanging indefinitely.


199-237: Windows PATH update logic looks correct; shellcheck SC2016 is a false positive.

The single-quoted -Command block intentionally avoids shell expansion — $installDir/$env:* are PowerShell variables populated via the NEMO_RELAY_INSTALL_DIR environment variable, not shell variables. Add-ToPath correctly de-dupes case-insensitively and trims trailing backslashes before comparing/appending. No changes needed here.

scripts/test-install.sh (1)

1-16: LGTM!

Also applies to: 18-47, 48-70, 100-122

scripts/test-install-mocks.sh (1)

1-252: LGTM! Mock coverage for platform mapping, unsupported platform, malformed release response, missing checksum, and checksum mismatch is thorough and each scenario asserts the expected fail-closed behavior (no partial install, existing binary preserved, temp files cleaned up).

The shellcheck SC1007/SC2089/SC2090 hints on lines 7, 129, 138, 210, 211 are false positives here — the CDPATH= idiom is intentional, and the flagged variables hold literal data strings printed by mocks, not values passed to eval/exec.

.github/workflows/ci_check.yml (3)

46-58: 📐 Maintainability & Code Quality

Mock-only tests restricted to a single matrix entry.

run_mock_tests is true only for linux-x86_64; linux-arm64 and macos-arm64 skip scripts/test-install-mocks.sh entirely. This mirrors an earlier open review comment ("Testing should be validated on the complete matrix") that doesn't appear to have a resolution marker. Since the mocks simulate other platforms via mocked uname/curl output (host-agnostic), running them once is likely intentional, but worth confirming this scoping is deliberate rather than an oversight from trimming CI time.

Also applies to: 72-79


24-28: LGTM!


81-121: LGTM!

.github/ci-path-filters.yml (1)

10-20: LGTM!

.github/workflows/ci_changes.yml (1)

39-41: LGTM!

Also applies to: 79-79

.github/workflows/ci.yaml (1)

123-123: LGTM!

scripts/README.md (1)

17-19: LGTM!

Comment thread .github/workflows/ci_check.yml
Comment thread install.ps1
Comment thread scripts/test-install.ps1
Comment thread scripts/test-install.sh
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/cli/README.md`:
- Line 138: The README currently uses a raw URL in running text; update the NeMo
Relay documentation reference to use descriptive link text instead of a bare
link. Edit the Markdown in the relevant README section so the displayed text
describes the destination while pointing to the same NeMo Relay documentation
URL.
- Around line 58-62: Update the installation wording in the CLI README so it
matches the actual command: the current `cargo install nemo-relay-cli` in the
“To build the CLI from source” section refers to installing the published crate,
not building from the local source tree. Either rename the section to “To
install the CLI from crates.io” or replace the command with a true source-build
flow, and keep the wording aligned with the package name and build command used
in this README.
- Around line 6-17: The README starts with the badge row instead of the main
heading, which triggers the Markdown heading rule and hurts readability. Move
the `# NeMo Relay` heading to the top of the document, then place the badge
block directly underneath it in `crates/cli/README.md`. While editing, keep the
heading text in title case to match the documentation style guidelines.

In `@install.sh`:
- Around line 48-54: The github_api_curl() helper is expanding GH_TOKEN directly
into curl arguments, which exposes the token in argv. Update github_api_curl()
to pass the Authorization header through a non-argv mechanism such as curl
config/stdin or another safe transport, while preserving the existing Accept and
User-Agent headers. Also adjust the mock parser used by the install script tests
so it can recognize the new header-passing path and still validate authenticated
requests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 0a1e5ed5-96e0-424f-a406-c3a0f2f87afb

📥 Commits

Reviewing files that changed from the base of the PR and between 16be813 and 7a8d33e.

📒 Files selected for processing (5)
  • crates/cli/README.md
  • install.ps1
  • install.sh
  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • crates/cli/README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • crates/cli/README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • crates/cli/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • crates/cli/README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-technical-docs.md)

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links that pull readers away from a procedure unless the link is a p...

Files:

  • crates/cli/README.md
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files.

Files:

  • crates/cli/README.md
  • install.ps1
  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
  • install.sh
**/*.{rs,go,js,ts,py,html,md,mdx,toml,yml,yaml,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all source files using the correct comment syntax for the file type.

Files:

  • crates/cli/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/*.{md,mdx}: Prefer the documented public API rather than internal shortcuts.
Keep package names, repository references, and build commands current.
Update entry-point docs when examples or reading paths change.
Keep release-process and release-notes guidance in repository-maintainer docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md.
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work.
When detailed dynamic plugin guides exist, keep Rust native plugin examples, Python worker plugin examples, and grpc-v1 protocol details on separate pages.
Dynamic plugin manifests in docs and examples should use compat.relay = ">=0.5,<1.0" unless deliberately narrower.
Update relevant getting-started or reference docs when the associated behavior or examples change.
Ensure example commands still match current package names and paths.
Dynamic plugin entry pages should link to native, worker, Rust example, Python example, and protocol pages when those pages exist.
When the docs site changes, run just docs; ./scripts/build-docs.sh html remains the compatibility wrapper.

**/*.{md,mdx}: Document native and worker plugins as trusted extensions: native plugins are in-process and unsandboxed, while worker plugins provide process isolation but not a security sandbox.
When detailed dynamic plugin guides exist, keep Rust native, Python worker, and grpc-v1 protocol details on separate pages.

Files:

  • crates/cli/README.md
**/README.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/README.md: Update README.md when entry points change.
Update relevant package or crate README.md files when examples or binding guidance changes.

Files:

  • crates/cli/README.md
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • crates/cli/README.md
  • install.ps1
  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
  • install.sh
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.

Files:

  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
🪛 markdownlint-cli2 (0.22.1)
crates/cli/README.md

[warning] 6-6: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

🪛 Shellcheck (0.11.0)
scripts/test-install-mocks.sh

[warning] 145-145: Quotes/backslashes in this variable will not be respected.

(SC2090)

🔇 Additional comments (6)
install.sh (1)

124-124: LGTM!

scripts/test-install-mocks.sh (1)

63-69: LGTM!

Also applies to: 83-83, 138-147

install.ps1 (2)

111-119: Duplicate: preserve expandable user PATH entries.

This still round-trips the user Path through [Environment]::GetEnvironmentVariable and [Environment]::SetEnvironmentVariable, which can flatten existing expandable registry entries. The prior review already covers using registry APIs instead.


1-110: LGTM!

Also applies to: 121-185

scripts/test-install.ps1 (2)

77-85: Duplicate: make captured output width deterministic.

Both capture paths still pipe to Out-String without -Width, so long installer error lines can wrap and break Assert-Contains checks in CI. The prior review already proposed adding a large explicit width.

Source: Pipeline failures


1-62: LGTM!

Also applies to: 90-151

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/cli/README.md`:
- Line 138: The README currently uses a raw URL in running text; update the NeMo
Relay documentation reference to use descriptive link text instead of a bare
link. Edit the Markdown in the relevant README section so the displayed text
describes the destination while pointing to the same NeMo Relay documentation
URL.
- Around line 58-62: Update the installation wording in the CLI README so it
matches the actual command: the current `cargo install nemo-relay-cli` in the
“To build the CLI from source” section refers to installing the published crate,
not building from the local source tree. Either rename the section to “To
install the CLI from crates.io” or replace the command with a true source-build
flow, and keep the wording aligned with the package name and build command used
in this README.
- Around line 6-17: The README starts with the badge row instead of the main
heading, which triggers the Markdown heading rule and hurts readability. Move
the `# NeMo Relay` heading to the top of the document, then place the badge
block directly underneath it in `crates/cli/README.md`. While editing, keep the
heading text in title case to match the documentation style guidelines.

In `@install.sh`:
- Around line 48-54: The github_api_curl() helper is expanding GH_TOKEN directly
into curl arguments, which exposes the token in argv. Update github_api_curl()
to pass the Authorization header through a non-argv mechanism such as curl
config/stdin or another safe transport, while preserving the existing Accept and
User-Agent headers. Also adjust the mock parser used by the install script tests
so it can recognize the new header-passing path and still validate authenticated
requests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 0a1e5ed5-96e0-424f-a406-c3a0f2f87afb

📥 Commits

Reviewing files that changed from the base of the PR and between 16be813 and 7a8d33e.

📒 Files selected for processing (5)
  • crates/cli/README.md
  • install.ps1
  • install.sh
  • scripts/test-install-mocks.sh
  • scripts/test-install.ps1
📜 Review details
🔇 Additional comments (6)
install.sh (1)

124-124: LGTM!

scripts/test-install-mocks.sh (1)

63-69: LGTM!

Also applies to: 83-83, 138-147

install.ps1 (2)

111-119: Duplicate: preserve expandable user PATH entries.

This still round-trips the user Path through [Environment]::GetEnvironmentVariable and [Environment]::SetEnvironmentVariable, which can flatten existing expandable registry entries. The prior review already covers using registry APIs instead.


1-110: LGTM!

Also applies to: 121-185

scripts/test-install.ps1 (2)

77-85: Duplicate: make captured output width deterministic.

Both capture paths still pipe to Out-String without -Width, so long installer error lines can wrap and break Assert-Contains checks in CI. The prior review already proposed adding a large explicit width.

Source: Pipeline failures


1-62: LGTM!

Also applies to: 90-151

🛑 Comments failed to post (4)
crates/cli/README.md (3)

6-17: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Move the H1 above the badge row.

The file now starts with badges, which trips MD041 and makes the README harder to scan. Put # NeMo Relay first, then keep the badge block underneath.

As per coding guidelines, **/*.md: Use title case consistently in technical documentation headings.

Suggested fix
- [badge row]
-
 # NeMo Relay
+
+[badge row]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

# NeMo Relay

[![License](https://img.shields.io/github/license/NVIDIA/NeMo-Relay)](https://github.com/NVIDIA/NeMo-Relay/blob/main/LICENSE)
[![GitHub](https://img.shields.io/badge/github-repo-blue?logo=github)](https://github.com/NVIDIA/NeMo-Relay/)
[![Release](https://img.shields.io/github/v/release/NVIDIA/NeMo-Relay?color=green)](https://github.com/NVIDIA/NeMo-Relay/releases)
[![Codecov](https://codecov.io/gh/NVIDIA/NeMo-Relay/branch/main/graph/badge.svg)](https://app.codecov.io/gh/NVIDIA/NeMo-Relay)
[![PyPI](https://img.shields.io/pypi/v/nemo-relay?color=4B8BBE&logo=pypi)](https://pypi.org/project/nemo-relay/)
[![npm node](https://img.shields.io/npm/v/nemo-relay-node?label=nemo-relay-node&color=CC3534&logo=npm)](https://www.npmjs.com/package/nemo-relay-node)
[![Crates.io](https://img.shields.io/crates/v/nemo-relay?label=nemo-relay&color=B7410E&logo=rust)](https://crates.io/crates/nemo-relay)
[![Crates.io](https://img.shields.io/crates/v/nemo-relay-adaptive?label=nemo-relay-adaptive&color=B7410E&logo=rust)](https://crates.io/crates/nemo-relay-adaptive)
[![Crates.io](https://img.shields.io/crates/v/nemo-relay-cli?label=nemo-relay-cli&color=B7410E&logo=rust)](https://crates.io/crates/nemo-relay-cli)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/NVIDIA/NeMo-Relay)
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 6-6: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/cli/README.md` around lines 6 - 17, The README starts with the badge
row instead of the main heading, which triggers the Markdown heading rule and
hurts readability. Move the `# NeMo Relay` heading to the top of the document,
then place the badge block directly underneath it in `crates/cli/README.md`.
While editing, keep the heading text in title case to match the documentation
style guidelines.

Sources: Coding guidelines, Linters/SAST tools


58-62: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the installation wording.

cargo install nemo-relay-cli installs the published crate from crates.io; it does not build from the local source tree. Rename this to "To install the CLI from crates.io" or switch to a true source-build command so the text matches the command.

As per coding guidelines, **/*.md: Keep package names, repository references, and build commands current.

Suggested fix
-To build the CLI from source:
+To install the CLI from crates.io:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

To install the CLI from crates.io:

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/cli/README.md` around lines 58 - 62, Update the installation wording
in the CLI README so it matches the actual command: the current `cargo install
nemo-relay-cli` in the “To build the CLI from source” section refers to
installing the published crate, not building from the local source tree. Either
rename the section to “To install the CLI from crates.io” or replace the command
with a true source-build flow, and keep the wording aligned with the package
name and build command used in this README.

Source: Coding guidelines


138-138: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Replace the bare URL with link text.

The final line uses a raw URL in running text. Use descriptive link text instead.

As per coding guidelines, **/*.md: Avoid raw URLs in running text.

Suggested fix
-NeMo Relay Documentation: https://docs.nvidia.com/nemo/relay
+[NeMo Relay Documentation](https://docs.nvidia.com/nemo/relay)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

[NeMo Relay Documentation](https://docs.nvidia.com/nemo/relay)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/cli/README.md` at line 138, The README currently uses a raw URL in
running text; update the NeMo Relay documentation reference to use descriptive
link text instead of a bare link. Edit the Markdown in the relevant README
section so the displayed text describes the destination while pointing to the
same NeMo Relay documentation URL.

Source: Coding guidelines

install.sh (1)

48-54: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Avoid putting GH_TOKEN in curl argv.

Line 53 expands the bearer token into a command-line argument, which can expose it through process inspection. Pass the header through stdin/config or another non-argv path, and update the mock parser accordingly.

Proposed direction
 github_api_curl() {
     if [ -n "${GH_TOKEN:-}" ]; then
-        curl_with_timeouts \
-            -H 'Accept: application/vnd.github+json' \
-            -H 'User-Agent: nemo-relay-install-script' \
-            -H "Authorization: Bearer ${GH_TOKEN}" \
-            "$@"
+        curl_with_timeouts --config - "$@" <<EOF
+header = "Accept: application/vnd.github+json"
+header = "User-Agent: nemo-relay-install-script"
+header = "Authorization: Bearer ${GH_TOKEN}"
+EOF
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

github_api_curl() {
    if [ -n "${GH_TOKEN:-}" ]; then
        curl_with_timeouts --config - "$@" <<EOF
header = "Accept: application/vnd.github+json"
header = "User-Agent: nemo-relay-install-script"
header = "Authorization: Bearer ${GH_TOKEN}"
EOF
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install.sh` around lines 48 - 54, The github_api_curl() helper is expanding
GH_TOKEN directly into curl arguments, which exposes the token in argv. Update
github_api_curl() to pass the Authorization header through a non-argv mechanism
such as curl config/stdin or another safe transport, while preserving the
existing Accept and User-Agent headers. Also adjust the mock parser used by the
install script tests so it can recognize the new header-passing path and still
validate authenticated requests.

Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/cli/README.md`:
- Around line 60-75: The install section in the README needs formatting and
wording cleanup: add the missing blank line before the Unix curl code fence to
satisfy MD031, and update the transition near the install commands to use the
post-install verification step rather than describing the binary install result.
Adjust the surrounding text in the README section around the curl/PowerShell
snippets and the `nemo-relay --version` lead-in so it clearly introduces
verification after installation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3f4f5216-bea8-4b37-8fb0-40e398caa4bb

📥 Commits

Reviewing files that changed from the base of the PR and between 7a8d33e and aa31c5f.

📒 Files selected for processing (1)
  • crates/cli/README.md
📜 Review details
⏰ Context from checks skipped due to timeout. (4)
  • GitHub Check: Check / Run
  • GitHub Check: Check / Install script (Windows x86_64)
  • GitHub Check: Check / Install script (Windows ARM64)
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (10)
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • crates/cli/README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • crates/cli/README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • crates/cli/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • crates/cli/README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-technical-docs.md)

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links that pull readers away from a procedure unless the link is a p...

Files:

  • crates/cli/README.md
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files.

Files:

  • crates/cli/README.md
**/*.{rs,go,js,ts,py,html,md,mdx,toml,yml,yaml,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all source files using the correct comment syntax for the file type.

Files:

  • crates/cli/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/*.{md,mdx}: Prefer the documented public API rather than internal shortcuts.
Keep package names, repository references, and build commands current.
Update entry-point docs when examples or reading paths change.
Keep release-process and release-notes guidance in repository-maintainer docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md.
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work.
When detailed dynamic plugin guides exist, keep Rust native plugin examples, Python worker plugin examples, and grpc-v1 protocol details on separate pages.
Dynamic plugin manifests in docs and examples should use compat.relay = ">=0.5,<1.0" unless deliberately narrower.
Update relevant getting-started or reference docs when the associated behavior or examples change.
Ensure example commands still match current package names and paths.
Dynamic plugin entry pages should link to native, worker, Rust example, Python example, and protocol pages when those pages exist.
When the docs site changes, run just docs; ./scripts/build-docs.sh html remains the compatibility wrapper.

**/*.{md,mdx}: Document native and worker plugins as trusted extensions: native plugins are in-process and unsandboxed, while worker plugins provide process isolation but not a security sandbox.
When detailed dynamic plugin guides exist, keep Rust native, Python worker, and grpc-v1 protocol details on separate pages.

Files:

  • crates/cli/README.md
**/README.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/README.md: Update README.md when entry points change.
Update relevant package or crate README.md files when examples or binding guidance changes.

Files:

  • crates/cli/README.md
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • crates/cli/README.md
🪛 markdownlint-cli2 (0.22.1)
crates/cli/README.md

[warning] 61-61: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

🔇 Additional comments (1)
crates/cli/README.md (1)

128-132: LGTM!

Comment thread crates/cli/README.md Outdated

@lvojtku lvojtku left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with comments.

Comment thread docs/getting-started/installation.mdx Outdated
Comment thread scripts/README.md Outdated
Comment thread README.md
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/getting-started/installation.mdx (1)

82-94: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Table headers should use title case.

"Operating system" and "Release target" are sentence case; guidelines require title case for table headers.

✏️ Proposed fix
-| Operating system | Architecture | Release target |
+| Operating System | Architecture | Release Target |

As per coding guidelines, "Use title case for table headers."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/getting-started/installation.mdx` around lines 82 - 94, The Supported
Platforms table in installation.mdx uses sentence case for headers that should
be title case. Update the table header labels in the supported platforms section
so they follow the project’s table header convention, keeping the rest of the
content unchanged and preserving the existing release target values and platform
entries.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/getting-started/installation.mdx`:
- Around line 168-169: The installation docs link in the getting-started page
points to a stale CLI README anchor, so update the reference from the old
installation section to the current `Installation Options` anchor in the `CLI
README` link. Use the existing installation guidance text in `installation.mdx`
and the `crates/cli/README.md` section name to locate the link, and replace the
outdated fragment so the source-installation and unsupported-platform guidance
resolves correctly.

---

Outside diff comments:
In `@docs/getting-started/installation.mdx`:
- Around line 82-94: The Supported Platforms table in installation.mdx uses
sentence case for headers that should be title case. Update the table header
labels in the supported platforms section so they follow the project’s table
header convention, keeping the rest of the content unchanged and preserving the
existing release target values and platform entries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4d2faba8-ea65-4a85-a5c8-906a110a2d33

📥 Commits

Reviewing files that changed from the base of the PR and between aa31c5f and 1296f40.

📒 Files selected for processing (7)
  • README.md
  • crates/cli/README.md
  • docs/getting-started/installation.mdx
  • install.ps1
  • scripts/README.md
  • scripts/test-install.ps1
  • scripts/test-install.sh
📜 Review details
⏰ Context from checks skipped due to timeout. (21)
  • GitHub Check: Rust / Test (linux-arm64)
  • GitHub Check: Go / Test (windows-arm64)
  • GitHub Check: Rust / Test (windows-arm64)
  • GitHub Check: Rust / Test (linux-amd64)
  • GitHub Check: Rust / Test (macos-arm64)
  • GitHub Check: Rust / Test (windows-amd64)
  • GitHub Check: Go / Test (linux-amd64)
  • GitHub Check: Go / Test (windows-amd64)
  • GitHub Check: Go / Test (linux-arm64)
  • GitHub Check: Node.js / Test (linux-amd64)
  • GitHub Check: Python / Test (linux-arm64)
  • GitHub Check: Python / Test (windows-arm64)
  • GitHub Check: Python / Test (macos-arm64)
  • GitHub Check: Node.js / Test (windows-amd64)
  • GitHub Check: Node.js / Test (macos-arm64)
  • GitHub Check: Go / Test (macos-arm64)
  • GitHub Check: Python / Test (windows-amd64)
  • GitHub Check: Python / Test (linux-amd64)
  • GitHub Check: Node.js / Test (linux-arm64)
  • GitHub Check: Node.js / Test (windows-arm64)
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (17)
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-technical-docs.md)

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links that pull readers away from a procedure unless the link is a p...

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
{README.md,docs/**/*.{md,rst,txt},fern/**/*}

📄 CodeRabbit inference engine (.agents/skills/prepare-code-freeze/SKILL.md)

Search and update documentation source for references to the old version in README.md, docs, and fern directories, updating current-version install commands, package examples, and configuration examples to <next-version>

Files:

  • README.md
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files.

Files:

  • README.md
  • scripts/README.md
  • docs/getting-started/installation.mdx
  • scripts/test-install.sh
  • crates/cli/README.md
  • scripts/test-install.ps1
  • install.ps1
README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Keep README.md current with the workspace members and top-level documentation.

Files:

  • README.md
**/*.{rs,go,js,ts,py,html,md,mdx,toml,yml,yaml,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all source files using the correct comment syntax for the file type.

Files:

  • README.md
  • scripts/README.md
  • docs/getting-started/installation.mdx
  • crates/cli/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/*.{md,mdx}: Prefer the documented public API rather than internal shortcuts.
Keep package names, repository references, and build commands current.
Update entry-point docs when examples or reading paths change.
Keep release-process and release-notes guidance in repository-maintainer docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md.
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work.
When detailed dynamic plugin guides exist, keep Rust native plugin examples, Python worker plugin examples, and grpc-v1 protocol details on separate pages.
Dynamic plugin manifests in docs and examples should use compat.relay = ">=0.5,<1.0" unless deliberately narrower.
Update relevant getting-started or reference docs when the associated behavior or examples change.
Ensure example commands still match current package names and paths.
Dynamic plugin entry pages should link to native, worker, Rust example, Python example, and protocol pages when those pages exist.
When the docs site changes, run just docs; ./scripts/build-docs.sh html remains the compatibility wrapper.

**/*.{md,mdx}: Document native and worker plugins as trusted extensions: native plugins are in-process and unsandboxed, while worker plugins provide process isolation but not a security sandbox.
When detailed dynamic plugin guides exist, keep Rust native, Python worker, and grpc-v1 protocol details on separate pages.

Files:

  • README.md
  • scripts/README.md
  • docs/getting-started/installation.mdx
  • crates/cli/README.md
**/README.md

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

**/README.md: Update README.md when entry points change.
Update relevant package or crate README.md files when examples or binding guidance changes.

Files:

  • README.md
  • scripts/README.md
  • crates/cli/README.md
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings,
documentation, integrations, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
skills/       # Published Codex/agent skills for NeMo Relay usage patterns

Prerequisites

Insta...

Files:

  • README.md
  • scripts/README.md
  • docs/getting-started/installation.mdx
  • scripts/test-install.sh
  • crates/cli/README.md
  • scripts/test-install.ps1
  • install.ps1
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.

Files:

  • README.md
  • docs/getting-started/installation.mdx
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.

Files:

  • scripts/README.md
  • scripts/test-install.sh
  • scripts/test-install.ps1
**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)

**/*.mdx: In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close; do not use HTML comments for MDX SPDX headers.
New or regenerated MDX files must use {/* ... */} for top-of-file SPDX comments.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

docs/**/*.{md,mdx}: Keep documentation under docs/ valid for Fern tooling and external links, including Markdown/MDX link checks where applicable.
Update relevant reference docs and embedded examples when public behavior, bindings, examples, or workspace structure change.

Files:

  • docs/getting-started/installation.mdx
docs/**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)

Update documentation if activation or usage changes

Files:

  • docs/getting-started/installation.mdx
🔇 Additional comments (13)
scripts/test-install.sh (1)

92-98: LGTM!

scripts/README.md (1)

17-19: LGTM!

README.md (3)

67-69: 📐 Maintainability & Code Quality

Unaddressed: use "Refer to" instead of "See".

This wording matches a prior reviewer suggestion (lvojtku) that hasn't been applied yet. Coding guidelines prefer refer to over see when pointing readers to another resource.

✏️ Proposed fix
-The installer supports Linux x86_64/ARM64, macOS Apple Silicon, and Windows
-x86_64/ARM64. See the [installation guide](https://docs.nvidia.com/nemo/relay/getting-started/installation)
-for version pinning, custom directories, and source-based installation.
+The installer supports Linux x86_64/ARM64, macOS Apple Silicon, and Windows
+x86_64/ARM64. Refer to the [installation guide](https://docs.nvidia.com/nemo/relay/getting-started/installation)
+for version pinning, custom directories, and source-based installation.

Source: Coding guidelines


51-65: LGTM! Split curl/PowerShell blocks and verification step address prior review feedback.


81-96: LGTM!

crates/cli/README.md (2)

52-80: LGTM! Addresses prior MD031 blank-line and verification-wording feedback.


129-132: LGTM!

docs/getting-started/installation.mdx (2)

33-49: LGTM! Addresses prior review feedback on <Tabs> usage, docs-version/CLI-version contract, and custom install-dir PATH guidance.

Also applies to: 50-52, 54-58, 75-80, 96-133, 140-149, 151-166


135-138: 🗄️ Data Integrity & Integration

Remove this warning; the Windows POSIX-shell path already uses PowerShell to persist the user PATH.

			> Likely an incorrect or invalid review comment.
scripts/test-install.ps1 (2)

83-84: Capture output with a fixed width.

The prior CI finding still applies: both capture paths pipe to Out-String without -Width, so long failure messages or URLs can wrap and break Assert-Contains. As per path instructions, review automation changes for reproducibility.

Also applies to: 92-92

Sources: Path instructions, Pipeline failures


1-68: LGTM!

Also applies to: 97-212

install.ps1 (2)

1-112: LGTM!

Also applies to: 143-199, 203-207


132-135: 🎯 Functional Correctness

Notify Windows after updating the user PATH.

The registry write is durable, but shells launched from an already-running Explorer or terminal may not observe it until a WM_SETTINGCHANGE broadcast or a new logon. That makes Line 202 overpromise immediate inheritance. Add the broadcast after SetValue, or soften the message to require restarting the session.

Also applies to: 200-202

Comment thread docs/getting-started/installation.mdx Outdated
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@willkill07

Copy link
Copy Markdown
Member

/merge

@rapids-bot rapids-bot Bot merged commit ba8695d into NVIDIA:main Jul 2, 2026
71 of 72 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feature a new feature size:XL PR is extra large

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants