mcpField
C
claude-permissions

claude-permissions

github.com/vtmocanuエージェントワークフロー3278 回インストール今日更新
リポジトリ

claude-permissions について

Dippy と設定ファイルを使って Claude Code の権限を管理するスキルです。コマンドや MCP ツールのルール、権限状態、自動モード用ラッパーを解説し、管理者によるアクセス動作の確認、変更、トラブルシューティングを支援します。

主な機能

  1. 01Bash と MCP ツールのルール管理
  2. 02読み取りとウェブアクセス設定
  3. 03ACTIVE、ALLOW-ONLY、DISABLED 状態の説明
  4. 04自動モードの権限確認への対応
  5. 05設定の優先順位とルール照合の確認
  6. 06権限動作のトラブルシューティング

活用シーン

  1. 01コマンドや MCP 権限の追加・変更
  2. 02権限状態による影響の監査
  3. 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 ツール、ファイル編集、後処理、ハンドラーモデル、セキュリティモデル。

エントリーポイント

具体的な指示なしで呼び出された場合は、ユーザーが何をしたいのか尋ねてください。

  1. 新しいコマンドまたは MCP ツールを許可しますか?(Dippy の設定)
  2. 新しい Read/WebFetch/Skill エントリを許可しますか?(settings.json)
  3. 現在の権限を確認しますか?
  4. 権限エラーをトラブルシューティングしますか?
  5. 古くなった権限を整理しますか?
  6. その他ですか?

アーキテクチャの概要

権限は 2 つのシステムに分かれています。

権限の種類管理元設定ファイル
Bash コマンドDippy~/.dippy/config(グローバル)、.dippy(プロジェクト)
MCP ツールDippy~/.dippy/config(グローバル)、.dippy(プロジェクト)
ファイルリダイレクトDippy~/.dippy/config(グローバル)、.dippy(プロジェクト)
Read、WebFetch、WebSearch、Skillsettings.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_ONLYallow のみホスト側の自動分類器はホワイトリストをスキップし、それ以外のすべてを判定します
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/hostsallowallow — 分類器はスキップ
kubectl get podsallowallow — 分類器はスキップ
helm install foo bardeny(「GitOps を使用…」)何も表示されない — 分類器が判定
brew install fooask [ASK]何も表示されない — 分類器が判定
some-unknown-tool --watask何も表示されない — 分類器が判定

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 設定単一プロジェクトプロジェクトのルートにある .dippyBash、MCP の上書き
グローバル settings.jsonすべてのプロジェクト~/mackup/confs/claude/settings.jsonRead、WebFetch、Skill、フック
プロジェクト settings.local.json単一プロジェクト.claude/settings.local.jsonRead、WebFetch の上書き

Dippy 設定の優先順位(高い順):

  1. $DIPPY_CONFIG 環境変数(設定されている場合)
  2. プロジェクトのルートにある .dippy(.git と同様に上位ディレクトリを検索)
  3. グローバル設定の ~/.dippy/config

設定ファイル内:最後に一致したルールが優先されます。広範な許可ルールを先に、具体的な拒否ルールを後に記述します。

プロジェクトの .dippy はグローバルの ~/.dippy/config とマージされます。両方のファイルのルールがまとめて評価され、最後に一致したルールが優先されます。プロジェクトのルールは、同じコマンドパターンに対するグローバルルールを上書きできます。

Dippy Config Format

このスキルには、すぐにカスタマイズできるスターター設定として config.example が含まれています。汎用的な安全なデフォルト設定(読み取り専用の操作は許可、書き込み・破壊的な操作は ask/deny、シークレットへの書き込みには deny-redirect ガード、インタープリターの使用禁止ルール、自動モードの [ASK] 規約)が設定されています。これを ~/.dippy/config(またはプロジェクトの .dippy)にコピーし、使用するツールチェーンに合わせて調整してください。

ディレクティブのリファレンス
ディレクティブ構文動作
allowallow <pattern>一致するコマンドを自動承認します
askask <pattern> "message"ユーザーに承認を求めます
denydeny <pattern> "message"理由を示すメッセージとともにブロックします
allow-redirectallow-redirect <path-pattern>指定したパスへのファイル書き込みを許可します
deny-redirectdeny-redirect <path-pattern> "message"指定したパスへのファイル書き込みをブロックします
allow-mcpallow-mcp <tool-pattern>MCP ツールを自動承認します
ask-mcpask-mcp <tool-pattern> "message"MCP ツールの実行前に確認を求めます
deny-mcpdeny-mcp <tool-pattern> "message"MCP ツールをブロックします
afterafter <pattern> "message"実行後のフィードバックを表示します(PostToolUse フックが必要です)
after-mcpafter-mcp <pattern> "message"MCP の実行後にフィードバックを表示します
aliasalias <source> <target>ラッパースクリプトを標準名に対応付けます
set defaultset default allow / set default ask不明なコマンドに対するデフォルトの動作を設定します
set logset log <path>監査ログを有効にします
set log-fullset 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
    ]
  }
}
ツールパターン構文例
ReadRead(glob) - ファイルパスの globRead(~/**)
WebFetchWebFetch(domain:host) または WebFetch のみWebFetch(domain:example.com)
WebSearchWebSearchWebSearch
SkillSkill(name)Skill(docx)

重要:settings.json に Bash(...) や mcp__* の項目を追加しないでください。これらは Dippy が専用に管理します。

ワークフロー:Bash コマンドを許可する

重要なルール:コマンドは実行せず、権限のみを更新してください。

  1. ユーザーが許可を求めているコマンドを分析します
  2. スコープを判断します:グローバル(~/.dippy/config)かプロジェクト(.dippy)か
    • 不明な場合はグローバルを既定とします
  3. 追加前に重複を確認します:
    • 対象の Dippy 設定を読み取ります
    • コマンドがより広いルールですでに許可されていないか確認します(例:allow git はすでに git status を許可しています)
    • 競合する、より具体的なルールがすでに存在しないか確認します
    • 重複が見つかった場合はユーザーに伝え、追加を見送ります
  4. 連結されたコマンドを分解します:パイプでつながれたコマンドは個別のコマンドとなり、それぞれにルールが必要です
  5. 安全性の既定値を適用します(下記の「安全性」セクションを参照)
  6. 設定の適切なセクション(カテゴリ別に整理されています)にルールを追加します
  7. 追加した内容と場所を正確にユーザーに提示します
  8. 新たに許可したコマンドをテストするかどうか、ユーザーに確認します
重複チェックのロジック

ルールを追加する前に、以下を確認します。

  1. グローバル設定で許可されているか? グローバル設定に allow git がある場合、どこにも allow git status を追加しないでください
  2. プロジェクト設定にすでにあるか? プロジェクトの .dippy にすでに存在するルールは追加しないでください
  3. プロジェクトにより広いルールがあるか? プロジェクトに allow kubectl がある場合、allow kubectl get は追加しないでください
  4. プロジェクトのルールがグローバルの拒否ルールを上書きするか? グローバル設定に deny git push --force がある場合、プロジェクトの .dippy に allow git push --force を追加すると、それが上書きされます。ユーザーに警告してください。

ワークフロー:MCP ツールを許可する

  1. ツール名を特定します:mcp__<server>__<action>
  2. スコープを判断します:グローバルかプロジェクトか
  3. Bash コマンドと同じロジックを使い、allow-mcp/deny-mcp で重複を確認します
  4. allow-mcp ルールを追加します
  5. mcp__.* の PreToolUse フックマッチャーが settings.json に存在することを確認します(Dippy が MCP 呼び出しをインターセプトするために必要です)

ワークフロー:Read/WebFetch/Skill を許可する

Dippy はこれらを処理しないため、引き続き settings.json を使用します。

  1. スコープを判断します:グローバル(~/mackup/confs/claude/settings.json)かプロジェクト(.claude/settings.local.json)か
  2. 対象の設定ファイルを読み取ります
  3. permissions.allow に権限項目を追加します
  4. JSON を検証します:
    jq . <settings-file> > /dev/null && echo "JSON valid"
    
  5. 追加した内容をユーザーに提示します

安全性:読み取り専用を既定とする

既定では、読み取り操作のみ許可します。書き込みの影響があるコマンドについては、ユーザーに確認してください。

自動許可(読み取り専用で安全に allow 可能)
カテゴリコマンド
Kuberneteskubectl get/describe/logs/explain/events/top/diff/cluster-info/api-resources
Gitgit status/log/diff/fetch/remote/branch(一覧表示)
Helmhelm template/show/list/get/search/history/pull
Fluxflux get/check/diff/logs/build
Dockerdocker 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/drain
  • git push/commit/rebase/reset --hard/clean -f
  • helm install/upgrade/uninstall/rollback(GitOps ワークフローでは、deny を使用し、次のガイダンスを提示することを推奨します:deny helm install "Use GitOps: create/edit the HelmRelease in your GitOps repo instead")
  • flux suspend/resume/delete
  • docker rm/rmi/system prune
  • tofu apply/destroy
  • rm -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 はメソッドフラグより前に指定されることが多く、後ろに追加のフラグが続く場合もあります。

コマンドが状態を変更する場合は、次の選択肢を提示してください:

「このコマンドは状態を変更する可能性があります。次の設定を推奨します:

  1. ask ルールとして追加する(実行前に確認を求めるため、より安全です)
  2. allow ルールとして追加する(自動承認されますが、確認が必要です)
  3. ガイダンスメッセージ付きの 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/

ワークフロー:古い権限のクリーンアップ

  1. Dippy の設定(グローバルおよび/またはプロジェクト)を読み取ります
  2. 使用されなくなったツール/コマンドのルールを特定します
  3. エントリーを削除する前にユーザーに確認します
  4. 確認されたエントリーを削除します
  5. 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)もラッパーと並行して実行されますが、権限とは無関係です。

コメント