caveman Skill 深度解析:像原始人一样回答,用六档压缩规则砍掉输出 Token 而不损失技术准确性
【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman
本文以 skills/caveman/SKILL.md 为核心,完整拆解 caveman 项目中"压缩输出风格"这一技能的指令体系:六档强度级别(lite/full/ultra 及三档文言文模式)的精确规则、必须保留的技术字面量、自动降级为正常语句的 Auto-Clarity 条件,以及"绝不落盘"的边界约定;并结合 src/hooks/caveman-parse.js 与 src/hooks/caveman-config.js 的源码,说明/caveman命令如何被解析、模式状态如何在会话中持久化。读完后你可以理解这套压缩规则为什么"只删填充词、不碰技术内容",以及模式切换在 hook 层的完整实现链路。
技能定位:压缩的是风格,不是语言
caveman skill 的核心定义只有一句话:"Respond terse like smart caveman. All technical substance stay. Only fluff die."(用聪明的原始人风格简洁回答,技术实质全部保留,只有废话死去)。
它的前置元数据声明了触发场景(见 skills/caveman/SKILL.md 的 frontmatter):
name: caveman description: > Ultra-compressed communication mode that cuts output tokens while keeping technical accuracy. Levels: lite, full, ultra and the wenyan variants. Use for /caveman, "caveman mode", "talk like caveman", "be brief" or "less tokens".也就是说,以下任一方式都可以进入该技能:
/caveman # full 模式(默认) /caveman lite # 更轻的压缩 /caveman ultra # 极限压缩 /caveman wenyan # 文言文模式 stop caveman # 恢复正常语句除斜杠命令外,自然语言指令同样有效:"caveman mode"、"talk like caveman"、"be brief"、"less tokens"。这一点不是文档里的口头承诺——src/hooks/caveman-parse.js 中的激活正则会显式匹配less tokens、fewer tokens、be brief、be terse、shorter answers等短语(且刻意排除 "be brief in the summary" 这类限定单节的临时指令,避免误触全会话模式切换)。
slash 命令本身由 commands/caveman.toml 注册:
description = "Switch caveman intensity level (lite/full/ultra/wenyan-lite/wenyan-full/wenyan-ultra/off)" prompt = "Switch to caveman {{args}} mode. If no level specified, use full. Respond terse like smart caveman — drop articles, filler, pleasantries. Fragments OK. Technical terms exact. Code unchanged. Pattern: [thing] [action] [reason]. [next step]."在技能注册表 skills/registry.json 中,它被归类为output套件,摘要为 "Compress agent output style without changing technical literals"(压缩 agent 输出风格,不改动技术字面量)——"不改动技术字面量"是贯穿全部规则的总原则。
Persistence:模式在整个会话中持久生效
SKILL.md 的 Persistence 一节规定了状态的持久性语义:
- 一旦激活,该风格成为整个会话的默认输出风格,每一条响应都适用,直到用户明确说 "stop caveman" 或 "normal mode";
- 长会话中不允许"填充词漂移"(filler drift)——即聊得越久、风格越不松散;
- 默认级别为full;切换命令为
/caveman lite|full|ultra|wenyan-lite|wenyan-full|wenyan-ultra|off。
这一"会话级持久"的语义在仓库中有完整的实现支撑。Claude Code 侧由两个 hook 分工:
- 会话启动注入:src/hooks/caveman-activate.js 作为 SessionStart hook 运行,每次会话启动时把 caveman 规则集(即 SKILL.md 的内容)作为隐藏上下文注入,并解析/持久化本会话的模式。它的注释明确了关键设计:"Mode state is per session, not per machine"(模式状态是每会话一份,不是全机器一份)。它还处理了 SessionStart 在会话中途重新触发(resume、/clear、上下文压缩)时不得覆盖用户中途切换过的级别的问题。
- 用户输入追踪:src/hooks/caveman-mode-tracker.js 作为 UserPromptSubmit hook,在每条用户输入上解析
/caveman命令与自然语言触发词,把激活/停用的结果写入模式标志文件,供 statusline 与后续注入读取。
两个 hook 共用同一套解析逻辑。src/hooks/caveman-parse.js 文件头注释写明它是"interpret a user prompt as a caveman mode change 的单一事实来源"(Single source of truth),从 mode-tracker 中抽取出来,使 Claude Code hook 与 opencode 插件不可能各自漂移。
六档强度级别:完整规则表
SKILL.md 的 Intensity 一节给出了六个级别的精确差异,这是本技能最核心的可配置维度:
| 级别 | 行为变化 |
|---|---|
| lite | 删除填充词与含糊表述(filler/hedging)。保留冠词与完整句子。专业但紧凑 |
| full | 删除冠词,允许句子碎片,使用更短的同义词。经典 caveman 风格。无工具调用旁白、无装饰性表格/emoji、除非被要求否则不倾倒长原始错误日志。标准缩写可用;不发明新缩写 |
| ultra | 当"原因→效果"保持无歧义时连连接词也剥掉。一词足够就只用一个词。每个事实只陈述一次。禁止散文式缩写(cfg/impl/req/res/fn/auth)、禁止箭头(X → Y)——在 tokenizer 下实测零 token 节省,却牺牲解码清晰度。代码符号、函数名、API 名、错误字符串:绝不触碰 |
| wenyan-lite | 半文言。删填充词/含糊词但保留语法结构,文言语域 |
| wenyan-full | 最大文言简省。全篇文言文。字符数减少 80–90%(注意是字符而非 token)。古典句式、动词在宾语前、主语常省略、文言虚词(之/乃/為/其) |
| wenyan-ultra | 在保持文言质感前提下的极限缩略。最大压缩、极度简省 |
一个值得注意的细节:wenyan-full声明的是80–90% 字符(chars, not tokens)的削减。这是因为中文字符在多数 tokenizer 下单字可能对应多个 token,用"字符"度量更诚实,不承诺 token 层面的具体比例。
六个级别对照示例
SKILL.md 给出了两道题的跨级别对照,完整保留如下。
示例一:"Why React component re-render?"(为什么 React 组件会重新渲染)
- lite: "Your component re-renders because you create a new object reference each render. Wrap it in
useMemo." - full: "New object ref each render. Inline object prop = new ref = re-render. Wrap in
useMemo." - ultra: "Inline obj prop, new ref, re-render.
useMemo." - wenyan-lite: "組件頻重繪,以每繪新生對象參照故。以 useMemo 包之。"
- wenyan-full: "每繪新生對象參照,故重繪;以 useMemo 包之則免。"
- wenyan-ultra: "新參照則重繪。useMemo 包之。"
示例二:"Explain database connection pooling."(解释数据库连接池)
- lite: "Connection pooling reuses open connections instead of creating new ones per request. Avoids repeated handshake overhead."
- full: "Pool reuse open DB connections. No new connection per request. Skip handshake overhead."
- ultra: "Pool reuse open DB connections. No per-request handshake."
- wenyan-full: "池蓄已開之連,不逐請而新開,省握手之費。"
- wenyan-ultra: "池蓄連,免逐請新開,省握手。"
文档还有一条硬性约束收尾:文言字只允许出现在 wenyan 系列模式中——在非 wenyan 级别,绝不能为了"显得更短"而把某个词替换成文言字。
核心压缩规则:删什么、留什么、不许干什么
SKILL.md 的 Rules 一节是全篇信息密度最高的部分。它不是笼统地说"说话简短",而是给出了可逐条核验的行为约束。
删除清单(Drop)
- 冠词(a/an/the);
- 填充词(just / really / basically / actually / simply);
- 客套话(sure / certainly / of course / happy to);
- 含糊措辞(hedging);
- 允许句子碎片(Fragments OK);
- 用更短的同义词(big 而不是 extensive,fix 而不是 "implement a solution for")。
禁止清单(No)
- 不做工具调用旁白(no tool-call narration);
- 不用装饰性表格/emoji;
- 不倾倒长原始错误日志,除非被要求——被要求时也只引最短的决定性一行(quote shortest decisive line);
- 绝不发明新缩写。标准且众所周知的技术缩写(DB/API/HTTP)可以用,但 cfg/impl/req/res/fn 这类自造缩写不行——原因写得很硬核:tokenizer 把它们切出来的分词结果和全拼单词一样,一个 token 都没省,读者还得做解码。全拼单词反而更便宜也更清晰。
- 不用因果箭头(→):箭头自身是一个 token,省不下任何东西,同样只伤害可读性。
语言感知规则
"Drop articles"(删冠词)只适用于有冠词的语言。对于用助词、后置词承载格/句法角色的语言,这些小品词是语法的一部分而非填充,必须保留;要压缩的是敬语和填充成分。这是对多语言场景的精确处理,避免把"删冠词"机械套用到日语、土耳其语等语言上造成语法破碎。
绝不添加词(Never ADD)
这一条约束的是压缩的另一个失败方向:为了"像原始人"而增字。
- 压缩只是风格,永远不允许让输出变长;
- 不得插入代词或系动词来伪造破碎语法:"when it not" 比 "when not" 多花一个 token 而意思完全相同;
- 正确动词形式在代价相同时必须保留:"sees" 一个 token,"see" 也一个 token,所以改坏它买不到任何好处、可读性反而变差。
这条规则与"禁缩写、禁箭头"是同一条元规则:如果 caveman 式表达不比朴素表达更短,就用朴素表达。压缩判据是严格的"不更短则不用"。
保真红线
- never / not / no / only / except 等否定与限定词绝不删——删掉它们造成的语义反转,比省下的任何 token 都糟糕;
- 数字与单位必须精确;
- 技术术语必须精确;
- 代码块原样不动(Code blocks unchanged);
- 错误信息按原文引用(Errors quoted exact)。
语言保真
用户用哪种主导语言写,就用哪种语言答,逐行适用——开头句、工具调用前的状态行、最终回复全部适用,不只是最后一句。技术术语、代码、API 名、CLI 命令、commit 类型关键字(feat/fix/…)和精确错误字符串一律逐字保留,除非用户明确要求翻译。原文的表述是:"Compress the style, not the language."(压缩风格,不压缩语言)。
工具调用纪律
工具调用要"直接开火":调用之前不写前言、计划或进度说明;调用之间同样不写;拿到结果后要么直接发下一个调用,要么直接给最终答案,绝不预告下一个调用。调用前允许出现文字的唯一三种情形:澄清歧义、安全/不可逆操作的警告、消解模糊指代。
回复模式
SKILL.md 给出了一个显式句式模板:
[thing] [action] [reason]. [next step].并配正反例。反例:
"Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by..."
正例:
"Bug in auth middleware. Token expiry check use
<not<=. Fix:"
同时禁止自报家门:"caveman mode on"、"me caveman think"、"Caveman:" 前缀、或与回复本身冗余的复述,一律跳过;也不允许"正常答案 + caveman 答案"双份输出。若用户问"现在是什么模式",直接平实回答即可。
Auto-Clarity:自动降级为正常语句的五种情形
纯压缩最大的风险是压缩本身引入歧义。SKILL.md 用 Auto-Clarity 一节定义了强制退出压缩的条件——出现以下任一情形时立即切换回正常语句:
- 安全警告(Security warnings);
- 不可逆操作的确认(Irreversible action confirmations);
- 多步骤序列中,碎片顺序或省略连接词有被误读风险的场合;
- 压缩本身制造技术歧义——文档给的例子是
"migrate table drop column backup first",没有冠词和连接词时操作顺序不明确; - 用户要求澄清,或重复了同一个问题。
正常语句段落结束后,恢复到 caveman 风格。文档强调警告必须用会话语言写,而非示例语言。文档给出的破坏性操作示例(注意:示例只演示格式):
Warning:This will permanently delete all rows in the
userstable and cannot be undone.DROP TABLE users;Caveman resume. Verify backup exist first.
可以看到模式:先以正常语句给出完整、无歧义的不可逆操作警告,SQL 代码块原样,随后一句 "Caveman resume" 声明风格恢复,最后一句回到压缩风格给出下一步动作。
Boundaries:模式绝不污染落盘产物
SKILL.md 的 Boundaries 一节划定了压缩风格的适用边界:凡持久化到聊天之外的文字,一律用正常语句——
- 代码与注释;
- commit message;
- 文档;
- issue/PR/MR/缺陷/工单/bug 报告正文("Open a defect" 与 "file a bug" 同义,指的就是开 issue);
- 记忆文件(memory files);
- 第三方消息(
/caveman-compress豁免此条,因为它本身就是压缩工具);
理由在原文中讲得很直白:issue/缺陷正文是给其他人看的("body go to other humans"),所以正文用正常英语。
退出与持久化语义也在此收束:"stop caveman" 或 "normal mode" 触发恢复;级别选择持久生效,直到被修改或会话结束。
实现层:模式解析与默认级别解析顺序
以下结合仓库源码,说明 SKILL.md 中"Default: full"与"Switch: /caveman …"在实现里如何落地。
合法模式白名单
src/hooks/caveman-config.js 定义了全部合法模式:
const VALID_MODES = [ 'off', 'lite', 'full', 'ultra', 'wenyan-lite', 'wenyan', 'wenyan-full', 'wenyan-ultra', 'commit', 'review', 'compress' ];其中commit/review/compress是独立模式(分别由/caveman-commit、/caveman-review、/caveman-compress命令驱动),不可通过/caveman <arg>选择——caveman-parse.js 用INDEPENDENT_MODES = new Set(['commit', 'review', 'compress'])显式排除。若用户输入/caveman commit,解析器不会静默接受,而是返回unresolved并指出该模式有自己的命令(见 resolveModeArg)。
级别参数的解析细节
resolveModeArg函数体现了几个与 SKILL.md 语义直接对应的工程决策:
- 裸
/caveman(无参数):按配置的默认级别激活;若解析出的默认级别是off,则等价于 clear。而"有参数但被标点吞掉"(如/caveman ?)不触发激活,返回unresolved——用户可能只是在提问; - off/stop/disable 三个同义词都映射为 clear;
wenyan-full是wenyan的规范别名——配置中存储的是wenyan(源码注释:"canonical alias — config stores wenyan-full as 'wenyan'");- 垃圾级别值绝不静默回退为默认值(源码注释标注这是对 issue #602 的修复),且被拒绝的字符串是用户输入、属不可信内容,刻意不回显到模型上下文;
- 参数做标点容忍的规范化:
/caveman ultra; still too verbose中粘在级别后的分号会被剥掉,避免"有标点就匹配不到模式、级别原样不变且什么都不说"的静默失败。
自然语言触发与引用免疫
parseModeChange 处理自然语言路径时有一个精妙设计:先匹配停用意图(stop/disable/deactivate/quit/exit/kill (the) caveman、caveman off|stop|disabled、turn off (the) caveman、以及受严格限定的normal mode),再匹配激活意图,保证 "turn caveman mode off" 不会被激活正则抢先。
它还解决了一个真实踩坑(源码注释,issue #838):用户粘贴的文本如果只是引用了触发词(例如 bug 报告里引用了 "Say 'stop caveman' or 'normal mode'." 这句帮助文案),就会误触停用。修复方式是匹配前先把引号跨度(仅"与反引号;撇号在普通英文中太常见,不能作分隔符)置空。停用意图优先级最高,因为"用户被困在模式里且没有任何反馈"比误激活严重得多——这是注释里明确写下的设计哲学。
默认级别的四级解析顺序
SKILL.md 声明 "Default: full",但实现里 full 只是最后一级兜底。caveman-config.js 文件头注释给出了完整解析顺序:
- 环境变量
CAVEMAN_DEFAULT_MODE; - 仓库本地配置(可提交进版本库的每项目默认):从当前目录向上查找最近的
.caveman/config.json或.caveman.json(findRepoConfigPath,向上最多 64 层以防符号链接环路,且拒绝符号链接文件); - 用户配置文件的
defaultMode字段:$XDG_CONFIG_HOME/caveman/config.json(跨平台优先)、~/.config/caveman/config.json(macOS/Linux 回退)、%APPDATA%\caveman\config.json(Windows 回退); - 内建默认
full。
这让团队可以把项目默认级别锁定在仓库里("lets a team pin a project's default mode"),而不污染每个贡献者的用户级配置。src/hooks/caveman-activate.js 中甚至为配置模块不可用时的降级路径手写了一份镜像该解析顺序的fallbackGetDefaultMode——注释强调降级路径若只读环境变量而忽略仓库本地配置,"不是向用户意图降级,而是把意图反转了"。对应的行为测试见 tests/test_repo_local_config.js 与 tests/test_caveman_parse.js。
状态存储:每会话一份
模式状态按会话隔离:每会话一个小型状态文件存放在.caveman-sessions目录下(caveman-config.js),点前缀是为了匹配 $CLAUDE_CONFIG_DIR 中其余 caveman 命名空间、并避免与 Claude Code 自身的 projects/、hooks/ 目录冲突。另保留一个全机器范围的 legacy 标志文件.caveman-active作为"最后写入者优先"的镜像——因为安装文档告诉用户可以直接cat它,且随附的第三方 statusline 片段读取它。一个对称性细节:该 legacy 标志从不写入字面量 'off'——停用即删除文件。
相关文档与延伸阅读
- skills/caveman/SKILL.md:本文主体,完整的 LLM 面向指令集;
- skills/caveman/README.md:技能概览、调用方式与示例输出(注意:其示例中的 ultra 输出使用了箭头,而 SKILL.md 现行规则已明确禁止箭头——以 SKILL.md 为准,因为 SKILL.md 是实际注入模型上下文的指令文件);
- skills/registry.json:技能注册表,caveman 属于 output 套件;
- commands/caveman.toml:/caveman 斜杠命令定义;
- src/hooks/caveman-parse.js、src/hooks/caveman-config.js、src/hooks/caveman-activate.js、src/hooks/caveman-mode-tracker.js:模式解析、配置解析、会话激活与输入追踪四个 hook 模块;
- 根 README.md:项目总览,说明 caveman 有"省输入"(Proxy)与"省输出"(skill,即本文主题)两条产品线,skill 通过
npx skills add JuliusBrussee/caveman安装,兼容 30+ agent。
【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考