Claude Code の permissions 設定例、npm scripts は自動・git push は確認・force push は禁止にする

Claude Code 公開:

Claude Code の permissions を allow・ask・deny の 3 層で組む実例です。npm run 系を確認なしにする allow、git push の直前だけ止める ask、force push を表記ゆれごと禁止する deny を 1 つにまとめます。

検証日 2026年10月10日 仕様変更が早い分野です。最新の公式ドキュメントも併せてご確認ください。 記事の作り方と検証手順
目次
  1. 完成形の設定
  2. 1. npm scripts を自動許可する(allow)
    1. パッケージマネージャー別のパターン
    2. Python プロジェクトの場合
  3. 2. git push だけ毎回確認する(ask)
    1. 特定のブランチだけ自動にしたい場合
  4. 3. force push を禁止する(deny)
  5. 動作を確認する
  6. 関連する設定
  7. まとめ

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 推奨)
npmBash(npm run:*)Bash(npm install:*)、Bash(npm i:*)
pnpmBash(pnpm run:*)、Bash(pnpm test)、Bash(pnpm lint)Bash(pnpm add:*)、Bash(pnpm install:*)
yarnBash(yarn run:*)、Bash(yarn test)Bash(yarn add:*)、Bash(yarn install)
bunBash(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 mainBash(git push --force:*)
git push -f origin mainBash(git push -f:*)
git push origin main --forceBash(git push * --force:*)
git push --force-with-leaseBash(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:*)"]
  }
}

動作を確認する

  1. 設定を保存して Claude Code を再起動します。
  2. /permissions を実行し、allow・ask・deny の各一覧に書いた行と、読み込み元のファイルが表示されることを確認します。
  3. 「テストを実行して」と指示し、npm run test が確認なしで走れば allow が効いています。
  4. 「lodash を追加して」と指示し、npm install lodash で確認が出れば ask が効いています。
  5. 「コミットして push して」と指示し、コミットは進み push の直前でダイアログが出れば成功です。
  6. 「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 が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。