Claude Code の permissions 設定例、npm scripts は自動・git push は確認・force push は禁止にする
Claude Code の permissions を allow・ask・deny の 3 層で組む実例です。npm run 系を確認なしにする allow、git push の直前だけ止める ask、force push を表記ゆれごと禁止する deny を 1 つにまとめます。
目次
Claude Code に開発を任せるとき、多くの人が欲しいのは次の 3 つの線引きです。npm run lint や npm run test のような自分で書いた scripts は確認なしで走らせたい。git push はリモートに影響するので、直前に一度だけ自分で確認したい。git push --force は何があっても実行させたくない。
この 3 つは、settings.json の permissions を allow・ask・deny の 3 層で書けば 1 つの設定で実現できます。この記事では完成形を先に示し、各層の書き方と落とし穴を順に説明します。
KEY POINT
この記事で分かること
- allow・ask・deny を組み合わせた settings.json の完成形
:*の前方一致の意味と、install 系を巻き込まない書き方- ask が allow より強い理由と、「今後も許可」を選んでも確認が続く仕組み
- force push の表記ゆれ(
-f、--force-with-lease、オプション順)を deny で押さえる方法
完成形の設定
プロジェクトの .claude/settings.json に次を書きます。チームで共有する前提の内容です。
{
"permissions": {
"allow": [
"Bash(npm run:*)",
"Bash(npm test)",
"Bash(npx tsc:*)",
"Bash(npx vitest:*)",
"Bash(npx eslint:*)",
"Bash(npx prettier:*)",
"Bash(git status)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git add:*)",
"Bash(git commit:*)"
],
"ask": [
"Bash(git push:*)",
"Bash(npm install:*)",
"Bash(npm i:*)",
"Bash(npm uninstall:*)"
],
"deny": [
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git push --force-with-lease:*)",
"Bash(git push * --force:*)"
]
}
}
この設定で、scripts と Git の読み取り・コミットは確認なしで進み、git push と npm install のときだけダイアログが出て、force push は拒否されます。
用語解説
ルールの評価順: ルールは deny → ask → allow の順に評価され、先に一致したものが結果を決めます。ルールの具体性で順序が変わることはありません。Bash(git:*) を allow に書いていても、ask に Bash(git push:*) があれば push は確認され、deny に一致すればどのモードでも実行されません。
1. npm scripts を自動許可する(allow)
Bash(npm run:*) の :* は「npm run で始まり、その後に何が続いてもよい」という前方一致です。npm run test -- --watch のような引数付きにも一致します。npm install は npm run とは先頭が違うので、このルールには含まれません。
npx は任意のパッケージを実行できるため、全体ではなくよく使うものだけを個別に allow しています。ここで Bash(npx:*) を ask に入れてはいけません。ask は allow より先に評価されるので、allow に書いた npx tsc まで確認されるようになります。「個別に許可したものだけ自動、それ以外の npx は既定の挙動」にしたいなら、ask には書かずに置きます。
パッケージマネージャー別のパターン
| ツール | scripts の実行 | install 系(ask 推奨) |
|---|---|---|
| npm | Bash(npm run:*) | Bash(npm install:*)、Bash(npm i:*) |
| pnpm | Bash(pnpm run:*)、Bash(pnpm test)、Bash(pnpm lint) | Bash(pnpm add:*)、Bash(pnpm install:*) |
| yarn | Bash(yarn run:*)、Bash(yarn test) | Bash(yarn add:*)、Bash(yarn install) |
| bun | Bash(bun run:*) | Bash(bun add:*)、Bash(bun install:*) |
pnpm と yarn は pnpm lint のように run を省略できます。よく使う scripts を個別に書くか、Bash(pnpm:*) で全体を許可して install 系を ask で止めます。ask が先に評価されるので、この組み合わせは安全です。
{
"permissions": {
"allow": ["Bash(pnpm:*)"],
"ask": ["Bash(pnpm add:*)", "Bash(pnpm install:*)", "Bash(pnpm remove:*)"]
}
}
Python プロジェクトの場合
{
"permissions": {
"allow": ["Bash(pytest:*)", "Bash(python -m pytest:*)", "Bash(ruff:*)", "Bash(mypy:*)", "Bash(uv run:*)"],
"ask": ["Bash(pip install:*)", "Bash(uv add:*)"]
}
}
2. git push だけ毎回確認する(ask)
ask は「allow に一致していても必ず確認する」ためのルールです。Git の読み取り系とコミットを allow で自動化しつつ、Bash(git push:*) を ask に置けば push の直前だけ止まります。
git push の実行時に出るダイアログの選択肢と、その後の設定への影響は次のとおりです。
| 選択肢 | 効果 |
|---|---|
| 今回だけ許可 | この 1 回だけ実行する |
| 今後も許可 | settings.local.json の allow に追記する。ただし ask のルールが残っていれば次回も確認される |
| 拒否 | 実行せず、Claude に理由を伝えられる |
「今後も許可」を選んでも確認が続くのは意図した挙動です。「push は毎回自分で見る」という方針を、うっかり 1 回の操作で解除してしまわないための仕組みとして働きます。確認をやめたいときは設定ファイルから ask の行を消します。
特定のブランチだけ自動にしたい場合
自分の作業ブランチへの push を自動にしたいなら、allow と ask の両方をブランチで限定します。
{
"permissions": {
"allow": ["Bash(git push origin feature/*:*)"],
"ask": ["Bash(git push origin main:*)", "Bash(git push origin develop:*)"]
}
}
ただしこの書き方は、Claude が git push origin feature/xxx の形でコマンドを組み立てることに依存します。git push だけで実行されるとどちらにも一致せず、defaultMode の挙動に従います。確実さを優先するなら、ブランチ限定はせず「push は常に確認」に統一する方が事故は少なくなります。
3. force push を禁止する(deny)
deny は allow と ask より常に先に評価され、bypassPermissions モードでも効きます。プロジェクトの settings.json に書いた deny は、個人の settings.local.json の allow で解除できません。チームで守らせたい禁止事項はここに書きます。
Bash のルールはコマンド文字列への一致なので、表記ゆれを個別に列挙する必要があります。
| 実行されうる形 | 一致させるパターン |
|---|---|
git push --force origin main | Bash(git push --force:*) |
git push -f origin main | Bash(git push -f:*) |
git push origin main --force | Bash(git push * --force:*) |
git push --force-with-lease | Bash(git push --force-with-lease:*) |
--force-with-lease は通常の --force より安全ですが、リモートの状態を上書きする点は同じです。チームの方針で許可するなら、この行だけ ask に移してください。
deny は保険であって壁ではない
cd repo && git push --force や、シェルスクリプト経由の実行は先頭が変わるため一致しません。本当に守りたいブランチは、GitHub のブランチ保護(force push の禁止)をリモート側で設定してください。deny はローカルでの事故を減らすための保険です。
同じ方法で、作業内容を失う他のコマンドも止められます。
{
"permissions": {
"deny": ["Bash(git reset --hard:*)", "Bash(git checkout -- .:*)", "Bash(git clean -f:*)"]
}
}
動作を確認する
- 設定を保存して Claude Code を再起動します。
/permissionsを実行し、allow・ask・deny の各一覧に書いた行と、読み込み元のファイルが表示されることを確認します。- 「テストを実行して」と指示し、
npm run testが確認なしで走れば allow が効いています。 - 「lodash を追加して」と指示し、
npm install lodashで確認が出れば ask が効いています。 - 「コミットして push して」と指示し、コミットは進み push の直前でダイアログが出れば成功です。
- 「
git push --force origin test-branchを実行して」と頼み、拒否されれば deny が効いています。
関連する設定
settings.json と settings.local.json の役割分担、スコープの優先順位、defaultMode の選び方は親記事の settings.json と settings.local.json で permissions を設計する にまとめています。.env などファイルの読み取りを禁止する書き方は Claude Code に .env を読ませない deny 設定 を参照してください。scripts を自動許可にしたうえで、編集後に lint を必ず走らせるには hooks で lint と format を自動実行する が使えます。
まとめ
- allow・ask・deny は deny → ask → allow の順に評価され、先に一致したものが結果を決める
Bash(npm run:*)で scripts をまとめて許可できる。npm installは別の先頭文字列なので巻き込まれない。pnpm や npx を全体許可するなら install 系を ask に置くBash(git push:*)を ask に書くと push の直前に必ず確認が入り、「今後も許可」を選んでも ask が残る限り続く- force push は
--force、-f、--force-with-lease、オプション順違いを deny に列挙する。deny はどのモードでも効き、個人設定で解除できない - deny は保険なので、守りたいブランチはリモートのブランチ保護も併用する
よくある質問
- Bash(npm run:*) を allow にすると npm install も自動で通りますか?
- 通りません。:* は前方一致で、npm install は npm run とは別の先頭文字列です。npm 全体を Bash(npm:*) で許可した場合だけ install も含まれるので、その場合は install 系を ask に入れてください。
- allow に git 全体、ask に git push を書いたらどちらが効きますか?
- ask です。ルールは deny → ask → allow の順に評価され、先に一致したものが結果を決めます。allow の範囲が広くても、ask に書いた git push は毎回確認されます。
- deny に書いたコマンドを Claude が別の書き方で回避することはありますか?
- あります。Bash のルールはコマンド文字列への一致なので、-f や --force-with-lease、オプションの順序違いは個別に書きます。確実に守りたいブランチはリモート側のブランチ保護も併用してください。
- 個人の settings.local.json でプロジェクトの deny を解除できますか?
- できません。deny はどのスコープに書かれていても allow と ask より先に評価されます。チームで守らせたい禁止事項はプロジェクトの .claude/settings.json の deny に書きます。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。