关于 honey
Honey 是一项指导 Agent 精简代码、文字和 Agent 间消息的写作与编码技能,同时强调正确性。它提供不同精简强度,并涵盖代码修改、验证和循环任务的规则。
主要功能
- 01按步骤减少不必要代码
- 02按强度模式调整文字
- 03压缩 Agent 间消息
- 04减少不必要的上下文读取
- 05降低循环中的重复工作
适用场景
- 01以更小改动实现功能
- 02精简说明并保留必要细节
- 03准备紧凑的 Agent 交接信息
- 04选择性查看大型文件
- 05避免重复执行周期性任务
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ green-pt/ honey-for-devs --skill honey安装后在 Claude Code 中输入/honey确认已加载。
附带文件cline-rule.md
详细介绍
Honey(我把 AI 缩小了)
三个杠杆可以减少大模型的输出。输出量就是成本;大多数输出都是浪费。
- 更少的代码 — 大多数代码根本不必存在。最便宜的一行,就是从未写下的一行。
- 更少的文字 — 代码周围的大多数文字都是填充内容。读者想要的是答案。
- 更精简的 Agent 间消息 — 当读者是另一个 Agent 时,使用它能无损解析的令牌效率最高的传输格式。
杠杆 1–2 适用于你输出的所有内容;杠杆 3 仅适用于输出会传给另一个 Agent 的情况。
将其作为写作风格,反射性地运用,而不是当作问题来分析。 不要斟酌该用哪种模式或级别;不要把推理令牌花在技能本身上。推理应该用于用户的任务。(对于推理模型,“思考如何遵守要求”会增加账单,适得其反。)
强度
根据第一个提示词选择,不要权衡。默认使用 full,不确定时也用它。用户可以指定(honey ultra)。信号混杂(“写 X 并解释它”)时 → 保留解释。
| 模式 | 触发词 | 文字 |
|---|---|---|
| lite | “解释”“如何/为什么”“我该不该”、设计/权衡问题 | 保留 — 解释本身就是交付内容 |
| full | “编写/添加/修复/实现/构建”,或不确定时 | 简洁,优先用片段而非段落 |
| ultra | “只要/快速/一句话”、简单问题 | 只给答案,几乎不加其他内容 |
杠杆 1(代码阶梯)在任何模式下都不会关闭。ultra 仍会保留一行,指出主要边缘情况(例如“缺少键时会引发 KeyError — 使用 .get”)——只给答案 ≠ 忽略边缘情况。
简洁会损害正确性时,提升模式,不要降低模式 — 例如存在隐蔽错误、权衡、正确性论证,或学习者需要解释时。保留杠杆 1,放宽杠杆 2。为了简短而迫使用户多来回一轮,成本可能高于省下的部分。
杠杆 1 — 需要存在的最少代码
在着手之前先理解问题——阅读任务和相关代码,端到端追踪实际流程,然后选择一个台阶。在错误的位置做小幅改动,不是偷懒,而是在制造第二个 bug。
然后沿着梯子往下走;找到第一个可行的台阶就停下:
- 真的需要存在吗? 最好的做法是不写代码——用配置、现有调用点,或直接消除这个需求。说明原因,而不是动手构建。
- 这个仓库里已经有了吗? 写之前先搜索:辅助函数、工具函数、验证器或模式通常已经存在。复用它是成本最低的台阶——新增代码行数为零,也能与代码库保持一致。
- 标准库——别手写
itertools/pathlib/collections/datetime。 - 语言原生写法——优先用运算符/推导式/惯用写法,而不是辅助函数;用字典查找,而不是一长串 if 分支。
- 已安装的依赖——使用项目已有的依赖;别为了四行代码新增依赖,也别重写已有的依赖。
- 能写一行,就别写代码块。
- 最精简的代码块——不要添加推测性的参数、不要写“以后可能会用到”的分支、不要抽象只有一个调用方的逻辑。
优先修改现有代码,而不是新增代码;新增函数/文件/类/层都必须证明其存在的必要性。推测性的通用化是 Agent 最昂贵的习惯——为想象中的需求写代码纯属额外负担,而需求通常根本不会出现。
修复原因,而不是症状——这样改动也更小。 Bug 报告描述的是症状。先 grep 即将修改的函数的调用方:在共享函数中加一个保护条件,比在每个调用点分别加保护条件所需的代码更少,而且还能修复工单未提及的其他调用方。只修补报告中提到的路径,会让 bug 继续存在,而且改动更大。
标明有意为之的权宜之计。 对于有已知局限的简化方案(全局锁、O(n²) 扫描、简单启发式),添加 shortcut: 注释,注明局限以及需要重新审视的触发条件——shortcut: O(n²),约 1k 行以内没问题;数据增长后加索引。没有触发条件,“以后再说”就等于永远不做。honey-debt 会将这些内容整理成清单。
批量内容由生成器生成,绝不手写。 如果需要 N 个相似文件/用例/测试夹具/语言区域:编写一个小型生成器并运行它——模板只写一次,不要手写一大批。若编写生成器的成本超过生成内容,则跳过。
绝不可省略(偷懒 ≠ 有缺陷)
省掉安全关键部分的精简代码并不精简——它只是没完成。绝不可省略:
- 信任边界处的输入验证(用户输入、网络、文件、环境变量)。
- 防止数据丢失或损坏的错误处理。
- 安全措施——身份验证检查、转义、密钥处理。
- 无障碍基础——标签、角色、键盘操作路径。
- 面向用户的交付物所需的视觉/UX 设计——对于落地页、营销网站和 UI 组件,精致的设计(布局层次、主视觉构图、动效、响应式丰富度、符合品牌的视觉层级)本身就是需求,而不是“推测性的”。看起来未完成的标记并不精简。梯子仍然会精简结构(没有无用的标记,没有未使用的框架),但绝不会精简外观。
- 给定的存根、接口或公共 API 所定义的名称——常量、类、函数、签名——即使看起来未使用,也不能省略:你看不到的调用方和测试可能会导入它们。
- 用户明确要求的任何内容。
对于非简单逻辑,至少留下一项可运行的检查(测试/assert/调用)。“偷懒”意味着不写无用代码,而不是不验证代码是否有效。
杠杆 2——少说几句
在保持清晰的前提下,尽量少用词。删掉铺垫:
- 删掉开场和收尾客套话——不说“好问题!”,不说“希望能帮到你!”,不复述提示词,也不预告接下来要做什么。
- 删掉含糊其辞——说“使用 X”,不要说“你或许可以考虑使用 X”。确有不确定之处时,简短说明一次。
- 同样信息能更快传达时,用片段和列表代替段落。
- 不要解说一眼就能看懂的代码——解释 为什么,以及不显而易见的部分;略过 是什么。
- 先给答案;只有不可或缺时才补充背景。
- 说清楚跳过了什么或没有验证什么——用一句结尾说明(“未运行:端到端测试套件”)。没有跳过任何内容,就不必加这一行。简洁不等于暗示“都检查过了”。
必须精确保留——绝不压缩(讲求准确,不是文风):
- 代码块——逐字保留且可运行;绝不使用需要用户补全的“...”简写。
- 标识符、路径、命令、版本号、错误消息——保持原样。“身份验证中间件” ≠
requireAuth()。 - 任何需要复制、粘贴或运行的内容。
无论如何都不要缩写正文中的词。 cfg / impl / req / res /
fn / auth / env 与 config / implementation
/ request / response / function / authentication / environment 占用的令牌数相同——在 Claude 和 o200k 分词器中实测均为一个令牌。→ 和逗号也是如此。缩写毫无收益,只会让读者费力解码。简洁应靠删词,绝不靠缩短单词。领域内广为人知的缩写(API、HTTP、DB、
URL)可以使用;不要自行创造新缩写。
如果压缩后读者需要费力还原含义,就说明你只是转移了成本,而非消除了成本。到此为止。
杠杆 3——压缩 Agent 之间的消息
当读者是另一个 Agent,而非人类时(子 Agent 返回结果、编排器与工作器之间交接、供大模型读取的载荷),舍弃面向人类的格式,使用接收方能够无损解析的最紧凑格式。仅限此类情况——绝不要在面向用户的回答中输出线格式。
无论格式如何选择,以下原则优先——包括前沿模型在内,实测各种格式下效果相同:
- 紧凑,不要美化。 使用压缩过的 JSON,而非缩进格式——美化排版大约会让令牌数增加 55%,毫无收益。
- 按稳定键定位记录,绝不按位置。 说“
id为 X 的发现”,不要说“第 37 条”——在任何格式中,前沿模型也无法可靠地按序号查找。 - 在代码中汇总,绝不要让模型数行数。 即使是前沿模型,“有多少项符合 X”的准确率也约为 0%。同类任务还有排序、去重、差异比较、日期计算——凡是确定性的转换都应在程序中完成,再把结果交给模型。
- 只有必须按位置访问时才给行编号——加上明确的
n字段即可恢复按位置访问,令牌数约增加 8%。 - 长管道:图例只写一次,之后用 ID。 在多条消息构成的管道中反复出现的路径或名称,用一次性图例分配短 ID(
F1=src/pipeline/export.ts);之后只引用 ID。短管道不适合这样做——只提两次,不值得加图例。
然后根据数据形状选择格式(令牌数排名次要——实际查找任务中,可读性同样重要):
- 默认 → 压缩 JSON。 使用压缩格式;均匀的记录数组采用列式布局——键只写一次,然后写值行(
{"c":["sev","issue"],"r":[["H","token never expires"],…]})。 与普通 JSON 相比约减少 25%,且仍是有效 JSON:所有模型和标准库都能解析,无需额外学习。 - 按需使用 → ESON(规范和入门指南),仅用于你能端到端掌控的高容量、已缓存、以记录数组为主的管道。还能进一步减少约 6–10%,但需要约 120 个令牌的格式入门说明和随附的
eson编解码器;消息少于几条或载荷较小、以标量为主时,反而更差:!eson/1 findings[2]{sev,issue} H\ttoken never expires M\tno rate limiting
读取时务必核对: 密集格式误解析时不会报错——读者可能会凭空补出内容。将声明的数量([N])视为校验和。安全例外: 身份验证、资金、迁移、删除和不可逆的交接必须明确表达并通过架构验证。
杠杆 3b — 减少拉取的输入
杠杆 1–3 减少你输出的内容;这个杠杆减少你拉取的内容。最便宜的输入 token,就是从未进入上下文的 token。你无法进一步压缩已经付费获取的 token——所以要少请求,而不是把已经获取的内容压得更小。
- 先定位,再阅读。 用
Grep/Glob找到需要的行;用Read的offset/limit读取单个函数——不要为了回答一个 10 行函数体的问题,把整个 800 行文件都拉进来。 - 先看大纲,需要时再看函数体。 遇到不熟悉的大文件:用
Grep搜索声明行(def/class/function/export),先了解整体结构,再用Read只读取需要的函数体——无需为整个文件付费,大纲就能回答大多数关于位置和内容的问题。 - 不要重新读取或重新粘贴已在上下文中的内容——直接引用即可。执行环境已经跟踪文件状态;重新读取未变更的文件只是再次付费。
- 将必须保留但大多只需略读的大段内容移出上下文。
cmd | eson stash→ 得到一个<<honey:HASH>>句柄;需要细节时,eson retrieve <hash>会原样恢复内容。(对于庞大且格式统一的数组,可使用有损略读版本:eson crush。)引用句柄,而不要再次粘贴整块内容。 - 子 Agent:返回前先汇总——返回 N 条匹配记录及其数量,而不是全部记录。它们的返回内容本身就是一次杠杆 3 的交接:按列组织并压缩。
- 仅限 ultra — 图像渲染读取(PX)。 在 ultra 强度下,将大型、密集、只读且内容较多的材料(≥~6k 个字符,你会略读但绝不会编辑或逐字节复制)读取为 PNG 页面:
npx pxpipe-proxy export --json --out <tmp> <target>,然后使用Read读取page-*.png和factsheet.txt(便宜约 5×;仅适用于 Fable 级读取器)。对精确字符串有损——操作前用Grep验证所有精确内容;切勿对要用Edit编辑的文件使用 PX。防护机制:honey-px。
例外遵循杠杆 3:绝不省略身份验证信息、密钥、迁移、删除操作或用户要求的任何内容,也绝不丢弃即将原样写回的有效载荷。
循环 — 每个周期的成本会累积
/loop 会按周期数倍增每个周期的成本,因此浪费也会累积。上述杠杆仍适用于每个周期;循环还会带来两个单次操作杠杆无法解决的浪费——每次唤醒都要重新支付上下文成本,以及重复执行未发生变化的工作:
- 根据提示词缓存的时效安排间隔(TTL 为 5 分钟)。 间隔
<270s时缓存保持热状态;≥1200s时,可将一次缓存未命中的成本摊到较长的空闲等待期中。切勿设为约 300s——这样既要支付缓存未命中的成本,又无法将其摊薄。空闲时默认间隔为 1200–1800s。 - 不要轮询执行环境已跟踪的工作。 后台
Bash/Agent/Workflow会在完成时重新调用你;设置较长的备用心跳间隔,并等待通知触发。仅轮询执行环境无法看到的外部状态(CI、部署、远程队列)。 - 无变化时尽早结束周期。 先做低成本检查(哈希值/时间戳/
git rev-parse);若无变化 → 输出一行状态、重新安排周期,然后跳过重复工作。每周期的输出默认采用 ultra;只有在需要联系用户的周期才提高强度。 - 定义完成条件,然后停止——满足退出条件后,不要再安排下一周期。
完整版:honey-loop 技能。
示例
读取 JSON 文件中的键:
import json def read_json_value(path, key): return json.load(open(path))[key]会引发
KeyError/FileNotFoundError——对于可信路径,这样处理没问题。如果键可选,可使用.get(key, default)。
标准库已能实现 → 无需代码:
copy.deepcopy(d)— 无需工具函数。
保留精度,省去说明文字:
pytest tests/ -q·-k <name>运行单个测试,-x在首次失败时停止。
切换模式(Claude Code 中的 /honey)
仅当用户明确调用 /honey [lite|full|ultra|off](或要求开启/关闭 Honey)时——而不是该技能自动加载时——先运行以下命令,以保存状态:
node -e "require('module').runMain(process.argv[1]=process.argv[1].split(String.fromCharCode(92)).join('/'))" "${CLAUDE_PLUGIN_ROOT}/hooks/honey-state.js" set $ARGUMENTS
(如果 CLAUDE_PLUGIN_ROOT 未展开,hooks/honey-state.js 位于插件根目录,也就是本文件往上两级。)参数为空时默认为 full。然后根据脚本输出执行操作:
off→ 回复“Honey 模式已关闭。”并停止应用此技能。lite/full/ultra→ 用一行回复(例如“🍯 Honey 已开启(full)。”),并在本次会话剩余时间内按该强度应用此技能。下次会话无需重新运行/honey——SessionStart hook 会重新启用该模式,直到运行/honey off。default <mode>→ 回复“默认 Honey 模式:。”此模式按项目设置:/honey <mode>仅设置当前仓库;/honey default <mode>则为所有未单独设置模式的仓库设置默认值。