写在前面
Claude Code 我是从去年年底开始重度使用的。刚开始跟大多数人一样,就是打开终端敲需求、看它写代码、遇到问题再描述一遍。时间长了发现,很多真正改变使用体验的功能,并不在官方的快速入门里。
这篇文章不讲基础操作,也不列 API 文档。只说我亲自用过、并且确实在日常工作中沉淀下来的功能。有的藏得深,有的看似简单但用法很刁,按使用场景分类整理。
一、Skill 系统的进阶玩法
Skill 是 Claude Code 里最值得花时间研究的功能,没有之一。大部分人只用到了它的皮毛——写一段固定提示,输 /xxx 触发。但其实 Skill 的机制远不止这么简单。
1.1 动态注入:让 Skill "睁着眼睛"执行
我之前一直困扰一个问题:Skill 内容是静态的,但每次执行时上下文是动态的。写 PR review 的 Skill,如果每次都要手动把 diff 粘贴进去,那还不如不用。
后来发现 感叹号 + 反引号 的语法解决了这个问题:
## Review 任务
当前变更:
!\`git diff HEAD\`
关联评论:
!\`gh pr view --comments\`
执行顺序很有意思:
- 触发 Skill
- Claude Code 先执行 ! 里的 shell 命令
- 命令输出替换掉占位内容
- Claude 读到的是"已经填好现场信息"的完整内容
我现在有三个高频使用的动态 Skill:
- review-skill:自动拉 diff + PR 评论 + 改动文件列表,然后做代码审查
- debug-skill:注入最近的日志文件、当前环境变量、依赖版本
- deploy-check:读取当前分支、最近的提交信息、CI 状态
关键区别在于:这不是 Claude "决定去执行一个命令",而是 Skill 加载前的预处理机制。Claude 甚至不知道它读到的内容是动态生成的。
1.2 隐身 Skill:不需要出现在菜单里的背景知识
大多数人写 Skill 的心理模型是:Skill = 我手动敲 /技能名 触发。
但有一类 Skill 根本不该出现在 / 菜单里——它应该在 Claude 判断"需要这段知识"的时候自动加载。
在 frontmatter 里加一行就行:
---
user-invocable: false
description: 项目数据库表结构和字段说明,Claude 分析数据相关问题时自动参考。
---
加了之后:
- / 菜单里找不到它
- 但 Claude 在处理相关任务时,会根据 description 自动判断要不要加载
我用来放这些东西:
- 项目的业务术语和领域特定缩写
- 历史遗留代码的背景和重构限制
- 部署环境的特殊配置说明
- 团队约定的代码规范细则
和它相反的是 disable-model-invocation: true——那个是"只能我手动调,Claude 不能自动加载"。这两个参数管的是完全不同的事情。
1.3 传参 Skill:一模一样的流程,每次只换参数
写 Skill 最怕什么?怕流程定得太死。比如修复 issue 的流程每次都一样,但 issue 编号不一样。
Skill 支持参数注入,两种方式:
位置参数:
---
name: fix-issue
description: 修复指定的 GitHub Issue
argument-hint: <issue 编号>
---
请修复 Issue #$ARGUMENTS
步骤:
1. 读 Issue #$ARGUMENTS 描述
2. 定位相关代码
3. 写修复 + 写测试
触发:/fix-issue 123
命名参数:
---
arguments: [component, from, to]
---
把 $component 从 $from 迁移到 $to
触发:/migrate-component Button React Solid
用了半年传参 Skill 之后的体会:参数和流程分离是最大的收益。流程固化在 Skill 里保证一致性,每次只换参数降低出错率。团队成员用同一套 Skill,出不了轨。
1.4 Fork 模式:重任务在"隔离沙箱"里跑
有些 Skill 会大量读文件、跑长分析。跑完之后好家伙,主对话的上下文被撑得满满当当。
加两行就能解决:
---
context: fork
agent: Explore
---
触发后这个 Skill 会在独立子 agent 上下文里运行,不污染主会话。子 agent 跑完把结果摘要汇报回来,主会话干干净净。
我用来做这些事情:
- 全仓库依赖关系分析
- 大规模代码搜索和重构评估
- 长篇 PR 的完整 review
- 技术文档批量生成和校验
不适合的场景也很明确:需要依赖主对话历史信息的任务。隔离了就看不到上下文了,要注意。
1.5 按文件类型自动触发
Skill 的 paths 字段是个容易被忽略但极其实用的功能:
---
description: React 组件审查规范
paths:
- "**/*.tsx"
- "**/*.jsx"
---
当 Claude 操作 .tsx 或 .jsx 文件时,自动加载这个 Skill 里的规范。操作其他文件不触发。
实际价值: 不同技术栈有不同的代码规范。不用一个巨大的 CLAUDE.md 塞所有规则,而是按文件类型分发对应的 Skill。比如 .py 文件加载 Python 规范、.go 文件加载 Go 规范、Dockerfile 加载容器最佳实践。
1.6 按任务切换模型和思考深度
大多数人的使用习惯是一种模型用到底。但有些任务需要更强的大脑,有些任务轻量级就行。
Skill 的 frontmatter 里可以直接指定:
---
name: security-review
description: 安全审查代码改动
model: opus
effort: max
---
效果:
- 日常对话用默认模型(快,省)
- 触发
/security-review时自动切 Opus + 最深思考 - 结束后自动恢复之前的设置
不用手动输 /model opus → /effort max → 用完再切回来。我以前经常忘记切回 Sonnet,等发现的时候已经烧了不少额度。
1.7 命名空间:Plugin Skill 和你的 Skill 和平共处
装了别人的 Plugin 后,Skill 会带命名空间:
/my-plugin:review
而不是直接 /review,避免和你自己的 /review 撞名。
优先级链:Enterprise 管理 > 个人 > 项目 > Plugin。搞清楚这个顺序后,就知道同名冲突时到底哪个会生效。
二、Hook 事件体系:让 Claude Code 按你的节奏工作
如果说 Skill 是"主动触发的自动化",那 Hook 就是"被动响应的自动化"。Hook 的核心价值在于:不依赖你记得去做,而是系统自动执行。
2.1 五种 Handler:不只是跑个 shell
大多数人看到 Hook 就想到"跑一段 shell 脚本"。但实际上 Hook handler 有五种类型,每种的能力层级不同:
- shell 命令:执行系统命令,适合文件操作、通知、日志写入。确定性最强。
- command 命令:类似 shell 但更高层一些,适合调用 Claude Code 内部命令
- http 请求:发 HTTP 请求,适合对接外部系统(飞书通知、Webhook、CI 触发)
- prompt 注入:向 Claude 注入一段提示,适合做语义判断("代码风格对不对""测试够不够")
- agent 委派:启动子 agent 执行复杂任务,判断力最强但最重
我的选择原则:能 shell 解决的不用 prompt,能 prompt 解决的不用 agent。
2.2 Notification:任务跑完通知我,不等
长任务是最磨人的——你不知道它跑完没有,只能时不时切回终端看一眼。
Notification 事件解决了这个问题:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code 需要你\" with title \"Claude Code\"'"
}
]
}
]
}
}
配好之后:
- Claude Code 完成任务时 → 系统弹通知
- 需要我授权确认时 → 系统弹通知
- 等待我输入时 → 系统弹通知
踩坑记录: 第一次配好发现没反应,是因为 macOS 没给 Script Editor 通知权限。先跑一遍 osascript -e 'display notification "test"',系统会弹出权限请求,允许之后再重试就好。
2.3 Stop Hook:结束之前的"安全检查"
这是 Hook 事件里最容易被忽视但我觉得性价比最高的一个。
Claude 准备结束当前回合时,Stop 事件触发。你可以在这里加一个检查——相当于每次出门前摸口袋确认钥匙和手机:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "回顾本轮任务。如果缺少测试、验证步骤或未完成的 TODO,请阻止停止并告知原因。"
}
]
}
]
}
}
Stop hook 和直接在对话里说"做完检查一下"的区别非常微妙但重要:
- 对话里说:Claude 可能记得,但上下文长了、对话复杂了,容易漏
- Stop hook:每次都执行,不依赖 Claude 记不记得
我用来做:
- 任务完整性检查——是不是真的做完了
- 验收条件核对——满足需求了吗
- 缺少测试提醒——改代码没加测试?停下
2.4 PreCompact & PostCompact:压缩上下文的"前后脚"
这两个事件极少有人提:
- PreCompact:上下文压缩之前触发
- PostCompact:压缩之后触发
我的用法:
压缩前归档当前状态:
{
"hooks": {
"PreCompact": [
{
"hooks": [
{
"type": "command",
"command": "echo \"$(date): 压缩触发\" >> ~/.claude/session-log.txt"
}
]
}
]
}
}
压缩后重新注入关键上下文:
{
"hooks": {
"PostCompact": [
{
"hooks": [
{
"type": "command",
"command": "cat ~/.claude/critical-context.md"
}
]
}
]
}
}
适合那种"有几条信息无论如何压缩都不能丢"的场景。比如正在调试一个复杂 bug,压缩把关键线索丢了,前功尽弃。
2.5 UserPromptSubmit:在 Claude 处理之前"插一脚"
这个 Hook 在发送消息之后、Claude 开始处理之前触发。
我最常用的场景是自动注入时间和 git 上下文:
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "echo \"{\\\"injectedContext\\\": \\\"Current time: $(date), Git branch: $(git branch --show-current 2>/dev/null || echo 'not a git repo')\\\"}\""
}
]
}
]
}
}
另一个用法:危险指令拦截。在 Claude 处理之前,检查用户消息里有没有"删除全部"、"drop table"之类的关键词,让 Claude 先跟你确认。
2.6 Exit Code 的陷阱:为什么我的 Hook 没生效?
写 Hook 脚本时,有个非常容易掉进去的坑:
大多数人的习惯是 exit 1 表示出错。但在 Claude Code 的 Hook 体系里,这是错的。
exit 0:放行(hook 检查通过)exit 1:记录错误但继续执行——你以为拦截了,其实没有exit 2:真的阻止了——Claude 会停下来
如果你写了个检查脚本,作用是"禁止修改 .env 文件":
echo "禁止修改 .env 文件" >&2
exit 2
用 exit 1 的话,Claude 会收到错误提示,然后……继续执行。第一次踩这个坑的时候调试了半天才发现是 exit code 的问题。
三、记忆系统:不只是"记住",而是"能找到"
3.1 MEMORY.md 的 200 行限制
Auto Memory 功能默认开启,它的入口文件是 MEMORY.md。
一个关键事实: 每次会话启动时,Claude 只加载 MEMORY.md 的前 200 行或前 25KB(取较小的那个)。
其他主题文件不会在启动时全部加载,Claude 在需要时才按需读取。
如果你把 MEMORY.md 写得密密麻麻,超过 200 行的内容一开始就进不了上下文。
正确的姿势是把 MEMORY.md 当索引用:
# 项目记忆索引
## 快速参考
- 这个项目用 pnpm,不要用 npm
- 本地测试需要先启动 Redis
- 调试入口:见 debugging.md
## 详细主题
- 架构说明:architecture.md
- 常见报错处理:debugging.md
- API 约定:api-conventions.md
索引短,细节放主题文件。Claude 需要时自己会去读。这个机制设计得很巧妙——既保证了启动时不浪费上下文空间,又保证了需要时能找到。
四、对话管理技巧
4.1 /compact 的正确用法
很多人用 /compact 就是直接发,让系统自己决定压缩什么。
但其实 /compact 支持附带说明:
/compact 保留支付流程幂等性相关的所有讨论和已修改的文件列表
/compact 重点保留迁移计划和还没解决的测试失败
压缩后,Claude 会优先保留你指定的内容,而不是完全按自己的判断取舍。
我的经验: 长对话但任务没做完,又不想开新会话从头说起的时候,加一句说明比让系统自由发挥可靠得多。特别是在调试复杂问题时,哪些线索不能丢、哪些决策已经做出,只有你知道。
五、彩蛋:/buddy 终端宠物
2026 年 4 月 1 日,Anthropic 在 Claude Code 里埋了一只宠物。不是愚人节玩笑——是真的功能。
输入 /buddy,终端里孵出一只 ASCII 风格的小动物。有物种、稀有度、属性值,还有 AI 驱动的个性,会在你工作时冒泡说话。
使用前提:
- Claude Code ≥ 2.1.89
- Pro 订阅
全部子命令:
/buddy 第一次孵化(带动画),之后唤出
/buddy card 查看属性卡:物种、稀有度、五项属性值
/buddy pet 抚摸(爱心动画,持续 2.5 秒)
/buddy mute 关闭气泡说话
/buddy unmute 恢复说话
/buddy off 本次会话隐藏宠物
物种与稀有度: 一共 18 种(鸭子、鹅、猫、兔子、猫头鹰、企鹅、乌龟、蜗牛、龙、章鱼、六角恐龙鱼、幽灵、机器人、史莱姆、仙人掌、蘑菇、胖球、卡皮巴拉)。稀有度 5 档 + 1% 概率闪光变体。
有意思的细节: 物种、稀有度和属性由账号 ID 通过哈希算法确定性生成——同一个账号永远出同一只宠物,改本地配置没用。
五项属性值:
- WISDOM(智慧)
- CHAOS(混沌)
- SNARK(毒舌)
- PATIENCE(耐心)
- ENERGY(活力)
高 SNARK 的宠物会吐槽你的代码,高 PATIENCE 的会温柔鼓励你。有人说这功能没用——确实,它不影响任何实际功能。但如果每天在终端里待五六个小时,有个小东西陪着,感觉真的不一样。
宠物消耗的 token 不计使用量,所以放心养着就行。
写在最后
这篇文章里写的所有功能,没有一个是 Claude Code 入门教程里会教你的。
它们分布在官方文档的不同角落,有些甚至只在 GitHub issue 的回复里出现过。发现它们需要时间——或者有人帮你整理过一遍。
如果你刚开始用 Claude Code,不需要一次性全记住。我的建议是:每次挑一个功能,试着融入日常工作流。 先配 Skill 传参,再尝试 Hook 通知,慢慢来。
工具的价值不取决于它有多少功能,而取决于你真正用上了多少。