Skip to main content
Symbiotic Code supports a layered permission configuration that controls whether the AI can run bash commands, edit files, read files, or use any other tool without prompting you every time.

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 rule is either:
  • 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
You can also set "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 both ls and ls -la.
  • Path patterns starting with ~/ or $HOME/ are expanded to your home directory.
Rules are evaluated in order, with the last matching rule winning. Put broad rules first and more specific overrides after them. If no rule matches, the action is 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:
What happens:

2. Allow safe git commands, deny destructive ones

What happens:
Order matters. If "git *": "allow" were placed after "git commit *": "deny", it would match last and allow git commit.
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

No prompts, including for files outside the project. Useful for trusted personal projects.

4. Lock down everything, full review mode

Every command, file change, and web request requires your approval.

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:
Effective config:

“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 *:
Approving rm -rf dist/ always allows every rm command. Choose Allow once for destructive commands.
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 editing symbiotic.json or .symbiotic/symbiotic.json for permission changes to take effect.

File locations

Recommendations
  • Commit symbiotic.json with team-wide defaults
  • Use your global config for personal preferences
  • Use SYMBIOTIC_PERMISSION for one-off overrides, for example SYMBIOTIC_PERMISSION='{"bash":"deny"}' symbiotic