第 05 期 | /caveman 核心 Skill — 日常开发的压缩利器

⏱ 预计阅读 14 分钟 更新于 2026/5/7
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)

🎯 学习目标

学完本期你将掌握:

  1. Caveman 主 Skill 的文件结构和加载机制
  2. 在不同平台上触发 Caveman 的 5 种方式
  3. Caveman 回答模式的核心语法:[thing] [action] [reason]. [next step].
  4. 三个日常开发场景的实战演练

📖 核心内容

5.1 Skill 文件结构

Caveman 的核心 Skill 位于仓库的 skills/caveman/ 目录。作为 Claude Code 的 Skill,它本质上是一个 Markdown 文件 (SKILL.md),其中包含了完整的行为指令。

caveman/
├── skills/
│   ├── caveman/           ← 主技能
│   │   └── SKILL.md       ← 核心规则定义
│   ├── caveman-commit/    ← Git 提交技能
│   │   └── SKILL.md
│   ├── caveman-review/    ← 代码审查技能
│   │   └── SKILL.md
│   ├── caveman-help/      ← 帮助信息技能
│   │   └── SKILL.md
│   └── compress/          ← 压缩技能
│       └── SKILL.md
├── hooks/                 ← Hook 脚本
├── commands/              ← 命令定义
└── plugins/caveman/       ← Plugin 打包

当你输入 /caveman 时,Agent 会加载 SKILL.md 中的规则并立即应用到当前会话。

5.2 Caveman 规则的核心指令

SKILL.md 中定义了以下核心行为规则(简化版):

## Caveman Communication Rules

1. **Terse like caveman** — Technical substance exact. Only fluff die.
2. **Drop** — articles, filler (just/really/basically), pleasantries, hedging
3. **Fragments OK** — Complete sentences not required
4. **Short synonyms** — Use shortest word that conveys same meaning
5. **Code unchanged** — Never compress code blocks, commands, or file paths
6. **Pattern** — [thing] [action] [reason]. [next step].
7. **Persistence** — ACTIVE EVERY RESPONSE. No revert after many turns.
8. **Exit** — "stop caveman" or "normal mode" to deactivate

💡 重要:规则 5 是 Caveman 不破坏技术准确性的关键——所有代码、命令、路径保持原样,只有自然语言描述被压缩。

5.3 五种触发方式

graph TD
    A["如何触发 Caveman?"]
    
    A --> B["斜杠命令
/caveman"] A --> C["自然语言
'talk like caveman'"] A --> D["关键词
'caveman mode'"] A --> E["请求简短
'less tokens please'"] A --> F["自动激活
SessionStart Hook"] B -->|"Claude Code / Gemini CLI"| G["✅ 立即生效"] C -->|"所有平台"| G D -->|"所有平台"| G E -->|"所有平台"| G F -->|"Claude Code 专属"| G
触发方式 命令 / 语句 Claude Code Antigravity Gemini CLI Codex OpenCode
斜杠命令 /caveman $caveman
自然语言 "talk like caveman"
关键词 "caveman mode"
简短请求 "less tokens" / "be brief"
自动启动 Hook 注入 ⚠️ 需 GEMINI.md ⚠️ 需 hooks.json ⚠️ 需 AGENTS.md

💡 Codex 特殊语法:Codex 使用 $caveman 而非 /caveman/ 斜杠在 Codex 中保留给内置命令。

💡 OpenCode 配置:在 .config/opencode/AGENTS.md 中添加 Caveman always-on 片段即可。

5.4 回答模式解析

Caveman 的回答遵循一个固定模式:

[thing] [action] [reason]. [next step].

拆解示例:

原始问题: "为什么 Docker 容器启动后立刻退出了?"

Caveman 回答:
"Container exit immediately.     ← [thing] [action]
 No foreground process.          ← [reason]
 Add CMD or ENTRYPOINT            ← [next step]
 that stays alive (e.g. tail -f /dev/null for debug)."

更多模式示例:

# Bug 诊断模式
[组件/模块] [出了什么错]. [根因]. [修复方案].

# 概念解释模式
[概念] = [一句定义]. [核心机制]. [示例].

# 代码建议模式
[问题]. [方案]. [代码].

💻 三大实战场景

场景 1:Node.js 内存泄漏调试

你的提问:

我的 Node.js Express 服务器在运行 48 小时后内存从 100MB 涨到了 2GB,怎么排查?

🗣️ 正常 Claude 回答 (~180 tokens):

This sounds like a classic memory leak issue in a Node.js application. 
Here are several approaches you can use to diagnose the problem:

1. First, I'd recommend using the built-in Node.js inspector with the 
   --inspect flag...
2. You could also try using the heapdump module to take heap snapshots...
3. Another useful tool is clinic.js which provides...
4. Make sure to check for common patterns that cause leaks...
   ...(继续展开每个步骤的详细说明)

🪨 Caveman 回答 (~45 tokens):

Classic leak pattern. Debug steps:

1. `node --inspect server.js` → Chrome DevTools → Memory tab
2. Heap snapshot at start, snapshot at +2h, compare
3. Look for: growing arrays, unclosed event listeners, global caches

Common Express culprits:
- `app.use()` middleware storing req refs
- Session store without TTL
- Socket.io connections not cleaned on disconnect

Quick win: `process.memoryUsage()` logged every 5min → find growth rate.

注意:代码命令和技术术语 完全保留,只有叙述性的废话被移除。

场景 2:TypeScript 泛型解释

你的提问:

解释 TypeScript 中的条件类型 (Conditional Types)

🪨 Caveman 回答:

条件类型 = 类型层面的三元表达式。

语法: `T extends U ? X : Y`

实用例:
```typescript
type IsString<T> = T extends string ? "yes" : "no";

type A = IsString<"hello">;  // "yes"
type B = IsString<42>;       // "no"

分布式行为: union 自动展开。

type ToArray<T> = T extends any ? T[] : never;
type R = ToArray<string | number>;  // string[] | number[]

内置条件类型: Exclude<T,U>, Extract<T,U>, NonNullable<T>, ReturnType<T>.


### 场景 3:代码重构建议

**你的提问:**

这个函数太长了,帮我重构: function processOrder(order) { // 验证订单... (20行) // 计算价格... (30行)
// 发送通知... (15行) // 更新数据库... (25行) }


**🪨 Caveman 回答:**

拆成 4 个单职责函数:

async function processOrder(order: Order): Promise<Result> {
  const validated = validateOrder(order);       // 验证
  const priced = calculatePrice(validated);     // 定价
  await persistOrder(priced);                   // 入库
  await notifyStakeholders(priced);             // 通知
  return { success: true, orderId: priced.id };
}

原则: 每个函数 ≤ 20 行, 单一职责, 可独立测试。 错误处理: 各函数自行 throw, processOrder 顶层 try/catch。


---

## 📊 五大平台 Skill 加载对比

| 特性 | Claude Code | Antigravity | Gemini CLI | Codex | OpenCode |
|------|------------|-------------|------------|-------|----------|
| **Skill 文件位置** | `.claude-plugin/` | `.agent/skills/` | Extension 目录 | `.codex/` | `.config/opencode/` |
| **加载方式** | Plugin + Hook | GEMINI.md 引用 | Extension 自动 | Plugin 市场 | AGENTS.md 规则 |
| **斜杠命令** | `/caveman` | ❌ | `/caveman` | `$caveman` | ❌ |
| **模式切换** | `/caveman ultra` | 自然语言 | `/caveman ultra` | `$caveman ultra` | 自然语言 |
| **Always-on** | ✅ Hook 自动 | ⚠️ 需配置 | ✅ 自动 | ⚠️ 需 hooks.json | ⚠️ 需 AGENTS.md |
| **Skill 热加载** | ✅ | ✅ | ✅ | ✅ | ✅ |

---

## 📝 本期要点回顾

1. Caveman 主 Skill 本质是一个 **SKILL.md** 文件,定义了 8 条核心行为规则
2. **代码块、命令、路径永远不会被压缩**——这是保证技术准确性的硬性规则
3. 回答模式遵循 `[thing] [action] [reason]. [next step].` 的固定结构
4. 5 种触发方式中,**自然语言**是所有平台通用的方式
5. Codex 使用 `$caveman` 语法,OpenCode 需在 AGENTS.md 中配置

---

## 🔗 参考资料

- [Caveman Skills 目录](https://github.com/JuliusBrussee/caveman/tree/main/skills)
- [Claude Code Skills 文档](https://docs.anthropic.com/en/docs/claude-code/skills)
- [Codex Hooks 配置](https://github.com/JuliusBrussee/caveman/tree/main/.codex)