CLAUDE CODE/確認プロンプトを外して走らせる型
「毎回の確認が面倒だから外したい。でも事故らせたくない」人向けの、そのまま真似できる運用ルール一式。
~/.claude/CLAUDE.md(毎回自動で読まれる指示書)に貼る手作業で入れたい人は、第1部にファイルの中身をそのまま載せているのでコピペでOK。
Claude Code は通常、コマンドを実行するたび「これ実行していいですか?」と聞いてきます。バイパスモード(--dangerously-skip-permissions)はこの確認を全部スキップするモード。止まらないので作業速度は跳ね上がりますが、裏返すと「止める人がいない」状態です。以下は朝倉が自分の運用で立てている柵をそのまま配布用にしたものです。
バイパスモードは「AIを信用して確認をやめる」運用ではありません。確認をやめる代わりに、機械が止める柵を先に立てる運用です。柵を立てずにフラグだけ外すのが、いちばん事故ります。
良いこと:止まらない。10ステップの作業が一気に最後まで進む。
怖いこと:止める人がいない。rm -rf も本番DBの書き換えも、聞かれずに実行される。
| 層 | 誰が止めるか | 何を止めるか | 破られるか |
|---|---|---|---|
| システム層 | 機械(設定とスクリプト) | rm -rf sudo git push --force などの破壊系コマンド | 破られない。AIの判断は一切介在しない |
| 行動層 | Claude 自身 | 「本番を触る」「大量削除」「外部への発信」など、文字面では判定できない領域 | 忘れることがある |
なぜ2層いるか。hook(システム層)はコマンドの文字列しか見ません。「会員サイトの本番DBを書き換える」は文字列としてはただの curl で、危険と判定できない。逆に行動層だけだと、Claudeが忘れた瞬間に柵がなくなる。機械で止められるものは機械で、無理なものだけルールで。
~/.claude/settings.json に追記するpermissions と hooks の2ブロック。すでに settings.json がある人は、既存の内容を消さずにこの2つを足します。
{
"permissions": {
"defaultMode": "bypassPermissions",
"deny": [
"Bash(rm -rf:*)",
"Bash(rm -fr:*)",
"Bash(sudo:*)",
"Bash(sudo)",
"Bash(dd:*)",
"Bash(mkfs:*)",
"Bash(mkfs.*:*)",
"Bash(shutdown:*)",
"Bash(reboot:*)",
"Bash(halt:*)",
"Bash(poweroff:*)",
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git reset --hard:*)",
"Bash(git clean -f:*)",
"Bash(git clean -fd:*)",
"Bash(git clean -fdx:*)",
"Bash(git branch -D:*)",
"Bash(npm publish:*)",
"Bash(pnpm publish:*)",
"Bash(yarn publish:*)",
"Bash(chmod -R 777:*)",
"Bash(docker system prune:*)",
"Bash(docker volume rm:*)",
"Bash(docker volume prune:*)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/block-dangerous-bash.sh",
"timeout": 10
}
]
}
]
}
}defaultMode: "bypassPermissions" を書いておくと、起動フラグを忘れてもバイパスモードで立ち上がります。「普段は確認あり、必要なときだけ」で使いたい人はこの行だけ外して claude --dangerously-skip-permissions で起動。
~/.claude/hooks/block-dangerous-bash.sh を作り、中身をそのまま貼ります。
#!/usr/bin/env bash
# Block classic destructive bash patterns even when defaultMode is bypassPermissions.
# Reads hook input JSON on stdin, emits PreToolUse decision JSON on stdout.
set -euo pipefail
input="$(cat)"
cmd="$(printf '%s' "$input" | jq -r '.tool_input.command // ""')"
# Empty command: allow
if [ -z "$cmd" ]; then
exit 0
fi
lc="$(printf '%s' "$cmd" | tr '[:upper:]' '[:lower:]')"
deny() {
jq -n --arg r "$1" '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: $r
}
}'
exit 0
}
# 再帰削除(rm -rf / -fr)
if printf '%s' "$lc" | grep -Eq '(^|[^a-z0-9_./-])rm[[:space:]]+(-[a-z]*r[a-z]*f|-[a-z]*f[a-z]*r)([[:space:]]|$)'; then
deny "再帰削除はブロック(安全柵)。同じコマンドの再送は禁止。代替: 新規のクリーン作業ディレクトリは mktemp -d / 既存物の削除は trash <パス>(復元可能)"
fi
# sudo(単体・連結どちらも)
if printf '%s' "$lc" | grep -Eq '(^|[[:space:]]|;|&|\||\()sudo([[:space:]]|$)'; then
deny "sudo はブロック(安全柵)"
fi
# dd / mkfs*
if printf '%s' "$lc" | grep -Eq '(^|[[:space:]]|;|&|\|)(dd|mkfs(\.[a-z0-9]+)?)[[:space:]]'; then
deny "dd / mkfs はブロック(安全柵)"
fi
# shutdown / reboot / halt / poweroff
if printf '%s' "$lc" | grep -Eq '(^|[[:space:]]|;|&|\|)(shutdown|reboot|halt|poweroff)([[:space:]]|$)'; then
deny "システム停止系コマンドはブロック(安全柵)"
fi
# git push --force(--force-with-lease は許可)
if printf '%s' "$lc" | grep -Eq 'git[[:space:]]+push[[:space:]]+(-f([[:space:]]|$)|--force([[:space:]]|$))'; then
deny "git push --force はブロック(安全柵、--force-with-lease を使ってください)"
fi
# git reset --hard
if printf '%s' "$lc" | grep -Eq 'git[[:space:]]+reset[[:space:]]+--hard'; then
deny "git reset --hard はブロック(安全柵)"
fi
# git clean -f 系
if printf '%s' "$lc" | grep -Eq 'git[[:space:]]+clean[[:space:]]+-[a-z]*f'; then
deny "git clean -f 系はブロック(安全柵)"
fi
# git branch -D(大文字D=強制削除。小文字化前の文字列で判定)
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+branch[[:space:]]+-D([[:space:]]|$)'; then
deny "git branch -D はブロック(安全柵)"
fi
# git commit --no-verify / --no-gpg-sign(pre-commit hook のスキップ)
if printf '%s' "$lc" | grep -Eq 'git[[:space:]]+commit[[:space:]].*(--no-verify|--no-gpg-sign)'; then
deny "git commit --no-verify / --no-gpg-sign はブロック(安全柵、pre-commit hook はスキップ禁止)"
fi
# curl | sh / wget | sh(検証していないスクリプトの実行)
if printf '%s' "$lc" | grep -Eq '(curl|wget)[[:space:]].*\|[[:space:]]*(sh|bash|zsh|ksh)([[:space:]]|$)'; then
deny "curl/wget パイプ経由のシェル実行はブロック(安全柵)"
fi
# パッケージ公開
if printf '%s' "$lc" | grep -Eq '(^|[[:space:]]|;|&|\|)(npm|pnpm|yarn)[[:space:]]+publish([[:space:]]|$)'; then
deny "npm/pnpm/yarn publish はブロック(安全柵)"
fi
# chmod -R 777
if printf '%s' "$lc" | grep -Eq 'chmod[[:space:]]+-[a-z]*r[a-z]*[[:space:]]+777'; then
deny "chmod -R 777 はブロック(安全柵)"
fi
# docker の破壊的 prune / volume rm
if printf '%s' "$lc" | grep -Eq 'docker[[:space:]]+(system[[:space:]]+prune|volume[[:space:]]+rm|volume[[:space:]]+prune)'; then
deny "docker の破壊的 prune / volume rm はブロック(安全柵)"
fi
# fork bomb
if printf '%s' "$cmd" | grep -Eq ':\(\)[[:space:]]*\{[^}]*\|[[:space:]]*:[[:space:]]*&'; then
deny "fork bomb 検出(安全柵)"
fi
# 生ディスクへの書き込み
if printf '%s' "$lc" | grep -Eq '>[[:space:]]*/dev/(disk|sd|nvme|hd)'; then
deny "生ディスクへの書き込みはブロック(安全柵)"
fi
exit 0作ったら実行権限をつけます。jq が必要なので、入っていなければ brew install jq(Mac)。
chmod +x ~/.claude/hooks/block-dangerous-bash.shClaude Code を再起動してから、存在しないパスを指定して再帰削除を頼みます。
「~/存在しないフォルダ_test を rm -rf で消して」
「ブロック(安全柵)」と出て実行されなければ成功。実行されてしまう場合は、hookのパス・実行権限・jq の有無・settings.json のJSONが壊れていないかを順に確認します。
cd foo && rm -rf bar のように途中に混ざった形は素通りしうる。それをコマンド文字列全体の検査で拾うのが hook の役目。片方だけでは穴が残るので両方入れるgrep の検索語や echo の文字列にたまたま該当パターンが入っただけでも止まる。止まったら書き方を変えるCLAUDE.md に貼る)ここを ~/.claude/CLAUDE.md にそのまま貼ります。「本番リスト」だけ自分の環境に置き換えてください。
## バイパスモード運用ルール
確認プロンプトが出ないモードで動いている。破壊系コマンドはシステム層(hook + permissions.deny)で
強制ブロック済み。以下はhookで拾えない領域なので必ず守る。
大原則: 取り消せる操作は自律で進める。取り消せない操作は必ず一度止まって確認する。
1. `.env` / APIキー / 認証情報をコミット・外部送信しない
2. `--no-verify` `--force` `--no-gpg-sign` など安全機構のスキップは禁止(明示指示でも再確認する)
3. 本番環境への変更は事前確認(下の「本番リスト」参照)
4. 顧客データ・記録の削除やアーカイブは事前確認(Notion DB / スプレッドシート / 顧客管理ツール)
5. 10ファイルを超える一括削除は事前確認
6. 未コミット変更を上書きしない(`git stash drop` / `git checkout --` で消さない)
7. 外部への発信(公式LINE配信 / SNS投稿 / メール送信 / 決済)は、送信直前に
「宛先・件数・本文」を提示して承認を取る。「進めて」だけを送信承認とみなさない
8. 10分を超えるタスクは、開始時と完了時に報告する
### 本番リスト(これを触るときは必ず止まる)
- (記入)例: 会員サイト https://〜 のコンテンツ・会員データ
- (記入)例: 販売中LPのページ
- (記入)例: 顧客管理のNotion DB「〇〇」
- (記入)例: 公式LINEの配信(テスト送信を除く)| ルール | なぜ必要か |
|---|---|
| 1. 認証情報 | 一度公開リポジトリに載ると、消してもコミット履歴に残る。取り消せない |
| 2. 安全機構スキップ | --force 系は「事故を防ぐ仕組みを外す」操作。外す判断は人間が握る |
| 3. 本番 | 壊れると売上と信用に直結する。ローカルのやり直しとは損害の桁が違う |
| 4. 顧客データ | 削除は取り消せない。アーカイブは戻せてもリンクや自動連携は戻らない |
| 5. 大量削除 | 1〜2ファイルの消し間違いは復旧できる。50ファイルは復旧できない |
| 6. 未コミット変更 | まだ保存されていない作業=この世に1つしかないデータ。消えたら終わり |
| 7. 外部発信 | 送ったものは取り消せない。バイパスモードで唯一「常に人が承認する」領域 |
| 8. 長時間タスク | 黙って10分動かれると、暴走か進行か判断できない |
いきなり本番業務で使わない。危険度の低いものから順に上げて、誤ブロックとAIの脱線を観察します。
| 段階 | 試すこと | 見るポイント |
|---|---|---|
| 1. 読み取り | ファイルを読む/一覧を出す/Notion検索 | 普通の作業が誤ブロックされないか |
| 2. ローカル編集 | ファイル作成・編集、スクリプト実行 | 摩擦ゼロを体感できるか。余計な編集をしないか |
| 3. git | add / commit / 通常の push | コミットは通り、force が要る場面で止まるか |
| 4. 外部ツール(本番以外) | テスト用Notionページの更新、下書き作成 | 自分から動けているか |
| 5. 本番系 | 会員サイト・LP・本番DBに関わる更新 | 事前確認ルールを守るか(ここが本試験) |
| 6. 外部発信 | LINE配信・SNS投稿 | 承認を取ってから送るか |
1〜3は数セッションで素通りするはず。4以降を本気で観察する。5で確認なしに本番を触ったら、その時点でルールの書き方を直します。
| 症状 | 対応 |
|---|---|
| 日常作業で誤ブロックされる | 該当パターンを緩める/deny から削る |
| 「これは止めてほしかった」が素通りした | hookにパターンを追加する |
| 同じコマンドが毎回すり抜ける | hookのロジックを見直す |
閾値:同じパターンで誤ブロックが2回以上出たら即修正(1回は偶発の可能性)。
| 症状 | 対応 |
|---|---|
| 事前確認せずに本番を触った | ルールを具体化する(曖昧さが原因) |
| 「10ファイル超」で毎回止まるが実害がない | 閾値を上げる(20/50)か撤廃する |
| ルールに書いていない領域で事故った | ルールを足す |
| ルールは守られているのに摩擦を感じる | その項目の撤廃を検討する |
閾値:同じルール違反が2回起きたら、AIではなくルールの書き方が悪い(抽象的すぎる/長すぎる)と考える。
黄金律:ルールは増やすより減らす
「このルールは、過去1ヶ月で1度でも自分を救ったか?」で判断します。救っていなければ削る。一度も発動しないルールは認知負荷を増やすだけで、やがて守られなくなります。ルールが長いほど、AIの中での優先度も薄まります。
そして事故ログを1つ持っておくこと。事故った日・誤ブロックされた日を追記していくと、「どのルールが実際に効いたか」があとで判断できます。
settings.json/hookスクリプト → 再起動で反映(今動いているセッションには反映されないことがある)CLAUDE.md → 次のセッションから反映(今のセッションは起動時に読み込み済み)「直したのに効かない」の9割はこれ。まず再起動する。
| 症状 | 原因 |
|---|---|
| hookが全く効かない | 実行権限がない(chmod +x)/jq 未インストール/パスの書き間違い |
| 起動しなくなった | settings.json のJSONが壊れている(カンマ・括弧)。エディタで開くとすぐ分かる |
| 毎回ブロックされて作業にならない | grep や echo の文字列にパターンが入っている。書き方を変える |
| 起動のたびの警告確認が煩わしい | 慣れたら "skipDangerousModePermissionPrompt": true を追加。柵を立て終わってから |
--dangerously-skip-permissions または settings.json の bypassPermissionsPreToolUse は「実行される直前」に割り込むものバイパスモードの本質は「AIを信用するかどうか」ではなく、取り返しがつく操作と、つかない操作を先に仕分けておくことです。
取り返しがつく操作は全部任せてスピードを取る。取り返しがつかない操作だけ、機械の柵と人の承認を通す。この線引きさえ作っておけば、確認プロンプトを消しても運用は壊れません。