Skip to content

refactor(cli): group core credentials and security helpers#3193

Merged
cv merged 16 commits into
mainfrom
refactor/lib-core-security
May 7, 2026
Merged

refactor(cli): group core credentials and security helpers#3193
cv merged 16 commits into
mainfrom
refactor/lib-core-security

Conversation

@cv

@cv cv commented May 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

Moves cross-cutting helpers into the core, CLI, credentials, and security homes documented by the placement map. This keeps the flat src/lib namespace focused on legacy modules that still need dedicated follow-up work.

Changes

  • Move CLI metadata/display helpers under src/lib/cli/**.
  • Move small cross-cutting primitives under src/lib/core/**.
  • Move credential storage under src/lib/credentials/store.ts.
  • Move redaction, secret-pattern, credential hash, and credential filter helpers under src/lib/security/**.
  • Update imports, tests, bin shims, scripts, and source-shape expectations for the new paths.

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
  • make 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)

Signed-off-by: Carlos Villela cvillela@nvidia.com

Summary by CodeRabbit

  • New Features

    • Sandbox connect: auto-syncs inference route to the sandbox's configured provider/model and supports a configurable connect timeout.
    • Snapshot restore: reconciles policy presets after restoring a sandbox.
  • Improvements

    • Status/inventory: prefers live inference info, shows dashboard port, indicates onboarding drift, and can surface recent gateway logs when messaging is degraded.
  • Refactor

    • Internal module/layout reorganization and import-path changes; public CLI commands and APIs unchanged.
  • Tests

    • Many tests updated to use relocated module entrypoints.

@cv cv self-assigned this May 7, 2026
@coderabbitai

coderabbitai Bot commented May 7, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 10941ba3-1671-4800-bb39-19452a16d974

📥 Commits

Reviewing files that changed from the base of the PR and between 08ffb54 and abd88c9.

📒 Files selected for processing (1)
  • test/e2e/test-credential-migration.sh

📝 Walkthrough

Walkthrough

This PR rewires imports into new core/, cli/, and security/ modules; moves credential APIs to credentials/store and updates callers and shims; adds sandbox connect timeout and inference-route swap; reconciles policyPresets on snapshot restore; centralizes sandbox-name validation; and updates many tests and harnesses.

Changes

Module Reorganization and Functional Enhancements

Layer / File(s) Summary
Runtime Shims & Build Outputs
bin/lib/credentials.js, bin/lib/ports.js, scripts/check-legacy-migrated-paths.ts, scripts/dev-tier-selector.js, scripts/ts-migration-assist.ts, scripts/generate-openclaw-config.py
Shims and migration scripts updated to reference reorganized module paths and dist outputs; removed-shim mapping for bin/lib/version.js updated.
Credentials Store Split
src/lib/credentials/store.ts, bin/lib/credentials.js, scripts/*, src/lib/*, test/*
Credential helpers moved to credentials/store; callers updated to import prompt, getCredential, saveCredential, deleteCredential, and KNOWN_CREDENTIAL_ENV_KEYS from the new entrypoint.
Core Utilities Repath
src/lib/core/version.ts, src/lib/core/ports.ts, src/lib/core/wait.ts, src/lib/core/errno.ts, src/lib/core/url-utils.ts, src/lib/core/json-types.ts, src/lib/core/shell-quote.ts
Core helpers now live under core/ and compiled-path references updated (getVersion root calc adjusted).
CLI Consolidation
src/lib/cli/*, command modules, src/nemoclaw.ts
Branding, terminal-style, duration flags, command-registry, and oclif adapters moved/rewired into cli/; callers updated across commands and runner.
Security / Redaction
src/lib/security/*, src/lib/runner.ts, src/lib/diagnostics/*, src/lib/sandbox-config.ts
Redaction and credential-filter helpers moved under security/; runner, diagnostics, shields, and sandbox config updated to use new modules.
Sandbox Connect Enhancements
src/lib/actions/sandbox/connect.ts
Add inference-route swap when persisted provider/model differs from live route and support NEMOCLAW_CONNECT_TIMEOUT deadline-based readiness polling.
Snapshot Restore Policy Reconciliation
src/lib/actions/sandbox/snapshot.ts
After snapshot restore, if policyPresets exists, diff against applied presets and apply/remove presets with per-preset error handling and warnings.
Services & Inventory Refinements
src/lib/services.ts, src/lib/inventory-commands.ts
Centralize sandbox-name validation for PID dir safety; prefer live gateway inference for default sandbox status and append (onboarded: ...) on drift; stopSandboxChannels uses kubectl privileged path with openshell fallback.
Tests & E2E Harnesses
test/*.test.ts, test/e2e/*.sh
60+ tests and generated subprocess scripts updated to require dist/lib/credentials/store.js, core/*, and security/* paths; module-cache invalidation adjusted where needed.

Sequence Diagram

sequenceDiagram
  participant User
  participant ConnectCmd
  participant Registry
  participant Openshell
  participant Sandbox
  User->>ConnectCmd: run connect
  ConnectCmd->>Registry: read sandbox persisted provider/model
  ConnectCmd->>Openshell: query live inference route
  Openshell-->>ConnectCmd: live route
  alt routes differ
    ConnectCmd->>Openshell: run "inference set" to swap route
    Openshell-->>ConnectCmd: success/failure (warn if fail)
  end
  ConnectCmd->>Sandbox: readiness poll (deadline from NEMOCLAW_CONNECT_TIMEOUT)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐰 "I hopped through code and moved the rooms,
Core, CLI, and secrets cleared the blooms.
A credential store now keeps the keys,
Connect waits, swaps routes with ease,
Snapshots tidy presets in their tunes."

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/lib-core-security

@cv cv marked this pull request as draft May 7, 2026 16:55
@copy-pr-bot

copy-pr-bot Bot commented May 7, 2026

Copy link
Copy Markdown

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.

@cv cv added the v0.0.37 label May 7, 2026
@cv cv changed the base branch from refactor/lib-feature-clusters to main May 7, 2026 18:55
@cv cv requested review from cjagwani, ericksoa, jyaunches and prekshivyas and removed request for jyaunches May 7, 2026 18:55
…urity

# Conflicts:
#	src/lib/agent/defs.ts
#	src/lib/agent/onboard.ts
#	src/lib/agent/runtime.ts
#	src/lib/commands/debug.ts
#	src/lib/dashboard/contract.ts
#	src/lib/diagnostics/debug.ts
#	src/lib/shields/audit.ts
#	test/onboard.test.ts
#	test/secret-redaction.test.ts
@cv cv marked this pull request as ready for review May 7, 2026 19:56

@prekshivyas prekshivyas left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Mechanical move-only refactor implementing step 3 of the #3189 migration sequence (after #3191's cluster moves). Net-zero line count (228+/228-) is the signature of a pure rename — 26 git-detected renames at 95-100% similarity, the other 91 files are 1+/1- import-path updates in callers.

Files moved into the four homes documented by the placement map:

  • src/lib/cli/: branding.ts, command-display-metadata.test.ts, command-registry.{ts,test.ts}, duration-flags.{ts,test.ts}, oclif-command-metadata.test.ts, terminal-style.{ts,test.ts}
  • src/lib/core/: errno.ts + test, json-types.ts, ports.ts + test, shell-quote.ts, url-utils.ts + test, version.ts + test, wait.ts
  • src/lib/credentials/: credentials.tscredentials/store.ts
  • src/lib/security/: credential-filter.{ts,test.ts}, credential-hash.ts, redact.ts, secret-patterns.ts

Spot-checked src/nemoclaw.ts (the entry point, 4+/4-): pure import path updates — ./lib/ports./lib/core/ports, ./lib/branding./lib/cli/branding, ./lib/errno./lib/core/errno, ./lib/command-registry./lib/cli/command-registry. No logic changes.

Tooling correctly updated alongside the moves:

  • bin/lib/credentials.js re-export shim retargeted at dist/lib/credentials/store.
  • bin/lib/ports.js shim retargeted at dist/lib/core/ports.
  • scripts/check-legacy-migrated-paths.ts REMOVED_SHIM_MOVES entry for bin/lib/version.js updated to src/lib/core/version.ts.
  • scripts/ts-migration-assist.ts SPECIAL_REWRITES entry for credentials updated to ./credentials/store.
  • scripts/dev-tier-selector.js require path updated to dist/lib/credentials/store.js.
  • scripts/generate-openclaw-config.py docstring reference updated to src/lib/core/url-utils.ts.

Renames are 1:1, no legacy-shim files left at the old flat paths. Tests moved alongside their source.

CI: pr.yaml rollup checks pass (commit-lint, dco, layer-boundary, check-hash, changes, get-pr-info, block edits to migrated legacy paths and removed shims). 1 prior pr-self-hosted run success on pull-request/3193. CodeRabbit / checks / macos-e2e / wsl-e2e / build-sandbox-images and current self-hosted run still in progress at approval time.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

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 (2)
src/lib/actions/sandbox/connect.ts (1)

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

Add a timeout to the inference-route reset.

runOpenshell(..., { ignoreError: true }) is unbounded here. If OpenShell hangs during inference set, connect can block indefinitely before the new readiness timeout logic even starts. Reuse the probe timeout here, or clamp it to the remaining connect deadline.

Proposed fix
         const swapResult = runOpenshell(
           ["inference", "set", "--provider", sb.provider, "--model", sb.model, "--no-verify"],
-          { ignoreError: true },
+          {
+            ignoreError: true,
+            timeout: OPENSHELL_PROBE_TIMEOUT_MS,
+          },
         );
🤖 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/sandbox/connect.ts` around lines 199 - 202, The runOpenshell
call used to perform the "inference set" (the swapResult assignment) is
currently unbounded; update the call to pass a timeout so it cannot hang
indefinitely by reusing the existing probe timeout (or clamp to the remaining
connect deadline) — e.g., compute the effective timeout from the probe timeout
or remaining connect deadline and add it to the runOpenshell options object
(alongside ignoreError: true) so the inference set (using sb.provider and
sb.model) will fail fast if Openshell hangs.
src/lib/actions/sandbox/snapshot.ts (1)

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

Return a non-zero status when preset reconciliation is incomplete.

This block only warns on failed removePreset/applyPreset calls, so snapshot restore still exits successfully even when the target’s effective presets no longer match the snapshot. Since preset state is now part of restore, partial reconciliation should surface as a failed restore result.

Proposed fix
           if (failed.length > 0) {
-            console.warn(`  Warning: could not reconcile preset(s): ${failed.join("; ")}`);
+            console.error(`  Failed to reconcile preset(s): ${failed.join("; ")}`);
+            process.exitCode = 1;
           }
🤖 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/sandbox/snapshot.ts` around lines 381 - 404, The code only
logs a warning when some presets fail to remove/apply (the failed array
populated from policies.removePreset and policies.applyPreset on targetSandbox),
so a snapshot restore still exits success; change the behavior so incomplete
reconciliation yields a non-zero result by throwing an Error (or otherwise
returning a failing result) when failed.length > 0 instead of only console.warn
— include a clear message with failed.join("; ") so the CLI's snapshot restore
handler receives the failure and terminates with a non-zero status.
🧹 Nitpick comments (2)
src/lib/shields/audit.ts (1)

14-14: Run the shields lifecycle E2E for this refactor touchpoint.

Since this file participates in shields audit flow, run the selective shields config E2E once before merge to validate end-to-end behavior after path moves.

As per coding guidelines: src/lib/shields/** E2E recommendation includes shields-config-e2e via gh workflow run nightly-e2e.yaml --ref <branch> -f jobs=shields-config-e2e.

🤖 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/shields/audit.ts` at line 14, This file touches the shields audit
flow (the imported symbol redactFull in audit.ts) so before merging run the
selective shields E2E to validate end-to-end behavior after the refactor: ensure
the import of redactFull is still correct and the audit flow exercises this
module, then execute the shields-config-e2e job with the GitHub workflow (gh
workflow run nightly-e2e.yaml --ref <branch> -f jobs=shields-config-e2e) and
verify the audit scenarios pass; if failures occur, revert or fix the
import/path and rerun until the shields audit E2E succeeds.
test/runner.test.ts (1)

718-727: ⚡ Quick win

Assert that the fallback path also exits successfully.

Right now this case passes if the script prints the fallback messages and then exits non-zero. Adding a status check, like the gh-absent test above, makes the regression guard verify the full success path instead of just its logs.

Proposed fix
       try {
         const result = spawnSync("bash", ["-c", stub], {
           encoding: "utf-8",
           timeout: 5000,
         });
         const out = (result.stdout || "") + (result.stderr || "");
+        expect(result.status, out).toBe(0);
         expect(out).toContain("falling back to curl");
         expect(out).toContain("CURL_FALLBACK");
         expect(fs.readFileSync(checksumLog, "utf-8")).toContain("SHASUM -a 256 -c -");
       } finally {
🤖 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 `@test/runner.test.ts` around lines 718 - 727, Add an assertion that the
spawned stub completed successfully by checking the spawnSync result status (the
result variable returned by spawnSync in this test) is 0, similar to the
gh-absent test; place the expect(result.status).toBe(0) (or equivalent status
check) right after you capture result and before reading checksumLog to ensure
the fallback path not only logs messages but also exits successfully.
🤖 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/core/version.ts`:
- Around line 30-31: The default root directory computation in version.ts is off
by one: update the fallback for opts.rootDir used in computing root (variable
root in the module) so it points three levels up from __dirname (to account for
compiled path dist/lib/core/version.js) instead of two; change the join call
constructing root (the value assigned to root when opts.rootDir is undefined) to
ascend one additional ".." so lookups for .version/package.json resolve the
project root rather than the dist folder.

---

Outside diff comments:
In `@src/lib/actions/sandbox/connect.ts`:
- Around line 199-202: The runOpenshell call used to perform the "inference set"
(the swapResult assignment) is currently unbounded; update the call to pass a
timeout so it cannot hang indefinitely by reusing the existing probe timeout (or
clamp to the remaining connect deadline) — e.g., compute the effective timeout
from the probe timeout or remaining connect deadline and add it to the
runOpenshell options object (alongside ignoreError: true) so the inference set
(using sb.provider and sb.model) will fail fast if Openshell hangs.

In `@src/lib/actions/sandbox/snapshot.ts`:
- Around line 381-404: The code only logs a warning when some presets fail to
remove/apply (the failed array populated from policies.removePreset and
policies.applyPreset on targetSandbox), so a snapshot restore still exits
success; change the behavior so incomplete reconciliation yields a non-zero
result by throwing an Error (or otherwise returning a failing result) when
failed.length > 0 instead of only console.warn — include a clear message with
failed.join("; ") so the CLI's snapshot restore handler receives the failure and
terminates with a non-zero status.

---

Nitpick comments:
In `@src/lib/shields/audit.ts`:
- Line 14: This file touches the shields audit flow (the imported symbol
redactFull in audit.ts) so before merging run the selective shields E2E to
validate end-to-end behavior after the refactor: ensure the import of redactFull
is still correct and the audit flow exercises this module, then execute the
shields-config-e2e job with the GitHub workflow (gh workflow run
nightly-e2e.yaml --ref <branch> -f jobs=shields-config-e2e) and verify the audit
scenarios pass; if failures occur, revert or fix the import/path and rerun until
the shields audit E2E succeeds.

In `@test/runner.test.ts`:
- Around line 718-727: Add an assertion that the spawned stub completed
successfully by checking the spawnSync result status (the result variable
returned by spawnSync in this test) is 0, similar to the gh-absent test; place
the expect(result.status).toBe(0) (or equivalent status check) right after you
capture result and before reading checksumLog to ensure the fallback path not
only logs messages but also exits successfully.
🪄 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: fab6b09e-5fa7-41ea-811c-2ded0492c510

📥 Commits

Reviewing files that changed from the base of the PR and between 34e0cba and dd2c9aa.

📒 Files selected for processing (117)
  • bin/lib/credentials.js
  • bin/lib/ports.js
  • scripts/check-legacy-migrated-paths.ts
  • scripts/dev-tier-selector.js
  • scripts/generate-openclaw-config.py
  • scripts/ts-migration-assist.ts
  • src/lib/actions/deploy.ts
  • src/lib/actions/maintenance.ts
  • src/lib/actions/root-help.ts
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/destroy.ts
  • src/lib/actions/sandbox/doctor.ts
  • src/lib/actions/sandbox/gateway-state.ts
  • src/lib/actions/sandbox/policy-channel.ts
  • src/lib/actions/sandbox/process-recovery.ts
  • src/lib/actions/sandbox/rebuild.ts
  • src/lib/actions/sandbox/skill-install.ts
  • src/lib/actions/sandbox/snapshot.ts
  • src/lib/actions/sandbox/status.ts
  • src/lib/actions/upgrade-sandboxes.ts
  • src/lib/agent/defs.ts
  • src/lib/agent/onboard.ts
  • src/lib/agent/runtime.ts
  • src/lib/build-context.ts
  • src/lib/cli/branding.ts
  • src/lib/cli/command-display-metadata.test.ts
  • src/lib/cli/command-registry.test.ts
  • src/lib/cli/command-registry.ts
  • src/lib/cli/duration-flags.test.ts
  • src/lib/cli/duration-flags.ts
  • src/lib/cli/oclif-command-metadata.test.ts
  • src/lib/cli/oclif-dispatch.ts
  • src/lib/cli/oclif-runner.ts
  • src/lib/cli/public-oclif-help.ts
  • src/lib/cli/terminal-style.test.ts
  • src/lib/cli/terminal-style.ts
  • src/lib/commands/credentials.test.ts
  • src/lib/commands/credentials/common.ts
  • src/lib/commands/credentials/list.ts
  • src/lib/commands/credentials/reset.ts
  • src/lib/commands/debug.ts
  • src/lib/commands/deprecated/start.ts
  • src/lib/commands/deprecated/stop.ts
  • src/lib/commands/sandbox/config/get.ts
  • src/lib/commands/sandbox/connect.ts
  • src/lib/commands/sandbox/logs.ts
  • src/lib/commands/sandbox/shields/down.ts
  • src/lib/commands/simple-global-oclif-adapters.test.ts
  • src/lib/commands/uninstall.ts
  • src/lib/core/errno.test.ts
  • src/lib/core/errno.ts
  • src/lib/core/json-types.ts
  • src/lib/core/ports.test.ts
  • src/lib/core/ports.ts
  • src/lib/core/shell-quote.ts
  • src/lib/core/url-utils.test.ts
  • src/lib/core/url-utils.ts
  • src/lib/core/version.test.ts
  • src/lib/core/version.ts
  • src/lib/core/wait.ts
  • src/lib/coverage-hotspots.test.ts
  • src/lib/credentials/store.ts
  • src/lib/dashboard/contract.ts
  • src/lib/deploy.ts
  • src/lib/diagnostics/debug.ts
  • src/lib/host-artifact-cleanup.ts
  • src/lib/http-probe.ts
  • src/lib/inventory-commands.ts
  • src/lib/local-inference.ts
  • src/lib/model-prompts.ts
  • src/lib/nim.ts
  • src/lib/onboard-command.ts
  • src/lib/onboard-inference-probes.ts
  • src/lib/onboard-ollama-proxy.ts
  • src/lib/onboard-providers.ts
  • src/lib/onboard-session.ts
  • src/lib/onboard-vllm.ts
  • src/lib/onboard-windows-ollama.ts
  • src/lib/onboard.ts
  • src/lib/policies.ts
  • src/lib/preflight.ts
  • src/lib/provider-models.ts
  • src/lib/runner.ts
  • src/lib/sandbox-channels.ts
  • src/lib/sandbox-config.ts
  • src/lib/security/credential-filter.test.ts
  • src/lib/security/credential-filter.ts
  • src/lib/security/credential-hash.ts
  • src/lib/security/redact.ts
  • src/lib/security/secret-patterns.ts
  • src/lib/services.ts
  • src/lib/share-command-deps.ts
  • src/lib/shields/audit.ts
  • src/lib/state/config-io.ts
  • src/lib/state/registry.ts
  • src/lib/state/sandbox.ts
  • src/lib/usage-notice.ts
  • src/lib/validation-recovery.ts
  • src/nemoclaw.ts
  • test/canonical-credential-resolution.test.ts
  • test/credentials.test.ts
  • test/e2e/test-credential-migration.sh
  • test/gateway-start-wait.test.ts
  • test/host-artifact-cleanup.test.ts
  • test/image-cleanup.test.ts
  • test/ollama-tools-capability.test.ts
  • test/onboard-preset-diff.test.ts
  • test/onboard-prompt-default-case.test.ts
  • test/onboard-selection.test.ts
  • test/onboard.test.ts
  • test/policies.test.ts
  • test/policy-tiers-onboard.test.ts
  • test/presets-checkbox.test.ts
  • test/runner.test.ts
  • test/secret-redaction.test.ts
  • test/shellquote-sandbox.test.ts
  • test/wait.test.ts

Comment thread src/lib/core/version.ts Outdated
@cv cv merged commit 9a897c5 into main May 7, 2026
19 checks passed
jyaunches pushed a commit that referenced this pull request May 8, 2026
## Summary
- Bump the docs release metadata to `0.0.37`.
- Document release-prep updates for messaging policy presets, sandbox
runtime utilities, and the GPU CDI troubleshooting path.
- Refresh generated `nemoclaw-user-*` skills from the updated docs.

## Source summary
- #3159 -> `docs/reference/troubleshooting.md`: Documents the GPU CDI
preflight warning and remediation for `nvidia.com/gpu=all` gateway start
failures.
- #2415 -> `docs/reference/network-policies.md`,
`docs/manage-sandboxes/messaging-channels.md`,
`docs/network-policy/customize-network-policy.md`: Clarifies that
Telegram, Discord, and Slack egress comes from opt-in messaging presets,
not the baseline policy.
- #3091 -> `docs/deployment/sandbox-hardening.md`,
`docs/network-policy/customize-network-policy.md`: Documents the
retained sandbox utilities `vi`, `jq`, and `dos2unix` while keeping
host-side policy files as the durable source of truth.

## Test plan
- `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix
nemoclaw-user`
- `make docs`
- `npm run build:cli`
- `npm run typecheck:cli`
- Commit and pre-push hooks: markdownlint, docs-to-skills verification,
gitleaks, commitlint, CLI typecheck

## Skipped
- #3193 and #3191 matched `docs/.docs-skip` entries for experimental
shields/config paths.
- #3200 and #3183 were test-only fixes.
- #3189 and #3163 were internal documentation/refactor changes with no
public docs impact.

Made with [Cursor](https://cursor.com)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Clarified which utilities remain in the sandbox runtime for
lightweight inspection and cleanup
* Noted that messaging endpoints (Discord, Slack, Telegram) are not in
the baseline policy and that channel presets are applied during
onboarding
  * Added GPU passthrough troubleshooting for gateway startup
* Updated release/version bump and release-prep workflow guidance,
including Discord preset description updates
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@cv cv deleted the refactor/lib-core-security branch May 27, 2026 21:17
@wscurran wscurran added the refactor PR restructures code without intended behavior change label Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

refactor PR restructures code without intended behavior change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants