技術 約4分で読めます

Claude Code設定の理想と現実

Xで@adocomplete氏が「Claude Codeの設定5選」を紹介していた。「これで毎回Askから解放される!」と期待して試してみたら、やっぱり現実は甘くなかった話。

過去に「Claude Codeの権限設定、なんもわからん」という記事を書いたけど、あれから約3週間。状況は変わったのか、改めて検証してみた。

話題の設定5選

Ado氏が紹介していた設定はこの5つ:

1. defaultMode: “acceptEdits”

{
  "permissions": {
    "defaultMode": "acceptEdits"
  }
}

ファイル編集を自動承認。Bashコマンドは引き続き確認が出る。

「diffレビューしてるから確認クリックは冗長」という発想。

2. attribution

{
  "attribution": {
    "commit": "",
    "pr": ""
  }
}

Gitコミットやプルリクエストに付く Co-authored-by: Claude の表記を制御。空文字でクリーンな履歴に。

includeCoAuthoredBy 設定の後継。

3. cleanupPeriodDays

{
  "cleanupPeriodDays": 0
}

セッション履歴の自動削除日数。デフォルトは30日。

  • 0: 毎回クリーン
  • 大きい値: 長期保持

4. alwaysThinkingEnabled

{
  "alwaysThinkingEnabled": true,
  "env": {
    "MAX_THINKING_TOKENS": "8000"
  }
}

全レスポンスでExtended Thinkingを有効化。レイテンシと引き換えに品質向上。

MAX_THINKING_TOKENS 環境変数で思考トークン数を指定できる。

5. additionalDirectories

{
  "permissions": {
    "additionalDirectories": ["../shared-lib", "~/docs"]
  }
}

Claude Codeはデフォルトでプロジェクトディレクトリにサンドボックス化されている。共有ライブラリやモノレポの兄弟ディレクトリにアクセスさせたい場合に指定。

設定ファイルの場所

OSユーザー設定プロジェクト設定
Windows%USERPROFILE%\.claude\settings.json.claude/settings.json
macOS/Linux~/.claude/settings.json.claude/settings.json

プロジェクト設定はgit管理対象にできる。個人用のオーバーライドは .claude/settings.local.json に書く(gitignore推奨)。

期待と現実のギャップ

ここからが本題。設定してみて分かった「理想と現実」。

ワイルドカードは完全なワイルドカードじゃない

Bash(npm *) を書いても、Bash(npm run build:*) が別途追加される。

公式ドキュメントにも:

Bash rules use prefix matching, not regex

Bash patterns are prefix matches and can be bypassed

正規表現じゃなくて前方一致。そして「バイパスされうる」と明記されている。

bypassPermissions でも最低限の許可は求められる

defaultMode には3段階ある:

モード動作
askAlways毎回確認(デフォルト)
acceptEditsファイル編集は自動、Bashは確認
bypassPermissions全部自動

bypassPermissions なら完全に任せられる!」と思ったけど、実際は最低限の許可は求められた。WebFetchも個別許可が必要だった。

ちなみにWebFetchの代替スキルを作って許可プロンプトを回避したこともあるけど、結局Claude Code自体がアクセスできないサイトでは取得できないので、完全な解決策ではない。

トリッキーな方法として、MCPでGeminiにURL取得させて結果だけ受け取るという手もある。AIの協業。Geminiは拒否するサイトが少ない(Googleを蹴ることになるから)。

allow リストの限界

{
  "permissions": {
    "allow": [
      "Bash(pnpm:*)",
      "Bash(git:*)"
    ]
  }
}

これで「pnpmとgitは任せる」ができる…はずだった。

実際は、新しいサブコマンドを使うたびに settings.local.json に追加されていく。前回の記事で書いた問題は今も残ってる。

結局どう設定すればいいのか

完璧な制御は諦めて、ワークフローに合わせて設定するのが現実的。

1作業1チャット派

{
  "cleanupPeriodDays": 0,
  "permissions": {
    "defaultMode": "acceptEdits"
  }
}

セッション履歴は要らない。作業が終わったら用済み。重要な知見はCLAUDE.mdに書き出す。

「とにかく任せたい」派

{
  "permissions": {
    "defaultMode": "acceptEdits",
    "allow": [
      "Bash(pnpm:*)",
      "Bash(npm:*)",
      "Bash(git:*)",
      "Bash(docker:*)"
    ]
  }
}

よく使うコマンドは allow に入れておく。完璧じゃないけど、Ask頻度は減る。

品質重視派

{
  "alwaysThinkingEnabled": true,
  "env": {
    "MAX_THINKING_TOKENS": "10000"
  }
}

複雑なリファクタやアーキテクチャ検討が多いなら。ただしレイテンシとコスト(API利用の場合)のトレードオフ。

単純なタスクには /think コマンドで必要な時だけ有効にする方が効率的なことも多い。

採用した設定と採用しなかった設定

設定採用理由
defaultMode: "acceptEdits"作業を任せたいので
cleanupPeriodDays: 01作業1チャットで完結させるから
attribution: ""AI支援の透明性として残す派
alwaysThinkingEnabled必要な時だけ /think で十分
additionalDirectories今のプロジェクト構成では不要

まとめ

Claude Codeの設定は「これを入れれば完璧」というものはない。

  • ワイルドカードは前方一致で、バイパスされうる
  • bypassPermissions でも最低限の確認は出る
  • allow リストは完璧じゃないけど、Ask頻度は減らせる

完璧を求めず、自分のワークフローに合わせてcherry-pickするのが正解。設定しても思ったように動かないことがあるのは、もう仕様として受け入れるしかない。

参考

過去記事