claude-permissions について
Dippy と設定ファイルを使って Claude Code の権限を管理するスキルです。コマンドや MCP ツールのルール、権限状態、自動モード用ラッパーを解説し、管理者によるアクセス動作の確認、変更、トラブルシューティングを支援します。
主な機能
- 01Bash と MCP ツールのルール管理
- 02読み取りとウェブアクセス設定
- 03ACTIVE、ALLOW-ONLY、DISABLED 状態の説明
- 04自動モードの権限確認への対応
- 05設定の優先順位とルール照合の確認
- 06権限動作のトラブルシューティング
活用シーン
- 01コマンドや MCP 権限の追加・変更
- 02権限状態による影響の監査
- 03想定外の許可・拒否動作の調査
MCP 対応
Claude Code の自動モードでの動作を含め、MCP ツールを許可、確認、拒否する Dippy ルールを解説します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vtmocanu/ skills --skill claude-permissionsインストール後、Claude Code で/claude-permissionsを入力して読み込まれたか確認します。
同梱ファイルconfig.exampledippy-with-auto-fallback.sh
詳細
Claude Code の権限管理
ドキュメントの場所
このドキュメントの場所:~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/SKILL.md(公開リポジトリ:github.com/vtmocanu/skills)
注:これが信頼できる唯一の情報源です。インストール済みのコピー
~/.claude/skills/claude-permissions/SKILL.mdは、npx skillsパッケージマネージャーによってこのファイルから生成されます。こちらを編集してから、npx skills updateを実行して再取得してください。インストール済みのコピーは編集しないでください。
Dippy のドキュメント:設定の構文と動作は https://github.com/ldayton/Dippy/wiki に記載されています。確信のない構文に遭遇した場合は、変更する前に該当する Wiki ページを取得して確認してください。主なページ:設定、MCP ツール、ファイル編集、後処理、ハンドラーモデル、セキュリティモデル。
エントリーポイント
具体的な指示なしで呼び出された場合は、ユーザーが何をしたいのか尋ねてください。
- 新しいコマンドまたは MCP ツールを許可しますか?(Dippy の設定)
- 新しい Read/WebFetch/Skill エントリを許可しますか?(settings.json)
- 現在の権限を確認しますか?
- 権限エラーをトラブルシューティングしますか?
- 古くなった権限を整理しますか?
- その他ですか?
アーキテクチャの概要
権限は 2 つのシステムに分かれています。
| 権限の種類 | 管理元 | 設定ファイル |
|---|---|---|
| Bash コマンド | Dippy | ~/.dippy/config(グローバル)、.dippy(プロジェクト) |
| MCP ツール | Dippy | ~/.dippy/config(グローバル)、.dippy(プロジェクト) |
| ファイルリダイレクト | Dippy | ~/.dippy/config(グローバル)、.dippy(プロジェクト) |
| Read、WebFetch、WebSearch、Skill | settings.json | ~/mackup/confs/claude/settings.json(グローバル)、.claude/settings.local.json(プロジェクト) |
Dippy は、Bash と mcp__.* の両方のマッチャーに対して、PreToolUse フックとして実行されます(settings.json で設定)。PostToolUse フックにより、後処理が有効になります。
重要:Dippy は直接ではなく、ラッパー経由で呼び出されます。 settings.json のフックコマンドは、単独の
dippyではなく~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.shです。このラッパーは、自動モード(自律実行と起動されたエージェント/チームメイトが使用する権限モード)におけるask判定の動作を変えます。以下の自動モードのフォールバックラッパーを参照してください。この設定で最も意外な点は、自動モードでは単純なaskルールによって人間に確認が求められるわけではないことです。
Auto モードのフォールバックラッパー
ラッパーはフックペイロードから permission_mode を読み取り、分岐します(以下はデフォルトの ACTIVE 状態での動作です。優先される2つのマーカーファイルの状態については、3つの状態を参照してください)。
-
Auto 以外のモード(
default、acceptEdits、planなど):ペイロードはそのままdippyに渡されます。通常どおり動作し、askルールがユーザーに対話型プロンプトを表示します。 -
autoモード:ラッパーはdippyを実行し、判定を調べて、次のものだけを転送します。allow/denyの判定(ホワイトリストとブロックリストは常に適用されます)。permissionDecisionReasonにリテラルトークン[ASK]が含まれるask判定。
それ以外の
ask([ASK]マーカーなし)は破棄されます(ラッパーは何も出力せず、exit 0します)。これにより判定は auto モード独自の分類器に渡され、通常は人間に確認を求めずに定型的なコマンドを実行します。
影響:auto モードでは、メッセージに [ASK] が付いた ask ルールだけがユーザーへのエスカレーションを行います。それ以外の、dippy なら確認を求める処理はすべて、暗黙のうちに自動処理されます。つまり、[ASK] プレフィックスは実際の動作を左右する規約であり、単なる飾りではありません。自律実行やエージェントの実行中にも人間への確認が必要な操作には必ず付けてください。
| Dippy の判定 | 理由に [ASK] が含まれるか? | Auto 以外のモード | Auto モード |
|---|---|---|---|
allow | 該当なし | 実行、プロンプトなし | 実行、プロンプトなし |
deny | 該当なし | ブロック | ブロック |
ask | はい | ユーザーに確認 | ユーザーに確認 |
ask | いいえ | ユーザーに確認 | 破棄され、自動分類器が判定(通常はプロンプトなしで実行) |
現在の設定例です。ask git push "[ASK] Confirm push target"([ASK] あり)は auto モードでも人間への確認を求めます。一方、ask git commit "Confirm commit" と ask git add "Confirm staging"([ASK] なし)は、auto モードではプロンプトなしで自動分類器が暗黙のうちに処理します。新しい ask ルールを作成するときは、[ASK] を付ける必要があるか慎重に判断してください。人間の確認を必ず挟む必要がある書き込み操作や破壊的操作には、付けてください。
3つの状態:ACTIVE / ALLOW-ONLY / DISABLED
Dippy には独自の有効化/無効化フラグがありません(dippy --help、v0.2.7)。状態は2つのマーカーファイルで管理され、ラッパーは呼び出しごとにこれらを確認します。
| 状態 | マーカー | ラッパーが転送するもの | 結果 |
|---|---|---|---|
| ACTIVE(デフォルト) | なし | allow、deny、ask(上の表のとおり、auto モードでは通常の ask をフィルタリング) | ルールセット全体、ガードレール全体 |
| ALLOW-ONLY | ~/.dippy/ALLOW_ONLY | allow のみ | ホスト側の自動分類器はホワイトリストをスキップし、それ以外のすべてを判定します |
| DISABLED | ~/.dippy/OFF | すべてのイベントで何も転送しない | Dippy を最初から最後までバイパス |
両方のマーカーが存在する場合は OFF が優先されます。~/.dippy は mackup リポジトリ内へのシンボリックリンクなので、マーカーは confs/.dippy/ に配置されます。どちらも意図的に Git の追跡対象外にしています(マシン固有の状態であり、同期する設定ではありません)。
状態を切り替える際に再起動は不要です。Claude Code は起動時に settings.json のフックコマンドをキャッシュしますが、スクリプトは呼び出しごとに再読み込みされるため、切り替えは実行中のセッションにすぐ反映されます(対照的に、settings.json のフック項目を編集した場合は再起動が必要です)。
この Mac では、マーカーを手動で操作するよりも mackup/scripts/dippy-toggle.sh(~/scripts 経由で PATH 上にあります)を使用してください。このスクリプトは状態を報告し、2つのマーカーが相互に排他的になるように保ちます。また、settings.json でフックが dippy-with-auto-fallback.sh 経由でルーティングされなくなっている場合や、参照先のラッパーが ALLOW_ONLY 分岐のない古いクローンである場合には警告します(どちらの場合もマーカーは何の効果もありません)。
dippy-toggle.sh # status (default)
dippy-toggle.sh on # ACTIVE - full dippy (clears both markers)
dippy-toggle.sh allow-only # ALLOW-ONLY - whitelist only
dippy-toggle.sh off # DISABLED - bypass dippy
dippy-toggle.sh toggle # flip on <-> off
dippy-toggle.sh cycle # rotate active -> allow-only -> off -> active
ALLOW-ONLY:許可リストのみのノイズフィルター
ラッパーは dippy を実行し、判定が allow の場合にのみ転送し、それ以外の場合は何も出力しません。
[ -f "${HOME}/.dippy/ALLOW_ONLY" ] && forward only `allow`
フックの allow はホストの権限確認フローを短絡するため、許可リストにあるコマンドは自動分類器に到達しません。これがこの状態の目的です。許可リストにないものはすべて、ホストが通常行う処理に進みます。auto モードでは分類器に、それ以外のモードでは通常のプロンプトに進みます。
この状態では、deny ルールと [ASK] によるエスカレーションは発動しません。 2026-08-04 に dippy 0.2.7 で確認済みです。
| コマンド | ACTIVE の判定 | ALLOW-ONLY:Claude に表示される内容 |
|---|---|---|
cat /etc/hosts | allow | allow — 分類器はスキップ |
kubectl get pods | allow | allow — 分類器はスキップ |
helm install foo bar | deny(「GitOps を使用…」) | 何も表示されない — 分類器が判定 |
brew install foo | ask [ASK] | 何も表示されない — 分類器が判定 |
some-unknown-tool --wat | ask | 何も表示されない — 分類器が判定 |
ALLOW-ONLY でも PostToolUse の事後メッセージは引き続き表示されます(権限の決定ではなくガイダンステキストであり、イベントのチェックはフィルターより前に実行されるためです)。
DISABLED:ノイズフィルターではなく、安全機能のオフスイッチ
~/.dippy/OFF が存在する間、ラッパーはすべてのイベントで何も出力せず、exit 0 するため、次のようになります。
denyのブロックリストは適用されません。rm -rf、git push --force、deny-redirectによるシークレットパスの保護、deny-mcpルールはすべて発動しなくなります。allowルールも発動しなくなるため、auto 以外のモードでは、通常のコマンドでもプロンプトが表示されるようになります(プロンプトは減るのではなく増えます)。auto モードでは、すべてが auto モード独自の分類器に進み、通常はプロンプトなしでコマンドが実行されます。- キルスイッチがイベントチェックより前に実行されるため、事後メッセージも表示されなくなります。
目的に合う場合は、より限定的な代替手段を優先してください。
| 目的 | キルスイッチより適した方法 |
|---|---|
| 高速パスの許可は維持しつつ、dippy のプロンプトをすべて停止する | dippy-toggle.sh allow-only(注:deny も無効になります) |
| 1 つのリポジトリでプロンプトを停止する | そのリポジトリの .dippy で set default allow を設定する(グローバルの deny ルールは引き続き発動します) |
| 1 つのコマンドでプロンプトを停止する | プロジェクトの .dippy に allow <cmd> ルールを設定する |
| 実行時にルールセット全体を入れ替える | DIPPY_CONFIG=/path/to/other-config claude |
現在の状態を確認します。
# which state? (or just: dippy-toggle.sh status)
ls -la ~/.dippy/OFF ~/.dippy/ALLOW_ONLY 2>/dev/null
# end-to-end check — a denied command (empty = bypassed or allow-only; JSON deny = active)
printf '%s' '{"permission_mode":"default","tool_name":"Bash","tool_input":{"command":"helm install foo bar"}}' \
| ~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.sh
# end-to-end check — a whitelisted command (JSON allow = active or allow-only; empty = bypassed)
printf '%s' '{"permission_mode":"default","tool_name":"Bash","tool_input":{"command":"cat /etc/hosts"}}' \
| ~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.sh
注:settings.json のネイティブ機能(参考情報であり、使用するものではありません):settings.json は v2.1.0(2026 年 1 月)以降、任意の位置でワイルドカードをサポートし、allow/ask/deny ディレクティブ、
settings.local.jsonによるプロジェクトごとの上書き、MCP ツールの権限を備えています。Dippy 独自の利点:ask/deny ルールに関するガイダンスメッセージ、後勝ちのルール評価(deny > ask > allow の固定優先順位とは異なります)、コメントを記述できるプレーンテキスト設定、ファイルリダイレクト制御(deny-redirect)。
主な場所
| ファイル | 適用範囲 | パス | 管理対象 |
|---|---|---|---|
| グローバル Dippy 設定 | すべてのプロジェクト | ~/mackup/confs/.dippy/config(~/.dippy/config へのシンボリックリンク) | Bash、MCP、リダイレクト |
| プロジェクト Dippy 設定 | 単一プロジェクト | プロジェクトのルートにある .dippy | Bash、MCP の上書き |
| グローバル settings.json | すべてのプロジェクト | ~/mackup/confs/claude/settings.json | Read、WebFetch、Skill、フック |
| プロジェクト settings.local.json | 単一プロジェクト | .claude/settings.local.json | Read、WebFetch の上書き |
Dippy 設定の優先順位(高い順):
$DIPPY_CONFIG環境変数(設定されている場合)- プロジェクトのルートにある
.dippy(.gitと同様に上位ディレクトリを検索) - グローバル設定の
~/.dippy/config
設定ファイル内:最後に一致したルールが優先されます。広範な許可ルールを先に、具体的な拒否ルールを後に記述します。
プロジェクトの .dippy はグローバルの ~/.dippy/config とマージされます。両方のファイルのルールがまとめて評価され、最後に一致したルールが優先されます。プロジェクトのルールは、同じコマンドパターンに対するグローバルルールを上書きできます。
Dippy Config Format
このスキルには、すぐにカスタマイズできるスターター設定として config.example が含まれています。汎用的な安全なデフォルト設定(読み取り専用の操作は許可、書き込み・破壊的な操作は ask/deny、シークレットへの書き込みには deny-redirect ガード、インタープリターの使用禁止ルール、自動モードの [ASK] 規約)が設定されています。これを ~/.dippy/config(またはプロジェクトの .dippy)にコピーし、使用するツールチェーンに合わせて調整してください。
ディレクティブのリファレンス
| ディレクティブ | 構文 | 動作 |
|---|---|---|
allow | allow <pattern> | 一致するコマンドを自動承認します |
ask | ask <pattern> "message" | ユーザーに承認を求めます |
deny | deny <pattern> "message" | 理由を示すメッセージとともにブロックします |
allow-redirect | allow-redirect <path-pattern> | 指定したパスへのファイル書き込みを許可します |
deny-redirect | deny-redirect <path-pattern> "message" | 指定したパスへのファイル書き込みをブロックします |
allow-mcp | allow-mcp <tool-pattern> | MCP ツールを自動承認します |
ask-mcp | ask-mcp <tool-pattern> "message" | MCP ツールの実行前に確認を求めます |
deny-mcp | deny-mcp <tool-pattern> "message" | MCP ツールをブロックします |
after | after <pattern> "message" | 実行後のフィードバックを表示します(PostToolUse フックが必要です) |
after-mcp | after-mcp <pattern> "message" | MCP の実行後にフィードバックを表示します |
alias | alias <source> <target> | ラッパースクリプトを標準名に対応付けます |
set default | set default allow / set default ask | 不明なコマンドに対するデフォルトの動作を設定します |
set log | set log <path> | 監査ログを有効にします |
set log-full | set log-full | ログにコマンド全体を含めます |
パターンマッチング
- 前方一致(デフォルト):
allow git statusはgit status、git status -sなどに一致します。 - 完全一致:アンカー
|を追加します。allow git status|はリテラルコマンドのみに一致します。 - ワイルドカード:
*(スペースを含む任意の文字列)、?(任意の1文字)、[abc](文字クラス) - パスパターン(リダイレクト):
**は再帰的、*はディレクトリ1階層のみ
注意:グロブ文字(
*、?、[)を含むパターンでは、暗黙の前方一致が適用されません。 Dippy は、パターンにグロブ文字が含まれていない場合にのみ、前方一致のために末尾に*を追加します。パターンにグロブ文字が含まれている場合、fnmatchを使ってコマンド文字列全体に一致させる必要があります。たとえば、ask tea issue* closeはtea issues closeに一致しますが、tea issues close 42には一致しません。v0.2.7 の修正点:末尾の
*が空文字列にも一致するようになりました(コマンドのみの場合)。そのため、ask tea issue* close *はtea issues closeとtea issues close 42の両方に一致します。追加の引数がある場合とない場合の両方に一致させるには、グロブパターンの末尾に必ず*を追加してください。**
curlパターンに関する注意:**照合するフラグの後には、必ず末尾に*を付けてください。ask curl * -X POST *はcurl url -X POSTとcurl url -X POST -d '{}'の両方を検出します。末尾に*がないと、POST が最後のトークンである場合にしかパターンが一致しません。注意:パターンのトークンはコマンドのトークンと対応するため、パスルールにはフラグ用の
-*スロットが必要です。ルールが正しそうに見えるのに一度も機能しない原因として、これが最も多く見られます。ask rm /*.git/*はrm /repo/.git/configに一致しますが、rm -rf /repo/.git/configには一致しません。-rfがパターンにスロットのないトークンを占めるためです。両方の形式を書くか、先頭に-*を付けてください。ask rm /*.git/* "git の内部ファイルを削除します" # rm <path> ask rm -* /*.git/* "git の内部ファイルを削除します" # rm -rf <path>補足 — パスパターンのトークンは絶対パスである必要があります。
/を含まないトークン(*.git、*objects)は、コマンドの残り全体に一致する通常のグロブです。/を含むトークンは1つの引数に対して照合されるため、相対パスでは絶対パスの引数に一致しません。このようなトークン内では*はスラッシュをまたいで一致するため、任意の深さに一致します。2026-08-02 に、分離したDIPPY_CONFIGを使い、対象をrm -rf /Users/me/repo/.git/objectsとして v0.2.7 で検証しました。
パターン 一致するか 理由 ask rm -* /*.git/*はい 絶対パスのトークンで、 *が/をまたぐask rm -* /*/.git/*はい 同上 ask rm *.gitはい スラッシュなし → 通常のグロブで、コマンド全体にまたがる。 .gitで終わる場合のみask rm *.git/*いいえ スラッシュあり → パスのトークンだが、相対パス ask rm */.git/*いいえ 同上 ask rm /*.git/*いいえ 絶対パスだが、 -rf用の-*スロットがないask rm **/.git/*いいえ **はリダイレクトパターン専用の構文リダイレクトは異なる照合方式を使用するため、影響を受けません。ドキュメントに記載のとおり、
deny-redirect **/.env*は機能します。作成したルールはすべて、単独でテストしてください。
printf 'set default allow\nask rm <pattern> "HIT"\n' > /tmp/p.dippyを実行し、フックのペイロードをDIPPY_CONFIG=/tmp/p.dippy dippy --claudeにパイプします。set default denyは有効な構文ではありません(allow/askのみ)。この構文を使うと、ルールセットが空になり、「DIPPY_CONFIGが無視されている」ように見えます。また、存在しない設定ファイルのパスを指定すると、警告なしでグローバルファイルにフォールバックします。セキュリティ:インタープリターコマンドを
allowにしないでください。allow bash、allow python3、allow nodeのようなルールは前方一致であり、bash -c '...'、python3 -c '...'、node -e '...'を自動承認して、内側のコマンドに対するすべてのルールを迂回します。Dippy は-c/-e引数の中までは追跡しません(実行は1層のみ)。これらのルールを削除し、set default askにフォールスルーさせてください。
MCP ツールの命名
MCP ツールの形式:mcp__<server>__<action>。例:
allow-mcp mcp__grafana__*- Grafana のすべてのツールdeny-mcp mcp__*__delete_*- すべてのサーバーにおけるすべての削除アクションallow-mcp mcp__context7__query-docs- 特定のツール
コメント
行全体のコメント(# comment)とインラインコメント(allow git # comment)に対応しています。
settings.json の形式(Read/WebFetch/Skill のみ)
権限は permissions.allow(文字列の配列)に設定します。
{
"permissions": {
"allow": [
"Read(*)", // allow reading any file
"Read(~/**)", // path-specific
"WebSearch", // no pattern needed
"WebFetch",
"WebFetch(domain:github.com)", // domain-scoped
"Skill(docx)" // specific skill
]
}
}
| ツール | パターン構文 | 例 |
|---|---|---|
Read | Read(glob) - ファイルパスの glob | Read(~/**) |
WebFetch | WebFetch(domain:host) または WebFetch のみ | WebFetch(domain:example.com) |
WebSearch | WebSearch | WebSearch |
Skill | Skill(name) | Skill(docx) |
重要:settings.json に
Bash(...)やmcp__*の項目を追加しないでください。これらは Dippy が専用に管理します。
ワークフロー:Bash コマンドを許可する
重要なルール:コマンドは実行せず、権限のみを更新してください。
- ユーザーが許可を求めているコマンドを分析します
- スコープを判断します:グローバル(
~/.dippy/config)かプロジェクト(.dippy)か- 不明な場合はグローバルを既定とします
- 追加前に重複を確認します:
- 対象の Dippy 設定を読み取ります
- コマンドがより広いルールですでに許可されていないか確認します(例:
allow gitはすでにgit statusを許可しています) - 競合する、より具体的なルールがすでに存在しないか確認します
- 重複が見つかった場合はユーザーに伝え、追加を見送ります
- 連結されたコマンドを分解します:パイプでつながれたコマンドは個別のコマンドとなり、それぞれにルールが必要です
- 安全性の既定値を適用します(下記の「安全性」セクションを参照)
- 設定の適切なセクション(カテゴリ別に整理されています)にルールを追加します
- 追加した内容と場所を正確にユーザーに提示します
- 新たに許可したコマンドをテストするかどうか、ユーザーに確認します
重複チェックのロジック
ルールを追加する前に、以下を確認します。
- グローバル設定で許可されているか? グローバル設定に
allow gitがある場合、どこにもallow git statusを追加しないでください - プロジェクト設定にすでにあるか? プロジェクトの
.dippyにすでに存在するルールは追加しないでください - プロジェクトにより広いルールがあるか? プロジェクトに
allow kubectlがある場合、allow kubectl getは追加しないでください - プロジェクトのルールがグローバルの拒否ルールを上書きするか? グローバル設定に
deny git push --forceがある場合、プロジェクトの.dippyにallow git push --forceを追加すると、それが上書きされます。ユーザーに警告してください。
ワークフロー:MCP ツールを許可する
- ツール名を特定します:
mcp__<server>__<action> - スコープを判断します:グローバルかプロジェクトか
- Bash コマンドと同じロジックを使い、
allow-mcp/deny-mcpで重複を確認します allow-mcpルールを追加しますmcp__.*の PreToolUse フックマッチャーが settings.json に存在することを確認します(Dippy が MCP 呼び出しをインターセプトするために必要です)
ワークフロー:Read/WebFetch/Skill を許可する
Dippy はこれらを処理しないため、引き続き settings.json を使用します。
- スコープを判断します:グローバル(
~/mackup/confs/claude/settings.json)かプロジェクト(.claude/settings.local.json)か - 対象の設定ファイルを読み取ります
permissions.allowに権限項目を追加します- JSON を検証します:
jq . <settings-file> > /dev/null && echo "JSON valid" - 追加した内容をユーザーに提示します
安全性:読み取り専用を既定とする
既定では、読み取り操作のみ許可します。書き込みの影響があるコマンドについては、ユーザーに確認してください。
自動許可(読み取り専用で安全に allow 可能)
| カテゴリ | コマンド |
|---|---|
| Kubernetes | kubectl get/describe/logs/explain/events/top/diff/cluster-info/api-resources |
| Git | git status/log/diff/fetch/remote/branch(一覧表示) |
| Helm | helm template/show/list/get/search/history/pull |
| Flux | flux get/check/diff/logs/build |
| Docker | docker ps/images/logs/inspect/info |
| インフラ | tofu plan/show/state(infisical ラッパー経由) |
| CLI ツール | ls、cat、jq、grep、rg、fd、tree、eza、curl -s -X GET |
インタープリターは自動許可しないでください:
bash、python3、node、sh、ruby、perl。これらに対してプレフィックスマッチングを行うと、-c/-eフラグも自動承認され、内部のすべてのコマンドルールが回避されます。これらはset default askにフォールスルーさせてください。
確認を求める(書き込み/破壊的な操作には deny または ask を使用)
kubectl apply/delete/edit/patch/rollout restart/scale/draingit push/commit/rebase/reset --hard/clean -fhelm install/upgrade/uninstall/rollback(GitOps ワークフローでは、denyを使用し、次のガイダンスを提示することを推奨します:deny helm install "Use GitOps: create/edit the HelmRelease in your GitOps repo instead")flux suspend/resume/deletedocker rm/rmi/system prunetofu apply/destroyrm -rf、rm -r、sudo、chown- POST/PUT/PATCH/DELETE メソッド、
-d/--data、-F/--form、-T/--upload-fileを使用するcurl - 重要:位置に関係なく書き込みフラグを検出するには、
*ワイルドカードを使用し、追加の引数に一致させるため末尾にも*を付けます:ask curl * -X POST *(ask curl -X POSTではありません)。URL はメソッドフラグより前に指定されることが多く、後ろに追加のフラグが続く場合もあります。
コマンドが状態を変更する場合は、次の選択肢を提示してください:
「このコマンドは状態を変更する可能性があります。次の設定を推奨します:
askルールとして追加する(実行前に確認を求めるため、より安全です)allowルールとして追加する(自動承認されますが、確認が必要です)- ガイダンスメッセージ付きの
denyとして追加する(理由を示してブロックします)」
ワークフロー:権限の確認
# Show global Dippy config
cat ~/.dippy/config
# Show project Dippy config (if exists)
cat .dippy 2>/dev/null || echo "No project .dippy"
# Show settings.json permissions (Read/WebFetch/Skill)
jq '.permissions.allow' ~/mackup/confs/claude/settings.json
# Show project settings.local.json
jq '.permissions.allow' .claude/settings.local.json 2>/dev/null || echo "No project settings"
# List all project .dippy files across repos
fd -H -t f '^\\.dippy$' ~/stuff/gitrepos/wxs/
ワークフロー:古い権限のクリーンアップ
- Dippy の設定(グローバルおよび/またはプロジェクト)を読み取ります
- 使用されなくなったツール/コマンドのルールを特定します
- エントリーを削除する前にユーザーに確認します
- 確認されたエントリーを削除します
- settings.json を変更した場合は、編集後に JSON を検証します
トラブルシューティング
| 症状 | 考えられる原因 | 対処方法 |
|---|---|---|
| Bash コマンドの実行時に予期せずプロンプトが表示される | Dippy の設定に allow ルールがない | ~/.dippy/config または .dippy にルールを追加します |
| コマンドがメッセージとともに拒否される | deny ルールに一致した | ルールの順序を確認します(最後に一致したルールが優先されます) |
| MCP ツールの実行時に予期せずプロンプトが表示される | allow-mcp ルールがない | Dippy の設定に allow-mcp ルールを追加します |
| MCP ルールがまったく無視される | mcp__.* フックマッチャーがない | settings.json に PreToolUse マッチャーを追加します |
| 許可を追加したのに、引き続き拒否される | ルールの順序:後にある deny が allow より優先されます | allow を deny より後に移動するか、deny の条件をより限定します |
| あるプロジェクトでは動作するが、別のプロジェクトでは動作しない | プロジェクトの .dippy ルールがグローバルルールより優先される場合があります(最後に一致したルールが優先されます) | グローバル設定とプロジェクト設定の両方で、競合するルールがないか確認します |
| Read/WebFetch が拒否される | settings.json に項目がない(Dippy の設定ではありません) | settings.json の permissions.allow に追加します |
| settings を編集した後に JSON の解析エラーが発生する | JSON の形式が不正です | jq . を実行して構文エラーを特定します |
| 後処理メッセージが表示されない | PostToolUse フックがない | settings.json に PostToolUse Bash マッチャーを追加します |
ルールがまったく適用されない:deny が無視され、ガイダンスメッセージも表示されない | キルスイッチがオンのままです — ~/.dippy/OFF が存在し、ラッパーが dippy を実行する前に終了します | dippy-toggle.sh on を実行します(または rm ~/.dippy/OFF を実行します。3 つの状態を参照)。すぐに反映され、再起動は不要です |
allow ルールは適用されるが、deny と [ASK] は適用されず、後処理メッセージは引き続き機能する | ALLOW-ONLY 状態がオンのままです — ~/.dippy/ALLOW_ONLY が存在し、ラッパーは allow のみを転送します | dippy-toggle.sh on を実行するとすべてのガードレールが復元されます。dippy-toggle.sh status で状態を確認できます |
dippy-toggle.sh allow-only が ALLOW-ONLY と表示するのに、deny ルールによって引き続きブロックされる | settings.json が、ALLOW_ONLY 分岐の追加(2026-08-04)前のラッパーのクローンを参照しています | dippy-with-auto-fallback.sh のクローンを更新します。dippy-toggle.sh status が自動的に警告します |
| 自動モードでのみ後処理メッセージが表示されない | hook_event_name の確認に対応する前のラッパーを使用しています。自動モードのフィルターは allow/deny/[ASK] タグ付きの ask のみを転送しますが、dippy は permissionDecision を含まないプレーンテキストとして後処理メッセージを出力するため、破棄されていました。この問題は 2026-07-26 に修正されました — ラッパーは PreToolUse 以外のイベントをすべて dippy に直接渡すため、PostToolUse の参照先にはラッパーと dippy のどちらを指定しても動作します | dippy-with-auto-fallback.sh のクローンを更新します |
| glob 文字を含むルールが、追加の引数があるコマンドに一致しない | */?/[ を含むパターンでは暗黙の末尾 * によるプレフィックスマッチングが適用されず、コマンド全体に一致する必要があります | glob パターンの末尾に * を明示的に追加します(v0.2.7 以降では引数のないコマンドにも一致します) |
bash -c/python3 -c がルールを回避する | allow bash はすべての bash -c '...' コマンドにプレフィックスマッチし、Dippy は -c の引数の中までは追跡しません | allow bash/allow python3/allow node を削除し、set default ask によって処理されるようにします |
フック設定リファレンス
Dippy を機能させるには、以下のフックが ~/mackup/confs/claude/settings.json に存在している必要があります。PreToolUse の Bash + mcp__.* マッチャーは、裸の dippy ではなく、自動フォールバックラッパー(このスキルに同梱されている dippy-with-auto-fallback.sh)を呼び出します。これにより、自動モードのフォールバックラッパーで説明されているとおり、自動モードの ask 処理が機能します。PostToolUse フック(afterthoughts)は dippy を直接呼び出します。
フックのコマンドパスは絶対パスで指定する必要があります。 Claude Code はフックの
command文字列内の~を展開しません。以下に示す~/...のパスは読みやすさのためのもので、実際のsettings.jsonでは完全に展開したパスを使用してください(例:/home/you/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.sh)。インストール先の~/.claude/skills/claude-permissions/のコピーではなく、このリポジトリのローカルクローンをフックの参照先にしてください(このディレクトリはnpx skills updateのたびに上書きされます)。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.sh" }
]
},
{
"matcher": "mcp__.*",
"hooks": [
{ "type": "command", "command": "~/stuff/gitrepos/gh/vtmocanu/skills/claude-permissions/dippy-with-auto-fallback.sh" }
]
}
],
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "dippy" }
]
}
]
}
}
このスキルには、ラッパーが ./dippy-with-auto-fallback.sh として同梱されています。正確なロジックを確認する必要がある場合は、そのファイルを直接読んでください。自動モードのフォールバックラッパーで上記のとおり要約されている自動モードの動作の正式な参照元です。使用するには、このリポジトリをローカルにクローンし、両方の PreToolUse フックコマンドがクローン内のコピーを参照するようにしてください(上記の注記のとおり、絶対パスを指定してください)。
注:
mcp__.*マッチャーは正規表現を使用します(glob ではありません)。その他の PreToolUse フック(zellaude、clawd、dot-agent-deck)もラッパーと並行して実行されますが、権限とは無関係です。