feat(cli): coding-agent sidecar UX — wizard, doctor, help, banner#83
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughRefactors 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. ChangesCLI Setup, Diagnostics, and Agent Shortcuts
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes ✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
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 winFix stale install command after
clauderename.This still uses
nemo-flow install claude-code, but the document now standardizes onclaude. 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 tradeoffVerify 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 namedclaude_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_code→agents.claudethroughout 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
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
ATTRIBUTIONS-Rust.mdCargo.tomlcrates/cli/Cargo.tomlcrates/cli/src/banner.rscrates/cli/src/completions_install.rscrates/cli/src/config.rscrates/cli/src/doctor.rscrates/cli/src/gateway.rscrates/cli/src/help.rscrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/concepts.mdcrates/cli/src/help_topics/observability.mdcrates/cli/src/help_topics/plugins.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/server.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/setup_tests.rsdocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-hermes.mdhomebrew/nemo-flow.rbintegrations/coding-agents/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/claude-code/hooks/hooks.jsonintegrations/coding-agents/codex/README.mdintegrations/coding-agents/cursor/README.mdscripts/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 spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names withNVIDIAon first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually do not need to be spelled out for developer audiences.
Files:
crates/cli/src/help_topics/observability.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-Rust.md
**/*.{md,rst,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,rst,txt}: SpellNVIDIAin all caps. Do not useNvidia,nvidia, orNV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical 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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-Rust.md
**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run Markdown link checking via
lycheeforREADME.md,CONTRIBUTING.md, anddocs/through pre-commit hooks
Files:
crates/cli/src/help_topics/observability.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mdscripts/install.shdocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mdscripts/install.shdocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mdscripts/install.shdocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/README.mdATTRIBUTIONS-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.mdcrates/cli/src/server.rscrates/cli/src/help_topics/troubleshooting.mdcrates/cli/src/help_topics/agents.mdcrates/cli/src/help_topics/plugins.mdcrates/cli/tests/coverage/banner_tests.rsintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-hermes.mdcrates/cli/src/help_topics/concepts.mddocs/integrate-frameworks/coding-agent-cursor.mdcrates/cli/tests/coverage/installer_tests.rsdocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdintegrations/coding-agents/claude-code/README.mdcrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rsdocs/integrate-frameworks/coding-agent-codex.mdcrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rsintegrations/coding-agents/README.mdcrates/cli/src/setup.rscrates/cli/src/doctor.rsATTRIBUTIONS-Rust.mdcrates/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.rbcrates/cli/src/server.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rscrates/cli/src/setup.rscrates/cli/src/doctor.rscrates/cli/src/config.rs
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)
**/*.rs: Runcargo fmt --allfor FFI work as it is Rust work
Runjust test-rustfor FFI validation
Runcargo clippy --workspace --all-targets -- -D warningsto enforce warnings-as-errors lintingWhen Rust files changed as part of Python work, run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting
Runcargo clippy --workspace --all-targets -- -D warningsto enforce Rust linting with no warnings
Runjust test-rustas the shared-runtime build/test wrapper for Rust changesUse Rust snake_case naming convention for Rust code
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting when Node changes touch Rust files
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting when Rust files changed as part of Node work
**/*.rs: Always runjust test-rustwhen any Rust code changes
Always runcargo fmt --allwhen any Rust code changes
Always runcargo clippy --workspace --all-targets -- -D warningswhen any Rust code changes
Files:
crates/cli/src/server.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rscrates/cli/src/setup.rscrates/cli/src/doctor.rscrates/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.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rscrates/cli/src/setup.rscrates/cli/src/doctor.rscrates/cli/src/config.rs
**/*.{rs,py,go,js,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use
SONAR_IGNORE_START/SONAR_IGNORE_ENDmarkers 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.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rscrates/cli/src/setup.rscrates/cli/src/doctor.rscrates/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.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/completions_install.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/main.rscrates/cli/src/help.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/banner.rscrates/cli/src/launcher.rscrates/cli/src/setup.rscrates/cli/src/doctor.rscrates/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.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/help_tests.rscrates/cli/tests/coverage/setup_tests.rs
**/Cargo.{toml,lock}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
cargo deny checkfor Rust dependency auditing as configured indeny.toml
Files:
Cargo.tomlcrates/cli/Cargo.toml
**/*.toml
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Include SPDX license headers in TOML files using TOML comment syntax
Files:
Cargo.tomlcrates/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: MaintainCargo.toml[workspace.package].versionas the source of truth for the Rust workspace and Python build versioning
KeepCargo.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 --allto 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.mdintegrations/coding-agents/codex/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/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 followdocs/integrate-frameworks/adding-scopes.md
Files:
integrations/coding-agents/cursor/README.mdintegrations/coding-agents/codex/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/claude-code/hooks/hooks.jsonintegrations/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.mdintegrations/coding-agents/codex/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.md
docs/**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
./scripts/build-docs.shfor 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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-codex.md
{scripts/*.sh,docs/**/*.md}
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Use root
./scripts/*.shcommands in docs and contributor guidance as documented, with implementations underscripts/third-party/
Files:
docs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mdscripts/install.shdocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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 docsfor docs-site builds andjust docs-linkcheckwhen links changed
Files:
docs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/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.mdwith./scripts/generate_attributions.sh rustif 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)
c8bf3e3 to
e6388f5
Compare
There was a problem hiding this comment.
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 winWindows Path Can Break Agent Inference in
run_starts_gateway...Line 554 relies on agent inference from
argv[0], but the Windows helper setsargv[0]tocmd.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 winMake 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 winMarkdown 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.shto:
- Insert blank lines before and after all headings
- Insert blank lines before and after all fenced code blocks
- Label license fences as
```textThen 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.mdwith./scripts/generate_attributions.sh rustif 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 winUse 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
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (30)
ATTRIBUTIONS-Rust.mdcrates/cli/Cargo.tomlcrates/cli/src/banner.rscrates/cli/src/completions_install.rscrates/cli/src/config.rscrates/cli/src/doctor.rscrates/cli/src/gateway.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/server.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/setup_tests.rsdocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-hermes.mdintegrations/coding-agents/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/claude-code/hooks/hooks.jsonintegrations/coding-agents/codex/README.mdintegrations/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: Runcargo fmt --allfor FFI work as it is Rust work
Runjust test-rustfor FFI validation
Runcargo clippy --workspace --all-targets -- -D warningsto enforce warnings-as-errors lintingWhen Rust files changed as part of Python work, run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting
Runcargo clippy --workspace --all-targets -- -D warningsto enforce Rust linting with no warnings
Runjust test-rustas the shared-runtime build/test wrapper for Rust changesUse Rust snake_case naming convention for Rust code
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting when Node changes touch Rust files
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting when Rust files changed as part of Node work
**/*.rs: Always runjust test-rustwhen any Rust code changes
Always runcargo fmt --allwhen any Rust code changes
Always runcargo clippy --workspace --all-targets -- -D warningswhen any Rust code changes
Files:
crates/cli/tests/coverage/installer_tests.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/server.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rscrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/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.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/server.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rscrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/cli/src/setup.rs
**/*.{rs,py,go,js,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use
SONAR_IGNORE_START/SONAR_IGNORE_ENDmarkers 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.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/server.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rscrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/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.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/server.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rscrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/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.rsintegrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdcrates/cli/tests/coverage/completions_install_tests.rsintegrations/coding-agents/cursor/README.mdcrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rsintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mdcrates/cli/src/server.rscrates/cli/src/gateway.rsdocs/integrate-frameworks/coding-agent-codex.mdcrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rsATTRIBUTIONS-Rust.mdcrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rsdocs/integrate-frameworks/coding-agent-claude-code.mdcrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/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.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/server.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/main.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/completions_install.rscrates/cli/src/banner.rscrates/cli/src/doctor.rscrates/cli/src/config.rscrates/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.rscrates/cli/tests/coverage/completions_install_tests.rscrates/cli/tests/coverage/banner_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/config_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/doctor_tests.rs
**/*.{md,rst,html,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)
**/*.{md,rst,html,txt}: Always spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names withNVIDIAon first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually do not need to be spelled out for developer audiences.
Files:
integrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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}: SpellNVIDIAin all caps. Do not useNvidia,nvidia, orNV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical 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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.md
**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run Markdown link checking via
lycheeforREADME.md,CONTRIBUTING.md, anddocs/through pre-commit hooks
Files:
integrations/coding-agents/codex/README.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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 followdocs/integrate-frameworks/adding-scopes.md
Files:
integrations/coding-agents/codex/README.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mdintegrations/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.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.md
docs/**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
./scripts/build-docs.shfor 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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-claude-code.md
{scripts/*.sh,docs/**/*.md}
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Use root
./scripts/*.shcommands in docs and contributor guidance as documented, with implementations underscripts/third-party/
Files:
docs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mdATTRIBUTIONS-Rust.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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 docsfor docs-site builds andjust docs-linkcheckwhen links changed
Files:
docs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-claude-code.md
**/Cargo.{toml,lock}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
cargo deny checkfor Rust dependency auditing as configured indeny.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.mdwith./scripts/generate_attributions.sh rustif 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 ConsistentThe
config.tomlpath 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 CorrectThe 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 GoodThe switch to
config.tomland[observability]is correctly reflected in the example.docs/integrate-frameworks/coding-agent-gateway.md (1)
89-112: Gateway Config Example Tracks the New SchemaThe 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 SolidThe fixture migration to
config.tomland 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-ScopedThese 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_statusstill usesprintln!/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, andpreview_pathsall bake inhome.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_sectionpreserves the existing block. Re-runningnemo-flow config codextherefore keeps the prior customopenai_base_urlinstead of resetting to default. Wizard-owned sections need replace semantics here.Also applies to: 224-230
There was a problem hiding this comment.
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 winConfig 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
📒 Files selected for processing (18)
crates/cli/src/config.rscrates/cli/src/installer.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/setup_tests.rsdocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-gateway.mddocs/integrate-frameworks/coding-agent-hermes.mdintegrations/coding-agents/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/codex/README.mdintegrations/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 spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names withNVIDIAon first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually do not need to be spelled out for developer audiences.
Files:
integrations/coding-agents/codex/README.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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}: SpellNVIDIAin all caps. Do not useNvidia,nvidia, orNV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as 'here' or 'read more.'
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical 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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.md
**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run Markdown link checking via
lycheeforREADME.md,CONTRIBUTING.md, anddocs/through pre-commit hooks
Files:
integrations/coding-agents/codex/README.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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 followdocs/integrate-frameworks/adding-scopes.md
Files:
integrations/coding-agents/codex/README.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdintegrations/coding-agents/README.mddocs/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.mdintegrations/coding-agents/cursor/README.mdintegrations/coding-agents/claude-code/README.mdintegrations/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.mdintegrations/coding-agents/cursor/README.mddocs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mdintegrations/coding-agents/claude-code/README.mdcrates/cli/tests/coverage/setup_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rsintegrations/coding-agents/README.mdcrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rsdocs/integrate-frameworks/coding-agent-gateway.mdcrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/cli/src/config.rs
docs/**/*.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
./scripts/build-docs.shfor 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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-gateway.md
{scripts/*.sh,docs/**/*.md}
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Use root
./scripts/*.shcommands in docs and contributor guidance as documented, with implementations underscripts/third-party/
Files:
docs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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 docsfor docs-site builds andjust docs-linkcheckwhen links changed
Files:
docs/integrate-frameworks/coding-agent-hermes.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/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.mddocs/integrate-frameworks/coding-agent-claude-code.mddocs/integrate-frameworks/coding-agent-cursor.mddocs/integrate-frameworks/coding-agent-codex.mddocs/integrate-frameworks/coding-agent-gateway.md
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)
**/*.rs: Runcargo fmt --allfor FFI work as it is Rust work
Runjust test-rustfor FFI validation
Runcargo clippy --workspace --all-targets -- -D warningsto enforce warnings-as-errors lintingWhen Rust files changed as part of Python work, run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting
Runcargo clippy --workspace --all-targets -- -D warningsto enforce Rust linting with no warnings
Runjust test-rustas the shared-runtime build/test wrapper for Rust changesUse Rust snake_case naming convention for Rust code
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting when Node changes touch Rust files
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting when Rust files changed as part of Node work
**/*.rs: Always runjust test-rustwhen any Rust code changes
Always runcargo fmt --allwhen any Rust code changes
Always runcargo clippy --workspace --all-targets -- -D warningswhen any Rust code changes
Files:
crates/cli/tests/coverage/setup_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/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.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/cli/src/config.rs
**/*.{rs,py,go,js,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use
SONAR_IGNORE_START/SONAR_IGNORE_ENDmarkers 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.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/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.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/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.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/launcher.rscrates/cli/src/main.rscrates/cli/src/setup.rscrates/cli/tests/cli_tests.rscrates/cli/tests/coverage/installer_tests.rscrates/cli/src/installer.rscrates/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.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/cli_tests.rscrates/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 WindowsPATHEXTresolution 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.tomlfor 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_sectiononly 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_urland 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_HOMEandHOME, but the config discovery still checks/etc/nemo-flow/config.tomlper Line 616 incrates/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
--helpoutput, matching the PR's canonical agent tokens.
69-158: LGTM!The config resolution tests correctly reflect the migration to
config.tomlwith 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 testruns tests in parallel by default. TheunsafePATH 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 newconfig.tomllayout 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-code→claude), 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.tomlwith 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
claudeagent token, the newconfig.tomllayout 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
claudeagent token,config.tomllayout 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.tomllayout 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.tomllayout with[observability]and the new "Hermes Hook Setup" section. The explanation of.hermes/config.yamlmerging vianemo-flow configand theNEMO_FLOW_GATEWAY_URLvs--gateway-urlfallback behavior is accurate.
There was a problem hiding this comment.
Actionable comments posted: 5
♻️ Duplicate comments (7)
crates/cli/src/doctor.rs (3)
211-216:⚠️ Potential issue | 🟠 Major | ⚡ Quick winReplace manual PATH scanning with platform-aware executable resolution.
Current lookup misses Windows
PATHEXTbehavior 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 winSet 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 winUse 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 winReject blank OpenInference endpoints before persisting.
This branch still writes
Some(endpoint)verbatim. A blank or whitespace-only input becomesendpoint = "", 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 winUse platform-aware executable lookup here.
dir.join(exec).is_file()does not implement command resolution semantics: it missesPATHEXTon Windows and also counts non-executable regular files as “installed”. That makes agent detection unreliable off the happy path. Usewhich::which_inor 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 winScoped 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 winResolve global config paths through
XDG_CONFIG_HOME.This still hardcodes
~/.config/nemo-flow/config.tomlfor global writes, while the type docs and comments promise XDG-aware behavior. The same hardcoded path also appears inread_existing_defaults()andpreview_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
📒 Files selected for processing (7)
crates/cli/src/doctor.rscrates/cli/src/gateway.rscrates/cli/src/server.rscrates/cli/src/setup.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/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: Runcargo fmt --allfor FFI work as it is Rust work
Runjust test-rustfor FFI validation
Runcargo clippy --workspace --all-targets -- -D warningsto enforce warnings-as-errors lintingWhen Rust files changed as part of Python work, run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting
Runcargo clippy --workspace --all-targets -- -D warningsto enforce Rust linting with no warnings
Runjust test-rustas the shared-runtime build/test wrapper for Rust changesUse Rust snake_case naming convention for Rust code
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor Rust code formatting when Node changes touch Rust files
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting when Rust files changed as part of Node work
**/*.rs: Always runjust test-rustwhen any Rust code changes
Always runcargo fmt --allwhen any Rust code changes
Always runcargo clippy --workspace --all-targets -- -D warningswhen any Rust code changes
Files:
crates/cli/src/server.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/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.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/cli/src/doctor.rs
**/*.{rs,py,go,js,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use
SONAR_IGNORE_START/SONAR_IGNORE_ENDmarkers 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.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/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.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/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.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/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.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/setup_tests.rscrates/cli/src/gateway.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/src/setup.rscrates/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.rscrates/cli/tests/coverage/setup_tests.rscrates/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-
AddrInUseIO 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 pathsThese tests exercise the key OpenAI/Anthropic auth-strip and env-injection branches, including preserve/skip conditions. Nice regression safety for the new gateway behavior.
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>
c53f85b to
465928f
Compare
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>
- 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>
76ad769 to
09eba71
Compare
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>
e648ce3 to
4536b5f
Compare
Salonijain27
left a comment
There was a problem hiding this comment.
Approved from a dependency point of view
|
/merge |
Overview
Builds out the user-facing surface of
nemo-flowso a developer can go from "never used this" to "agent running with tracing wired up" without reading docs:nemo-flow claude|codex|cursor|hermesdoctor,agents,completionssubcommands (--jsonondoctor/agents)vX.Y.Ztag sourced fromCARGO_PKG_VERSIONOPENAI_API_KEYwarning eagerness, friendlierAddrInUsecopyRenamed agent identifier
claude-code→claudeso the CLI surface matches the binary users actually invoke (claudeon$PATH) and reads naturally asnemo-flow claude; the longer form was redundant since "Claude Code" IS the CLI.Details
CLI surface:
crates/cli/src/config.rs—Doctor,Agents,Completions,Config, bare-agent (Claude/Codex/Cursor/Hermes) subcommand variants; per-agentlong_about+after_help;ServerArgs::requested_daemon_mode()helpercrates/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 forcrates/cli/src/setup.rs—Defaultspre-fill from existing TOML, dialoguer keybinding hint, agent-scoped wizard, reset supportcrates/cli/src/doctor.rs— purecollect_report/format_human/format_json/exit_codehelpers split from I/Ocrates/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/\x1b8save/restore (no full-banner reflicker), dockedvX.Y.Ztagcrates/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_COLORcrates/cli/src/server.rs— actionable copy when the gateway port is already in useRelease / 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::runfor the dispatch tree and the bare-nemo-flow→ wizard intentcrates/cli/src/banner.rs::animate_revealfor the partial-redraw animation and dock-tag settlecrates/cli/src/setup.rs::prompt_userfor the wizard flow with pre-fillcrates/cli/src/launcher.rs::print_live_statusfor the bordered pre-launch blockcrates/cli/tests/coverage/{banner,doctor,setup,completions_install,launcher}_tests.rsValidation:
cargo fmt --all,cargo clippy --workspace --all-targets -- -D warnings,just test-rust, anduv run pre-commit run --files <changed>all green.Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Summary by CodeRabbit
New Features
nemo-flow doctorandnemo-flow agents; easy-path shortcuts (claude, codex, cursor, hermes); animated startup banner, pre-launch status display; completions install command.Configuration
claude.Bug Fixes
Documentation
Chores