Skip to content

fix(cli): guide setup into plugin configuration#358

Merged
rapids-bot[bot] merged 4 commits into
NVIDIA:mainfrom
ericevans-nv:fix/guided-plugin-setup
Jul 3, 2026
Merged

fix(cli): guide setup into plugin configuration#358
rapids-bot[bot] merged 4 commits into
NVIDIA:mainfrom
ericevans-nv:fix/guided-plugin-setup

Conversation

@ericevans-nv

@ericevans-nv ericevans-nv commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Overview

The interactive nemo-relay config wizard currently ends after writing the base config.toml, leaving a first-time user to discover and run nemo-relay plugins edit as a separate step.

This change connects those existing flows. After the base configuration is saved, Relay asks whether the user wants to configure plugins now. Accepting the prompt opens the existing plugin editor in-process; declining keeps the completed base configuration and prints the exact command for resuming later.

  • 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

Guided setup flow

The interactive path now proceeds as follows:

  1. Run nemo-relay config.
  2. Choose where to save the base configuration: project, global, or both.
  3. Choose which coding agents Relay should observe.
  4. Review the generated config.toml and confirm Looks good?.
  5. Relay writes the base configuration and prints the saved path or paths.
  6. Relay asks Configure Relay plugins now? [Y/n].
    • Yes (the default) opens the existing plugin editor.
    • No exits successfully, leaves the base configuration saved, and prints the correct resume command.

The new prompt controls only whether the plugin editor opens. It does not control the already-completed base configuration save, and selecting Yes does not save plugin changes automatically.

Plugin editor walkthrough

When the user selects Yes, the existing plugins edit menu opens:

  • Observability — enabled by default; opens its available output and tracing sections.
  • Adaptive — enables or configures adaptive runtime behavior.
  • NeMo Guardrails — enables or configures guardrail behavior.
  • PII Redaction — enables or configures request/response redaction.
  • Preview TOML (p) — shows the resulting plugins.toml before writing it.
  • Save (s) — writes plugins.toml and completes the guided flow.
  • Cancel (q) — exits without saving plugin changes; the base config.toml remains saved.

The existing navigation remains unchanged: arrow keys or j/k move through the menu, Enter/Space selects, and the existing reset/clear/help shortcuts continue to work.

Scope mapping and resume behavior
Base setup scope Plugin editor target Resume command
Project Project plugins.toml nemo-relay plugins edit --project
Global User plugins.toml nemo-relay plugins edit
Both Project plugins.toml because project configuration takes precedence nemo-relay plugins edit --project
Cancellation and partial setup

The base configuration is never rolled back after it has been saved:

  • Declining the new prompt is treated as an intentional skip and exits successfully.
  • Ctrl-C/EOF at the new prompt reports that plugin setup was cancelled, confirms the base configuration remains saved, and prints the resume command.
  • Cancelling inside the plugin editor reports that no plugin changes were saved.
  • Other plugin-editor failures retain their cause while explaining that the base configuration remains saved and how to resume.
Compatibility and implementation
  • Reuses the existing plugins::edit implementation rather than adding a second editor or duplicating plugin logic.
  • Leaves direct nemo-relay plugins edit usage and menu behavior unchanged, aside from clearer cancellation wording.
  • Preserves explicit configuration and non-interactive workflows.
  • Leaves nemo-relay config --reset unchanged.
  • Adds no new configuration files, CLI flags, or persisted settings.
  • Adds focused tests for project/global/both scope mapping, resume commands, and post-save prompt errors.
  • User-facing documentation is intentionally separated into follow-up PR docs(cli): document guided plugin setup #359.

Validation completed:

  • cargo fmt --all --check
  • cargo clippy -p nemo-relay-cli --all-targets -- -D warnings
  • cargo test -p nemo-relay-cli — 704 tests passed
  • Repository pre-commit hooks — passed

No breaking changes.

Where should the reviewer start?

Start with continue_to_plugins in crates/cli/src/setup.rs. It contains the new post-save handoff and partial-setup error handling. Then review:

  1. crates/cli/src/setup/model.rs for setup-scope to plugin-scope mapping.
  2. crates/cli/tests/coverage/setup_tests.rs for mapping and error-message coverage.
  3. crates/cli/src/plugins.rs for the cancellation wording clarification.

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

  • Relates to RELAY-315

Summary by CodeRabbit

  • New Features

    • Plugin configuration setup now prompts immediately after saving config.toml, with an option to continue now or resume later using a clear follow-up command.
  • Bug Fixes

    • Standardized plugin edit cancellation messaging for interruption and end-of-file cases, consistently stating no plugin changes were saved.
  • Tests

    • Added unit tests validating plugin command/resume command generation by scope and verifying cancellation/interruption detection behavior.

@github-actions github-actions Bot added size:M PR is medium 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

Walkthrough

Setup now prompts to continue into plugin configuration after saving the base config. It adds scope-specific plugin command helpers, standardizes plugin cancellation text, and extends CLI coverage for the new flow.

Changes

Continue-to-plugins flow

Layer / File(s) Summary
Cancellation message wording
crates/cli/src/plugins.rs
Updates plugin cancellation errors to use the shared “plugin edit cancelled; no plugin changes saved” message in the cancel, menu interruption, and editor interruption paths.
Scope-to-command helpers
crates/cli/src/setup/model.rs
Adds helpers that map ConfigScope to a plugin edit command target and to the resume command string used after skipping plugin setup.
Continue-to-plugins prompt wiring
crates/cli/src/setup.rs
After saving the base config, setup prompts to continue into plugin configuration, invokes the plugin editor on acceptance, handles interrupted prompts, and prints the updated skipped-plugin message with a resume command.
Coverage for helpers and errors
crates/cli/tests/coverage/setup_tests.rs, crates/cli/tests/coverage/plugins_tests.rs
Adds tests for scope-to-command mapping, resume-command generation, prompt interruption detection, and shared cancellation error handling.

Estimated code review effort: 3 (Moderate) | ~25 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title uses Conventional Commits with the correct type and scope and clearly matches the plugin setup flow change.
Description check ✅ Passed The description follows the template with Overview, Details, review start, and related issue sections, and the content is sufficiently specific.
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.

@ericevans-nv ericevans-nv changed the title [codex] Guide setup into plugin configuration Guide setup into plugin configuration Jul 2, 2026
@ericevans-nv ericevans-nv self-assigned this Jul 2, 2026
@ericevans-nv ericevans-nv added the Improvement improvement to existing functionality label Jul 2, 2026
@ericevans-nv ericevans-nv marked this pull request as ready for review July 2, 2026 22:30
@ericevans-nv ericevans-nv requested review from a team and lvojtku as code owners July 2, 2026 22:30
@github-actions github-actions Bot removed the Improvement improvement to existing functionality label Jul 2, 2026
@ericevans-nv ericevans-nv changed the title Guide setup into plugin configuration fix(cli): guide setup into plugin configuration Jul 2, 2026
@github-actions github-actions Bot added the Bug issue describes bug; PR fixes bug label Jul 2, 2026
@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: 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/src/setup.rs`:
- Around line 137-139: The `run()` flow in `crates/cli/src/setup.rs` treats
`continue_to_plugins(...)` as fatal when the optional plugin prompt is
interrupted, even though an explicit “no” returns `Ok(())`; make the
cancellation path match the decline path by handling the `plugin_prompt_error`
result in `continue_to_plugins`/`run()` and converting Ctrl+C or EOF at that
prompt into a graceful skip instead of propagating an error, unless the intended
contract is to fail the whole `config` command.
🪄 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: cc945db1-7af9-4dd5-b75b-f7b926806f6c

📥 Commits

Reviewing files that changed from the base of the PR and between 38dec26 and a767764.

📒 Files selected for processing (5)
  • crates/cli/src/plugins.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • docs/nemo-relay-cli/basic-usage.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 (13)
**/*.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/basic-usage.mdx
**/*

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • docs/nemo-relay-cli/basic-usage.mdx
  • crates/cli/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
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/basic-usage.mdx
**/*.{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:

  • docs/nemo-relay-cli/basic-usage.mdx
  • crates/cli/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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:

  • docs/nemo-relay-cli/basic-usage.mdx
docs/**/*.mdx

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

Update documentation if activation or usage changes

Files:

  • docs/nemo-relay-cli/basic-usage.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/basic-usage.mdx
  • crates/cli/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/basic-usage.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/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/src/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/setup/model.rs
  • crates/cli/src/plugins.rs
  • crates/cli/src/setup.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/setup_tests.rs
🔇 Additional comments (5)
crates/cli/tests/coverage/setup_tests.rs (1)

577-654: LGTM!

docs/nemo-relay-cli/basic-usage.mdx (1)

172-177: LGTM!

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

327-327: LGTM!

Also applies to: 613-613, 1372-1372

crates/cli/src/setup/model.rs (1)

11-11: LGTM!

Also applies to: 36-64

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

30-31: LGTM!

Comment thread crates/cli/src/setup.rs
@willkill07 willkill07 added this to the 0.5 milestone Jul 2, 2026
Signed-off-by: Eric Evans <194135482+ericevans-nv@users.noreply.github.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

♻️ Duplicate comments (1)
crates/cli/src/setup.rs (1)

137-139: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Interrupt/EOF at either plugin-related prompt still fails the whole config command.

This is the same asymmetry flagged in a previous review: an explicit "no" at continue_to_plugins's confirm returns Ok(()) via print_plugins_skipped, but Ctrl+C/EOF at that same prompt goes through plugin_prompt_error and propagates as Err, failing the entire nemo-relay config invocation with a nonzero exit — even though the primary goal (saving config.toml) already succeeded.

The same pattern now also applies one level deeper: if the user accepts the prompt and then cancels the nested plugin editor (via plugins.rs's cancelled_error/menu_error/editor_error, all wrapped by crate::plugins::edit(...).map_err(...) here), that cancellation is likewise surfaced as a hard Err from run(), not a graceful skip — despite config.toml still being saved correctly in both cases.

Since plugin_prompt_error_reports_cancellation_with_base_saved_and_resume locks in the current "Err on interrupt" behavior, this looks intentional, but it's worth confirming that failing the overall config command on an interrupted optional continuation step is the desired contract for scripts/automation that treat any nonzero exit as failure.

Also applies to: 148-191

🤖 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/setup.rs` around lines 137 - 139, The optional plugin
continuation path in `continue_to_plugins` and the nested
`crate::plugins::edit(...).map_err(...)` flow currently turn Ctrl+C/EOF into
hard errors that fail `run()` even after `config.toml` was already saved. Update
these prompt handlers so interruption at the plugin-related prompts is treated
like an intentional skip (same as the explicit “no” path) and returns `Ok(())`
instead of propagating `plugin_prompt_error`, keeping `nemo-relay config`
successful when only the optional plugin step is canceled.
🤖 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/plugins.rs`:
- Around line 326-328: The cancellation text is duplicated across
cancelled_error, menu_error, and editor_error, so extract the shared wording
into a single constant or helper and have all three functions reference it.
Update the CliError::Config construction sites in plugins.rs to use that shared
symbol instead of repeating the literal, keeping the message consistent
everywhere.

---

Duplicate comments:
In `@crates/cli/src/setup.rs`:
- Around line 137-139: The optional plugin continuation path in
`continue_to_plugins` and the nested `crate::plugins::edit(...).map_err(...)`
flow currently turn Ctrl+C/EOF into hard errors that fail `run()` even after
`config.toml` was already saved. Update these prompt handlers so interruption at
the plugin-related prompts is treated like an intentional skip (same as the
explicit “no” path) and returns `Ok(())` instead of propagating
`plugin_prompt_error`, keeping `nemo-relay config` successful when only the
optional plugin step is canceled.
🪄 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: 400fa6ba-46b5-43f6-9fd5-df25e749f556

📥 Commits

Reviewing files that changed from the base of the PR and between a767764 and 8db2208.

📒 Files selected for processing (4)
  • crates/cli/src/plugins.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Check / Run
🧰 Additional context used
📓 Path-based instructions (8)
**/*.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/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
**/*

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • crates/cli/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/src/setup.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/src/plugins.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.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/setup_tests.rs
🔇 Additional comments (4)
crates/cli/src/setup/model.rs (1)

11-11: LGTM!

Also applies to: 36-64

crates/cli/src/setup.rs (2)

30-31: LGTM!


193-201: LGTM!

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

577-654: LGTM! Good coverage of scope mapping and both cancellation/failure message-formatting paths.

Comment thread crates/cli/src/plugins.rs
@willkill07 willkill07 removed the request for review from lvojtku July 3, 2026 00:12
Signed-off-by: Eric Evans <194135482+ericevans-nv@users.noreply.github.com>
Signed-off-by: Eric Evans <194135482+ericevans-nv@users.noreply.github.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/src/setup.rs`:
- Around line 160-166: The plugin setup error message is being constructed in
multiple places, which risks drift between the prompt and edit error paths.
Extract the shared “plugin setup did not complete; base configuration remains
saved. Resume with ...” formatting into a small helper in setup.rs, and reuse it
from the error handling around the prompt/edit flow via
plugins_resume_command(scope) so both branches emit the same message with the
same Cause text.
🪄 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: e91e6b72-5db3-4a5b-b039-aede4a6c08f5

📥 Commits

Reviewing files that changed from the base of the PR and between 8db2208 and 9e26fa4.

📒 Files selected for processing (4)
  • crates/cli/src/plugins.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
📜 Review details
🧰 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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/plugins.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/plugins_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
🔇 Additional comments (5)
crates/cli/src/plugins.rs (1)

33-34: LGTM!

Also applies to: 329-329, 610-619, 1366-1378

crates/cli/src/setup.rs (2)

149-183: Ctrl+C-at-prompt fix looks correct.

Interruption now mirrors the explicit "no" path (skip + Ok(())), resolving the earlier asymmetry between decline and interrupt.


185-194: LGTM!

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

579-627: LGTM!

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

618-637: LGTM!

Comment thread crates/cli/src/setup.rs
…etup

Signed-off-by: Eric Evans <194135482+ericevans-nv@users.noreply.github.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)
crates/cli/src/setup/model.rs (1)

190-213: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Preserve legacy [plugins] until migration runs
read_existing_defaults() still accepts old config.toml files, but write_or_merge() always drops the existing plugins table before rewriting. If an unmigrated config reaches nemo-relay config, that plugin data is lost with no warning or backup. Add an explicit migration/guard here, or keep the legacy block until it has been moved to plugins.toml.

🤖 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/setup/model.rs` around lines 190 - 213, The write_or_merge
function is dropping the legacy plugins table unconditionally, which can erase
unmigrated config data. Update write_or_merge in model.rs to either preserve the
existing [plugins] block unless a migration step has already moved it to
plugins.toml, or add an explicit migration/guard before calling
existing.remove("plugins"). Keep the behavior tied to the merge flow around
read_existing_defaults and merge_agents_entry so legacy plugin settings are not
lost during nemo-relay config writes.
🤖 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 `@crates/cli/src/setup/model.rs`:
- Around line 190-213: The write_or_merge function is dropping the legacy
plugins table unconditionally, which can erase unmigrated config data. Update
write_or_merge in model.rs to either preserve the existing [plugins] block
unless a migration step has already moved it to plugins.toml, or add an explicit
migration/guard before calling existing.remove("plugins"). Keep the behavior
tied to the merge flow around read_existing_defaults and merge_agents_entry so
legacy plugin settings are not lost during nemo-relay config writes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 0960727f-e337-4cee-9f83-f7a8b3eb7fef

📥 Commits

Reviewing files that changed from the base of the PR and between 9e26fa4 and cb15760.

📒 Files selected for processing (2)
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/setup_tests.rs
📜 Review details
🧰 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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/src/setup/model.rs
  • crates/cli/tests/coverage/setup_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/setup_tests.rs
🔇 Additional comments (2)
crates/cli/src/setup/model.rs (1)

36-64: LGTM!

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

449-475: LGTM!

Also applies to: 578-628

@willkill07

Copy link
Copy Markdown
Member

/merge

1 similar comment
@ericevans-nv

Copy link
Copy Markdown
Contributor Author

/merge

@rapids-bot rapids-bot Bot merged commit b4e271c 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

Bug issue describes bug; PR fixes bug lang:rust PR changes/introduces Rust code size:M PR is medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants