Skip to content

Add ncl groups config add-mount / remove-mount#2432

Open
jumprope-jesse wants to merge 4 commits into
nanocoai:mainfrom
distillery-labs:feat/cli-add-remove-mount
Open

Add ncl groups config add-mount / remove-mount#2432
jumprope-jesse wants to merge 4 commits into
nanocoai:mainfrom
distillery-labs:feat/cli-add-remove-mount

Conversation

@jumprope-jesse
Copy link
Copy Markdown

Summary

Adds two CLI verbs — ncl groups config add-mount and ncl groups config remove-mount — so additional bind mounts can be managed through the standard approval flow instead of requiring direct edits to container.json or the container_configs DB row.

Patterned on the existing config add-mcp-server / config add-package handlers. Validation is delegated to validateMount from src/modules/mount-security/index.ts — the same function the container runner uses at spawn time — so operators get the accept/reject decision (and reason string) at approval time instead of silently at next restart.

  • Read-only by default; --writable opts into RW (subject to the host-allowlist root's allowReadWrite).
  • Duplicate containerPath is a hard error (explicit beats silent replace).
  • Returns effective_readonly, resolved_host_path, and the full mounts array for parity with add-mcp-server.

Test plan

  • ncl groups config add-mount --id <group> --host-path <allowlisted-path> --container-path foo — succeeds; config get shows the new mount.
  • Same with --writable on a root that allows RW — effective_readonly: false in response.
  • Same with --writable on a root that disallows RW — stored as readonly: false but effective_readonly: true returned.
  • --container-path /workspace/agent/foo — rejected by validateMount (absolute path).
  • --container-path ../foo — rejected (..).
  • --host-path /nonexistent — rejected with allowlist/existence reason.
  • Duplicate --container-path — rejected with clear message.
  • remove-mount with unknown containerPath — rejected.
  • After add + ncl groups restart, the mount appears in the running container at /workspace/extra/<containerPath>.

jesolsen and others added 4 commits May 11, 2026 22:50
Channel-adapter installs from the channels branch:
- src/channels/telegram.ts (+ markdown sanitizer + pairing helper, with tests)
- src/channels/slack.ts
- Wire both into src/channels/index.ts
- Add @chat-adapter/telegram + @chat-adapter/slack deps; bump chat to 4.27.0

Also drop the legacy groups/global/CLAUDE.md and groups/main/CLAUDE.md
(replaced by per-group CLAUDE.local.md under the new convention).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the local monitoring dashboard installed via /add-dashboard:
- src/dashboard-pusher.ts collects agent-group / session / channel /
  user / token / context-window / activity / messages snapshots and
  POSTs them to the dashboard, plus tails logs/nanoclaw.log.
- Optional dashboard block in src/index.ts boots both the dashboard
  HTTP server and the pusher when DASHBOARD_SECRET is set.
- Imports use the actual repo paths (modules/agent-to-agent, modules/permissions)
  rather than the skill recipe's assumed src/db/ shortcuts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patterned on add-mcp-server / add-package. Validation delegated to
validateMount (modules/mount-security) — the same function the runner
uses at spawn time — so operators get the accept/reject decision at
approval time instead of silently at next restart.

Read-only by default; --writable opts into RW (subject to the
host-allowlist root's allowReadWrite).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants