Claude Code的設定,您是否隨意使用呢?
Hooks、Skills、CLAUDE.md、settings.json、MCP、權限管理…… 2026年的Claude Code功能爆炸性增長。但正確設定這些功能的工程師不到1%。
本文提供了涵蓋所有功能的「可用於生產的設定檔一套」。複製貼上即可立即使用。
立即使用的讀者: 我們已經公開一個將所有設定打包的資料庫,可以用一個命令在任何項目中進行配置。
curl -fsSL https://raw.githubusercontent.com/babushkai/claude-code-config/main/setup.sh
GitHub: https://github.com/babushkai/claude-code-config
Claude Code的設定由7個層次組成:
只有正確設定這些內容,才能真正稱之為「生產運用」。
首先,讓我們看看完成的目錄結構:
your-project/
├── CLAUDE.md # 項目指示文件(git管理)
├── CLAUDE.local.md # 個人指示文件(gitignore)
├── .mcp.json # 團隊共享MCP設定(git管理)
├── .claude/
│ ├── CLAUDE.md # 別名配置OK(與CLAUDE.md相同)
│ ├── settings.json # 共享設定(git管理)
│ ├── settings.local.json # 個人設定(gitignore)
│ ├── rules/ # 模組化規則
│ │ ├── code-style.md
│ │ ├── testing.md
│ │ ├── security.md
│ │ └── frontend/
│ │ ├── react.md
│ │ └── styles.md
│ ├── skills/ # 自訂技能
│ │ ├── deploy/
│ │ │ └── SKILL.md
│ │ ├── review-pr/
│ │ │ └── SKILL.md
│ │ └── fix-issue/
│ │ └── SKILL.md
│ ├── agents/ # 自訂子代理
│ │ └── security-reviewer/
│ │ └── AGENT.md
│ └── hooks/ # Hook腳本
│ ├── lint-on-save.sh
│ ├── block-secrets.sh
│ └── notify-slack.sh
│
├── ~/.claude/ # 使用者全域設定
│ ├── CLAUDE.md # 全項目通用的個人指示
│ ├── settings.json # 全域設定
│ ├── settings.local.json # 僅限本地
│ ├── rules/ # 個人規則
│ │ └── preferences.md
│ └── skills/ # 個人技能
│ └── explain-code/
│ └── SKILL.md
CLAUDE.md是安裝到Claude腦中的項目DNA。
| 優先級 | 種類 | 路徑 | 用途 |
|---|---|---|---|
| 最高 | 管理政策 | /Library/Application Support/ClaudeCode/CLAUDE.md |
組織整體規則 |
| 高 | 項目 | ./CLAUDE.md |
團隊共享指示 |
| 高 | 規則 | .claude/rules/*.md |
模組化指示 |
| 中 | 使用者 | ~/.claude/CLAUDE.md |
個人的全域設定 |
| 低 | 本地 | ./CLAUDE.local.md |
個人的項目特定設定 |
| 自動 | 自動記憶體 | ~/.claude/projects/<project>/memory/ |
Claude的自動學習記錄 |
最常見的錯誤:將可以從源代碼獲取的資訊寫入CLAUDE.md。
Claude可以通過閱讀package.json了解構建命令,透過tsconfig.json獲得TypeScript的設定,探索目錄可以解釋架構,而.eslintrc中的資料則能獲知編碼規範。
將這些寫入CLAUDE.md是浪費token。
CLAUDE.md應只記錄那些Claude無法透過閱讀源代碼獲得的資訊:
| 應該寫的(只有人類知道) | 不該寫的(可以從代碼推論) |
|---|---|
| 為什麼選擇這種架構 | packages/底下的目錄列表 |
| 從過去事件中學到的禁止事項 | 可以使用pnpm build進行構建 |
| 業務上的限制或優先級 | 使用TypeScript |
| 部署環境的資訊 | ESLint的規則 |
| 團隊之間的決定和工作流程 | 依賴包的列表 |
| 「這段代碼別碰」的隱性知識 | 測試框架是Vitest |
# 項目的決策過程
## 為什麼會選擇這種結構
- 採用單一代碼庫的原因:前端和後端之間的型別共享,將錯誤數量從每週3個減少至0
- 選擇Hono的原因:Cloudflare Workers中的冷啟動時間低於50ms
- 使用PlanetScale的原因:安全地在生產數據庫中進行模式變更
## 絕對不能做的事情
- `packages/shared/src/legacy/` 是舊API的兼容層。雖然會想重構,但請勿改動(有3家客戶依賴,計畫於2026年Q3淘汰)
- Stripe的webhook處理器一旦破壞冪等性將導致重複收費,過去曾發生過$12,000的事故
- `users`表的`email`欄位沒有UNIQUE約束。歷史原因下存在重複,應在應用層進行驗證
## 部署與環境
- staging: Cloudflare Workers(`wrangler deploy --env staging`)
- production: 生產部署僅限GitHub Actions。禁止手動部署
- DB遷移: 必須先在staging上執行`pnpm db:migrate`並確認
## 團隊工作流程
- PR必須經過至少一人的審核
- `feat/`分支使用squash merge,`fix/`分支使用正常merge
- 每週五15時後禁止進行生產部署(以避免周末的應對)
## 業務背景
- 企業客戶對於SLA要求在200ms內的響應時間
- 必須遵循GDPR。用戶數據必須進行邏輯刪除(禁止物理刪除)
- 每月1日深夜進行的月報生成由cron執行。這一天的DB負載較高
此範本的要點
pnpm install或pnpm test → Claude可以通過閱讀package.json得知ls得知可以從CLAUDE.md引用其他檔案:
有關項目的概要請參見 @README.md。
可以使用的命令請查閱 @package.json。
Git運作規則依循 @docs/git-workflow.md 。
# 個人設定
- @~/.claude/my-project-instructions.md
import的注意事項
@不被解釋為import可以為特定的檔案模式編寫適用的規則:
# .claude/rules/api-rules.md
---
paths:
- "packages/backend/src/routes/**/*.ts"
---
# API開發規則
- 所有端點均需加入zod驗證
- 錯誤響應須按照RFC 7807格式
- 響應中需包含分頁資訊
- 回傳速率限制標頭
# .claude/rules/react-rules.md
---
paths:
- "packages/frontend/src/**/*.{tsx,ts}"
---
# React開發規則
- 預設使用Server Components
- "use client"應盡量減少使用
- 使用Suspense管理加載狀態
- key屬性不能使用index
管理政策(最高)
↓
CLI標記(--disallowedTools等)
↓
.claude/settings.local.json(項目本地)
↓
.claude/settings.json(項目共享)
↓
~/.claude/settings.local.json(使用者本地)
↓
~/.claude/settings.json(使用者共享・最低)
{
"permissions": {
"defaultMode": "default",
"allow": [
"Read",
"Glob",
"Grep",
"Bash(pnpm run *)",
"Bash(pnpm test *)",
"Bash(pnpm build *)",
"Bash(pnpm lint *)",
"Bash(pnpm typecheck)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git branch *)",
"Bash(git checkout *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(gh pr *)",
"Bash(gh issue *)",
"Bash(npx prisma *)",
"Bash(* --version)",
"Bash(* --help)",
"Edit(/packages/**)",
"Write(/packages/**)"
],
"deny": [
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(rm -rf *)",
"Bash(curl *)",
"Bash(wget *)",
"Read(.env*)",
"Read(**/*.pem)",
"Read(**/*secret*)",
"Edit(.env*)",
"Edit(/.github/workflows/**)"
]
},
"env": {
"MAX_MCP_OUTPUT_TOKENS": "50000"
}
}
{
"permissions": {
"allow": [
"Bash(docker *)",
"Bash(docker-compose *)"
]
},
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR/.claude/hooks/lint-on-save.sh\""
}
]
}
]
}
}
Claude Code會預設在提交訊息中添加Co-Authored-By: Claude。若不需要,可透過attribution設定來隱藏:
{
"attribution": {
"commit": "",
"pr": ""
}
}
| 鍵 | 預設 | 說明 |
|---|---|---|
attribution.commit |
附加Co-Authored-By標籤 | 提交訊息的歸屬顯示 |
attribution.pr |
在說明中顯示Claude Code | PR描述的歸屬顯示 |
可以用空字串""完全隱藏,亦可設定自訂訊息:
{
"attribution": {
"commit": "Generated with Claude Code"
}
}
若置入~/.claude/settings.json中則對所有項目生效。
| 工具 | 模式範例 | 說明 |
|---|---|---|
Bash |
Bash(npm run *) |
所有以npm run開頭的命令 |
Bash |
Bash(git commit *) |
允許git提交 |
Read |
Read(.env*) |
讀取.env文件 |
Read |
Read(~/.ssh/*) |
使用者主目錄下的.ssh |
Read |
Read(//etc/passwd) |
絕對路徑(以//開頭) |
Edit |
Edit(/src/**) |
相對於專案根目錄的路徑 |
Edit |
Edit(**/*.test.ts) |
所有測試文件 |
WebFetch |
WebFetch(domain:github.com) |
指定域名 |
MCP |
mcp__github__* |
所有GitHub的MCP工具 |
Task |
Task(Explore) |
Explore子代理 |
Skill |
Skill(deploy *) |
deploy技能 |
*重要:``前面的空格會改變行為**
Bash(ls *) → 匹配ls -la,不匹配lsof(有單字邊界)Bash(ls*) → 同時匹配ls -la和lsof(無單字邊界)Hooks與CLAUDE.md的「請求」不同,確保實際執行。
| 事件 | 時機 | 可阻擋 |
|---|---|---|
SessionStart |
開始/重啟會話 | - |
UserPromptSubmit |
提交後的立即獲得 | - |
PreToolUse |
執行工具前 | 是 |
PermissionRequest |
顯示權限對話框 | - |
PostToolUse |
工具成功後 | - |
PostToolUseFailure |
工具失敗後 | - |
Notification |
發送通知時 | - |
SubagentStart |
啟動子代理時 | - |
SubagentStop |
停止子代理時 | - |
Stop |
Claude響應完成時 | - |
TeammateIdle |
團隊成員處於空閒狀態 | - |
TaskCompleted |
任何任務完成時 | - |
ConfigChange |
設定檔變更時 | - |
WorktreeCreate |
建立worktree時 | - |
WorktreeRemove |
刪除worktree時 | - |
PreCompact |
在壓縮上下文前 | - |
SessionEnd |
結束會話時 | - |
command → 執行Shell腳本
http → 發送HTTP POST請求
prompt → 將判斷留給LLM(是/否)
agent → 使用子代理進行驗證
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR/.claude/hooks/block-secrets.sh\"",
"statusMessage": "進行安全檢查中..."
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR/.claude/hooks/lint-on-save.sh\"",
"timeout": 30
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR/.claude/hooks/notify-slack.sh\"",
"async": true
}
]
}
]
}
}
危險命令阻止(PreToolUse):
#!/bin/bash
# .claude/hooks/block-secrets.sh
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
# 阻止包含秘密資訊的命令
if echo "$COMMAND" | grep -qE '(password|secret|token|api.?key)'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "含有秘密資訊的命令被阻止"
}
}'
exit 0
fi
# 阻止rm -rf命令
if echo "$COMMAND" | grep -qE 'rm\s+-rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "rm -rf 被禁止"
}
}'
exit 0
fi
exit 0
保存檔案後自動校正(PostToolUse):
#!/bin/bash
# .claude/hooks/lint-on-save.sh
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_result.filePath // empty')
if [ -z "$FILE_PATH" ]; then
exit 0
fi
# 只針對TypeScript檔案進行校正
if [[ "$FILE_PATH" == *.ts || "$FILE_PATH" == *.tsx ]]; then
RESULT=$(npx eslint --fix "$FILE_PATH" 2>&1)
if [ $? -ne 0 ]; then
jq -n --arg msg "$RESULT" '{
hookSpecificOutput: {
hookEventName: "PostToolUse"
},
transcript: ("ESLint錯誤:\n" + $msg)
}'
fi
fi
exit 0
Slack通知(Stop - 非同步):
#!/bin/bash
# .claude/hooks/notify-slack.sh
INPUT=$(cat)
STOP_REASON=$(echo "$INPUT" | jq -r '.stop_reason // "unknown"')
if [ "$STOP_REASON" = "end_turn" ]; then
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"Claude Code的任務已完成\"}" > /dev/null 2>&1
fi
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "prompt",
"prompt": "請判斷以下Bash命令是否會影響生產環境。命令: $ARGUMENTS。如果包含對生產DB的連接、向生產伺服器的部署、或環境變數的更改,請回答no。",
"timeout": 15
}
]
}
]
}
}
| 字段 | 必需 | 說明 |
|---|---|---|
name |
否 | /命令名(省略時為目錄名) |
description |
推薦 | 用途的描述(Claude自動啟動的依據) |
argument-hint |
否 | 參數提示(例如:[issue-number]) |
disable-model-invocation |
否 | 用true來禁用Claude自動啟動 |
user-invocable |
否 | 若設為false則從/選單中隱藏 |
allowed-tools |
否 | 這個Skill中允許的工具 |
model |
否 | 指定使用的模型 |
context |
否 | 用fork執行子代理 |
agent |
否 | 當context: fork時的代理類型 |
hooks |
否 | Skill專屬的Hooks |
PR審核技能:
# .claude/skills/review-pr/SKILL.md
---
name: review-pr
description: 審核PR並提供改進的建議
context: fork
agent: Explore
allowed-tools: Bash(gh *)
argument-hint: "[PR編號]"
disable-model-invocation: true
---
## PR上下文
- PR差異: !`gh pr diff $ARGUMENTS`
- PR評論: !`gh pr view $ARGUMENTS --comments`
- 更改文件: !`gh pr diff $ARGUMENTS --name-only`
## 審核步驟
1. 理解變更的意圖
2. 檢查代碼的質量(型別安全性、錯誤處理)
3. 確認是否有安全隱患
4. 評估對性能的影響
5. 檢查測試覆蓋範圍
將審核結果總結為要點,並標註重要性(關鍵/主要/次要)。
Issue修正技能:
# .claude/skills/fix-issue/SKILL.md
---
name: fix-issue
description: 修復GitHub Issue
disable-model-invocation: true
argument-hint: "[issue編號]"
---
修復GitHub issue #$ARGUMENTS。
1. 使用`gh issue view $ARGUMENTS`查看Issue內容
2. 確認相關代碼
3. 實施修正
4. 添加測試
5. 使用`git commit -m "fix: 修正 #$ARGUMENTS"`
部署技能(執行子代理):
# .claude/skills/deploy/SKILL.md
---
name: deploy
description: 部署至測試環境
disable-model-invocation: true
context: fork
allowed-tools: Bash(pnpm *), Bash(git *), Bash(gh *)
---
將$ARGUMENTS部署至測試環境:
1. 執行測試套件
2. 執行構建
3. 執行部署命令
4. 確認部署成功
5. 通知Slack
可以使用!command`語法將Shell命令的結果注入到Skill中:
---
name: status
description: 專案狀態摘要
context: fork
agent: Explore
---
## 當前狀態
- 分支: !`git branch --show-current`
- 未提交: !`git status --short`
- 最新提交: !`git log --oneline -5`
- 測試結果: !`pnpm test --silent 2>&1 | tail -5`
- 型別檢查: !`pnpm typecheck 2>&1 | tail -3`
根據上述資訊總結專案狀態。
# HTTP(推薦)
claude mcp add --transport http github https://api.githubcopilot.com/mcp/
# SSE(不推薦)
claude mcp add --transport sse sentry https://mcp.sentry.dev/sse
# stdio(本地執行)
claude mcp add --transport stdio --env AIRTABLE_API_KEY=$KEY airtable \
-- npx -y airtable-mcp-server
| 範疇 | 儲存位置 | 共享範圍 |
|---|---|---|
local |
~/.claude.json |
僅限本人・本專案 |
project |
.mcp.json |
整個團隊(git管理) |
user |
~/.claude.json |
僅限本人・所有專案 |
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
},
"database": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@bytebase/dbhub", "--dsn", "${DB_DSN}"],
"env": {
"DB_DSN": "${DB_DSN:-postgresql://readonly:pass@localhost:5432/dev}"
}
}
}
}
如果MCP工具過多影響上下文,自動Tool Search將會被啟用:
# 將閾值改為5%
ENABLE_TOOL_SEARCH=auto:5 claude
# 始終啟用
ENABLE_TOOL_SEARCH=true claude
# 禁用
ENABLE_TOOL_SEARCH=false claude
~/.claude/projects/<project>/memory/
├── MEMORY.md # 索引(前200行被載入)
├── debugging.md # 調試模式
├── api-conventions.md # API設計的決策
└── ... # Claude自動生成
MEMORY.md僅載入最多200行。
超過的資訊需分為按主題的檔案,並從MEMORY.md鏈接。Claude將根據需要載入主題檔案。
> 請記住不使用npm,而使用pnpm。
> 請將API測試需要本地Redis的資訊保存到記憶體中。
// .claude/settings.json 中按專案禁用
{
"autoMemoryEnabled": false
}
# 環境變數強制控制(settings.json優先)
CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 claude # 強制關閉
CLAUDE_CODE_DISABLE_AUTO_MEMORY=0 claude # 強制開啟
確保一切已正確設置:
.env*文件的Read/Edit設置為denyrm -rfgit push --force設置為deny*.pem)curl/wget設置為deny,限制為WebFetch.claude/settings.json.mcp.json.claude/rules/管理編碼規範.gitignore中添加以下內容:CLAUDE.local.md
.claude/settings.local.json
// 錯誤: 危險
{
"permissions": {
"allow": [
"Bash"
]
}
}
// 正確: 僅允許必要的命令
{
"permissions": {
"allow": [
"Bash(pnpm *)",
"Bash(git status)",
"Bash(git diff *)"
]
}
}
<!-- 錯誤: Claude可通過package.json和目錄結構獲取這些 -->
# 專案概要
TypeScript + React + Node.js的SaaS應用。
packages/frontend: Next.js 15
packages/backend: Hono
## 命令
- `pnpm install` - 安裝依賴
- `pnpm build` - 構建
- `pnpm test` - 執行測試
<!-- 正確: 寫出只有人類知道的『為什麼』和『不該這樣做』 -->
# 決策及限制
- legacy/預定於2026年Q3淘汰。請勿觸動
- 若打破Stripe webhook的冪等性,將導致重複收費(過去有$12K事故)
- 週五15時後禁止進行生產部署
// 錯誤: 無timeout(預設600秒)
{
"type": "command",
"command": "npm run lint"
}
// 正確: 設定適當的timeout
{
"type": "command",
"command": "npm run lint",
"timeout": 30
}
# 錯誤: Claude有可能自動執行部署技能
---
name: deploy
description: Deploy to production
---
# 正確: 僅允許手動執行
---
name: deploy
description: Deploy to production
disable-model-invocation: true
---
整合了Claude Code生產運用所需的所有設定:
disable-model-invocation: true.mcp.json。認證資訊使用環境變數attribution.commit與attribution.pr來控制歸屬顯示只有在這一切均設定完畢後,Claude Code才能從「玩具」轉變為「生產工具」。
如果本文對您有所幫助,請給予讚與收藏!
有任何問題:您在Claude Code設定中最注重的是什麼?