Skip to content

feat(cli): coding-agent sidecar UX — wizard, doctor, help, banner#83

Merged
rapids-bot[bot] merged 17 commits into
NVIDIA:mainfrom
AjayThorve:ajay/cli-for-sidecar
May 12, 2026
Merged

feat(cli): coding-agent sidecar UX — wizard, doctor, help, banner#83
rapids-bot[bot] merged 17 commits into
NVIDIA:mainfrom
AjayThorve:ajay/cli-for-sidecar

Conversation

@AjayThorve
Copy link
Copy Markdown
Contributor

@AjayThorve AjayThorve commented May 12, 2026

Overview

Builds out the user-facing surface of nemo-flow so a developer can go from "never used this" to "agent running with tracing wired up" without reading docs:

  • bare-agent shortcuts: nemo-flow claude|codex|cursor|hermes
  • guided first-run setup wizard with config pre-fill from existing TOML
  • doctor, agents, completions subcommands (--json on doctor/agents)
  • live pre-launch status block (gateway URL, ATIF dir, OpenInference endpoint) inside a rounded green border
  • animated NVIDIA-green ASCII banner with rounded border, comet tracer that settles at a vX.Y.Z tag sourced from CARGO_PKG_VERSION
  • bug fixes en route: codex ChatGPT JWT stripping, pass-through args, NMF-86 missing-OPENAI_API_KEY warning eagerness, friendlier AddrInUse copy

Renamed agent identifier claude-codeclaude so the CLI surface matches the binary users actually invoke (claude on $PATH) and reads naturally as nemo-flow claude; the longer form was redundant since "Claude Code" IS the CLI.

  • 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

CLI surface:

  • crates/cli/src/config.rsDoctor, Agents, Completions, Config, bare-agent (Claude/Codex/Cursor/Hermes) subcommand variants; per-agent long_about + after_help; ServerArgs::requested_daemon_mode() helper
  • crates/cli/src/main.rs — dispatch tree; bare-nemo-flow (no daemon flags) drops into the wizard instead of binding a port the user did not ask for
  • crates/cli/src/setup.rsDefaults pre-fill from existing TOML, dialoguer keybinding hint, agent-scoped wizard, reset support
  • crates/cli/src/doctor.rs — pure collect_report / format_human / format_json / exit_code helpers split from I/O
  • crates/cli/src/completions_install.rs — shell-aware completion install with atomic write (nemo-flow completions --install)
  • crates/cli/src/banner.rs — slanted ANSI-Shadow figlet in a rounded green border, partial-redraw tracer animation via \x1b7/\x1b8 save/restore (no full-banner reflicker), docked vX.Y.Z tag
  • crates/cli/src/launcher.rs — pre-launch live-status block wears the same green rounded border, width-fitted to the longest line; falls back to plain ASCII on non-TTY / NO_COLOR
  • crates/cli/src/server.rs — actionable copy when the gateway port is already in use

Release / distribution wiring is intentionally out of scope here — a teammate will land release.yml, install scripts, and Homebrew formula separately.

Where should the reviewer start?

  • crates/cli/src/main.rs::run for the dispatch tree and the bare-nemo-flow → wizard intent
  • crates/cli/src/banner.rs::animate_reveal for the partial-redraw animation and dock-tag settle
  • crates/cli/src/setup.rs::prompt_user for the wizard flow with pre-fill
  • crates/cli/src/launcher.rs::print_live_status for the bordered pre-launch block
  • Test coverage: crates/cli/tests/coverage/{banner,doctor,setup,completions_install,launcher}_tests.rs

Validation: cargo fmt --all, cargo clippy --workspace --all-targets -- -D warnings, just test-rust, and uv run pre-commit run --files <changed> all green.

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

  • Relates to: NMF-60

Summary by CodeRabbit

  • New Features

    • Interactive first-run setup with agent detection, Hermes hook install; nemo-flow doctor and nemo-flow agents; easy-path shortcuts (claude, codex, cursor, hermes); animated startup banner, pre-launch status display; completions install command.
  • Configuration

    • Migrate to .nemo-flow/config.toml / ~/.config/nemo-flow/config.toml with [upstream] and [observability]; standardize agent name to claude.
  • Bug Fixes

    • Clearer port-in-use errors and early OpenAI API key warnings.
  • Documentation

    • Updated integration guides and READMEs to match config and hook-forwarding changes.
  • Chores

    • Installer responsibilities streamlined to focus on hook-forwarding and merge logic.

@AjayThorve AjayThorve requested review from a team as code owners May 12, 2026 09:12
@github-actions github-actions Bot added size:XXL PR is very large feat lang:rust PR changes/introduces Rust code labels May 12, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 12, 2026

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Refactors CLI config to use config.toml, adds an interactive setup wizard with Hermes hook merging, introduces agent easy-path subcommands and live pre-launch status, implements an animated banner and completions installer, adds a diagnostics doctor, makes gateway forwarding route-aware for auth, simplifies installer responsibilities, and updates tests/docs.

Changes

CLI Setup, Diagnostics, and Agent Shortcuts

Layer / File(s) Summary
Dependencies & ATTRIBUTIONS
crates/cli/Cargo.toml, ATTRIBUTIONS-Rust.md
Add clap_complete and other CLI-support crates and update ATTRIBUTIONS with full license blocks.
Banner rendering and tests
crates/cli/src/banner.rs, crates/cli/tests/coverage/banner_tests.rs
New ANSI figlet banner with tracer animation (160 frames), testable pure renderers, plain fallback, and coverage tests.
Shell completion install
crates/cli/src/completions_install.rs, crates/cli/tests/coverage/completions_install_tests.rs
Implement completions install to detect shell, resolve install path (zsh/ZDOTDIR fallback, bash, fish XDG), generate clap completions, and write atomically; include tests for paths and detect_shell.
Configuration Model Refactor
crates/cli/src/config.rs
Migrate config shape to config.toml with upstream/observability/plugins/agents; add EasyPathCommand; canonicalize claude value; add any_config_file_exists() and modular apply_file_* helpers.
Interactive setup & Hermes hooks
crates/cli/src/setup.rs, related tests
Add interactive wizard (detect agents, prompt scope/agents/backends/upstream/hooks_path), build_config/save_config with merge/scoped replace semantics, reset, Hermes hook YAML generation and idempotent merge/install, and orchestrator run.
Installer simplification (hook-forward focus)
crates/cli/src/installer.rs
Remove install-time planning/writing responsibilities; retain hook-forward runtime helpers and merge logic; remove public install entrypoint.
Launcher easy path & run refinements
crates/cli/src/launcher.rs
Add easy_path() for agent shortcuts (runs setup when no config), synthesize RunCommand, refactor argv resolution for --agent vs inferred mode, pass Hermes hooks_path, print live pre-launch status, warn early on missing OPENAI key for Codex, and update Codex provider wiring.
System diagnostics (doctor)
crates/cli/src/doctor.rs, crates/cli/tests/coverage/doctor_tests.rs
Add DoctorReport schema, environment/config/agents/observability/completions probes (ATIF write, OpenInference HTTP), version probes with timeout, deterministic human and JSON formatters, run_doctor/run_agents, and tests.
Gateway route-aware forwarding & auth
crates/cli/src/gateway.rs, gateway tests
Replace route-agnostic forwarding with route-aware forward_upstream_request; sanitize headers, strip ChatGPT-Plus JWT-shaped Authorization for OpenAI routes when needed, inject provider auth from env when inbound missing; apply across buffered/streaming/passthrough/models paths; add tests.
Server bind error handling
crates/cli/src/server.rs
Map TcpListener bind AddrInUse into CliError::Launch with actionable message and wrap other bind errors as CliError::Io.
Main dispatch & completions integration
crates/cli/src/main.rs
Add agent shortcut subcommands routed to launcher::easy_path; dispatch Doctor/Agents; add Completions --install mode printing the written path and gen mode requiring --shell; change no-subcommand behavior to conditional daemon vs setup based on requested_daemon_mode().
Tests and integration coverage
crates/cli/tests/*, crates/cli/tests/coverage/*
Add/update tests covering easy-path help/setup non-TTY, config TOML layout and merges, banner, completions paths, doctor reporting, gateway auth, launcher behavior, setup merge semantics, Hermes hook install merging, and installer/launcher naming updates.
Documentation & integration bundles
docs/integrate-frameworks/*, integrations/*
Update agent integration docs and integration README to use .nemo-flow/config.toml/~/.config/nemo-flow/config.toml, new [upstream]/[observability] layout, canonical claude naming, nemo-flow hook-forward claude commands, and Hook Forwarding/Standalone Gateway guidance.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 14

Caution

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

⚠️ Outside diff range comments (2)
docs/integrate-frameworks/coding-agent-gateway.md (1)

223-223: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix stale install command after claude rename.

This still uses nemo-flow install claude-code, but the document now standardizes on claude. Please update this command to avoid a broken/stale setup path.

As per coding guidelines, "Ensure commands, package names, file paths, and APIs in documentation are correct and not stale; flag incorrect or outdated information as blocking issues."

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

In `@docs/integrate-frameworks/coding-agent-gateway.md` at line 223, The install
command is stale: replace the old package name "claude-code" with the
standardized "claude" in the docs example; update the invocation `nemo-flow
install claude-code --scope user --target cli --gateway-url
http://127.0.0.1:4040` to `nemo-flow install claude --scope user --target cli
--gateway-url http://127.0.0.1:4040` so the documented install path matches the
current package name and will work as shown.
crates/cli/src/config.rs (1)

745-759: 🧹 Nitpick | 🔵 Trivial | ⚖️ Poor tradeoff

Verify TOML-to-runtime field mapping is correct.

The file config uses the TOML key claude (line 463, line 745), but the runtime struct field is still named claude_code (line 384, line 746). While this works (the TOML field name is independent of the Rust struct field), it creates a naming mismatch that could confuse maintainers.

Consider renaming the runtime struct field for consistency:

 #[derive(Debug, Clone, Default)]
 pub(crate) struct AgentConfigs {
-    pub(crate) claude_code: AgentCommandConfig,
+    pub(crate) claude: AgentCommandConfig,
     pub(crate) codex: AgentCommandConfig,
     pub(crate) cursor: CursorAgentConfig,
     pub(crate) hermes: AgentCommandConfig,
 }

Then update all references to agents.claude_codeagents.claude throughout the codebase. This would unify the naming across TOML, CLI, and runtime layers.

🤖 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/config.rs` around lines 745 - 759, Rename the runtime field
Agents::claude_code to Agents::claude and update all code references from
agents.claude_code to agents.claude (e.g., in the mapping block that assigns
from file_agents.claude). Ensure the struct definition (Agents) is updated, plus
any impls/usages, and if the struct is deserialized from TOML, add or adjust
serde attributes (#[serde(rename = "claude")] or alias) to preserve
compatibility with file_agents.claude while unifying the runtime name.
🤖 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 `@ATTRIBUTIONS-Rust.md`:
- Around line 5251-5255: The new attribution blocks (e.g., the "clap_complete -
4.6.5" section in ATTRIBUTIONS-Rust.md) violate Markdown lint rules by omitting
blank lines around headings/fences and using unlabeled fenced code blocks; fix
each offending block by inserting a blank line before and after the heading and
license fence, replace triple-backtick fences with a labeled fence using "text"
(```text) for the license body, and ensure the license block is preceded by a
short introductory sentence as required by the docs guidelines.

In `@crates/cli/src/doctor.rs`:
- Around line 453-457: The footer currently uses exit_code(report) to decide
messaging but treats warnings as success; update the logic to check for any
warnings on the report in addition to exit_code(report) so the message reflects
degraded health: if exit_code(report) == 0 and report contains no Warn entries
keep "All checks passed.", but if exit_code(report) == 0 and there are Warns
change the footer to something like "All checks passed but some checks issued
warnings; see details above."; use the same report variable and the
function/enum names you already have (exit_code, and whatever represents Warn
entries in the report) to detect warnings and choose the correct string.
- Around line 275-279: check_dir_writable currently uses std::fs::write on a
fixed probe file (.nemo-flow-write-probe) which will truncate an existing user
file; change the probe creation to safely create a new temporary file without
overwriting: attempt to open a new file with
std::fs::OpenOptions::new().write(true).create_new(true) for the probe path (or
loop generating a unique probe filename e.g. by appending a random suffix) and
write to it, then remove it; if create_new fails with AlreadyExists, retry with
a new name or return an explicit error indicating inability to safely probe;
keep references to the function name check_dir_writable and the probe variable
to locate where to implement this change.
- Around line 218-230: The spawned child in probe_version can outlive the
timeout and leak; after spawning the process in probe_version (the variable
child returned by tokio::process::Command::spawn()) call
child.kill_on_drop(true) so the subprocess is killed if the Child is dropped
(i.e., when timeout elapses). Add that call immediately after let child =
cmd.spawn().ok()? and before waiting with timeout to ensure the child is cleaned
up on timeout.
- Around line 211-216: which_on_path currently iterates PATH entries and checks
candidate.is_file(), which ignores Windows PATHEXT and platform execute
semantics; replace its body to use which::which(exec) (or which::which_in with
std::env::var_os("PATH") if you want explicit PATH) so that PATHEXT and execute
permissions are handled correctly, and add the which crate to Cargo.toml as a
dependency; update any callers of which_on_path only if signature changes (keep
same return type Option<PathBuf> by mapping which::which result to Ok/None).

In `@crates/cli/src/gateway.rs`:
- Around line 563-590: Update the function comment for
strip_chatgpt_oauth_for_openai_route to avoid implying all ChatGPT OAuth tokens
are JWTs; change the wording to state that this logic removes JWTs (detected via
"Bearer eyJ" — base64 JSON header) from inbound Authorization on OpenAI routes,
and note that opaque tokens or valid sk-... API keys are not affected (this
matches Codex 0.130 behavior sending JWTs from ~/.codex/auth.json).

In `@crates/cli/src/help_topics/concepts.md`:
- Around line 17-22: The fenced code block in concepts.md is missing a language
tag; update the triple-backtick fence surrounding the command examples (the
block containing "nemo-flow claude", "nemo-flow run --agent claude", etc.) to
specify bash (i.e., change ``` to ```bash) so the snippet is recognized as shell
commands and satisfies MD040.

In `@crates/cli/src/help_topics/plugins.md`:
- Line 12: Change the headings "Current state" and "Until Then" to title case
("Current State", "Until Then") and fix the awkward sentence in the paragraph
that currently contains the phrase starting with "we'll..." (the broken sentence
around the middle of the plugins help topic) by rewriting it into clear,
active-voice present-tense plain English (short sentence) — also review the
nearby sentences referenced (the block including the three sentences around
"Current State" and the sentence near "Until Then") for consistent title case
and concise grammar, ensuring readability and grammatical clarity.

In `@crates/cli/src/launcher.rs`:
- Around line 480-523: The live-status banner in print_live_status currently
writes to stdout which can contaminate child process output; change behavior to
suppress the banner when stdout is not a TTY and otherwise emit it to stderr. At
the top of print_live_status return early if
!std::io::IsTerminal::is_terminal(&std::io::stdout()) so non-TTY stdout gets no
banner; then compute use_color using std::io::stderr()
(std::io::IsTerminal::is_terminal(&std::io::stderr()) &&
std::env::var_os("NO_COLOR").is_none()) and replace all println!/print calls in
print_live_status with writes to stderr (eprintln! or writing to
std::io::stderr()) while still calling print_border_line for the borders (ensure
print_border_line writes to stderr or adapt calls accordingly).

In `@crates/cli/src/server.rs`:
- Around line 43-47: The bind-error help text currently suggests a Unix-only
remediation (`pkill -f nemo-flow`); update the message string used for bind
failures to be OS-neutral by replacing that line with a generic instruction like
"stop the running daemon (e.g., use pkill on Unix or Task Manager/taskkill on
Windows)" or include both platform examples, and ensure you keep the other
options (`nemo-flow --bind 127.0.0.1:0` and `nemo-flow --bind 127.0.0.1:4041`)
intact; modify the string literal in the server bind-error message (the
multi-line string containing "cannot bind {} — port is already in use...") so it
no longer directs Windows users to a Unix-only command.

In `@crates/cli/src/setup.rs`:
- Around line 215-218: The wizard-owned config sections (e.g., "upstream") are
being preserved when build_config() omits them, so merge_section(&mut existing,
doc, "upstream") keeps a prior custom openai_base_url instead of reverting to
default; change the behavior so wizard-managed sections are replaced when absent
in the new doc: either add a replace semantics to merge_section (e.g., a
parameter or special-case for section names) or call a new replace_section(&mut
existing, doc, "upstream") for the wizard-owned sections (also update the same
pattern at the second occurrence around lines 227-230) so omitted sections
remove any previous overrides instead of preserving them.
- Around line 184-189: The code currently hardcodes $HOME/.config/nemo-flow for
global configs (seen where home.join(".config").join("nemo-flow") and used in
write_or_merge calls); implement a single resolver function (e.g.,
resolve_global_config_path or get_global_config_dir) that checks the
XDG_CONFIG_HOME env var and falls back to $HOME/.config, returns the directory
and the final config.toml PathBuf; replace the direct home.join(".config")
usages in the write path (the block using write_or_merge & path), and the other
occurrences you noted (the blocks around the existing references at the other
locations) to call this resolver, call std::fs::create_dir_all on the returned
dir, and pass the returned config path into write_or_merge/read/preview so all
reads/writes use the same XDG-aware path.

In `@crates/cli/tests/coverage/installer_tests.rs`:
- Around line 60-64: The assertion currently uses .contains("hook-forward
claude") which can falsely match longer tokens like "hook-forward claude-code";
update the tests to assert the exact command string (e.g. compare
json["hooks"]["PreToolUse"][0]["hooks"][0]["command"].as_str().unwrap() ==
"<expected command>") or use a token-bounded match (e.g. regex or checks for
surrounding separators) to ensure the agent token is exact; apply the same
change to the other occurrence referenced at the second location.

In `@scripts/install.sh`:
- Around line 107-116: The current binary discovery loop using the hardcoded
candidate paths (variables bin_src, tmp, target) is brittle; update the logic in
the installation script to robustly locate an executable named "nemo-flow" under
"${tmp}" (e.g., use a recursive search for a regular file that is executable and
named nemo-flow), prefer any existing explicit candidate checks (the two current
paths) as fast-paths, set bin_src to the found path, and on failure call err
with a more helpful message that includes the archive identifier (archive) and
optionally a listing of "${tmp}" to aid debugging.

---

Outside diff comments:
In `@crates/cli/src/config.rs`:
- Around line 745-759: Rename the runtime field Agents::claude_code to
Agents::claude and update all code references from agents.claude_code to
agents.claude (e.g., in the mapping block that assigns from file_agents.claude).
Ensure the struct definition (Agents) is updated, plus any impls/usages, and if
the struct is deserialized from TOML, add or adjust serde attributes
(#[serde(rename = "claude")] or alias) to preserve compatibility with
file_agents.claude while unifying the runtime name.

In `@docs/integrate-frameworks/coding-agent-gateway.md`:
- Line 223: The install command is stale: replace the old package name
"claude-code" with the standardized "claude" in the docs example; update the
invocation `nemo-flow install claude-code --scope user --target cli
--gateway-url http://127.0.0.1:4040` to `nemo-flow install claude --scope user
--target cli --gateway-url http://127.0.0.1:4040` so the documented install path
matches the current package name and will work as shown.
🪄 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: 180b47d8-aae3-42cd-a17d-483338d2760e

📥 Commits

Reviewing files that changed from the base of the PR and between a311e5f and c8bf3e3.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (40)
  • ATTRIBUTIONS-Rust.md
  • Cargo.toml
  • crates/cli/Cargo.toml
  • crates/cli/src/banner.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/config.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/gateway.rs
  • crates/cli/src/help.rs
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/concepts.md
  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/plugins.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • homebrew/nemo-flow.rb
  • integrations/coding-agents/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/claude-code/hooks/hooks.json
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • scripts/install.sh
📜 Review details
🧰 Additional context used
📓 Path-based instructions (38)
**/*.{md,rst,html,txt}

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

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

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.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/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,rst,txt}

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

**/*.{md,rst,txt}: Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 documentation unless the source, platform, or legal guidance explicitly requires them.
Do not add trademark symbols to NeMo Flow learning documentation by default.
Do not rewrite API names, package names, command flags, or code literals for style reasons.

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,markdown,rst}

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

**/*.{md,markdown,rst}: 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
Use monospace formatting for code elements, commands, parameters, package names, and expressions
Use monospace formatting for directories, file names, and paths
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Use quotation marks for error messages and strings in documentation
Use bold formatting for UI buttons, menus, fields, and labels in documentation
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use in documentation
Use italics for publication titles in documentation
Use plain text formatting for keyboard shortcuts in documentation
Prefer [NVIDIA/NeMo](link) format for GitHub repository references over generic phrases 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 in documentation
Avoid generic link anchors such as 'here,' 'this page,' and 'read more' in documentation
Include the acronym in link text if a linked term includes an acronym
Do not link long sentences or multiple sentences in documentation
Avoid links that pull readers away from a procedure unles...

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

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

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run Markdown link checking via lychee for README.md, CONTRIBUTING.md, and docs/ through pre-commit hooks

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,markdown,py,sh,bash,js,ts,java,cpp,go,rust}

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

Keep package names, repo references, and build commands current in documentation

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • scripts/install.sh
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,markdown,py,sh,bash}

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

Keep stable user-facing wrappers at scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • scripts/install.sh
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,markdown,py,sh,bash,js,ts,example}

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

Example commands must match current package names and paths

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • scripts/install.sh
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,txt,rst}

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

**/*.{md,txt,rst}: Ensure commands, package names, file paths, and APIs in documentation are correct and not stale; flag incorrect or outdated information as blocking issues
Ensure examples and procedures in documentation will execute successfully with current APIs and commands
Use consistent user-facing terminology throughout documentation that matches current repo terminology
Capitalize NVIDIA correctly in all documentation and public-facing text
Format code, commands, paths, and filenames as inline code (monospace) in documentation
Use descriptive anchor text for links instead of bare URLs or weak labels like 'here' in documentation
Prefer active voice, present tense, short sentences, and plain English in documentation
Structure documentation procedures as imperative steps that are easy to scan and not too long for a single sequence
Prefer 'after' instead of 'once' for temporal references in documentation
Use 'can' instead of 'may' when describing possibility (rather than permission) in documentation
Avoid ambiguous numeric dates and ordinal dates in documentation body text

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{py,js,ts,tsx,go,rs,md}

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

Format changed files with the language-native formatter before the final lint/test pass

Files:

  • crates/cli/src/help_topics/observability.md
  • crates/cli/src/server.rs
  • crates/cli/src/help_topics/troubleshooting.md
  • crates/cli/src/help_topics/agents.md
  • crates/cli/src/help_topics/plugins.md
  • crates/cli/tests/coverage/banner_tests.rs
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • crates/cli/src/help_topics/concepts.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • crates/cli/tests/coverage/installer_tests.rs
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • integrations/coding-agents/claude-code/README.md
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • docs/integrate-frameworks/coding-agent-codex.md
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • integrations/coding-agents/README.md
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • ATTRIBUTIONS-Rust.md
  • crates/cli/src/config.rs
**/*.{js,ts,tsx,jsx,py,rs,go,java,c,cpp,h,cc,cxx,cs,rb,php,swift,kt}

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

Changed files must be formatted with the language-native formatter

Files:

  • homebrew/nemo-flow.rb
  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

**/*.rs: Run cargo fmt --all for FFI work as it is Rust work
Run just test-rust for FFI validation
Run cargo clippy --workspace --all-targets -- -D warnings to enforce warnings-as-errors linting

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

**/*.rs: Run cargo fmt --all for Rust code formatting
Run cargo clippy --workspace --all-targets -- -D warnings to enforce Rust linting with no warnings
Run just test-rust as the shared-runtime build/test wrapper for Rust changes

Use Rust snake_case naming convention for Rust code

**/*.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 Rust code formatting when Node changes touch Rust files
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting when Rust files changed as part of Node work

**/*.rs: Always run just test-rust when any Rust code changes
Always run cargo fmt --all when any Rust code changes
Always run cargo clippy --workspace --all-targets -- -D warnings when any Rust code changes

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
**/*.{rs,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all Rust, Go, JavaScript, and TypeScript source files using C-style comment syntax

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use SONAR_IGNORE_START / SONAR_IGNORE_END markers only for documented false positives that cannot be resolved in code; keep ignored blocks small, add explanatory comments, and require reviewer sign-off

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
**/*.{rs,py,js,ts,tsx,go}

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

During iteration, prefer uv run pre-commit run --files <changed files...> for targeted validation

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/src/help.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_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/banner_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/help_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
**/Cargo.{toml,lock}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run cargo deny check for Rust dependency auditing as configured in deny.toml

Files:

  • Cargo.toml
  • crates/cli/Cargo.toml
**/*.toml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in TOML files using TOML comment syntax

Files:

  • Cargo.toml
  • crates/cli/Cargo.toml
{Cargo.toml,setup.py,setup.cfg,pyproject.toml,go.mod,go.sum,package.json,package-lock.json,yarn.lock,pom.xml,*.gradle}

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

Update repository manifest files (Cargo.toml, setup.py, go.mod, package.json, etc.) with new package/crate names during rename operations

Files:

  • Cargo.toml
{Cargo.toml,pyproject.toml,go/nemo_flow/go.mod,package.json,package-lock.json,crates/node/package.json}

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

Maintain consistent package names, import paths, and module names across Rust, Python, Go, Node, and WebAssembly workspaces in NeMo Flow

Files:

  • Cargo.toml
Cargo.toml

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Cargo.toml: Maintain Cargo.toml [workspace.package].version as the source of truth for the Rust workspace and Python build versioning
Keep Cargo.toml [workspace.dependencies] self-references aligned when the workspace version changes (nemo-flow, nemo-flow-adaptive, nemo-flow-ffi)

Format Rust project files with cargo fmt --all to maintain consistent Rust code style

Files:

  • Cargo.toml
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant crate or package README when that surface changed

Relevant package or crate README.md files must be updated when examples or binding guidance changes

Files:

  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
**/{integrations,integration,*-integration}/**

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

**/{integrations,integration,*-integration}/**: Keep NeMo Flow optional in framework integrations
Preserve the framework's original behavior when NeMo Flow is absent
Wrap tool and LLM paths at the correct framework boundary
Integration pattern must follow docs/integrate-frameworks/adding-scopes.md

Files:

  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/claude-code/hooks/hooks.json
  • integrations/coding-agents/README.md
{README.md,docs/index.md,**/README.md}

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

Update entry-point documentation (README.md, docs/index.md, package READMEs, binding-level source READMEs) whenever public behavior changes

Files:

  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
docs/**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run ./scripts/build-docs.sh for documentation site changes

docs/**/*.md: Relevant getting-started or reference docs must be updated when examples change
Release-policy docs must point to GitHub Releases as the only release-history source of truth

docs/**/*.md: Use title case for headings in technical documentation
Introduce code blocks, tables, and lists with complete lead-in sentences in documentation

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{RELEASING.md,CHANGELOG.md,docs/**/*.md}

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

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

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
docs/integrate-frameworks/**/*.md

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

Documentation must be updated if activation or usage of the integration changed

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{scripts/*.sh,docs/**/*.md}

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

Use root ./scripts/*.sh commands in docs and contributor guidance as documented, with implementations under scripts/third-party/

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • scripts/install.sh
  • docs/integrate-frameworks/coding-agent-codex.md
{docs/**,examples/**,crates/adaptive/**,python/nemo_flow/**,go/nemo_flow/**,**/{example,component}.{ts,tsx,js,rs,py,go}}

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

Any new adaptive component kind must have documentation, examples, and binding coverage across all supported languages

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{README*,CHANGELOG*,docs/**/*.{md,rst,txt},examples/**/*,*.md}

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

Update documentation, examples, and getting-started guides with new package/module/crate names after rename operations

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
{README.md,docs/**/*.md,examples/**/*.{js,ts,py,go,rs}}

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

Keep documentation and examples synchronized with current install, import, and build commands

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{README.md,CONTRIBUTING.md,docs/**/*.md}

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

For docs-only changes, run targeted checks only if commands, package names, or examples changed. Use just docs for docs-site builds and just docs-linkcheck when links changed

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

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

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
{.github/**/*.{yml,yaml},*.patch,scripts/**/*,*.sh,*.bat,Dockerfile*}

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

Update CI configuration, patch files, and build scripts with new functional identifiers after rename operations

Files:

  • scripts/install.sh
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}

⚙️ CodeRabbit configuration file

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

Files:

  • scripts/install.sh
ATTRIBUTIONS-Rust.md

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Regenerate ATTRIBUTIONS-Rust.md with ./scripts/generate_attributions.sh rust if Cargo metadata changed and committed attribution files must stay fresh

Files:

  • ATTRIBUTIONS-Rust.md
**/{config,schema,adaptive}.{yaml,yml,json,ts,tsx,py,go,rs}

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

Ensure dynamic config shape matches the documented canonical model in docs/use-adaptive-optimization/configure.md

Files:

  • crates/cli/src/config.rs
🪛 markdownlint-cli2 (0.22.1)
crates/cli/src/help_topics/concepts.md

[warning] 17-17: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

ATTRIBUTIONS-Rust.md

[warning] 5251-5251: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 5254-5254: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 5254-5254: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 5255-5255: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 6330-6330: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 6333-6333: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 6333-6333: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 6334-6334: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 7852-7852: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 7855-7855: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 7855-7855: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 7856-7856: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 8509-8509: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 8512-8512: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 8512-8512: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 8513-8513: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 27722-27722: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 27725-27725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 27725-27725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 27726-27726: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29644-29644: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 29647-29647: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 29647-29647: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 29648-29648: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29725-29725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 29728-29728: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 29728-29728: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 29729-29729: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29806-29806: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 32465-32465: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 32468-32468: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 32468-32468: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 32469-32469: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 32674-32674: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 37445-37445: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 37448-37448: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 37448-37448: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 37449-37449: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

Comment thread ATTRIBUTIONS-Rust.md
Comment thread crates/cli/src/doctor.rs
Comment thread crates/cli/src/doctor.rs Outdated
Comment thread crates/cli/src/doctor.rs Outdated
Comment thread crates/cli/src/doctor.rs
Comment thread crates/cli/src/server.rs
Comment thread crates/cli/src/setup.rs
Comment thread crates/cli/src/setup.rs Outdated
Comment thread crates/cli/tests/coverage/installer_tests.rs Outdated
Comment thread scripts/install.sh Outdated
@AjayThorve AjayThorve force-pushed the ajay/cli-for-sidecar branch from c8bf3e3 to e6388f5 Compare May 12, 2026 09:26
@github-actions github-actions Bot added size:XL PR is extra large and removed size:XXL PR is very large labels May 12, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

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

⚠️ Outside diff range comments (1)
crates/cli/tests/coverage/launcher_tests.rs (1)

550-606: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Windows Path Can Break Agent Inference in run_starts_gateway...

Line 554 relies on agent inference from argv[0], but the Windows helper sets argv[0] to cmd.exe (Line 605), which is not inferable as a coding agent. This makes the test non-portable.

Suggested fix
-#[tokio::test]
+#[cfg(unix)]
+#[tokio::test]
 async fn run_starts_gateway_injects_env_and_returns_agent_exit_code() {
🤖 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/tests/coverage/launcher_tests.rs` around lines 550 - 606, The
Windows helper makes argv[0] be "cmd.exe" which breaks agent inference; update
the test to explicitly set the agent when running on Windows. In the test that
constructs the Command/launcher input (where agent: None is currently used and
run(...) is called, e.g. the run_starts_gateway... test), conditionally set
agent to Some("codex".into()) on cfg(windows) so the resolver uses the intended
agent name, and keep the existing Unix fake_agent_command and Windows
fake_agent_command helpers as-is; reference fake_agent_command and the test that
calls run(...) to locate the change.
♻️ Duplicate comments (3)
crates/cli/src/server.rs (1)

43-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make bind-failure remediation OS-neutral.

Line 45 still recommends pkill -f nemo-flow, which is Unix-specific in a cross-platform CLI error path. Replace it with OS-neutral wording or include both Unix and Windows examples.

🤖 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/server.rs` around lines 43 - 47, Update the bind-failure error
string (the "cannot bind {} — port is already in use..." message) to remove the
Unix-only suggestion `pkill -f nemo-flow` and make remediation OS-neutral; e.g.,
replace that bullet with a generic instruction like "stop the running daemon
(use an appropriate tool for your OS, e.g. pkill on Unix or taskkill on
Windows)" or include both platform examples so Windows users aren't misled.
Modify the literal string in the server bind error so it no longer recommends
only `pkill -f nemo-flow` and instead offers cross-platform guidance.
ATTRIBUTIONS-Rust.md (1)

5251-5255: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Markdown lint violations persist in all new attribution blocks.

The newly added sections (clap_complete, console, dialoguer, encode_unicode, shell-words, thiserror, thiserror-impl, unicode-segmentation, windows-sys) violate MD022, MD031, and MD040: headings and fenced code blocks lack required blank lines, and license blocks lack language specifiers.

Since this file is auto-generated, fix the generation script at ./scripts/generate_attributions.sh to:

  1. Insert blank lines before and after all headings
  2. Insert blank lines before and after all fenced code blocks
  3. Label license fences as ```text

Then regenerate per the guideline: ./scripts/generate_attributions.sh rust.

As per coding guidelines, "Introduce every code block with a complete sentence," "Use syntax highlighting when the format supports it for code blocks," and "Regenerate ATTRIBUTIONS-Rust.md with ./scripts/generate_attributions.sh rust if Cargo metadata changed and committed attribution files must stay fresh."

Also applies to: 6330-6334, 7852-7856, 8509-8513, 27722-27726, 29644-29648, 29725-29729, 32465-32469, 37445-37449

🤖 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 `@ATTRIBUTIONS-Rust.md` around lines 5251 - 5255, The attribution generator is
emitting headings and fenced-license blocks that violate MD022/MD031/MD040;
update the script ./scripts/generate_attributions.sh to (1) ensure a blank line
before and after every Markdown heading it writes, (2) ensure a blank line
before and after every fenced code block it emits, and (3) render license fences
with a language label (use ```text for license blocks) so licenses are
syntax-labeled; after making these changes, run
./scripts/generate_attributions.sh rust to regenerate ATTRIBUTIONS-Rust.md and
verify the new sections (e.g., clap_complete, console, dialoguer,
encode_unicode, shell-words, thiserror, thiserror-impl, unicode-segmentation,
windows-sys) include the blank lines and ```text license fences.
crates/cli/tests/coverage/installer_tests.rs (1)

60-64: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use exact command assertions; substring checks still permit false positives.

.contains("hook-forward claude") still passes for "hook-forward claude-code", so a canonical-token regression can slip through.

Suggested assertion tightening
-    assert!(
-        json["hooks"]["PreToolUse"][0]["hooks"][0]["command"]
-            .as_str()
-            .unwrap()
-            .contains("hook-forward claude")
-    );
+    assert_eq!(
+        json["hooks"]["PreToolUse"][0]["hooks"][0]["command"]
+            .as_str()
+            .unwrap(),
+        "nemo-flow hook-forward claude"
+    );
-    let installed = std::fs::read_to_string(&settings).unwrap();
-    assert!(installed.contains("hook-forward claude"));
+    let installed = std::fs::read_to_string(&settings).unwrap();
+    let installed_json: Value = serde_json::from_str(&installed).unwrap();
+    assert_eq!(
+        installed_json["hooks"]["PreToolUse"][0]["hooks"][0]["command"]
+            .as_str()
+            .unwrap(),
+        "nemo-flow hook-forward claude"
+    );

Also applies to: 253-253

🤖 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/tests/coverage/installer_tests.rs` around lines 60 - 64, The test
currently uses a substring check on
json["hooks"]["PreToolUse"][0]["hooks"][0]["command"] with
.contains("hook-forward claude"), which can yield false positives; change this
to assert the command equals the exact expected string (e.g., use
.as_str().unwrap() == "hook-forward claude" or an equality assertion) and apply
the same tightening to the duplicate check referenced at the other location (the
assertion around line 253) so the test requires exact command equality rather
than a substring match.
🤖 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/completions_install.rs`:
- Around line 106-110: The current atomic-write uses a deterministic temp name
(temp = parent.join(format!(".{file_name}.tmp"))), which allows concurrent
installs to clobber each other; change the temp-file creation to use a unique
name per process (e.g., use tempfile::NamedTempFile::new_in(parent) or append a
PID/UUID/random suffix to the temp filename) so each writer gets its own temp
path before write_all/sync_all and the final std::fs::rename(&temp, target)
remains atomic; update references to temp, File::create, write_all, sync_all,
and std::fs::rename accordingly.

In `@crates/cli/src/doctor.rs`:
- Around line 140-142: The code in doctor.rs creates global_path by hardcoding
$HOME/.config/nemo-flow/config.toml; change global_path to use the same
config-path resolution helper used elsewhere in the CLI (instead of building the
path manually) so XDG config dirs are respected. Replace the manual construction
that sets the global_path variable with a call to the central resolver function
(the project’s existing helper used for global config resolution) and use its
returned PathBuf for global_path so doctor reports the correct global config
location.

In `@crates/cli/src/gateway.rs`:
- Around line 552-560: The code currently calls
strip_chatgpt_oauth_for_openai_route(headers, route) before
inject_provider_auth, which removes inbound Authorization JWT even when
inject_provider_auth cannot add replacement creds (e.g., OPENAI_API_KEY unset);
update the flow so the original bearer token is preserved unless a replacement
will be injected: either call inject_provider_auth (or check the same
provider-auth-available condition used inside it) before stripping, or change
strip_chatgpt_oauth_for_openai_route to only remove Authorization when
inject_provider_auth(route, ...) can successfully provide credentials; use the
existing symbols strip_chatgpt_oauth_for_openai_route, inject_provider_auth, and
should_forward_request_header to implement the guard so upstream receives the
original bearer if no provider auth is available.

In `@crates/cli/src/setup.rs`:
- Around line 487-496: The prompt currently accepts empty strings and persists
them; update the input flow in the functions that gather Codex upstream URL (the
block using Input::with_theme(...).with_prompt(...).interact_text() that
compares url == "https://api.openai.com") and the analogous endpoint prompt to
reject blank inputs: after obtaining url, trim it and if it is empty return an
error (map_err with setup_error) or re-prompt until non-empty (e.g., loop or use
.validate_with if available) and only then map the default OpenAI URL to None or
Some(url); ensure you reference and change the code around the
Input::with_theme(...).interact_text() call and the conditional that checks for
the default URL so empty strings are never written into config.toml.
- Around line 85-105: The PATH scan in detect_installed_agents_in currently
checks for files by joining dirs with the exec name, which ignores Windows
PATHEXT rules; replace that manual check with a platform-aware lookup using the
which crate (or an equivalent PATHEXT expansion helper). In
detect_installed_agents_in, import and call which::which or which::which_in for
each exec string (from the candidates array: CodingAgent::ClaudeCode, Codex,
Cursor, Hermes) against the provided path_var, treat Ok(_) as found and Err(_)
as not found, and keep the same filter_map return of agents; ensure you
propagate path_var into which_in correctly and remove the current split_paths +
is_file logic.

In `@crates/cli/tests/coverage/setup_tests.rs`:
- Around line 18-38: The test mutates global PATH unsafely around the call to
detect_installed_agents/CodingAgent assertions; synchronize this by acquiring a
global test mutex (or applying the serial_test attribute) for the test so PATH
changes cannot race with other tests, set PATH inside the locked region, call
detect_installed_agents, run the assertions, then restore PATH while still
holding the lock (or rely on a scoped restore guard) to ensure no other test
observes the intermediate state; use a named mutex (e.g., a lazy_static or
once_cell global Mutex) or #[serial] on the test to localize the fix to this
test and keep the restore logic (original_path handling) unchanged.
- Around line 5-16: The test uses Unix-only APIs
(std::os::unix::fs::PermissionsExt and shell script files) so guard it from
non-Unix builds: annotate the test function
detect_installed_agents_finds_binaries_on_path with #[cfg(unix)] (and keep
#[test]) or move the import of PermissionsExt inside the function behind a
#[cfg(unix)] block so the symbol is only referenced on Unix; this ensures the
test and the use of std::os::unix::fs::PermissionsExt are excluded from non-Unix
targets and the rest of the crate compiles cross-platform.

---

Outside diff comments:
In `@crates/cli/tests/coverage/launcher_tests.rs`:
- Around line 550-606: The Windows helper makes argv[0] be "cmd.exe" which
breaks agent inference; update the test to explicitly set the agent when running
on Windows. In the test that constructs the Command/launcher input (where agent:
None is currently used and run(...) is called, e.g. the run_starts_gateway...
test), conditionally set agent to Some("codex".into()) on cfg(windows) so the
resolver uses the intended agent name, and keep the existing Unix
fake_agent_command and Windows fake_agent_command helpers as-is; reference
fake_agent_command and the test that calls run(...) to locate the change.

---

Duplicate comments:
In `@ATTRIBUTIONS-Rust.md`:
- Around line 5251-5255: The attribution generator is emitting headings and
fenced-license blocks that violate MD022/MD031/MD040; update the script
./scripts/generate_attributions.sh to (1) ensure a blank line before and after
every Markdown heading it writes, (2) ensure a blank line before and after every
fenced code block it emits, and (3) render license fences with a language label
(use ```text for license blocks) so licenses are syntax-labeled; after making
these changes, run ./scripts/generate_attributions.sh rust to regenerate
ATTRIBUTIONS-Rust.md and verify the new sections (e.g., clap_complete, console,
dialoguer, encode_unicode, shell-words, thiserror, thiserror-impl,
unicode-segmentation, windows-sys) include the blank lines and ```text license
fences.

In `@crates/cli/src/server.rs`:
- Around line 43-47: Update the bind-failure error string (the "cannot bind {} —
port is already in use..." message) to remove the Unix-only suggestion `pkill -f
nemo-flow` and make remediation OS-neutral; e.g., replace that bullet with a
generic instruction like "stop the running daemon (use an appropriate tool for
your OS, e.g. pkill on Unix or taskkill on Windows)" or include both platform
examples so Windows users aren't misled. Modify the literal string in the server
bind error so it no longer recommends only `pkill -f nemo-flow` and instead
offers cross-platform guidance.

In `@crates/cli/tests/coverage/installer_tests.rs`:
- Around line 60-64: The test currently uses a substring check on
json["hooks"]["PreToolUse"][0]["hooks"][0]["command"] with
.contains("hook-forward claude"), which can yield false positives; change this
to assert the command equals the exact expected string (e.g., use
.as_str().unwrap() == "hook-forward claude" or an equality assertion) and apply
the same tightening to the duplicate check referenced at the other location (the
assertion around line 253) so the test requires exact command equality rather
than a substring match.
🪄 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: b392a860-778d-40fc-86e9-bd841bdf50bb

📥 Commits

Reviewing files that changed from the base of the PR and between c8bf3e3 and e6388f5.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (30)
  • ATTRIBUTIONS-Rust.md
  • crates/cli/Cargo.toml
  • crates/cli/src/banner.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/config.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/gateway.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • integrations/coding-agents/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/claude-code/hooks/hooks.json
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
📜 Review details
🧰 Additional context used
📓 Path-based instructions (33)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

**/*.rs: Run cargo fmt --all for FFI work as it is Rust work
Run just test-rust for FFI validation
Run cargo clippy --workspace --all-targets -- -D warnings to enforce warnings-as-errors linting

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

**/*.rs: Run cargo fmt --all for Rust code formatting
Run cargo clippy --workspace --all-targets -- -D warnings to enforce Rust linting with no warnings
Run just test-rust as the shared-runtime build/test wrapper for Rust changes

Use Rust snake_case naming convention for Rust code

**/*.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 Rust code formatting when Node changes touch Rust files
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting when Rust files changed as part of Node work

**/*.rs: Always run just test-rust when any Rust code changes
Always run cargo fmt --all when any Rust code changes
Always run cargo clippy --workspace --all-targets -- -D warnings when any Rust code changes

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
**/*.{rs,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all Rust, Go, JavaScript, and TypeScript source files using C-style comment syntax

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use SONAR_IGNORE_START / SONAR_IGNORE_END markers only for documented false positives that cannot be resolved in code; keep ignored blocks small, add explanatory comments, and require reviewer sign-off

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
**/*.{js,ts,tsx,jsx,py,rs,go,java,c,cpp,h,cc,cxx,cs,rb,php,swift,kt}

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

Changed files must be formatted with the language-native formatter

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
**/*.{py,js,ts,tsx,go,rs,md}

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

Format changed files with the language-native formatter before the final lint/test pass

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • crates/cli/tests/coverage/completions_install_tests.rs
  • integrations/coding-agents/cursor/README.md
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • docs/integrate-frameworks/coding-agent-codex.md
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • ATTRIBUTIONS-Rust.md
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
**/*.{rs,py,js,ts,tsx,go}

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

During iteration, prefer uv run pre-commit run --files <changed files...> for targeted validation

Files:

  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/server.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/main.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/completions_install.rs
  • crates/cli/src/banner.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/config.rs
  • crates/cli/src/setup.rs
{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_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/installer_tests.rs
  • crates/cli/tests/coverage/completions_install_tests.rs
  • crates/cli/tests/coverage/banner_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
**/*.{md,rst,html,txt}

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

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

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.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:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{md,rst,txt}

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

**/*.{md,rst,txt}: Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 documentation unless the source, platform, or legal guidance explicitly requires them.
Do not add trademark symbols to NeMo Flow learning documentation by default.
Do not rewrite API names, package names, command flags, or code literals for style reasons.

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{md,markdown,rst}

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

**/*.{md,markdown,rst}: 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
Use monospace formatting for code elements, commands, parameters, package names, and expressions
Use monospace formatting for directories, file names, and paths
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Use quotation marks for error messages and strings in documentation
Use bold formatting for UI buttons, menus, fields, and labels in documentation
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use in documentation
Use italics for publication titles in documentation
Use plain text formatting for keyboard shortcuts in documentation
Prefer [NVIDIA/NeMo](link) format for GitHub repository references over generic phrases 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 in documentation
Avoid generic link anchors such as 'here,' 'this page,' and 'read more' in documentation
Include the acronym in link text if a linked term includes an acronym
Do not link long sentences or multiple sentences in documentation
Avoid links that pull readers away from a procedure unles...

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

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

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant crate or package README when that surface changed

Relevant package or crate README.md files must be updated when examples or binding guidance changes

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run Markdown link checking via lychee for README.md, CONTRIBUTING.md, and docs/ through pre-commit hooks

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{md,markdown,py,sh,bash,js,ts,java,cpp,go,rust}

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

Keep package names, repo references, and build commands current in documentation

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{md,markdown,py,sh,bash}

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

Keep stable user-facing wrappers at scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/*.{md,markdown,py,sh,bash,js,ts,example}

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

Example commands must match current package names and paths

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/{integrations,integration,*-integration}/**

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

**/{integrations,integration,*-integration}/**: Keep NeMo Flow optional in framework integrations
Preserve the framework's original behavior when NeMo Flow is absent
Wrap tool and LLM paths at the correct framework boundary
Integration pattern must follow docs/integrate-frameworks/adding-scopes.md

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • integrations/coding-agents/claude-code/hooks/hooks.json
**/*.{md,txt,rst}

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

**/*.{md,txt,rst}: Ensure commands, package names, file paths, and APIs in documentation are correct and not stale; flag incorrect or outdated information as blocking issues
Ensure examples and procedures in documentation will execute successfully with current APIs and commands
Use consistent user-facing terminology throughout documentation that matches current repo terminology
Capitalize NVIDIA correctly in all documentation and public-facing text
Format code, commands, paths, and filenames as inline code (monospace) in documentation
Use descriptive anchor text for links instead of bare URLs or weak labels like 'here' in documentation
Prefer active voice, present tense, short sentences, and plain English in documentation
Structure documentation procedures as imperative steps that are easy to scan and not too long for a single sequence
Prefer 'after' instead of 'once' for temporal references in documentation
Use 'can' instead of 'may' when describing possibility (rather than permission) in documentation
Avoid ambiguous numeric dates and ordinal dates in documentation body text

Files:

  • integrations/coding-agents/codex/README.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{README.md,docs/index.md,**/README.md}

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

Update entry-point documentation (README.md, docs/index.md, package READMEs, binding-level source READMEs) whenever public behavior changes

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
docs/**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run ./scripts/build-docs.sh for documentation site changes

docs/**/*.md: Relevant getting-started or reference docs must be updated when examples change
Release-policy docs must point to GitHub Releases as the only release-history source of truth

docs/**/*.md: Use title case for headings in technical documentation
Introduce code blocks, tables, and lists with complete lead-in sentences in documentation

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{RELEASING.md,CHANGELOG.md,docs/**/*.md}

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

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

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
docs/integrate-frameworks/**/*.md

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

Documentation must be updated if activation or usage of the integration changed

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{scripts/*.sh,docs/**/*.md}

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

Use root ./scripts/*.sh commands in docs and contributor guidance as documented, with implementations under scripts/third-party/

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{docs/**,examples/**,crates/adaptive/**,python/nemo_flow/**,go/nemo_flow/**,**/{example,component}.{ts,tsx,js,rs,py,go}}

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

Any new adaptive component kind must have documentation, examples, and binding coverage across all supported languages

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{README*,CHANGELOG*,docs/**/*.{md,rst,txt},examples/**/*,*.md}

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

Update documentation, examples, and getting-started guides with new package/module/crate names after rename operations

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • ATTRIBUTIONS-Rust.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{README.md,docs/**/*.md,examples/**/*.{js,ts,py,go,rs}}

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

Keep documentation and examples synchronized with current install, import, and build commands

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{README.md,CONTRIBUTING.md,docs/**/*.md}

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

For docs-only changes, run targeted checks only if commands, package names, or examples changed. Use just docs for docs-site builds and just docs-linkcheck when links changed

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

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

Files:

  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
**/Cargo.{toml,lock}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run cargo deny check for Rust dependency auditing as configured in deny.toml

Files:

  • crates/cli/Cargo.toml
**/*.toml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in TOML files using TOML comment syntax

Files:

  • crates/cli/Cargo.toml
ATTRIBUTIONS-Rust.md

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Regenerate ATTRIBUTIONS-Rust.md with ./scripts/generate_attributions.sh rust if Cargo metadata changed and committed attribution files must stay fresh

Files:

  • ATTRIBUTIONS-Rust.md
**/{config,schema,adaptive}.{yaml,yml,json,ts,tsx,py,go,rs}

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

Ensure dynamic config shape matches the documented canonical model in docs/use-adaptive-optimization/configure.md

Files:

  • crates/cli/src/config.rs
🪛 markdownlint-cli2 (0.22.1)
ATTRIBUTIONS-Rust.md

[warning] 5251-5251: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 5254-5254: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 5254-5254: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 5255-5255: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 6330-6330: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 6333-6333: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 6333-6333: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 6334-6334: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 7852-7852: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 7855-7855: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 7855-7855: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 7856-7856: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 8509-8509: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 8512-8512: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 8512-8512: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 8513-8513: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 27722-27722: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 27725-27725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 27725-27725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 27726-27726: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29644-29644: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 29647-29647: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 29647-29647: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 29648-29648: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29725-29725: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 29728-29728: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 29728-29728: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 29729-29729: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 29806-29806: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 32465-32465: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 32468-32468: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 32468-32468: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 32469-32469: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 32674-32674: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 37445-37445: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


[warning] 37448-37448: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above

(MD022, blanks-around-headings)


[warning] 37448-37448: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)


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

(MD031, blanks-around-fences)


[warning] 37449-37449: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (15)
crates/cli/Cargo.toml (1)

25-29: Dependency additions look consistent with the new completions flow.

integrations/coding-agents/cursor/README.md (1)

61-66: Shared-config documentation update is clear and consistent with the new TOML layout.

docs/integrate-frameworks/coding-agent-codex.md (1)

53-60: Config migration docs for Codex are accurate and well aligned with the new schema.

docs/integrate-frameworks/coding-agent-hermes.md (1)

52-57: Hermes shared-config instructions correctly reflect the new config filename and section name.

integrations/coding-agents/claude-code/hooks/hooks.json (1)

8-145: Hook command rename is consistently applied across all Claude hook events.

integrations/coding-agents/README.md (1)

53-67: Top-level integration README updates are consistent with the new CLI/config UX.

integrations/coding-agents/claude-code/README.md (1)

57-73: Config Migration Docs Look Consistent

The config.toml path updates and [observability]/[agents.claude] examples align with the new CLI surface and remain clear for users.

docs/integrate-frameworks/coding-agent-cursor.md (1)

53-58: Shared Config Update Is Correct

The updated config locations and [observability] table usage are consistent with the current config model.

integrations/coding-agents/codex/README.md (1)

66-71: Codex Shared Config Guidance Looks Good

The switch to config.toml and [observability] is correctly reflected in the example.

docs/integrate-frameworks/coding-agent-gateway.md (1)

89-112: Gateway Config Example Tracks the New Schema

The updated file locations and TOML section structure are clear and consistent with the renamed configuration model.

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

110-176: Config Coverage Updates Are Solid

The fixture migration to config.toml and new table names is validated with the right assertions, including agent and observability mappings.

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

27-110: Banner Coverage Is Strong and Well-Scoped

These tests capture the important rendering contracts (ANSI mode, tracer behavior, border glyphs, and docked version tag) and should prevent subtle UX regressions.

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

485-522: Still writing the live-status frame to stdout.

print_live_status still uses println!/print_border_line() on stdout. That prepends UI text to the child process's stdout stream, so redirected or piped agent output is no longer clean. This should stay on stderr and be suppressed when stdout is non-TTY.

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

184-189: Global config paths are still hardcoded to $HOME/.config.

save_config, read_existing_defaults, and preview_paths all bake in home.join(".config"). On XDG-configured machines the wizard will read, preview, and write a different file than the rest of the CLI should be using. These paths should come from one shared global-config resolver.

Also applies to: 395-398, 713-715


215-218: Scoped reconfiguration still can't clear an old [upstream] override.

When the newly built doc omits [upstream] because the user accepted the default OpenAI URL, merge_section preserves the existing block. Re-running nemo-flow config codex therefore keeps the prior custom openai_base_url instead of resetting to default. Wizard-owned sections need replace semantics here.

Also applies to: 224-230

Comment thread crates/cli/src/completions_install.rs
Comment thread crates/cli/src/doctor.rs Outdated
Comment thread crates/cli/src/gateway.rs Outdated
Comment thread crates/cli/src/setup.rs Outdated
Comment thread crates/cli/src/setup.rs Outdated
Comment thread crates/cli/tests/cli_tests.rs
Comment thread crates/cli/tests/coverage/setup_tests.rs Outdated
Comment thread crates/cli/tests/coverage/setup_tests.rs Outdated
@github-actions github-actions Bot added size:XXL PR is very large and removed size:XL PR is extra large labels May 12, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

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/config.rs (1)

564-580: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Config merge precedence contradicts “project overrides global” behavior.

Line 570+ appends project config before user config, and later files win in merge_toml, so user config overrides project config. That conflicts with the setup scope label and docs/comments that state project should take precedence.

Suggested fix
-    let mut paths = vec![PathBuf::from("/etc/nemo-flow/config.toml")];
+    let mut paths = vec![PathBuf::from("/etc/nemo-flow/config.toml")];
+    if let Some(user) = user_config_path() {
+        paths.push(user);
+    }
     if let Ok(cwd) = std::env::current_dir()
         && let Some(project) = find_project_config(&cwd)
     {
         paths.push(project);
     }
-    if let Some(user) = user_config_path() {
-        paths.push(user);
-    }
     paths
🤖 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/config.rs` around lines 564 - 580, The config search order in
config_paths causes user config to win over project config because merge_toml
takes later files as higher precedence; to make project override global/user as
intended, change the insertion order so the system config is first, then
user_config_path() (user), and finally the project config (project) — i.e., when
using find_project_config(&cwd) and user_config_path(), ensure you push user
before project in config_paths so that the project config (found via
find_project_config) is merged last and wins over user config.
🤖 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 166-177: The requested_daemon_mode() method on ServerArgs
incorrectly omits the config flag from the daemon-intent check, so invoking
nemo-flow with only --config falls into setup; update
ServerArgs::requested_daemon_mode to include self.config.is_some() alongside the
other checks (e.g., add a `|| self.config.is_some()` clause) so that --config
counts as a daemon-specific signal.

In `@crates/cli/src/launcher.rs`:
- Around line 50-56: The setup trigger currently only checks
any_config_file_exists() and may run crate::setup::run(Some(agent)).await? even
when the user passed an explicit --config; change the condition to also detect
an explicit config arg and skip setup when present (e.g., use your CLI parsing
value like cli.config or matches.value_of("config")/is_present("config") and
only call crate::setup::run(Some(agent)).await? when !any_config_file_exists()
AND no explicit config was provided). Ensure the modified check references
any_config_file_exists() and the existing crate::setup::run(Some(agent)) call so
behavior is preserved when no config is supplied.

In `@docs/integrate-frameworks/coding-agent-gateway.md`:
- Around line 218-222: The paragraph describing how hooks invoke `nemo-flow
hook-forward <agent>` is too long; split it into shorter active-voice sentences
that are easier to scan. Rewrite the block so one sentence states that
wrapper-generated hooks (Claude/Codex/Cursor ephemeral and Hermes via setup)
invoke `nemo-flow hook-forward <agent>` from stdin, a second sentence explains
that inside the wrapper the gateway URL is sourced from the
`NEMO_FLOW_GATEWAY_URL` environment variable injected on every run, and a third
sentence explains that outside the wrapper (Hermes standalone or IDE-launched
Claude/Codex) the command falls back to its embedded `--gateway-url` flag. Keep
tense present, use plain English, and preserve the exact symbols `nemo-flow
hook-forward <agent>`, `NEMO_FLOW_GATEWAY_URL`, and `--gateway-url`.

In `@integrations/coding-agents/README.md`:
- Around line 62-68: Add a complete lead-in sentence immediately before the TOML
code block that begins with [observability] (for example: "Example
configuration:" or "The following example shows common configuration options:")
and ensure the preceding sentence is terminated so the code block does not
grammatically complete the prior sentence; this satisfies the guideline to
introduce every code block with a full sentence.

---

Outside diff comments:
In `@crates/cli/src/config.rs`:
- Around line 564-580: The config search order in config_paths causes user
config to win over project config because merge_toml takes later files as higher
precedence; to make project override global/user as intended, change the
insertion order so the system config is first, then user_config_path() (user),
and finally the project config (project) — i.e., when using
find_project_config(&cwd) and user_config_path(), ensure you push user before
project in config_paths so that the project config (found via
find_project_config) is merged last and wins over user config.
🪄 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: da63d385-afa1-489d-9c1f-81f54d5348b2

📥 Commits

Reviewing files that changed from the base of the PR and between e6388f5 and ef8e0ee.

📒 Files selected for processing (18)
  • crates/cli/src/config.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-gateway.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • integrations/coding-agents/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
📜 Review details
🧰 Additional context used
📓 Path-based instructions (30)
**/*.{md,rst,html,txt}

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

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

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.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:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{md,rst,txt}

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

**/*.{md,rst,txt}: Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 documentation unless the source, platform, or legal guidance explicitly requires them.
Do not add trademark symbols to NeMo Flow learning documentation by default.
Do not rewrite API names, package names, command flags, or code literals for style reasons.

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{md,markdown,rst}

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

**/*.{md,markdown,rst}: 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
Use monospace formatting for code elements, commands, parameters, package names, and expressions
Use monospace formatting for directories, file names, and paths
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Use quotation marks for error messages and strings in documentation
Use bold formatting for UI buttons, menus, fields, and labels in documentation
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use in documentation
Use italics for publication titles in documentation
Use plain text formatting for keyboard shortcuts in documentation
Prefer [NVIDIA/NeMo](link) format for GitHub repository references over generic phrases 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 in documentation
Avoid generic link anchors such as 'here,' 'this page,' and 'read more' in documentation
Include the acronym in link text if a linked term includes an acronym
Do not link long sentences or multiple sentences in documentation
Avoid links that pull readers away from a procedure unles...

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

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

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant crate or package README when that surface changed

Relevant package or crate README.md files must be updated when examples or binding guidance changes

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run Markdown link checking via lychee for README.md, CONTRIBUTING.md, and docs/ through pre-commit hooks

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{md,markdown,py,sh,bash,js,ts,java,cpp,go,rust}

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

Keep package names, repo references, and build commands current in documentation

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{md,markdown,py,sh,bash}

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

Keep stable user-facing wrappers at scripts/ root in docs and examples; only point at namespaced helper paths when documenting internal maintenance work

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.{md,markdown,py,sh,bash,js,ts,example}

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

Example commands must match current package names and paths

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/{integrations,integration,*-integration}/**

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

**/{integrations,integration,*-integration}/**: Keep NeMo Flow optional in framework integrations
Preserve the framework's original behavior when NeMo Flow is absent
Wrap tool and LLM paths at the correct framework boundary
Integration pattern must follow docs/integrate-frameworks/adding-scopes.md

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
**/*.{md,txt,rst}

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

**/*.{md,txt,rst}: Ensure commands, package names, file paths, and APIs in documentation are correct and not stale; flag incorrect or outdated information as blocking issues
Ensure examples and procedures in documentation will execute successfully with current APIs and commands
Use consistent user-facing terminology throughout documentation that matches current repo terminology
Capitalize NVIDIA correctly in all documentation and public-facing text
Format code, commands, paths, and filenames as inline code (monospace) in documentation
Use descriptive anchor text for links instead of bare URLs or weak labels like 'here' in documentation
Prefer active voice, present tense, short sentences, and plain English in documentation
Structure documentation procedures as imperative steps that are easy to scan and not too long for a single sequence
Prefer 'after' instead of 'once' for temporal references in documentation
Use 'can' instead of 'may' when describing possibility (rather than permission) in documentation
Avoid ambiguous numeric dates and ordinal dates in documentation body text

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{README.md,docs/index.md,**/README.md}

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

Update entry-point documentation (README.md, docs/index.md, package READMEs, binding-level source READMEs) whenever public behavior changes

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • integrations/coding-agents/claude-code/README.md
  • integrations/coding-agents/README.md
**/*.{py,js,ts,tsx,go,rs,md}

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

Format changed files with the language-native formatter before the final lint/test pass

Files:

  • integrations/coding-agents/codex/README.md
  • integrations/coding-agents/cursor/README.md
  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • integrations/coding-agents/claude-code/README.md
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • integrations/coding-agents/README.md
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • docs/integrate-frameworks/coding-agent-gateway.md
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
docs/**/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run ./scripts/build-docs.sh for documentation site changes

docs/**/*.md: Relevant getting-started or reference docs must be updated when examples change
Release-policy docs must point to GitHub Releases as the only release-history source of truth

docs/**/*.md: Use title case for headings in technical documentation
Introduce code blocks, tables, and lists with complete lead-in sentences in documentation

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{RELEASING.md,CHANGELOG.md,docs/**/*.md}

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

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

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
docs/integrate-frameworks/**/*.md

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

Documentation must be updated if activation or usage of the integration changed

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{scripts/*.sh,docs/**/*.md}

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

Use root ./scripts/*.sh commands in docs and contributor guidance as documented, with implementations under scripts/third-party/

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{docs/**,examples/**,crates/adaptive/**,python/nemo_flow/**,go/nemo_flow/**,**/{example,component}.{ts,tsx,js,rs,py,go}}

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

Any new adaptive component kind must have documentation, examples, and binding coverage across all supported languages

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{README*,CHANGELOG*,docs/**/*.{md,rst,txt},examples/**/*,*.md}

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

Update documentation, examples, and getting-started guides with new package/module/crate names after rename operations

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{README.md,docs/**/*.md,examples/**/*.{js,ts,py,go,rs}}

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

Keep documentation and examples synchronized with current install, import, and build commands

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{README.md,CONTRIBUTING.md,docs/**/*.md}

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

For docs-only changes, run targeted checks only if commands, package names, or examples changed. Use just docs for docs-site builds and just docs-linkcheck when links changed

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

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

Files:

  • docs/integrate-frameworks/coding-agent-hermes.md
  • docs/integrate-frameworks/coding-agent-claude-code.md
  • docs/integrate-frameworks/coding-agent-cursor.md
  • docs/integrate-frameworks/coding-agent-codex.md
  • docs/integrate-frameworks/coding-agent-gateway.md
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

**/*.rs: Run cargo fmt --all for FFI work as it is Rust work
Run just test-rust for FFI validation
Run cargo clippy --workspace --all-targets -- -D warnings to enforce warnings-as-errors linting

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

**/*.rs: Run cargo fmt --all for Rust code formatting
Run cargo clippy --workspace --all-targets -- -D warnings to enforce Rust linting with no warnings
Run just test-rust as the shared-runtime build/test wrapper for Rust changes

Use Rust snake_case naming convention for Rust code

**/*.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 Rust code formatting when Node changes touch Rust files
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting when Rust files changed as part of Node work

**/*.rs: Always run just test-rust when any Rust code changes
Always run cargo fmt --all when any Rust code changes
Always run cargo clippy --workspace --all-targets -- -D warnings when any Rust code changes

Files:

  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
**/*.{rs,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all Rust, Go, JavaScript, and TypeScript source files using C-style comment syntax

Files:

  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use SONAR_IGNORE_START / SONAR_IGNORE_END markers only for documented false positives that cannot be resolved in code; keep ignored blocks small, add explanatory comments, and require reviewer sign-off

Files:

  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
**/*.{js,ts,tsx,jsx,py,rs,go,java,c,cpp,h,cc,cxx,cs,rb,php,swift,kt}

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

Changed files must be formatted with the language-native formatter

Files:

  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
**/*.{rs,py,js,ts,tsx,go}

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

During iteration, prefer uv run pre-commit run --files <changed files...> for targeted validation

Files:

  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/config.rs
{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_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
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
**/{config,schema,adaptive}.{yaml,yml,json,ts,tsx,py,go,rs}

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

Ensure dynamic config shape matches the documented canonical model in docs/use-adaptive-optimization/configure.md

Files:

  • crates/cli/src/config.rs
🔇 Additional comments (16)
crates/cli/src/setup.rs (4)

90-110: PATH detection is still not platform-correct for executable lookup.

Line 104-107 still uses split_paths + dir.join(exec).is_file(), which misses Windows PATHEXT resolution and can mis-detect installed agents.


195-198: Global config path handling still ignores $XDG_CONFIG_HOME.

These locations still hardcode ~/.config/nemo-flow/config.toml for read/preview/write paths, so setup can target the wrong global file on XDG-configured systems.

Also applies to: 464-467, 793-794


225-229: Scoped merge still preserves omitted wizard-owned sections instead of clearing them.

merge_section only updates keys present in the new doc. Re-running scoped setup cannot clear prior [upstream] / shared-section overrides when the new answers omit them.

Also applies to: 234-241


555-564: Blank URL input is still accepted and persisted.

ask_openai_base_url and OpenInference endpoint prompt paths still accept empty strings, which can write invalid config values.

Also applies to: 681-687

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

510-529: Live status frame still writes to stdout on live runs.

This remains a stdout contamination risk for piped/redirected agent output; it should be gated for TTY and emitted on stderr.

Also applies to: 606-613

crates/cli/tests/cli_tests.rs (3)

38-66: Non-hermetic test due to system config search scope.

This test isolates user and project config via XDG_CONFIG_HOME and HOME, but the config discovery still checks /etc/nemo-flow/config.toml per Line 616 in crates/cli/src/config.rs. If that system file exists on a CI runner, the test can fail nondeterministically.


25-35: LGTM!

The test correctly verifies that all four easy-path agent shortcuts are listed in --help output, matching the PR's canonical agent tokens.


69-158: LGTM!

The config resolution tests correctly reflect the migration to config.toml with the new [upstream] and [observability] section layout. Path updates and assertions are accurate.

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

23-43: Synchronize PATH mutation to avoid test races.

Lines 23-24 state "Tests are not run concurrently within the same binary by default," but this is incorrect—cargo test runs tests in parallel by default. The unsafe PATH mutation (lines 26-42) can race with other tests that read environment variables, causing nondeterministic failures.


46-302: LGTM!

The setup wizard tests comprehensively cover TOML rendering, merge semantics, scope handling, and Hermes hook installation. The test isolation via tempfile::tempdir() is appropriate, and assertions correctly validate the new config.toml layout with [observability], [upstream], and [agents.*] sections.

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

1-648: LGTM!

The launcher test updates correctly reflect the agent name changes (claude-codeclaude), argv resolution behavior, and Codex authentication handling. Comments are accurate and test coverage is thorough.

docs/integrate-frameworks/coding-agent-cursor.md (1)

1-137: LGTM!

Documentation correctly reflects the migration to .nemo-flow/config.toml with the [observability] section layout. The "Standalone Gateway" section accurately replaces the prior "Persistent Install" guidance. Commands, paths, and formatting are all correct.

integrations/coding-agents/claude-code/README.md (1)

1-119: LGTM!

Integration documentation correctly updates to the canonical claude agent token, the new config.toml layout with [observability] and [agents.claude] sections, and the "Standalone Gateway" pattern. All commands and paths are accurate.

docs/integrate-frameworks/coding-agent-claude-code.md (1)

1-138: LGTM!

Documentation correctly reflects the claude agent token, config.toml layout with [observability] and [agents.claude], and the wrapper's ephemeral hook behavior. Commands and paths are accurate throughout.

docs/integrate-frameworks/coding-agent-codex.md (1)

1-155: LGTM!

Documentation correctly updates to the new config.toml layout with [upstream] and [observability] sections. The "Standalone Gateway" guidance with provider alias configuration is accurate and consistent with the CLI changes.

docs/integrate-frameworks/coding-agent-hermes.md (1)

1-130: LGTM!

Documentation correctly reflects the config.toml layout with [observability] and the new "Hermes Hook Setup" section. The explanation of .hermes/config.yaml merging via nemo-flow config and the NEMO_FLOW_GATEWAY_URL vs --gateway-url fallback behavior is accurate.

Comment thread crates/cli/src/config.rs
Comment thread crates/cli/src/launcher.rs Outdated
Comment thread docs/integrate-frameworks/coding-agent-gateway.md
Comment thread integrations/coding-agents/README.md Outdated
@AjayThorve AjayThorve requested a review from willkill07 May 12, 2026 09:59
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

♻️ Duplicate comments (7)
crates/cli/src/doctor.rs (3)

211-216: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Replace manual PATH scanning with platform-aware executable resolution.

Current lookup misses Windows PATHEXT behavior and can treat non-executable files as detected binaries.

Suggested fix
 fn which_on_path(exec: &str) -> Option<PathBuf> {
-    let path_var = std::env::var_os("PATH")?;
-    std::env::split_paths(&path_var)
-        .map(|dir| dir.join(exec))
-        .find(|candidate| candidate.is_file())
+    which::which(exec).ok()
 }
#!/bin/bash
# Verify current executable resolution logic and whether platform-aware lookup is used.
rg -n "fn which_on_path|split_paths\\(|is_file\\(|which::which" crates/cli/src/doctor.rs crates/cli/Cargo.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/doctor.rs` around lines 211 - 216, The current which_on_path
function does a manual PATH scan that ignores Windows PATHEXT and executable
permission semantics; replace it with a platform-aware resolver by using the
which::which utility (or implement equivalent logic: respect PATHEXT on Windows
and check executable permission bits on Unix via metadata.permissions().mode()
or is_executable checks) so that which_on_path(exec: &str) returns the canonical
PathBuf only for true executables; update references to which_on_path
accordingly and remove the manual split_paths/is_file logic.

221-227: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Set kill-on-drop for the version probe subprocess.

The child is awaited under timeout(...); if timeout elapses, the subprocess can outlive the check unless kill-on-drop is enabled.

Suggested fix
 async fn probe_version(binary: &std::path::Path) -> Option<String> {
     let mut cmd = tokio::process::Command::new(binary);
+    cmd.kill_on_drop(true);
     cmd.arg("--version")
         .stdout(Stdio::piped())
         .stderr(Stdio::null())
         .stdin(Stdio::null());
#!/bin/bash
# Verify timeout-based process probe and absence/presence of kill_on_drop.
rg -n "probe_version|timeout\\(|kill_on_drop|wait_with_output" crates/cli/src/doctor.rs
🤖 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 221 - 227, The spawned subprocess used
to probe versions can outlive the timeout unless kill-on-drop is enabled; change
the local variable returned by cmd.spawn() to mutable (e.g., let mut child =
cmd.spawn().ok()?) and call child.kill_on_drop(true) before awaiting the result
(before calling timeout(..., child.wait_with_output())). This ensures the Child
created by tokio::process::Command (the variable named child used with
wait_with_output and timeout) is configured to be killed if dropped.

140-142: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use the same global-config path resolver as the rest of the CLI.

This hardcoded ~/.config/... construction can disagree with XDG-aware resolution, so doctor may report the wrong global layer status.

🤖 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 140 - 142, The code builds global_path
manually with a "~/.config/..." fallback which can conflict with the CLI's
XDG-aware resolver; replace the manual fallback in the global_path construction
with a call to the shared global-config path resolver used elsewhere in the CLI
(e.g., the function used by other commands like resolve_global_config_path or
Config::global_config_path). Update the global_path assignment (the variable
named global_path in doctor.rs) to use that shared function (importing it if
necessary) instead of PathBuf::from("~/.config/nemo-flow/config.toml"), or
simply call the resolver unconditionally and remove the home.map(...) fallback
logic so doctor uses the same XDG-aware path as the rest of the CLI.
crates/cli/src/setup.rs (4)

679-690: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject blank OpenInference endpoints before persisting.

This branch still writes Some(endpoint) verbatim. A blank or whitespace-only input becomes endpoint = "", which later breaks launch/doctor flows with an invalid export target. Trim and reject or re-prompt on empty input here, the same way the Codex upstream prompt now does.

🤖 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 679 - 690, The OpenInference prompt
currently accepts blank/whitespace-only input and stores Some(endpoint) which
later breaks flows; modify the block that sets openinference_endpoint (the code
using Input::with_theme, with_prompt "OpenInference endpoint URL", and variable
endpoint) to trim the user's input and reject empty values: wrap the prompt in a
small loop that asks repeatedly until endpoint.trim().is_empty() is false (or
show an error and continue), then store the trimmed non-empty String in
Some(...); ensure you reuse the existing map_err(setup_error)? handling for each
prompt iteration so failures still propagate.

90-110: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use platform-aware executable lookup here.

dir.join(exec).is_file() does not implement command resolution semantics: it misses PATHEXT on Windows and also counts non-executable regular files as “installed”. That makes agent detection unreliable off the happy path. Use which::which_in or an equivalent executable lookup helper instead.

Does Rust's std::env::split_paths(...).any(|dir| dir.join(exec).is_file()) honor Windows PATHEXT and executable lookup semantics, or should which::which_in be used for cross-platform command discovery?
🤖 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 90 - 110, The detection code in
detect_installed_agents_in currently uses std::env::split_paths(...).any(|dir|
dir.join(exec).is_file()), which ignores Windows PATHEXT and executable
semantics and may count non-executable files; replace that check with
which::which_in(exec, Some(path_var), None).is_ok() (or equivalent
which::which_in handling) in the filter_map so found.then_some(agent) becomes
which::which_in(exec, Some(path_var), None).is_ok(). Update the candidates
handling in detect_installed_agents_in and add the which crate to Cargo.toml as
a dependency.

234-241: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Scoped reconfiguration cannot clear wizard-owned sections.

merge_section() preserves any top-level section omitted from the new wizard doc. In agent-scoped reruns that means deselecting a backend, or accepting the default Codex upstream, leaves the old [observability], [export], or [upstream] block in place. Wizard-owned sections need replace-on-omission semantics during scoped merges.

Suggested change
-fn merge_section(dst: &mut DocumentMut, src: &DocumentMut, key: &str) {
-    if let Some(item) = src.get(key) {
-        dst[key] = item.clone();
-    }
+fn replace_section(dst: &mut DocumentMut, src: &DocumentMut, key: &str) {
+    if let Some(item) = src.get(key) {
+        dst[key] = item.clone();
+    } else {
+        dst.remove(key);
+    }
 }
🤖 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 234 - 241, merge_section currently
preserves top-level sections omitted from the incoming wizard DocumentMut, which
causes wizard-owned blocks (e.g. [observability], [export], [upstream]) to
remain after scoped reruns; change merge_section so that when src.get(key)
returns Some it replaces dst[key] as now, but when src.get(key) is None it
removes any existing dst entry for that key (i.e., clear the section on
omission) so scoped merges perform replace-on-omission for wizard-owned
sections.

194-199: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Resolve global config paths through XDG_CONFIG_HOME.

This still hardcodes ~/.config/nemo-flow/config.toml for global writes, while the type docs and comments promise XDG-aware behavior. The same hardcoded path also appears in read_existing_defaults() and preview_paths(), so on XDG-configured machines the wizard will prefill, preview, and write against the wrong file.

🤖 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 194 - 199, The global config path is
hardcoded to "~/.config/nemo-flow" but should be XDG-aware; update all places
that construct the global_dir (the block inside the ConfigScope check and the
functions read_existing_defaults() and preview_paths()) to resolve the config
directory via the XDG mechanism (e.g., use dirs::config_dir() or read
XDG_CONFIG_HOME and fall back to $HOME/.config) and then append
"nemo-flow/config.toml" (preserving use of write_or_merge, preview, and reads).
Ensure you still create the directory with std::fs::create_dir_all and push the
resolved path into written, but derive global_dir from the XDG-aware value
rather than home.join(".config").
🤖 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/gateway.rs`:
- Around line 556-559: The current check for OPENAI_API_KEY uses .is_empty(),
which treats whitespace-only values as present; change the predicate to reject
whitespace-only strings so fallback auth isn't stripped. Locate the variable
has_openai_env (and the similar checks around the other occurrences) that call
std::env::var("OPENAI_API_KEY").ok().filter(|v| !v.is_empty()).is_some() and
replace the filter with a trim-based check such as .filter(|v|
!v.trim().is_empty()) (or an equivalent all-whitespace check) so keys containing
only whitespace are treated as missing.

In `@crates/cli/src/setup.rs`:
- Around line 253-259: The current merge blindly calls
as_table_mut().expect(...) on dst["agents"], which panics if a user-edited
config sets agents to a non-table value; instead, before calling as_table_mut()
check whether dst contains "agents" and if it does ensure it is a table,
returning a CliError::Config with a helpful message (mentioning the offending
key and expected type) when it isn’t; if the key is missing continue to insert
Item::Table(Table::new()) as before and then insert agent_key / src_agent into
agents_table, using the symbols dst, agents_table, agent_key, src_agent and
replacing the expect(...) panic with a typed error return (CliError::Config).
- Around line 287-302: The code writes the file and prints a success message
even when the `agents` table is missing because the `if let Some(agents) =
doc.get_mut("agents").and_then(Item::as_table_mut)` branch is skipped; modify
the logic so that if `doc.get_mut("agents").and_then(Item::as_table_mut)`
returns None you return early with the same "no `[agents.{agent_key}]` block"
message and do not call `std::fs::write` or the success `println!`.
Specifically, check the result of
`doc.get_mut("agents").and_then(Item::as_table_mut)` before proceeding (or
convert the `if let` to an explicit match), print the "No `[agents.{agent_key}]`
block to reset" message and `return Ok(())` when missing, and only call
`agents.remove(...)`, `doc.remove("agents")`, `std::fs::write(&path,
doc.to_string())?`, and the success `println!` when the `agents` table exists.

In `@crates/cli/tests/coverage/doctor_tests.rs`:
- Around line 98-115: Add a new test (e.g.,
format_human_reports_warn_only_footer) that builds a report via empty_report(),
pushes a Check into report.observability with Status::Warn (use the Check struct
and Status::Warn), calls format_human(&report), and then asserts the rendered
output contains the warn-only footer text (e.g., contains "warning" or
"Warnings") and does not contain the failing-footer "Some checks FAILED" to
ensure the exit_code==0/warn-only branch renders the correct message.

---

Duplicate comments:
In `@crates/cli/src/doctor.rs`:
- Around line 211-216: The current which_on_path function does a manual PATH
scan that ignores Windows PATHEXT and executable permission semantics; replace
it with a platform-aware resolver by using the which::which utility (or
implement equivalent logic: respect PATHEXT on Windows and check executable
permission bits on Unix via metadata.permissions().mode() or is_executable
checks) so that which_on_path(exec: &str) returns the canonical PathBuf only for
true executables; update references to which_on_path accordingly and remove the
manual split_paths/is_file logic.
- Around line 221-227: The spawned subprocess used to probe versions can outlive
the timeout unless kill-on-drop is enabled; change the local variable returned
by cmd.spawn() to mutable (e.g., let mut child = cmd.spawn().ok()?) and call
child.kill_on_drop(true) before awaiting the result (before calling timeout(...,
child.wait_with_output())). This ensures the Child created by
tokio::process::Command (the variable named child used with wait_with_output and
timeout) is configured to be killed if dropped.
- Around line 140-142: The code builds global_path manually with a
"~/.config/..." fallback which can conflict with the CLI's XDG-aware resolver;
replace the manual fallback in the global_path construction with a call to the
shared global-config path resolver used elsewhere in the CLI (e.g., the function
used by other commands like resolve_global_config_path or
Config::global_config_path). Update the global_path assignment (the variable
named global_path in doctor.rs) to use that shared function (importing it if
necessary) instead of PathBuf::from("~/.config/nemo-flow/config.toml"), or
simply call the resolver unconditionally and remove the home.map(...) fallback
logic so doctor uses the same XDG-aware path as the rest of the CLI.

In `@crates/cli/src/setup.rs`:
- Around line 679-690: The OpenInference prompt currently accepts
blank/whitespace-only input and stores Some(endpoint) which later breaks flows;
modify the block that sets openinference_endpoint (the code using
Input::with_theme, with_prompt "OpenInference endpoint URL", and variable
endpoint) to trim the user's input and reject empty values: wrap the prompt in a
small loop that asks repeatedly until endpoint.trim().is_empty() is false (or
show an error and continue), then store the trimmed non-empty String in
Some(...); ensure you reuse the existing map_err(setup_error)? handling for each
prompt iteration so failures still propagate.
- Around line 90-110: The detection code in detect_installed_agents_in currently
uses std::env::split_paths(...).any(|dir| dir.join(exec).is_file()), which
ignores Windows PATHEXT and executable semantics and may count non-executable
files; replace that check with which::which_in(exec, Some(path_var),
None).is_ok() (or equivalent which::which_in handling) in the filter_map so
found.then_some(agent) becomes which::which_in(exec, Some(path_var),
None).is_ok(). Update the candidates handling in detect_installed_agents_in and
add the which crate to Cargo.toml as a dependency.
- Around line 234-241: merge_section currently preserves top-level sections
omitted from the incoming wizard DocumentMut, which causes wizard-owned blocks
(e.g. [observability], [export], [upstream]) to remain after scoped reruns;
change merge_section so that when src.get(key) returns Some it replaces dst[key]
as now, but when src.get(key) is None it removes any existing dst entry for that
key (i.e., clear the section on omission) so scoped merges perform
replace-on-omission for wizard-owned sections.
- Around line 194-199: The global config path is hardcoded to
"~/.config/nemo-flow" but should be XDG-aware; update all places that construct
the global_dir (the block inside the ConfigScope check and the functions
read_existing_defaults() and preview_paths()) to resolve the config directory
via the XDG mechanism (e.g., use dirs::config_dir() or read XDG_CONFIG_HOME and
fall back to $HOME/.config) and then append "nemo-flow/config.toml" (preserving
use of write_or_merge, preview, and reads). Ensure you still create the
directory with std::fs::create_dir_all and push the resolved path into written,
but derive global_dir from the XDG-aware value rather than home.join(".config").
🪄 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: c6393a5a-67b8-4996-a772-569f70d8681e

📥 Commits

Reviewing files that changed from the base of the PR and between ef8e0ee and f799c3e.

📒 Files selected for processing (7)
  • crates/cli/src/doctor.rs
  • crates/cli/src/gateway.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: License Diff / Run
  • GitHub Check: Rust / Test (windows-arm64)
  • GitHub Check: Rust / Test (linux-amd64)
  • GitHub Check: Rust / Test (linux-arm64)
  • GitHub Check: Rust / Test (windows-amd64)
  • GitHub Check: Rust / Test (macos-arm64)
  • GitHub Check: Documentation / Build
🧰 Additional context used
📓 Path-based instructions (7)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

**/*.rs: Run cargo fmt --all for FFI work as it is Rust work
Run just test-rust for FFI validation
Run cargo clippy --workspace --all-targets -- -D warnings to enforce warnings-as-errors linting

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

**/*.rs: Run cargo fmt --all for Rust code formatting
Run cargo clippy --workspace --all-targets -- -D warnings to enforce Rust linting with no warnings
Run just test-rust as the shared-runtime build/test wrapper for Rust changes

Use Rust snake_case naming convention for Rust code

**/*.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 Rust code formatting when Node changes touch Rust files
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting when Rust files changed as part of Node work

**/*.rs: Always run just test-rust when any Rust code changes
Always run cargo fmt --all when any Rust code changes
Always run cargo clippy --workspace --all-targets -- -D warnings when any Rust code changes

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
**/*.{rs,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license headers in all Rust, Go, JavaScript, and TypeScript source files using C-style comment syntax

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use SONAR_IGNORE_START / SONAR_IGNORE_END markers only for documented false positives that cannot be resolved in code; keep ignored blocks small, add explanatory comments, and require reviewer sign-off

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
**/*.{js,ts,tsx,jsx,py,rs,go,java,c,cpp,h,cc,cxx,cs,rb,php,swift,kt}

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

Changed files must be formatted with the language-native formatter

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
**/*.{py,js,ts,tsx,go,rs,md}

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

Format changed files with the language-native formatter before the final lint/test pass

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
**/*.{rs,py,js,ts,tsx,go}

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

During iteration, prefer uv run pre-commit run --files <changed files...> for targeted validation

Files:

  • crates/cli/src/server.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/src/gateway.rs
  • crates/cli/tests/coverage/gateway_tests.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/doctor.rs
{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_flow/**/*_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/doctor_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/gateway_tests.rs
🔇 Additional comments (2)
crates/cli/src/server.rs (1)

37-54: AddrInUse handling is now actionable and cross-platform.

Line 37-54 correctly preserves non-AddrInUse IO errors while upgrading the common bind-collision case to a clear, user-facing remediation message with both Unix and Windows examples.

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

205-343: Good coverage for route-aware auth rewrite paths

These tests exercise the key OpenAI/Anthropic auth-strip and env-injection branches, including preserve/skip conditions. Nice regression safety for the new gateway behavior.

Comment thread crates/cli/src/gateway.rs
Comment thread crates/cli/src/setup.rs Outdated
Comment thread crates/cli/src/setup.rs Outdated
Comment thread crates/cli/src/setup.rs
Comment thread crates/cli/tests/coverage/doctor_tests.rs
@willkill07 willkill07 added Feature a new feature and removed feat labels May 12, 2026
@willkill07 willkill07 added this to the 0.2.0 milestone May 12, 2026
Bare-agent shortcuts (claude/codex/cursor/hermes), first-run setup wizard
with config pre-fill, doctor / agents / completions subcommands, and
`completions --install` for cargo-install users. Codex e2e fixes: strip
ChatGPT JWT, correct pass-through args. NMF-86 missing-OPENAI_API_KEY
warning surfaced eagerly. Friendlier copy on port already in use.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Slanted ANSI-Shadow figlet inside a rounded NVIDIA-green border. Smooth
tracer dot curves over NeMo, dips, glides under Flow, then settles as a
dim-green vX.Y.Z (sourced from CARGO_PKG_VERSION) at bottom-right. Uses
partial-redraw via DEC save/restore so the figlet never re-flickers.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Hermes hooks now land via `nemo-flow config` (the only agent that
needs persistent files); claude/codex/cursor stay wrapper-ephemeral.
Docs updated to drop `nemo-flow install` references.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
- gate stub-binary detect test on cfg(unix); use pure detect fn so
  tests don't mutate PATH and race in parallel runs.
- gateway: only strip ChatGPT-Plus JWT when OPENAI_API_KEY is set;
  preserves auth for users pointing at non-openai upstreams.
- doctor: PID-suffixed write probe with create_new so we can't ever
  overwrite a real user file; footer says 'No failing checks' so warns
  aren't masked by 'All checks passed'.
- server: OS-neutral remediation text in AddrInUse error (Unix +
  Windows examples).
- setup: trim and reject blank URL input before persisting config.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
The fake-agent flow needs argv[0] to be a script literally named after a
known agent. On Windows that requires cmd.exe wrapping, which loses the
inference. Skip on Windows until the launcher grows real Windows
support.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
- setup: respect XDG_CONFIG_HOME for global config writes, preview, and
  re-load (shared helper + config::user_config_dir).
- setup: wizard-owned [upstream]/[observability]/[export] sections now
  use replace semantics — re-running with the default actually clears a
  prior override.
- doctor: footer distinguishes pass vs pass-with-warns; kill_on_drop on
  the agent version probe so a hung child can't leak past the timeout;
  global config path now uses the same XDG-aware resolver.
- gateway: clarify the JWT-detection comment (Bearer eyJ prefix only;
  opaque OAuth tokens unaffected).
- launcher: live-status frame goes to stderr and is suppressed entirely
  when stdout is non-TTY, so piped agent output stays clean.
- config: rename AgentConfigs::claude_code -> AgentConfigs::claude to
  match the CLI rename.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve AjayThorve force-pushed the ajay/cli-for-sidecar branch from c53f85b to 465928f Compare May 12, 2026 16:29
CI runners set XDG_CONFIG_HOME (e.g. /home/runner/.config), which the
new XDG-aware global_config_dir() picks up and uses in preference to the
test's per-call home tempdir. Add an env-mutex guard that clears the var
for the test's lifetime so the home-path-prefix assertion is meaningful.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Pulls in:
- feat: Add LangGraph integration (NVIDIA#80)
- docs(openclaw): add plugin guide (NVIDIA#79)
- ci: gate package jobs on package path changes (NVIDIA#85)
- config: --config now signals daemon intent so bare nemo-flow --config X
  routes to the gateway instead of dropping into the wizard.
- launcher: easy-path setup trigger honors explicit --config and forwards
  the path to the synthetic RunCommand so run() reads the same file.
- gateway: treat whitespace-only OPENAI_API_KEY as missing; trim
  injected key value before building the Bearer header.
- setup: merge_agents_entry tolerates non-table 'agents' by replacing
  with a fresh table (no more panic on malformed user files).
- setup: 'config --reset <agent>' against a doc with no [agents] table
  now reports 'nothing to reset' instead of falsely reporting success.
- doctor: add warn-only footer test to lock in the pass-with-warnings
  branch landed earlier.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve AjayThorve force-pushed the ajay/cli-for-sidecar branch from 76ad769 to 09eba71 Compare May 12, 2026 19:51
AjayThorve and others added 6 commits May 12, 2026 12:55
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Codex supports two auth flows: OPENAI_API_KEY (routed to
api.openai.com/v1) and ChatGPT-Plus OAuth via `codex --login` (routed
to chatgpt.com/backend-api/codex). Previously the gateway always
forwarded to api.openai.com, which rejects the OAuth JWT.

The gateway now detects the JWT (`Bearer eyJ` prefix) and, when no
OPENAI_API_KEY is set, routes to the ChatGPT backend automatically.
When OPENAI_API_KEY is present, the existing behavior is preserved
(strip JWT, inject API key, route to api.openai.com).

Key changes:
- gateway: add dual-upstream routing via should_use_chatgpt_backend()
  and chatgpt_upstream_url() (no /v1 prefix for ChatGPT backend)
- launcher: flip requires_openai_auth=true so Codex sends its own
  credentials; warn only when neither OPENAI_API_KEY nor
  ~/.codex/auth.json is present
- setup: remove Codex upstream URL wizard question (auto-routing makes
  it unnecessary); keep the auth guide showing both options
- Comments reference Codex source locations for key behavioral details

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Will Killian <wkillian@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve AjayThorve force-pushed the ajay/cli-for-sidecar branch from e648ce3 to 4536b5f Compare May 12, 2026 21:12
Copy link
Copy Markdown
Collaborator

@Salonijain27 Salonijain27 left a comment

Choose a reason for hiding this comment

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

Approved from a dependency point of view

@willkill07
Copy link
Copy Markdown
Member

/merge

@rapids-bot rapids-bot Bot merged commit 64281f1 into NVIDIA:main May 12, 2026
30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feature a new feature lang:rust PR changes/introduces Rust code size:XXL PR is very large

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants