写在前面

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\`

执行顺序很有意思:

  1. 触发 Skill
  2. Claude Code 先执行 ! 里的 shell 命令
  3. 命令输出替换掉占位内容
  4. 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 通知,慢慢来。

工具的价值不取决于它有多少功能,而取决于你真正用上了多少。