我花了四十分钟做一次重构,Claude 四分钟就能搞定。差距不在模型,在围绕模型的一切。
普通用户是:敲 prompt,取第一条建议,把 Claude 当加强版自动补全用。我把它当作可编程的 agent 来跑:持久化记忆、自定义命令、并行 session 在多个 worktree 里同时工作、一个每周都更锐利的项目骨架。
这份指南假设你已经敲过 claude 进了终端、知道它能干嘛。我们来走得更远。
别再把它当成人机对话的 chatbot 了。把它当成一个需要护栏的自主 agent,你的整个工作流都会随之改变。
Anthropic 团队的 Boris Cherny 给出的核心原则简单到一句话:给 Claude 一个验证自己产出是否正确的办法。 没有这个闭环,你是唯一的反馈信号;有了它,Claude 会一直迭代直到代码真正能跑。Boris 估算仅这一步就能带来 2-3 倍的质量提升。
Shift+Tab 进入 plan mode(只读),让 Claude 读文件、追踪数据流、摸清数据模型。拿到规划,再执行。小修小补不用规划,但改动跨多个文件时必用。@src/auth/login.py。别复制粘贴错误信息,用 cat error.log | claude 管道进去。精确上下文远胜模糊描述。Ctrl+G 可以在 Claude 执行前打开规划在编辑器里修改。规划只是文字,在它变成代码之前塑形。大多数人打开 .claude/ 只看到 CLAUDE.md,然后走了。它底层是一个分层配置系统。
两种作用域:项目级(.claude/)在仓库里,提交到 git,团队共享。全局级(~/.claude/)在本地,跟着你在所有项目里生效。
心智模型:项目文件描述项目,全局文件描述你。
| 文件 | 作用域 | 提交 Git | 作用 |
|---|---|---|---|
| CLAUDE.md | 项目+全局 | ✅ | 每次 session 加载的指令 |
| CLAUDE.local.md | 仅项目 | ❌ | 你的私有项目笔记 |
| settings.json | 项目+全局 | ✅ | 权限、hooks、环境变量、模型默认值 |
| settings.local.json | 仅项目 | ❌ | 个人覆盖,自动 gitignore |
| .mcp.json | 仅项目 | ✅ | 团队共享 MCP 服务器 |
| skills/<name>/SKILL.md | 项目+全局 | ✅ | 用 /name 调用的可复用 prompt |
| commands/*.md | 项目+全局 | ✅ | 单文件斜杠命令 |
| agents/*.md | 项目+全局 | ✅ | 子 agent 定义 |
| rules/*.md | 项目+全局 | ✅ | 主题限定指令,可选路径门控 |
my-repo/ ├── .claude/ │ ├── settings.json │ ├── agents/ │ │ ├── pr-review.md │ │ └── test-writer.md │ ├── skills/ │ │ └── api-conventions/SKILL.md │ └── rules/ │ ├── frontend.md # 路径门控到 src/frontend/ │ └── migrations.md # 路径门控到 db/migrations/ ├── CLAUDE.md # 提交到 git,团队共享 ├── CLAUDE.local.md # gitignored,个人私有 └── .mcp.json # 团队共享 MCP 服务器
billing 服务时,root/CLAUDE.md 和 root/services/billing/CLAUDE.md 会同时加载。当不同目录的规范有分化时特别好用。.claude/rules/migrations.md 并指定 glob 路径。commands/*.md 做了一大堆仓库自动化,后来全迁到了 skills/。新东西直接进 skills/。claude project purge ~/path/to/repo --dry-run 可以看到 Claude 为某个项目保留了哪些本地状态,转交笔记本前很有用。CLAUDE.md 在每次 session 开头加载。写法不对,Claude 反复踩同一个坑。写法对了,同样的 prompt 突然就产出你真正能上线的代码。
Boris 只关心两件事,其余都是噪音:
# Development Workflow **Always use `bun`, not `npm`.** # 1. Make changes # 2. Typecheck (fast) bun run typecheck # 3. Run tests bun run test -- -t "test name" # 单个测试套件 bun run test:file -- "glob" # 指定文件 # 4. Lint before committing bun run lint:file -- "file1.ts" bun run lint # 5. Before creating PR bun run lint:claude && bun run test
再读一遍。 Claude 猜不到的构建命令、执行顺序、单测命令、PR 前检查清单。没有风格偏好,没有代码库导览,没有废话。
Boris 还在 PR review 中用 @claude 让 Claude 直接提交规则:
nit: use a string literal, not a ts enum @claude add to CLAUDE.md to never use enums, always prefer literal unions
他管这叫 "复利工程"(Compounding Engineering):每次 PR review 都变成 CLAUDE.md 的一次升级。reviewer 指出一次错误,Claude 永远不再犯。
# Code style - Use ES modules (import/export), not CommonJS (require) # Workflow - Always use `bun`, not `npm` - Run `bun run typecheck` before claiming done - Never push to main directly. Always open a PR. # Architecture - All API routes go through src/api/middleware/auth.ts - New database queries go in src/db/queries/. No inline raw SQL. # Gotchas - `User` and `UserRecord` are distinct types. UserRecord is the DB row, User is the runtime object. - `formatCurrency` assumes USD. For international use `formatCurrencyByLocale`.
注意 Gotchas 那一栏。每一条都是从真实 PR 中 Claude 犯过的真实错误,在出错那一刻就被记录下来。当你看着模型把美元格式化发给法国用户的那个瞬间——记下来,一次就够了,再也不会发生。
不应该放在 CLAUDE.md 里的东西:标准语言规范、逐文件的代码库描述、长教程、API 文档、任何频繁变动的信息。
用 @path 语法引用外部文件,保持 CLAUDE.md 精简:
See @README.md for project overview and @package.json for scripts. @~/.claude/my-preferences.md
CLAUDE.local.md 和 CLAUDE.md 并列存放,自动 .gitignore,永远不会离开你的机器。
作者的用法:每次 PR 结束后,reviewer 的评论直接粘进 CLAUDE.local.md。几周后就变成了精确调教过的个人规则文件。
# Personal review notes (private) # From PR feedback - New SQS consumers need a DLQ and alarms in the same PR - Use `Optional<T>` over null returns - Tests for new endpoints must include the auth-failure case - Prefer named tuples over plain dicts for return types with 3+ fields # My own quirks to correct - Stop using `console.log`; use the project logger instead - Always update the OpenAPI spec when adding endpoints
每次 session 自动加载。Claude 从此自动包含 auth-failure 测试、自动更新 OpenAPI 规范。PR 上的 nitpick 评论两周内就消失了。
Skills 是把 Claude Code 从"什么都能做的 agent"变成"按照你团队的方式,做好项目真正需要的三四件事"的 agent。写过一两个之后,你会忍不住一直用它们。
某个周二,我需要 Claude 用同样的方式总结未提交的 diff,于是我往 ~/.claude/skills/ 丢了一个文件夹,完事。那个文件夹就是 skill。里面放一个 SKILL.md,带着 frontmatter 和指令,文件夹名本身就是你在 prompt 里敲的斜杠命令。项目级放在 .claude/skills/<name>/,全局级放在 ~/.claude/skills/<name>/。
最小的有用版本:
--- description: 总结未提交的改动,标注风险。适用于用户问改了什么、要 commit message、要 review diff 的场景。 --- ## Current changes !`git diff HEAD` ## Instructions 用两到三个 bullet 总结改动,然后列出风险:缺少错误处理、硬编码值、需要更新的测试。
保存到 ~/.claude/skills/summarize-changes/SKILL.md,之后所有 session 里都能用 /summarize-changes。
Skills 的三个核心能力:
templates/ 目录、参考文档、脚本。SKILL.md 只是你交给 Claude 的入口。! 开头的行在调用时执行命令,输出直接拼进 prompt。Frontmatter 有很多可选开关:
--- name: my-skill description: 什么时候用这个 skill disable-model-invocation: true # 只有用户明确敲 /my-skill 时才触发 allowed-tools: Read, Grep, Bash agent: read-only ---
disable-model-invocation: true。你希望 /ship 只在明确敲出来时部署,而不是 Claude 觉得"是时候了"就自己触发。这是一个给 Go 服务团队写的完整 skill。携带了规范、坑和新建 HTTP handler 的脚手架。
.claude/skills/go-handler/
├── SKILL.md
├── templates/
│ └── handler.go.tmpl
└── examples/
└── healthz.go
--- description: 按照团队的路由、验证、错误处理和测试规范,为 Go 服务搭建新的 HTTP handler。适用于用户要加新端点、新 handler、或扩展已有路由组。 --- # Go HTTP Handler Skill ## Stack - Go 1.22 with chi router - sqlc for typed queries,绝不在 handler 里写裸 SQL - zap for structured logging,绝不用 fmt.Println - testify for assertions,优先 table-driven tests ## Gotchas - `chi.URLParam` 对缺失参数返回 `""`,不返回 error。必须检查。 - 我们的 `httperr.Wrap` 不负责日志。返回前用 `h.log.Error` 单独记。 - Auth 中间件通过 `context.Value(authkey.User)` 注入。需要 type-assert 到 `*models.User`。 - sqlc nullable strings 用 `pgtype.Text`。调用 `.String` 之前检查 `.Valid`。 - 测试必须用 `httptest.NewRecorder` 和 `httptest.NewRequest`。不能启真实 server。
一个新开发者上手第一天就能交付完全符合规范的端点,不用先把代码库刨一遍。
mattpocock/skills 是最热门的 skills 仓库,约 10 万星。几个我常驻的:
/grill-me:写代码前对你做高强度质询/tdd:严格执行 red-green-refactor/diagnose:规范调试——复现、最小化、假设、修复、回归测试用 npx skills@latest add mattpocock/skills 安装。
Jeffallan/claude-skills 提供 66 个语言专属 profile:go-pro、python-pro、java-architect、typescript-pro、rust-engineer、sql-pro 等。可以组合。一个 Next.js 任务同时拉 nextjs-developer 和 typescript-pro。
Anthropic 官方 skills:
/code-review:四个并行 agent 审计 diff,只出置信度打分后的发现/simplify:审查最近代码的可复用性和效率/batch:把一个迁移任务扇出到几十个并行 agent,每个隔离在独立 worktree/webapp-testing:给 Claude Playwright 控制权来测试你的本地 web app开一个 subagent,它能啃完五十个文件而不撑爆你的主 session,然后交回一份干净的摘要。隔离的上下文。限定的工具权限。独立的爆炸半径。作者是在一次调试 session 里被耗光了 context 预算(在 monorepo 里追 import 追了半天)之后开始用 subagent 的,现在已是默认选择。
往 .claude/agents/ 放一个 markdown 文件(项目级),或者 ~/.claude/agents/(全局级)。Frontmatter 声明 name、description、tools、model。五行,完整契约。
上上周五作者差点把缺了 null check 的 PR 推上去,于是写了这个 agent。
--- name: pr-review description: 审查当前分支对 main 的 diff,找出 bug、安全问题、遗漏的边缘情况、违反项目规范的地方。在开 PR 前主动使用。 tools: Read, Grep, Glob, Bash model: opus --- You are a senior staff engineer reviewing a pull request. Thorough, direct, goal is to catch issues before human reviewers do. ## Process 1. Run `git diff main...HEAD` 2. Run `git log main..HEAD --oneline` 3. Read full files, not just diff context 4. Cross-check against CLAUDE.md, CLAUDE.local.md, and .claude/rules/ ## Flag - Correctness bugs: off-by-one, null handling, error paths, race conditions - Security: injection risks, missing auth checks, secrets in code - Missing tests for new logic - N+1 queries - Convention violations from CLAUDE.md or rules/ ## Do NOT flag - Style preferences not in project rules - Refactoring suggestions for working code - Anything outside this diff ## Output Group by severity (Critical / High / Medium / Low). File + line + issue + suggested fix. End with a verdict: **SHIP**, **FIX FIRST**, or **REWORK**.
触发方式是输入 "Have the pr-review agent look at my current branch." Subagent 在隔离上下文中完成工作,主 session 不会被 review 的噪声填满。
几个设计选择值得注意:工具列表刻意只读——能改代码的 reviewer 会合理化自己的修复而不是标记问题。选了 model: opus,因为抢在人类 reviewer 之前抓到安全漏洞值得这个成本。"Do NOT flag" 这一段才是让输出真正可用的关键,没有它会被变量命名风格的 nitpick 淹没。
十分钟搭完,已经救了两次。
Claude Code 团队自己的工作流里每天在跑 build-validator、code-architect、code-simplifier、oncall-guide、verify-app。
| Agent | 功能 |
|---|---|
| security-reviewer | 注入、认证、密钥、不安全的反序列化 |
| test-writer | 生成测试,和 code-reviewer 成对循环 |
| debugger | 追踪失败测试到根因 |
| performance-auditor | 性能剖析 |
| migration-writer | 生成符合项目规范的数据库迁移 |
| release-notes-writer | 从 commit 历史生成 changelog |
Claude Code 通过 MCP(Model Context Protocol)和插件系统接入外部工具和数据源。
团队共享 MCP:.mcp.json 定义团队共用的 MCP 服务器。一个典型配置:
{
"mcpServers": {
"linear": { "command": "npx", "args": ["-y", "@linear/mcp"] },
"slack": { "command": "npx", "args": ["-y", "@slack/mcp"] },
"postgres": {
"command": "npx", "args": ["-y", "@anthropic/mcp-postgres"],
"env": { "DATABASE_URL": "${DATABASE_URL}" }
}
}
}
个人 MCP:~/.claude/.mcp.json 放私人的外部工具。不会被提交。
插件系统:通过 ~/.claude/plugins/ 安装,扩展 Claude Code 的能力。社区插件覆盖了从 Jira 集成到自定义 UI 渲染的各种场景。
Claude Code 可以在 Cursor 里作为终端工具使用,也可以直接通过 Cursor 的模型选择器调用 Claude Opus/Sonnet。两者的区别:
作者的推荐:重活给 Claude Code 终端,轻活给 Cursor 补全。 当你需要跨文件重构、写测试、审计代码时,在 Cursor 的终端里开 Claude Code。当你只是补一个函数、改一行 import 时,用 Cursor 原生补全。
当 Claude Code 从"偶尔问问"变成"日常主力",安全考虑必须前置。
settings.json 里的 permissions 可以限制 Claude 能做什么:allow/deny Bash 执行、文件写入、网络访问。对生产环境仓库,建议用 deny 列表限制危险操作。/pr-review 给出的 SHIP/FIX FIRST/REWORK 是参考,不是决策。关键变更仍然需要人类 review。claude config set 管理敏感信息。这篇文章的核心观点和 Opus 4.8 在同一天登上讨论榜前列,不是巧合。
新旗舰模型发布当天,一线开发者讨论最热的不是跑分——是 怎么把模型嵌进自己的工作流。工具链已经成熟到了这一步:你不需要每出一个新模型就重搭工作流。把规则写进 CLAUDE.md,把重复操作封进 Skill,把重活拆给 Subagent。换更强的模型,整条流水线直接提速。
心态也从 "问 AI 一个问题" 变成了 "给 AI 搭一套班子"。
Boris 把这个过程叫做 复利工程:你今天往 CLAUDE.md 里加的一条规则,明天、后天、每个项目,它都在生效。Claude 在那边迭代改进自己的代码,你在这边迭代改进它运行的那套规则。两边都在变快。
这就是 Claude Code 作为日常主力的真正含义。
| 资源 | 链接 |
|---|---|
| mattpocock/skills(10万星) | github.com/mattpocock/skills |
| Jeffallan/claude-skills(66个语言profile) | github.com/Jeffallan/claude-skills |
| awesome-claude-code | github.com/hesreallyhim/awesome-claude-code |
| claudelog.com(社区 CLAUDE.md 精选) | claudelog.com |
| Anthropic claude-code-action | github.com/anthropics/claude-code-action |
| 原文(英文) | arps18.github.io/posts/claude-code-mastery/ |