Skip to content

chore: Remove the hermes_cli adapter, rename the hermes_sdk adapter to hermes - #59

Merged
rapids-bot[bot] merged 25 commits into
NVIDIA:mainfrom
dagardner-nv:david-hermes-agent-adapter
Jul 14, 2026
Merged

chore: Remove the hermes_cli adapter, rename the hermes_sdk adapter to hermes#59
rapids-bot[bot] merged 25 commits into
NVIDIA:mainfrom
dagardner-nv:david-hermes-agent-adapter

Conversation

@dagardner-nv

@dagardner-nv dagardner-nv commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Overview

  • Removed the common/hermes.py module, any hermes specific methods moved into back into the adaper
  • Any methods in common/hermes.py that are of general use were moved to common/utils.py
  • Remove unnecessary sys.path manipulation in tests that is no longer needed.

Where should the reviewer start?

  • adapters/hermes/pyproject.toml

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

  • Closes FABRIC-66

  • I confirm this contribution is my own work, or I have the right to submit it under this project's license.

  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Summary by CodeRabbit

  • New Features
    • Consolidated Hermes support into the single Hermes Agent adapter (nvidia.fabric.hermes), including updated profiles and artifact output paths (artifacts/hermes).
    • Enforced relay-only telemetry when running Hermes and improved runtime/session handling for Hermes executions.
  • Documentation
    • Updated Quick Start, install docs, examples, and integration guides to remove Hermes CLI/SDK references and use the unified Hermes adapter.
  • Refactor
    • Centralized shared adapter utility helpers and moved Hermes-specific config generation into the Hermes adapter.
  • Tests
    • Updated/removed Hermes CLI and Hermes SDK test coverage; added unit tests for the shared utility helpers.

Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
…er or to common utils

Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
…es adapter

Signed-off-by: David Gardner <dagardner@nvidia.com>
…s-agent-adapter

Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
@linear

linear Bot commented Jul 13, 2026

Copy link
Copy Markdown

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 96cebd02-1bc1-4a24-90ea-051e8be1cea2

📥 Commits

Reviewing files that changed from the base of the PR and between d394246 and b9f98d9.

📒 Files selected for processing (1)
  • tests/adapters/test_hermes_adapter.py
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Test (x86_64)
  • GitHub Check: Test (arm64)
🧰 Additional context used
📓 Path-based instructions (5)
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to test functions; async tests are detected and run automatically.
Do not add -> None return type annotations to test functions.
When mocking a class, do not define a new class; use unittest.mock.MagicMock or unittest.mock.AsyncMock, adding spec when needed.
Name mocked classes with a mock prefix, not fake.
Prefer pytest fixtures over helper methods.
Do not duplicate fixtures across test files; if a fixture is needed in multiple test files, define it in conftest.py.
When creating a fixture, use @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and define the function as <fixture_name>_fixture() -> <return_type>; only pass scope when it is not function.
Prefer pytest.mark.parametrize over creating separate tests for different input types.
If a fixture is needed for a test but does not return a value, or its value is unused, use @pytest.mark.usefixtures.
When modifying environment variables in a test, use os.environ; tests/conftest.py provides an autouse restore_environ_fixture that restores environment variables after each test, so monkeypatch.setenv is unnecessary.

Files:

  • tests/adapters/test_hermes_adapter.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.py: Use type annotations for public Python APIs and keep native Python binding declarations synchronized with their Rust implementations.
Python files must use the specified SPDX copyright and Apache-2.0 license header with # comments.

Files:

  • tests/adapters/test_hermes_adapter.py
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use snake_case for Rust and Python functions and variables; use PascalCase for Rust types and Python classes.
Run tests for every affected language surface; changes touching the Rust core or public schemas require both Rust and Python test suites.
When adding functionality, include tests in the corresponding Rust crate or relevant tests/ area.
Public contract changes must keep native Python binding declarations synchronized with their Rust implementations.

Files:

  • tests/adapters/test_hermes_adapter.py
**/*

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the appropriate SPDX license header using comment syntax valid for the file type.

Files:

  • tests/adapters/test_hermes_adapter.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/adapters/test_hermes_adapter.py
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T17:13:43.147Z
Learning: Release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T17:13:43.147Z
Learning: All contributors must sign off commits with `git commit --signoff` or `-s`; unsigned-off commits are not accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T17:13:43.147Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase onto the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T17:13:43.147Z
Learning: Pull requests require at least one approving review and passing CI before merge; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T17:13:43.147Z
Learning: Commit messages must use `type: short description`, with a valid type and a first line shorter than 72 characters.
🔇 Additional comments (1)
tests/adapters/test_hermes_adapter.py (1)

17-17: LGTM!


Walkthrough

The PR consolidates Hermes SDK and CLI paths into one Hermes adapter, relocates shared helpers, updates package and adapter identifiers, removes the CLI adapter, and aligns configuration, documentation, examples, fixtures, and tests with the unified Hermes workflow.

Changes

Hermes adapter consolidation

Layer / File(s) Summary
Unified Hermes runtime and utilities
adapters/common/src/..., adapters/hermes/src/...
Shared request, model, URL, telemetry, and relay helpers are centralized, while Hermes configuration generation, validation, session execution, and response handling move into the Hermes adapter.
Package and dependency wiring
adapters/hermes/*, pyproject.toml, justfile, crates/fabric-core/src/config.rs
The unified package uses nemo-fabric-adapters-hermes, nvidia.fabric.hermes, and nemo_fabric_adapters.hermes.adapter; build, installation, and resolution paths are updated.
Documentation and examples
README.md, docs/*, examples/*, CONTRIBUTING.md
Hermes SDK/CLI terminology, commands, links, variant names, adapter IDs, and artifact paths are replaced with the Hermes workflow.
Test and fixture migration
tests/*
Tests and fixtures target the unified Hermes adapter, add common utility coverage, simplify adapter imports, and remove Hermes CLI-specific fixtures and suites.

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

Sequence Diagram(s)

sequenceDiagram
  participant Fabric
  participant HermesAdapter
  participant CommonUtils
  participant HermesRuntime
  Fabric->>HermesAdapter: run Hermes configuration
  HermesAdapter->>CommonUtils: resolve request and model settings
  HermesAdapter->>HermesRuntime: write config and execute Hermes
  HermesRuntime-->>Fabric: return result and native config summary
Loading

Possibly related PRs

  • NVIDIA/NeMo-Fabric#54: Refactors Hermes telemetry validation and relay enablement in the preceding shared Hermes utility path.

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Title check ❌ Error The title matches the change, but it exceeds the 72-character limit required by the Conventional Commits template. Shorten it to 72 characters or fewer, for example: chore: rename hermes_sdk adapter to hermes and remove hermes_cli.
Docstring Coverage ⚠️ Warning Docstring coverage is 17.65% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The description includes the required Overview, reviewer start, related issue, and confirmation checkboxes, so it is mostly complete.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

@dagardner-nv
dagardner-nv marked this pull request as ready for review July 14, 2026 00:00
@dagardner-nv
dagardner-nv requested a review from a team as a code owner July 14, 2026 00:00
@dagardner-nv dagardner-nv changed the title Remove the hermes_cli adapter, rename the hermes_sdk adapter to hermes chore: Remove the hermes_cli adapter, rename the hermes_sdk adapter to hermes Jul 14, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 9

Caution

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

⚠️ Outside diff range comments (1)
CONTRIBUTING.md (1)

26-30: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use “Hermes adapter” consistently in this installation step.

Line 26 still says “Hermes SDK adapter” while the command installs the unified adapters-hermes extra. Rename the prose to avoid directing contributors toward the removed adapter terminology.

Proposed fix
-Adapters are distributed as optional extras. For example, install the Hermes
-SDK adapter with:
+Adapters are distributed as optional extras. For example, install the Hermes
+adapter with:

As per path instructions, documentation changes must remain technically accurate against the current adapter naming.

🤖 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 `@CONTRIBUTING.md` around lines 26 - 30, Update the installation example prose
in CONTRIBUTING.md to call it the “Hermes adapter” instead of the removed
“Hermes SDK adapter” terminology, while leaving the existing adapters-hermes
installation command unchanged.

Source: Path instructions

🤖 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 `@adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py`:
- Around line 103-120: Remove the server["command"] fallback from
hermes_mcp_server_config and require the existing url field for target
resolution, since McpServerPlan only provides transport, url, and exposure.
Preserve transport handling and the existing validation for a missing target; do
not expand the schema.

In `@crates/fabric-core/src/config.rs`:
- Line 2028: Update the remaining embedded Hermes adapter identifier in the test
module configuration to use nvidia.fabric.hermes instead of
nvidia.fabric.hermes.sdk, matching the updated fixtures and descriptor contract.
Locate the stale value near the adapter_id configuration and preserve the
surrounding test setup.

In `@docs/getting-started/overview.mdx`:
- Line 120: Update the repository quick-start link in the documentation to use
the README heading’s valid GitHub anchor, quick-start-hermes-agent, while
preserving the existing link destination and label.

In `@examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml`:
- Around line 10-17: Restore the terminal_timeout setting to 120 under the
harness.settings configuration in hermes-relay.yaml. Preserve the existing
Hermes adapter behavior and ensure long-running terminal and MCP operations
retain the 120-second timeout instead of the 60-second default.

In `@examples/harbor/README.md`:
- Line 74: Update the adapter-selection instructions surrounding adapter_id so
they no longer reference the retired “Hermes CLI” and “Hermes SDK” names.
Describe the current unified Hermes adapter alongside the Codex CLI and
Relay-enabled variants, keeping the documented configuration technically
accurate.

In `@README.md`:
- Around line 50-53: Update the “Quick Start: Hermes Agent” setup instructions
to install the nemo-fabric-adapters-hermes package into the .tmp/hermes-venv
environment used by ADAPTER_PYTHON, or instead configure ADAPTER_PYTHON to
reference an environment where that adapter is already installed.

In `@tests/adapters/test_hermes_adapter.py`:
- Around line 318-364: Replace the hand-rolled FakeSessionDB and FakeAIAgent
classes with unittest.mock MagicMock/AsyncMock instances, using spec for the
corresponding production types. Configure get_session,
resolve_resume_session_id, get_messages_as_conversation, and run_conversation
through side_effects or return values while preserving captured-call behavior;
rename the test doubles to mock-prefixed variables and remove the bespoke
constructors and unused mirrored parameters.
- Around line 389-404: Replace the module-stub lambdas assigned to
hermes_config.load_config, hermes_plugins.discover_plugins, and
hermes_plugins.invoke_hook with named no-op callables or equivalent stubs that
avoid unused-argument warnings and satisfy Ruff PIE807/ARG005, while preserving
their current return and invocation behavior.

In `@tests/e2e/test_hermes_runtime.py`:
- Around line 60-69: Collapse the pass-through _run() and _run_sdk_runtime()
functions into a single _run_hermes_runtime() function, moving the existing
runtime setup and Fabric.start_runtime flow into it. Update the invocation to
use _run_hermes_runtime and remove the obsolete _sdk-named helper.

---

Outside diff comments:
In `@CONTRIBUTING.md`:
- Around line 26-30: Update the installation example prose in CONTRIBUTING.md to
call it the “Hermes adapter” instead of the removed “Hermes SDK adapter”
terminology, while leaving the existing adapters-hermes installation command
unchanged.
🪄 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: 1ad535d8-71d5-455d-881f-3071809c8148

📥 Commits

Reviewing files that changed from the base of the PR and between 703085c and 428bb67.

⛔ Files ignored due to path filters (3)
  • adapters/hermes-cli/uv.lock is excluded by !**/*.lock
  • adapters/hermes/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (57)
  • CONTRIBUTING.md
  • README.md
  • adapters/common/src/nemo_fabric_adapters/common/hermes.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/hermes-cli/README.md
  • adapters/hermes-cli/fabric-adapter.json
  • adapters/hermes-cli/pyproject.toml
  • adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/__init__.py
  • adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/adapter.py
  • adapters/hermes/LICENSE
  • adapters/hermes/README.md
  • adapters/hermes/fabric-adapter.json
  • adapters/hermes/pyproject.toml
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/doctor.rs
  • docs/getting-started/install.mdx
  • docs/getting-started/overview.mdx
  • docs/integrations/harbor.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/README.md
  • examples/code_review_agent/__init__.py
  • examples/code_review_agent/__main__.py
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/demo/README.md
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • examples/harbor/demo/task/environment/fabric/configs/hermes.yaml
  • justfile
  • pyproject.toml
  • tests/adapters/test_adapaters_common_utils.py
  • tests/adapters/test_codex_cli.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_hermes_adapter.py
  • tests/adapters/test_hermes_cli.py
  • tests/adapters/test_hermes_cli_preflight.py
  • tests/adapters/test_hermes_sdk_adapter.py
  • tests/conftest.py
  • tests/e2e/test_cli.py
  • tests/e2e/test_hermes_cli.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_hermes_e2e.py
  • tests/e2e/test_hermes_runtime.py
  • tests/fixtures/file-config-agent/agent.yaml
  • tests/fixtures/file-config-agent/profiles/hermes-cli.yaml
  • tests/fixtures/file-config-agent/profiles/hermes.yaml
  • tests/fixtures/hermes-cli-agent/agent.yaml
  • tests/fixtures/hermes-cli-agent/bin/fake-hermes.py
  • tests/fixtures/hermes-cli-agent/profiles/env-local.yaml
  • tests/fixtures/hermes-cli-agent/repos/my-service/README.md
  • tests/fixtures/hermes-cli-agent/skills/code-review/SKILL.md
  • tests/python/test_code_review_example.py
  • tests/python/test_harbor_integration.py
  • tests/python/test_native_sdk.py
  • tests/python/test_readme_examples.py
  • tests/python/test_sdk_runtimes.py
  • tests/python/test_typed_config.py
💤 Files with no reviewable changes (18)
  • tests/fixtures/hermes-cli-agent/skills/code-review/SKILL.md
  • tests/fixtures/hermes-cli-agent/profiles/env-local.yaml
  • tests/fixtures/hermes-cli-agent/repos/my-service/README.md
  • tests/fixtures/hermes-cli-agent/agent.yaml
  • adapters/hermes-cli/fabric-adapter.json
  • adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/init.py
  • tests/adapters/test_hermes_cli_preflight.py
  • tests/fixtures/hermes-cli-agent/bin/fake-hermes.py
  • tests/e2e/test_hermes_cli.py
  • adapters/hermes-cli/README.md
  • tests/adapters/test_hermes_cli.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_hermes_sdk_adapter.py
  • adapters/hermes-cli/src/nemo_fabric_adapters/hermes_cli/adapter.py
  • tests/fixtures/file-config-agent/profiles/hermes-cli.yaml
  • adapters/common/src/nemo_fabric_adapters/common/hermes.py
  • tests/conftest.py
  • adapters/hermes-cli/pyproject.toml
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: Test (x86_64)
🧰 Additional context used
📓 Path-based instructions (15)
**/*

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the appropriate SPDX copyright and Apache-2.0 license header.

Files:

  • adapters/hermes/LICENSE
  • docs/getting-started/install.mdx
  • adapters/hermes/README.md
  • adapters/hermes/pyproject.toml
  • tests/fixtures/file-config-agent/profiles/hermes.yaml
  • CONTRIBUTING.md
  • examples/harbor/demo/README.md
  • tests/python/test_readme_examples.py
  • crates/fabric-core/src/doctor.rs
  • examples/harbor/README.md
  • tests/python/test_native_sdk.py
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • docs/sdk/python.mdx
  • tests/python/test_sdk_runtimes.py
  • README.md
  • tests/fixtures/file-config-agent/agent.yaml
  • examples/code_review_agent/__init__.py
  • docs/getting-started/overview.mdx
  • examples/harbor/demo/task/environment/fabric/configs/hermes.yaml
  • examples/code_review_agent/__main__.py
  • tests/e2e/test_hermes_config_mapping.py
  • pyproject.toml
  • docs/integrations/harbor.mdx
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • adapters/hermes/fabric-adapter.json
  • examples/code_review_agent/config.py
  • justfile
  • tests/python/test_code_review_example.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • examples/code_review_agent/README.md
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.

Files:

  • adapters/hermes/LICENSE
  • adapters/hermes/README.md
  • adapters/hermes/pyproject.toml
  • examples/harbor/demo/README.md
  • examples/harbor/README.md
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • examples/code_review_agent/__init__.py
  • examples/harbor/demo/task/environment/fabric/configs/hermes.yaml
  • examples/code_review_agent/__main__.py
  • adapters/hermes/fabric-adapter.json
  • examples/code_review_agent/config.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • examples/code_review_agent/README.md
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update documentation when public behavior, adapters, examples, or workspace structure changes.

Files:

  • docs/getting-started/install.mdx
  • adapters/hermes/README.md
  • CONTRIBUTING.md
  • examples/harbor/demo/README.md
  • examples/harbor/README.md
  • docs/sdk/python.mdx
  • README.md
  • docs/getting-started/overview.mdx
  • docs/integrations/harbor.mdx
  • examples/code_review_agent/README.md
**/*.mdx

📄 CodeRabbit inference engine (CONTRIBUTING.md)

For documentation-site changes, run just docs to regenerate Python and Rust API references and validate Fern configuration.

Files:

  • docs/getting-started/install.mdx
  • docs/sdk/python.mdx
  • docs/getting-started/overview.mdx
  • docs/integrations/harbor.mdx
**/*.{rs,py,html,md,mdx,toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use the file-type-specific SPDX comment syntax and required copyright/license text for Rust, Python, HTML/Markdown, MDX, TOML/YAML, and shell files.

Files:

  • docs/getting-started/install.mdx
  • adapters/hermes/README.md
  • adapters/hermes/pyproject.toml
  • tests/fixtures/file-config-agent/profiles/hermes.yaml
  • CONTRIBUTING.md
  • examples/harbor/demo/README.md
  • tests/python/test_readme_examples.py
  • crates/fabric-core/src/doctor.rs
  • examples/harbor/README.md
  • tests/python/test_native_sdk.py
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • docs/sdk/python.mdx
  • tests/python/test_sdk_runtimes.py
  • README.md
  • tests/fixtures/file-config-agent/agent.yaml
  • examples/code_review_agent/__init__.py
  • docs/getting-started/overview.mdx
  • examples/harbor/demo/task/environment/fabric/configs/hermes.yaml
  • examples/code_review_agent/__main__.py
  • tests/e2e/test_hermes_config_mapping.py
  • pyproject.toml
  • docs/integrations/harbor.mdx
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • examples/code_review_agent/config.py
  • tests/python/test_code_review_example.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • examples/code_review_agent/README.md
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

Files:

  • docs/getting-started/install.mdx
  • docs/sdk/python.mdx
  • README.md
  • docs/getting-started/overview.mdx
  • docs/integrations/harbor.mdx
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update the relevant adapter or example README.md when that surface changes.

Files:

  • adapters/hermes/README.md
  • examples/harbor/demo/README.md
  • examples/harbor/README.md
  • README.md
  • examples/code_review_agent/README.md
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/fixtures/file-config-agent/profiles/hermes.yaml
  • tests/python/test_readme_examples.py
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_runtimes.py
  • tests/fixtures/file-config-agent/agent.yaml
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • tests/python/test_code_review_example.py
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to test functions; async tests are detected and run automatically.
Do not add -> None return type annotations to test functions.
When mocking a class, do not define a new class; use unittest.mock.MagicMock or unittest.mock.AsyncMock, adding spec when needed.
Name mocked classes with a mock prefix, not fake.
Prefer pytest fixtures over helper methods.
Do not duplicate fixtures across test files; if a fixture is needed in multiple test files, define it in conftest.py.
When creating a fixture, use @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and define the function as <fixture_name>_fixture() -> <return_type>; only pass scope when it is not function.
Prefer pytest.mark.parametrize over creating separate tests for different input types.
If a fixture is needed for a test but does not return a value, or its value is unused, use @pytest.mark.usefixtures.
When modifying environment variables in a test, use os.environ; tests/conftest.py provides an autouse restore_environ_fixture that restores environment variables after each test, so monkeypatch.setenv is unnecessary.

Files:

  • tests/python/test_readme_examples.py
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_runtimes.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • tests/python/test_code_review_example.py
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use snake_case for functions and variables; use PascalCase for Rust types and Python classes.
Keep native Python binding declarations synchronized with their Rust implementations.
Run tests for every language surface affected by a change; changes to the Rust core or public schemas require both Rust and Python test suites.
When adding functionality, include tests in the corresponding Rust crate or relevant area under tests/.

Files:

  • tests/python/test_readme_examples.py
  • crates/fabric-core/src/doctor.rs
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_runtimes.py
  • examples/code_review_agent/__init__.py
  • examples/code_review_agent/__main__.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • examples/code_review_agent/config.py
  • tests/python/test_code_review_example.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • tests/python/test_readme_examples.py
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_runtimes.py
  • examples/code_review_agent/__init__.py
  • examples/code_review_agent/__main__.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_cli.py
  • tests/adapters/test_adapaters_common_utils.py
  • examples/code_review_agent/config.py
  • tests/python/test_code_review_example.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/python/test_typed_config.py
  • tests/e2e/test_hermes_runtime.py
  • tests/python/test_harbor_integration.py
  • tests/adapters/test_hermes_adapter.py
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • tests/adapters/test_codex_cli.py
  • tests/e2e/test_hermes_e2e.py
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust code with cargo fmt --all and ensure cargo fmt --all -- --check passes.
Run cargo check --workspace --locked when changing the Rust core, CLI, or native Python extension.

Files:

  • crates/fabric-core/src/doctor.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/doctor.rs
  • crates/fabric-core/src/config.rs
README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Keep README.md current with the workspace, supported adapters, and top-level documentation.

Files:

  • README.md
**/*.{json,jsonschema}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Public contract changes must keep checked-in JSON Schema snapshots synchronized.

Files:

  • adapters/hermes/fabric-adapter.json
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: Versioned release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: All contributors must sign off commits using `git commit -s`; unsigned-off contributions are not accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: Before submitting a pull request, identify an issue, run relevant tests, verify builds, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: Pull requests require at least one approving review, passing CI, and a completed PR template.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: Address review feedback with additional commits and do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-13T23:57:26.252Z
Learning: Use commit messages formatted as `type: short description`, with one of the listed types, and keep the first line under 72 characters.
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.

Applied to files:

  • adapters/hermes/fabric-adapter.json
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.

Applied to files:

  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
🧬 Code graph analysis (8)
crates/fabric-core/src/doctor.rs (1)
crates/fabric-core/src/config.rs (1)
  • resolve_run_plan (1172-1175)
examples/code_review_agent/config.py (1)
crates/fabric-core/src/runtime.rs (1)
  • adapter_id (1129-1134)
tests/python/test_code_review_example.py (1)
crates/fabric-core/src/runtime.rs (1)
  • harness (1147-1152)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)
tests/e2e/test_hermes_config_mapping.py (1)
  • payload (46-77)
tests/adapters/test_hermes_adapter.py (1)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (3)
  • get_messages_as_conversation (169-169)
  • run_conversation (317-317)
  • get_session (166-166)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (2)
adapters/common/src/nemo_fabric_adapters/common/utils.py (7)
  • settings_payload (107-109)
  • environment_payload (103-104)
  • normalize_list (169-176)
  • telemetry_providers (149-153)
  • dump_yaml (183-189)
  • capability_plan (165-166)
  • relay_enabled (156-157)
tests/e2e/test_hermes_config_mapping.py (1)
  • payload (46-77)
crates/fabric-core/src/config.rs (1)
crates/fabric-core/src/runtime.rs (2)
  • adapter_id (1129-1134)
  • harness (1147-1152)
tests/e2e/test_hermes_e2e.py (1)
examples/code_review_agent/config.py (1)
  • with_relay (189-211)
🪛 Ruff (0.15.21)
tests/adapters/test_hermes_adapter.py

[warning] 334-334: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 337-337: Unused method argument: base_url

(ARG002)


[warning] 338-338: Unused method argument: api_key

(ARG002)


[warning] 341-341: Unused method argument: max_iterations

(ARG002)


[warning] 342-342: Unused method argument: enabled_toolsets

(ARG002)


[warning] 343-343: Unused method argument: quiet_mode

(ARG002)


[warning] 344-344: Unused method argument: skip_context_files

(ARG002)


[warning] 345-345: Unused method argument: skip_memory

(ARG002)


[warning] 346-346: Unused method argument: save_trajectories

(ARG002)


[warning] 347-347: Unused method argument: max_tokens

(ARG002)


[warning] 348-348: Unused method argument: temperature

(ARG002)


[warning] 349-349: Unused method argument: reasoning_config

(ARG002)


[warning] 350-350: Unused method argument: insert_reasoning

(ARG002)


[warning] 353-353: Dynamically typed expressions (typing.Any) are disallowed in session_db

(ANN401)


[warning] 391-391: Prefer dict over useless lambda

Replace with lambda with dict

(PIE807)


[warning] 393-393: Unused lambda argument: force

(ARG005)


[warning] 394-394: Unused lambda argument: args

(ARG005)


[warning] 394-394: Unused lambda argument: kwargs

(ARG005)

adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py

[warning] 29-29: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 110-110: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 205-205: Avoid specifying long messages outside the exception class

(TRY003)

🔇 Additional comments (43)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)

54-57: LGTM!

Also applies to: 115-142, 178-181, 247-247, 455-456

adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)

5-5: LGTM!

Also applies to: 26-30, 32-88, 90-100, 122-131, 141-144, 173-262, 265-335

adapters/hermes/LICENSE (1)

1-1: LGTM!

adapters/hermes/README.md (1)

6-8: LGTM!

adapters/hermes/fabric-adapter.json (1)

3-7: LGTM!

adapters/hermes/pyproject.toml (1)

11-13: LGTM!

Also applies to: 38-41

crates/fabric-core/src/config.rs (1)

2017-2017: LGTM!

Also applies to: 2093-2093, 2111-2111, 2139-2139, 2349-2361, 2392-2397, 2440-2450, 2721-2730, 2764-2773

justfile (1)

13-13: 🗄️ Data Integrity & Integration

Verify that excluding python is intentional.

build-python’s no_uv=true path and the wheels target iterate python_projects, but pyproject.toml maps nemo-fabric-runtime to the python project and the normal path explicitly installs the runtime extra. Unless build-rust handles that project separately, these paths may omit the runtime package. Add python back or confirm the separate build ownership.

pyproject.toml (1)

53-54: LGTM!

Also applies to: 75-75, 94-94, 129-129

docs/getting-started/install.mdx (1)

71-81: LGTM!

crates/fabric-core/src/doctor.rs (1)

532-549: LGTM!

tests/fixtures/file-config-agent/agent.yaml (1)

11-11: LGTM!

tests/fixtures/file-config-agent/profiles/hermes.yaml (1)

5-9: LGTM!

Also applies to: 26-31

CONTRIBUTING.md (1)

255-255: LGTM!

README.md (1)

111-111: LGTM!

Also applies to: 140-142, 174-174

docs/getting-started/overview.mdx (2)

13-13: 📐 Maintainability & Code Quality

Run the MDX documentation validation.

Run just docs to regenerate the Python and Rust API references and validate the Fern configuration.

As per coding guidelines, **/*.mdx changes require just docs to regenerate API references and validate Fern configuration.

Also applies to: 54-54, 100-105, 120-120

Source: Coding guidelines


13-13: LGTM!

Also applies to: 54-54, 100-105

docs/integrations/harbor.mdx (2)

12-12: LGTM!

Also applies to: 71-72


12-12: 📐 Maintainability & Code Quality

Run the MDX documentation validation.

Run just docs to regenerate the Python and Rust API references and validate the Fern configuration.

As per coding guidelines, **/*.mdx changes require just docs to regenerate API references and validate Fern configuration.

Also applies to: 71-72

Source: Coding guidelines

docs/sdk/python.mdx (2)

45-45: LGTM!

Also applies to: 195-196


45-45: 📐 Maintainability & Code Quality

Run the MDX documentation validation.

Run just docs to regenerate the Python and Rust API references and validate the Fern configuration.

As per coding guidelines, **/*.mdx changes require just docs to regenerate API references and validate Fern configuration.

Also applies to: 195-196

Source: Coding guidelines

examples/harbor/demo/task/environment/fabric/configs/hermes.yaml (1)

8-17: 🩺 Stability & Availability

Verify that removing terminal_timeout does not remove the only wall-clock guard.

max_iterations limits iterations, but it does not necessarily stop a hung model or API call. Confirm that the unified Hermes adapter or Harbor runtime enforces an equivalent timeout; otherwise this demo can remain running indefinitely.

As per path instructions, example configuration changes must preserve command correctness and compatibility with the public Fabric contracts.

Source: Path instructions

examples/code_review_agent/README.md (1)

23-25: LGTM!

Also applies to: 44-63, 72-74, 89-96

examples/code_review_agent/__init__.py (1)

8-12: LGTM!

Also applies to: 20-32

examples/code_review_agent/__main__.py (1)

19-27: LGTM!

Also applies to: 30-32

examples/code_review_agent/config.py (1)

36-36: LGTM!

Also applies to: 70-75, 92-97

examples/harbor/README.md (1)

194-194: LGTM!

examples/harbor/demo/README.md (1)

77-77: LGTM!

tests/adapters/test_adapaters_common_utils.py (1)

73-76: LGTM!

Also applies to: 78-91, 93-116, 118-152, 274-276

tests/adapters/test_codex_cli.py (1)

1-16: LGTM!

Also applies to: 142-685

tests/adapters/test_hermes_adapter.py (2)

4-19: LGTM!

Also applies to: 23-44, 85-85, 185-185, 222-222, 267-267, 281-285


304-451: Logic verified: run_hermes/_invoke_hermes wiring matches (session-id resolution, DB history load, hermes_home path). No functional issues found in the async coverage itself.

tests/e2e/test_cli.py (1)

37-37: LGTM!

Also applies to: 56-63, 64-66

tests/e2e/test_hermes_config_mapping.py (1)

10-16: LGTM!

tests/python/test_typed_config.py (1)

44-49: LGTM!

Also applies to: 104-106

tests/python/test_code_review_example.py (1)

16-16: LGTM!

Also applies to: 30-40, 49-49, 79-79, 88-90

tests/e2e/test_hermes_e2e.py (1)

9-31: LGTM!

Also applies to: 122-123, 197-198

tests/python/test_harbor_integration.py (2)

119-120: LGTM!

Also applies to: 222-222


17-18: 🩺 Stability & Availability

Keep nemo_fabric importable in plain pytest runs
tests/conftest.py only prepends the repo root, not python/src, and pyproject.toml here doesn’t show a pytest pythonpath or editable-install hook. If nemo_fabric still lives under python/src, this removal will break imports outside the current environment.

tests/python/test_native_sdk.py (1)

69-69: LGTM!

Also applies to: 81-81

tests/python/test_readme_examples.py (1)

10-10: LGTM!

Also applies to: 44-44

tests/python/test_sdk_runtimes.py (1)

25-28: LGTM!

Also applies to: 83-83

tests/e2e/test_hermes_runtime.py (1)

88-89: 📐 Maintainability & Code Quality

No leftover hermes_cli_config import remains.

			> Likely an incorrect or invalid review comment.

Comment thread adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
Comment thread crates/fabric-core/src/config.rs
Comment thread docs/getting-started/overview.mdx
Comment thread examples/harbor/README.md
Comment thread README.md
Comment thread tests/adapters/test_hermes_adapter.py Outdated
Comment thread tests/adapters/test_hermes_adapter.py
Comment thread tests/e2e/test_hermes_runtime.py
Comment thread examples/code_review_agent/README.md Outdated
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
examples/code_review_agent/README.md (1)

23-24: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the quick-start anchor.

The root heading is Quick Start: Hermes Agent, whose generated anchor is #quick-start-hermes-agent; #quick-start-hermes will not navigate to it.

🤖 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 `@examples/code_review_agent/README.md` around lines 23 - 24, Update the Hermes
quick-start link in the default variant instructions to use the generated anchor
for the root heading, `#quick-start-hermes-agent`, while preserving the existing
README reference and link text.

Source: Path instructions

🤖 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 `@tests/adapters/test_hermes_adapter.py`:
- Around line 310-334: Remove the monkeypatch.setattr block targeting
mock_ai_agent_type.__init__.__func__, as it mutates the shared MagicMock
initializer and is redundant for a specced AIAgent mock. Retain
mock_ai_agent_type = MagicMock(spec=AIAgent, return_value=mock_ai_agent) and
rely on the spec-based constructor signature matching for
assert_called_once_with.

---

Outside diff comments:
In `@examples/code_review_agent/README.md`:
- Around line 23-24: Update the Hermes quick-start link in the default variant
instructions to use the generated anchor for the root heading,
`#quick-start-hermes-agent`, while preserving the existing README reference and
link text.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 1e722b7e-76a6-483e-9633-f429179364a6

📥 Commits

Reviewing files that changed from the base of the PR and between 428bb67 and d394246.

📒 Files selected for processing (9)
  • CONTRIBUTING.md
  • README.md
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • examples/code_review_agent/README.md
  • examples/harbor/README.md
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • tests/adapters/test_hermes_adapter.py
  • tests/e2e/test_hermes_runtime.py
💤 Files with no reviewable changes (1)
  • tests/e2e/test_hermes_runtime.py
📜 Review details
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{rs,py,md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

If a change affects public behavior, adapters, examples, or workspace structure, update the corresponding documentation in the same branch.

Files:

  • CONTRIBUTING.md
  • examples/harbor/README.md
  • README.md
  • examples/code_review_agent/README.md
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_hermes_adapter.py
**/*.{rs,py,html,md,mdx,toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the appropriate SPDX copyright and Apache-2.0 license headers using the comment syntax required for their file type.

Files:

  • CONTRIBUTING.md
  • examples/harbor/README.md
  • README.md
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • examples/code_review_agent/README.md
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_hermes_adapter.py
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.

Files:

  • examples/harbor/README.md
  • examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml
  • examples/code_review_agent/README.md
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

Files:

  • README.md
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use language-appropriate naming: Rust and Python functions and variables use snake_case; Rust types and Python classes use PascalCase.
Run tests for every affected language surface; changes touching the Rust core or public schemas require both Rust and Python test suites.
Keep native Python binding declarations synchronized with their Rust implementations.

Files:

  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_hermes_adapter.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.

Files:

  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • tests/adapters/test_hermes_adapter.py
**/*.{rs,py,json}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

When adding functionality, include tests in the corresponding Rust crate or relevant tests/ area, and keep checked-in JSON Schema snapshots and native Python binding declarations synchronized for public contract changes.

Files:

  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-core/src/config.rs
  • tests/adapters/test_hermes_adapter.py
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Format Rust code with cargo fmt --all and ensure the format check passes with cargo fmt --all -- --check.
Run cargo check --workspace --locked to verify Rust workspace compilation.

Files:

  • crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/config.rs
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use pytest to run Python tests.
Do not add @pytest.mark.asyncio to test functions; async tests are detected and run automatically.
Do not add -> None return type annotations to test functions.
When mocking a class, do not define a new class; use unittest.mock.MagicMock or unittest.mock.AsyncMock, adding spec when needed.
Name mocked classes with a mock prefix, not fake.
Prefer pytest fixtures over helper methods.
Do not duplicate fixtures across test files; if a fixture is needed in multiple test files, define it in conftest.py.
When creating a fixture, use @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and define the function as <fixture_name>_fixture() -> <return_type>; only pass scope when it is not function.
Prefer pytest.mark.parametrize over creating separate tests for different input types.
If a fixture is needed for a test but does not return a value, or its value is unused, use @pytest.mark.usefixtures.
When modifying environment variables in a test, use os.environ; tests/conftest.py provides an autouse restore_environ_fixture that restores environment variables after each test, so monkeypatch.setenv is unnecessary.

Files:

  • tests/adapters/test_hermes_adapter.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/adapters/test_hermes_adapter.py
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T16:46:54.970Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T16:46:54.970Z
Learning: All contributors must sign off commits using Git commit sign-off; unsigned-off commits are not accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T16:46:54.970Z
Learning: Use commit messages in the format `type: short description`, with a valid type and a first line under 72 characters.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T16:46:54.970Z
Learning: Pull requests require at least one approving review, passing CI, and no force-pushing during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric

Timestamp: 2026-07-14T16:46:54.970Z
Learning: Release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.

Applied to files:

  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
🧬 Code graph analysis (1)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)
tests/adapters/test_hermes_adapter.py (1)
  • hermes_mcp_server_config (260-260)
🪛 Ruff (0.15.21)
adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py

[warning] 108-108: Avoid specifying long messages outside the exception class

(TRY003)

🔇 Additional comments (11)
crates/fabric-core/src/config.rs (1)

2017-2017: LGTM!

Also applies to: 2028-2028, 2093-2093, 2111-2111, 2139-2139, 2176-2176, 2349-2360, 2392-2397, 2440-2450, 2721-2773

examples/code_review_agent/README.md (1)

44-61: LGTM!

Also applies to: 72-72, 89-94

examples/harbor/README.md (1)

63-63: LGTM!

Also applies to: 74-74, 194-194

examples/harbor/demo/task/environment/fabric/configs/hermes-relay.yaml (1)

10-18: LGTM!

README.md (1)

50-53: LGTM!

Also applies to: 69-97, 118-118, 147-149, 181-181

CONTRIBUTING.md (2)

254-254: LGTM!


26-30: 🎯 Functional Correctness

CONTRIBUTING.md is already using the canonical Hermes extra. The mismatch is in README.md, which still refers to nemo-fabric[hermes] instead of nemo-fabric[adapters-hermes].

			> Likely an incorrect or invalid review comment.
tests/adapters/test_hermes_adapter.py (3)

335-350: Module-stub lambdas still trigger Ruff PIE807/ARG005.

Same low-value static-analysis nit already noted in prior review rounds on this pattern; not re-raising as a fresh issue given its previously assessed low value.


8-18: LGTM!

Also applies to: 50-120, 123-217, 243-274


387-417: LGTM!

adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py (1)

103-110: LGTM!

Comment thread tests/adapters/test_hermes_adapter.py
Signed-off-by: David Gardner <dagardner@nvidia.com>
@dagardner-nv

Copy link
Copy Markdown
Collaborator Author

/merge

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants