CLAUDE CODE/確認プロンプトを外して走らせる型

バイパスモード運用ルール ひな形安全柵の立て方・慣らし方・育て方

「毎回の確認が面倒だから外したい。でも事故らせたくない」人向けの、そのまま真似できる運用ルール一式。

使い方(3ステップ)

  1. このページのURLをそのまま自分の Claude Code に貼って「これを読んで、この通りにセットアップして」と頼む(設定ファイルとhookを作るところまでやってくれる)
  2. 第2部の「本番リスト」を自分の環境に合わせて埋め、第2部全体を ~/.claude/CLAUDE.md(毎回自動で読まれる指示書)に貼る
  3. 第3部の順番で、軽いタスクから慣らす

URLをうまく読めないときは「📋 Markdownをコピー」で全文を渡してください(クリップボードに入るだけで、ダウンロードは不要)。手作業で入れたい人は、第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が忘れた瞬間に柵がなくなる。機械で止められるものは機械で、無理なものだけルールで。

第1部|システム層をつくる(そのままコピペ)
1

~/.claude/settings.json に追記する

permissionshooks の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 で起動。

2

hook本体をつくる

~/.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.sh
3

動くか確かめる

Claude Code を再起動してから、存在しないパスを指定して再帰削除を頼みます。

~/存在しないフォルダ_testrm -rf で消して」

「ブロック(安全柵)」と出て実行されなければ成功。実行されてしまう場合は、hookのパス・実行権限・jq の有無・settings.json のJSONが壊れていないかを順に確認します。

⚠ この柵の限界(先に知っておく)

第2部|行動層(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分動かれると、暴走か進行か判断できない
第3部|段階的に慣らす

いきなり本番業務で使わない。危険度の低いものから順に上げて、誤ブロックとAIの脱線を観察します。

段階試すこと見るポイント
1. 読み取りファイルを読む/一覧を出す/Notion検索普通の作業が誤ブロックされないか
2. ローカル編集ファイル作成・編集、スクリプト実行摩擦ゼロを体感できるか。余計な編集をしないか
3. gitadd / commit / 通常の pushコミットは通り、force が要る場面で止まるか
4. 外部ツール(本番以外)テスト用Notionページの更新、下書き作成自分から動けているか
5. 本番系会員サイト・LP・本番DBに関わる更新事前確認ルールを守るか(ここが本試験)
6. 外部発信LINE配信・SNS投稿承認を取ってから送るか

1〜3は数セッションで素通りするはず。4以降を本気で観察する。5で確認なしに本番を触ったら、その時点でルールの書き方を直します。

第4部|ルールの育て方

システム層(hook)を変えるとき

症状対応
日常作業で誤ブロックされる該当パターンを緩める/deny から削る
「これは止めてほしかった」が素通りしたhookにパターンを追加する
同じコマンドが毎回すり抜けるhookのロジックを見直す

閾値:同じパターンで誤ブロックが2回以上出たら即修正(1回は偶発の可能性)。

行動層(CLAUDE.md)を変えるとき

症状対応
事前確認せずに本番を触ったルールを具体化する(曖昧さが原因)
「10ファイル超」で毎回止まるが実害がない閾値を上げる(20/50)か撤廃する
ルールに書いていない領域で事故ったルールを足す
ルールは守られているのに摩擦を感じるその項目の撤廃を検討する

閾値:同じルール違反が2回起きたら、AIではなくルールの書き方が悪い(抽象的すぎる/長すぎる)と考える。

黄金律:ルールは増やすより減らす

「このルールは、過去1ヶ月で1度でも自分を救ったか?」で判断します。救っていなければ削る。一度も発動しないルールは認知負荷を増やすだけで、やがて守られなくなります。ルールが長いほど、AIの中での優先度も薄まります。

そして事故ログを1つ持っておくこと。事故った日・誤ブロックされた日を追記していくと、「どのルールが実際に効いたか」があとで判断できます。

付録

変更がいつ反映されるか

「直したのに効かない」の9割はこれ。まず再起動する。

よくある詰まり

症状原因
hookが全く効かない実行権限がない(chmod +x)/jq 未インストール/パスの書き間違い
起動しなくなったsettings.json のJSONが壊れている(カンマ・括弧)。エディタで開くとすぐ分かる
毎回ブロックされて作業にならないgrepecho の文字列にパターンが入っている。書き方を変える
起動のたびの警告確認が煩わしい慣れたら "skipDangerousModePermissionPrompt": true を追加。柵を立て終わってから
バイパスモード
実行確認をスキップするモード。--dangerously-skip-permissions または settings.json の bypassPermissions
hook(フック)
ツール実行の前後に自動で走らせる自前のスクリプト。PreToolUse は「実行される直前」に割り込むもの
permissions.deny
Claude Code 本体が持つ拒否リスト。指定パターンのコマンドを実行させない
CLAUDE.md
起動時に毎回自動で読まれる指示書。ここに書いたことは「毎回言わなくてもいい指示」になる
rm -rf
フォルダを中身ごと問答無用で消すコマンド。ゴミ箱を経由しないので復元できない
git push --force
リモートの履歴を自分の履歴で上書きする操作。他人の作業を消しうる
さいごに

バイパスモードの本質は「AIを信用するかどうか」ではなく、取り返しがつく操作と、つかない操作を先に仕分けておくことです。

取り返しがつく操作は全部任せてスピードを取る。取り返しがつかない操作だけ、機械の柵と人の承認を通す。この線引きさえ作っておけば、確認プロンプトを消しても運用は壊れません。