cc-tutorial(1) · zsh · 80×40 paths chapters ↺ atelier ↻ studio
cc-tutorial(1) · live | a working manual · not a blog post read · play · ship
CLAUDE CODE × CODEX 手册 · v2026.05

Claude Code & Codex
实操教程

从「装上、跑通、不翻车」到「把整套工作流稳定下来」——9 章 · 8 个交互演示,每一章都可以点、可以输入、可以拖动。不是博客,是一本"用"的手册。

CHAPTERS
09
INTERACTIVES
08
READ TIME
~75m
REVISED
2026.05
// quick start · 第一分钟做什么

这是一本"用"的手册,不是"读"的

三步把它跑起来。每步可以在 60 秒内完成,全部不需要你装任何东西——可以现在就在浏览器里试。

§ 01 PATHS · 选一条线开始
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
§ 02 TABLE · 九个章节,按你想要的顺序读
§ 03 · ch.01 INSTALL · 安装与首次握手

Claude Code 不是单一 CLI。它是 6 个 surface(终端、VS Code、JetBrains、桌面应用、网页、iOS)的统一引擎。所有 surface 共享同一份 CLAUDE.md / settings / MCP 配置——你只需要选一个开始。

Codex 走的是另一条路:它嵌入 ChatGPT 订阅(Plus / Pro / Business / Edu / Enterprise),浏览器登录就是它,30 秒到第一句对话。两条路线互不冲突,可以并用。

选你的 surface

下面 6 张卡片——点击你想用的环境,看对应安装命令。 (选择会记住,下次进站默认这一个)

第一次? 直接选"网页版"(右上第 5 张卡)——0 安装、不需要装任何东西、浏览器登录即用。等你想长期用了再回来选 CLI 或桌面版。

5 分钟首次成功路径

选了 surface 之后,跟着这 4 步:

  1. 按上面的安装命令执行——出现进度条等它跑完(平均 2 分钟)
  2. 命令行敲 claude(Web 版自动登录),浏览器登录你的 Claude / ChatGPT 账号
  3. 看到欢迎屏 → 输入第一句:这个项目是干什么的?
  4. 看 AI 读了哪些文件、给了什么回答 — 这就是首次成功

如果你看到 command not found: claude:那是 PATH 问题。运行 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc,再敲一次 — 应该就好。其它常见错误见 ch.09 踩坑。

如果浏览器没自动打开:看终端打印的 URL,手动复制到浏览器。SSH / 远程会话里常见,把 URL 在本地浏览器打开即可。

check yourself

回答这 2 个问题(随便想想,不需要正确答案):

  1. 你为什么选了那个 surface? · 写在心里就行
  2. 你能用一句话复述"Claude Code = 6 surface 统一引擎"吗?

反思: 想明白了再翻下一章。**理解 mental model 比记命令更重要**——这是 ch.04 上下文管理之前最值得的 30 秒。

中级 · 安装方式选择 + 配置初始化

CC 有 3 种安装方式,选哪种取决于"自动更新 vs 版本控制":

  • Native install(推荐):curl -fsSL https://claude.ai/install.sh | bash自动后台更新,无须管
  • Homebrew(macOS):brew install --cask claude-code — 不自动更新,要手动 brew upgrade claude-code
  • WinGet(Windows):winget install Anthropic.ClaudeCode — 同上不自动更新

登录:首次跑 claude 自动弹浏览器登录;切账号用 /login。可登录三种账号:

  • Claude 订阅(Pro / Max / Team / Enterprise)— 推荐
  • Anthropic Console — 用 API key 预付费,首次会自动建一个 "Claude Code" workspace
  • Bedrock / Vertex / Foundry — 企业云路径(进阶层细讲)

项目初始化:进入仓库根 → 跑 /init。CC 扫描代码库识别 stack / 测试框架 / 入口文件,生成 38 行左右的 starter CLAUDE.md。看一眼,精简到 200 行内,提交 git。

Codex CLI 用 npm 安装(单一方式,Rust 二进制 + npm 包装):

npm i -g @openai/codex
codex
# 升级:
npm i -g @openai/codex@latest

登录:首跑要么用 ChatGPT 账号(Plus / Pro / Business / Edu / Enterprise 都包含 Codex),要么用 API key:

codex login              # 浏览器登录 ChatGPT
codex login --with-api-key  # 从 stdin 读 OpenAI API key

项目初始化:进入仓库 → 跑 /init。Codex 生成 AGENTS.md(结构与 CLAUDE.md 几乎完全一致,只是文件名不同——双轨在这里几乎是相同的概念,Anthropic 团队已经认可 AGENTS.md 兼容)。

多套环境用 ~/.codex/config.tomlprofile 切换:同一台机器为不同项目配不同 model / sandbox 模式 / MCP server。

进阶 · 企业部署 + 安全沙盒

团队 / 企业落地 4 个层次,从轻到重:

  • Managed policy CLAUDE.md:放 /Library/Application Support/ClaudeCode/CLAUDE.md(Mac)、 /etc/claude-code/CLAUDE.md(Linux)、 C:\Program Files\ClaudeCode\CLAUDE.md(Windows)。用户无法覆盖——配合 MDM / Group Policy / Ansible 分发,统一公司编码标准 / 安全策略
  • Devcontainer:CC 在容器里跑(.devcontainer 配置),开发环境隔离 + 跨机器一致
  • 第三方云路径:登录时选 Bedrock / Vertex AI / Microsoft Foundry,接你公司已有的云账号(数据驻留 / 审计 / 计费走原渠道)
  • LLM Gateway:自建 gateway 拦截所有 CC 流量(monitoring / rate limiting / model routing),配置见 /en/llm-gateway

权限管理 3 种模式:auto(分类器自动批)、permission allowlist(白名单命令)、sandbox(OS 级文件系统 + 网络隔离)。/permissions 看当前规则,/sandbox 切沙盒模式。Marcus 团队部署的标配是 managed policy + permissions allowlist + sandbox 三件套。

Codex 把状态显式 surface 化(对比 CC 的 invisible default 风格),进阶能力主要在 4 块:

  • Profile 切换:codex --profile work / --profile personal,每个 profile 独立 model / sandbox / MCP / approval mode
  • Sandbox 三档:--sandbox read-only(只读探索)/ workspace-write(默认 · 仅当前工作树可写)/ danger-full-access(关沙盒,需要 --yolo 才生效)
  • Remote app-server:codex app-server --listen ws://0.0.0.0:8080 + 客户端 codex --remote ws://server:8080,本地 TUI 连云端 codex(适合长任务 + 多设备)
  • Execpolicy 沙盒规则验证:codex execpolicy -r my-rules.toml <cmd>,先用规则跑过,再决定要不要让 Codex 真执行

团队部署:用 ChatGPT Business / Enterprise plan(seat-based 计价,带审计 / SSO / SCIM / no-training-on-data)。Cloud tasks(codex cloud exec)在 OpenAI 云上跑长任务,不占本地资源。

§ 04 · ch.02 CLI · 第一次握手

大多数 GUI 把"我能做什么"摆在你眼前。CLI 不一样:你必须 它你能做什么。听起来令人沮丧——其实是它的解放。一旦你掌握 /help,整个工具的版图就缓缓展开了。

下面的终端不连真实模型,但它会按 Claude Code 与 Codex CLI 的真实输出格式回应你。先试试 /help,再用大白话描述一个任务看看。

~/projects/web-app claude-code v2.4.0 · sandbox

指令速查

把这些当成 IDE 里的快捷键——头三天不用全记住,但第四天它们会让你飞起来。

小白必学 6 命令

记住这 6 个,90% 场景都覆盖了:

  • claudecodex — 启动交互会话
  • /help — 列所有命令(忘了什么都先 /help)
  • /init — 生成 CLAUDE.md / AGENTS.md(项目初始化)
  • /clear — 清空对话历史(任务切换前先清)
  • /cost — 查本次 token 花销(CC 限定;Codex 用 /status)
  • /diff — 看待应用的修改

三种模式 1 句话理解:plan = 想 / edit = 改 / agent = 闭环全自动。Shift+Tab 切换。先用 edit(默认),不熟悉时切 plan(只想不动文件)。

check yourself

在上面假终端里依次敲(不需要任何安装):

  1. /help — 看到命令列表
  2. /init — 看到 scanning 输出
  3. /cost — 看到 token 花销估算

反思:三个命令分别在解决什么问题?(发现 / 启动 / 监控)

中级 · 完整 slash 命令

除小白 6 个,CC 还有这些常用 slash:

  • /agents — 列 / 切 plan / edit / agent 模式
  • /commit — Claude 自动写 commit message + push
  • /compact — 摘要式压缩历史(184k → ~40k tokens,保留决策细节)
  • /loop — CLI 内调度,定时重跑同一个 prompt
  • /resumeclaude -r — picker 选历史会话续
  • /rewind(或按 Esc Esc)— 回滚到任意 checkpoint

非交互模式(管道 / CI / 脚本化):

tail -200 app.log | claude -p "Slack me on anomalies"
git diff main --name-only | claude -p "review for security issues"

续会话:claude -c 续最近 / claude -r 选历史 / claude --from-pr 1234 续 PR(自动 checkout + 加载 PR 描述作 context)。

Codex 30+ slash 命令(显式状态化 — 把 CC 隐含的状态都暴露成命令):

  • /personality friendly|pragmatic|noneCodex 独有的"语气"控件
  • /goal "重构登录" — 显式任务目标(支持 pause / resume / clear)
  • /agent — 切 agent thread(多线程并行)
  • /side / /fork / /new — 临时旁路 / 分叉同上下文 / 完全新会话
  • /review — 看工作树变更
  • /permissions — 改本次会话的批准粒度
  • /fast on — 切快速模式(GPT-5-mini,2 credits/msg)

Tab 队列:命令运行中按 Tab + 输入下一条 → 排队,跑完自动执行。CC 没等价机制(改用 /loop)。

该用哪种模式?

2 题决策树告诉你 plan / edit / agent 选哪个:

// q1 / 改动范围

这次任务跨多少文件?

// q2 / 风险

改动风险高吗?

edit mode

进阶 · 自定义 + 并行 + 自动化

CC 进阶 4 件套:

  • Keybindings 自定义:~/.claude/keybindings.json 覆盖默认 Shift+Tab(切 plan)、Esc Esc(rewind)等
  • Statusline:claude --statusline ./my-statusline.sh,自定义底栏显示 context 用量 / cost / git branch / 模型
  • Worktree 并行:claude --worktree feature-auth,每个 worktree 独立 git checkout 不冲突——一边写功能一边修 bug 互不干扰
  • PR 续会话:claude --from-pr 1234 自动 checkout 该 PR + 加载 PR 描述作 context;开会回来直接接着干

Skills + Hooks 组合:把常用 prompt 打包成 .claude/skills/<name>/SKILL.md(/<name> 触发),关键操作绑 hooks(PostToolUse 跑 lint / PreToolUse 拦截危险命令)。详见 ch.06。

Codex 进阶 5 件套:

  • Profile 切换:codex --profile work / --profile personal,各 profile 独立 model / sandbox / MCP / approval mode
  • Execpolicy 规则验证:codex execpolicy -r rules.toml <cmd>,先用沙盒规则验证命令再决定 Codex 能否真执行
  • Shell completion:codex completion zsh > ~/.codex-completion.zsh,获得 Tab 补全所有命令 + flag
  • Cloud tasks:codex cloud exec "重构 authentication",长任务在 OpenAI 云上跑,不占本地;`/apply <task-id>` 把 diff 取回应用
  • /keymap:TUI 内重映射快捷键,不用编辑配置文件
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
§ 05 · ch.03 PROMPT · 写好一句话胜过一千行

"帮我修一下登录" 是大多数 prompt 的样子。它没有错,只是太单薄。模型只能猜你要什么,给你一个"也许还行"的答案。把信息密度往上推一档,结果立刻不同。

// vague request
help me fix the login page bug
Missing: symptom · repro · file · expected outcome.
score 1 / 5
// specific & restrained
Login page (src/auth/Login.tsx): clicking "Sign in" does nothing in Safari, works in Chrome. Network tab shows the request never fires. Locate the cause first; propose a minimal fix — do not refactor. After applying, run npm test and confirm auth.spec.ts passes.
Hits: file · symptom · contrast · constraint · acceptance.
score 5 / 5

一个好提示词是给 AI 同事的"工单",不是搜索框查询。它至少要回答四件事:where(文件、范围)、what(症状或目标)、not(约束)、done(验收)。

试试自己写一条:4 元素填空

下面 4 个框依次填 — 实时给你 0/4 分,缺什么直接告诉你。(这是 Codex 官方推荐的 prompt 框架,CC 用同一思路只是没显式命名)

0 / 4
check yourself

把你明天要做的真实任务用 4 元素填一遍——不是练习题,就是真任务

反思:填的过程中,哪个元素卡住了?那个就是你"对自己任务最不清晰"的地方——AI 也猜不到。

中级 · 4 阶段循环 + verification

CC 官方推荐 explore-plan-implement-commit 4 阶段:

  1. Explore(plan mode):"读 src/auth 看认证流程,我要加 OAuth"——只让 Claude 读不动文件
  2. Plan:"基于上面,创建实施计划。哪些文件改?session 流程?"——按 Ctrl+G 在编辑器里改 plan
  3. Implement(切回默认 mode):"按你的计划实施,写 callback handler 测试,跑测试套件修失败"
  4. Commit:"用描述性 message 提交,开 PR"

Verification 是最高杠杆事(best-practices 原话):每个 prompt 必须告诉 Claude 怎么验证自己干对了——测试 / 截图 / 期望输出。例:
实现验证邮箱的函数
写 validateEmail。测试用例:user@example.com=true / invalid=false / user@.com=false。实现完跑测试。

让 Claude 反过来面试你(高级技巧):大任务先用 "... 用 AskUserQuestion 工具面试我,问技术实现 / UI/UX / 边界 / 取舍 / 我没考虑过的难点。问完写 SPEC.md。" — 然后开新会话执行 SPEC.md。

Codex 4 元素 + reasoning level 双控:

  • Reasoning level 4 档:Low(简单任务,省 token)/ Medium(默认)/ High(复杂改动 / 调试)/ Extra High(长链 agentic)
  • 切换:codex --reasoning high 或会话内 /personality pragmatic 暗推 reasoning(pragmatic 偏向 low,thorough 偏向 high)
  • 口诀:能 1 句说清 → Low;需要画流程图 → High;需要并行多 agent → Extra High

PLANS.md 模板(适合多步工作流):在 repo 根放一个 PLANS.md 列出所有"重复 N 次的工作流"模板,Codex /init 时会优先读取。例:

## 修 bug 的标准流程
1. 复现 bug,记录 stack trace
2. 找到第一个相关 commit (git log -p)
3. 写一个失败测试覆盖该 bug
4. 最小改动让测试通过
5. /review 看 diff,合理则 /commit

进阶 · 工业级 prompt + 工作流打包

CC 进阶把 prompt 当代码管理:

  • SPEC.md interview workflow:大功能开发前用 AskUserQuestion 面试 → 输出 SPEC.md → 新会话执行(主会话 context 干净)
  • Subagent 隔离 context:研究类任务派给 subagent,主会话只收摘要 — 例:"用 subagent 调查我们认证系统怎么处理 token 刷新"
  • Fan-out 模式:大批量 prompt 用 claude -p 脚本化:
    for f in $(cat files.txt); do claude -p "Migrate $f from React to Vue. Return OK or FAIL." --allowedTools "Edit,Bash(git commit *)" ; done
  • Writer/Reviewer 双会话:Session A 写 → Session B(干净 context)审 → 反馈回 A 修

Codex 进阶用 Skills + Automations + Worktree 把工作流变成"按钮":

  • Skills(.agents/skills/SKILL.md):把"修 bug 5 步流程"打包成一个 skill,/<name> 一键触发,团队 share 通过 plugin 分发
  • Automations:定时跑同一 prompt(如每天早上扫 PR review),与 skills 互补 — skill 定义"做什么",automation 定义"何时做"
  • Worktree 并行 prompt 实验:同一 prompt 在 3 个 worktree 跑,每个用不同 reasoning level / model — 看哪个产出最好,选优
  • 配置驱动(关键 Codex 哲学):~/.codex/config.toml 配 model / sandbox / MCP / skills,而不是每次 prompt 重复指定

让 AI 一开会就懂规矩

每个会话开始时,CC / Codex 会读取仓库根目录的 CLAUDE.md。把它当作"加入项目第一天给新同事的备忘录"——栈、约定、不要碰的地方。点击下方任意带下划线的字段查看为什么它有用。

# CLAUDE.md

## stack
- React 18 + TypeScript, Vite, TanStack Router
- Backend: Hono on Cloudflare Workers, D1
- Tests: Vitest + Playwright

## conventions
- Imports use "@/..." aliases — never "../../"
- Tailwind + cva variants; no styled-components
- Co-locate tests as *.test.ts next to source

## do not touch
- /migrations/* — generated, edit schema.ts instead
- /src/vendor/legacy-*.ts
- .env, wrangler.toml secrets

## commands
- dev:    "pnpm dev"
- test:   "pnpm vitest run"
- deploy: "pnpm wrangler deploy"

## style
- Prefer small functions over clever ones
- Comment why, never what
- Throw early, log structured
// annotation

click any underlined value
每个被标注的字段都对应一类典型 AI 误解。点开看 CC 在没看到这一行时会发生什么。

CLAUDE.md 的诀窍是具体且简短。一个好的项目宪法是 30–80 行,不是 5 页。先写"不要碰的地方"和"测试怎么跑"这两段,剩下的随项目演进慢慢补。

小白 · 一句话生成,200 行上限

第一次进项目,跑这一句:/init — Claude 扫一遍代码库,识别 stack / 测试框架 / 入口文件,生成 38 行左右的 starter CLAUDE.md。然后:

  • 看一眼,删掉显然 Claude 自己看代码就能懂的
  • 加 1-2 条"不要碰"的真实约束(generated files / vendor / secrets)
  • 200 行硬上限——超了 Claude 反而会忽略一半
  • 提交 git,团队 share

第一次进项目,跑 /init — Codex 扫代码库生成 AGENTS.md(结构与 CLAUDE.md 几乎完全一致,只是文件名不同)。Codex best-practices 推荐 5 段结构:

  1. 仓库布局(关键目录什么干啥)
  2. 构建 / 测试 / lint 命令(想跑测试 Codex 直接看这一行)
  3. 工程约定 + PR 期望
  4. 约束 + "不要碰"(最重要的一段)
  5. "完成"定义 + verification 步骤

Anthropic 已经认可 AGENTS.md 兼容 — CC 也读它(配 @AGENTS.md import 或 symlink)。所以**统一项目用 AGENTS.md 比双写更实际**。

check yourself

把上面的范例 CLAUDE.md 看完,自己想 1 件这个 repo 必须告诉 AI 的事:

反思:那件事 Claude 自己读代码能猜到吗?能 → 不要写。猜不到 → 必写(这就是 CLAUDE.md 的存在理由)。

中级 · 多级 scope + 路径作用域

CC 4 级 scope(优先级从高到低):

  • Managed policy · /Library/Application Support/ClaudeCode/CLAUDE.md — 用户无法覆盖(企业 IT 强制)
  • Project root · ./CLAUDE.md./.claude/CLAUDE.md — 团队 share,git 提交
  • User · ~/.claude/CLAUDE.md — 你的个人偏好,跨所有项目
  • Local · ./CLAUDE.local.md — 项目本地的个人偏好,加 .gitignore

CC 启动时沿目录树往上 walk,所有找到的拼接成 context(filesystem root → cwd 顺序)。子目录 CLAUDE.md 按需加载(Claude 第一次读那个目录文件时)。

@path import:@README.md / @~/.claude/my-prefs.md,5 跳上限,启动时全部展开。

.claude/rules/ 路径作用域:文件 frontmatter paths: ["src/api/**/*.ts"] → 只在 Claude 读匹配文件时加载,不撑爆 context。

Codex 3 级 scope(优先级从高到低):

  • User global · ~/.codex/AGENTS.md — 你的跨项目偏好
  • Repo · .codex/AGENTS.md 或 repo 根 AGENTS.md — 团队 share
  • Subdirectory · 子目录的 AGENTS.md 覆盖父级,适合 monorepo

Codex 没有 CC 的 managed policy 等价(企业级强制)。**用 profile 实现近似效果**:~/.codex/config.toml 多套 profile,每个 profile 配不同 AGENTS.md 路径 / model / sandbox。codex --profile work 切换。

进阶 · 节流 + auto memory

CC 进阶 context 管理 4 招:

  • Auto memory(v2.1.59+)· Claude 自己写笔记,放 ~/.claude/projects/<project>/memory/MEMORY.md(前 200 行/25KB 每会话加载)。用户纠错 / 偏好会自动累积,不用手写
  • /compact 摘要式压缩历史(184k → ~40k tokens,保留决策细节);CLAUDE.md 自动 re-inject 不丢
  • /rewind + 回滚:Esc Esc 选 checkpoint,只恢复 conversation / 只恢复 code / 都恢复(独立)
  • InstructionsLoaded hook:调试 CLAUDE.md / rules 加载顺序 — 在 hook 里 log 哪些文件加载了

对比 best-practices 反模式(原话):"如果 CLAUDE.md 太长,Claude 会忽略一半"——所以拆 .claude/rules/ 路径作用域 + 移到 skills 按需加载。200 行硬上限不是建议,是经验值。

Codex 进阶 4 节流杠杆(pricing 文档原话):

  • 嵌套 AGENTS.md:repo 根 + 子目录,不全部 launch 加载——只在 Codex 读子目录文件时加载相应 AGENTS.md
  • 限制 MCP servers 数量:每个 MCP 加 ~500 token context overhead;能不要的 disable 掉
  • Profile 套配减重:default profile 用 GPT-5-mini(2 credits/msg vs GPT-5 的 14)处理 boilerplate;复杂任务切 high profile
  • /compact 等价命令:Codex 的 /compact 用法和 CC 一致,摘要式压缩

统一双轨 mental model:CLAUDE.md = AGENTS.md(概念几乎完全等价),scope 优先级机制双方都从根 walk-up + 子目录覆盖,只是命名学派不同。**写一次 AGENTS.md,CC 用 import 兼容,双轨一套配置。**

完整一轮任务的五个阶段

建议的顺序在下方——但每一步都可以拖动重排,看看不同顺序会引发什么问题。多数新手把"plan"放在"edit"后面,结果不可避免地返工。

≡≡01写 promptwhere · what · not · done~3 min
≡≡02plan 模式让它先写计划,不动文件~1 min
≡≡03edit 模式批准计划后开始改代码~5 min
≡≡04跑测试npm test / vitest / pytest~2 min
≡≡05/commit让 AI 写 commit message~10 s
// trace: 默认顺序——这是 90% 任务该走的路。

plan 提到 edit 前面,等于让 AI 在动文件前先把推理写成自然语言。这通常把"跑题率"从 25% 拉到 5% 以下。

小白 · 看一次失败弧线

真实的修 bug 不是一次成功——是失败 → 诊断 → 修复。在 ch.02 假终端里敲下面这条命令,看 12 行的"故意失败"演示:

/demo fail-and-fix

看到这个序列:第 1 次假设错(以为是 await 缺失)→ 测试 FAIL → 回头读代码 → 找到 race condition → 加 mutex → ✓ PASS。关键学习:测试失败 → 不要再试,先回头读代码。

check yourself

回想你最近一次修 bug,是不是第 1 次猜错?

反思:当时如果不再急着试第 2 个修复,而是回头读 30 秒代码,会不会更快?

中级 · explore-plan-implement-commit + verification

CC 推荐的 4 阶段循环(也是上面 wf 拖动的优化排列):

  1. Explore(plan mode)— 让 Claude 读不动文件,先理解
  2. Plan—基于探索写实施计划,Ctrl+G 在编辑器改 plan
  3. Implement—切默认 mode 跑 plan,内嵌测试
  4. Commit—描述性 message + 开 PR

verification 是最高杠杆事(best-practices 原话):每个 prompt 必须告诉 Claude怎么验证自己干对了。3 种 verification:

  • 测试:"实现 X,跑 Y test 套件,修失败"
  • 截图对比:"做这个 UI,截图对比给定原图,列差异修"
  • 期望输出:"validateEmail:user@example.com=true / invalid=false / user@.com=false"

Codex 用 4 元素 + subagent 分解:

  • "Done when:" 元素**就是 verification**——没写就是没真要求 AI 验证
  • Subagent 分解:复杂调试派给 subagent 探索,主会话只收摘要 — "用 subagent 调查 src/auth/Login.tsx 的 race condition"
  • /review 同会话:写完直接 /review,让 Codex 审自己的改动 — Writer/Reviewer 单 thread 实现
  • Worktree 并行:一个 worktree 写功能 / 另一个修 bug,互不冲突

进阶 · SDET 专属:让 AI 帮你写 E2E(林姐 killer)

📌 这一节专为测试工程师写。如果你不写 E2E / unit test,可以跳到下一章。

核心问题:AI 写测试有 vanity test 风险——断言永远 pass 但没真测到的逻辑(expect(x).to.be.ok / 测了 mock 没测真实路径 / 等等)。Codex 文档里叫"vanity tests",CC best-practices 同等概念。

3 个反 vanity-test 实践

  1. 先写失败测试,再让 AI 修:你写一个**应该失败**的测试(覆盖 bug),让 AI"改代码让这个测试通过,不要改测试本身"。AI 没法绕过去——只能真改逻辑
  2. AI 自查 prompt 模板(下面有完整模板):每写完测试用这个 prompt 让 AI 自己审一遍"哪些断言可能 vanity"
  3. 边界用例对照表:写测试前,列出"应失败的输入 / 应成功的输入 / 边界 / 特殊符号 / 空值 / 超长" 6 类,**每类至少 1 个测试**

AI 自查 prompt 模板(直接复制用)

审查这个测试文件,标记可能是 vanity test 的断言:

1. 断言只检查"返回值不为 null/undefined"——不算真测
2. 测试 mock 但没测被 mock 的接口的真实行为
3. assert 的值是测试自己 setup 的(循环引用)
4. catch 块吞掉错误后断言 true
5. snapshot 测试但 snapshot 是 AI 自动生成的(没人审过)

对每个被标记的断言:
- 解释为什么是 vanity
- 给出"真测试"应该写什么(具体代码)
- 标注严重度(P0 完全 vanity / P1 弱测 / P2 改进)

page object / fixture 喂给 AI

CC:在 CLAUDE.md 加一段 ## test framework:

## test framework
- Playwright + page object pattern at tests/poms/
- Use LoginPage.login(email, password) instead of raw page.fill()
- Custom fixture: authedPage (auto-login as testuser@x.com)
- Don't write new fixtures — extend existing ones in fixtures/

这样 Claude 写新 E2E 时,自动用现有 page object 而不是 raw selector(后者 brittle)。

Codex:同样在 AGENTS.md 写,但 Codex 还支持 专属 SDET skill:

# .agents/skills/write-e2e/SKILL.md
---
name: write-e2e
description: Write Playwright E2E using our page objects
---
1. 读 tests/poms/ 下所有 page object class
2. 用 page object 方法写测试,不要 raw selector
3. 默认用 authedPage fixture(自动登录)
4. 跑 npx playwright test --headed,看是否真在测预期 UI
5. 跑完用 anti-vanity prompt 模板自查

团队 share:把这个 skill 装进 plugin,所有 SDET 一键 codex skill install <your-plugin>

SDET 团队 onboarding pack

把上面三件套(CLAUDE.md/AGENTS.md test framework 段 + AI 自查 prompt 模板 + page object 命名约定)打包成你团队的 SDET onboarding zip:新 SDET 第一天克隆,8 个 SDET 都能用同一套生产 AI 测试。

林姐说:这不是用 AI 写测试,这是把"测试工程的范式"喂给 AI,让它做"工程"而不是"代码生成"。

每个命令都做了一件你已经在做的事

CC / Codex 都是斜杠命令的 CLI。下面把高频命令分了五组,点开任何一个看具体用法。试一次胜过看十次。

速查表只是地图。真正记得住的是你在某次卡壳时第一次发现某个命令救了你——所以从今天开始,遇到一个用一个。

MCP / Skills / Hooks / Subagents · 我该用哪个?

CC 和 Codex 都把"扩展能力"拆成 5 个互补机制:CLAUDE.md / Skill / MCP / Subagent / Hook(+ Plugin 打包层)。下面 1 棵决策树告诉你"我这个需求该用哪个"——这是 features-overview 触发器表的可交互版本。

小白 · MCP 是什么 + 1 个例子

MCP(Model Context Protocol)把 AI 没法直接看到的外部数据"桥接"进来 — GitHub issues / Slack 消息 / 数据库 / Figma 设计稿。一行命令开通:

claude mcp add github
# 然后在 Claude 会话里:
"list our open issues with label 'bug'"
codex mcp add github
# 或在 Codex 设置 UI 里点"添加 MCP server"
# 会话内:
"list our open issues with label 'bug'"

没 MCP 时:Claude 看不到 GitHub,你得手动复制 issue 文字给它。有 MCP:它直接拉。这就是"工具扩展"的全部含义

中级 · 配置文件并排 · JSON vs TOML

CC 用 JSON(.claude/settings.json):

{
  "mcpServers": {
    "context7": {
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp"],
      "env": { "LOCAL_TOKEN": "..." }
    }
  }
}

scope 优先级:local > project > user。claude mcp list 看当前激活的。

内置 registry:api.anthropic.com/mcp-registry 列了官方推荐的 MCP servers(Slack / Figma / Playwright / Sentry / GitHub)。claude mcp add <name> 即可,无需手填配置。

Codex 用 TOML(~/.codex/config.toml 或 repo .codex/config.toml):

[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]

[mcp_servers.context7.env]
LOCAL_TOKEN = "..."

# HTTP server 用 url + bearer_token_env_var
[mcp_servers.figma]
url = "https://mcp.figma.com/mcp"
bearer_token_env_var = "FIGMA_OAUTH_TOKEN"

OAuth 流:codex mcp login <name>(配 callback port)。STDIO / HTTP / OAuth 三种 server 类型完整支持。

双轨核心差异:CC 用 JSON / Codex 用 TOML — 同一份语义,不同语法。这是 ch.06 最直接的可见对比点(也是为啥不要在双轨之间狂搬配置文件,各自 /init 各自 /init 即可)。

进阶 · 5 机制决策矩阵

features-overview 的触发器表(我们做了交互版):每种触发场景 → 推荐机制。一句话回答你纠结的"该用 CLAUDE.md 还是 Skill 还是 MCP 还是 Hook 还是 Plugin"。

// 你的触发场景

下面哪个最像你的痛点?

CLAUDE.md

5 机制 context 成本对比

机制 何时加载 context 成本
CLAUDE.md会话启动每个请求
Skill启动(描述)+ 调用时(全文)低(描述每请求)
MCP启动(工具名)+ 用时(schema)低(到工具用时)
Subagentspawn 时隔离(0 主会话开销)
Hook事件触发0(除非返回输出)

组合模式(常用):CLAUDE.md 写"全局规则" + Skill 装"工作流" + MCP 接"外部数据" + Hook 守"必须发生的事"(如 PostToolUse 跑 lint) + Subagent 隔离"会撑爆 context 的研究"。Plugin 把这一套打成可分享的 unit 给团队。

Codex 对应机制几乎完全相同(只是命名 + 文件位置不同):

  • AGENTS.md = CLAUDE.md(已经讲过)
  • Skill.agents/skills/SKILL.md(CC 在 .claude/skills/)
  • MCP = MCP(标准协议,配置文件不同 — JSON vs TOML)
  • Subagent = Subagent(/agent 切线程 = CC 的 subagent spawn)
  • Automations ≈ Hook + 调度 = CC 的 hooks + routines

双轨 takeaway:5 机制是 industry-emerging standard,概念双轨对应,只在文件位置 / 配置语法 / 命令前缀不同。**学一套 mental model 就能两边用**。

同一个任务在两个工具里的样子

任务:"给 /api/users 加分页,limit 默认 20,cursor 用 base64 编码的 createdAt。" 拖动中间的把手,左半是 Cursor 的 inline diff 视图,右半是 Claude Code 的 plan-then-edit 流。

cursor · agent / inline claude code · cli / plan
// claude code · plan first
$ claude > add pagination to /api/users …reading routes/users.ts, db/queries.ts ▸ plan (read-only · no writes yet) 1. extend listUsers(limit, cursor) in db/queries.ts 2. decode cursor: base64 → ISO date 3. query: where createdAt < decoded · order desc 4. encode last row's createdAt → next cursor 5. update OpenAPI spec + add 2 tests approve plan? [y/N/edit] y ✓ db/queries.ts +18 -3 ✓ routes/users.ts +12 -1 ✓ tests/users.test.ts +34 -0 ✓ openapi.yaml +8 $ /commit feat(users): cursor pagination
// cursor · agent / inline
⌘L add pagination to /api/users ⊙ generating diff for routes/users.ts ⊙ generating diff for db/queries.ts ⊙ generating diff for tests/users.test.ts routes/users.ts + const limit = parseInt(req.query.limit) || 20; + const cursor = req.query.cursor as string; + const rows = await listUsers(limit, cursor); - res.json(await listAll()); db/queries.ts + export async function listUsers(...) // 22 more lines [ accept all ] [ accept this ] [ reject ]

Cursor 把 AI 嵌进编辑器,diff 优先——你看到代码再决定接不接受。Claude Code 是终端 agent,计划优先——它先把"打算干什么"写出来给你审。前者快,后者稳。复杂改动选后者,体力活选前者。

把 Codex 加进来:三方对比

同一个 PR 任务,三个工具各自跑一遍。拖中间两个手柄看 Cursor / Claude Code / Codex 三方差异 — 蓝色把手切 Cursor↔CC,绿色把手切 CC↔Codex。

cursor claude code codex
// codex · 4 元素 + reasoning
$ codex > /goal "add pagination to /api/users" ◐ Goal: cursor pagination, limit=20 ◐ Context: routes/users.ts, db/queries.ts ◐ Constraints: base64 cursor on createdAt ◐ Done when: 2 tests pass, openapi updated > /plan ▸ 5 steps drafted (reasoning: high) approve? [y/n] y ✓ db/queries.ts +18 -3 ✓ routes/users.ts +12 -1 ✓ tests/users.test.ts +34 -0 ✓ openapi.yaml +8 > /review → > /commit
// claude code · plan first
$ claude > add pagination to /api/users …reading routes/users.ts, db/queries.ts ▸ plan (read-only · no writes yet) 1. extend listUsers(limit, cursor) in db/queries.ts 2. decode cursor: base64 → ISO date 3. query: where createdAt < decoded · order desc 4. encode last row's createdAt → next cursor 5. update OpenAPI spec + add 2 tests approve plan? [y/N/edit] y ✓ db/queries.ts +18 -3 ✓ routes/users.ts +12 -1 ✓ tests/users.test.ts +34 -0 ✓ openapi.yaml +8 $ /commit feat(users): cursor pagination
// cursor · agent / inline
⌘L add pagination to /api/users ⊙ generating diff for routes/users.ts ⊙ generating diff for db/queries.ts ⊙ generating diff for tests/users.test.ts routes/users.ts + const limit = parseInt(req.query.limit) || 20; + const cursor = req.query.cursor as string; + const rows = await listUsers(limit, cursor); - res.json(await listAll()); db/queries.ts + export async function listUsers(...) // 22 more lines [ accept all ] [ accept this ] [ reject ]

git workflow:从 commit 到 PR review

不用记 git 命令,一句话搞定:

claude "commit my changes with a descriptive message"
claude "create a pr for these changes"
# 在 codex 会话内
/diff      # 看变更
/review    # AI 审一遍自己的改动
/commit    # 提交 + 写 message

AI 会:看你的改动 → 分析意图 → 写 conventional commit message → 创建 PR。不用你想 commit message 怎么写

check yourself

下次写 commit message 时,先不要自己想,让 AI 写一版,看它写什么——会不会比你写得更好?(很可能是的)

中级 · CI 集成 + 自动 PR review

CC 中级 git 工具链:

  • gh CLI 自动用:装了 gh 后 Claude 自动用它(免 GitHub API rate limit),无需手动配
  • GitHub Actions PR 自动 review:配 /en/github-actions action,每个 PR 自动跑 review,inline 评论留代码改进建议
  • claude --from-pr 1234:续 PR 会话,自动 checkout PR + 加载 PR 描述作 context
  • /commit 智能模式:Claude 看 staged 改动 + 项目 commit 规范(从 git log 推断)→ 写符合风格的 message

Codex 中级 git 集成:

  • GitHub PR review 集成:在 PR 页面 @codex 触发 AI review,留 inline 评论
  • code_review.md 模板:repo 根放此文件 → Codex review 时按你的 review 规则(关注 security / performance / 可读性 哪个)
  • /review 工作树:跑 codex 后用 /review 让 AI 审自己写的改动 — Writer/Reviewer pattern 同会话内
  • automations 触发 PR 事件:repo webhook 触发 → automation 跑预定义 prompt → 评论回 PR

进阶 · 企业 CI + 云端深度 review

  • GitLab CI/CD:同 GitHub Actions,但跑在 GitLab pipeline,适合企业自托管
  • GitHub Enterprise Server:配 /en/github-enterprise-server 连自托管 GHE
  • ultraplan:云端规划——CLI 触发 → 网页端用大算力 plan → 回 CLI 执行(适合超大重构)
  • ultrareview:多 agent 并行 review(security agent + performance agent + style agent),报告 merge 到一份 inline 评论
  • GitHub Code Review 集成:每个 PR 都自动 review,无需手动触发
  • codex cloud exec "review PR #1234":把长任务派云端,本地不占资源,完成后 codex apply <task-id> 取回
  • automations + worktree 多 PR 并行:每个 PR 一个 worktree,automation 触发后并行 review,各自写回各自 PR 评论
  • Business / Enterprise 限额:Pro 5x 含 100-250 PR review/月、Pro 20x 含 400-1000、Business seat-based;Marcus ROI 决策点
  • ChatGPT Plus 路径:个人开发者无需 Business plan,Plus $20 已含 20-50 PR review/月

CC 还是 Codex?两题搞定

这俩工具不是替代关系。回答下面两个问题,告诉你这次任务该走哪条路。

// q1 / 任务规模

这次改动会跨多少文件?

// q2 / 你需要它做什么

主要工作类型?

claude code

Token 是最贵的资源 — 不是钱,是 context

订阅 / API key / 团队 plan 怎么选?下面计算器实时给你答案。但首先要懂:成本控制本质上是 context 控制 — context 满了 = 性能下降,token 烧光是结果不是原因。

小白 · /cost 看花费 + 订阅决策

每次会话敲 /cost 看本轮花了多少:

Session · started 14:02 (37 min ago)
  input  tokens   18 422   $0.055
  output tokens    9 108   $0.137
  cache  reads    24 311   $0.007
  total                    $0.199

小白订阅选择:1-2 次/周 → Claude Pro $20(Sonnet 主力 + Haiku 长任务)。每天用 → Claude Max $100(5x quota)。完全够。

Codex 用 /status 看会话状态(包括 token 估算):

/status
  model: gpt-5
  reasoning: medium
  messages used: 28 / 100  (5h window)
  cloud tasks: 4 / 60
  ChatGPT Plus · $20/mo

小白订阅选择:**ChatGPT Plus $20 已包含 Codex**——不需要单独付。如果你已经订了 Plus,Codex 是免费送的(在订阅 quota 内)。

check yourself

敲一次 /cost(CC)或 /status(Codex),看你刚才一次会话花了多少。

反思:那个数字让你心安还是慌?如果慌——说明你真在用,该上 plan 了。

中级 · 4 节流杠杆

CC 4 节流杠杆(best-practices 原话):

  1. 精简 prompt:Goal/Context/Constraints/Done when 4 元素,**不要废话**
  2. 模型选择:Sonnet 4.6(平衡) / Opus 4.7(复杂) / Haiku 4.5(便宜 + 长 context)。boilerplate 用 Haiku 省 5x token
  3. Cache hit 优化:CLAUDE.md / 系统 prompt 不变 → cache 读取 $0.0003/1k token(input 价 1/4)。"项目宪法稳定"是省钱的
  4. 并行 worktree 节省 context:不同任务用不同 worktree,各自 context 短而干净 — 比一个 worktree 里堆三件事便宜

Codex 4 节流杠杆(pricing 原话):

  1. 精简 prompt:同 CC,4 元素紧凑
  2. 嵌套 AGENTS.md:不全部 launch 加载,只在 Codex 读子目录文件时按需加载子目录的 AGENTS.md
  3. 限制 MCP servers 数量:每个 MCP 加 ~500 token context overhead — disable 你 90% 不用的
  4. GPT-5-mini 替代 boilerplate:**2 credits/msg vs GPT-5 的 14 credits** — 7x 节省。简单任务切 mini,复杂回 GPT-5

双轨节流核心一致:精简 prompt + 模型选择 + 配置文件不要冗余 + 任务隔离,只是命令名不同。

进阶 · 真实成本计算器(Marcus 团队 ROI)

输入团队规模 + 月使用强度 → 实时算出 CC 订阅 / Codex 订阅 / API key 三路月费用估算 + 推荐组合。

⚠ 估算粗粒度 · 数字按 2026 年公开 pricing 假定平均 token 数,**真实部署前去 docs.claude.com / developers.openai.com/codex/pricing 校准本月数字**。计算器仅作 ROI 决策辅助,不替代官方账单。
5 人

注:数字基于 2026-04 Anthropic / OpenAI 官方公开 pricing 估算,5 小时窗口规则简化为月度。Anthropic / OpenAI 都在频繁调整 quota,**真实部署前用计算器估算后,再去 docs.claude.com / developers.openai.com 校准本月数字**。

Marcus 团队 ROI 决策矩阵

  • 个人开发(1 人):Pro $20 1-2 次/周 / Max $100 每天用
  • 小团队(2-5 人):Team plan $25/seat,带集中计费 + 共享 CLAUDE.md
  • 中团队(6-30 人):Team or Enterprise(看是否需要 SAML / SCIM / no-train)
  • 大企业(30+):Enterprise + Bedrock/Vertex/Foundry 路径(数据驻留 + 走原云账号 + ZDR 选项)
  • CI 自动化:用 API key 路径(无 seat),按 token 计费,可能比订阅便宜(超 2000 msg/月转折点)
  • 个人开发:ChatGPT Plus $20(Codex 包含)/ Pro 5x $100(重度 — 含 750 msg GPT-5-Codex)
  • Pro 20x $200:promo 至 2026-05-31 给 25× 5h limit,深度用户值得
  • 小团队:Business plan(seat-based + larger VMs + no train)
  • 大企业:Enterprise(audit logs + SCIM + flexible credits + priority processing)
  • API key 路径:CI / 批量任务,**delayed access to new models** 是 trade-off

省钱口诀

3 句话总结:

  1. "短 prompt 比便宜模型省更多"——精简 4 元素能省 30-50% token,换 mini 模型只省 30%
  2. "CLAUDE.md / AGENTS.md 稳定 = cache hit 省钱"——不要每次改一行
  3. "超 2000 msg/月,API key 比订阅贵;低于 2000,订阅划算"——真实拐点

六种翻车,按发生频率排序

这些都是真实出现过的事故。每张卡片都包含:症状、根因、避免方式。把它当 checklist——开新会话前过一遍。

pitfall · 01

幽灵导入

AI 写的 import 指向不存在的文件

通常发生在它"猜"了一个工具函数的位置。修复:在 CLAUDE.md 写明真实的目录结构,或先让它 ls src/

× import { logger } from "@/lib/log"
// ENOENT — file does not exist
pitfall · 02

沉默重构

改了远超你要求的代码

你让它"改这一行",它顺手把整个文件重排了。Plan 模式 + "do not refactor unrelated code" 是首选解药。

+ 12 lines · expected
+ 87 lines · unsolicited
pitfall · 03

假绿测试

改测试让它过,而不是改代码

收到失败测试时,AI 偶尔会"修测试"。Prompt 里加:"修代码,不要碰 test 文件" 即可避免。

test auth.spec.ts ✓ (was failing)
diff auth.spec.ts expect 401 → expect 200
pitfall · 04

幻觉 API

引用了某个库不存在的方法

SDK 升级前后最容易出现。让它先 cat node_modules/x/index.d.ts 或贴官方文档。

× stripe.charges.createV2()
// 'createV2' does not exist
pitfall · 05

上下文爆表

塞太多东西,质量反而跌

把整个仓库丢进去 ≠ 帮 AI。用 /compact/clear 重启会话比堆 context 更有效。

tokens · 184k / 200k
→ cmd /compact 压到 ~40k(保留决策细节)
pitfall · 06

过度信任

"它说 OK 应该就 OK 了吧"

永远跑测试。永远 git diff。永远人肉读一遍关键路径。AI 是同事,不是神。

$ git diff --stat
$ npm test -- --watch=false
pitfall · 07 · install

command not found: claude

装上但敲 claude 没反应

PATH 没加。Native install 把 claude 放在 ~/.local/bin/,默认 zsh 不在 PATH。解药:加一行到 ~/.zshrc 然后 source。

$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
$ claude --version
pitfall · 08 · install

curl: (56) Failure writing

下载到一半网络断

对付公司防火墙 / 不稳定网络。解药:retry 或换 Homebrew/WinGet 路径。corp proxy 设 HTTPS_PROXY 环境变量。

$ export HTTPS_PROXY=http://proxy.x.com:8080
$ curl -fsSL https://claude.ai/install.sh | bash
// or: brew install --cask claude-code
pitfall · 09 · install

TLS connect error

SSL 握手失败

常因系统 CA 证书过期或公司代理做 TLS 拦截。解药:更新 CA(apt install ca-certificates)或指定 corporate CA bundle。

$ sudo apt-get install ca-certificates
$ curl --cacert /path/corp-ca.pem -fsSL https://claude.ai/install.sh | bash
// 配 NODE_EXTRA_CA_CERTS 让运行时也信任
pitfall · 10 · install

Killed (低内存 Linux)

VPS / 廉价 Cloud instance install 半路被 OOM kill

Claude Code 安装需要 ≥4GB RAM。解药:加 2GB swap 文件或升级 instance。

$ sudo fallocate -l 2G /swapfile
$ sudo chmod 600 /swapfile && sudo mkswap /swapfile
$ sudo swapon /swapfile
pitfall · 11 · install

shell 命令搞错

Windows PS vs CMD 命令搞混

Windows 上 PowerShell 和 CMD 用不同安装命令。看到 'irm' is not recognized 就是在 CMD 里跑了 PS 命令。

// PowerShell:
PS> irm https://claude.ai/install.ps1 | iex
// CMD:
C:\> curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd
pitfall · 12 · install

WSL1 exec format error

WSL1 加载二进制失败

WSL1 的 loader 处理不了新版 Claude Code 的程序头。解药:升 WSL2 一行命令搞定。

PS> wsl --set-version <DistroName> 2
// 不能升的话用 ld-linux-x86-64 wrapper(临时)
pitfall · 13 · install

macOS dyld error

macOS 太老

Claude Code 要 macOS 13.0+。看到 dyld: cannot loadSymbol not found _ubrk_clone = 系统库太老。解药:升 macOS。

× dyld: Symbol not found _ubrk_clone
Expected in: /usr/lib/libicucore.A.dylib
// → 苹果菜单 → About This Mac → 升级
pitfall · 14 · auth

OAuth invalid code

浏览器登录但贴 code 失败

code 过期或复制不完整。解药:重新打开 OAuth 页,5 分钟内贴。SSH/远程时按 c 复制 URL,在本地浏览器打开。

! OAuth error: Invalid code
→ 重发 /login,看终端打印的 URL,
本地浏览器打开,quick paste back
pitfall · 15 · auth

403 Forbidden after login

登录成功但请求被拒

**Pro/Max 用户**:订阅过期,去 claude.ai/settings 看。**Console 用户**:account 没"Claude Code"或"Developer" role,管理员在 Anthropic Console 给。**proxy**:公司代理拦了,设 NODE_EXTRA_CA_CERTS。

× API Error: 403 forbidden
→ 检查 claude.ai/settings 订阅
→ 或 Console → Members → role
pitfall · 16 · auth

ANTHROPIC_API_KEY 抢了订阅

"This organization has been disabled" 但订阅明明 ok

shell profile 里有老 API key 环境变量,优先于订阅 OAuth。**典型 quietly 烧别人的钱场景**。解药:unset 并清理 shell 配置。

$ unset ANTHROPIC_API_KEY
$ grep -r ANTHROPIC_API_KEY ~/.zshrc ~/.bashrc ~/.profile
$ /status # 在 Claude 内确认认证方式
pitfall · 17 · auth

OAuth 在 SSH/容器里失败

浏览器开在错的机器

WSL2 / SSH / Docker 都会让 OAuth callback 找不到对应浏览器。解药:复制 URL 到本地浏览器,登录后贴 code 回 CLI;或 codex auth login / claude auth login 从 stdin 读。

$ export BROWSER="/mnt/c/.../chrome.exe" # WSL2
$ claude auth login < code.txt # 或 stdin
pitfall · 18 · runtime

Sandbox 拒命令(Codex)

明明无害的命令被沙盒拦

Codex 默认 workspace-write,工作树外写就拒。解药:确认是否真要写外面 → 是 → /permissions 批准 / 否 → cd 到正确 workspace。

× sandbox blocked: write to /tmp/foo
→ /permissions allow tmp / 或 cd 到 workspace
pitfall · 19 · runtime

Hooks 没 fire(CC)

配了 PostToolUse hook 但没触发

常见原因:hook 路径错 / settings.json 缩进或 JSON 语法错 / hook 脚本没 +x 权限。解药:用 InstructionsLoaded hook 调试,看哪些文件加载了。

$ /hooks # 列当前加载的
$ chmod +x .claude/hooks/post-edit.sh
$ claude --debug-hooks
pitfall · 20 · runtime

Auto-compact 反复触发

长会话每隔几分钟卡一下

context 接近上限时 auto-compact 摘要历史,但摘要本身耗 token,会堆叠。解药:主动 /compact <instructions> 给具体指令,或 /clear 完全重启 + 用 SPEC.md 接力。

! auto-compact triggered (3rd time in 10min)
→ /clear 然后 SPEC.md 接力新会话

进阶 · Error Museum 的两条隐含规律

看完 20 张卡片,你会发现两条规律(Yuki 教学法:从样本看模式比记单个 case 强):

  1. "安装 + 认证"占 70% 翻车 — install/auth 类(pitfall 7-17)11/20 张。这意味着团队 onboarding 时把这 11 个错误打成 checklist,新人翻过即可少踩 11 个坑
  2. "环境特殊性"是隐藏成本 — WSL / Docker / 公司 proxy / 老 macOS / 32-bit Windows 各自有专属翻车。同质环境团队(全 macOS 14 + 公网)节省的不只是钱,是这部分 troubleshoot 时间

双轨 troubleshoot 入口

遇到上面没列的错误:

  • claude doctor — 自动诊断报告(PATH / Keychain / 网络 / 认证)
  • /feedback — 在 Claude 会话里直接报问题给团队
  • code.claude.com/docs/en/troubleshoot-install + /troubleshooting — 完整 30+ 错误目录(本章 11 张是高频子集)
  • GitHub issues:github.com/anthropics/claude-code/issues
  • /debug-config — 打印 config 各层 / hooks / sandbox 状态
  • codex execpolicy — 验证 sandbox 规则是否符合预期
  • /feedback — 报 issue 给 OpenAI 团队
  • developers.openai.com/codex — 官方 troubleshoot 入口(略简 — Codex 安装单一 npm 路径,错误谱比 CC 窄)
Yuki 反思 · 错误是同行者

挑 1 张你真遇到过的卡片(installer 失败 / OAuth 报错 / hooks 没 fire ...)。当时你花了多久才解决?有了这张卡之后,下次同样问题最快几分钟?

反思:这就是"错误博物馆"的价值——错误不是失败,是学习路径上的同行者。把你修过的错误也写成卡片,贴到团队 wiki,你就是别人的"错误博物馆策展人"。