Claude Code Workspace・Hooks・Permissions 設定 — /goal完全無人実行の環境整備

/goal を Auto Mode と組み合わせて完全無人実行するには、Permissions(許可ルール)・Permission Mode(実行モード)・Additional Directories(アクセス範囲)の3要素を正しく設定する必要がある。
この記事では公式 settings.json 仕様に準拠した4ステップのセットアップを示す。
⚠️ 注: 本記事は Claude Code v2.1.147 時点の公式ドキュメント(https://code.claude.com/docs/en/permissions)に基づく。settings.jsonキー名はバージョンで変わる可能性があるため、最新公式仕様を必ず確認してほしい。
3要素の役割
| 要素 | 役割 | 公式キー |
|---|---|---|
| Permissions | Tool単位の許可/拒否ルール | permissions.allow / ask / deny |
| Permission Mode | セッション全体の挙動 | defaultMode または --permission-mode <mode> |
| Additional Directories | アクセス可能ディレクトリの拡張 | additionalDirectories または --add-dir <path> |
Auto Mode(--permission-mode auto)は背景チェック付きでツール呼び出しを自動承認するモード(公式ドキュメント: "Currently a research preview")。設定済みallow/denyルールはAuto Modeでも常に効く。
Permission Modes — 6種類
公式仕様の全モード(defaultMode または起動フラグ --permission-mode):
| Mode | 説明 |
|---|---|
default | デフォルト。初回使用時に承認プロンプト |
acceptEdits | ファイル編集と一般的なfsコマンド(mkdir/touch/mv等)を working directory + additionalDirectories配下で自動承認 |
plan | Plan Mode。ファイル読み取り+read-onlyコマンドのみ、編集不可 |
auto | 背景チェック付き自動承認(research preview) |
dontAsk | 事前承認以外は自動拒否 |
bypassPermissions | 全プロンプトスキップ(rm -rf / や rm -rf ~ のみsafety circuit-breaker残る) |
サンドボックス環境以外で bypassPermissions は非推奨。 通常運用は auto を選ぶ。
ステップ1: アクセス範囲を additionalDirectories で限定
~/.claude/settings.json:
{
"additionalDirectories": [
"/Users/me/Projects/kanautech-hp"
]
}
または起動時に claude --add-dir /Users/me/Projects/kanautech-hp で同等。働ディレクトリ + これら追加ディレクトリの外には、編集権限が及ばない。
ステップ2: permissions.deny で危険操作をブロック
{
"permissions": {
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(git push --force *)",
"Edit(.env)",
"Edit(.env.*)",
"Edit(secrets/**)"
]
}
}
評価順は deny → ask → allow。deny が付いたツール呼び出しは他のallowでもブロックされる。 プロジェクト共通の安全装置はこの方式で実装する。
📘 全パターン構文は公式ドキュメントを参照。
ステップ3: permissions.allow で承認不要な操作を pre-approve
頻繁に使う安全コマンドを事前承認すれば、Auto Mode起動後に毎回の承認待ちが消える。
{
"permissions": {
"allow": [
"Bash(npm test *)",
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Edit(src/**)",
"Edit(content/**)"
]
}
}
glob ワイルドカード:Bash(ls *) は ls -la にマッチ(空白あり)、Bash(ls*) は lsof も含む(空白なし)。
ステップ4: Auto Mode で /goal を起動
3要素の設定が完了したら、Auto Mode で起動する。
# 完全無人モード
claude --permission-mode auto
# プロンプト内(ターン上限を必ず併記)
/goal test/auth 全件通過, or stop after 15 turns
起こること:
additionalDirectories配下のみが編集対象permissions.deny一致操作はブロックpermissions.allowパターンは承認プロンプト無しで実行- それ以外は Auto Mode の背景チェックで判定
/goalのターン上限で暴走停止
完全な settings.json サンプル(公式仕様準拠)
実務で使う完成形:
{
"additionalDirectories": [
"/Users/me/Projects/kanautech-hp"
],
"permissions": {
"allow": [
"Bash(npm test *)",
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Edit(src/**)",
"Edit(content/**)",
"Edit(scripts/**)"
],
"deny": [
"Bash(rm -rf /)",
"Bash(rm -rf ~)",
"Bash(sudo *)",
"Bash(git push --force *)",
"Edit(.env)",
"Edit(.env.*)",
"Edit(secrets/**)"
]
},
"defaultMode": "default"
}
defaultMode はセッション開始時のモード。--permission-mode auto で個別オーバーライド可能。
セキュリティ運用の3原則
公式仕様で実現可能な安全運用パターン。
原則1: ターン上限は /goal 文に必ず書く
/goal リファクタ完了, or stop after 15 turns
/goal の公式仕様にコスト/ターン上限を settings.json で定義する機構はない。/goal 文内の or stop after N turns または or stop after N minutes で明示するのが唯一の公式方法。
原則2: permissions.deny で実行禁止コマンドを明示
破壊操作は permissions.deny で先回りブロック:
{
"permissions": {
"deny": [
"Bash(rm -rf *)",
"Bash(DROP TABLE *)",
"Bash(TRUNCATE *)",
"Bash(wrangler pages delete *)",
"Bash(git push --force *)",
"Edit(.env*)",
"Edit(production/**)"
]
}
}
原則3: 本番接続は別 settings で隔離
本番DB / 本番API用の認証情報を含む.envは permissions.deny で読み取り禁止。本番運用は bypassPermissions 非対応の隔離環境で実行。
プロジェクト共有用の .claude/settings.json
チーム共有用のプロジェクト設定。git管理対象にして全員に同じ設定を配布する。
// <project-root>/.claude/settings.json
{
"permissions": {
"deny": [
"Edit(migrations/**)",
"Bash(wrangler pages delete *)",
"Bash(DROP TABLE *)"
]
}
}
マネージド設定 → コマンドライン → プロジェクトlocal → プロジェクト共有 → ユーザー設定 の precedence で、上位 deny は下位で覆せない。
よくある質問
Auto Mode で安全に無人実行する方法は?
claude --permission-mode auto で起動し、settings.json の permissions.deny / ask で危険操作を明示的にブロックする。bypassPermissions モードは多くの承認をスキップするが、rm -rf / や rm -rf ~ は依然プロンプトが出るサーキットブレーカーが組み込まれている。本番DB操作・認証情報書き換えは別ワークフローに分離してほしい。
permissions.allow / deny / ask の優先順位は?
deny → ask → allow の順で評価され、deny が最強優先。マネージド設定 → コマンドライン → プロジェクト local → プロジェクト共有 → ユーザー設定の順で、どの階層でも deny が付けばその時点で他の allow は効かない。
ファイル書き込みを特定ディレクトリだけに制限するには?
permissions の Edit(/path/**) 形式で許可ルール、または additionalDirectories 設定で Claude がアクセス可能なディレクトリを明示する。acceptEdits モードでも、working directory または additionalDirectories 配下のみが対象。
settings.json はどこに置きますか?
- ユーザー設定:
~/.claude/settings.json - プロジェクト共有:
<project-root>/.claude/settings.json - プロジェクト local:
<project-root>/.claude/settings.local.json
後者2つはgit管理可能(機密情報を含めないこと)。マネージド設定は管理者がOS/MDM経由で配布。
/goal のターン上限はどこに書きますか?
/goal 文内に or stop after N turns を併記するのが公式仕様(条件は4000字以内)。settings.jsonに上限を書く方法は公式にはない。安全装置は permissions.deny で危険コマンドをブロック + /goal 文にターン上限を必ず書く、の二段構えが現実的。
関連記事
- Claude Code /goal 完全ガイド — シリーズPillar
- /goal と /loop、Stop Hooks、Auto Mode の使い分け — 4方法対比
- Claude Code Remote Control で /goal を外部制御 — 外部からの呼び出し
