Skip to content

feat: add setup readiness diagnostics#357

Merged
rapids-bot[bot] merged 6 commits into
NVIDIA:mainfrom
willkill07:wkk_relay-316-setup-readiness
Jul 3, 2026
Merged

feat: add setup readiness diagnostics#357
rapids-bot[bot] merged 6 commits into
NVIDIA:mainfrom
willkill07:wkk_relay-316-setup-readiness

Conversation

@willkill07

@willkill07 willkill07 commented Jul 2, 2026

Copy link
Copy Markdown
Member

Overview

Add unified nemo-relay doctor setup-readiness diagnostics for agents, discovered plugin configuration, and persistent Codex/Claude Code host-plugin installations.

  • 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

  • Share host-plugin readiness collection between default doctor and focused plugin doctor, including generated manifest validation, registration, routing/hooks, remediation, and informational lazy-sidecar status.
  • Report discovered plugins.toml layers, effective-source provenance, semantic source errors, merged validation, and secret-safe JSON fields while retaining schema version 1.
  • Add stable Plugin configuration and Host plugins output sections, diagnostics tests, and CLI documentation.

Where should the reviewer start?

Start with crates/cli/src/doctor.rs for the unified report and rendering, then crates/cli/src/plugin_install/mod.rs for shared host checks and crates/cli/src/config.rs for provenance.

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

  • Closes: RELAY-316

Summary by CodeRabbit

  • New Features
    • Enhanced nemo-relay doctor plugin diagnostics with per-layer plugin configuration and an overall “Plugin resolution” check.
    • Added structured host-plugin readiness reporting in both human output and doctor-json, including per-check results and remediation guidance.
  • Bug Fixes
    • plugins.toml validation errors now report the originating plugins.toml source file.
    • doctor now fails when persistent host plugins are installed but host readiness is not OK.
  • Documentation
    • Expanded plugin installation “Diagnose” guidance (--plugin / --install-dir) and forced-reinstall remediation details.
    • Reformatted multiple “Why Use It?” / “What You Get” README bullet lists for consistent styling.

@willkill07 willkill07 requested review from a team and lvojtku as code owners July 2, 2026 20:45
@github-actions github-actions Bot added size:L PR is large Feature a new feature lang:rust PR changes/introduces Rust code labels Jul 2, 2026
@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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: d8f92634-6c8f-4c9b-90a8-aae9b14d1bab

📥 Commits

Reviewing files that changed from the base of the PR and between 038ba76 and fa2ff9b.

📒 Files selected for processing (1)
  • crates/cli/tests/coverage/config_tests.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (9)
**/*.rs

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

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

Follow Rust naming conventions, including snake_case identifiers and Rust-facing runtime API shapes.

**/*.rs: When changing the core runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and pass cargo deny check.
When touching the core Rust crate, run the Rust tests and the other affected binding test suites because the bindings depend on the core runtime.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,py,js,ts,mjs,c,h,md,toml,yml,yaml,sh,json,go}

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,py,go,js,ts,jsx,tsx,md,mdx,toml,yaml,yml,html}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include an SPDX license header using the comment syntax appropriate for the file type, with SPDX-FileCopyrightText for 2026 NVIDIA CORPORATION & AFFILIATES and SPDX-License-Identifier: Apache-2.0.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use the naming conventions appropriate to each language: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,py,go,js,ts,md,mdx,toml,yaml,yml,json}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Avoid using SONAR_IGNORE_START / SONAR_IGNORE_END except for documented false positives; keep the ignored block small, add a brief explanatory comment, and call it out in the PR description.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,py,go,js,ts,wasm}

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

Ensure binding-native wrappers expose the same observability configuration knobs and lifecycle behavior across Rust, Python, Go, Node.js, and WebAssembly.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**/*.{rs,rlib}

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

**/*.{rs,rlib}: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.

Files:

  • crates/cli/tests/coverage/config_tests.rs
**

⚙️ 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/tests/coverage/config_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/cli/tests/coverage/config_tests.rs
🔇 Additional comments (3)
crates/cli/tests/coverage/config_tests.rs (3)

859-864: No annotated code provided for these ranges — skipping detailed review.

Only the summary describes clone/assertion changes for contributing_sources; cannot verify correctness without the actual diff.

Also applies to: 957-962, 1098-1108


31-58: LGTM!


75-110: LGTM!


Walkthrough

Adds plugin TOML source tracking, plugin-resolution reporting in doctor, host plugin readiness output, and updated tests/docs.

Changes

Plugin Resolution and Doctor Readiness

Layer / File(s) Summary
Contributing sources in plugin TOML resolution
crates/cli/src/config.rs, crates/cli/tests/coverage/config_tests.rs
plugins.toml loading now tracks contributing sources, exposes default discovery and effective-source helpers, and includes source paths in relevant config errors.
Doctor report plugin configuration and resolution checks
crates/cli/src/doctor.rs, crates/cli/tests/coverage/doctor_tests.rs
Doctor configuration reporting now includes per-layer plugin status and overall plugin resolution, with updated exit-code, warning, formatting, and test coverage.
Host plugin readiness model
crates/cli/src/plugin_install/mod.rs, crates/cli/src/plugin_install/host.rs, crates/cli/tests/coverage/plugin_install_tests.rs
Host doctor flows now use readiness structs and checks for JSON/human output, with test-only gating for host registration helpers and updated readiness tests.
README and docs updates for doctor readiness
crates/cli/README.md, crates/adaptive/README.md, crates/core/README.md, crates/ffi/README.md, crates/node/README.md, crates/python/README.md, go/nemo_relay/README.md, python/nemo_relay/README.md, docs/nemo-relay-cli/plugin-installation.mdx
CLI and package READMEs are reformatted for bullet style consistency, and plugin-install docs now describe the new doctor checks and remediation text.

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

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed Conventional Commits format is correct and the title accurately summarizes the readiness-diagnostics change.
Description check ✅ Passed All required template sections are present and filled with relevant details, reviewer guidance, and an issue reference.
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.
✨ 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: 5

Caution

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

⚠️ Outside diff range comments (1)
crates/cli/src/plugin_install/mod.rs (1)

411-436: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

host_plugin_registered/host_marketplace_registered collapse "unknown" into "false".

readiness.host_plugin_registered/host_marketplace_registered are Option<bool> and stay None when the host CLI isn't available (require_host_cli fails, so host_registration_report is never even attempted). unwrap_or(false) then reports these as a definite false in host_registration, which is indistinguishable in the JSON contract from "checked and confirmed unregistered." Consumers of doctor-json can't tell "not verifiable" apart from "verified missing."

💡 Proposed fix to preserve unknown state
-    let host_plugin_registered = readiness.host_plugin_registered.unwrap_or(false);
-    let host_marketplace_registered = readiness.host_marketplace_registered.unwrap_or(false);
     Ok(json!({
         "ok": readiness.ok(),
         "host": readiness.host,
         "remediation": readiness.remediation,
         "nemo_relay": readiness.relay,
         "marketplace": readiness.marketplace,
         "plugin": readiness.plugin,
         "host_registration": {
-            "ok": host_plugin_registered && host_marketplace_registered,
-            "host_plugin_registered": host_plugin_registered,
-            "host_marketplace_registered": host_marketplace_registered
+            "ok": readiness.host_plugin_registered.unwrap_or(false)
+                && readiness.host_marketplace_registered.unwrap_or(false),
+            "host_plugin_registered": readiness.host_plugin_registered,
+            "host_marketplace_registered": readiness.host_marketplace_registered
         },
🤖 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/src/plugin_install/mod.rs` around lines 411 - 436, The host
registration JSON in doctor_host_json_value is collapsing unknown into false by
using unwrap_or(false) on readiness.host_plugin_registered and
readiness.host_marketplace_registered. Update the host_registration object to
preserve the Option<bool> state returned by collect_host_plugin_readiness so
consumers can distinguish “not verifiable” from “confirmed false,” while keeping
the existing ok calculation based on both values being true when present.
🤖 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/src/config.rs`:
- Around line 1067-1078: Add a focused test for effective_plugin_toml_sources()
in config_tests.rs that exercises the new API directly, since its behavior
differs from load_plugin_toml_config_from_paths(). Cover the no-config case to
verify it returns an empty Vec, and a temp-directory setup with multiple
plugins.toml layers to confirm the returned paths are sorted and deduplicated
from contributing_sources. Use the effective_plugin_toml_sources() symbol so the
test tracks the public(crate) behavior rather than only the lower-level loader.

In `@crates/cli/src/doctor.rs`:
- Around line 261-304: Add direct unit tests for plugin_resolution_check() to
cover every branch, since the current tests only exercise plugin_layer_status()
and manual diagnostics setup. Create focused cases for the source-probe error
path, propagated resolution failure, effective plugin config loaded,
dynamic-only loaded, and unconfigured, and assert the returned Check
name/status/details for each outcome. Use plugin_resolution_check,
ResolvedConfig, and Check as the primary symbols to target the function directly
rather than relying on collect_configuration_* helpers.
- Around line 1377-1404: The doctor report output in
`report.configuration.plugin_configs` and
`report.configuration.plugin_resolution` uses the same “Plugins” label for two
different concepts, which makes the diagnostics ambiguous. Update the label in
the per-layer `plugin_configs` loop inside the formatting block to a more
specific name such as “Plugin files” or “Plugin config”, and keep the final
`plugin_resolution` summary as “Plugins” so the `doctor.rs` output clearly
distinguishes the two sections.

In `@crates/cli/src/plugin_install/mod.rs`:
- Around line 93-112: The default doctor flow can block indefinitely because
collect_default_host_plugin_readiness() triggers host CLI subprocesses with no
timeout. Update the readiness path in
collect_default_host_plugin_readiness()/collect_host_plugin_readiness() so each
host check is bounded, either by running the host probe on a worker thread with
a join timeout or by adding a timeout-capable wrapper to
CommandRunner::run/run_quiet/run_capture. Keep doctor::collect_report aligned
with its quick-return contract by ensuring require_host_cli,
host_registration_report, and run_plugin_doctor_json cannot hang the overall
nemo-relay doctor command.
- Around line 578-595: The equality check in generated_manifest_check is too
strict because marketplace::plugin_manifest(host) includes the running binary’s
volatile version field, causing valid plugin.json files to fail after upgrades.
Update generated_manifest_check to compare manifests after ignoring or removing
the version field from both the on-disk Value and the expected Value, keeping
the rest of the plugin_manifest(host) structure validated while preserving the
existing error handling and status messages.

---

Outside diff comments:
In `@crates/cli/src/plugin_install/mod.rs`:
- Around line 411-436: The host registration JSON in doctor_host_json_value is
collapsing unknown into false by using unwrap_or(false) on
readiness.host_plugin_registered and readiness.host_marketplace_registered.
Update the host_registration object to preserve the Option<bool> state returned
by collect_host_plugin_readiness so consumers can distinguish “not verifiable”
from “confirmed false,” while keeping the existing ok calculation based on both
values being true when present.
🪄 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: 66f9d350-697f-4841-92f7-9676d6338064

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfa2fe and 3b2a3d6.

📒 Files selected for processing (9)
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • docs/nemo-relay-cli/plugin-installation.mdx
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (19)
**/*.{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/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
**/*.{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/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
**/*.{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/nemo-relay-cli/plugin-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/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
**/*.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/nemo-relay-cli/plugin-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/nemo-relay-cli/plugin-installation.mdx
docs/**/*.mdx

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

Update documentation if activation or usage changes

Files:

  • docs/nemo-relay-cli/plugin-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/plugin-installation.mdx
**/*.rs

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

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

**/*.rs: Use cargo fmt (rustfmt defaults) for Rust code changed in the core runtime or Rust-facing API surface.
Run cargo clippy -- -D warnings and keep Rust code warning-free; all warnings are treated as errors.
Use Rust snake_case naming conventions.

Use snake_case for Rust identifiers.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
**/*.{rs,py,go,ts,js,mjs,cjs,jsx,tsx,c,h}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions: Rust and Python use snake_case, C FFI exports use the nemo_relay_ prefix, Go public APIs use PascalCase, and Node.js uses camelCase.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
crates/**/*.{rs,py,ts,js,c,h}

📄 CodeRabbit inference engine (AGENTS.md)

crates/**/*.{rs,py,ts,js,c,h}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at wrapper layers.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
crates/**/src/**/*.rs

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

crates/**/src/**/*.rs: Keep the stable plugin boundary explicit: native plugins cross a C ABI, and worker plugins cross grpc-v1. Do not pass Rust runtime types, trait objects, futures, or allocator-owned strings across the native dynamic-library boundary.
Manifest validation must cover kind, compatibility, load contract, integrity, capability mismatch, and disabled-plugin behavior.
The native loader must keep libraries alive until registered callbacks are cleared and must deregister plugin kinds before unload.
Runtime helpers must cover marks, scopes, continuations, and isolated scope stacks.
plugins list, plugins inspect, and plugins validate must report lifecycle and compatibility status without leaking secret config.
The top-level doctor command must report resolved dynamic plugin and host configuration status.

Files:

  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/src/doctor.rs
🔇 Additional comments (28)
crates/cli/README.md (1)

36-38: LGTM!

docs/nemo-relay-cli/plugin-installation.mdx (1)

103-119: LGTM!

crates/cli/src/config.rs (3)

921-925: LGTM!


1087-1146: LGTM! contributing_sources accumulation and propagation through both the Some((value, sources)) and None branches is consistent, and the sort/dedup in the Some branch matches the dedup performed by effective_plugin_toml_sources().


1219-1230: LGTM! Including source.display() in the manifest-load and duplicate-id error messages materially improves debuggability across multi-file plugins.toml resolution.

crates/cli/tests/coverage/config_tests.rs (1)

787-792: LGTM! The contributing_sources assertions correctly validate both the "contains" case (mixed runtime + dynamic config) and the stricter equality case for policy-only layering across two sources.

Also applies to: 885-890, 1026-1036

crates/cli/src/doctor.rs (5)

31-99: LGTM! Wiring PluginConfigurationDiagnostics through collect_report/collect_configuration cleanly threads the new plugin source/resolution data without disturbing the existing configuration layer reporting.

Also applies to: 155-259


609-652: LGTM! Renaming the observability plugin check from "Plugins" to "Plugin validation" avoids a label collision with the new "Plugins" resolution line introduced elsewhere in this file.


1299-1326: LGTM! Wiring host_plugins readiness and plugin_resolution status into exit_code/report_has_warn correctly surfaces failures from the new checks.


1445-1469: LGTM! The "Host plugins" section clearly renders per-plugin readiness with actionable remediation text.


369-391: 🎯 Functional Correctness

No syntax issue here The if let ... && matches!(...) form is valid on the pinned Rust 1.93.0 toolchain with edition 2024, so this block doesn’t need a change.

			> Likely an incorrect or invalid review comment.
crates/cli/tests/coverage/doctor_tests.rs (4)

87-136: LGTM! empty_report() correctly models the new fields, and exit_code_fails_when_an_installed_host_plugin_is_unready gives solid end-to-end coverage of the host-plugin failure path across human and JSON output.

Also applies to: 197-232


235-258: LGTM! Section-order assertions correctly account for the new "Plugin configuration" header.


418-457: LGTM! Good coverage of plugin_layer_status across contributing, non-contributing, and source-specific error cases.


492-500: LGTM! Updated PluginConfigurationDiagnostics fixtures keep these existing tests aligned with the new struct shape.

Also applies to: 680-688

crates/cli/src/plugin_install/mod.rs (7)

14-14: LGTM!

Also applies to: 23-25


41-91: LGTM!


210-244: LGTM!


389-409: LGTM!


438-554: LGTM!


556-576: LGTM!


597-614: LGTM!

crates/cli/src/plugin_install/host.rs (2)

10-13: LGTM!


127-160: 🎯 Functional Correctness

#[cfg(test)] is fine here. Both helpers are only referenced from crates/cli/tests/coverage/plugin_install_tests.rs, so removing them from release builds won’t break production callers.

			> Likely an incorrect or invalid review comment.
crates/cli/tests/coverage/plugin_install_tests.rs (4)

287-292: LGTM!


692-780: LGTM!


1367-1473: LGTM!


1475-1568: LGTM!

Comment thread crates/cli/src/config.rs
Comment thread crates/cli/src/doctor.rs
Comment thread crates/cli/src/doctor.rs
Comment thread crates/cli/src/plugin_install/mod.rs
Comment thread crates/cli/src/plugin_install/mod.rs

@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.

Please remove all emojis from the docs.

Comment thread crates/cli/README.md Outdated
@willkill07 willkill07 added this to the 0.5 milestone Jul 2, 2026
@willkill07 willkill07 self-assigned this Jul 2, 2026
Signed-off-by: Will Killian <wkillian@nvidia.com>
Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07 willkill07 force-pushed the wkk_relay-316-setup-readiness branch from 3b2a3d6 to 60b6088 Compare July 2, 2026 23:53
@github-actions github-actions Bot added size:XL PR is extra large and removed size:L PR is large labels Jul 2, 2026
Signed-off-by: Will Killian <wkillian@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: 2

Caution

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

⚠️ Outside diff range comments (1)
crates/cli/src/doctor.rs (1)

1311-1327: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

report_has_warn's host_plugins clause is unreachable.

Both exit_code() (Line 1299) and report_has_warn() (Line 1321) test the identical report.host_plugins.iter().any(|plugin| !plugin.ok()) condition. Since format_human only calls report_has_warn when exit_code(report) == 0 (Line 1486), and an unready host plugin already forces exit_code to fail, this clause in report_has_warn can never fire in practice. Harmless today, but misleading for future maintainers trying to reason about warn vs. fail semantics.

🤖 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/src/doctor.rs` around lines 1311 - 1327, The host_plugins warning
check in report_has_warn is dead code because the same condition is already
handled by exit_code and format_human only reaches report_has_warn when
exit_code(report) is 0. Update report_has_warn in doctor.rs to remove the
redundant report.host_plugins.iter().any(|plugin| !plugin.ok()) clause, and keep
the remaining warn checks focused on statuses that can actually surface as
warnings; use report_has_warn and exit_code as the main references when
verifying the control flow.
🤖 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/src/doctor.rs`:
- Around line 1394-1403: The Plugin files row in doctor::report formatting is
missing a separator because the label is longer than the fixed field width, so
it runs into format_layer(layer) output. Update the label handling in the
plugin_configs loop in report output so the first row includes a trailing space
or otherwise inserts explicit separation, matching the spacing style used by the
other aligned rows in doctor.rs.

In `@crates/cli/src/plugin_install/mod.rs`:
- Around line 107-120: The per-host readiness wait in
collect_default_host_plugin_readiness and the related flow in
spawn_default_host_plugin_readiness/receive_host_plugin_readiness is done
sequentially, so timeouts add up across Codex and Claude Code. Change the
aggregation to use a shared deadline or equivalent total timeout so all default
host readiness results are awaited within one bounded window instead of one full
DEFAULT_HOST_PLUGIN_READINESS_TIMEOUT per host. Keep the concurrent spawning,
but ensure the final collection returns as soon as the overall timeout is
reached rather than blocking per host.

---

Outside diff comments:
In `@crates/cli/src/doctor.rs`:
- Around line 1311-1327: The host_plugins warning check in report_has_warn is
dead code because the same condition is already handled by exit_code and
format_human only reaches report_has_warn when exit_code(report) is 0. Update
report_has_warn in doctor.rs to remove the redundant
report.host_plugins.iter().any(|plugin| !plugin.ok()) clause, and keep the
remaining warn checks focused on statuses that can actually surface as warnings;
use report_has_warn and exit_code as the main references when verifying the
control flow.
🪄 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: 30d05f6a-377e-4487-99a9-bd051e6b6d57

📥 Commits

Reviewing files that changed from the base of the PR and between 3b2a3d6 and 60b6088.

📒 Files selected for processing (9)
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/src/plugin_install/mod.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • docs/nemo-relay-cli/plugin-installation.mdx
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (19)
**/*.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)

For documentation-site changes, run the docs build/validation flow (just docs or ./scripts/build-docs.sh html) so generated Fern API reference pages are refreshed before validation.

In MDX files, top-of-file comments must use JSX comment delimiters {/* ... */} for SPDX headers; do not use HTML comments

Files:

  • docs/nemo-relay-cli/plugin-installation.mdx
**/*.{rs,py,go,js,ts,jsx,tsx,md,mdx,toml,yaml,yml,html}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include an SPDX license header using the comment syntax appropriate for the file type, with SPDX-FileCopyrightText for 2026 NVIDIA CORPORATION & AFFILIATES and SPDX-License-Identifier: Apache-2.0.

Files:

  • docs/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{rs,py,go,js,ts,md,mdx,toml,yaml,yml,json}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Avoid using SONAR_IGNORE_START / SONAR_IGNORE_END except for documented false positives; keep the ignored block small, add a brief explanatory comment, and call it out in the PR description.

Files:

  • docs/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{md,mdx}

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

**/*.{md,mdx}: Keep package names, repository references, and build commands current in documentation and examples
Keep stable user-facing wrappers at the scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work

Files:

  • docs/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/README.md
{RELEASING.md,docs/**/*.md,docs/**/*.mdx}

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

Keep release-process and release-notes guidance in maintainer-facing docs such as RELEASING.md, not in user-facing docs pages or CHANGELOG.md

Files:

  • docs/nemo-relay-cli/plugin-installation.mdx
**

⚙️ 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:

  • docs/nemo-relay-cli/plugin-installation.mdx
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
{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/plugin-installation.mdx
**/*.rs

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

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

Follow Rust naming conventions, including snake_case identifiers and Rust-facing runtime API shapes.

**/*.rs: When changing the core runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and pass cargo deny check.
When touching the core Rust crate, run the Rust tests and the other affected binding test suites because the bindings depend on the core runtime.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{rs,py,js,ts,mjs,c,h,md,toml,yml,yaml,sh,json,go}

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/README.md
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use the naming conventions appropriate to each language: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{rs,py,go,js,ts,wasm}

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

Ensure binding-native wrappers expose the same observability configuration knobs and lifecycle behavior across Rust, Python, Go, Node.js, and WebAssembly.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
**/*.{rs,rlib}

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

**/*.{rs,rlib}: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/config.rs
  • crates/cli/src/plugin_install/host.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/plugin_install/mod.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/plugin_install_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
**/*.{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
**/README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update README.md, package READMEs, and binding-support notes when public behavior, package names, examples, or supported bindings change.

Update binding-level README files when behavior differs by language.

Files:

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

29-39: LGTM!

Also applies to: 42-50

docs/nemo-relay-cli/plugin-installation.mdx (1)

103-119: LGTM!

crates/cli/src/config.rs (1)

901-905: LGTM!

Also applies to: 1005-1114, 1171-1184

crates/cli/tests/coverage/config_tests.rs (1)

15-99: LGTM!

Also applies to: 847-852, 945-950, 1086-1096, 1320-1347

crates/cli/src/doctor.rs (1)

31-99: LGTM!

Also applies to: 131-304, 369-391, 606-678, 1289-1310

crates/cli/tests/coverage/doctor_tests.rs (1)

89-138: LGTM!

Also applies to: 199-277, 436-546, 581-590, 769-778

crates/cli/src/plugin_install/mod.rs (1)

42-186: LGTM!

Also applies to: 284-318, 457-696

crates/cli/tests/coverage/plugin_install_tests.rs (1)

287-292: LGTM!

Also applies to: 1367-1556, 1583-1651

crates/cli/src/plugin_install/host.rs (1)

10-13: Check for remaining non-test callers of the gated helpers
If any production code still calls validate_host_registration or HostRegistrationReport::to_json, this #[cfg(test)] split will break release builds.

Comment thread crates/cli/src/doctor.rs
Comment thread crates/cli/src/plugin_install/mod.rs
Signed-off-by: Will Killian <wkillian@nvidia.com>
Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07 willkill07 requested review from a team and removed request for lvojtku July 3, 2026 01:23
@willkill07 willkill07 requested a review from lvojtku July 3, 2026 01:23

@zhongxuanwang-nv zhongxuanwang-nv 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.

Verified these potential nitty things with powerful AIs, and generally LGTM! Thanks Will!

Comment thread crates/cli/src/plugin_install/mod.rs
Comment thread crates/cli/src/plugin_install/mod.rs
Comment thread crates/cli/src/doctor.rs
@willkill07

Copy link
Copy Markdown
Member Author

/merge

@rapids-bot rapids-bot Bot merged commit 70b7559 into NVIDIA:main Jul 3, 2026
36 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 lang:rust PR changes/introduces Rust code size:XL PR is extra large

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants