202602個人的claude code設定
同僚に共有するために書きました。
デフォルトで自走させる
基本はbypass-permissionsでいいでしょう。
{
"permissions": {
"defaultMode": "bypassPermissions"
}
}
cageで囲む
bypass-permissionsで自律作業してくれるのはいいのですが、勝手に関係ないディレクトリとかを消されると困ります。
claude code本体にはsandbox機能があるのですが、bypass-permissions状態だと自力でsandboxを突破することがあり、あまり信用できません。以下のissueがありますが、記事執筆時点では明確に修正の報告がありません。
このへんはclaude外のツールで防衛策を張るのが安全でしょう。筆者はcageを使っています。
こんな感じで設定して、cage claudeで起動すれば、明示的に許可したディレクトリ以外を操作できなくなります。cage claude --continueなどのパラメータもそのまま渡せます。
presets:
base:
allow:
- "." # current
- "$XDG_CACHE_HOME" # ~/.cache
- "$XDG_DATA_HOME" # ~/.local/share
- "/private/tmp" # macos tmp directory
- "/var/folders" # macos mktemp
- "/Library/Caches" # macos app caches
- "$HOME/Library/Caches" # macos app caches
git-enabled:
allow-git: true
allow-keychain: true # macOS only
claude-code:
allow:
- "$CLAUDE_CONFIG_DIR"
- "$HOME/.serena"
- ".serena"
auto-presets:
- command: claude
presets:
- base
- git-enabled
- claude-code
なお、mcpなどclaudeから呼び出すツールを追加したときは、そのツールがデータを保存するディレクトリを追加で許可する必要があります。
使ってほしくないコマンドはhooksで制限する
bypass-permissionsで自律作業してくれるのはいいのですが、git pushとかを勝手に実行されると困ります。settings.jsonのdenyに指定するのがよくあるやり方ですが、単にdenyされるだけだとあの手この手で突破しようとしてきます。「それはだめだから諦めて」と指示を出すと比較的素直に従ってくれます。
settings.jsonはこんな感じ。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/validate-bash.sh"
}
]
}
]
}
}
実際のvalidate-bash.shはこんな感じです。特定のコマンドがBashツールで使用されたとき、理由とともに実行を拒否します。
#!/bin/bash
# Validate specific Bash commands usage
# Read JSON input from stdin
input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name // ""')
command=$(echo "$input" | jq -r '.tool_input.command // ""')
# Only validate Bash tool
if [[ "$tool_name" != "Bash" ]]; then
exit 0
fi
# Deny with JSON hookSpecificOutput
deny() {
jq -n --arg reason "$1" '{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": $reason
}
}'
exit 0
}
# Check for forbidden commands
# Use word boundary matching to avoid false positives (e.g., "category" matching "cat")
if echo "$command" | grep -qE '\bawk\b'; then
deny "Use of 'awk' is prohibited. Use 'perl' instead. Example: perl -lane 'print \$F[0]' file.txt"
fi
if echo "$command" | grep -qE '\bsed\b'; then
deny "Use of 'sed' is prohibited. Use 'perl' instead. Example: perl -pi -e 's/old/new/g' file.txt"
fi
if echo "$command" | grep -qE '\bpush\b'; then
deny "Do not execute 'git push'. Please ask the user to execute it."
fi
if echo "$command" | grep -qE '\bgit add (-A|--all|\.($|[ ;|&]))'; then
deny "Do not git-add all files. Specify the file name(s) to add."
fi
exit 0
rtkでトークンを絞る
自律作業させるとgitコマンドを何度も叩くことになるわけですが、ぜんぶ読ませるのは無駄です。rtkで出力をカットしましょう。
まだまだ対応コマンドが少ないので、使用頻度が高いものに対しては自前でtoken cut-off proxyを作ってもいいかなーと思っています。
statuslineにはトークン使用割合を出す
この記事そのままじゃなくてもいいですが。
現在はこの記事を書いたときとは違い、自動でトークン使用量が出ますが、いまどのくらい使ってるかがわかると心の準備ができます。
作業完了通知はスマホで受ける
スマホで受ければスマートウォッチにも飛ばせます。
フロントエンドの確認もやらせる
筆者はagent-browserを使っています。
agent-browser-mcpもあるのですがトークンの消費がでかすぎるので止めました。agent-browser cliだけでも十分動いてくれています。
AI記録用ディレクトリは決めておく
筆者はz-aiというディレクトリをグローバルにgitignoreし、AIの計画書を配置するのに使っています。これはCLAUDE.mdで指示しておきます。
agent-browserのスクショもここに保存してくれます。
markdownとして出力した計画書はArtoで見ます。
スマホから操作してhappyになる
happyを紹介しようと思っていたのですが…
yepanywhereというのもありましたが…
公式からremote-controlが提供されるようになったので今後はこっちを使うのが良さそうです。
よく使うプロンプトはコマンド化する
「こういうことをするslash commandを作って保存して」と指示すればclaudeはコマンドを作ってくれます。
最近便利に使っているのは以下です。
ローカルで実装した際は/review→/addressを、PRに対してレビューがついた場合は/address→/reply-reviewを、それぞれ順次実行する感じになります。
ちなみにreviewは先入観を除きたいので、サブエージェントを用意し、それに任せる形にしています。
以上
最新の設定はdotfilesを見てください。
たぶんこのrepoをわたして「ここから取り込めそうな設定を列挙して」とか指示するのが一番早いと思います。
Discussion