fix(uninstall): preserve user data by default#4229
Conversation
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (3)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughAdds an allowlist and selective-deletion logic for ~/.nemoclaw during uninstall, computes a preserve set (interactive prompt or env-var override), uses removePathExcept() in the uninstall plan, adds tests for multiple scenarios, and updates reference and lifecycle docs to describe the preservation contract. ChangesUser-data preservation during uninstall
sequenceDiagram
participant detectPreservableEntries
participant resolvePreserveSet
participant executePlan
participant removePathExcept
detectPreservableEntries->>resolvePreserveSet: find present allowlisted entries
resolvePreserveSet->>executePlan: computed preserveUnderStateDir (preserve or purge)
executePlan->>removePathExcept: removePathExcept(paths.nemoclawStateDir, preserveSet)
removePathExcept->>removePathExcept: remove non-preserved children or remove symlink
Estimated code review effort: Suggested reviewers:
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint skipped: no ESLint configuration detected in root package.json. To enable, add Comment |
|
🌿 Preview your docs: https://nvidia-preview-pr-4229.docs.buildwithfern.com/nemoclaw |
E2E Advisor RecommendationRequired E2E: Dispatch hint: Auto-dispatched E2E: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
PR Review AdvisorFindings: 2 needs attention, 4 worth checking, 0 nice ideas Review findings🛠️ Needs attention
🔎 Worth checking
🌱 Nice ideas
Since last review detailsCurrent findings:
This is an automated advisory review. A human maintainer must make the final merge decision. |
E2E Scenario Advisor RecommendationRequired scenario E2E: None Full scenario advisor summaryE2E Scenario AdvisorBase: Required scenario E2E
Optional scenario E2E
Relevant changed files
|
…oad wrappers Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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/reference/commands.mdx`:
- Around line 1221-1240: Docs/CLI parity: the uninstall docs incorrectly surface
non-uninstall flags like --save-host/--mount/--volume; update the text so it
doesn’t present those tokens as uninstall options. Edit the paragraph that
currently shows the example command and the mount/volume sentence: replace the
example block with a single sentence pointing readers to the existing "nemoclaw
backup-all" and "nemoclaw <name> snapshot create" sections for host-preservation
commands, and change the OpenShell note to say “host mount/volume options” (not
specific flags) and refer to the host-preservation flow described above; keep
references to PROTECTED_USER_DATA_DIRS and NEMOCLAW_UNINSTALL_DESTROY_USER_DATA
unchanged so readers can still find implementation details in
src/lib/actions/uninstall/run-plan.ts.
In `@src/lib/actions/maintenance.ts`:
- Around line 88-90: The current code calls
saveBackupToHost(result.manifest.backupPath, options.saveHost) which writes only
the leaf folder name to the shared host root and can cause collisions when
different sandboxes produce identical leaf names; change the host destination to
include a sandbox-unique prefix (for example sandbox id or full relative path)
so each sandbox writes to its own subfolder (e.g. build a hostPath by joining
options.saveHost with a sandbox identifier from the backup context instead of
using only the leaf folder), and use that hostPath when calling
saveBackupToHost(result.manifest.backupPath, hostPath).
🪄 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: 58df9b5d-9fdc-42e0-9262-529fded96e00
📒 Files selected for processing (15)
docs/reference/commands.mdxsrc/commands/backup-all.tssrc/commands/sandbox/download.tssrc/commands/sandbox/snapshot/create.tssrc/commands/sandbox/upload.tssrc/lib/actions/global.tssrc/lib/actions/maintenance.tssrc/lib/actions/sandbox/snapshot.tssrc/lib/actions/sandbox/transfer.test.tssrc/lib/actions/sandbox/transfer.tssrc/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.tssrc/lib/cli/public-display-defaults.tssrc/lib/state/save-host.test.tssrc/lib/state/save-host.ts
✅ Files skipped from review due to trivial changes (2)
- src/lib/actions/sandbox/transfer.test.ts
- src/commands/sandbox/upload.ts
Selective E2E Results — ✅ All requested jobs passedRun: 26444236185
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@src/lib/actions/uninstall/run-plan.ts`:
- Around line 169-183: The current fallback for listRegisteredSandboxes (the
anonymous default used when deps.listRegisteredSandboxes is undefined) swallows
any parsing or IO errors and returns [], which can incorrectly allow uninstall
to proceed; change the catch block to surface failures instead of returning an
empty list by rethrowing (or throwing a new Error with context) when JSON.parse
or fs.readFileSync fails so the uninstall flow can fail closed; keep the rest of
the logic (reading env.HOME, checking exists, parsing sandboxes) but replace the
silent catch with a thrown error that includes the registryFile path and the
original error message so callers of listRegisteredSandboxes see the failure.
🪄 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: 4d38e858-7515-4834-a17f-68aeca7b24cd
📒 Files selected for processing (8)
docs/reference/commands.mdxsrc/commands/global-oclif-command-adapters.test.tssrc/lib/actions/global.test.tssrc/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.tssrc/lib/cli/command-registry.test.tssrc/lib/state/save-host.test.tssrc/lib/state/save-host.ts
✅ Files skipped from review due to trivial changes (1)
- src/lib/actions/global.test.ts
Selective E2E Results — ✅ All requested jobs passedRun: 26446362377
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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 `@src/lib/actions/uninstall/run-plan.ts`:
- Around line 761-774: The catch block handling failures from detectUserData()
currently always logs a remediation about the sandbox registry which is
misleading if readdirSync failed on a protected directory; update the catch
handler in run-plan.ts (the catch around detectUserData and any readdirSync
usage) to produce generalized recovery messaging: log the error and a generic
hint such as "check directory permissions or file access for the target path"
and only append the sandbox-registry-specific advice when you can detect the
error path or context (e.g., examine the path variable or error.stack/message
for the sandbox registry string or check error.code like EACCES); ensure you
reference detectUserData and the readdirSync call so the conditional/specific
hint is applied only when the failing path clearly matches the sandbox registry.
- Around line 185-194: In listRegisteredSandboxes, validate the result of
JSON.parse(raw) is a non-null object before accessing data.sandboxes (treat
null/primitive/array as invalid and throw the same parse/invalid registry error)
so JSON.parse("null") cannot cause a TypeError; in runUninstallPlan, broaden the
error messages that currently reference only “registry” when catching failures
from detectUserData to a more general “user-data detection” (or vary text based
on whether the failure originated from listRegisteredSandboxes vs
detectUserData) so messages correctly cover both registry parsing and protected
user-data scan failures.
🪄 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: 070aaf1f-ebe1-4b2f-bd90-23c027b47fbf
📒 Files selected for processing (2)
src/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.ts
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/lib/actions/uninstall/run-plan.test.ts (1)
485-486: ⚡ Quick winPrefix or remove the unused
logsfixtures.These locals are never read in either test, so they should be removed or renamed to
_logsif they are intentionally unused.As per coding guidelines
**/*.{js,ts,tsx,jsx}: Unused variables should be prefixed with underscore (_) following Biome conventions.Also applies to: 568-569
🤖 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 `@src/lib/actions/uninstall/run-plan.test.ts` around lines 485 - 486, The test file declares unused locals logs and errors in the uninstall run-plan tests; either remove those unused variables or rename them to _logs and _errors to follow the Biome convention for unused variables; update both occurrences of these locals (the const declarations where logs and errors are defined in the run-plan.test.ts tests) so linters stop flagging them.
🤖 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 `@src/lib/actions/uninstall/run-plan.ts`:
- Around line 782-789: The code logs a refusal and remediation even when the
ack-bypass env var is set; change the control flow so that after computing
message and remediation you check
runtime.env.NEMOCLAW_UNINSTALL_DESTROY_USER_DATA === "1" first and, if true,
skip logging the "Refusing to proceed" and remediation lines and instead log
only the acknowledgment note (ackBypassNote) and return true; otherwise proceed
to runtime.error the message, refusal and remediation and return false. Target
the block that uses message, remediation, ackBypassNote and
runtime.env.NEMOCLAW_UNINSTALL_DESTROY_USER_DATA in run-plan.ts.
---
Nitpick comments:
In `@src/lib/actions/uninstall/run-plan.test.ts`:
- Around line 485-486: The test file declares unused locals logs and errors in
the uninstall run-plan tests; either remove those unused variables or rename
them to _logs and _errors to follow the Biome convention for unused variables;
update both occurrences of these locals (the const declarations where logs and
errors are defined in the run-plan.test.ts tests) so linters stop flagging them.
🪄 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: a041ac3a-c005-41f0-853d-152e552fdd0f
📒 Files selected for processing (2)
src/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.ts
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
…links Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Selective E2E Results — ✅ All requested jobs passedRun: 26448971616
|
…emoclaw Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Selective E2E Results — ❌ Some jobs failedRun: 26449943142
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
docs/manage-sandboxes/lifecycle.mdx (1)
261-261: ⚡ Quick winUse one sentence per source line in the Note text.
Line 261 currently contains multiple sentences on a single line; split them into separate lines to match docs formatting rules.
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/manage-sandboxes/lifecycle.mdx` at line 261, The Note paragraph containing the sentence starting "Before destroying anything, uninstall now scans for workspace state — host snapshots under `~/.nemoclaw/rebuild-backups/` and `~/.nemoclaw/backups/`, registered sandboxes in `~/.nemoclaw/sandboxes.json`, and running Docker containers matching the sandbox/gateway pattern." should be split so each sentence is on its own source line; edit the Note block in docs/manage-sandboxes/lifecycle.mdx to break that long line into separate lines for each sentence (separate the scan description, the gate refusal behavior, and the `--yes`/exit status detail into individual lines) to comply with the one-sentence-per-line rule.
🤖 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/manage-sandboxes/lifecycle.mdx`:
- Line 261: The sentence currently says the uninstall gate checks "running
Docker containers matching the sandbox/gateway pattern" but the gate actually
inspects Docker's container listing (including stopped or unregistered
containers), so update the text in lifecycle.mdx to clarify that the gate
inventories Docker containers matching the sandbox/gateway pattern from Docker's
listing — including stopped or unregistered containers — and will refuse to
proceed if any are found, even with `--yes` set.
---
Nitpick comments:
In `@docs/manage-sandboxes/lifecycle.mdx`:
- Line 261: The Note paragraph containing the sentence starting "Before
destroying anything, uninstall now scans for workspace state — host snapshots
under `~/.nemoclaw/rebuild-backups/` and `~/.nemoclaw/backups/`, registered
sandboxes in `~/.nemoclaw/sandboxes.json`, and running Docker containers
matching the sandbox/gateway pattern." should be split so each sentence is on
its own source line; edit the Note block in docs/manage-sandboxes/lifecycle.mdx
to break that long line into separate lines for each sentence (separate the scan
description, the gate refusal behavior, and the `--yes`/exit status detail into
individual lines) to comply with the one-sentence-per-line rule.
🪄 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: 3a63d45a-72c2-4150-b449-8d40525c9252
📒 Files selected for processing (3)
docs/manage-sandboxes/lifecycle.mdxsrc/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.ts
Selective E2E Results — ❌ Some jobs failedRun: 26451568604
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
There was a problem hiding this comment.
🧹 Nitpick comments (3)
docs/reference/commands.mdx (3)
1224-1224: ⚡ Quick winSplit into one sentence per line.
This line contains two sentences joined by a semicolon.
Per the style guide, "One sentence per line in source (makes diffs readable)."Suggested edit
-The list of protected directories lives in `PROTECTED_USER_DATA_DIRS` in `src/lib/actions/uninstall/run-plan.ts`; additions to this list automatically extend the gate. +The list of protected directories lives in `PROTECTED_USER_DATA_DIRS` in `src/lib/actions/uninstall/run-plan.ts`. +Additions to this list automatically extend the gate.As per coding guidelines: "One sentence per line in source (makes diffs readable). Flag paragraphs where multiple sentences appear on the same line."
🤖 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/reference/commands.mdx` at line 1224, The sentence contains two sentences joined by a semicolon; split it into two lines so each sentence is on its own line in source: make one line "The list of protected directories lives in `PROTECTED_USER_DATA_DIRS` in `src/lib/actions/uninstall/run-plan.ts`." and the next line "Additions to this list automatically extend the gate." and ensure you update the docs file `docs/reference/commands.mdx` accordingly so diffs remain clean.
1227-1227: ⚡ Quick winSplit into one sentence per line.
This line contains two sentences joined by a semicolon.
Suggested edit
-Both `nemoclaw backup-all` and `nemoclaw <name> snapshot create` expose a host-copy option that places each backup directory into a destination you supply, so the data survives the `~/.nemoclaw/` wipe; see those command sections for the exact invocation. +Both `nemoclaw backup-all` and `nemoclaw <name> snapshot create` expose a host-copy option that places each backup directory into a destination you supply, so the data survives the `~/.nemoclaw/` wipe. +See those command sections for the exact invocation.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/reference/commands.mdx` at line 1227, The sentence contains two sentences joined by a semicolon—split them into separate lines so each sentence is one line in the source: put the sentence about "Both `nemoclaw backup-all` and `nemoclaw <name> snapshot create` expose a host-copy option that places each backup directory into a destination you supply." on its own line, and move "so the data survives the `~/.nemoclaw/` wipe; see those command sections for the exact invocation." onto the next line, replacing the semicolon with a period (or reword to start with "See those command sections for the exact invocation.") so each logical sentence is a standalone line.
1232-1232: ⚡ Quick winSplit into one sentence per line.
This line contains two sentences joined by a semicolon.
Suggested edit
-OpenShell's `sandbox create` does not currently expose host mount or volume options, so NemoClaw cannot mount workspace state on a persistent host volume; the host-copy flow referenced above is the workaround for that constraint. +OpenShell's `sandbox create` does not currently expose host mount or volume options, so NemoClaw cannot mount workspace state on a persistent host volume. +The host-copy flow referenced above is the workaround for that constraint.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/reference/commands.mdx` at line 1232, The line containing "OpenShell's `sandbox create` does not currently expose host mount or volume options, so NemoClaw cannot mount workspace state on a persistent host volume; the host-copy flow referenced above is the workaround for that constraint." should be split into two sentences on separate lines: replace the semicolon with a period and break after the first sentence so each sentence appears on its own line (first line: OpenShell's `sandbox create` does not currently expose host mount or volume options. second line: NemoClaw cannot mount workspace state on a persistent host volume, so the host-copy flow referenced above is the workaround for that constraint.).
🤖 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.
Nitpick comments:
In `@docs/reference/commands.mdx`:
- Line 1224: The sentence contains two sentences joined by a semicolon; split it
into two lines so each sentence is on its own line in source: make one line "The
list of protected directories lives in `PROTECTED_USER_DATA_DIRS` in
`src/lib/actions/uninstall/run-plan.ts`." and the next line "Additions to this
list automatically extend the gate." and ensure you update the docs file
`docs/reference/commands.mdx` accordingly so diffs remain clean.
- Line 1227: The sentence contains two sentences joined by a semicolon—split
them into separate lines so each sentence is one line in the source: put the
sentence about "Both `nemoclaw backup-all` and `nemoclaw <name> snapshot create`
expose a host-copy option that places each backup directory into a destination
you supply." on its own line, and move "so the data survives the `~/.nemoclaw/`
wipe; see those command sections for the exact invocation." onto the next line,
replacing the semicolon with a period (or reword to start with "See those
command sections for the exact invocation.") so each logical sentence is a
standalone line.
- Line 1232: The line containing "OpenShell's `sandbox create` does not
currently expose host mount or volume options, so NemoClaw cannot mount
workspace state on a persistent host volume; the host-copy flow referenced above
is the workaround for that constraint." should be split into two sentences on
separate lines: replace the semicolon with a period and break after the first
sentence so each sentence appears on its own line (first line: OpenShell's
`sandbox create` does not currently expose host mount or volume options. second
line: NemoClaw cannot mount workspace state on a persistent host volume, so the
host-copy flow referenced above is the workaround for that constraint.).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 12931477-ddf0-4859-aaef-4f5e894fda1a
📒 Files selected for processing (5)
docs/reference/commands.mdxsrc/lib/actions/uninstall/run-plan.test.tssrc/lib/actions/uninstall/run-plan.tssrc/lib/state/save-host.test.tssrc/lib/state/save-host.ts
💤 Files with no reviewable changes (3)
- src/lib/state/save-host.test.ts
- src/lib/state/save-host.ts
- src/lib/actions/uninstall/run-plan.test.ts
Selective E2E Results — ✅ All requested jobs passedRun: 26453472576
|
Selective E2E Results — ✅ All requested jobs passedRun: 26590962649
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
Actionable comments posted: 0 |
Selective E2E Results — ✅ All requested jobs passedRun: 26592087649
|
…v, active-voice docs Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
Actionable comments posted: 0 |
Selective E2E Results — ✅ All requested jobs passedRun: 26593127514
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
Actionable comments posted: 0 |
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
Actionable comments posted: 0 |
Selective E2E Results —
|
| Job | Result |
|---|---|
| gpu-e2e | ⏭️ skipped |
| snapshot-commands-e2e | |
| state-backup-restore-e2e |
|
Actionable comments posted: 0 |
Selective E2E Results — ✅ All requested jobs passedRun: 26595172990
|
## Summary - Adds the v0.0.56 release notes section with links to the deeper docs pages for installer, status, inference, messaging, policy, and lifecycle changes. - Updates source docs for the remaining release-prep gaps around `uv` in the PyPI preset, compact WhatsApp pairing guidance, and `nemoclaw inference set` command boundaries. - Refreshes generated `nemoclaw-user-*` skills and removes skipped experimental command terms from generated skill surfaces. ## Source summary - #4613 -> `docs/manage-sandboxes/lifecycle.mdx`, `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Documents that public installs and `nemoclaw update` follow the maintained `lkg` tag by default. - #4419 -> `docs/about/release-notes.mdx`: Notes that non-interactive Linux installs can reactivate Docker group membership and continue in one installer run when `sg docker` is available. - #4550 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Captures live sandbox agent-version probing for status, connect, and upgrade checks. - #4609 -> `docs/inference/use-local-inference.mdx`, `docs/about/release-notes.mdx`: Captures the GPU Docker-driver host-network local-inference reachability gate. - #4607 -> `docs/manage-sandboxes/messaging-channels.mdx`, `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Documents compact WhatsApp QR pairing guidance and gateway/session diagnostics. - #4582 -> `docs/manage-sandboxes/messaging-channels.mdx`, `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Reflects Slack credential validation before enabling the channel. - #4554 -> `docs/manage-sandboxes/messaging-channels.mdx`, `docs/reference/troubleshooting.mdx`, `docs/about/release-notes.mdx`: Keeps Telegram allowlist alias guidance in the generated user skills and release notes. - #4563 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Includes the new `nemoclaw <name> skill remove <skill>` command in command docs and release notes. - #4566 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Documents the `nemoclaw inference set` redirect boundary when `--provider` or `--model` is missing. - #4323 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Captures per-sandbox status JSON support. - #4506 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Captures debug command sandbox-name validation and safer tarball writing. - #4569 -> `docs/network-policy/integration-policy-examples.mdx`, `docs/about/release-notes.mdx`: Documents that the `pypi` preset allows `/usr/local/bin/uv`. - #4579 -> `docs/network-policy/integration-policy-examples.mdx`, `docs/about/release-notes.mdx`: Captures observable Jira preset validation guidance. - #4229 -> `docs/manage-sandboxes/lifecycle.mdx`, `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Documents user-data preservation defaults for uninstall. - #4399 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Captures CPU-only sandbox intent preservation across rebuilds. - #4058 -> `docs/reference/commands.mdx`, `docs/about/release-notes.mdx`: Captures safer snapshot restore behavior around existing destinations. - #4155 and #4460 -> skipped by `docs/.docs-skip`: Removed skipped experimental command terms from source docs and generated skill evals instead of documenting those features. ## Verification - `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix nemoclaw-user --doc-platform fern-mdx` - `npm run docs` (passes; Fern reports the pre-existing light-mode accent contrast warning) - `rg "permissive mode|shields down|shields up|shields status|config rotate-token|rotate-token" .agents/skills` (no matches) - `npm run build:cli` (run to refresh local CLI artifacts for the pre-push TypeScript hook) - Commit hooks passed, including `NEMOCLAW_* env-var documentation gate`, `Verify docs-to-skills output`, `markdownlint-cli2`, `gitleaks`, and `Test (skills YAML)`. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Expanded Model Router setup with YAML examples, flow diagrams, and credential handling; strengthened agent-config immutability and integrity guidance; messaging channels updated (Telegram aliases, WhatsApp pairing/diagnostics); CLI docs revised (GPU detection, inference set behavior, uninstall/rebuild preservation); overview rebranded to NemoClaw and added v0.0.56 release notes. * **New Features** * Added `nemoclaw <name> channels status` (messaging diagnostics, JSON); added `nemoclaw <name> skill remove`; Hermes no longer marked experimental; DGX Spark quickstart sandbox-name note. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Summary
nemoclaw uninstallused torm -rf ~/.nemoclaw/, deleting every host-side snapshot and workspace backup. Switch to a selective wipe that keepsrebuild-backups/,backups/, andsandboxes.jsonby default. Full purge still available via interactiveyprompt orNEMOCLAW_UNINSTALL_DESTROY_USER_DATA=1.Related Issue
Fixes #4226.
Changes
src/lib/actions/uninstall/run-plan.ts: newPRESERVED_USER_DATA_ENTRIES,removePathExcept(selective wipe with lstat guard against symlinked state dirs), andresolvePreserveSet(env var + interactivey/Nprompt).src/lib/actions/uninstall/run-plan.test.ts: new tests covering preserve-by-default, env-var purge, interactivey/N,NEMOCLAW_NON_INTERACTIVE=1on a TTY, symlinked state dir, no-preservable-on-disk skip, and non-ENOENT lstat failure exiting non-zero.docs/reference/commands.mdx: new "User-data preservation under~/.nemoclaw/" subsection with the decision matrix.docs/manage-sandboxes/lifecycle.mdx:<Note>summary above the uninstall flags table.Type of Change
Verification
npx prek run --all-filespassesnpm testpassesnpm run docsbuilds without warnings (doc changes only)Signed-off-by: Tinson Lai tinsonl@nvidia.com
Summary by CodeRabbit
New Features
Behavior
Tests
Documentation