Guides

Permissions

How a tool call is gated, what the four answers mean, and where an “always” answer is written down.

The prompt

In ask mode, a tool call that no rule already allows stops the turn and takes the keyboard:

 the turn is waiting on you
 Bash wants to run
   “cargo clippy --workspace --all-targets”

 y allow · n deny · a always · p this target
Key Answer
y, Enter Allow this call
n, Esc Deny it. The denial is shown in the timeline, so a turn that went nowhere is not a mystery
a Allow it, and every call to that tool from now on
p Allow it, and every call to that tool on the same target from now on

Shift+Tab cycles between plan (nothing runs), ask (this prompt) and auto (the backend decides). The status line always names the mode in force.

Standing answers

An “always” answer is written into this repository’s .niobe/config.toml as a rule, and answers the same prompt in every later session:

[permissions]
allow = ["Read", "Bash(cargo test)"]
  • A bare tool name allows every call to it.
  • A name and a target allow that target alone.
  • A target ending in * matches by prefix — Bash(cargo *).

Only you write a *. When Niobe records an answer it stores the target exactly as it stood; it never widens a rule into a guess at what else you meant. Editing the file by hand is how a rule becomes a pattern.

The user’s config and the repository’s both apply, and a rule in either allows the call.

Why the write is safe

The write Niobe makes when you answer “always” is its own: it splices one string into the allow array at the byte range the parser recorded, so your comments and your ordering survive, and it can add no env, no args, no settings and no auth_refresh. A repository config you had trusted stays trusted across it — see Trust.

Taking a rule back

Delete the line. There is no command for it because there is no state anywhere else: the file is the whole of it.

This page describes v0.4.0.