permission-check について
Claude Code の VS Code、CLI、プロジェクト、セッション各層の権限設定を調べる読み取り専用スキルです。上書きの競合を特定し、ホスト全体のファイルを読む前に確認を求めます。
主な機能
- 016 層の権限設定を確認
- 02モードの優先順位と上書きを判定
- 03allow と deny のルールを統合
- 04よくある設定ミスを検出
- 05無関係なホスト設定を伏せる
活用シーン
- 01権限プロンプトが出る原因の特定
- 02プロジェクト設定の bypass を診断
- 03VS Code と CLI のモードを比較
- 04古いセッションモードの調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pedrohcgs/ claude-code-my-workflow --skill permission-checkインストール後、Claude Code で/permission-checkを入力して読み込まれたか確認します。
詳細
権限チェック
目的
Claude Code が尊重するすべてのレイヤーにおける権限モードの全体像を示し、プロンプトが表示される(または表示されない)理由をユーザーがひと目で確認できるようにします。Claude Code は 6 層のスタックから権限モードを解決するため、いずれか 1 層の設定ミスが、目視ではデバッグしにくいサイレントな上書きを引き起こします。
6 つのレイヤー(優先順位:下のレイヤーが優先)
- VSCode ユーザー設定 —
~/Library/Application Support/Code/User/settings.json(macOS)、%APPDATA%/Code/User/settings.json(Windows)、~/.config/Code/User/settings.json(Linux)。キー:claudeCode.initialPermissionMode。 - VSCode ワークスペース設定 —
<repo>/.vscode/settings.json。同じキーを使用します。ユーザー設定より優先されます。 - CLI ユーザー設定 —
~/.claude/settings.json。キー:permissions.defaultMode。 - CLI プロジェクト設定 —
<repo>/.claude/settings.json。同じキーを使用します。ユーザー設定より優先されます。 - CLI プロジェクトローカル設定 —
<repo>/.claude/settings.local.json。同じキーを使用します。プロジェクト設定より優先されます。 - セッション内モード — セッション開始時にレイヤー 1〜5 から設定され、その後は
Shift+Tab(CLI)またはモードインジケーター(VS Code / Desktop)から変更できます。/permissionsで管理するのは許可/拒否ルールであり、モードではありません。セッションが終了するまで有効です。
スタックに優先する 2 つのルール(Anthropic の permission-modes ドキュメント、2026-09-26 に再確認):
- レイヤー 4 と 5 では、開始モードとして
autoまたはbypassPermissionsは適用されません。そこに設定したbypassPermissionsは無視され、ターミナルセッションは Manual(default)で開始します。そこに設定したautoは無視され、組み込みのデフォルトが適用されます。それ以外のモード値は、どのレイヤーからでも適用されます。 - VS Code 拡張機能は、開始モードの設定にレイヤー 4〜5 を読み込みません。
autoを受け付けないclaudeCode.initialPermissionModeを使用し、bypass 値を使うには拡張機能の Allow dangerously skip permissions トグルが必要です。上書き設定がない場合、Claude Code ≥ 2.1.283 は auto モードで開始します。
まず「bypass がプロジェクト設定に設定されているが、そこでは適用されない」ケースを確認し、その後、以下のセッション中の上書きを確認してください。
重要なポイント: initialPermissionMode が適用されるのはセッション開始時のみです。セッション中に切り替えた場合(または設定を変更する前にセッションを開始した場合)、ファイルレベルの設定は正しくても、実行時のモードは異なります。これと、プロジェクト設定にのみ bypass が設定されていることが、「bypass が機能しない」という混乱の主な原因です。
プライバシーに関する取り決め
ホスト全体に適用される設定ファイル(~/.claude/settings.json、VSCode ユーザー設定)には、次の情報が含まれている場合があります。
- 無関係なプロジェクトへのパスやシークレット
- このリポジトリ外で追加された API キー、トークン、プロバイダーの認証情報
- ユーザーの組織または雇用主が設定した権限ポリシー
このスキルは、多層防御を目的として設計されています。フェーズ A は自動実行され、リポジトリ内のファイルのみを読み取ります。 フェーズ B では、ユーザーが明示的に確認した場合に限り、ホスト全体に適用されるファイルを読み取ります。決して無断で読み取ることはありません。ホスト全体に適用されるレイヤーを報告する際は、permissions.*、claudeCode.*、allowDangerouslySkipPermissions に直接関係しないキーをすべて伏せてください。
プロトコル
フェーズ A:リポジトリ内のレイヤー(自動実行)
これらはすぐに読み取ってください。リポジトリにチェックインされている(またはリポジトリ内で Git に無視されている)ため、信頼境界を越えません。
VSCODE_WS="${CLAUDE_PROJECT_DIR}/.vscode/settings.json"
CLI_PROJECT="${CLAUDE_PROJECT_DIR}/.claude/settings.json"
CLI_LOCAL="${CLAUDE_PROJECT_DIR}/.claude/settings.local.json"
存在する各ファイルから、以下を抽出します。
- VSCode ワークスペース:
claudeCode.initialPermissionModeとallowDangerouslySkipPermissions(claudeCode.プレフィックスなし。claudeCode.allowDangerouslySkipPermissionsのようにプレフィックスが付いたものを見つけた場合は、無視される誤記として指摘してください) - CLI プロジェクト/プロジェクトローカル:
permissions.defaultMode、permissions.allow、permissions.deny
ファイルが見つからなくても問題ありません。エラーにせず、「存在しません」と報告してください。
上記の 2 つの優先ルールを適用し、この 3 つのレイヤーだけから解決された defaultMode を出力してください。レイヤー 4 または 5 だけにある bypassPermissions または auto は、解決されたモードではなく無視されるものとして報告してください。それだけでプロンプトが表示される理由が説明できる場合(例:.claude/settings.json にのみ bypass が設定されている場合)は、ここで終了し、診断結果と修正方法を提示してください。修正方法は、~/.claude/settings.json に移す、--permission-mode bypassPermissions を指定する、または auto モードを使う、のいずれかです。
フェーズ B:ホスト全体のレイヤー(ユーザーによる明示的な確認が必要)
フェーズ A で結論が出ない場合(例:リポジトリ内のすべてのレイヤーで bypass に一致しているのに、ユーザーにプロンプトが表示される場合)は、ユーザーに次のように尋ねてください。
「診断を完了するには、このリポジトリ外にある 2 つのファイルを読み取る必要があります。
~/.claude/settings.json(CLI のユーザーレベル設定)- VSCode のユーザー設定(macOS の場合は
~/Library/Application Support/Code/User/settings.json、Linux/Windows では異なります)これらには、無関係なパスやシークレットが含まれている可能性があります。
permissions.*、claudeCode.*、またはallowDangerouslySkipPermissionsに該当しないキーはすべて伏せます。続行しますか?」
ユーザーが確認した後に限り、次を読み取ってください。
# VSCode user (platform-dependent path; try all three)
case "$(uname -s)" in
Darwin) VSCODE_USER="${HOME}/Library/Application Support/Code/User/settings.json" ;;
Linux) VSCODE_USER="${HOME}/.config/Code/User/settings.json" ;;
MINGW*|MSYS*|CYGWIN*) VSCODE_USER="${APPDATA}/Code/User/settings.json" ;;
*) VSCODE_USER="" ;;
esac
CLI_USER="${HOME}/.claude/settings.json"
内容を報告する際は、関連するキーだけを抽出してください。
- CLI ユーザー:
permissions.defaultMode、permissions.allow、permissions.deny - VSCode ユーザー:
claudeCode.で始まるキー
ファイル全体を出力してはいけません。それ以外はすべて (other keys redacted) として伏せてください。
ステップ 2:解決された状態を算出する
解決された defaultMode は、優先順位が最も高いレイヤーで設定されている値です。次を報告してください。
defaultModeの優先順位でどのレイヤーが採用されたか。- マージされた
allowリスト(CLI の各階層の和集合)。 - マージされた
denyリスト(和集合。別の場所で許可されていても、denyがあればそのアクションはブロックされます)。 - VSCode の設定が
bypassで CLI の設定がそれ以外(またはその逆)かどうか。これは指摘すべき正当な競合です。
ステップ 3:実行時のモードを報告する
セッション中の現在のモードは、ステータスラインで確認できます(.claude/scripts/statusline.sh を参照)。ユーザーに次のように伝えてください。
「ステータスラインにモードバッジ(
[AUTO]、[BYPASS]、[PLAN]、[AUTO-EDIT]、[PROMPT])が表示されている場合、それがセッション中の現在のモードです。上記で解決されたdefaultModeと異なる場合は、セッション中に切り替え(Shift+Tab)が行われたか、上記の解決結果ですでに説明がついています。たとえば、プロジェクト設定にのみ bypass が設定されているために[PROMPT]が表示される場合です。バッジが表示されていない場合、Claude Code はモードを報告していません。Claude Code パネルのモードインジケーターで確認できます。」
ステータスラインが設定されていない場合は、警告を出して .claude/scripts/statusline.sh を案内してください。
ステップ 4:よくある失敗パターンにフラグを立てる
次の項目を確認し、該当するものを明示してください。
- プロジェクト設定だけでのバイパスまたは自動モードの設定: レイヤー 4~5 では、これらの開始モードを設定できません。そこでバイパスを設定しても、セッションは手動モードで開始します。そこで
autoを設定すると、組み込みのデフォルト(2.1.283 以降では自動モードがオン)にフォールバックします。対処方法:プロジェクトファイルから設定を削除し、ユーザー設定または CLI フラグでバイパスを設定するか、組み込みの自動モードのデフォルトを利用してください。 - レイヤー間の不一致: CLI のユーザー設定ではバイパスが指定されている一方、CLI のプロジェクトローカル設定では
defaultが指定されている場合、プロジェクトローカルのdefaultが優先されます(有効な値として扱われます)。これがプロンプトが表示される理由です。 - VSCode だけのバイパス: VSCode のレイヤーではバイパスが指定されているものの、CLI のレイヤーには指定されていない場合、ターミナル版 Claude Code では引き続きプロンプトが表示されます。拡張機能で有効にするには、Allow dangerously skip permissions をオンにする必要があります。
- 許可リストが空で、デフォルトモードが設定されている:
defaultMode: "default"かつallowが空の場合、設計どおり、すべてのツールでプロンプトが表示されます。 - 古いセッション: 設定が正しいのにユーザーからプロンプトが表示されると報告された場合、ほとんどの場合、修正前から使われているセッションが原因です。「Cmd+Shift+P → Developer: Reload Window を実行し、その後、新しい Claude Code セッションを開始してください」と案内してください。
denyが優先される:denyリスト内の一致項目は、すべてのモード(バイパスを含む)で、allowの設定にかかわらずツールをブロックします。制限付きデータを扱うプロジェクトで deny ルールを使用するのは、まさにこのためです。
出力形式
=== PERMISSION STATE ===
Layer 1 — VSCode user: bypassPermissions (allowDangerouslySkipPermissions: true)
Layer 2 — VSCode workspace: (not set)
Layer 3 — CLI user: bypassPermissions (allow: ["*"])
Layer 4 — CLI project: (not set) (allow: ["Edit(**)", "Bash(*)", ...])
Layer 5 — CLI project-local: bypassPermissions NOT HONOURED — a project-layer bypass starts the session in Manual
Resolved defaultMode: default (Manual) — Layer 5's bypass overrides Layer 3 and is not honoured
Merged allow: Edit(**), Write(**), Bash(*), ...
Merged deny: (none)
=== RUNTIME ===
Check the status line (or the mode indicator). Expected here: [PROMPT] — the ignored Layer 5 bypass explains it.
Remove the bypass from Layer 5 and keep it in Layer 3 (or rely on auto mode) to get [BYPASS] / [AUTO].
Any other mismatch with the resolved mode is an in-session override — Shift+Tab cycles modes.
=== DIAGNOSIS ===
No layer drift detected. If you are still seeing prompts:
1. Session is stale (started before settings were applied) — reload window + new session.
2. VSCode extension bug — check extension version and file an issue.
3. Tool was previously denied in this session — that denial is remembered. New session clears it.
いずれかのレイヤーに不一致がある場合は、「No layer drift detected」の行を、具体的な問題を示す内容に置き換えてください。
メモ
- このスキルは読み取り専用です。設定を変更することはありません。
$CLAUDE_PROJECT_DIRが設定されていない場合は、git rev-parse --show-toplevelにフォールバックしてください。- プラットフォームに応じて、VSCode のユーザーパスを取得するため、macOS、Linux、Windows を判別してください。