ガイド

後悔せずにClaude Codeを無人で動かす

コマンドのたびに確認を求めるコーディングエージェントは、安全ですが夜間は役に立ちません。最初の確認で止まり、朝まで待ち続けます。解決策は、すべてのチェックを切ることではありません。エージェントが単独でしてよいこと、決してしてはいけないこと、確認すべきことを、前もって決めておくことです。このページはその決め方と、それを強制する設定をまとめたものです。

フラグではなく、マシンから考える

ほかに何も置いていないマシンでエージェントを動かせば、以下のガードレールはどれも簡単になります。ノートPCでの「すべて許可」は、メール、パスワードマネージャー、本番環境の認証情報、写真まで含みます。リポジトリ1つと範囲を絞ったトークン1つだけの専用マシンなら、「すべて許可」の対象はそのリポジトリとトークンだけです。Anthropic自身も、権限をバイパスするモードは隔離された環境で使うべきだとしています。エージェントをそうした環境に置けば、このページの残りはもっと簡単になります。

Claude Codeの権限モード

Claude Codeには4つのモードがあります。ずっと同じものを使うのではなく、タスクごとに選んでください。

  • default. ファイルの編集とシェルコマンドの前に確認します。対話的な作業には適していますが、夜間には向きません。
  • acceptEdits. 作業ディレクトリ内のファイルは確認なしで編集します。シェルコマンドの前には確認します。テストで判定できるリファクタリングに向いた、ちょうどよい中間の設定です。
  • plan. 読んで考えますが、何も変更しません。本番の実行前に、確認用の計画を出させるのに使います。
  • bypassPermissions. 確認を一切しません。これが無人実行用のモードです。隔離されたマシンで、下の拒否ルールを設定した場合にだけ使ってください。

モードは起動時に指定します。

claude --permission-mode acceptEdits

または、プロジェクトの設定ファイルでデフォルトのモードを決めます。このファイルをコミットすれば、チーム全体で共有できます。

// .claude/settings.json
{
  "permissions": {
    "defaultMode": "acceptEdits"
  }
}

拒否ルールはどのモードでも効く

多くの人が見落とすのがここです。権限ルールはモードの上に重なります。拒否ルールは、バイパスモードでも操作をブロックします。そのため、拒否ルールこそが無人実行の本当の安全網です。許可ルールは、毎回イエスと答えるような操作を事前に承認します。これでエージェントがそこで止まらなくなります。

// .claude/settings.json
{
  "permissions": {
    "allow": [
      "Bash(npm test:*)",
      "Bash(npm run lint:*)",
      "Bash(git add:*)",
      "Bash(git commit:*)",
      "Bash(git push origin HEAD:*)"
    ],
    "deny": [
      "Bash(git push:*--force*)",
      "Bash(git push origin main:*)",
      "Bash(rm -rf:*)",
      "Bash(curl:*)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(~/.ssh/**)"
    ]
  }
}

拒否リストはポリシーとして読んでください。実際にポリシーそのものだからです。強制プッシュはしない。mainにはプッシュしない。再帰的な削除はしない。エージェントが勝手に考えた外部へのリクエストは送らない。秘密情報のファイルは読まない。内容はプロジェクトに合わせて調整してください。ただし、無人で動かすマシンには必ず拒否リストを置いてください。

パターンでは表せないルールにはフック

状況によって変わるルールもあります。フックは、ツール呼び出しの前にスクリプトを実行し、承認、ブロック、変更ができます。よくある例は、本番環境のホスト名を含むコマンドを、内容にかかわらずブロックするものです。

// .claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "./scripts/block-prod.sh" }
        ]
      }
    ]
  }
}

スクリプトは標準入力からツール呼び出しを読み、0以外のコードで終了してブロックします。フックは小さく単純に保ってください。誰も気づかない形で失敗しうるフックは、フックがないより悪い状態です。

Gitが最良のガードレール

エージェント内の設定は1つ目の層です。リポジトリは2つ目の層で、どのエージェントが動いているかに左右されません。

  • mainを保護します。マージにはプルリクエストとCIの成功を必須にします。そうすれば、勝手なプッシュがあっても何も入りません。
  • タスクごとにブランチを1つ。エージェントは新しいブランチで作業を始め、そのブランチだけをプッシュします。
  • エージェントには、ブランチのプッシュとプルリクエストの作成だけができるトークンを渡します。管理者のスコープも、削除のスコープも付けません。リポジトリ1つに絞ったGitHubのfine-grainedトークンで実現できます。
  • 判定はテストに任せます。テストが失敗すれば、プルリクエストは赤のままで、朝にそれが分かります。

認証情報:最小限に、分けて

無人のマシンに個人の認証情報を置いてはいけません。エージェント用に別のアカウントかトークンを作り、タスクに必要な最小限のスコープにします。本番環境ではなくステージング環境を使います。読み取りで足りるなら読み取り専用にします。エージェントがブラウザでサービスにサインインする必要があるなら、テスト用のアカウントを使います。プロジェクトが終わったら、トークンをローテーションします。

上限付きのヘッドレス実行

スクリプトで動かすタスクなら、printモードでプロンプトを1つ実行して終了させます。ターン数の上限を付けて、混乱したエージェントが一晩中ループしないようにします。

claude -p "Fix the failing tests in packages/api and open a PR" \
  --permission-mode acceptEdits \
  --max-turns 60

出力はファイルに記録します。朝には、推測ではなく、何をしたのかを読みたいはずです。

Codexにも同じルールを

Codex CLIは2つの問いを分けて扱います。いつ承認を求めるか、そして何に触れてよいかです。1つのリポジトリ内での無人タスクなら、組み合わせは「確認しない」と「ワークスペース内だけ書き込み可」です。

codex -a never -s workspace-write exec "Fix the failing tests and commit"

Codexには、承認とサンドボックスの両方を外すフラグもあります。これはClaude Codeのバイパスモードとまったく同じに扱ってください。隔離されたマシンで使うか、使わないかのどちらかです。

禁止リスト

どのツールを使う場合でも、無人のエージェントにこれらのことをさせてはいけません。どれか1つでも可能な設定なら、最初の夜間実行の前に直してください。

  • 保護されたブランチへのプッシュ、あらゆる場所での強制プッシュ。
  • タスクに不要な秘密情報の読み取りや送信。
  • 本番データへのアクセス。読み取りだけでも不可です。
  • お金を使うこと。クラウドのコンソールも、決済ページも、広告アカウントも不可です。
  • 人へのメッセージ送信。メールも、チャットも、SNSも不可です。
  • 作業ツリーの外にあるものの削除。

よくある質問

--dangerously-skip-permissionsはbypassPermissionsと同じですか?

+

はい。このフラグとこの権限モード名は同じ働きをします。確認を一切しません。管理者はマネージド設定でこのモードを完全に無効にできます。その場合、フラグも設定も機能しません。

拒否ルールは本当にバイパスモードでも効きますか?

+

はい。拒否ルールは、bypassPermissionsを含むすべてのモードでブロックします。だからこそ、無人実行の安全網として適しています。

夜間作業で、安全かつ役に立つモードはどれですか?

+

acceptEditsに、拒否リストと保護されたmainブランチを組み合わせます。エージェントは自由に編集し、テストが判定します。事前に承認されていないシェルコマンドが必要な場合は、あなたを待ちます。エージェントが待っていたコマンドを見つけたら、許可ルールに追加してください。

エージェントは管理者ユーザーで動かすべきですか?

+

macOSでは、たいていそうせざるを得ません。HomebrewとXcodeがそれを前提にしているからです。これも専用マシンを使う理由の1つです。リポジトリ1つしかないマシンの管理者権限なら、被害の範囲は小さく済みます。ノートPCの管理者権限ではそうはいきません。

関連ガイド