When Claude Code’s Politeness Slows Down Your Workflow
After more than a month of living and breathing Claude Code CLI to handle tough tasks—like converting 50 React Class Components to Functional Hooks—I’ve realized one thing: the safer the AI, the more intrusive it can sometimes become. That feeling when you’re in the zone refactoring, but every 30 seconds the terminal pops up with: “Do I have permission to read this file?”, “Shall I run the test command?” is a true test of patience.
It feels reassuring at first, but once you’re in the flow, having to repeatedly press y is incredibly frustrating. Not to mention, every time you start a new session, you have to remind it again and again: “Use ES6 standards” or “Exclude the build folder.” This is a clear sign that you’re wasting the configuration file—the very thing that can skyrocket your efficiency if you know how to customize it properly.
Why Is Claude Code So Hesitant?
The reason Anthropic designed it this way is very practical: They don’t want you to lose your source code. By default, Claude Code operates on a “Zero Trust” philosophy. It has no permission to interfere deeply with your system unless you give it the nod. This mechanism protects your project from cringeworthy situations like the AI accidentally running rm -rf / or misreading files containing sensitive secret keys.
However, the default configuration is just for beginners. To turn Claude into a powerful partner in a professional workflow, you need to define the “ground rules.” Without a configuration file, Claude Code will:
- Forget all coding style rules as soon as the terminal is closed.
- Force you to confirm even basic commands like
lsorcat. - Fail to auto-run Prettier or Linters after editing code, leaving you with manual cleanup.
Mastering Settings.json: High-Value Configurations
To make deep changes, open the settings.json file. On Linux/macOS, it’s located at ~/.claude/settings.json. You can open it quickly using the claude config command right in your terminal.
1. Permission Configuration: Balancing Convenience and Security
This is the area that saves you from being a “yes-button robot.” I usually categorize permissions as follows:
{
"permissions": {
"autoApprove": {
"read": true,
"write": false,
"execute": [
"ls",
"git status",
"npm test",
"jest --onlyChanged"
]
}
}
}
Hard-learned lesson: I always set read: true so Claude can grasp the project context as quickly as possible. For write, I stick with false because I want to manually inspect the git diff before saving. For execute, only auto-approve commands that read data or run tests. Absolutely never add deploy or push commands to this list.
2. Hooks: Automating Repetitive Tasks
Hooks are a game-changing feature that can save you at least 15-20 minutes a day. They allow you to execute commands automatically BEFORE or AFTER Claude performs a task. For example, I always want my code perfectly formatted after an AI edit.
{
"hooks": {
"postEdit": "npx eslint --fix . && npx prettier --write .",
"onSessionStart": "git pull origin main"
}
}
With this setup, the machine automatically runs Lint and Prettier as soon as Claude finishes editing. The code stays clean without me having to say a word. I’ve applied this to large React projects and saved a ton of time reviewing trivial formatting mistakes.
3. Behavior: Teaching the AI How to Act
This section helps Claude understand its role. You can force it to use a specific model to optimize costs or set a fixed response language.
{
"behavior": {
"preferredLanguage": "English",
"defaultModel": "claude-3-5-sonnet",
"alwaysIncludeContext": ["architecture.md", "package.json"]
}
}
Pro-tip: Keeping package.json in the context ensures Claude never suggests obscure libraries or the wrong versions for your current project.
Standard Configuration Template for Developers
If you don’t want to tinker from scratch, feel free to copy the template I’ve refined through many real-world projects. It’s flexible enough for speed but safe enough to avoid disasters.
{
"version": "1.0",
"permissions": {
"autoApprove": {
"read": true,
"write": false,
"execute": ["ls", "grep", "npm test", "vitest"]
}
},
"behavior": {
"style": "concise",
"maxHistoryMessages": 30
},
"hooks": {
"onSessionStart": "npm install --dry-run"
}
}
Final word of advice: No matter how much you trust your configuration, never forget to review your git diff. The settings.json file is meant to be an assistant, not a substitute for an engineer’s diligence. Happy workflow upgrading!

