diff --git a/docs/cli/features/profiles-groups.mdx b/docs/cli/features/profiles-groups.mdx index 198e2cfd6..9189a7b6e 100644 --- a/docs/cli/features/profiles-groups.mdx +++ b/docs/cli/features/profiles-groups.mdx @@ -650,52 +650,65 @@ Groups use a structured allow/deny taxonomy: ### Built-in Groups -nono ships with 32 built-in groups: - **Deny groups** (block sensitive content): -- `deny_credentials` - SSH keys, cloud credentials, GPG keys, container and package manager tokens -- `deny_keychains_macos` - macOS Keychain databases, 1Password, password-store -- `deny_keychains_linux` - Linux keyring, 1Password, password-store -- `deny_browser_data_macos` - Browser data on macOS (Chrome, Firefox, Safari, Edge, Arc, Brave) -- `deny_browser_data_linux` - Browser data on Linux (Chrome, Firefox, Edge, Brave) -- `deny_macos_private` - macOS Messages, Mail, Cookies, MobileSync -- `deny_shell_history` - Shell history files (.bash_history, .zsh_history, .python_history) -- `deny_shell_configs` - Shell config files that may contain API keys (.bashrc, .zshrc, .profile, .env) +- `deny_credentials` — SSH keys, cloud credentials, GPG keys, container and package manager tokens +- `deny_keychains_macos` — macOS Keychain databases, 1Password, password-store +- `deny_keychains_linux` — Linux keyring, 1Password, password-store +- `deny_browser_data_macos` — Browser data on macOS (Chrome, Firefox, Safari, Edge, Arc, Brave) +- `deny_browser_data_linux` — Browser data on Linux (Chrome, Firefox, Edge, Brave) +- `deny_macos_private` — macOS Messages, Mail, Cookies, MobileSync +- `deny_shell_history` — Shell history files (.bash_history, .zsh_history, .python_history) +- `deny_shell_configs` — Shell config files that may contain API keys (.bashrc, .zshrc, .profile, .env) **Protection groups**: -- `unlink_protection` - Prevents file deletion, with override for user-writable paths -- `dangerous_commands` - Blocks `rm`, `dd`, `chmod`, `sudo`, `mkfs`, `pip`, `npm`, `kill`, etc. -- `dangerous_commands_macos` - macOS-specific: `srm`, `brew`, `launchctl` -- `dangerous_commands_linux` - Linux-specific: `shred`, `mkfs.*`, `fdisk`, `systemctl`, `apt`, `yum`, `dnf`, `pacman` +- `unlink_protection` — Prevents file deletion, with override for user-writable paths +- `dangerous_commands` — Blocks `rm`, `dd`, `chmod`, `sudo`, `mkfs`, `pip`, `npm`, `kill`, etc. +- `dangerous_commands_macos` — macOS-specific: `srm`, `brew`, `launchctl` +- `dangerous_commands_linux` — Linux-specific: `shred`, `mkfs.*`, `fdisk`, `systemctl`, `apt`, `yum`, `dnf`, `pacman` **System path groups** (grant necessary system access): -- `system_read_macos` - macOS system libraries, frameworks, dyld cache -- `system_read_linux` - Linux system libraries, locale data -- `system_write_macos` - macOS temp directories, cache paths -- `system_write_linux` - Linux temp directories +- `system_read_macos` — macOS system libraries, frameworks, dyld cache +- `system_read_linux_core` — Linux core system libraries, locale data, /dev/, /proc/self +- `system_write_macos` — macOS temp directories, cache paths +- `system_write_linux` — Linux temp directories +- `linux_runtime_state` — Linux runtime state paths (/run, /var/run) +- `linux_sysfs_read` — Linux sysfs paths for kernel and device state (/sys) +- `linux_temp_read` — Linux shared temporary directory read access (/tmp) **Cache groups** (user-level caches and state): -- `user_caches_macos` - ~/Library/Caches, ~/Library/Logs, ~/Library/Preferences -- `user_caches_linux` - ~/.cache, ~/.local/state +- `user_caches_macos` — ~/Library/Caches, ~/Library/Logs, ~/Library/Preferences +- `user_caches_linux` — ~/.cache +- `claude_cache_linux` — ~/.cache/claude-cli-nodejs **Runtime groups** (language toolchain paths): -- `node_runtime` - nvm, fnm, npm, pnpm, volta -- `rust_runtime` - rustup, cargo -- `python_runtime` - pyenv, conda, pip, uv -- `go_runtime` - ~/go, /usr/local/go -- `java_runtime` - SDKMAN (~/.sdkman), Maven (~/.m2/repository, ~/.m2/wrapper), Gradle (~/.gradle/caches, ~/.gradle/wrapper) -- `nix_runtime` - Nix profile paths, /nix/store, /nix/var (Linux only) -- `user_tools` - Local bins, .desktop files, man pages, shell completions -- `homebrew` - /opt/homebrew, /usr/local/Cellar, /usr/local/opt (macOS only) +- `node_runtime` — nvm, fnm, npm, pnpm +- `rust_runtime` — rustup, cargo +- `python_runtime` — pyenv, conda, pip, uv +- `go_runtime` — ~/go, /usr/local/go +- `go_runtime_linux` — Go build cache on Linux (~/.cache/go-build) +- `go_runtime_macos` — Go build cache on macOS (~/Library/Caches/go-build) +- `java_runtime` — SDKMAN (~/.sdkman), Maven (~/.m2), Gradle (~/.gradle) +- `nix_runtime` — Nix profile paths, /nix/store, /nix/var +- `user_tools` — ~/.local/bin, .desktop files, man pages, shell completions +- `homebrew_macos` — /opt/homebrew, /usr/local/Cellar, /usr/local/opt (macOS only) +- `homebrew_linux` — /home/linuxbrew/.linuxbrew (Linux only) +- `mise_manager` — Mise dev tools, env vars, task runner +- `bun_runtime` — Bun runtime (~/.bun) **Tool-specific groups** (paths for specific applications): -- `claude_code_macos` - macOS Keychain for Claude Code credential storage -- `claude_code_linux` - ~/.local/share/claude -- `claude_cache_linux` - ~/.cache/claude-cli-nodejs -- `codex_macos` - macOS Keychain for Codex credential storage -- `opencode_linux` - ~/.opencode/bin (Linux only, needed for Landlock exec) -- `vscode_macos` - ~/.vscode, ~/Library/Application Support/Code -- `vscode_linux` - ~/.vscode, ~/.config/Code +- `claude_code_macos` — macOS Keychain for Claude Code credential storage +- `claude_code_linux` — ~/.local/share/claude +- `codex_macos` — macOS Keychain for Codex credential storage +- `opencode_linux` — ~/.opencode/bin (Linux only, needed for Landlock exec) +- `vscode_macos` — ~/.vscode, ~/Library/Application Support/Code +- `vscode_linux` — ~/.vscode, ~/.config/Code + +**Application config groups** (profile and configuration files): +- `git_config` — Read access to git configuration files (~/.gitconfig, ~/.config/git/) + + + Group definitions are located in `crates/nono-cli/data/policy.json`. You can inspect them to see the exact rules applied by each group. + Command blocking is a best-effort surface-level control. It matches against the executable name being invoked directly. A process can bypass this by calling the equivalent syscall from within an allowed interpreter (e.g., `os.remove()` in Python, `fs.unlinkSync()` in Node.js) or by invoking a renamed copy of the binary. For hard filesystem protection, rely on the kernel-enforced deny groups and `unlink_protection`, which cannot be bypassed from userspace regardless of how the operation is invoked. @@ -735,7 +748,7 @@ Platform-specific groups use `_macos` or `_linux` suffixes by convention. The base profile that all other profiles extend. Provides system path access, deny groups for sensitive content, and deprecated startup-only command gating. Does not grant working directory access or any user-specific paths. -**Groups:** `deny_credentials`, `deny_keychains_macos`, `deny_keychains_linux`, `deny_browser_data_macos`, `deny_browser_data_linux`, `deny_macos_private`, `deny_shell_history`, `deny_shell_configs`, `system_read_macos`, `system_read_linux`, `system_write_macos`, `system_write_linux`, `user_tools`, `homebrew`, `dangerous_commands`, `dangerous_commands_macos`, `dangerous_commands_linux` +**Groups:** `deny_credentials`, `deny_keychains_macos`, `deny_keychains_linux`, `deny_browser_data_macos`, `deny_browser_data_linux`, `deny_macos_private`, `deny_shell_history`, `deny_shell_configs`, `system_read_macos`, `system_read_linux_core`, `system_write_macos`, `system_write_linux`, `user_tools`, `homebrew_macos`, `homebrew_linux`, `dangerous_commands`, `dangerous_commands_macos`, `dangerous_commands_linux` **Network:** Allowed