"前缀"= 发给模型的请求里,从第 0 个 token 开始、逐字节连续相同的那一段。一旦遇到第一个不一样的 token,从那里到结尾全部失效、重新计算。这页用真实请求结构 + 可交互动画把它讲透。
数字均有依据:规则/价格取自 Anthropic 官方文档,命中率与省钱金额来自你本项目 753 次真实请求的会话记录。见第 07–10 节。
很多人以为缓存是"按文件 / 按对话存"。不是。模型每轮收到的是把所有东西首尾拼接成的一长条 token,缓存就在这条线上做前缀匹配:
↑ 越靠前的内容越少变动 → 越容易被缓存。越靠后越易变 → 越要全价算。这就是为什么稳定的 system / 工具定义天然放在最前面。
前面反复说"逐 token 匹配"。要真正理解缓存,先得知道 token 不是字符、也不完全是单词,而是模型读文字的最小单位。
你输入一句话,模型不会一个字母一个字母地看。它先用一个叫 tokenizer(分词器)的部件,按一套固定的"词汇表"把文字切成一块块的碎片,每块就是一个 token,再把每个 token 换成一个数字编号。模型眼里的世界是一串数字,不是字符串。
下面用色块表示 token 边界(每个方块 = 1 个 token,␣ 表示空格,空格通常并进它后面的词里)。注意:具体怎么切由分词器版本决定,这里是代表性示例,但"切成多块、空格归属、生僻词被拆碎"这些规律是确定的。
| 内容 | 大致换算 |
|---|---|
| 英文 | ≈ 4 个字符 = 1 token(≈ 0.75 个单词) |
| 中文 | 一个汉字常 ≈ 1 个甚至更多 token,整体比英文更费 |
| Opus 4.7 / 4.8 | 官方注明换了新分词器,同样文字可能多花最多 35% token(但单价从 $15 降到 $5,整体更便宜) |
缓存比的就是这一串 token 序列。看一个你项目里真会发生的场景——把请求头里的 Tenant-Id: 000000 改成 000001:
你只改了 1 个字符,但它落在 000000 这个 token 上,这个 token 变成了 000001 这个不同的 token → 前缀在这里断开 → 从这个 token 到结尾全部失效。这就是"遇到第一个不一样的 token,从那里到结尾全部重新计算"的字面含义。
POST /v1/messages/count_tokens,或 Claude Console 里的 tokenizer 工具。cache_read_input_tokens 等字段,就是服务端按真实分词算好回传的 token 数。回到主线:token 是模型读文字的最小单位;缓存逐个 token 比对前缀,任何一个 token 不同(哪怕只因改了一个字符),从那里往后就全断。
下面是一个真实形态的请求。点按钮模拟不同操作,观察哪些段命中(绿)、哪些重算(红/黄)。注意看:改一个靠前的段,会把它后面所有段连带染红。
第二轮请求和第一轮的开头逐字相同,所以 system + 工具 + CLAUDE.md + 上一轮问答全部复用:
// 第 1 轮发送 [system + tools + CLAUDE.md] ← 约 22,000 token [用户问题1] "帮我看下登录逻辑" // 第 2 轮发送(模型回答后你又问了一句) [system + tools + CLAUDE.md] ✅ 逐字相同 → 命中缓存 [用户问题1] ✅ 命中 [助手回答1] ✅ 命中 [用户问题2] ❌ "再看下登出" — 新内容,从这里开始全价算
前三段是共同前缀,直接读缓存(约便宜 10 倍、首 token 更快),只有最后一段是本轮真实成本。
你在 CLAUDE.md 里加了一句话。它位置靠前,于是它本身和它后面的所有内容缓存全部作废:
[system + tools] ✅ 还在它前面 → 命中 [CLAUDE.md*] ❌ 改了一个字 → 从这个 token 起不匹配 [用户问题1] ❌ 内容没变,但前缀已断 → 也得重算 [助手回答1] ❌ 连带重算 [用户问题2] ❌ 连带重算
不是。而且——那句重复的话本身根本不命中。这是最容易误解的一点:缓存比的是"位置前缀",不是"这句话我以前见过没有"。
假设第一轮你说"帮我做登录功能",我回答并改了代码;第二轮你又说了一模一样的"帮我做登录功能"。第二轮发出去的请求长这样:
↑ 命中的是前面那一大段(系统 + 工具 + 整个第一轮对话),不是因为你重复了那句话。那句重复的话位置在最后、前面的上下文变了,所以照样要全价处理(写进缓存,下一轮才变成命中)。
| 你以为 | 实际 |
|---|---|
| 第二轮说一样的话 = 完全命中 | ❌ 永远不是"完全"——末尾总挂着一段新的用户输入 |
| 重复的话被认出来、所以免费 | ❌ 那句话本身不命中;免费的是它前面没变的前缀 |
| 真正花钱的是哪部分 | ✅ 只有末尾那十几个新 token,几乎可忽略;几万 token 的前缀全命中 |
这也解释了你第 09 节真实数据里 new≈2、read 一路涨:你每轮新说的话先以全价/写缓存进去,下一轮就并入前缀变成命中——所以"重复"省的从来不是那句话,而是它前面越积越长的历史。
所以——缓存不是永久的。默认每个缓存断点存活 5 分钟,但关键是每命中一次就把 5 分钟清零重计。过期看的是"两次请求之间的空档",跟任务跑了多久无关。下面这个倒计时可以直接点着看:
所有数字来自 Anthropic 官方定价页,相对"基准输入价"的倍率是固定的,对所有模型都一样:
| 缓存操作 | 倍率 | 含义 |
|---|---|---|
| 5 分钟写缓存 cache write | 1.25× | 第一次把这段内容存进缓存,比正常输入贵 25% |
| 1 小时写缓存 | 2× | 存成存活 1 小时的缓存(需开 1h 选项),贵一倍 |
| 缓存命中 / 读 cache read | 0.1× | 命中时只花正常输入价的 10% |
把倍率乘上 Opus 4.8 的基准价 $5/百万 token:
| 模型 | 基准输入 | 5m 写缓存 | 缓存命中 | 输出 |
|---|---|---|---|---|
| Opus 4.8(本会话) | $5 /MTok | $6.25 | $0.50 | $25 |
| Opus 4.1(旧) | $15 | $18.75 | $1.50 | $75 |
| Sonnet 4.6 | $3 | $3.75 | $0.30 | $15 |
| Haiku 4.5 | $1 | $1.25 | $0.10 | $5 |
数据来源:platform.claude.com/docs · about-claude/pricing(2026 年定价表,含 prompt caching 倍率)。MTok = 百万 token。
命中一次只要 $0.50/百万,相当于正常输入价的零头。一个 7 万 token 的前缀,命中读一次 ≈ $0.035;不缓存读一次 ≈ $0.35。差 10 倍。
这些是"能不能命中"的底层约束,讲给别人听时最容易被问到:
官方原话:"缓存前缀按 tools → system → messages 的顺序建立,形成层级,上层变了下层全废"。这正是前面"改靠前的东西最贵"的官方机制:
| 你改了什么 | 失效范围 |
|---|---|
| 工具定义(tools,最靠前) | tools + system + messages 全部失效 ❌ |
| system / CLAUDE.md | system + messages 失效 ◐ |
| 对话消息(messages,最靠后) | 只有 messages 失效 ✅ |
来源:platform.claude.com/docs · build-with-claude/prompt-caching(最小长度、断点数、20 块回看窗口、100% 前缀匹配、tools→system→messages 层级)。
下面不是举例,是直接从你这次对话的会话记录(6c486790…jsonl)里读出来的真实数字。每一行 = 模型被请求一次。read=命中缓存的 token,write=新写入缓存,new=真正全价的未缓存输入,gap=距上一次请求的间隔。
| # | 时刻 | gap | read 命中 | write 写入 | new 全价 | out | 发生了什么 |
|---|---|---|---|---|---|---|---|
| 1 | 08:06:33 | — | 18,518 | 4,966 | 16,034 | 1,613 | 开局:你的长消息+上下文,命中已有的 system/工具缓存 |
| 2 | 08:10:40 | 247s | 23,484 | 17,666 | 2 | 535 | 间隔 247s < 300s → 仍命中 ✅ |
| 3 | 08:10:57 | 17s | 41,150 | 1,977 | 2 | 12,682 | read 持续涨:前缀在变长 |
| 4 | 08:13:30 | 153s | 43,127 | 12,765 | 2 | 631 | |
| 5 | 08:16:52 | 202s | 55,892 | 693 | 2 | 1,386 | |
| 6–9 | 08:18 | 4–85s | 56k→60k | ~1.1k | 2 | — | 连续工具调用,间隔几秒,缓存全热 |
| 13–14 | 08:21 | 97/42s | 66,819 | ~580 | 2 | — | read 稳在 66,819 = 完整命中 |
| 15 | 08:26:18 | 269s | 66,819 | 695 | 2 | 1,157 | 间隔 269s 仍 < 300s → read 没掉,照样命中 ✅ |
| 16 | 08:28:05 | 106s | 18,611 | 50,476 | 2 | 553 | read 骤降、write 暴涨:靠前位置内容被改写,只有前 18,611 仍命中,5 万 token 重新写入缓存 ❌ |
| 17–19 | 08:28 | 6–27s | 69k→73k | 1k–4.4k | ~1–2.8k | 刚写入的大块立刻又被命中,read 回升 |
这是把 ~/.claude/projects/ 下所有项目的所有会话记录逐条统计出来的结果(按 message id 去重、读 usage 字段累加)。$ 按每个会话真实用的模型单价分别折算(你绝大多数会话是 Opus 4.7/4.8,基准输入 $5/MTok;synthetic 合成消息不计费)。
命中 token 越多 = 这个项目让模型反复"白嫖"前缀越多。点下面每个项目可展开它的逐会话明细。
数据:本机 ~/.claude/projects/ 全部 .jsonl,截至打开本页时的最近一次统计。命中率 = read /(read+write+new)。省下$ = 不缓存成本 − 实付成本,仅算输入侧差额。
每次模型返回都带一个 usage 对象,三个输入字段加起来才是总输入:
"usage": { "cache_read_input_tokens": 66819, // 命中:这次从缓存读了多少(0.1×) "cache_creation_input_tokens": 695, // 写入:这次新存进缓存多少(1.25×) "input_tokens": 2, // 全价:最后一个断点之后、没缓存的新输入 "output_tokens": 1157 } // 官方公式:总输入 = cache_read + cache_creation + input_tokens
| 方式 | 怎么做 |
|---|---|
命令行 /cost | 在 Claude Code 里输入,看本次会话累计 token 和花费(含缓存读写) |
| 原始会话记录 | 会话以 .jsonl 存在 ~/.claude/projects/<项目>/,每条 assistant 消息都带 usage。用 jq 即可逐轮统计 |
# 把某个会话每轮的命中/写入/全价 token 拉出来 jq -r 'select(.type=="assistant") | .message.usage | "read=\(.cache_read_input_tokens) write=\(.cache_creation_input_tokens) new=\(.input_tokens)"' \ ~/.claude/projects/<你的项目>/<会话id>.jsonl
本页"你的真实数据"那一节,就是用类似命令从你的 6c486790…jsonl 里跑出来的。
调用 Anthropic API 时,可以在某个内容块上打 cache_control 标记,告诉服务端"从开头到这里建一个缓存断点"。Claude Code 已经自动帮你在 system / 工具 / 上下文这些稳定边界打好了断点,理解原理有助于自己写 API 时也用上:
{ "system": [ { "type": "text", "text": "<大段稳定的系统说明 / 工具文档…>", "cache_control": { "type": "ephemeral" } // ← 缓存断点 } ], "messages": [ { "role":"user", "content":"易变的本轮问题,放最后,不打标" } ] }
这几个词最容易混。本节严格按官方文档(code.claude.com)讲清:它们是 Claude Code 里"把活分出去、并行干"的几种不同机制,不是一回事。
| 机制 | 是什么 | 上下文 | 彼此通信 | 最适合 | 启用方式 |
|---|---|---|---|---|---|
| subagent 子智能体 | 单个会话内派出的专职助手 | 各自独立窗口 | 只回报给主 agent,彼此不通信 | 副任务返回摘要 | 默认就有 |
| agent teams 代理团队 | 多个完整会话:1 队长 + 多队友 | 各自独立窗口 | 队友互相直接发消息 | 要讨论/协作的复杂活 | 实验开关 |
| background agents 后台代理 | 后台跑的多个完整会话,一屏管理 | 各自独立会话 | 不互相通信 | 多个互不依赖的任务异步跑 | claude agents |
| Workflow 动态工作流 | 用 JS 脚本确定性地编排一群 subagent | 脚本调度 | 脚本里传数据 | 大规模/可复现的批处理 | Workflow 工具 |
| worktree 多会话 | 你自己开多个 Claude Code 会话 | 各自独立 | 不自动协调 | 手动并行 | git worktree |
来源:code.claude.com 的 sub-agents / agent-teams / agent-view 三页。下面把前四种逐个拆开。
Agent 工具(官方 v2.1.63 起由 Task 改名为 Agent,旧名仍兼容)。所以 "Agent" 是启动动作/工具,"subagent" 是被启动的实体——两面,不是两样东西。description 自动决定派谁;也可自然语言点名、@-提及锁定、或 --agent 让整个会话用它。Explore(Haiku、只读、查代码)、Plan(只读、plan 模式做调研)、general-purpose(全工具),外加 statusline-setup、claude-code-guide。.claude/agents/*.md(项目)或 ~/.claude/agents/(用户)写 Markdown + YAML frontmatter,必填 name、description,可选 tools / model / permissionMode / skills / memory / isolation 等。也可用 /agents 命令向导创建。何时用:副任务输出很啰嗦、想限制工具权限、活儿自包含能返回摘要。需要频繁来回/共享大量上下文/快速小改 → 留在主对话。
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1(需 v2.1.32+),然后用自然语言让 Claude "建一个团队…"。SendMessage 通信)。存在 ~/.claude/teams/ 与 ~/.claude/tasks/。claude agents 打开一块屏幕管理所有后台会话。每个都是完整的 Claude Code 会话,由一个 supervisor 进程托管,不依赖终端——关掉窗口它还在跑。Space 偷看、回复,Enter 进入完整会话;也可 claude --bg "任务" 从 shell 直接派。研究预览阶段(需 v2.1.139+)。| 你的情况 | 用 |
|---|---|
| 副任务会刷屏、只要个摘要 | subagent |
| 几个工人要互相讨论/质疑再汇总 | agent teams |
| 几个互不相关的任务想异步跑、回头收 | background agents |
| 大批量、要可复现的结构化流程 | Workflow |
| 需要频繁来回 / 共享大量上下文 / 快速小改 | 就留在主对话 |
来源:code.claude.com — sub-agents、agent-teams(CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS、lead/teammate/任务列表/mailbox)、agent-view(claude agents、supervisor)。Task→Agent 改名见 sub-agents 页 v2.1.63 说明。
这也是把这节放进缓存教程的原因。Workflow 的断点续跑用的和 token 前缀缓存完全相同的思路——"最长不变前缀":
agent() 调用开始,逐个比对 它的 prompt 和参数。和 token 前缀匹配一模一样的形状:从头连续匹配,第一个变动点之后一律重做。token 缓存比的是 token 序列,Workflow 续跑比的是 agent() 调用序列——记住这一个"最长不变前缀"模型,两处都通。
| 操作 | 结果 | 为什么 / 真实依据 |
|---|---|---|
| 继续追问(不改前文) | 大段命中 ✅ | 开头逐字未变;你本会话 new≈2、read 一路涨就是这个 |
| 改工具定义(tools) | tools+system+messages 全废 ❌ | 层级最顶层,级联失效(官方) |
| 改 CLAUDE.md / system | system+messages 失效 ❌ | 你本会话 #16 就是靠前内容变动,5 万 token 被重写 |
| 空闲 > 5 分钟再请求 | 前缀过期 ❌ | TTL 到期回收,需重新建立 |
| 空闲 < 5 分钟(或持续命中) | 仍命中 ✅ | 每次命中免费刷新 5 分钟;你 #2(247s)/#15(269s) 都还命中 |
| 只改最后一条消息 | 几乎无损 ◐ | messages 在最底层,只失效 messages |
| 内容不足 4096 token(Opus 4.8) | 根本不缓存 ❌ | 低于最小长度,打标也无效、不报错(官方) |
| 换模型 / 跨组织 / 跨工作区 | 不命中 ❌ | 缓存按组织+工作区隔离,前缀绑定具体内容 |
规则依据:Anthropic 官方 prompt-caching 与 pricing 文档;命中数据:本项目会话 .jsonl 的 usage 字段实测。
前缀 = 请求开头那段「逐 token 完全没变」的连续序列;命中的就是它,变动点之后一律重算,5 分钟不碰它就过期。把稳定的放前面、易变的放最后,就是省钱省时间的全部诀窍。
Claude Code 的两套跨会话记忆机制:你手写的 CLAUDE.md 指令文件,和 Claude 自己积累的 auto memory 笔记,二者都在每次会话开始时加载进上下文。
每次 Claude Code 会话都从一个全新的 context window 开始,靠两套机制把知识带过会话边界:CLAUDE.md files(你写的持久化指令/规则)与 Auto memory(Claude 根据你的纠正和偏好自己写的笔记)。两者都在每次对话开始时加载进上下文。注意:它们都被当作 context(上下文),不是强制配置(not enforced configuration)——Claude 会尽力遵守但不保证严格合规;要无条件拦截某个动作必须用 PreToolUse hook。指令越具体、越简洁,Claude 遵守得越一致。
CLAUDE.md 位置(按 load order 从广到窄):Managed policy — macOS /Library/Application Support/ClaudeCode/CLAUDE.md、Linux/WSL /etc/claude-code/CLAUDE.md、Windows C:\Program Files\ClaudeCode\CLAUDE.md;User ~/.claude/CLAUDE.md;Project ./CLAUDE.md 或 ./.claude/CLAUDE.md;Local ./CLAUDE.local.md(加进 .gitignore)。
导入语法:See @README ... and @package.json ...、- git workflow @docs/git-instructions.md、跨 worktree 用 - @~/.claude/my-project-instructions.md。
导入 AGENTS.md:CLAUDE.md 顶部写 @AGENTS.md,或 ln -s AGENTS.md CLAUDE.md(Windows 用 import 因 symlink 需管理员/开发者模式)。
规则目录 .claude/rules/*.md:每文件一个主题(如 testing.md),递归发现;可加 YAML frontmatter 限定路径:
---
paths:
- "src/api/**/*.ts"
- "src/**/*.{ts,tsx}"
---
无 paths 的 rule 无条件加载,优先级同 .claude/CLAUDE.md。用户级 ~/.claude/rules/,加载早于 project rules(project 优先级更高)。
命令:/init 生成起始 CLAUDE.md(已存在则给改进建议不覆盖);环境变量 CLAUDE_CODE_NEW_INIT=1 启用交互式多阶段流程。/memory 列出已加载的 CLAUDE.md/CLAUDE.local.md/rules,切换 auto memory 开关,打开 auto memory 文件夹。
Auto memory 配置:autoMemoryEnabled(项目设置,默认 on)、环境变量 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1、autoMemoryDirectory(仅 user settings ~/.claude/settings.json,须绝对路径或 ~/ 开头)。
托管:managed-settings.json 里用 claudeMd 键直接放内容(如 {"claudeMd": "Always run make lint before committing.\nNever push directly to main."});claudeMdExcludes(glob 数组)排除无关 CLAUDE.md,放 .claude/settings.local.json。
额外目录:CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config。
/Library/Application Support/ClaudeCode/CLAUDE.md、Linux/WSL /etc/claude-code/CLAUDE.md、Windows C:\Program Files\ClaudeCode\CLAUDE.md)、User ~/.claude/CLAUDE.md、Project ./CLAUDE.md 或 ./.claude/CLAUDE.md、Local ./CLAUDE.local.md。@path/to/import,相对路径相对于含 import 的文件而非 cwd,支持绝对/相对路径,可递归,maximum depth of four hops(最大 4 hops)。<!-- --> 注入前被 stripped 不占 token;代码块内注释保留;Read 工具打开时注释可见。@AGENTS.md 或 ln -s AGENTS.md CLAUDE.md。/init 生成起始 CLAUDE.md;已存在则建议改进不覆盖;会读取 AGENTS.md、.cursorrules、.windsurfrules 并整合。CLAUDE_CODE_NEW_INIT=1 启用交互式多阶段 /init(可设置 CLAUDE.md/skills/hooks)。.claude/rules/ 放主题 md 文件,递归发现;无 paths frontmatter 的 rule 启动加载,优先级同 .claude/CLAUDE.md;带 paths YAML frontmatter 做 path-scoped,只在读匹配文件时触发。**/*.ts(任意目录 TS)、src/**/*(src 下全部)、*.md(项目根 markdown)、src/components/*.tsx;支持 brace expansion 如 src/**/*.{ts,tsx}。~/.claude/rules/,加载早于 project rules,project rules 优先级更高。.claude/rules/ 支持 symlink(解析并正常加载,循环 symlink 会被检测处理)。claude --version 查)。/memory 切换、或项目设置 {"autoMemoryEnabled": false}、或环境变量 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。~/.claude/projects/<project>/memory/,<project> 由 git repo 推导,同 repo 所有 worktree/子目录共享一个目录;非 git repo 用 project root。MEMORY.md(索引,loaded into every session)+ 可选 topic 文件(如 debugging.md / api-conventions.md,按需读取,启动不加载)。autoMemoryDirectory 只能在 user settings ~/.claude/settings.json 设,须绝对路径或 ~/ 开头;不接受 project/local settings,接受 policy/user 和 --settings。~/.claude/projects/<project>/memory/。claudeMd 键可直接内嵌 CLAUDE.md 内容,precedence 同 managed CLAUDE.md(先于 user/project 加载),仅 managed/policy settings 生效。claudeMdExcludes(glob 数组,匹配绝对路径)排除 CLAUDE.md,可配在任意 settings 层,数组跨层合并;managed policy CLAUDE.md 不可被排除。CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir <dir> 加载额外目录的 CLAUDE.md/.claude/CLAUDE.md/.claude/rules/*.md/CLAUDE.local.md;若 --setting-sources 排除 local 则跳过 CLAUDE.local.md。/memory 命令:列出已加载 CLAUDE.md/CLAUDE.local.md/rules、切换 auto memory、提供打开 auto memory 文件夹链接、选文件可在编辑器打开。--append-system-prompt。InstructionsLoaded hook 可记录哪些指令文件被加载、何时、为何。Skills 是用 SKILL.md 文件给 Claude 扩展能力的方式:写一份指令,Claude 在相关时自动调用、或你用 /skill-name 直接触发,且正文只在用到时才加载,几乎不占常驻 context。
Skills(技能)是扩展 Claude Code 能力的机制。你创建一个 SKILL.md 文件写入指令,Claude 就把它加入自己的工具箱:当对话相关时 Claude 自动调用,或你输入 /skill-name 直接调用。和 CLAUDE.md 不同,技能的正文(body)只在被调用时才加载,因此再长的参考资料在没用到前几乎不消耗 context。Claude Code 的 skills 遵循 Agent Skills 开放标准(agentskills.io),可跨多个 AI 工具使用;Claude Code 在标准之上扩展了 invocation control(调用控制)、subagent execution(子代理执行)、dynamic context injection(动态上下文注入)等特性。官方明确:自定义命令(custom commands)已合并进 skills——.claude/commands/deploy.md 与 .claude/skills/deploy/SKILL.md 都会生成 /deploy 且行为一致,旧的 .claude/commands/ 文件继续可用。
--- 之间的 YAML frontmatter(告诉 Claude 何时用)+ 后面的 markdown 正文(被调用时 Claude 执行的指令)。disable-model-invocation: true 只允许你手动调用(description 不进 context);user-invocable: false 只允许 Claude 调用(从 / 菜单隐藏)。 !command ` 在发送给 Claude 之前先由 Claude Code 执行 shell 命令,用输出替换占位符,所以 Claude 收到的是真实数据而非命令本身。这是预处理,Claude 看不到命令执行过程。! 位于行首或紧跟空白时才识别。context: fork 时,技能正文成为驱动子代理的 prompt,在隔离的 context 里运行,看不到你的对话历史;用 agent 字段指定子代理类型。~/.claude/skills/ 或 .claude/skills/ 下取目录名;.claude/commands/ 下取去扩展名的文件名;plugin 的 skills/ 子目录取目录名并加 plugin 命名空间;plugin 根目录的 SKILL.md 取 frontmatter name(无则回退到 plugin 目录名)。plugin-name:skill-name 命名空间,不会与其他层级冲突。技能存放位置(决定谁能用):Personal ~/.claude/skills/<skill-name>/SKILL.md(所有项目可用);Project .claude/skills/<skill-name>/SKILL.md(仅本项目);Plugin <plugin>/skills/<skill-name>/SKILL.md;Enterprise 通过 managed settings 部署。
最小 SKILL.md:
---
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed...
---
## Current changes
!git diff HEAD
## Instructions
Summarize the changes above in two or three bullet points...
创建示例:mkdir -p ~/.claude/skills/summarize-changes,写入 SKILL.md,然后用 /summarize-changes 或自然语言触发。
常用 frontmatter 字段:name、description、when_to_use、argument-hint、arguments、disable-model-invocation、user-invocable、allowed-tools、disallowed-tools、model、effort、context、agent、hooks、paths、shell。所有字段都可选,仅 description 推荐。
字符串替换:$ARGUMENTS、$ARGUMENTS[N]、$N、$name、${CLAUDE_SESSION_ID}、${CLAUDE_EFFORT}、${CLAUDE_SKILL_DIR}。
子代理执行:frontmatter 加 context: fork + agent: Explore(或 Plan / general-purpose / 自定义)。
多行命令注入用 ! 围栏代码块。
settings 相关:skillOverrides(控制可见性,写入 .claude/settings.local.json)、disableSkillShellExecution、skillListingBudgetFraction、maxSkillDescriptionChars。权限:在 /permissions 用 Skill(禁全部)/ Skill(commit)(精确)/ Skill(review-pr *)(前缀)。
/skill-name 直接调用;加 disable-model-invocation: true 防止 Claude 自动触发(尤其是有副作用的 /commit、/deploy、/send-slack-message)。user-invocable: false 从 / 菜单隐藏(如 legacy-system-context)。context: fork——但仅适合含明确指令的技能,纯指南类(无任务)forked 后子代理拿不到可执行 prompt,会空跑无输出。/doctor 看预算是否溢出。context: fork 的 Explore/Plan agent 会跳过 CLAUDE.md 和 git status。allowed-tools 只是免审批授权、不限制可用工具;要封禁工具需在 permission settings 加 deny 规则。项目 .claude/skills/ 的 allowed-tools 需先接受 workspace trust 对话框才生效——信任仓库前要先审查项目技能,因为技能能给自己授很宽的工具权限。--add-dir / /add-dir 会加载其中的 .claude/skills/,但 permissions.additionalDirectories 设置只给文件访问、不加载技能;subagents、commands、output styles 也不从附加目录加载。user-invocable: false 只控制 / 菜单可见性,不阻止 Skill tool 程序化调用;要彻底屏蔽用 disable-model-invocation: true。shell: powershell 需要环境变量 CLAUDE_CODE_USE_POWERSHELL_TOOL=1。disableSkillShellExecution: true 会把每条 shell 命令替换为 [shell command execution disabled by policy];bundled 与 managed 技能不受影响。SKILL.md,其他文件(template.md、examples/、scripts/)可选。~/.claude/skills/<skill-name>/SKILL.md(所有项目)。.claude/skills/<skill-name>/SKILL.md(仅本项目,提交 VCS 即共享)。<plugin>/skills/<skill-name>/SKILL.md,命令名加命名空间如 /my-plugin:review。description 缺省时取 markdown 正文第一段;description+when_to_use 列表中合并截断在 1,536 字符。disable-model-invocation 默认 false;user-invocable 默认 true。effort 选项:low、medium、high、xhigh、max(实际可用取决于模型);${CLAUDE_EFFORT} 还可能返回 ultra(ultracode 的存储值)。context: fork 在 forked 子代理 context 运行;agent 缺省用 general-purpose,可选 Explore、Plan、general-purpose 或 .claude/agents/ 自定义。shell 接受 bash(默认)或 powershell;powershell 需 CLAUDE_CODE_USE_POWERSHELL_TOOL=1。paths 用 glob 限制激活时机,格式同 path-specific rules。ARGUMENTS: <your input>。/my-skill "hello world" second 使 $0=hello world、$1=second。 !command :仅当 ! 在行首或紧跟空白时识别;KEY=!cmd 这类被当字面文本不执行。多行用 ``! 围栏块。.claude/skills/run-<name>/。.claude/settings.local.json;plugin 技能不受 skillOverrides 影响(用 /plugin 管理)。Skill(name) 精确匹配,Skill(name *) 前缀匹配;deny 规则加 Skill 可禁全部。~/.claude/skills/、项目 .claude/skills/、--add-dir 目录内 .claude/skills/ 的增删改,当前会话即时生效;新建顶层目录需重启。.claude/skills/(如 packages/frontend/.claude/skills/)。ultrathink 可请求更深推理;用 /doctor 诊断技能列表预算溢出。Hooks 是在 Claude Code 生命周期的特定事件点自动触发的用户自定义脚本/请求,用于观测、注入上下文或拦截/否决某些操作。
Hooks 是配置在 settings.json(或插件、Skill/Agent frontmatter)里的处理器,会在 Claude Code 运行过程中的特定事件(如 PreToolUse、UserPromptSubmit、Stop、SessionStart 等)被触发执行。处理器有 5 种类型:command(执行命令)、http(调用 HTTP 端点)、mcp_tool(调用 MCP 工具)、prompt(用小模型评估)、agent(用 agent 评估)。Hook 通过 stdin 收到 JSON 输入,通过 exit code 和 stdout 的 JSON 返回结果,从而能在事件点做日志、注入额外上下文、甚至阻断/否决工具调用与提示处理。
配置位置(优先级从低到高):~/.claude/settings.json(user,全局)< .claude/settings.json(project,可提交)< .claude/settings.local.json(local,gitignore)< Managed policy settings(企业策略,覆盖一切);另有插件 hooks/hooks.json 与 Skill/Agent frontmatter 内联。
JSON 结构:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "${CLAUDE_PROJECT_DIR}/scripts/check.sh", "timeout": 30 }
]
}
]
}
}
command hook 典型:通过 stdin 读 JSON,用 jq 解析,输出 hookSpecificOutput 决定 deny:
COMMAND=$(jq -r '.tool_input.command' < /dev/stdin)
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:"Destructive command blocked"}}'
else exit 0; fi
Skill/Agent frontmatter 内联:
hooks:
PreToolUse:
- matcher: "Tool"
hooks:
- type: command
command: "./script.sh"
全局关闭:在 settings 里设 "disableAllHooks": true。运行时输入 /hooks 可打开只读浏览器查看所有事件与处理器(编辑只能改 JSON)。
MCP(Model Context Protocol)是一套开源标准,让 Claude Code 连接外部工具、数据库和 API,直接读取并操作这些系统而不用手动复制粘贴。
MCP(Model Context Protocol)是一个面向 AI-工具集成的开源标准(modelcontextprotocol.io)。通过连接 MCP server,Claude Code 可以访问你的工具、数据库和 API——例如从 JIRA 读 issue、查 Sentry 错误、查 PostgreSQL 数据库、读 Figma 设计稿。连接方式分三种传输:远程 HTTP(推荐)、远程 SSE(已废弃)、本地 stdio(本地进程)。当你发现自己在反复从别的工具(issue tracker、监控面板)往对话里复制数据时,就该接一个 MCP server。
三种 scope 的存储位置:local 与 user 存在 ~/.claude.json(local 写在该 project 路径下的 mcpServers,user 跨所有 project),project 存在项目根的 .mcp.json(入版本控制、团队共享,首次使用需审批)。
添加命令(所有 options 必须在 server name 之前,再用 -- 分隔传给 server 的命令):
- HTTP: claude mcp add --transport http <name> <url>,加认证头 --header "Authorization: Bearer your-token"
- SSE(已废弃): claude mcp add --transport sse <name> <url>
- stdio: claude mcp add [options] <name> -- <command> [args...],例 claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable -- npx -y airtable-mcp-server
- JSON: claude mcp add-json <name> '<json>'
- 从 Claude Desktop 导入: claude mcp add-from-claude-desktop(仅 macOS / WSL)
scope: --scope local|project|user(local 为默认;旧版 local 叫 project、user 叫 global)。
.mcp.json 标准格式(stdio 例):
{ "mcpServers": { "shared-server": { "command": "/path/to/server", "args": [], "env": {} } } }
HTTP 例(type 可写 http 或别名 streamable-http):
{ "mcpServers": { "api-server": { "type": "http", "url": "${API_BASE_URL:-https://api.example.com}/mcp", "headers": { "Authorization": "Bearer ${API_KEY}" } } } }
env 变量展开支持 ${VAR} 和 ${VAR:-default},可用于 command/args/env/url/headers;必需变量未设且无默认值会导致解析失败。
管理:claude mcp list / claude mcp get <name> / claude mcp remove <name> / 交互内 /mcp(认证、看状态、清除认证)。重置 project 审批:claude mcp reset-project-choices。把 Claude Code 自身当 server:claude mcp serve。
在 Claude Code 中用 / 触发的命令;自定义命令已合并进 Skills,由 SKILL.md(或旧的 .claude/commands/*.md)定义,可由你手动触发或让 Claude 自动加载。
官方文档 https://code.claude.com/docs/en/slash-commands 现已重定向到「Extend Claude with skills」页面,因为 **Custom commands have been merged into skills**(自定义斜杠命令已合并进 Skills)。一个 .claude/commands/deploy.md 文件和一个 .claude/skills/deploy/SKILL.md 都会创建 /deploy,二者行为一致;已有的 .claude/commands/ 文件继续可用。Skills 在此基础上增加了:支持文件目录、控制由你还是 Claude 调用的 frontmatter、以及 Claude 在相关时自动加载的能力。Skills 遵循 Agent Skills 开放标准(agentskills.io),Claude Code 在其上扩展了 invocation control、subagent execution、dynamic context injection。built-in commands(如 /help、/compact)和 bundled skills(如 /code-review、/batch、/debug、/loop、/claude-api)见 /en/commands 参考页。
.claude/skills/<dir>/SKILL.md 的命令名取自目录名(如 deploy-staging → /deploy-staging);.claude/commands/x.md 取自去扩展名的文件名(→ /x)。frontmatter 的 name 字段只是列表里的显示标签,不改变你输入的 / 命令名(plugin 根 SKILL.md 是唯一例外)。$ARGUMENTS=全部参数原样;$ARGUMENTS[N] / $N=按 0 基下标取单个参数(shell 风格引号,多词要加引号);若 skill 不含 $ARGUMENTS 但你传了参数,会在内容末尾追加 ARGUMENTS: <你的输入>。 !<command> 在发给 Claude 之前先执行 shell 命令,用输出替换占位符(preprocessing,不是 Claude 执行)。只替换一次,输出不会被再次扫描;! 只在行首或紧跟空白时识别,KEY=!\cmd\ 这种会被当字面文本。多行命令用 ``! 围栏代码块。context: fork 让 skill 在 forked subagent 里隔离运行:SKILL.md 内容成为 subagent 的 prompt,不带主对话历史;agent 字段决定执行环境(model/tools/permissions),省略则用 general-purpose。~/.claude/skills/、项目 .claude/skills/、--add-dir 目录下的 .claude/skills/ 增删改会在当前 session 内即时生效;但新建一个 session 启动时不存在的顶层 skills 目录需要重启。文件位置(按优先级 enterprise > personal > project,plugin 用 plugin-name:skill-name 命名空间不冲突):Personal=~/.claude/skills/<skill-name>/SKILL.md(所有项目可用);Project=.claude/skills/<skill-name>/SKILL.md(仅本项目,提交进 VCS 共享);Plugin=<plugin>/skills/<skill-name>/SKILL.md;旧式 Custom command=.claude/commands/<name>.md。SKILL.md 结构:--- 之间是 YAML frontmatter(所有字段可选,仅推荐写 description),其后是 markdown 指令。最小例:---\ndescription: ...\n---\n## Instructions\n...。动态注入例:!git diff HEAD。参数例:Fix GitHub issue $ARGUMENTS 配 /fix-issue 123。fork 例:frontmatter 加 context: fork 和 agent: Explore。权限预批准:allowed-tools: Bash(git add *) Bash(git commit *)。禁止 Claude 自动调用:disable-model-invocation: true。从 / 菜单隐藏:user-invocable: false。设置文件层面覆盖可见性用 .claude/settings.local.json 的 skillOverrides(/skills 菜单里 Space 切换、Enter 保存)。
disable-model-invocation: true 做成只你能 /name 手动触发的命令,比如 /commit、/deploy、/send-slack-message。user-invocable: false。 !<command> ` 注入(如 git diff、gh pr diff),而不是让 Claude 自己去跑。context: fork(搭配 agent: Explore/Plan)。! 仅在行首或紧跟空白时触发命令注入;紧跟其他字符(如 KEY=!\cmd\``)会被当字面文本不执行。命令注入只跑一次,输出不会被二次扫描展开新的占位符。user-invocable: false 只控制 / 菜单可见性,不阻止 Skill tool 编程调用;要彻底屏蔽 Claude 调用须用 disable-model-invocation: true。context: fork 用 Explore/Plan agent 时会跳过 CLAUDE.md 和 git status;普通 fork 会加载 CLAUDE.md。--add-dir / /add-dir 是文件访问授权而非配置发现,但 .claude/skills/ 是例外会自动加载;permissions.additionalDirectories 设置只给文件访问、不加载 skills;subagents/commands/output styles 都不从附加目录加载。skillOverrides 影响,需通过 /plugin 管理。disableSkillShellExecution: true 会把每个命令替换为 [shell command execution disabled by policy];bundled 和 managed skills 不受影响。~/.claude/skills/<skill-name>/SKILL.md;Project .claude/skills/<skill-name>/SKILL.md;Plugin <plugin>/skills/<skill-name>/SKILL.md;旧式 .claude/commands/<name>.md。plugin-name:skill-name 命名空间;同名时 skill 优先于 command。CLAUDE_CODE_USE_POWERSHELL_TOOL=1。$ARGUMENTS、$ARGUMENTS[N]、$N($0 为第一个)、$name(来自 arguments 列表,按顺序映射)、${CLAUDE_SESSION_ID}、${CLAUDE_EFFORT}(low/medium/high/xhigh/max/ultra,ultra 是 ultracode 的存储值)、${CLAUDE_SKILL_DIR}(SKILL.md 所在目录)。 !<command> ;多行用 ``! 围栏块;在发给 Claude 前执行、输出替换占位符。description+when_to_use 合并文本在 skill 列表中截断于 1,536 characters;可用 maxSkillDescriptionChars 配置。skillListingBudgetFraction(如 0.02=2%)或环境变量 SLASH_COMMAND_TOOL_CHAR_BUDGET(固定字符数)调整;用 /doctor 查溢出。context: fork 用 agent 字段选 subagent:Explore / Plan / general-purpose 或 .claude/agents/ 自定义;省略则 general-purpose;Explore/Plan 会跳过 CLAUDE.md 和 git status。Skill 禁用全部;Skill(name) 精确匹配、Skill(name *) 前缀匹配;少数 built-in 命令可经 Skill tool 调用,含 /init、/review、/security-review,而 /compact 等不可。on(名+描述,菜单可见)、name-only(仅名,菜单可见)、user-invocable-only(对 Claude 隐藏,菜单可见)、off(全隐藏);缺省视为 on;写入 .claude/settings.local.json。.claude/skills/run-<name>/。disableSkillShellExecution: true(settings)禁用 user/project/plugin/additional-directory 来源的 shell 注入;bundled 与 managed skills 不受影响。.claude/skills/ 在 --add-dir//add-dir 目录下会自动加载(例外);permissions.additionalDirectories 不加载 skills;附加目录 CLAUDE.md 默认不加载,需 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1。ultrathink 可请求更深推理。把 skills/agents/hooks/MCP/LSP/monitors 等自定义能力打包成可版本化、可跨项目复用、可通过 marketplace 分发的扩展单元。
Plugin 是 Claude Code 的扩展打包机制:一个目录里放一个 .claude-plugin/plugin.json manifest,加上 skills/、agents/、hooks/、.mcp.json、.lsp.json、monitors/、bin/、settings.json 等组件目录/文件。相对于直接放在 .claude/ 的 standalone 配置,plugin 的核心区别是:可分享给团队/社区、可版本化更新、可跨多个项目复用、通过 marketplace 安装;代价是 skill 名称被强制加上命名空间前缀(如 /my-plugin:hello)。官方文档把 standalone(.claude/,skill 名形如 /hello)与 plugin(.claude-plugin/plugin.json,skill 名形如 /plugin-name:hello)作为两种并列方式对照。
.claude-plugin/plugin.json manifest,Claude Code 读取其中 metadata 在 plugin manager 中展示skills/ 下,每个 skill 是一个文件夹含 SKILL.md;文件夹名即 skill 名,并自动加上 plugin 的 name 作为命名空间前缀,例如 plugin 名 my-first-plugin 下的 hello/ 变成 /my-first-plugin:helloplugin.json 的 name 字段SKILL.md 是 YAML frontmatter + 指令正文;frontmatter 里的 description 决定 Claude 何时自动调用该 skill(model-invoked);$ARGUMENTS 占位符捕获 skill 名后面用户输入的文本claude --plugin-dir ./my-plugin 直接加载本地 plugin,不需要安装;改动后用 /reload-plugins 热加载(会重载 plugins/skills/agents/hooks/plugin MCP servers/plugin LSP servers),无需重启--plugin-dir 加载的本地 plugin 与已安装的 marketplace plugin 同名时,本会话以本地副本为准(被 managed settings 强制启停的 plugin 除外)hooks/hooks.json,格式与 .claude/settings.json 里的 hooks 对象相同;命令通过 stdin 接收 JSON 形式的 hook input(用 jq 提取字段如 file_path).lsp.json 配置(command/args/extensionToLanguage),给 Claude 实时代码智能;用户机器上必须装有对应 language server 二进制monitors/monitors.json 配置;plugin 激活时 Claude Code 自动启动每个 monitor,command 的每行 stdout 作为 notification 推给 Claudebin/ 里的可执行文件在 plugin 启用期间会被加进 Bash 工具的 PATHsettings.json 在 plugin 启用时应用默认设置,目前仅支持 agent 和 subagentStatusLine 两个 key;agent 可把 plugin 自带的某个 custom agent 设为主线程(套用其 system prompt/工具限制/model)version 时用户只在你 bump 该字段后才收到更新;省略且经 git 分发时用 commit SHA,每次 commit 都算新版本manifest 路径固定为 <plugin>/.claude-plugin/plugin.json,最小示例:
{
"name": "my-first-plugin",
"description": "A greeting plugin to learn the basics",
"version": "1.0.0",
"author": { "name": "Your Name" }
}
组件目录全部放 plugin 根(不是 .claude-plugin/ 里面):skills/<name>/SKILL.md、commands/(旧式扁平 md,新 plugin 用 skills/)、agents/、hooks/hooks.json、.mcp.json、.lsp.json、monitors/monitors.json、bin/、settings.json。
SKILL.md frontmatter 示例:description:(决定何时调用)、disable-model-invocation: true(禁止模型自动触发);正文里用 $ARGUMENTS 接收输入。
本地测试:claude --plugin-dir ./my-plugin(可重复多次加载多个;也接受 .zip,需 v2.1.128+);远程 zip:claude --plugin-url https://example.com/my-plugin.zip(可重复或空格分隔)。
marketplace:/plugin marketplace add anthropics/claude-plugins-community 添加社区市场,安装用 /plugin install;提交前本地跑 claude plugin validate。
/my-plugin:hello).claude/):只为单个项目定制、个人配置不需分享、在打包前快速试验 skill/hook、想要短 skill 名(如 /hello、/deploy).claude/ 里快速迭代,准备好分享时再转成 plugincommands/、agents/、skills/、hooks/ 放进 .claude-plugin/ 目录——.claude-plugin/ 里只能放 plugin.json,其余目录都必须在 plugin 根级name 字段换前缀settings.json 目前只支持 agent 和 subagentStatusLine 两个 key,未知 key 被静默忽略settings.json 的设置优先级高于 plugin.json 里声明的 settings--plugin-dir 接受 .zip 需要 Claude Code v2.1.128 或更高版本--plugin-dir 无法覆盖被 managed settings 强制启用/禁用的 plugin--plugin-url 在启动时拉取归档,仅当前会话有效;拉取失败或归档无效则报 plugin load error 并不带它启动;只应指向你信任/掌控的归档marketplace.json 之间存在延迟/plugin 命令,需把 Claude Code 升级到最新版本.claude-plugin/plugin.jsonname(唯一标识 + skill 命名空间)、description(plugin manager 中展示)、version(可选,控制更新)、author(可选,如 {"name": "Your Name"});更多字段如 homepage/repository/license 见 plugins-referenceskills/<folder>/SKILL.md,名称变为 /<plugin-name>:<folder>,如 /my-first-plugin:hellodescription、disable-model-invocation: true$ARGUMENTS.claude-plugin/(仅放 plugin.json)、skills/、commands/、agents/、hooks/、.mcp.json、.lsp.json、monitors/、bin/、settings.jsoncommands/ = 扁平 Markdown 文件形式的 skill;新 plugin 应改用 skills/hooks/hooks.json 格式与 .claude/settings.json 的 hooks 对象相同;hook command 通过 stdin 收 JSON.lsp.json 字段:每语言 key 下 command、args、extensionToLanguage(如 {".go": "go"});示例 command gopls args ["serve"]monitors/monitors.json 是数组,条目字段含 name、command、description;还有 when 触发器和变量替换(见 reference)settings.json 支持的 key:agent、subagentStatusLinebin/ 中可执行文件在 plugin 启用时加入 Bash 工具 PATHclaude --plugin-dir ./my-first-plugin,可重复指定多次--plugin-dir 接受 .zip 需 Claude Code v2.1.128+claude --plugin-url https://example.com/my-plugin.zip,可重复或空格分隔多 URL/reload-plugins(重载 plugins/skills/agents/hooks/plugin MCP servers/plugin LSP servers)/agents;查看 skill 列表:/helpclaude-plugins-official(Anthropic 策展,每个安装自带)、claude-community(社区,第三方审核后落地)/plugin marketplace add anthropics/claude-plugins-community,从中安装记作 @claude-community/plugin installclaude plugin validate(提交前跑,审核管线也跑同样检查)claude.ai/settings/plugins/submit、Console platform.claude.com/plugins/submitanthropics/claude-plugins-community catalog 中被 pin 到特定 commit SHA,CI 随新 commit 自动 bump pinanthropics/claude-plugins-community/blob/main/.claude-plugin/marketplace.json,每晚同步.claude/commands/ → plugin-name/commands/;settings.json 中 hooks → hooks/hooks.json/hello vs plugin skill 名 /plugin-name:hello通过 allow/ask/deny 规则、权限模式和托管策略,细粒度控制 Claude Code 能用哪些工具、能访问哪些文件和域名。
Permissions 是 Claude Code 的分层权限系统,用来精确指定 agent 被允许做什么、不被允许做什么。规则可以签入版本控制并分发给组织内所有开发者,也能被单个开发者自定义。权限规则由 Claude Code(而非模型)强制执行——prompt 或 CLAUDE.md 只能影响 Claude "想做什么",不能改变 Claude Code "允许什么"。它和 Sandboxing(OS 级隔离)是互补的两层安全。
用 /permissions 命令查看和管理所有规则及其来源 settings.json 文件。规则写在 settings 文件的 permissions 对象下的 allow / ask / deny 数组里,并通过 defaultMode 设置默认权限模式。settings 文件优先级(高到低):Managed settings > 命令行参数 > .claude/settings.local.json > .claude/settings.json > ~/.claude/settings.json。示例:
{
"permissions": {
"allow": ["Bash(npm run *)", "Bash(git commit *)", "Bash(git * main)"],
"deny": ["Bash(git push *)", "Read(.env)", "Agent(Explore)"]
}
}
扩展工作目录:启动用 --add-dir <path>,session 中用 /add-dir,持久化用 settings 里的 additionalDirectories。CLI 还可用 --allowedTools / --disallowedTools 临时覆盖。
Claude Code 通过分层的 settings.json 文件统一管理权限、模型、环境变量、hooks、MCP、UI 等几乎所有可配置行为,并按 Managed → 命令行 → Local → Project → User 的优先级合并。
Settings 是 Claude Code 的核心配置系统,主体是 JSON 格式的 settings.json 文件,分布在四个 scope:Managed(IT 部署、不可覆盖)、User(~/.claude/settings.json)、Project(.claude/settings.json,提交到 git)、Local(.claude/settings.local.json,被 gitignore)。同一个 key 出现在多个 scope 时按固定优先级合并。文档原话:「settings.json supports a number of options」。除 settings.json 外,还有一批存放在 ~/.claude.json 的全局/UI 类配置,以及对应的环境变量、/config 命令交互界面。
主配置文件路径(按 scope):User=~/.claude/settings.json;Project=.claude/settings.json(提交 git);Local=.claude/settings.local.json(gitignore);Managed=系统级 managed-settings.json。Windows 上 ~/.claude 解析为 %USERPROFILE%\.claude。
典型 permissions 配置:
"permissions": {
"allow": ["Bash(npm run lint)", "Bash(npm run test *)", "Read(~/.zshrc)"],
"deny": ["Bash(curl *)", "Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)"],
"ask": ["Bash(git push *)"],
"additionalDirectories": ["../docs/"],
"defaultMode": "acceptEdits",
"disableBypassPermissionsMode": "disable"
}
建议加 $schema 获得编辑器自动补全与校验:
{ "$schema": "https://json.schemastore.org/claude-code-settings.json" }
另一批 UI/全局配置存在 ~/.claude.json(如 editorMode、autoScrollEnabled、showTurnDuration、teammateMode、autoConnectIde)。交互式修改用 /config 命令(含状态查看、模型/主题/effort/memory 等切换)。