It is not broken and it is not learning. Nothing has told it that command is allowed, so it asks every time — forever.
Last updated: 2026-09-20
Claude Code asks before it runs a shell command. When you approve one, that approval covers that run — it is not remembered for next time and it is not remembered tomorrow. If nothing in a settings file says npm test is allowed, you will be asked about npm test for the rest of your life.
So the prompts are not a sign that something is misconfigured. They are a sign that nothing is configured.
Create .claude/settings.json at the root of your project:
{
"permissions": {
"allow": [
"Bash(git status)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(npm test:*)",
"Bash(npm run lint:*)",
"Bash(npm install)"
],
"deny": [
"Bash(rm -rf:*)",
"Bash(git push --force:*)",
"Read(./.env*)"
]
}
}
Restart Claude Code. The prompts for those commands stop.
| Symptom | Cause | Fix |
|---|---|---|
Still prompts for npm test -- --watch | Bash(npm test) matches that exact string only | Use Bash(npm test:*) — the :* covers arguments |
| Nothing changed at all | Edited the wrong settings file, or the JSON has a trailing comma and silently fails to parse | Confirm the path is .claude/settings.json in this project, then check it parses |
| Works for you, not your teammate | The rules are in settings.local.json, which is personal and usually gitignored | Move shared rules into settings.json and commit it |
An allowlist is worth having because it lets you stop reading the prompts. That is only safe if the prompts you would want to read are still there. Allow the boring, repeated, read-only things. Leave deletes, force-pushes and anything that reads .env outside it.
A blanket allow-all turns a safety feature into decoration, and you will not notice until the day it matters.
The free starter repo has a settings file with both lists already filled in, plus the CLAUDE.md that fixes the other week-one problem — see Claude Code forgets my project every session.
Flat prices, written scope, stop at any rung. No call to book, no retainer.
| Rung | What you get | Clock |
|---|---|---|
| Free — starter repo | A real setup you copy yourself | now |
| $29 — Setup Lite | One project: CLAUDE.md, allowlist, one skill, as a pull request you review | 24 hours |
| $99 — Setup Sprint | 3–5 skills, hooks, up to 3 MCP servers, plus a runbook | 48 hours |
| $79 — Surface Audit | Already set up and still fighting it: contradictions and an exact fix list | 48 hours |
Clocks run from a complete intake, not from the Stripe receipt.