「当你敲下 claude 这个命令时,到底发生了什么?」
你可能已经用 Claude Code 写过代码、改过 bug,但每次启动时那一长串 --model、--print、--effort 选项到底在控制什么?进入交互后那些 /compact、/resume 命令又各管哪一摊?claude doctor 和 claude mcp 这些子命令又是干什么的?Claude Code 在磁盘上留下了哪些配置文件、记忆文件和会话数据,它们又是怎么影响行为的?
我在 Ubuntu 26.04 上使用 Claude Code 2.1.195 做了一组实验,把整个链路拆成了三层:
- 启动时的意图声明
- 运行时的行为调整
- 文件系统上的配置与数据
这篇文章记录了我的发现。需要说明的是,本文聚焦”操作层面”:每个选项和命令怎么用、读写哪些文件。对于会话持久化的内部机制(JSONL 事件流、resume 修复流水线、远端 ingress 同步),以及 CLAUDE.md 和 memory 的加载、prompt 拼装与缓存工程,本文在涉及这些主题时只讲操作要点,不展开内部实现。
注:可以使用
npm install -g @anthropic-ai/claude-code安装最新版 claude-code
Claude Code 是什么
在拆 CLI 选项和命令之前,先回答一个更基本的问题:Claude Code 到底是什么,它和 Cursor、GitHub Copilot 这些工具差在哪。
一句话概括:Claude Code 是一个跑在终端里的 Agent,能读写你磁盘上的文件、执行 shell 命令、调用子代理并行干活,而不只是补全你光标处的代码。
这个定位决定了它和 IDE 补全类工具的根本差异。Copilot 和 Cursor 的核心场景是”你在写代码,它在你旁边接话”,交互单位是单文件、单次补全。Claude Code 的交互单位是整个仓库和整条任务:你说”把这个服务的重试逻辑改成带退避的”,它会自己找文件、读代码、改多处、跑测试。前者是”打字员旁边的助手”,后者是”能自己动手的实习生”。
为什么主入口是 CLI 而不是 IDE 插件。Agent 要长时间运行、要跑 shell、要被脚本调用做自动化,这些场景天然适合终端。CLI 起来之后可以非交互地接进 CI、接进数据处理管线,这是 GUI 插件做不到的。当然它也有 IDE 扩展和 Web 形态,但 CLI 是功能最完整的入口,本文所有内容都以 CLI 为准。
理解了这个定位,后面三层交互模型就顺理成章了。Agent 要”可自动化、可预期、可排错”,于是它的能力被拆成了三层:启动时把边界条件声明清楚(CLI 选项),运行中能调头(/ 命令),状态都落在磁盘上可查可改(文件系统)。这三层不是随便分的,分别对应”可自动化""可控制""可观测”三个工程诉求。
全局速览
在展开每一层之前,先看全貌。Claude Code 的交互能力分三层,每层有各自的职责和入口:
| 层级 | 职责 | 入口 | 典型操作 |
|---|---|---|---|
| CLI 选项 | 启动时声明意图 | claude --model sonnet | 选模型、定权限、设输出格式 |
| / 命令 | 运行时调整行为 | /compact、/model | 压缩上下文、切换模型、回退轮次 |
| 文件系统 | 持久化配置与状态 | ~/.claude/、.claude/、CLAUDE.md | 项目记忆、会话存储、权限配置 |
三层的递进关系:声明意图 → 调整行为 → 持久化状态。下面逐层展开。
一、CLI 启动选项:启动时声明意图
CLI 选项是你在启动 Claude Code 时传入的参数,它们的核心作用是预设会话的初始运行状态。这包括默认模型、工具调用的自动批准策略、输出风格等。这些参数只在启动时解析一次,作为初始配置生效;其中部分项(如模型选择)后续仍可通过设置或 / 命令调整。
1.1 选项全景
claude --help 输出的选项有将近 50 个,按功能分六组:
| 分类 | 选项 | 一句话作用 |
|---|---|---|
| 模型与能力 | --model、--effort、--fallback-model、--agent、--agents | 选哪个脑子、想多深、挂了用谁顶、自定义代理 |
| 会话与上下文 | --continue、--resume、--session-id、--fork-session、--from-pr | 接着上回聊、从 PR 恢复 |
| 权限与安全 | --allowedTools、--disallowedTools、--permission-mode、--safe-mode、--dangerously-skip-permissions | 能做什么、不能做什么 |
| 输出与集成 | --print、--output-format、--json-schema、--verbose、--debug、--max-budget-usd | 结果怎么交给你、花多少钱 |
| 工作区与环境 | --add-dir、--worktree、--bare、--mcp-config、--tools、--settings | 在哪里干活、用什么配置 |
| 系统提示 | --system-prompt、--append-system-prompt | 给 Claude Code 加规则 |
下面逐组进行实验与讲解:
1.2 模型与能力类
--model 指定模型,可以传别名(sonnet、opus、fable)或全名(claude-fable-5)。
模型选择的原则:日常编码用 sonnet(快、便宜),复杂推理或架构设计用 opus(更谨慎、推理链更长),追求最强能力用 fable。对于简单任务(解释概念、格式化代码),模型之间的差异不明显,不必纠结。
--effort 控制思考深度,取值为 low、medium、high、xhigh、max。注意部分模型不支持 max,会静默降级到 high,所以别拿 max 当稳定配置硬靠,效果可能不如你以为的那么强。
工作机制:effort 越高,模型在回答前花越多时间做内部推理(extended thinking)。对于简单问题,高 effort 可能判断”不需要展开”,输出反而更短;对于需要多步推理的问题,高 effort 才会体现为更完整的推导过程。不要用输出长度衡量 effort 的效果,要看推理深度。
实际使用建议:日常对话用 medium(默认),写代码和 debug 用 high,遇到特别棘手的问题再上 xhigh 或 max。
effort 的来源有几层:--effort 参数 > CLAUDE_CODE_EFFORT_LEVEL 环境变量 > 模型默认值。设环境变量是让 effort 按项目或按 shell 会话固定下来的常用做法。至于解析链的内部实现(状态字段、max 的会话级限制、降级规则),属于实现细节,本文不展开,入门阶段记住”五档加一句环境变量可覆盖”就够用。
--fallback-model 设置备用模型,只在 --print 模式下生效。当主模型过载或不可用时自动切换,可以传逗号分隔的列表按顺序尝试:
claude -p --model opus --fallback-model sonnet "hello"主模型 opus 如果响应超时,就自动降级到 sonnet。
1.3 会话与上下文类
这组选项管理”接着上回聊”的能力。它们的背后是一套会话持久化机制:每次对话都被记录在 ~/.claude/sessions/*.json(元数据)和 ~/.claude/projects/<hash>/<id>.jsonl(完整对话内容)中,恢复会话就是从这些文件加载数据(详见3.6 sessions 与 history)。
--continue(-c)恢复当前目录下最近一次对话。它的做法是扫描 ~/.claude/sessions/*.json 找到 cwd 匹配当前目录且时间最近的会话,然后从 ~/.claude/projects/<path-hash>/<sessionId>.jsonl 加载完整对话历史。
# 第一轮:让 Claude Code 记住数字claude -p "记住数字 42"已记住数字 42。# 第二轮:恢复会话并追问claude -p -c "我上次让你记住的数字是什么"根据我的记忆,你上次让我记住的数字是 42。会话状态被完整保留了。Claude Code 在后台把每次对话存为 session,--continue 会自动找到当前目录最近的那一个。
--resume 比 --continue 更精确,通过 session ID 直接定位 ~/.claude/projects/<path-hash>/<sessionId>.jsonl,也可以打开交互式选择器(数据来自 ~/.claude/history.jsonl 中的 prompt 记录)。--session-id 在启动时指定一个 UUID 作为会话标识,新会话的元数据和对话内容会写入对应的 ~/.claude/sessions/*.json 和 ~/.claude/projects/<path-hash>/<sessionId>.jsonl,适合需要精确追踪会话的自动化场景。--fork-session 配合 --resume 使用,复制源 jsonl 的对话内容到一个新的 session ID 下,相当于”另存为”,原会话不受影响。
1.4 权限与安全类
这组选项控制 Claude Code 能做什么、不能做什么。权限规则存储在 settings.json 的 permissions.allow / permissions.deny 字段中(详见3.5 settings.json),CLI 选项在启动时与文件中的规则合并生效。
--allowedTools 自动批准列表,列出的工具调用时跳过权限确认,与 settings.json 中的 permissions.allow 合并。注意:它不是白名单,未列出的工具仍然可用,只是走正常权限流程。如果你需要严格限制可用工具,应该用 --tools(见1.6 工作区与环境类)。
--disallowedTools 拒绝列表,列出的工具会从模型的工具上下文中完全移除,模型无法调用它们。拒绝规则优先于所有允许规则,即使 settings.json 中有对应的 permissions.allow 也会被覆盖。比如禁止 Bash 执行:
claude -p --disallowedTools "Bash" -- "列出当前目录的文件"当前目录下的文件:README.md src/ package.jsonBash 被移除后,Claude Code 会改用 Read 工具或 Glob 工具来获取文件列表,而不是执行 ls 命令。这在只读审查场景下很实用。
如果你需要更精细的控制,--disallowedTools 也支持范围规则:Bash(rm *) 只拒绝匹配 rm * 的 Bash 调用,但保留其他 Bash 命令的可用性。
--dangerously-skip-permissions 跳过所有权限检查。名字本身就在警告你:只在沙箱环境里用。还有一个相关选项 --allow-dangerously-skip-permissions,它不会直接跳权限,而是让你在运行时可以切换到跳权限模式,更安全一些。--permission-mode 提供更细粒度的控制,可选值包括 manual(每次询问)、acceptEdits(自动接受文件编辑)、auto(自动判断)、dontAsk(不询问直接执行)、plan(只规划不执行)、bypassPermissions(等同 --dangerously-skip-permissions)。不传该参数时走默认行为,即 manual 的逐次询问。
auto 模式不是简单的”全允许”,而是用一个 LLM 分类器实时判断每次工具调用安不安全,判断不了就默认阻止(fail-closed),安全工具(Read、Grep、Glob 等)则直接放行。分类器的双阶段机制、危险规则的临时剥离、熔断回退,这些属于权限系统的实现细节,本文不展开。入门阶段记住”auto 是让一个分类器替你守门,守不住就回退来问你”即可。
排障时常要分清 --safe-mode 和 --bare,两者都”关掉一部分东西”但范围不同:
| 选项 | 关掉什么 | 保留什么 | 适用场景 |
|---|---|---|---|
--safe-mode | 所有自定义:CLAUDE.md、skills、plugins、hooks、MCP、自定义命令、agents、output styles、workflows、themes、keybindings | 认证、模型选择、内置工具、权限系统照常,admin 策略仍生效 | 排查”是不是我的配置搞坏了” |
--bare | 更激进:hooks、LSP、plugin sync、auto-memory、CLAUDE.md 自动发现、attribution、后台预取、keychain/OAuth 读取 | skills 仍可通过 /skill-name 解析,认证严格限于 API key | 脚本、容器等无交互的最小启动 |
--safe-mode 面向”关掉自定义保排障”,--bare 面向”最小依赖启动”。排查行为异常先用 --safe-mode,确认是配置问题后再逐个开回去。
--dangerously-skip-permissions 会跳过所有安全确认,包括文件删除和命令执行。只在你完全隔离的沙箱环境(无网络、无敏感数据)中使用。
1.5 输出与集成类
这组选项控制 Claude Code 怎么把结果交给你,在非交互场景下尤其重要。
--print(-p)是最常用的集成选项,让 Claude Code 输出结果后直接退出,不走交互式对话。配合 --output-format json 可以拿到结构化的完整信息:
claude -p --output-format json "1+1等于几"{ "type": "result", "subtype": "success", "is_error": false, "api_error_status": null, "duration_ms": 3550, "duration_api_ms": 3499, "ttft_ms": 3545, "ttft_stream_ms": 3447, "time_to_request_ms": 54, "num_turns": 1, "result": "2", "stop_reason": "end_turn", "session_id": "b6128269-06e7-4a7f-8281-ed0a9c66970b", "total_cost_usd": 0.11613, "usage": { "input_tokens": 23216, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, "output_tokens": 2, "server_tool_use": { "web_search_requests": 0, "web_fetch_requests": 0 }, "service_tier": "standard", "cache_creation": { "ephemeral_1h_input_tokens": 0, "ephemeral_5m_input_tokens": 0 }, "inference_geo": "", "iterations": [], "speed": "standard" }, "modelUsage": { "claude-opus-4-8": { "inputTokens": 23216, "outputTokens": 2, "cacheReadInputTokens": 0, "cacheCreationInputTokens": 0, "webSearchRequests": 0, "costUSD": 0.11613, "contextWindow": 202752, "maxOutputTokens": 32000 } }, "permission_denials": [], "terminal_reason": "completed", "fast_mode_state": "off", "uuid": "b0d681a9-ef9a-4b10-b9fb-f836dcac438e"}JSON 输出里包含了耗时、token 用量、费用、session ID 等元数据,对自动化流程和成本追踪很有价值。
--json-schema 进一步约束输出格式,让 Claude Code 按照 JSON Schema 生成结构化数据:
claude -p --output-format json \ --json-schema '{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name","description"]}' \ "介绍一个 Python 内置函数"输出里大部分元数据字段(usage、modelUsage 等)和上一个示例一致,省略,只看有差异的部分:
{ "type": "result", "subtype": "success", "duration_ms": 36118, "num_turns": 3, "result": "{\"name\":\"lru_cache_intro\",\"description\":\"介绍了 Python 内置装饰器 functools.lru_cache 的基本用法、关键参数(maxsize/typed)、实用场景(昂贵计算/重叠子问题/不可变对象判等)、注意事项(可哈希要求/缓存清理/引用语义/Python 3.9+ 的 @cache 简写)以及自省方法(cache_info/cache_clear)。\"}", "stop_reason": "tool_use", "total_cost_usd": 0.25574, "permission_denials": [], "structured_output": { "name": "lru_cache_intro", "description": "介绍了 Python 内置装饰器 functools.lru_cache 的基本用法、关键参数(maxsize/typed)、实用场景(昂贵计算/重叠子问题/不可变对象判等)、注意事项(可哈希要求/缓存清理/引用语义/Python 3.9+ 的 @cache 简写)以及自省方法(cache_info/cache_clear)。" }, "terminal_reason": "completed", "fast_mode_state": "off"}可以看到,.structured_output 输出严格符合 schema 定义的字段和类型。把 Claude Code 嵌入数据处理管线时,不需要正则提取或后处理,直接拿到结构化结果。
1.6 工作区与环境类
这组选项控制 Claude Code 的工作范围和运行环境。
--add-dir 允许 Claude Code 访问主工作目录之外的目录。默认情况下,Claude Code 只能操作启动时所在目录(及其子目录)的文件。加上 --add-dir 后,指定的目录也进入它的”视野”,同时会扫描并加载该目录下的 CLAUDE.md(详见3.3 CLAUDE.md):
claude -p --add-dir /tmp/other-project \ "列出两个目录下的所有文件"--bare 启动极简模式(见 1.4 节说明)。
claude -p --bare "你好"你好!有什么我可以帮你的吗?--worktree 为当前会话创建一个独立的 git worktree,避免在主分支上做实验性修改。--mcp-config 加载 MCP(Model Context Protocol)服务器配置,读取指定 JSON 文件中的 mcpServers 定义,与 .mcp.json 和 settings.json 中的配置合并(详见3.8 MCP 配置)。--tools 直接指定可用工具集,比如 "Bash,Edit,Read" 只保留这三个工具,传 "" 则禁用所有工具。--settings 从额外文件或 JSON 字符串加载配置,成为 settings 层级中优先级最高的 flagSettings(详见3.5 settings.json),覆盖项目级和用户级设置。
1.7 系统提示类
--system-prompt 完全替换默认系统提示,--append-system-prompt 在默认提示后追加内容。后者更常用,因为你不希望丢掉 Claude Code 的内置行为指令。
claude -p --append-system-prompt "所有代码注释用中文" \ "写一个快排函数"追加的指令会叠加在默认提示之上。--append-system-prompt 适合给 Claude Code 加上项目特有的规则,比如”优先使用函数式风格”或”测试用 pytest 不用 unittest”。它在 prompt runtime 中走的是追加指令总线,涉及多级覆盖优先级,本文只讲操作层面,不展开内部处理。
1.8 CLI 选项的设计哲学
回头看这六组选项,有一个共同的设计思路:能在启动时声明的,就不要留到运行时。模型选择、权限范围、输出格式、工作目录,这些参数在会话开始前就已经确定了,整个会话期间保持不变。这种”先声明后执行”的模式让 Claude Code 的行为可预期,也方便自动化。
1.9 子命令
除了选项,claude 还接受子命令,用于执行一次性操作而非启动交互会话:
| 子命令 | 作用 |
|---|---|
claude agents | 管理后台代理(查看、调度) |
claude auth | 管理认证(登录、登出、查看状态) |
claude doctor | 健康检查(检查自动更新器、MCP 服务器等) |
claude mcp | 配置 MCP 服务器(add/list/remove/serve) |
claude plugin | 管理插件(安装、卸载、列表) |
claude project | 管理项目状态 |
claude install | 安装 Claude Code 原生构建 |
claude update | 检查更新并安装 |
claude setup-token | 设置长期认证令牌 |
claude ultrareview | 云端多代理代码审查 |
claude gateway | 企业认证/遥测网关 |
claude auto-mode | 查看自动模式分类器配置 |
其中 claude doctor 和 claude mcp 最常用。doctor 是排查环境问题的第一步,mcp 则是管理外部工具接入的核心命令。agents、auth、install、update 是个人日常会用到的;setup-token、ultrareview、gateway、auto-mode 偏企业或云端场景(长期令牌、云端多代理审查、企业网关、分类器配置),个人用户多数用不上,不用挨个试。
二、/ 命令:运行时的控制面板
CLI 选项是”启动参数”,/ 命令是”运行时控制面板”。你没法在对话进行中改 --model 或 --output-format,但可以用 /compact 压缩上下文、用 /model 切换模型、用 /permissions 调整权限。/ 命令弥补了 CLI 选项”一次设定不可更改”的限制,给 Agent 增加了运行时可调节的能力。
2.1 命令全景
| 分类 | 命令 | 一句话作用 |
|---|---|---|
| 会话管理 | /clear、/compact、/resume、/rewind | 重开、压缩、恢复、回退 |
| 上下文操作 | /context、/add-dir | 查看”它现在知道什么”、加目录 |
| 权限调整 | /permissions | 运行时开放或收紧工具权限 |
| 模型切换 | /model | 对话中途换模型 |
| 调试与诊断 | /doctor、/cost、/debug | 查健康、查花费、查内部细节 |
| 工作流 | /init、/review | 初始化项目、审查代码变更 |
下面逐类说明。
2.2 会话管理
/clear:清空当前对话历史,重新开始。不会退出 Claude Code,只是在会话 jsonl 中写入一个清除标记,上下文重置。/compact:压缩对话历史以释放上下文窗口。它读取当前 session 的 jsonl 全文,通过一次额外的 API 调用生成摘要,然后将压缩结果追加写入同一 jsonl(详见3.6 sessions 与 history)。原始消息仍在 jsonl 中留档,只是在上下文窗口中被摘要替代。自动压缩在有效上下文窗口的约 93% 处触发。压缩后最近用到的文件和状态会被重新喂回上下文。连续 3 次压缩失败后自动压缩停止(熔断器机制)。/resume:在交互模式下恢复之前的会话。扫描~/.claude/sessions/*.json展示当前项目的历史会话列表,同时读取~/.claude/history.jsonl中的 prompt 记录供搜索。和 CLI 的--resume功能相同,但入口在运行时。/rewind:回退到之前的对话轮次。它从~/.claude/file-history/<session-id>/目录读取文件编辑前的快照,恢复被修改的文件,同时截断 jsonl 中的对话记录到回退点(快照机制详见3.9 其他数据文件)。
2.3 上下文操作
/context:查看当前会话的上下文状态,展示已加载的 CLAUDE.md 文件、memory 文件、settings 配置等(分别对应3.3 CLAUDE.md、3.4 memory、3.5 settings.json)。帮你搞清楚”Claude Code 现在到底知道些什么”。/add-dir:运行时添加额外的工作目录,同时扫描并加载该目录下的 CLAUDE.md。和 CLI 的--add-dir功能相同,区别是不需要退出重启。
2.4 权限调整
/permissions:查看和修改当前会话的权限设置。读取 settings.json 三层级的权限配置,修改时写回对应层级的 settings 文件(详见3.5 settings.json)。你可以在运行时开放或收紧工具权限,比如临时允许 Bash 执行,做完再关掉。
2.5 模型切换
/model:在对话中切换模型。不用退出重启,直接从 sonnet 切到 opus 或反过来。对”先用快速模型探索,再用强模型精修”的工作流很方便。
2.6 调试与诊断
2.7 工作流
/init:在当前项目目录初始化 CLAUDE.md。它分析项目结构后生成一份包含项目规则、关键路径、编码风格的 CLAUDE.md,写入项目根目录(详见3.3 CLAUDE.md)。如果 CLAUDE.md 已存在,会建议改进。新项目接入 Claude Code 时建议先跑一次。/review:让 Claude Code 审查当前的代码变更(git diff),给出修改建议。
2.8 CLI 选项与 / 命令的对照
有些能力在 CLI 和 / 命令两边都有入口,有些只有单边:
| 能力 | CLI 选项 | / 命令 | 说明 |
|---|---|---|---|
| 模型选择 | --model | /model | 两边都能设,/ 命令可以运行时切换 |
| 添加目录 | --add-dir | /add-dir | 两边都能加 |
| 恢复会话 | --continue、--resume | /resume | CLI 在启动时选会话,/ 命令在运行时选 |
| 权限控制 | --permission-mode、--allowedTools | /permissions | CLI 做初始声明,/ 命令做运行时微调 |
| 压缩上下文 | 无 | /compact | 只有运行时入口 |
| 清空对话 | 无 | /clear | 只有运行时入口 |
| 回退轮次 | 无 | /rewind | 只有运行时入口 |
| 输出格式 | --output-format | 无 | 只在启动时确定 |
| JSON Schema | --json-schema | 无 | 只在启动时确定 |
| 系统提示 | --system-prompt、--append-system-prompt | 无 | 只在启动时确定 |
表里有个规律:压缩、清空、回退这三个只有运行时入口,没有 CLI 选项。原因很直接,它们操作的是”对话进行中产生的状态”,而启动时还没有对话可压缩、可清空、可回退。反过来,输出格式和系统提示只在启动时确定,因为它们是送进模型的固定框架,运行中改意义不大。这条分界线,正好对应下一节要讲的”可控性”。
2.9 / 命令的设计哲学
/ 命令解决的核心问题是 Agent 的可控性。如果所有参数都只能在启动时设定,一旦对话方向偏离,你只能退出重来。有了 / 命令,你可以在运行中调整模型、压缩上下文、回退轮次,这些能力让 Agent 从”启动即锁定”变成”运行时可调”。
三、文件系统:配置与数据的持久化
前两层控制的是 Claude Code 怎么想、怎么输出,文件系统层才是它”记住什么、持久化什么”的部分。CLI 选项和 / 命令都是即时生效的,但 CLAUDE.md 的项目规则、memory 的跨会话记忆、sessions 的对话历史,这些数据全部靠文件系统承载。理解了文件布局,你就知道 Claude Code 的”记忆”存在哪里、配置从哪里加载、哪些东西可以手动编辑。
本节侧重文件布局和操作层面的”读写哪个文件”。CLAUDE.md 和 memory 的加载机制、prompt 拼装工程,以及 JSONL 内部结构和 resume 恢复流水线,属于内部实现,本文不展开。
3.1 命令与文件的映射
很多命令的行为直接由文件驱动。下面这张表把最常用的”我敲了这个命令,它读写什么文件”的对应关系梳理出来:
| 命令 | 读 | 写 | 关键文件 |
|---|---|---|---|
--continue | 是 | 是 | ~/.claude/sessions/*.json 找当前目录最近会话;~/.claude/projects/<hash>/<id>.jsonl 恢复对话 |
--resume | 是 | 是 | 同上,按 session ID 精确定位;~/.claude/history.jsonl 供交互式搜索 |
--fork-session | 是 | 是 | 复制源 jsonl 到新 session ID |
/compact | 是 | 是 | ~/.claude/projects/<hash>/<id>.jsonl 读取全文、写入压缩摘要 |
/rewind | 是 | 是 | ~/.claude/file-history/<session-id>/ 恢复文件快照;jsonl 截断到回退点 |
/permissions | 是 | 是 | settings.json 三层级读取 + 写回 |
/init | 否 | 是 | CLAUDE.md 创建或更新 |
/context | 是 | 否 | CLAUDE.md + memory + settings 展示当前上下文 |
/cost | 是 | 否 | 当前 session 的 jsonl 累计 token 用量 |
--safe-mode | 部分 | 否 | 跳过 CLAUDE.md/memory/hooks/plugins/MCP 的加载 |
--add-dir | 是 | 否 | 扩展文件访问范围,扫描并加载新目录下的 CLAUDE.md |
claude mcp add | 是 | 是 | 写入 settings.json(local scope,默认)或 .mcp.json(project scope) |
/plugin install | 是 | 是 | ~/.claude/plugins/installed_plugins.json + ~/.claude/plugins/cache/ + settings.json |
有了这张表做参照,下面逐项展开文件布局的细节时,你能随时对照”这个文件被哪个命令读写”。
3.2 文件布局全景
Claude Code 的文件分布在两个层级:用户级(~/.claude/)和项目级(项目根目录下的 .claude/ 和 CLAUDE.md)。
| 层级 | 路径 | 作用 | 是否手动可编辑 |
|---|---|---|---|
| 用户级全局配置 | ~/.claude/settings.json | 全局权限、环境变量、插件、主题 | 可以 |
| 用户级历史 | ~/.claude/history.jsonl | 所有对话的输入记录(prompt、时间、session ID) | 不建议 |
| 用户级会话 | ~/.claude/sessions/*.json | 会话元数据(进程 ID、工作目录、状态) | 不建议 |
| 用户级项目数据 | ~/.claude/projects/<path-hash>/ | 会话 jsonl、子代理记录 | 不建议 |
| 用户级记忆 | ~/.claude/projects/<path-hash>/memory/ | 跨会话持久记忆文件 | 可以 |
| 用户级 skills | ~/.claude/skills/ | 用户级 skill 定义(目录形式) | 可以 |
| 用户级插件 | ~/.claude/plugins/installed_plugins.json | 已安装插件及版本 | 不建议 |
| 项目级配置 | <project>/.claude/settings.json | 项目级权限配置 | 可以 |
| 项目级本地配置 | <project>/.claude/settings.local.json | 不进 git 的本地权限配置 | 可以 |
| 项目级 skills | <project>/.claude/skills/ | 项目级 skill 定义 | 可以 |
| 项目级说明 | <project>/CLAUDE.md | 项目规则、关键路径、工作流约定 | 可以,最常编辑 |
注:实际还有目录级,主要用于 monorepo 的场景,但子目录级别只对
CLAUDE.md和.claude/rules/*.md有效;
下面逐项说明关键文件的作用和内容。
3.3 CLAUDE.md:项目级的行为指令
CLAUDE.md 是 Claude Code 最核心的配置文件。每次启动时,Claude Code 会自动在项目根目录查找并加载它,把内容注入系统提示。它相当于给 Claude Code 写了一份”项目说明书”。
一个典型的 CLAUDE.md 包含:
# Claude Code 项目配置
## 项目概述项目是什么、用什么技术栈、部署在哪里。
## 关键路径文章目录、草稿目录、配置文件位置。
## 写作规范遵循哪些 skill,优先级如何。
## 工作流约定修改前检查格式、不编造事实、草稿先放 _draft 目录。你可以用 /init 命令让 Claude Code 交互式引导你创建 CLAUDE.md,也可以手动编写。CLAUDE.md 的加载路径不限于项目根目录:Claude Code 还会扫描 .claude/rules/*.md、用户级 ~/.claude/CLAUDE.md、以及 --add-dir 添加目录下的 CLAUDE.md(见1.6 工作区与环境类),从外到内逐层叠加。--safe-mode 和 --bare(见1.4 权限与安全类)会跳过 CLAUDE.md 的自动发现。
CLAUDE.md 的加载遵循四级信任模型(Managed > User > Project > Local),后加载的文件覆盖先加载的。Project 和 Local 文件按目录从根到 CWD 遍历,越靠近 CWD 的文件优先级越高。CLAUDE.md 还支持 @./relative/path 语法引用外部文件(深度上限 5),.claude/rules/*.md 中的规则文件可以用 frontmatter 的 paths: 字段声明条件加载。这些加载规则的内部实现(section 化拼装、缓存边界、动态注入)本文不展开。
3.4 memory:跨会话的持久记忆
memory 目录在 ~/.claude/projects/<项目路径哈希>/memory/ 下。每个记忆是一个独立的 markdown 文件,带 frontmatter(包含 name、description、metadata 等字段)。MEMORY.md 是索引文件,每行一条记忆的标题和摘要。Claude Code 每次启动时加载 MEMORY.md,根据描述判断哪些记忆与当前任务相关,再按需读取具体文件。memory 的注入机制和更新协议(session memory prompt、memory extraction prompt)本文不展开。
memory 和 CLAUDE.md 的区别:CLAUDE.md 是你主动写的项目规则(用 /init 创建,见2.7 工作流),memory 是 Claude Code 在对话中自己沉淀的跨会话经验。一个管”你应该怎么干活”,一个管”上次干活学到了什么”。--safe-mode 和 --bare(见1.4 权限与安全类)会跳过 memory 的自动加载。
3.5 settings.json:权限与配置
settings.json 有三个层级,优先级从低到高:
- 用户级:
~/.claude/settings.json,全局生效 - 项目级:
<project>/.claude/settings.json,进 git,团队共享 - 本地级:
<project>/.claude/settings.local.json,不进 git,个人覆盖
一个典型的项目级 settings.json:
{ "permissions": { "allow": [ "Bash(*)", "Read", "Write", "Edit" ] }}这里声明了允许的工具权限。settings.local.json 的格式相同,但适合放个人偏好(比如本地开发环境特有的权限),不会污染 git 仓库。
用户级 settings.json 则承载全局配置:环境变量(API key、base URL)、插件启用、主题选择等。三个层级的配置在启动时合并,高优先级覆盖低优先级。--settings 指定的配置成为 flagSettings 层,优先级最高(见1.6 工作区与环境类)。--setting-sources 可以控制只加载其中某些层级。/permissions 命令(见2.4 权限调整)在运行时修改权限后,会写回对应层级的 settings 文件。
3.6 sessions 与 history:对话数据
~/.claude/sessions/*.json 存储会话元数据,每个文件以进程 PID 命名,记录 sessionId(UUID)、cwd(工作目录)、status(idle/busy/completed)、startedAt、version 等字段。--continue 就是扫描这些文件找当前目录最近的会话,--resume 按 sessionId 直接定位。
~/.claude/projects/<path-hash>/<session-id>.jsonl 存储会话的完整对话内容,采用 append-only 事件日志格式。每一行是一个 JSON 对象,消息类型包括 mode、system、user、assistant、attachment、file-history-snapshot、ai-title、last-prompt 等。这是 Claude Code 的”对话档案”,也是 --continue/--resume 恢复对话的数据来源,/compact 写入压缩摘要的目标,/rewind 截断对话的起点。子代理(Agent)的对话记录在 ~/.claude/projects/<path-hash>/<session-id>/subagents/agent-<id>.jsonl,元信息在对应的 .meta.json 中。大工具输出持久化在 ~/.claude/projects/<path-hash>/<session-id>/tool-results/ 下。
~/.claude/history.jsonl 是更轻量的记录,每行只存用户输入的 display text、时间戳、session ID 和 project 路径,不包含模型回复。这个文件用于 /resume 的交互式选择器,让你搜索历史对话。
3.7 skills:行为扩展
skills 以目录形式存储,每个 skill 目录包含一个或多个 markdown 文件,定义了特定场景下的行为规范。
skills 的加载来源按优先级排列:
- Bundled skills:内置在 Claude Code 二进制中(
--disable-slash-commands可禁用) - 用户级:
~/.claude/skills/,全局生效 - 项目级:
<project>/.claude/skills/,只在该项目生效 - 插件级:
~/.claude/plugins/cache/<marketplace>/<plugin>/skills/ - 自定义命令:
<project>/.claude/commands/中的文件自动成为 / 命令
当你在对话中触发一个 skill(比如 /sync-api),Claude Code 从 skills 目录加载对应的 markdown 内容,注入当前对话的上下文。
3.8 MCP 配置:外部工具接入
MCP(Model Context Protocol)服务器的配置分布在多个文件中:
| 来源 | 路径 | 写入方式 |
|---|---|---|
| 项目级 | <project>/.mcp.json | claude mcp add --scope project 或手动编辑 |
| 用户级 | ~/.claude/settings.json 中的 mcpServers 字段 | claude mcp add --scope user |
| 本地级 | <project>/.claude/settings.local.json | claude mcp add --scope local(默认) |
| CLI 临时 | --mcp-config <file> 指定的 JSON 文件 | 只在当前会话生效 |
claude mcp list 列出所有来源的 MCP 服务器。项目级 .mcp.json 中的服务器首次加载时会弹出安全确认,批准后才能连接。--strict-mcp-config 只允许 --mcp-config 指定的服务器,忽略其他来源。
3.9 其他数据文件
| 文件 | 作用 | 关联命令 |
|---|---|---|
~/.claude/plugins/installed_plugins.json | 已安装插件列表及版本 | /plugin install、/plugin disable |
~/.claude/plugins/cache/ | 插件下载缓存 | /plugin install、claude plugin prune |
~/.claude/file-history/ | 文件修改的快照备份 | /rewind 读取快照恢复文件 |
~/.claude/shell-snapshots/ | shell 环境快照 | Bash 工具每次调用前保存环境 |
~/.claude/telemetry/ | 遥测数据(失败事件记录) | 无直接命令 |
~/.claude/cache/ | 内部缓存(如 changelog) | claude update 读取版本信息 |
~/.claude/backups/ | settings.json 的备份 | 修改 settings 前自动创建 |
~/.claude/plans/ | 计划模式产生的计划文件 | EnterPlanMode 写入 |
~/.claude/scheduled_tasks.json | 持久化的定时任务 | CronCreate(durable: true) |
~/.claude/projects/<path-hash>/<session-id>/subagents/ | 子代理的对话记录和元信息 | Agent 工具 |
~/.claude/projects/<path-hash>/<session-id>/tool-results/ | 大工具输出的持久化缓存 | 工具调用结果过大时自动写入 |
这些文件一般不需要手动编辑,但了解它们的存在有助于排查问题。比如 /rewind 能回退文件修改,靠的就是 ~/.claude/file-history/ 中的快照;用 /plugin install 装插件时,会同时写入 ~/.claude/plugins/installed_plugins.json、~/.claude/plugins/cache/ 和 settings.json 的 enabledPlugins 字段(详见第五节插件生态)。
3.10 文件系统的设计哲学
Claude Code 的文件布局体现了一个设计思路:文件系统即记忆。CLAUDE.md 是项目级的”工作手册”,memory 是跨会话的”经验笔记”,sessions jsonl 是”对话档案”,settings.json 是”权限清单”。这些文件让 Claude Code 从一个”每次启动都从零开始的聊天机器人”变成了”有项目上下文、有历史经验、有行为约束的 Agent”。文件系统不是 Claude Code 的附带产物,而是它”记住事情”的根基。
四、进阶能力:怎么用得高效
前三层讲的是”开关在哪、状态存哪”。但真正拉开效率差距的,是 Claude Code 里几个不靠开关、靠用法的能力。它们在 CLI 选项表里只占一行甚至没露脸,却是从”会聊天”到”会干活”的分水岭。这一节给一张地图,每个能力说清解决什么、什么时候用、入口在哪。
| 能力 | 解决什么 | 什么时候用 | 操作入口 |
|---|---|---|---|
| 子代理(Agent) | 把大任务拆给并行子代理,每个独立上下文 | 改动涉及多个不相干模块、需要边查边改时 | Agent 工具、Task 系列 |
| 计划模式(Plan) | 先出方案再动手,避免跑偏 | 需求模糊或改动较大,不想让它直接改文件时 | --permission-mode plan、EnterPlanMode |
| skills | 把重复的做事方法固化成可复用指令 | 某类任务反复做(写博客、发版、建组件),每次都要重复交代规则时 | .claude/skills/ 下的 SKILL.md |
| hooks | 在生命周期事件上自动执行脚本 | 想让”每次保存后自动跑 lint""提交前自动检查”这类自动化时 | settings.json 的 hooks 字段 |
| MCP 服务器 | 把外部工具(数据库、issue 系统、浏览器)接进来 | 需要 Claude Code 操作它本身够不着的系统时 | claude mcp、--mcp-config |
挑两个最容易立刻上手的展开。
计划模式适合”需求大、怕跑偏”的场景。用 --permission-mode plan 启动,或对话中进入计划模式,Claude Code 会先给你一份方案而不动文件。你审完方案认可了,再让它执行。这比放任它直接改十几个文件然后你挨个回滚省事得多。复杂任务先 plan 再做,是效率最高的一个习惯。
子代理适合”任务能拆”的场景。比如”给这三个独立模块各加一个单元测试”,主代理可以同时派三个子代理分头干,各自有独立上下文不互相污染,主代理只汇总结果。单线程聊天改成并行调度,是大仓库里提效最明显的一招。子代理的对话记录单独存放在 ~/.claude/projects/<path-hash>/<session-id>/subagents/ 下,不挤占主会话上下文。
skills 和 hooks 的内部机制较重,本文不展开。你只需要知道:skills 是把”怎么做某类事”写成 markdown,触发时注入上下文;hooks 是在工具调用前后挂钩子跑脚本。本仓库自己的写作流程就是靠一套 skills 驱动的(写作规范、格式检查、评审清单都是 skills),这就是 skills 提效的活样本。
五、插件与生态
上面这些能力都能靠手写配置实现,但社区已经把很多最佳实践打包成了插件。新项目装一两个插件,比从零配 hooks 和 skills 快得多。
插件是打包分发的能力集合,一个插件可以同时带上 skills、slash 命令、hooks、MCP 配置、子代理定义。安装不用记路径,在对话里用斜杠命令:
# 从官方 marketplace 装一个插件/plugin install <插件名>@claude-plugins-official
# 注册一个第三方 marketplace(owner/repo 简写)/plugin marketplace add obra/superpowers-marketplace@ 后面是 marketplace 名。官方 marketplace 叫 claude-plugins-official,由 Anthropic 维护,首次用 /plugin 时通常已自动注册,里面有 200 多个插件。第三方 marketplace 用 /plugin marketplace add <github-owner/repo> 注册后再装。
几个值得新项目优先认识的高频插件:
| 插件 | 来源 | 解决什么 |
|---|---|---|
claude-code-setup | Anthropic 官方 | 扫描仓库技术栈,推荐适合的 hooks、skills、MCP、子代理配置 |
superpowers | 社区(Jesse Vincent) | 一套会自动触发的工作流方法论:TDD、系统化调试、计划先行、子代理开发 |
code-review | Anthropic 官方 | 多个子代理并行做 PR 代码评审 |
context7 | 社区 | 拉取最新版本的库文档做实时查询,避免模型用过期 API |
表格里前两个最值得新项目先装,命令直接抄:
/plugin install claude-code-setup@claude-plugins-official # 官方,技术栈分析推荐/plugin install superpowers@claude-plugins-official # 社区,工作流方法论这里有个容易踩的认知坑。claude-code-setup 装好后提供的是一个叫 claude-automation-recommender 的 skill,引用时写作 claude-code-setup:claude-automation-recommender(插件名和 skill 名不一样)。而且它是只读分析器:扫描你的仓库后给出”建议装哪些自动化”的推荐,本身不写任何文件。推荐落地还得你或 Claude Code 另外执行。把它当成”帮你做技术选型的向导”,而不是”一键配好所有东西的开关”。
superpowers 是社区里最流行的方法论插件。它装上一堆会自动触发的 skills,比如你让它写功能,它会自动走”先头脑风暴澄清需求 → 写计划 → TDD 实现 → 验证”的流程,而不是闷头改代码。适合想要固定工作流纪律的人;如果你只想轻量用,可能觉得它话多。
插件装多了也会互相打架(多个插件都想拦截同一个事件),用 /plugin list 看已装的,不需要的用 /plugin disable 关掉。插件文件落在 ~/.claude/plugins/cache/ 下,清单在 ~/.claude/plugins/installed_plugins.json。
六、三层总结与实用建议
CLI 选项、/ 命令、文件系统交互构成了 Claude Code 的三层交互模型:
- CLI 选项:启动时声明意图。模型、权限、输出格式、工作目录,这些参数决定会话的边界条件。
- / 命令:运行时调整行为。压缩上下文、切换模型、回退轮次,这些操作让你在对话中保持控制。
- 文件系统:持久化配置与状态。CLAUDE.md 是项目规则,memory 是跨会话经验,sessions 是对话档案,settings.json 是权限清单。文件系统让 Claude Code 从”每次从零开始”变成”有记忆的 Agent”。
三层之间的关系是递进的:声明意图、调整行为、持久化状态。理解了这个结构,你对 Claude Code 的掌控就从”碰运气”变成了”有章法”。
几条实用建议:
新项目先用
/init。它会帮你生成 CLAUDE.md,让后续每次启动都自动加载项目规则。再装claude-code-setup插件,运行它提供的claude-automation-recommenderskill,让 Claude Code 扫描仓库、推荐该装哪些 hooks、skills、MCP(见第五节插件生态)。长对话勤用
/compact。上下文窗口是有限资源,定期压缩可以避免 token 浪费在过时的中间过程上。(还可以配置Auto-compact和合适的autoCompactWindow)自动化用
-p --output-format json --json-schema。结构化输出是 Claude Code 接入管线的关键,不要在自动化脚本里解析自由文本。放权干活,兜底兜住。与其把权限卡死让 AI 寸步难行,不如给它够用的权限放手去做,把精力放在兜底和指挥上:日常写操作留
acceptEdits让它自动做,删库、发布这类高危操作切回manual或plan把关,用 CLAUDE.md 指挥方向。注意放权不是用bypassPermissions,那等于裸奔。只读审查这种确定场景才回头收紧到--allowedTools Read。调试时用
--bare排除干扰。遇到行为异常,先用--bare或--safe-mode启动,确认是不是自定义配置导致的问题。善用 CLAUDE.md 和 memory。CLAUDE.md 写项目规则,memory 沉淀跨会话经验。两者配合,让 Claude Code 越用越顺手。
七、参考资料
- Claude Code 官方文档 — Claude Code 功能概览与使用指南
- Claude Code CLI 参考 — CLI 选项和 / 命令的完整参考
- Claude Code 插件文档 — 插件与 marketplace 机制说明
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






