TL;DR Take
"defaultMode": "bypassPermissions"out of the project's.claude/settings.jsonand put it in~/.claude/settings.json, or launch withclaude --permission-mode bypassPermissions. Left in the project, it doesn't just fail: it also cancels whatever mode your user settings ask for.
Since v2.1.257, Claude Code ignores "defaultMode": "bypassPermissions" when it sits in a project's .claude/settings.json or .claude/settings.local.json. There's no error and no warning: the session starts in Manual mode and asks before every edit and every command, while your config looks untouched.
"auto" already got the same treatment in those two files. Every other value (plan, acceptEdits, default) still works from the project.
What I tested
On v2.1.284 with claude -p, changing each file and reading the permissionMode Claude Code reports at startup (--output-format stream-json --verbose):
| In the project | In ~/.claude/settings.json |
Starts in |
|---|---|---|
bypassPermissions |
nothing | default (Manual) |
bypassPermissions in settings.local.json |
nothing | default (Manual) |
bypassPermissions |
auto, plan or acceptEdits |
default (Manual) |
bypassPermissions |
bypassPermissions |
bypassPermissions |
| nothing | bypassPermissions |
bypassPermissions |
bypassPermissions, plus --permission-mode bypassPermissions or --dangerously-skip-permissions |
nothing | bypassPermissions |
Row three is the trap: the ignored project value doesn't fall back to yours, it drops you into Manual even if your user settings say auto. The only combination that survives is bypassPermissions in both places, which is why, if you already had it in your user settings too, you never noticed a thing. An interactive session shows the same: the status bar reads ⏸ manual mode on for row one and ⏵⏵ bypass permissions on for row four.
How to get it back
1. For every session: your user settings
Delete the line from the project's .claude/settings.json (and from .claude/settings.local.json, if it's there) and add it to ~/.claude/settings.json:
{
"permissions": {
"defaultMode": "bypassPermissions"
}
}
2. For one session: the flag
claude --permission-mode bypassPermissions
--dangerously-skip-permissions does exactly the same thing.
3. For specific projects: an alias
A repository can no longer turn it on by itself, so the decision moves to launch time. If you only want it in some projects, a shell alias saves you typing the flag:
alias claude-bypass='claude --permission-mode bypassPermissions'
Why the change makes sense
.claude/settings.json ships with the repository. If that file were enough, opening Claude Code inside someone else's repo would switch off every permission check without you ever choosing it. The docs give that exact reason for cloud sessions, which ignore this setting from any file. For the terminal, the changelog doesn't say why, but the effect is the same: you turn bypass mode on, not the repo.
Nothing changes in the VS Code extension, because it never read the starting mode from project settings. There you use claudeCode.initialPermissionMode in your VS Code user settings, with the Allow dangerously skip permissions toggle on.
The docs reserve this mode for containers and isolated VMs. If what you actually want is to stop approving dialogs, auto mode removes them with a classifier that reviews each action. The 6 permission modes are compared in another tip, and what --dangerously-skip-permissions still won't skip is in this one.
If you used bypass to stop approving every action, this guide ranks the lower-risk alternatives.
Official docs: Choose a permission mode