Umm,我使用Claude Code 翻车了
上周我让 Claude Code 帮我改个 bug。就一句话:「把登录接口的超时时间调一下」。它改完了,我检查的时候也没仔细看——结果它顺手把我的 .env 文件里的数据库连接串改坏,还自作主张 git commit 了。等我在测试环境跑起来发现连不上库,回滚日志才看到那一笔提交:「fix: adjust login timeout」。
这一下字是真的整得我后背发凉。其实问题不在 Claude Code 笨(他可聪明了,喵的,比我们聪明太多了),在于我只是把它当成了一个「听话的实习生」,却没给它任何边界和限制。这次事之后,我重新把 Claude Code 啃了一遍,从权限模型到 hooks 到子代理,把那些普通入门教程不爱写的深层功能全摸了一遍。下面是我自己整理的一些小功能和玩法,按踩坑后补课的顺序来讲,照着做能避坑。
先说清楚:它到底是个什么东西
很多人第一次见 Claude Code,以为它就是个「能聊天的工具」「能在终端里补全代码的工具」。错,而且是根本性的错。
它是 Anthropic 出的一个 agentic CLI——能读整个项目、改文件、跑命令、提 PR,本质上是一个能在你终端里自主干活的 Agent。补全工具是「你写它猜」,Claude Code 是「你吩咐它干」。你跟它说「给这个模块加单元测试」,它会自己读代码、写测试、跑测试、修到通过为止,全程不需要你一行行点。
理解这一点太关键了,因为后面所有配置——CLAUDE.md、权限、hooks——都是围绕「怎么管好一个会自己动手的 Agent」展开的。你把它当补全工具用,就只用了它 10% 的能力,还容易翻车。
第一步:装好、登进去
环境要求 Node.js 18 及以上。一行命令全局安装:
npm i -g @anthropic-ai/claude-code
装完直接在终端敲 claude 启动。第一次运行会弹浏览器让你登录 Anthropic 账号授权,登录完回到终端,就能看到交互界面了。
当然,我们还可以安装claude code桌面版,作者就是懒人一个,直接桌面可视化操作,简单。

几个实操里容易卡住的点,我替你趟过了:
- 如果
npm i -g报权限错误(EACCES),别急着sudo,更干净的做法是把 npm 的全局目录指到用户目录,或者直接用npx @anthropic-ai/claude-code临时跑,不用全局装。 - 想确认装对了,跑
claude --version,能打印版本号就说明没问题。 -
- 桌面版登录有个问题哈朋友们,那就是需要跳转网页登录,网页登录后又调回来,需要魔法,魔法都知道吧,我相信大家既然看到Claude Code标题进来,那肯定知道魔法怎么用的,我就不说了,怕被关小黑屋!!!
后来我发现:CLAUDE.md 才是灵魂
翻完车我第一件事是查「它怎么知道在项目里该遵守什么规矩」。答案很简单,就是 CLAUDE.md——项目根目录下一个普通的 markdown 文件,是专门写给 Claude 看的「项目记忆」(umm,就是一个文件,他会根据里面的要求来工作)。
里面写什么?技术栈、常用命令、代码约定、不能碰的文件。比如我那个项目的初版长这样:
# 项目约定
- 技术栈:Node 18 + TypeScript + Prisma
- 启动命令:npm run dev
- 跑测试:npm test
- 数据库迁移前必须先备份
- 禁止修改 .env 和 migrations/ 下已有的文件
看到最后那句了吗——「禁止修改 .env」,就是我踩坑之后补上去的保命条款。你不用从零手写,Claude Code 自带 /init 命令,进项目后敲 /init,它会扫一遍你的代码自动生成初版 CLAUDE.md(其实还有一个README.md,但是两个目的差不多,只是针对的对象不一样,下面做个区分),你再改改就行。
还有一层全局记忆:放在 ~/.claude/CLAUDE.md,对所有项目生效。比如你全局都要求「注释用中文」「提交信息用 conventional commits 格式」「不要用 var」,写在这里一次,从此每个项目都继承。
一个小提醒:CLAUDE.md 会被原样塞进上下文,所以别往里塞几百行废话,越精炼越准,它越听话(越多越耗token)。我一般控制在 30 行以内,只放真正影响它行为的东西。
翻车的根源:权限模型没搞懂

回到开头那次事故。本质上来说是我没管权限——Claude Code 默认能读写文件、能跑 git 命令,它觉得改 .env 是「修配置」,就动手了,而且因为我没拦,它还提交了。Claude Code 有 4 种权限模式,这是进阶使用的命门:
- AskUserMode(默认):每次要动文件、跑命令都问你,最安全,新手建议一直开着。
- AcceptEdits:文件编辑自动同意,但跑命令仍要你确认。适合你已经信任它的改文件能力、但怕它乱跑 shell。
- PlanMode:只读,先出方案让你点头再动手。做大范围重构前切到这个,先跟它对齐思路,比直接开干稳得多。
- BypassPermissions:全部自动通过,最快但也最危险。我那次事故就是手滑开过它。
哦对了,还有Auto模式,也是慎用
settings.json 里还能玩出花
项目根目录 .claude/settings.json 是个宝库。除了权限,你还能配不少东西:
- permissions:细粒度工具黑白名单,比命令行
--permission-mode更精确。 - env:注入环境变量,不用每次在 shell 里 export。
- model 覆盖:指定用哪个模型,省得每次手动切。
- hooks 路径:告诉 Claude Code 去哪找你的 hooks 脚本
一个能直接用的示例:
{
"permissions": {
"allowedTools": ["Read", "Edit", "Bash(npm test:*)"],
"deniedTools": ["Bash(rm:*)"]
},
"env": {
"NODE_ENV": "development"
},
"model": "claude-sonnet-4-6"
}
这段的意思是:只允许读、编辑、跑 npm test 开头的命令,封掉所有 rm 命令;注入 NODE_ENV;默认用 sonnet 档模型干日常活儿。注意 Bash(npm test:*) 这种写法是指令前缀匹配,冒号后面是通配,很灵活。
Hooks:给 Claude 装个保险丝
这是我最想安利的功能,也是那次事故后我第一个补上的。Hooks 让你在某个动作「前」或「后」插入自己的脚本,等于给 Claude 装了根保险丝。
- PreToolUse:工具调用前触发,你的脚本返回拒绝码就能把这次调用拦下来。
- PostToolUse:工具调用后触发,比如自动格式化、跑完弹通知。
挡危险删除的 hooks 配置长这样(放进 settings.json 的 hooks 字段):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo \"$TOOL_INPUT\" | grep -qE 'rm -rf|git reset --hard'; then echo '危险命令被拦截'; exit 1; fi"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{ "type": "command", "command": "prettier --write $TOOL_FILE 2>/dev/null || true" }
]
}
]
}
}
这段干了两件事:任何 Bash 命令里带 rm -rf 或 git reset --hard 直接拦掉(exit 1 即拒绝);每次文件被编辑后自动跑 prettier 格式化,保持代码风格统一。你也能在 PostToolUse 里加个 notify-send(Linux)或 osascript(macOS)弹桌面通知,跑长任务时去倒杯咖啡,它干完了叫你。
Subagents:把脏活累活外包出去
复杂任务一个会话的上下文会爆。子代理(Subagents)让你把活拆给「专人」干。在 .claude/agents/*.md 定义一个 agent,描述它的角色、能用的工具、用什么模型:
---
name: test-writer
description: 专门给指定模块编写并跑通单元测试
tools: Read, Edit, Bash(npm test:*)
model: claude-sonnet-4-6
---
你负责给指定模块编写完整的单元测试,确保 npm test 通过后交付。
只做测试,不要改动业务代码。
定义好之后,主会话里说「让 test-writer 去给 auth 模块补测试」,它就会派这个子代理去干,干完把结果回报给你。关键是上下文隔离——子代理的对话不占主会话的上下文,长项目里这招能救命。
成本控制:别让账单爆炸
讲真,长会话是真的烧钱,尤其你开Auto和BypassPermissions 让它疯狂跑命令的时候。三个实用招:
/cost:随时看这轮会话花了多少 token 和钱,心里有数。- 模型切换:简单活儿用便宜模型。比如 settings.json 里把默认
model指向 sonnet 档,重活儿再临时切 opus 档,别一律上最贵的。 /compact:上下文太长时手动压缩,丢掉早期无关的对话,给后续腾空间,也省钱。
我的习惯是每开一个大任务前先 /cost 记个底数,跑完对比一下,慢慢就摸准「哪类活儿该用什么档位的模型」。另外把大任务拆给 Subagents,也能避免主会话上下文无限膨胀。
成本控制还有个方法,接入第三方API,API哪里获取,我之前文章说过,分享过两个自己用的,大家可以自行查找。
但是有个问题,Claude Code接入API相对来说麻烦,需要修改json文件,给大家推荐用CCSwitch这个软件吧,一件修改,使用,嘎嘎方便
真实踩坑复盘
最后把那次事故和后来又踩的几个坑一并交代,都是血泪:
- 误改重要文件:根因是 CLAUDE.md 里没写「禁止修改清单」,也没用
deniedTools兜底。现在我是双保险——CLAUDE.md 写禁令 + settings.json 里deniedTools封Bash(rm:*)和类似危险操作。 - 权限太松改错地方:别图省事一直开着 BypassPermissions。日常我用 AcceptEdits,大改动切 PlanMode 先过方案,只有 CI 里才用 bypass。
- context 爆了开始答非所问:长任务开了十几轮,它明显在胡说。及时
/compact,或者把任务拆给 Subagents 隔离上下文,别硬撑。
Claude Code 强是真强,但它是个「能干但没分寸」的实习生。你给它边界——CLAUDE.md 定规矩、权限模式控范围、hooks 兜底——它能帮你扛掉一半重复的活儿;你不管它,它就敢动你的 .env 还顺手帮你提交。
到这里我们来说一下CLAUDE.md和README.me的区别
CLAUDE.md:给 AI 的记忆/项目规范指令库。告诉 Claude 关于你这个项目的个性化上下文和准则,防止 AI 在编码时“瞎发挥”。
针对对象:给Claude Code看
README.md:项目的第一门面。告诉人这个项目是做什么的、怎么安装、怎么快速上手使用、示例代码以及贡献指南等。
针对对象:给使用AI的人看的
你用 Claude Code(或同类 AI 编码工具)翻过车吗?最离谱的一次是什么?
更多推荐


所有评论(0)