feat: add setup readiness diagnostics#357
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Enterprise Run ID: 📒 Files selected for processing (1)
📜 Recent review details⏰ Context from checks skipped due to timeout. (2)
🧰 Additional context used📓 Path-based instructions (9)**/*.rs📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
Files:
**/*.{rs,py,js,ts,mjs,c,h,md,toml,yml,yaml,sh,json,go}📄 CodeRabbit inference engine (AGENTS.md)
Files:
**/*.{rs,py,go,js,ts,jsx,tsx,md,mdx,toml,yaml,yml,html}📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
**/*.{rs,py,go,js,ts}📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
**/*.{rs,py,go,js,ts,md,mdx,toml,yaml,yml,json}📄 CodeRabbit inference engine (CONTRIBUTING.md)
Files:
**/*.{rs,py,go,js,ts,wasm}📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)
Files:
**/*.{rs,rlib}📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Files:
**⚙️ CodeRabbit configuration file
Files:
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}⚙️ CodeRabbit configuration file
Files:
🔇 Additional comments (3)
WalkthroughAdds plugin TOML source tracking, plugin-resolution reporting in doctor, host plugin readiness output, and updated tests/docs. ChangesPlugin Resolution and Doctor Readiness
Estimated code review effort: 4 (Complex) | ~60 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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_registeredcollapse "unknown" into "false".
readiness.host_plugin_registered/host_marketplace_registeredareOption<bool>and stayNonewhen the host CLI isn't available (require_host_clifails, sohost_registration_reportis never even attempted).unwrap_or(false)then reports these as a definitefalseinhost_registration, which is indistinguishable in the JSON contract from "checked and confirmed unregistered." Consumers ofdoctor-jsoncan'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
📒 Files selected for processing (9)
crates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/doctor.rscrates/cli/src/plugin_install/host.rscrates/cli/src/plugin_install/mod.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/plugin_install_tests.rsdocs/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 spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen 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 withNVIDIAon 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 withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually 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
NVIDIAin all caps. Do not useNvidia,nvidia, orNV.
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.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen 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.mddocs/nemo-relay-cli/plugin-installation.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/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.mddocs/nemo-relay-cli/plugin-installation.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/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 asRELEASING.md, not in user-facing docs pages orCHANGELOG.md.
Keep stable user-facing wrappers at thescripts/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, andgrpc-v1protocol details on separate pages.
Dynamic plugin manifests in docs and examples should usecompat.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, runjust docs;./scripts/build-docs.sh htmlremains 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, andgrpc-v1protocol details on separate pages.
Files:
crates/cli/README.mddocs/nemo-relay-cli/plugin-installation.mdx
**/README.md
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
**/README.md: UpdateREADME.mdwhen entry points change.
Update relevant package or crateREADME.mdfiles 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:
- Scope stacks decide where work belongs and which scope-local behavior is visible.
- Middleware registries decide what guardrails and intercepts run around managed calls.
- Plugins install reusable runtime behavior from configuration.
- Events record runtime behavior in ATOF form.
- 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 patternsPrerequisites
Insta...
Files:
crates/cli/README.mddocs/nemo-relay-cli/plugin-installation.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/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 underdocs/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 runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor all FFI work since it is Rust work
Runjust test-rustto validate FFI changes
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting on FFI workWhen Rust files changed as part of Go work, also run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allwhen Rust files are changed as part of Node work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files are changed as part of Node work
Runjust test-rustwhen Rust files are changed as part of Node work
**/*.rs: Usecargo fmt(rustfmt defaults) for Rust code changed in the core runtime or Rust-facing API surface.
Runcargo clippy -- -D warningsand keep Rust code warning-free; all warnings are treated as errors.
Use Rustsnake_casenaming conventions.Use
snake_casefor Rust identifiers.
Files:
crates/cli/tests/coverage/config_tests.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/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 thenemo_relay_prefix, Go public APIs usePascalCase, and Node.js usescamelCase.
Files:
crates/cli/tests/coverage/config_tests.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/cli/src/doctor.rs
crates/**/*.{rs,py,ts,js,c,h}
📄 CodeRabbit inference engine (AGENTS.md)
crates/**/*.{rs,py,ts,js,c,h}: UseJson = serde_json::Valuein Rust-facing runtime APIs where the existing code expects JSON payloads.
UseResult<T>withFlowErrorin 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.rscrates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/plugin_install/mod.rscrates/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.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/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 crossgrpc-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, andplugins validatemust report lifecycle and compatibility status without leaking secret config.
The top-leveldoctorcommand must report resolved dynamic plugin and host configuration status.
Files:
crates/cli/src/plugin_install/host.rscrates/cli/src/config.rscrates/cli/src/plugin_install/mod.rscrates/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_sourcesaccumulation and propagation through both theSome((value, sources))andNonebranches is consistent, and the sort/dedup in theSomebranch matches the dedup performed byeffective_plugin_toml_sources().
1219-1230: LGTM! Includingsource.display()in the manifest-load and duplicate-id error messages materially improves debuggability across multi-fileplugins.tomlresolution.crates/cli/tests/coverage/config_tests.rs (1)
787-792: LGTM! Thecontributing_sourcesassertions 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! WiringPluginConfigurationDiagnosticsthroughcollect_report/collect_configurationcleanly 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! Wiringhost_pluginsreadiness andplugin_resolutionstatus intoexit_code/report_has_warncorrectly 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 CorrectnessNo 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, andexit_code_fails_when_an_installed_host_plugin_is_unreadygives 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 ofplugin_layer_statusacross contributing, non-contributing, and source-specific error cases.
492-500: LGTM! UpdatedPluginConfigurationDiagnosticsfixtures 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 fromcrates/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!
lvojtku
left a comment
There was a problem hiding this comment.
Please remove all emojis from the docs.
Signed-off-by: Will Killian <wkillian@nvidia.com>
Signed-off-by: Will Killian <wkillian@nvidia.com>
3b2a3d6 to
60b6088
Compare
Signed-off-by: Will Killian <wkillian@nvidia.com>
There was a problem hiding this comment.
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) andreport_has_warn()(Line 1321) test the identicalreport.host_plugins.iter().any(|plugin| !plugin.ok())condition. Sinceformat_humanonly callsreport_has_warnwhenexit_code(report) == 0(Line 1486), and an unready host plugin already forcesexit_codeto fail, this clause inreport_has_warncan 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
📒 Files selected for processing (9)
crates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/doctor.rscrates/cli/src/plugin_install/host.rscrates/cli/src/plugin_install/mod.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/plugin_install_tests.rsdocs/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 docsor./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.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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_ENDexcept 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.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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 thescripts/root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work
Files:
docs/nemo-relay-cli/plugin-installation.mdxcrates/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:
- Scope stacks decide where work belongs and which scope-local behavior is visible.
- Middleware registries decide what guardrails and intercepts run around managed calls.
- Plugins install reusable runtime behavior from configuration.
- Events record runtime behavior in ATOF form.
- 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 patternsPrerequisites
Insta...
Files:
docs/nemo-relay-cli/plugin-installation.mdxcrates/cli/tests/coverage/config_tests.rscrates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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 runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor all FFI work since it is Rust work
Runjust test-rustto validate FFI changes
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting on FFI workWhen Rust files changed as part of Go work, also run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allwhen Rust files are changed as part of Node work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files are changed as part of Node work
Runjust test-rustwhen Rust files are changed as part of Node workFollow Rust naming conventions, including
snake_caseidentifiers and Rust-facing runtime API shapes.
**/*.rs: When changing the core runtime or Rust-facing API surface, format Rust code withcargo fmt(rustfmt defaults), keepcargo clippy -- -D warningsclean, and passcargo 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.rscrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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.rscrates/cli/README.mdcrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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 prefixednemo_relay_, GoPascalCase, Node.jscamelCase, and Pythonsnake_case.
Files:
crates/cli/tests/coverage/config_tests.rscrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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.rscrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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 runjust test-rust.
If any Rust code changed, also runcargo fmt --all.
If any Rust code changed, also runcargo clippy --workspace --all-targets -- -D warnings.
Files:
crates/cli/tests/coverage/config_tests.rscrates/cli/src/config.rscrates/cli/src/plugin_install/host.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/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.rscrates/cli/tests/coverage/plugin_install_tests.rscrates/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 spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen 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 withNVIDIAon 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 withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually 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
NVIDIAin all caps. Do not useNvidia,nvidia, orNV.
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.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen 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 callsvalidate_host_registrationorHostRegistrationReport::to_json, this#[cfg(test)]split will break release builds.
Signed-off-by: Will Killian <wkillian@nvidia.com>
Signed-off-by: Will Killian <wkillian@nvidia.com>
zhongxuanwang-nv
left a comment
There was a problem hiding this comment.
Verified these potential nitty things with powerful AIs, and generally LGTM! Thanks Will!
|
/merge |
Overview
Add unified
nemo-relay doctorsetup-readiness diagnostics for agents, discovered plugin configuration, and persistent Codex/Claude Code host-plugin installations.Details
plugins.tomllayers, effective-source provenance, semantic source errors, merged validation, and secret-safe JSON fields while retaining schema version 1.Plugin configurationandHost pluginsoutput sections, diagnostics tests, and CLI documentation.Where should the reviewer start?
Start with
crates/cli/src/doctor.rsfor the unified report and rendering, thencrates/cli/src/plugin_install/mod.rsfor shared host checks andcrates/cli/src/config.rsfor provenance.Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Summary by CodeRabbit
nemo-relay doctorplugin diagnostics with per-layer plugin configuration and an overall “Plugin resolution” check.doctor-json, including per-check results and remediation guidance.plugins.tomlvalidation errors now report the originatingplugins.tomlsource file.doctornow fails when persistent host plugins are installed but host readiness is not OK.--plugin/--install-dir) and forced-reinstall remediation details.