Skip to content

docs: add per-agent documentation variants#4632

Merged
miyoungc merged 17 commits into
mainfrom
docs/hermes
Jun 2, 2026
Merged

docs: add per-agent documentation variants#4632
miyoungc merged 17 commits into
mainfrom
docs/hermes

Conversation

@miyoungc
Copy link
Copy Markdown
Collaborator

@miyoungc miyoungc commented Jun 2, 2026

Summary

Adds per-agent documentation variants so OpenClaw and Hermes users can navigate agent-specific guides from the same NemoClaw docs site.
This PR introduces the variant navigation, shared variant-aware docs components, Hermes-focused content, and generated NemoHermes command reference needed to publish the new docs experience.

Related Issue

None.

Changes

  • Adds OpenClaw and Hermes documentation variants in the Fern navigation and landing page structure.
  • Introduces shared AgentGuide MDX helpers for agent-specific CLI names, content blocks, and links across reused pages.
  • Updates existing guide pages with OpenClaw and Hermes-specific copy for onboarding, inference, sandbox management, network policy, monitoring, security, and reference content.
  • Adds Hermes-specific pages and expands Hermes guidance, including ecosystem context, sandbox operations, inference switching, backup and restore, network policy examples, and plugin installation.
  • Adds a generated docs/reference/commands-nemohermes.mdx command reference plus scripts/sync-agent-variant-docs.ts and npm scripts to keep it synchronized.
  • Updates docs preview/link-validation support and tests so variant routes resolve through the Fern docs layout.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • npx prek run --all-files passes
  • npm test passes
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Additional verification:

  • npm run docs passes locally with 0 errors. Fern reports 1 warning but does not print it without fern check --warnings.
  • The automated E2E advisors report no required or optional E2E coverage for this documentation-focused PR.

Signed-off-by: Miyoung Choi miyoungc@nvidia.com

Summary by CodeRabbit

  • New Features

    • Complete dual user guides for OpenClaw and Hermes, plus a Hermes CLI reference and ecosystem guide.
  • Documentation

    • Site-wide refactor to present conditional, variant-specific content and parallel command examples.
    • Internal links normalized to relative paths; extensive redirects updated.
    • Command examples standardized to Bash-style fences.
  • Chores

    • Added docs sync/check tooling and updated CI to run docs checks for PR events.
  • Tests

    • Expanded link-check coverage and added variant-aware link tests.

@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented Jun 2, 2026

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

Review Change Stack

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Refactors docs into two guide variants (OpenClaw/Hermes), adds AgentGuide React helpers for variant routing, generates a Hermes CLI reference, updates navigation/redirects to a tabbed user-guide layout, normalizes links/code fences, and updates CI/tools/tests to validate variant-aware docs.

Changes

Docs + tooling comprehensive

Layer / File(s) Summary
Full change set (review in one pass)
docs/_components/AgentGuide.tsx, docs/index.yml, docs/index.mdx, docs/**.mdx, docs/reference/commands.mdx, docs/reference/commands-nemohermes.mdx, fern/docs.yml, scripts/sync-agent-variant-docs.ts, scripts/watch-fern-preview.ts, .github/workflows/docs-links-pr.yaml, test/e2e/e2e-cloud-experimental/check-docs.sh, test/check-docs-links.test.ts, package.json
Introduces AgentGuide helpers and AgentOnly variant rendering; refactors navigation into a user-guide tab with OpenClaw/Hermes variants; converts many MDX pages to variant-aware content and normalizes internal links and code-fence languages; adds scripts/sync-agent-variant-docs.ts to render Hermes CLI docs and invokes it from watch tooling; updates workflow and link-check scripts/tests to validate markdown-only diffs and variant routes; adds redirects and package.json scripts.

Estimated code review effort:
🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs:

  • NVIDIA/NemoClaw#4618: Overlaps with release-notes link/path and snippet formatting adjustments in v0.0.56 section.

Suggested labels:
Integration: Hermes

Suggested reviewers:

  • cv
  • ericksoa

Poem:

"A rabbit hops with docs in tow,
changing paths where pages go,
two guides now bloom—OpenClaw, Hermes, too,
Links fixed, scripts hum, generation true.
🐇✨"

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/hermes

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

E2E Advisor Recommendation

Required E2E: None
Optional E2E: docs-validation-e2e

Dispatch hint: docs-validation-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • None. No merge-blocking E2E is required. The changed files are documentation, docs CI/link-check tooling, docs preview/watch utilities, package docs scripts, and tests for those docs tools. They do not affect installer/onboarding behavior, sandbox lifecycle, credential handling, security boundaries, network policy enforcement, inference routing, deployment implementation, or real assistant runtime flows.

Optional E2E

  • docs-validation-e2e (low): Optional confidence check for the changed docs validation script and broad documentation/navigation updates. This existing nightly E2E job runs the docs validation wrapper with CLI/docs parity and local link validation, but it is not merge-blocking because the PR does not change runtime/user-flow code.

New E2E recommendations

  • docs-rendering (low): The PR introduces a docs-only AgentGuide component and Hermes/OpenClaw variant routing behavior. Existing docs-validation-e2e covers CLI parity and Markdown/MDX link extraction, while Docs / Fern Preview runs fern check/generate, but there is no dedicated E2E-style assertion that rendered variant pages show the expected OpenClaw or Hermes-specific content after Fern builds the site.
    • Suggested test: Add a docs preview/render validation that builds the Fern docs and checks representative /user-guide/openclaw and /user-guide/hermes pages for variant-specific CLI names, links, and conditional AgentOnly content.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: docs-validation-e2e

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

E2E Scenario Advisor Recommendation

Required scenario E2E: None
Optional scenario E2E: None

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • None. No scenario E2E is recommended because the PR changes documentation, docs tooling/workflows, docs tests, and a legacy non-scenario E2E docs checker only; it does not modify test/e2e-scenario/, e2e-scenarios workflows, scenario metadata, expected-state contracts, suite metadata, suite scripts, or scenario runtime code.

Optional scenario E2E

  • None.

Relevant changed files

  • None.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

PR Review Advisor

Findings: 1 needs attention, 2 worth checking, 0 nice ideas
Since last review: 1 prior item resolved, 0 still apply, 2 new items found

Review findings

🛠️ Needs attention

  • Agent variant helpers default Hermes pages to OpenClaw during SSR/unwrapped rendering (docs/_components/AgentGuide.tsx:34): The core acceptance goal is per-agent documentation variants, but `getGuideVariant()` falls back to `openclaw` when no explicit variant/pathname is supplied and `window` is unavailable. The changed MDX pages use `<AgentCli />` and `<AgentOnly variant="hermes">` without passing `activeVariant` or `pathname`, so static/server rendering of the Hermes variant can emit OpenClaw CLI names and suppress Hermes-only blocks until client-side route detection, if hydration corrects it at all.
    • Recommendation: Make the active variant an explicit input from the Fern/page context or wrapper for reused pages, or split variant-specific content so SSR does not depend on `window`. Add focused tests for `AgentOnly`, `AgentCli`, and `guidePath` rendering for both `/user-guide/openclaw/...` and `/user-guide/hermes/...`, including the no-`window` case.
    • Evidence: `getGuideVariant()` returns `resolveGuideVariant(source) ?? resolveGuideVariant(readWindowPathname()) ?? "openclaw"`; observed MDX usage includes `<AgentCli />` in `docs/about/overview.mdx` and `docs/about/how-it-works.mdx`, and many `<AgentOnly variant="hermes">` blocks without active route props.

🔎 Worth checking

  • Source-of-truth review needed: docs/_components/AgentGuide.tsx variant fallback: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: `getGuideVariant(source)` falls back to `readWindowPathname()` and then `"openclaw"`; the component comment says the window fallback preserves current client-side behavior for unwrapped pages.
  • MDX-only PRs no longer run the raw local link checker (.github/workflows/docs-links-pr.yaml:32): The workflow now triggers and scans only `*.md` files, while this PR adds variant-route support tests to `check-docs.sh` for Markdown/MDX links. That means MDX-only changes no longer get this raw local-link/external-link validation in the PR workflow and rely on Fern validation instead.
    • Recommendation: Either keep `*.mdx` in the link-check workflow for local-only route/file checks, or document why Fern validation is the sole source of truth and ensure equivalent MDX link coverage is required for all PR contexts where these docs can change.
    • Evidence: The workflow path list contains `"**/*.md"` but no `"**/*.mdx"`, and the changed-file command passes only `'*.md'` to `git diff`; `test/check-docs-links.test.ts` still adds MDX route-resolution coverage for `check-docs.sh`.

🌱 Nice ideas

  • None.
Since last review details

Current findings:

  • Source-of-truth review needed: docs/_components/AgentGuide.tsx variant fallback: The advisor marked localized patch analysis as missing.
    • Recommendation: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
    • Evidence: `getGuideVariant(source)` falls back to `readWindowPathname()` and then `"openclaw"`; the component comment says the window fallback preserves current client-side behavior for unwrapped pages.
  • Agent variant helpers default Hermes pages to OpenClaw during SSR/unwrapped rendering (docs/_components/AgentGuide.tsx:34): The core acceptance goal is per-agent documentation variants, but `getGuideVariant()` falls back to `openclaw` when no explicit variant/pathname is supplied and `window` is unavailable. The changed MDX pages use `<AgentCli />` and `<AgentOnly variant="hermes">` without passing `activeVariant` or `pathname`, so static/server rendering of the Hermes variant can emit OpenClaw CLI names and suppress Hermes-only blocks until client-side route detection, if hydration corrects it at all.
    • Recommendation: Make the active variant an explicit input from the Fern/page context or wrapper for reused pages, or split variant-specific content so SSR does not depend on `window`. Add focused tests for `AgentOnly`, `AgentCli`, and `guidePath` rendering for both `/user-guide/openclaw/...` and `/user-guide/hermes/...`, including the no-`window` case.
    • Evidence: `getGuideVariant()` returns `resolveGuideVariant(source) ?? resolveGuideVariant(readWindowPathname()) ?? "openclaw"`; observed MDX usage includes `<AgentCli />` in `docs/about/overview.mdx` and `docs/about/how-it-works.mdx`, and many `<AgentOnly variant="hermes">` blocks without active route props.
  • MDX-only PRs no longer run the raw local link checker (.github/workflows/docs-links-pr.yaml:32): The workflow now triggers and scans only `*.md` files, while this PR adds variant-route support tests to `check-docs.sh` for Markdown/MDX links. That means MDX-only changes no longer get this raw local-link/external-link validation in the PR workflow and rely on Fern validation instead.
    • Recommendation: Either keep `*.mdx` in the link-check workflow for local-only route/file checks, or document why Fern validation is the sole source of truth and ensure equivalent MDX link coverage is required for all PR contexts where these docs can change.
    • Evidence: The workflow path list contains `"**/*.md"` but no `"**/*.mdx"`, and the changed-file command passes only `'*.md'` to `git diff`; `test/check-docs-links.test.ts` still adds MDX route-resolution coverage for `check-docs.sh`.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

@miyoungc miyoungc changed the title docs: add tab variants per agent docs: add per-agent documentation variants Jun 2, 2026
@miyoungc miyoungc marked this pull request as ready for review June 2, 2026 05:09
@miyoungc miyoungc requested a review from cv June 2, 2026 05:09
@miyoungc miyoungc added the documentation Docs, examples, guides, or messaging need work label Jun 2, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

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

⚠️ Outside diff range comments (1)
docs/about/ecosystem-hermes.mdx (1)

97-103: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use the standard Next Steps section at the bottom.

For new pages, the closing related-links section should be ## Next Steps, not ## Related topics.

As per coding guidelines, A "Next Steps" section at the bottom links to related pages.

🤖 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/about/ecosystem-hermes.mdx` around lines 97 - 103, Change the closing
related-links section header from "## Related topics" to the standard "## Next
Steps" in this page; update the header text that currently reads "## Related
topics" (and leave the existing bullet links such as Overview, How It Works,
Architecture, Quickstart with Hermes intact) so the page uses the required "Next
Steps" section naming convention for new pages.
🧹 Nitpick comments (7)
scripts/sync-agent-variant-docs.ts (1)

110-112: 💤 Low value

Consider narrowing the type guard.

The isNodeError function only checks instanceof Error but doesn't verify the code property exists. This works because TypeScript's type predicate allows the optional code property, but a more precise check would validate the property:

 function isNodeError(error: unknown): error is NodeJS.ErrnoException {
-  return error instanceof Error;
+  return error instanceof Error && 'code' in error;
 }

This change would make the type guard more semantically accurate.

🤖 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 `@scripts/sync-agent-variant-docs.ts` around lines 110 - 112, The isNodeError
type guard currently only checks instanceof Error; update it to also verify the
presence (and optionally type) of the NodeJS-specific "code" property so the
predicate truly narrows to NodeJS.ErrnoException — e.g., in the isNodeError
function check that error is an instance of Error and that (error as any).code
!== undefined (or typeof (error as any).code === "string") before returning
true, ensuring the type guard more precisely identifies NodeJS.ErrnoException.
docs/about/how-it-works.mdx (1)

125-125: ⚡ Quick win

Keep one sentence per source line here.

This line has two sentences. Split them so each sentence sits on its own line, which keeps doc diffs readable.

As per coding guidelines, "One sentence per line in source (makes diffs readable)."

🤖 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/about/how-it-works.mdx` at line 125, The line containing "For details on
the baseline rules, refer to [Network Policies](../reference/network-policies).
For container-level hardening, refer to [Sandbox
Hardening](../deployment/sandbox-hardening)." has two sentences on one source
line; split them so each sentence is on its own source line (i.e., break after
"...network-policies)." so the first line is the Network Policies sentence and
the second line is the Sandbox Hardening sentence) to follow the
one-sentence-per-line guideline.
docs/security/best-practices.mdx (1)

153-153: ⚡ Quick win

Split this into one sentence per line.

This line has multiple sentences. Keep each sentence on its own source line to match the docs style guide.

As per coding guidelines, "One sentence per line in source (makes diffs readable)."

🤖 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/security/best-practices.mdx` at line 153, Split the long documentation
line into separate source lines so each sentence is on its own line: take the
sentence "The system merges approved endpoints into the sandbox's policy as a
new durable revision." and place it on its own line, then put "They persist
across sandbox restarts within the same sandbox instance." on the next line, and
finally "However, when you destroy and recreate the sandbox through onboarding,
the policy resets to the baseline defined in the blueprint." on its own line so
the prose in this paragraph (the sentence containing "merges approved
endpoints...") follows the one-sentence-per-line style.
docs/_components/AgentGuide.tsx (1)

59-68: ⚡ Quick win

Avoid prefixing non-guide hrefs through guidePath().

Anything that is not http:// or https:// currently gets rewritten, so #anchors, mailto:, tel:, and already-resolved site paths become invalid guide URLs. Guard those forms before variant rewriting.

🤖 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/_components/AgentGuide.tsx` around lines 59 - 68, The GuideLink
component rewrites any non-http(s) href via guidePath, breaking anchors,
mailto/tel, protocol-relative and absolute paths; update the resolved logic in
GuideLink to only call guidePath for true relative guide paths and leave href
untouched when it starts with "http://"/"https://", "/" (absolute site path),
"#" (anchor), "mailto:", "tel:", "//" (protocol-relative), or any other URL
scheme (e.g. matches /^[a-zA-Z][\w+.-]*:/); reference the GuideLink function and
guidePath when making this conditional change.
docs/manage-sandboxes/install-plugins-hermes.mdx (3)

97-97: 💤 Low value

Use active voice.

"the same Dockerfile path that started the session" should be "the same Dockerfile path you used to start the session".

As per coding guidelines: Active voice required in documentation.

🤖 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/manage-sandboxes/install-plugins-hermes.mdx` at line 97, Change the
passive phrasing in the sentence "If you resume an interrupted onboarding run,
use the same Dockerfile path that started the session." to active voice by
replacing "that started the session" with "you used to start the session" so it
reads: "If you resume an interrupted onboarding run, use the same Dockerfile
path you used to start the session."

57-57: 💤 Low value

Use active voice.

"after the Dockerfile has created" should be "after the Dockerfile creates" or "after creating".

As per coding guidelines: Active voice required in documentation.

🤖 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/manage-sandboxes/install-plugins-hermes.mdx` at line 57, Replace the
passive phrasing in the sentence "Add your plugin after the Dockerfile has
created `/sandbox/.hermes`." with active voice; update it to either "Add your
plugin after the Dockerfile creates `/sandbox/.hermes`." or "Add your plugin
after creating `/sandbox/.hermes`." so the documentation follows the
active-voice guideline.

113-113: 💤 Low value

Use active voice.

"where Hermes plugin installation gets mixed up" should be "where developers commonly mix up Hermes plugin installation" or similar active construction.

As per coding guidelines: Active voice required in documentation.

🤖 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/manage-sandboxes/install-plugins-hermes.mdx` at line 113, Replace the
passive construction in the sentence "These are the most common places where
Hermes plugin installation gets mixed up with other NemoClaw extension paths."
with an active voice variant; for example, change it to "These are the places
where developers commonly mix up Hermes plugin installation with other NemoClaw
extension paths." Ensure the sentence still clearly identifies the common
confusion points for Hermes vs. NemoClaw paths.
🤖 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 `@docs/_components/AgentGuide.tsx`:
- Around line 1-4: Replace the existing block SPDX header with the required
line-comment form at the top of the TSX file: remove the /** ... */ block and
add two single-line comments using // for the SPDX lines so the file
(AgentGuide.tsx) begins with "// SPDX-FileCopyrightText: Copyright (c) 2026
NVIDIA CORPORATION & AFFILIATES. All rights reserved." and "//
SPDX-License-Identifier: Apache-2.0".
- Around line 17-56: getGuideVariant, guideBasePath, guidePath and the
components AgentCli, AgentProductName, and AgentOnly currently read
window.location which makes SSR output non-deterministic; change the API so the
active variant (or pathname) is provided from the Fern route/page at render time
instead of reading window: update getGuideVariant to accept an optional variant
or pathname argument (or create a small React context/provider) and have
guidePath and guideBasePath accept the same injected value; update AgentCli,
AgentProductName and AgentOnly to take a prop (e.g., variant or pathname) or
read from the new context and use that value during render so SSR has a
deterministic variant and client-side can still fallback to window when no
prop/context is provided.

In `@docs/about/ecosystem-hermes.mdx`:
- Line 17: This file is missing the required H1 before the first H2; add a
top-level H1 that exactly matches the page title in the frontmatter (the
title.page value) and place it above the existing "## How the Stack Fits
Together" heading so the document begins with a single `# <Title>` heading that
mirrors the frontmatter.
- Around line 1-11: The new MDX frontmatter is missing required fields; update
the frontmatter block to include the missing keys: topics, tags, difficulty,
audience, and status alongside the existing title, description, keywords, and
content.type entries (keep descriptions consistent with description-agent if
needed); ensure topics is an array of relevant topic slugs, tags is an array of
string tags, difficulty is one of the allowed values (e.g.,
beginner/intermediate/advanced), audience lists intended reader roles, and
status uses the repository's allowed statuses (e.g., draft/published).

In `@docs/about/ecosystem.mdx`:
- Line 18: Rewrite the passive sentence "There are three pieces that are put
together in a NemoClaw for OpenClaw deployment: OpenClaw, OpenShell, and
NemoClaw, each with a distinct scope." into active voice: explicitly name the
actors and state that OpenClaw, OpenShell, and NemoClaw form the deployment and
each has a distinct scope (e.g., "OpenClaw, OpenShell, and NemoClaw form a
NemoClaw for OpenClaw deployment; each has a distinct scope."). Update the
sentence in docs/about/ecosystem.mdx where that exact string appears.

In `@docs/manage-sandboxes/backup-restore.mdx`:
- Around line 46-47: Replace the colon in the sentence starting "Treat snapshot
directories as private local data: the Hermes database..." with a period or an
em dash so the two independent clauses are correctly separated (e.g., "Treat
snapshot directories as private local data. The Hermes database..." or "Treat
snapshot directories as private local data — the Hermes database..."); update
that sentence in docs/manage-sandboxes/backup-restore.mdx accordingly.

In `@docs/manage-sandboxes/lifecycle.mdx`:
- Around line 40-42: Replace the fenced code blocks that currently use "console"
and include "$" prompt markers with language-specific shells (e.g., change the
fence language to bash or sh) and remove the leading "$" so the commands are
copy-pasteable; update every occurrence of the snippet like `console` blocks
containing "$ nemohermes list" (and the other listed blocks at the specified
locations) to use `bash` or `sh` fences and plain commands without prompt
markers to satisfy the copyable CLI code block guideline.

In `@docs/manage-sandboxes/runtime-controls.mdx`:
- Line 90: The "See also" link target in
docs/manage-sandboxes/runtime-controls.mdx points to a non-existent page
../security/openclaw-controls-hermes; update the link target to the actual page
../security/openclaw-controls (or ../security/openclaw-controls.mdx) so the
cross-reference resolves. Edit the line containing the link text "OpenClaw
Controls" and replace the href ../security/openclaw-controls-hermes with
../security/openclaw-controls to match the existing
docs/security/openclaw-controls.mdx filename.

In `@docs/reference/architecture.mdx`:
- Line 16: The line containing the sentence that starts with "NVIDIA OpenShell
is a general-purpose agent runtime." currently has three sentences on one line;
split it into three separate lines so each sentence is on its own line (one for
"NVIDIA OpenShell is a general-purpose agent runtime.", one for the sentence
about what it provides, and one for "NemoClaw is an opinionated reference stack
built on OpenShell...") to follow the one-sentence-per-line guideline and
improve diff readability.

In `@docs/reference/commands-nemohermes.mdx`:
- Around line 25-28: Replace the copyable CLI blocks that currently use
```console with dollar-prompts (e.g., lines showing "$ nemohermes onboard" and
"$ nemohermes my-sandbox connect") with shell fences (```bash or ```sh) and
remove the leading "$" prompt markers so the snippets are directly copyable;
update the source template/renderer that generates these snippets (the template
producing the commands like "nemohermes onboard" / "nemohermes my-sandbox
connect") to emit bash/sh fenced blocks without prompt markers rather than
`console` so future generated docs follow the copyable CLI guideline.
- Around line 14-34: The docs incorrectly replaced canonical "nemoclaw"
references with the Hermes alias "nemohermes" and introduced a nonexistent
"/nemohermes" slash command; revert those replacements so the text and examples
reference "nemoclaw" as the canonical CLI and explain "nemohermes" as an alias
(e.g., change lines that read "nemohermes is the primary interface" and the
examples "nemohermes onboard ≡ nemohermes onboard --agent hermes" back to
describe "nemohermes" relative to "nemoclaw"—for instance: explain "nemohermes"
is equivalent to running "nemoclaw ... --agent hermes" or setting
NEMOCLAW_AGENT=hermes), and remove the incorrect claim about an in-sandbox
"/nemohermes" slash command while keeping the Hermes-specific plugin/tool names
(nemohermes_status, nemohermes_info, nemohermes_reload_skills, on_session_start)
intact.

---

Outside diff comments:
In `@docs/about/ecosystem-hermes.mdx`:
- Around line 97-103: Change the closing related-links section header from "##
Related topics" to the standard "## Next Steps" in this page; update the header
text that currently reads "## Related topics" (and leave the existing bullet
links such as Overview, How It Works, Architecture, Quickstart with Hermes
intact) so the page uses the required "Next Steps" section naming convention for
new pages.

---

Nitpick comments:
In `@docs/_components/AgentGuide.tsx`:
- Around line 59-68: The GuideLink component rewrites any non-http(s) href via
guidePath, breaking anchors, mailto/tel, protocol-relative and absolute paths;
update the resolved logic in GuideLink to only call guidePath for true relative
guide paths and leave href untouched when it starts with "http://"/"https://",
"/" (absolute site path), "#" (anchor), "mailto:", "tel:", "//"
(protocol-relative), or any other URL scheme (e.g. matches
/^[a-zA-Z][\w+.-]*:/); reference the GuideLink function and guidePath when
making this conditional change.

In `@docs/about/how-it-works.mdx`:
- Line 125: The line containing "For details on the baseline rules, refer to
[Network Policies](../reference/network-policies). For container-level
hardening, refer to [Sandbox Hardening](../deployment/sandbox-hardening)." has
two sentences on one source line; split them so each sentence is on its own
source line (i.e., break after "...network-policies)." so the first line is the
Network Policies sentence and the second line is the Sandbox Hardening sentence)
to follow the one-sentence-per-line guideline.

In `@docs/manage-sandboxes/install-plugins-hermes.mdx`:
- Line 97: Change the passive phrasing in the sentence "If you resume an
interrupted onboarding run, use the same Dockerfile path that started the
session." to active voice by replacing "that started the session" with "you used
to start the session" so it reads: "If you resume an interrupted onboarding run,
use the same Dockerfile path you used to start the session."
- Line 57: Replace the passive phrasing in the sentence "Add your plugin after
the Dockerfile has created `/sandbox/.hermes`." with active voice; update it to
either "Add your plugin after the Dockerfile creates `/sandbox/.hermes`." or
"Add your plugin after creating `/sandbox/.hermes`." so the documentation
follows the active-voice guideline.
- Line 113: Replace the passive construction in the sentence "These are the most
common places where Hermes plugin installation gets mixed up with other NemoClaw
extension paths." with an active voice variant; for example, change it to "These
are the places where developers commonly mix up Hermes plugin installation with
other NemoClaw extension paths." Ensure the sentence still clearly identifies
the common confusion points for Hermes vs. NemoClaw paths.

In `@docs/security/best-practices.mdx`:
- Line 153: Split the long documentation line into separate source lines so each
sentence is on its own line: take the sentence "The system merges approved
endpoints into the sandbox's policy as a new durable revision." and place it on
its own line, then put "They persist across sandbox restarts within the same
sandbox instance." on the next line, and finally "However, when you destroy and
recreate the sandbox through onboarding, the policy resets to the baseline
defined in the blueprint." on its own line so the prose in this paragraph (the
sentence containing "merges approved endpoints...") follows the
one-sentence-per-line style.

In `@scripts/sync-agent-variant-docs.ts`:
- Around line 110-112: The isNodeError type guard currently only checks
instanceof Error; update it to also verify the presence (and optionally type) of
the NodeJS-specific "code" property so the predicate truly narrows to
NodeJS.ErrnoException — e.g., in the isNodeError function check that error is an
instance of Error and that (error as any).code !== undefined (or typeof (error
as any).code === "string") before returning true, ensuring the type guard more
precisely identifies NodeJS.ErrnoException.
🪄 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: CHILL

Plan: Enterprise

Run ID: acf9e120-a20e-408f-b6bb-5e3d744476e8

📥 Commits

Reviewing files that changed from the base of the PR and between ef1d4af and 081c3e4.

📒 Files selected for processing (43)
  • .github/workflows/docs-links-pr.yaml
  • docs/_components/AgentGuide.tsx
  • docs/about/ecosystem-hermes.mdx
  • docs/about/ecosystem.mdx
  • docs/about/how-it-works.mdx
  • docs/about/overview.mdx
  • docs/about/release-notes.mdx
  • docs/get-started/prerequisites.mdx
  • docs/get-started/quickstart-hermes.mdx
  • docs/get-started/quickstart.mdx
  • docs/get-started/windows-preparation.mdx
  • docs/index.mdx
  • docs/index.yml
  • docs/inference/inference-options.mdx
  • docs/inference/set-up-sub-agent.mdx
  • docs/inference/switch-inference-providers.mdx
  • docs/inference/tool-calling-reliability.mdx
  • docs/inference/use-local-inference.mdx
  • docs/manage-sandboxes/backup-restore.mdx
  • docs/manage-sandboxes/install-plugins-hermes.mdx
  • docs/manage-sandboxes/lifecycle.mdx
  • docs/manage-sandboxes/messaging-channels.mdx
  • docs/manage-sandboxes/runtime-controls.mdx
  • docs/manage-sandboxes/workspace-files.mdx
  • docs/monitoring/monitor-sandbox-activity.mdx
  • docs/network-policy/approve-network-requests.mdx
  • docs/network-policy/customize-network-policy.mdx
  • docs/network-policy/integration-policy-examples.mdx
  • docs/reference/architecture.mdx
  • docs/reference/cli-selection-guide.mdx
  • docs/reference/commands-nemohermes.mdx
  • docs/reference/commands.mdx
  • docs/reference/network-policies.mdx
  • docs/reference/troubleshooting.mdx
  • docs/security/best-practices.mdx
  • docs/security/credential-storage.mdx
  • docs/security/openclaw-controls.mdx
  • fern/docs.yml
  • package.json
  • scripts/sync-agent-variant-docs.ts
  • scripts/watch-fern-preview.ts
  • test/check-docs-links.test.ts
  • test/e2e/e2e-cloud-experimental/check-docs.sh

Comment thread docs/_components/AgentGuide.tsx
Comment thread docs/_components/AgentGuide.tsx Outdated
Comment thread docs/about/ecosystem-hermes.mdx
Comment thread docs/about/ecosystem-hermes.mdx
Comment thread docs/about/ecosystem.mdx
Comment thread docs/manage-sandboxes/lifecycle.mdx Outdated
Comment thread docs/manage-sandboxes/runtime-controls.mdx Outdated
Comment thread docs/reference/architecture.mdx
Comment thread docs/reference/commands-nemohermes.mdx Outdated
Comment thread docs/reference/commands-nemohermes.mdx Outdated
@cv
Copy link
Copy Markdown
Collaborator

cv commented Jun 2, 2026

@miyoungc worth noting the findings in #4632 (comment)

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (2)
docs/manage-sandboxes/messaging-channels.mdx (2)

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

Replace colon with appropriate punctuation.

The colon here connects two clauses but does not introduce a list.

As per coding guidelines: "Colons should only introduce a list. Flag colons used as general punctuation between clauses."

Proposed fix
-For Telegram group chats, disable privacy mode before testing group replies: in `@BotFather`, run `/setprivacy`, choose the bot, then choose **Disable**.
+For Telegram group chats, disable privacy mode before testing group replies.
+In `@BotFather`, run `/setprivacy`, choose the bot, then choose **Disable**.
🤖 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/manage-sandboxes/messaging-channels.mdx` at line 89, The sentence "For
Telegram group chats, disable privacy mode before testing group replies: in
`@BotFather`, run `/setprivacy`, choose the bot, then choose **Disable**." uses a
colon incorrectly; replace the colon with a comma or an em dash (or a period and
capitalize "In") so the punctuation correctly connects the clauses—update the
sentence that begins "For Telegram group chats, disable privacy mode before
testing group replies" accordingly to use the chosen punctuation and adjust the
following "in `@BotFather`" capitalization if you replace the colon with a period.

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

Split sentences onto separate lines.

The parenthetical sentence should appear on its own line per the one-sentence-per-line formatting rule.

As per coding guidelines: "One sentence per line in source (makes diffs readable). Flag paragraphs where multiple sentences appear on the same line."

Proposed fix

Line 39:

-It only starts optional host services such as the cloudflared tunnel when that binary is present. (`nemoclaw start` is kept as a deprecated alias.)
+It only starts optional host services such as the cloudflared tunnel when that binary is present.
+(`nemoclaw start` is kept as a deprecated alias.)

Line 42:

-It only starts optional host services such as the cloudflared tunnel when that binary is present. (`nemoclaw start` is kept as a deprecated alias.)
+It only starts optional host services such as the cloudflared tunnel when that binary is present.

Also applies to: 42-42

🤖 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/manage-sandboxes/messaging-channels.mdx` at line 39, The sentence "It
only starts optional host services such as the cloudflared tunnel when that
binary is present. (`nemoclaw start` is kept as a deprecated alias.)" contains
two sentences on one line; split them so each sentence is on its own line by
moving the parenthetical "(`nemoclaw start` is kept as a deprecated alias.)" to
a new line immediately after the first sentence, preserving punctuation and
whitespace.
🧹 Nitpick comments (2)
docs/manage-sandboxes/messaging-channels.mdx (2)

145-145: ⚡ Quick win

Rewrite in active voice.

The passive construction "are generated and stored" should identify the actor and use active voice.

As per coding guidelines: "Active voice required. Flag passive constructions."

Proposed fix
-Session credentials are generated and stored inside durable agent state (`whatsapp` for OpenClaw, `platforms/whatsapp` for Hermes), so they survive rebuilds without re-pairing.
+The agent generates and stores session credentials inside durable agent state (`whatsapp` for OpenClaw, `platforms/whatsapp` for Hermes), so they survive rebuilds without re-pairing.
🤖 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/manage-sandboxes/messaging-channels.mdx` at line 145, Rewrite the
sentence in active voice and name the actor that performs the action: change
"Session credentials are generated and stored inside durable agent state
(`whatsapp` for OpenClaw, `platforms/whatsapp` for Hermes), so they survive
rebuilds without re-pairing." to an active construction that states who does the
work (e.g., "The agent generates and stores session credentials in durable agent
state (`whatsapp` for OpenClaw, `platforms/whatsapp` for Hermes) so they survive
rebuilds without re-pairing."), ensuring you keep the same identifiers
`whatsapp`, `platforms/whatsapp`, OpenClaw, and Hermes.

123-123: ⚡ Quick win

Rewrite in active voice.

The passive construction "is baked into" should identify the actor and use active voice.

As per coding guidelines: "Active voice required. Flag passive constructions."

Proposed fix
-The non-secret per-account metadata (`WECHAT_ACCOUNT_ID`, `WECHAT_BASE_URL`, `WECHAT_USER_ID`) is baked into the sandbox image so the in-sandbox bridge can pre-seed the per-account context tokens without re-running the QR handshake.
+NemoClaw bakes the non-secret per-account metadata (`WECHAT_ACCOUNT_ID`, `WECHAT_BASE_URL`, `WECHAT_USER_ID`) into the sandbox image so the in-sandbox bridge can pre-seed the per-account context tokens without re-running the QR handshake.
🤖 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/manage-sandboxes/messaging-channels.mdx` at line 123, Rewrite the
passive sentence to active voice by naming the actor that performs the baking;
for example: state that the sandbox image build (or the build process) bakes the
non-secret per-account metadata (WECHAT_ACCOUNT_ID, WECHAT_BASE_URL,
WECHAT_USER_ID) into the sandbox image so the in-sandbox bridge can pre-seed the
per-account context tokens without re-running the QR handshake. Replace the
passive phrase "is baked into the sandbox image" with an active construction
like "the sandbox image build bakes" or "the build process bakes" and keep
references to the in-sandbox bridge and context tokens unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/manage-sandboxes/messaging-channels.mdx`:
- Line 89: The sentence "For Telegram group chats, disable privacy mode before
testing group replies: in `@BotFather`, run `/setprivacy`, choose the bot, then
choose **Disable**." uses a colon incorrectly; replace the colon with a comma or
an em dash (or a period and capitalize "In") so the punctuation correctly
connects the clauses—update the sentence that begins "For Telegram group chats,
disable privacy mode before testing group replies" accordingly to use the chosen
punctuation and adjust the following "in `@BotFather`" capitalization if you
replace the colon with a period.
- Line 39: The sentence "It only starts optional host services such as the
cloudflared tunnel when that binary is present. (`nemoclaw start` is kept as a
deprecated alias.)" contains two sentences on one line; split them so each
sentence is on its own line by moving the parenthetical "(`nemoclaw start` is
kept as a deprecated alias.)" to a new line immediately after the first
sentence, preserving punctuation and whitespace.

---

Nitpick comments:
In `@docs/manage-sandboxes/messaging-channels.mdx`:
- Line 145: Rewrite the sentence in active voice and name the actor that
performs the action: change "Session credentials are generated and stored inside
durable agent state (`whatsapp` for OpenClaw, `platforms/whatsapp` for Hermes),
so they survive rebuilds without re-pairing." to an active construction that
states who does the work (e.g., "The agent generates and stores session
credentials in durable agent state (`whatsapp` for OpenClaw,
`platforms/whatsapp` for Hermes) so they survive rebuilds without re-pairing."),
ensuring you keep the same identifiers `whatsapp`, `platforms/whatsapp`,
OpenClaw, and Hermes.
- Line 123: Rewrite the passive sentence to active voice by naming the actor
that performs the baking; for example: state that the sandbox image build (or
the build process) bakes the non-secret per-account metadata (WECHAT_ACCOUNT_ID,
WECHAT_BASE_URL, WECHAT_USER_ID) into the sandbox image so the in-sandbox bridge
can pre-seed the per-account context tokens without re-running the QR handshake.
Replace the passive phrase "is baked into the sandbox image" with an active
construction like "the sandbox image build bakes" or "the build process bakes"
and keep references to the in-sandbox bridge and context tokens unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ab3f8e59-35f3-43d9-b13a-33e9eb719333

📥 Commits

Reviewing files that changed from the base of the PR and between 2e154e5 and daeb035.

📒 Files selected for processing (25)
  • docs/about/release-notes.mdx
  • docs/deployment/deploy-to-remote-gpu.mdx
  • docs/deployment/install-openclaw-plugins.mdx
  • docs/deployment/sandbox-hardening.mdx
  • docs/get-started/quickstart-hermes.mdx
  • docs/get-started/quickstart.mdx
  • docs/inference/inference-options.mdx
  • docs/inference/set-up-sub-agent.mdx
  • docs/inference/switch-inference-providers.mdx
  • docs/inference/tool-calling-reliability.mdx
  • docs/inference/use-local-inference.mdx
  • docs/manage-sandboxes/backup-restore.mdx
  • docs/manage-sandboxes/lifecycle.mdx
  • docs/manage-sandboxes/messaging-channels.mdx
  • docs/monitoring/monitor-sandbox-activity.mdx
  • docs/network-policy/approve-network-requests.mdx
  • docs/network-policy/customize-network-policy.mdx
  • docs/network-policy/integration-policy-examples.mdx
  • docs/reference/cli-selection-guide.mdx
  • docs/reference/commands-nemohermes.mdx
  • docs/reference/commands.mdx
  • docs/reference/network-policies.mdx
  • docs/reference/troubleshooting.mdx
  • docs/resources/agent-skills.mdx
  • docs/security/credential-storage.mdx
✅ Files skipped from review due to trivial changes (10)
  • docs/deployment/install-openclaw-plugins.mdx
  • docs/resources/agent-skills.mdx
  • docs/deployment/sandbox-hardening.mdx
  • docs/deployment/deploy-to-remote-gpu.mdx
  • docs/about/release-notes.mdx
  • docs/reference/network-policies.mdx
  • docs/network-policy/approve-network-requests.mdx
  • docs/reference/cli-selection-guide.mdx
  • docs/get-started/quickstart-hermes.mdx
  • docs/reference/commands-nemohermes.mdx
🚧 Files skipped from review as they are similar to previous changes (12)
  • docs/inference/set-up-sub-agent.mdx
  • docs/monitoring/monitor-sandbox-activity.mdx
  • docs/security/credential-storage.mdx
  • docs/inference/inference-options.mdx
  • docs/get-started/quickstart.mdx
  • docs/inference/switch-inference-providers.mdx
  • docs/manage-sandboxes/backup-restore.mdx
  • docs/inference/use-local-inference.mdx
  • docs/network-policy/integration-policy-examples.mdx
  • docs/manage-sandboxes/lifecycle.mdx
  • docs/network-policy/customize-network-policy.mdx
  • docs/reference/commands.mdx

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
docs/_components/AgentGuide.tsx (1)

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

Use the required // SPDX header form.

This still uses a block comment, so the file is missing the required TSX SPDX header format.

As per coding guidelines, All source files must include an SPDX license header in the format: // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. and // SPDX-License-Identifier: Apache-2.0.

🤖 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/_components/AgentGuide.tsx` around lines 1 - 4, Replace the block
comment at the top of AgentGuide.tsx with the required two-line SPDX header
using line comments: add "// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA
CORPORATION & AFFILIATES. All rights reserved." on the first line and "//
SPDX-License-Identifier: Apache-2.0" on the second line at the very top of the
file (replacing the existing /* ... */ block).
🤖 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 `@docs/_components/AgentGuide.tsx`:
- Around line 91-94: The link resolver currently rewrites any href that isn't
http(s), breaking fragments and scheme links; update the conditional that
computes resolved (the block using href, guidePath, variant, activeVariant,
pathname) to return href unchanged when it's an absolute http(s) URL OR a
fragment (href.startsWith('#')) OR when href begins with a URI scheme (detect
with a regex like /^[a-zA-Z][\w+.-]*:/) so mailto:, tel:, and other schemes are
preserved; otherwise continue to call guidePath(href, { variant, activeVariant,
pathname }).

---

Duplicate comments:
In `@docs/_components/AgentGuide.tsx`:
- Around line 1-4: Replace the block comment at the top of AgentGuide.tsx with
the required two-line SPDX header using line comments: add "//
SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All
rights reserved." on the first line and "// SPDX-License-Identifier: Apache-2.0"
on the second line at the very top of the file (replacing the existing /* ... */
block).
🪄 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: CHILL

Plan: Enterprise

Run ID: de3d273a-74d3-4894-9db6-6074460c4401

📥 Commits

Reviewing files that changed from the base of the PR and between b85c856 and 19e9905.

📒 Files selected for processing (2)
  • docs/_components/AgentGuide.tsx
  • docs/manage-sandboxes/runtime-controls.mdx
💤 Files with no reviewable changes (1)
  • docs/manage-sandboxes/runtime-controls.mdx

Comment thread docs/_components/AgentGuide.tsx
@miyoungc miyoungc merged commit c8df6ae into main Jun 2, 2026
30 checks passed
@miyoungc miyoungc deleted the docs/hermes branch June 2, 2026 07:10
@coderabbitai coderabbitai Bot mentioned this pull request Jun 2, 2026
12 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Docs, examples, guides, or messaging need work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants