Defaults
With no configuration, most tools are allowed without prompting. The exceptions are:
Built-in agents add their own restrictions on top, for example the
plan agent denies edits and the ask agent only allows read-only tools. See Agents.
In non-interactive mode (
symbiotic run), any permission that resolves to ask is automatically rejected.Load order
Configs are deep-merged. Later sources win.
Per-agent
permission rules (in agent.<name>.permission or in the agent’s markdown frontmatter) are applied after the global permission rules, so they win for that agent. See Custom agents.
Config schema
symbiotic.json
- A string:
"allow","ask", or"deny", which applies to all inputs - A pattern map:
{ "<pattern>": "allow" | "ask" | "deny", ... }, evaluated in order; the last matching pattern wins
"permission": "ask" (or allow/deny) to apply one action to every tool.
Permission keys
Any other tool name is also accepted as a key, including custom tools and MCP tools (for example
github_create_issue). Keys support wildcards too, for example "github_*": "deny" or "*": "ask".
There is no separate
write permission: file writes use the edit key. The legacy tools option ("tools": { "bash": false }) is still accepted and converted to deny/allow rules; write, patch, and multiedit map to edit.Pattern matching
- A pattern ending in
*also matches the command without arguments:ls *matches bothlsandls -la. - Path patterns starting with
~/or$HOME/are expanded to your home directory.
ask.
Removed tools
If the last rule for a tool is"*": "deny" (or the string "deny"), the tool is removed from the list of tools sent to the model, so the agent doesn’t try to use it.
Examples
1. Deny all bash, ask for edits, auto-allow src/
.symbiotic/symbiotic.json:
2. Allow safe git commands, deny destructive ones
Compound commands (
&&, ||, ;, |) are split into individual commands and each one is checked. The command is denied if any part is denied, and only runs without a prompt if every part is allowed.
3. Trust the whole project, allow everything
4. Lock down everything, full review mode
Deep merge behavior
When multiple sources define rules for the same tool, pattern maps are merged (a key redefined later keeps its original position but takes the new action; new keys are added at the end), and string rules replace entirely. Example:symbiotic.json defines bash rules, .symbiotic/symbiotic.json adds more specific ones:
symbiotic.json:
.symbiotic/symbiotic.json:
“Allow always”
When you choose Allow always at a permission prompt in the TUI, the approval applies to the current project until Symbiotic Code is restarted. Other pending requests covered by the approval are resolved automatically. To make an approval permanent, add the rule to your config. In the IDE extension, approved and denied patterns are saved to your global config file in~/.config/symbiotic/.
Which patterns are approved
For bash commands, the approved pattern is the command’s “human-understandable” prefix followed by *:
For most other tools (including
edit, read, and webfetch), Allow always approves the tool for all inputs. For external_directory, it approves the requested directory. For skill, it approves that skill.
Config changes
Config files are read when Symbiotic Code starts. Restart it after editingsymbiotic.json or .symbiotic/symbiotic.json for permission changes to take effect.