Feature deep-dive

Claude Code Permissions: Which Tools Ask First, and How to Allow Them

Claude Code does everything through a fixed set of built-in tools, and some of them stop and ask before they run. Here is every permission prompt from one real session, screenshot by screenshot — including the option that writes your project's allow list.

Claude Code Bash command approval for git add src/app/globals.css offering Yes, Yes and do not ask again for git add commands in the project directory, and No with feedback
The Claude Code approval prompt for a git add command — choosing option 2 is what creates the project's allow list.

An illustrated walkthrough of 13 steps - about 5 minutes to read. Every step links back to the exact moment in the source video.

TL;DR

Claude Code works through built-in tools - Read for files, Edit for changes, Bash for commands - and you never name them in a prompt. Anthropic's docs mark each tool with a Permission Required flag: Read, Grep, LS and TodoWrite run silently, while Bash, Edit, MultiEdit, Write and the web tools stop and ask. An edit prompt gives three answers: Yes, Yes and don't ask again this session (alt+m), or No plus an explanation of what to do differently. Approving a Bash command through its 'don't ask again' option writes a rule such as Bash(git add:*) into permissions.allow inside .claude/settings.local.json, and that file is personal - you do not commit it. To skip prompts for the rest of a session instead, press alt+m until the indicator reads 'accept edits on'.

Source video

This page follows lesson 4 of Net Ninja's Claude Code series, which walks through the built-in tools and their permission prompts in one live session. Every screenshot links to the exact moment it appears.

Screenshots are frames from the video, credited to the creator; the write-up is our own. Steps verified against the video in September 2026.

The tools Claude Code already has

A fixed built-in set, plus the docs column that tells you which ones ask first.

  1. 1

    Anthropic's tool list marks which calls need permission

    Before you type anything, Claude Code already has a fixed set of built-in tools: Read for opening files, Edit for changing a single file, Bash for running commands, and TodoWrite for the checklists it draws while working through a task. The Claude Code settings docs list them all with a Permission Required column - Bash, Edit, MultiEdit, NotebookEdit, Write, WebFetch and WebSearch say Yes; Read, Glob, Grep, LS, NotebookRead, Task and TodoWrite say No. The same page adds that permission rules can be configured with /allowed-tools or in permission settings.

    Anthropic Claude Code settings documentation listing every built-in tool with a Permission Required column that marks Bash, Edit, MultiEdit and Write as Yes while Read, Grep, LS and TodoWrite are No
    Bash and Edit require permission; Read does not.Watch at 1:19
  2. 2

    The read goes through, the edit stops

    The difference is visible in a single screen. Claude Code read layout.tsx - 43 lines - without asking anything, then called Update on the same file and immediately stopped with 'Do you want to make this edit to layout.tsx?'. The diff is already open in the editor on the left, so what you are approving is a change you can actually look at before you approve it.

    Claude Code terminal inside VS Code where a Read of layout.tsx completed silently and the Update call right below it paused on a Do you want to make this edit to layout.tsx prompt
    Read finished silently; Update waits for an answer.Watch at 0:46

Approving file edits, one at a time

One small change to one CSS file produced three separate permission prompts.

  1. 3

    Ask for something that needs an edit

    The demo asks for one new theme variable: '@src/app/globals.css Add another theme variable to the CSS file called highlight, and make it a pastel yellow'. The @-mention pulls the file in as context, and Claude Code reads all 66 lines of it - no prompt - before it starts thinking.

    Claude Code prompt that @-mentions src/app/globals.css to add a highlight theme variable in pastel yellow, answered by a Read of 66 lines and a Pontificating status line
    An @-mention supplies the file; the Read is free.Watch at 2:02
  2. 4

    Three answers to an edit prompt

    'Do you want to make this edit to globals.css?' offers exactly three choices: 1. Yes, 2. Yes, and don't ask again this session (alt+m), and 3. No, and tell Claude what to do differently (esc). The proposed --highlight: #fef3c7 line is already showing in the editor, and the box notes the changes were opened in Visual Studio Code with 'Save file to continue...'. The author picks plain Yes here so the flow stays visible.

    Claude Code edit permission dialog for globals.css offering Yes, Yes and do not ask again this session with the alt+m shortcut, and No with an explanation, beside a diff adding --highlight: #fef3c7
    Yes, yes-for-the-session, or no-with-feedback.Watch at 2:23
  3. 5

    One file, second approval

    The first addition lands - 'Updated src/app/globals.css with 1 addition' - and Claude Code moves somewhere else in the same file, so it asks again. This is the part that surprises people: permission is granted per edit, not per file. The light-mode variable is already in; the dark-mode one is queued behind a prompt.

    Second Claude Code approval request for the same globals.css file, showing the light-mode highlight already applied and the dark-mode variable still waiting for permission
    A new hunk in the same file means a new prompt.Watch at 2:38
  4. 6

    Three grants for one small change

    After the third approval, the mapping --color-highlight: var(--highlight) goes in and Claude Code summarises the job: pastel yellow for light mode (#fef3c7) and dark mode (#fbbf24), plus the corresponding mapping in the theme section. Three yes-clicks for one CSS variable - which is exactly the friction the allow list exists to remove.

    Claude Code terminal after three separate approvals on one file, listing the added --color-highlight token mapping and summarising the pastel yellow values for light and dark mode
    Three yeses, one CSS variable.Watch at 2:56

Allowing a Bash command for the project

The second option on a Bash prompt writes settings.local.json for you.

  1. 7

    Bash inspects the repo without asking

    The next request is simply 'can you make a commit'. Claude Code calls Bash three times in a row - git status, git diff, git log --oneline -5 - and none of them stop for approval; each result is collapsed behind 'ctrl+r to expand'. It is gathering information about what changed before it touches anything, and the read-only part of the Bash tool costs you no prompts at all in this session.

    Claude Code Bash tool running git status, git diff and git log one after another with no approval prompt after a request to make a commit, each result collapsed behind ctrl+r to expand
    status, diff and log run straight through.Watch at 3:13
  2. 8

    The prompt that builds your allow list

    Then it wants to run git add src/app/globals.css, and this time it asks. The dialog shows the command itself, Claude's one-line description of it ('Stage the globals.css file with highlight theme variable'), and three options: 1. Yes, 2. Yes, and don't ask again for git add commands in D:\tutorials\sandbox\@claude\shinobi, and 3. No, and tell Claude what to do differently (esc). Notice how specific option 2 is - the command name and the project directory are both spelled out inside the option.

    Claude Code Bash command approval for git add src/app/globals.css whose second option reads Yes, and do not ask again for git add commands in the project directory
    'Don't ask again for git add commands in <project dir>'.Watch at 3:26
  3. 9

    The rule takes effect immediately

    Choosing option 2 runs the command at once and the allowance is live in the same session: git add completes with nothing but a CRLF warning from Git. The next command in the queue, git commit, still asks on its own with 'Do you want to proceed?' - the new rule covers git add and nothing else.

    Claude Code terminal where the just-allowed git add command has already run and only the following git commit still needs a Do you want to proceed answer
    git add is allowed; git commit still asks.Watch at 3:34
  4. 10

    Where that permission was written

    Picking 'don't ask again' creates .claude/settings.local.json at the project root - you can see it in the explorer next to the modified globals.css. There is nothing to configure beforehand and no template to copy: the file appears the moment you grant a standing permission, and the editor opens it straight away.

    VS Code explorer showing the .claude folder Claude Code created at the project root containing settings.local.json, next to a globals.css marked as modified
    Claude Code creates .claude/settings.local.json for you.Watch at 3:40
  5. 11

    The allow array, key by key

    The file is tiny: a permissions object holding three arrays - allow, deny and ask. The rule Claude Code wrote is the string 'Bash(git add:*)': the tool name, the command prefix, then a colon and a star meaning 'anything after this'. The empty deny and ask arrays are the same mechanism pointed the other way. You can also add entries by hand - the dialog is just a faster way to type them, and the author's point is that the list is yours to edit.

    settings.local.json in Claude Code with a permissions object whose allow array holds the rule Bash(git add:*), shown alongside empty deny and ask arrays
    permissions.allow holds Bash(git add:*).Watch at 4:10

Accept edits mode

Stop the prompts for the rest of the session, then turn them back on.

  1. 12

    Turn prompts off for the whole session

    The third way to stop being asked is a mode rather than a rule. Press alt+m - on Windows; the author notes it may be ctrl+m on a Mac - and the indicator under the input box lights up: 'accept edits on (alt+m to cycle)'. From then on Claude Code edits files in this chat without asking. It is session-scoped, so a new session starts prompting again, and it says 'to cycle' because alt+m walks through the available modes rather than flipping a single switch.

    Claude Code input area displaying the highlighted accept edits on indicator with alt+m to cycle, meaning further file edits in this session run without permission prompts
    'accept edits on (alt+m to cycle)' under the prompt.Watch at 4:22
  2. 13

    Cycle back to asking

    Press alt+m again and the indicator disappears from the input area, which is your cue that edits are back under per-change approval. Nothing about the allow list changes - the standing Bash(git add:*) rule in settings.local.json is still there and will still be there next session.

    Claude Code prompt box with the accept edits indicator gone after cycling the mode again, so file edits return to per-change approval
    Indicator gone, prompts back.Watch at 4:42

FAQ