Permission modes

IsonForge has five permission modes. Cycle them with Shift+Tab in the REPL, or set at startup with --permission-mode <mode>.

Mode Behavior
default Ask for every mutating tool. Read tools and safe bash auto-approve.
acceptEdits Auto-approve write_file and edit_file. Still ask for bash and dangerous tools.
plan Read-only. The agent literally cannot call write_file, edit_file, or bash. Server-enforced.
auto Intelligent classifier. Allow safe ops, deny dangerous, ask for gray-area.
bypassPermissions Approve everything. Same as --yolo / --dangerously-skip-permissions.

How each mode behaves

default

Dangerous commands (flagged by the internal danger detector: rm -rf, git push --force, sudo, etc.) lose the "always" option and default to No.

acceptEdits

Same as default plus:

Use when you trust the model to write code but want to vet every bash command.

plan

The agent cannot mutate. Server-side enforcement strips write_file, edit_file, and bash from the tool list before sending to the backend. The model literally cannot call them.

Useful pattern:

isonforge --permission-mode plan "refactor the auth flow"
# Review the plan + todo list. Then:
/plan off
# or restart: isonforge --continue

/plan slash inside a session toggles plan-mode-style guidance without changing the server-enforced tool filter. For the hard filter, use --permission-mode plan or Shift+Tab into it.

auto

Intelligent rule-based classifier. No prompts in the common case.

Use when you trust the model with most actions but want a hard floor against obvious destructive operations.

bypassPermissions

Approve everything. No prompts. Equivalent to --yolo.

This is the print-mode default (since there's no human to answer prompts). For interactive use, set it deliberately - Shift+Tab cycles to it, or --permission-mode bypassPermissions at startup.

Shift+Tab cycle

In the REPL, Shift+Tab cycles modes in order:

default -> acceptEdits -> plan -> auto -> bypassPermissions -> default

Tap through modes mid-task as your trust level changes. The status line shows the current mode.

Persistent rules (permissions.json)

For long-lived allow/deny patterns, write ~/.isonforge/permissions.json:

{
  "preset": "auto",
  "rules": [
    {"tool": "bash", "args_pattern": "docker compose *", "action": "allow"},
    {"tool": "bash", "args_pattern": "kubectl delete *", "action": "deny"},
    {"tool": "mcp__github__*", "action": "allow"},
    {"tool": "write_file", "action": "ask"}
  ]
}

Patterns:

Persistent rules win over preset semantics. Session permissions (via --permission-mode or Shift+Tab) win over the persisted preset.

View current rules:

/permissions

allowedTools flag

For one-off scripted runs, pass an explicit allowlist:

isonforge -p --allowedTools "read_file,search_files,web_search" "audit"

Tools listed always auto-approve. Tools not listed follow the active permission mode.

Tools that NEVER prompt

Some tools are always allowed regardless of mode (they're read-only and low-risk):

If you really want to deny these, add a deny rule in permissions.json.

Session "Yes, always"

When you pick Yes, always (this session) on a permission prompt, that tool is added to the session allowlist (in-memory). Subsequent calls auto-approve until you exit the REPL. Dangerous bash commands never offer this option - they ask every time.

Hooks override

PreToolUse hooks can return a JSON decision that overrides the permission system:

{"hookSpecificOutput": {"permissionDecision": "deny"}}

Useful for project-specific policy. See Hooks.