MoreRSS

site iconDevTang | 唐巧修改

iOS开发,孵化了 小猿搜题 和 小猿口算。斑马智能硬件业务负责人,带领团队研发的产品累计出货量超过 400 万台。著有《iOS 开发进阶》。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

DevTang | 唐巧的 RSS 预览

理解 Skill —— 读《图解 Skill》

2026-06-27 03:04:00

最近读完了宝玉的《图解 Skill —— AI 提效实战指南》,这是一本难得的 Skill 入门好书。趁着记忆还热乎,把心得整理成这篇读书笔记,也分享给同样在折腾 AI Agent 的朋友。

一、关于作者宝玉

宝玉是国内 AI 圈非常活跃的分享者,常年在推特(X,账号 @dotey)、微博和 GitHub 上输出大量实用的 AI 技巧和 Skill。他在 GitHub(用户名 JimLiu)开源的 baoyu-skills 仓库,目前已经积累了约 1.8 万 star,覆盖内容创作、配图生成、自媒体发布等一整套工作流,被很多自媒体作者日常使用。

这本《图解 Skill》系统讲解了如何设计、编写、安装和迭代 Skill,并配有完整示例和章节配套资源(官方示例仓库为 JimLiu/Illustrated-Agent-Skills),属于「边读边能上手」的那一类书。

二、Skill 长什么样

先从最基础的问题说起:一个 Skill 到底长什么样?

一个 Skill 就是一个文件夹,里面有一个 SKILL.md 文件。

展开 SKILL.md,可以看到它分成两部分:

  • 第一部分是 YAML 格式的文件头,里面包含 Skill 的名字和描述。
  • 第二部分是 Skill 的正文,包含这个 Skill 的具体内容。

除此之外,Skill 还有一个可选的第三部分——配套资源包。如果你的 Skill 需要一些参考文档或静态资源,可以放进资源包里。资源包没有严格的命名规则,也没有数量限制,比较自由。

书中举了一个稍微复杂一点的例子:一个带有脚本、参考文档和静态资源的 Skill,把这三类内容分成三个文件夹,统一放在 Skill 文件夹下面。如下图所示:

三、怎么写好 description

description 是 Skill 里非常关键的一部分,因为它直接决定了模型在什么时候会调用这个 Skill。

一个好的 description 应该包含两样东西:功能定义触发场景

举个例子:

  • 「生成工作周报」——这是功能定义
  • 「当用户要求写周报、总结或汇报等内容时使用」——这是触发场景

description 需要尽可能简洁,最好控制在 100 个字左右,最多不超过 200 个字。写得太长,反而会稀释关键信息。

四、正文怎么写

正文长度

关于正文长度,官方建议不超过 5000 token,对应大概是 3800 个字,行数不超过 500 行。换句话说,Skill 正文要克制,不要把它写成一篇长篇大论。

正文的内容框架

书中给出了一个具体的、可直接套用的内容框架,分成四步:

  1. 角色定位:先说清楚这是谁给谁用的。
  2. 核心要点:列出关键的要点。
  3. 禁止清单:列出绝对不能做的事情。
  4. 参考资料:最后附上相关参考资料。

书中以「写作风格 Skill」作为例子,把上面这套框架完整展开了一遍,是个很好的范例,建议对照原书细读。

五、怎么验证 Skill 写得好不好

书里还提出了一个我很认同的观点:技能写得好不好,应该做对比测试。

不过书中没有展开讲具体怎么测——核心思路是让模型一次加载 Skill、一次不加载 Skill,跑同一个任务做对照,看效果差异。这一节我顺着这个思路,补一套可以直接上手的做法,供大家参考。

核心逻辑:加载 vs 不加载

对比测试要回答的其实只有一个问题:有了这个 Skill,模型的输出到底变好了没有,还是只是多了一堆噪音?

所以最朴素的做法是这样三步:

  1. 准备一组真实的任务提示词(强烈建议用你日常工作里真实出现过的需求,而不是凭空编的例子)。
  2. 同一组提示词跑两遍:一遍加载 Skill,一遍不加载 Skill
  3. 把两边的输出摆在一起对比,看加载之后是否真的更好。

怎么判断”更好”:先定验收标准

光靠”感觉好像更好了”是不够的,容易自我欺骗。更靠谱的做法是事先写下验收标准(断言)——也就是一条条明确、可判断的检查项。比如做一个”周报 Skill”,验收标准可以是:

  • 是否包含了”本周完成 / 下周计划 / 风险项”三个固定板块?
  • 语气是否符合团队对外汇报的口吻?
  • 是否控制在规定字数内?

标准越客观、越可验证越好。但要注意:写作风格、设计美感这类主观的东西,不适合硬套断言,更适合人工定性判断,别为了”可量化”而扭曲它。

一个降低偏见的技巧:盲评

人在评判时容易有先入为主的偏见——知道哪份是”带 Skill 的”,就会下意识觉得它更好。一个解决办法是盲评:把两份输出隐去身份,交给另一个模型实例(或另一个人)来判断哪个更好、并说明理由,评判者并不知道哪份来自哪个版本。这样得到的结论更可信。

好消息:这件事现在可以自动化

值得一提的是,Anthropic 在 2026 年 3 月已经把这整套对比测试能力做进了官方的 skill-creator 工具里,而且全程不需要写代码。它能帮你:

  • 自动写 eval(测试用例):你给几个真实提示词、描述清楚”好的输出长什么样”,它就能生成测试。
  • 自动跑加载 / 不加载对比:内置 comparator agent(对比智能体),自动对”有 Skill vs 无 Skill”两份输出做盲评,告诉你这个改动到底有没有用。
  • benchmark 基准模式:跑一轮标准化评测,记录通过率、耗时和 token 消耗,方便你在模型升级或修改 Skill 后回归测试。
  • 优化 description 触发:自动生成”应该触发 / 不该触发”的样例,测量命中率,帮你调描述,减少误触发和漏触发。

这也呼应了我前面的延伸想法:对比测试的框架本身,完全可以交给 AI 来自动设计和执行。 书里点出了”要做对比测试”这个方向,而官方工具已经把它落地成了开箱即用的能力。

顺带一提,官方还提到一个很有意思的观察:如果某天你发现不加载 Skill、模型也能通过全部 eval,那不是 Skill 坏了,而是模型自身能力已经进化到把这个 Skill 的技巧内化了——这个 Skill 可以”功成身退”了。这对判断一个 Skill 还有没有维护价值,是很实用的信号。

六、实用使用技巧

书的最后还给出了不少落地的使用技巧,几个我印象比较深的:

  • 单一职责:每个 Skill 只做一件简单的事,再用一个工作流把多个 Skill 串起来。
  • 按需加载:把一些更细粒度的 Skill 放在别的 Skill 下面,需要的时候再让它加载,避免一次性占用过多上下文。
  • 配置外置:把可配置的参数放进扩展文件里,这样修改配置时不会动到原始的 Skill 文件。

七、小结

整体读下来,我认为《图解 Skill》是一本很好的 Skill 入门书。它把 Skill 的结构、写法、测试到使用技巧讲得清晰又系统,配图和示例也很到位,能帮助读者对 Skill 的设计和使用建立起一个全面的认识。

如果你正打算开始用 Skill、或者想把手头的 Agent 用得更顺手,这本书很值得一读,推荐给大家。

最后,感谢人民邮电出版社英子老师的赠书。

玩教具行业的核心竞争力

2026-06-13 10:00:46

斑马玩教具业务从 22 年底到现在,已经快 4 年了。我们团队从研发课程的赠品出发,做出了斑马思维机这款爆款产品,连续三年销量第一。我一直在思考,我们在积累什么能力,我们的护城河在哪里,这里记录一下我的思考。

我们积累什么能力

内容教研能力

玩教具要解决“在玩中学”,所以需要把知识用有趣的方式在玩具中呈现出来。让孩子用“习得”的方式掌握知识。

动画片、儿歌、故事、游戏、音乐,这些任何让孩子感兴趣的方式,都变成了知识的载体。

但不是简单地把知识强行嫁接游戏就能成功。我见过一个失败的案例,把一个模拟经营的游戏变成了做题,孩子只能做题才能拿到游戏经营的金币,这种把游戏的快乐与做题的痛苦强行结合的方式,就像我们用奖励来鼓励孩子学习一样,只会让学习本身变得更加索然无味。

好的教研应该更进一步:把儿童发展目标转化为游戏规则、材料结构、交互路径和难度梯度。

斑马思维机在这方面帮我们收获了很多的经验。我们发现“过家家”似的角色扮演游戏是孩子非常感兴趣的游戏形式,我们就让孩子扮演过家家里面的某些角色,通过场景来构造知识的容器:

  • “晚上夜深了,帮猫妈妈告诉小猫应该睡觉了”
  • “要过马路了,提醒佩奇牵住爸爸的手”
  • “上车啦,帮小朋友系上安全座椅的安全带吧”

这就是更加融合知识的游戏结构。

产品设计能力

做教育产品需要有双用户洞察的视角:家长关心教育价值,孩子只关心好不好玩。很多产品失败,是因为只满足了家长,没有满足孩子——包装上写满”逻辑思维、空间认知、专注力、数学启蒙”,但孩子玩 5 分钟就放弃。反过来,如果只好玩但家长看不到成长价值,就会变成普通玩具,被一堆公司模仿,没有壁垒。

好的产品应该:

  • 低门槛启动。不需要说明书,孩子一眼就知道怎么玩。
  • 短反馈循环。孩子每一步操作都能得到反馈:拼对了、点亮了、答对了、解锁了、完成了、你真棒。并且鼓励他的具体努力行为,而不是简单夸他聪明。比如:你连续做对了 3 道题,真厉害!
  • 难度递进。利用 i+1 理论,让知识螺旋上升,有复习巩固,不让孩子有挫折感。
  • 多解法或开放性。构建开放系统,让孩子可以多次重复玩,每次玩都不一样。
  • 可展示成果。孩子做完后可以给家长看:“我学会了一首古诗”,“我认识了一个单词”,“爸爸,我考你一个成语”。这会强化家长的价值感知。

渠道能力

现在售卖渠道变得多元化。天猫、京东、拼多多、抖音、快手、私域、线下门店,甚至海外渠道,都是需要投入建设的。每一个渠道虽然有部分用户与其他渠道重合,但是也有着它自己的忠实用户。

我们在每个渠道都花了三年时间深耕。比如:

  • 在天猫渠道,我们和李佳琦建立了深度的合作,每年李佳琦给我们带来的成交量能占到天猫总成交量的小一半。
  • 在抖音,我们合作了上千位达人,每个达人都是花时间一点一点谈下来的。这个过程既帮双方挣到了钱,也建立了合作的信任关系。

我们的壁垒是什么

我们的短期壁垒是教研、产品、渠道。

教研壁垒使得我们的竞争对手还是聚焦在教育领域,我们也可以尝试进攻那些非教育领域的品牌。就像学习机领域那样,最终教育公司(学而思、阿尔法蛋)把硬件公司(步步高、读书郎)打败了。非教育公司很难招聘和拥有大量的教研团队,同时他们的品牌也不支持用户心智,所以就容易放弃竞争。

产品壁垒是我们的创新带来的时间窗口。我们会在产品上领先同行 6-12 个月,这使得我们可以更早开展营销获客,获得用户和品牌心智,竞争对手需要考虑同质化竞争的难度,或差异化竞争的方案。

渠道壁垒是我们在各大渠道积累的合作经验,这使得我们可以在新品售卖的时候复用这部分的能力。

我们的长期壁垒是构建教育品牌心智、产品内容矩阵。这种心智会产生长期的主动搜索和主动购买,从而让我们过得一天比一天好。

我们的危机是什么

我们当前的优秀产品数量还太少,无法形成“产品矩阵”,但是我们又不能像搭积木一样,快速堆砌新产品,而是需要从用户需求出发,重新挖掘市场机会,这注定让我们的速度是慢的。

等我们有 3-5 款像斑马思维机一样的爆款产品,我们的品牌心智才有可能相对稳固。

小结

玩教具行业的核心竞争力,是把儿童发展规律、教育内容、游戏机制整合成一个可持续复购的产品系统,并产生品牌心智,形成长期口碑和复购。

更换搬瓦工 VPS IP

2026-06-07 22:27:55

概述

本文简述如何判断当前 IP 被屏蔽,以及如何更换 IP。

搬瓦工官方 KiwiVM 黑名单检测工具

搬瓦工自己提供了一个IP黑名单检测接口,这是最权威的判断方式。

使用步骤:

  • 登录搬瓦工账号,进入”My Services”,找到对应的VPS实例,点击”KiwiVM Control Panel”打开控制面板。
  • 在浏览器地址栏,将当前URL末尾的 main.php 替换为 main-exec.php?mode=blacklistcheck,回车。
  • 点击”Test Main IP”按钮,等待检测。
  • 如果结果显示 “IP BLOCKED”,说明IP已在黑名单中,被封无疑;如果显示正常,说明IP目前可用。

如下图:

更换 IP

目前的价格是每次约 8 美元,方法如下:

公众号 IP 白名单配置

操作路径为:「微信开发者平台 - 扫码登录 - 我的业务 - 公众号」,点击后即可进入到公众号的管理页面。

其它

Rebase Hacker House 见闻

2026-05-31 21:00:00

本周我去武汉参加了 Rebase Hacker House 活动。活动一共五天,从周三到周日。我是评委,去得最晚,周五晚上才到。

下面记一下我的几点感受。

东湖骑行 20 公里

活动地点就在东湖旁边。我周六一早先沿着东湖骑了 20 公里,一个半小时。

东湖骑车的条件挺好:有专门的骑行道,不用跟汽车抢路;湖边风景也不错;路上还有小卖部,渴了累了能停下来买点东西。

见了老同学

我还见到了研究生同学。他现在是泰康的资深技术主管,也在做 AI 落地的事。我们聊了不少当年的事,也聊了 AI 在保险行业落地会遇到哪些限制。

不过这次聊天,我收获最大的其实是文化方面。我发现,不同公司的文化差别可以非常大。比如:

  • 同样是裁员,我们一般就是 N+1 简单粗暴,但是他们会更关心负面影响
  • 同样是采购,我们更关注性价比,他们更关注合规、安全
  • 同样是汇报,我们更关注自己做了什么、效果怎么样,他们更关注组织协同
  • 同样是公司代码,我们可以随便访问,他们连 U 盘都不能插,拷走代码是红线

这种文化差别,可能跟公司所在的行业有关,也可能是创始人的风格长期影响了整个组织。泰康就跟互联网公司很不一样,但这一点都不影响它每年上百亿的利润。

这让我想到:在互联网待久了,很容易觉得自己这套文化才是对的。但其实赚钱的路子有很多种,一种跟你完全不一样的文化,可能更适配它那种生意模式,照样可以做得很成功。

项目答辩

周日上午是各个团队答辩,团队一个个上台,做什么的都有:

  • 帮老年人做回忆录的
  • 让 AI 带着年轻人去旅游的
  • 教你写脱口秀段子的
  • AI 辅助志愿填报的

我印象深刻的有几个产品:

一个是自己 DIY 香水味道的硬件产品。团队成员都很年轻,产品挺有意思,也很适合出海。我建议他们尽早把专利申请了。

还有一位律师,做了一个给律师用的合同脱敏产品。这个已经很有商业化的条件了:她自己就在律师行业,知道真实的需求在哪,手上也有营销方面的人脉资源。又懂技术、又懂行业、又有渠道,这恰恰是很多纯技术团队最缺的。

最让我触动的是 Rebase 的工作人员 Nicole。她是做运营的,被现场的气氛感染,自己也做了一个项目。她没有编程经验,但答辩的时候,她那个宠物项目已经做出了 AI 识图、宠友社交这些功能,还部署到了 GitHub Pages 上。

放在两年前,这几乎是不可能的。这也是现在最让人兴奋的地方:工具把「会编程」这道门槛降了很多,有想法的人可以自己动手把东西做出来。

写在最后

Hacker House 本身做不出什么大项目,几天时间也不够。它真正的作用,是把这样一群人聚到一块,让大家互相看见、交上朋友。这种社交活动除了交流创意,也是很好的寻找朋友或 Partner 的场所。

推荐大家未来都可以找机会体验下。

北京四环骑行一日游:69 公里 6 小时

2026-05-24 10:00:00

昨天突然想骑车绕四环一圈。因为是绕圈,所以起点和终点是同一个地方。一开始不知道高德怎么规划环线,后来想了个办法:设几个途经点——东四环中、东四环南、南四环中、西四环中、北四环中,就形成了一条绕四环的导航路线。

导航显示有 69 公里,预计骑行时间 4 个多小时。我带上两瓶水和一点干粮,就上路了。

出发

小区楼下有小蓝车,我临时办了个会员,扫码就开始骑了。

从早上 11 点出发。大概每骑一个小时左右就休息一下,顺便把车还了重新再扫一辆——因为小蓝车只有 2 小时内才是免费的。

整体进度比预想的慢很多。一方面是休息,另一方面是红绿灯也要等不少。最后下午 5 点回到家,一共花了 6 个小时。

成绩单

手表开晚了一会儿,所以少记了一点公里数,记录到的是 54.59 公里、3 小时 50 分、平均速度 14.19 公里/小时、消耗 1043 千卡。

平均心率 104 次/分钟,比我预想的要低一点点。但考虑到骑了 6 个小时,到后面确实也挺累了。

路上一直在听小宇宙播客,听完了张小珺的两个关于 AI 大模型的采访,分别是关于 Manus 和智谱的。

一点小仪式感

绕行四环还是一件挺有成就感的事情。我想把一些小事跟成就挂钩,给生活加点小小的仪式感。这次试过之后,我可能以后每隔一年都会再骑一次。

给想试的人的 tips

  • 水要带够,至少三瓶
  • 充电宝必备,沿路开导航挺费电的
  • 防晒帽需要,中间有些路段挺晒
  • 如果能借朋友的自行车骑,对身体会更友好一点

了解 Claude Code 的提示词工程

2026-05-22 23:25:23

虽然同样是调用 Opus 4.7 模型,但是不同的编程工具展现的表现确不一样。就拿 Claude Code, Cursor, OpenCode,Windsurf 这几个产品来说,显然 Claude Code 在程序员中的口碑更好。

那 Claude Code 与其它编程工具的差异性在哪儿呢?其中有一个重要的环节就是:提示词工程(prompt engine)。

正好我今天看到了 ccglass 这个开源项目,它可以把 Claude Code 的提示词通过网络请求截取出来,于是我试了一下,给大家分享一下我看到的有趣的地方。

整个提示词分为:系统层、消息层、工具层。这三层的提示词是拼接在一起发给服务器的。

系统层

我们先看系统层,这一层规定了 Claude Code 的人设,工作原则和方法,以及记忆。

著名的 cch header

在提示词的最顶部,你能看到这样一行:

1
x-anthropic-billing-header: cc_version=2.1.148.90a; cc_entrypoint=cli; cch=06d7a;

这行最后的 cch 参数,就是造成 claude code 配置别的大语言模型缓存失效的元凶。因为模型调用的缓存是基于“前缀”的,如果你的提示词前面都没变,只是在最后加了一句新的对话。那么前面的缓存都会命中。但是 claude code 在今年 2 月的升级中加入了这个参数,在每轮对话中 cch 参数都会变,如果别的模型不特殊处理这个参数,就会造成所有缓存失效。

人设

告诉它是官方的,并且主要是做软件工程相关的任务。

提示词如下:

1
2
3
You are Claude Code, Anthropic's official CLI for Claude.

You are an interactive agent that helps users with software engineering tasks.

禁止干坏事

提示词中明确禁止了做破坏性(比如 DoS 攻击)的事情,一些高风险的事情,也会要求用户澄清用处。

提示词如下:

1
Refuse requests for destructive techniques, DoS attacks, mass targeting, supply chain compromise, or detection evasion for malicious purposes. Dual-use security tools (C2 frameworks, credential testing, exploit development) require clear authorization context: pentesting engagements, CTF competitions, security research, or defensive use cases.

记忆

提示词中为每个目录都创建了记忆,让 Agent 需要的时候把记忆保存下来。

像我的这个实验项目,记忆文件就在 /Users/tangqiao/.claude/projects/-Users-tangqiao-ccglass/memory/

提示词如下:

1
2
3
4
5
You have a persistent, file-based memory system at `/Users/tangqiao/.claude/projects/-Users-tangqiao-ccglass/memory/`. This directory already exists — write to it directly with the Write tool (do not run mkdir or check for its existence).

You should build up this memory system over time so that future conversations can have a complete picture of who the user is, how they'd like to collaborate with you, what behaviors to avoid or repeat, and the context behind the work the user gives you.

If the user explicitly asks you to remember something, save it immediately as whichever type fits best. If they ask you to forget something, find and remove the relevant entry.

关于记忆,提示词中还规定了什么时候保存,怎么保存。

提示词如下:

1
2
3
4
5
6
7
8
9
10
11
12
## How to save memories

Saving a memory is a two-step process:

**Step 1** — write the memory to its own file (e.g., `user_role.md`, `feedback_testing.md`) using this frontmatter format:

此处省略

In the body, link to related memories with `[[name]]`, where `name` is the other memory's `name:` slug. Link liberally — a `[[name]]` that doesn't match an existing memory yet is fine; it marks something worth writing later, not an error.

**Step 2** — add a pointer to that file in `MEMORY.md`. `MEMORY.md` is an index, not a memory — each entry should be one line, under ~150 characters: `- [Title](file.md) — one-line hook`. It has no frontmatter. Never write memory content directly into `MEMORY.md`.

只有 200 行的记忆限额

提示词如下:

1
`MEMORY.md` is always loaded into your conversation context — lines after 200 will be truncated, so keep the index concise

消息层

这一层定义了它能使用的各种工具。

skill

所有的 skill 在这一层被提示词引入,你能看到这样的提示词开头:

1
The following skills are available for use with the Skill tool:

我因为之前装过 hyperframes,所以我看到了大量 hyperframes 的 skill。

我这才知道 hyperframes 这个框架一共有 16 个 skill,每次我用 claude code,这些 skill 都被注入到了提示词。

hyperframes 引入了一共有多少提示词呢?给大家看一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
- hyperframes: Create video compositions, animations, title cards, overlays, captions, voiceovers, audio-reactive visuals, and scene transitions in HyperFrames HTML. Use when asked to build any HTML-based video content, add captions or subtitles synced to audio, generate text-to-speech narration, create audio-reactive animation (beat sync, glow, pulse driven by music), add animated text highlighting (marker sweeps, hand-drawn circles, burst lines, scribble, sketchout), or add transitions between scenes (crossfades, wipes, reveals, shader transitions). Covers composition authoring, timing, media, and the full video production workflow. For CLI commands (init, lint, preview, render, transcribe, tts) see the hyperframes-cli skill.
- website-to-hyperframes: Capture a website and create a HyperFrames video from it. Use when: (1) a user provides a URL and wants a video, (2) someone says "capture this site", "turn this into a video", "make a promo from my site", (3) the user wants a social ad, product tour, or any video based on an existing website, (4) the user shares a link and asks for any kind of video content. Even if the user just pastes a URL — this is the skill to use.
- remotion-to-hyperframes: Translate an existing Remotion (React-based) video composition into a HyperFrames HTML composition. Use ONLY when the user explicitly asks to port, convert, migrate, translate, or rewrite a Remotion composition as HyperFrames — for example "port my Remotion project to HyperFrames", "convert this Remotion code to HyperFrames", "migrate from Remotion", "translate this Remotion comp", or "rewrite this as HyperFrames HTML". Do NOT use when (a) the user is authoring a NEW HyperFrames composition, even if they have or are A/B-testing a similar Remotion video; (b) the user mentions Remotion in passing without asking for migration; (c) the user shares Remotion code as reference material rather than asking for a translation; (d) the user asks for "the same video as my Remotion one" without explicitly asking to migrate the source — treat that as a fresh HyperFrames build. When in doubt, default to authoring a native HyperFrames composition with the `hyperframes` skill instead. Skill detects unsupported patterns (useState, useEffect with side effects, async calculateMetadata, third-party React component libraries, `@remotion/lambda` features) and recommends the runtime interop escape hatch instead of attempting a lossy translation.
- hyperframes-cli: HyperFrames CLI tool — hyperframes init, lint, inspect, preview, render, transcribe, tts, doctor, browser, info, upgrade, compositions, docs, benchmark. Use when scaffolding a project, linting, validating, inspecting visual layout in compositions, previewing in the studio, rendering to video, transcribing audio, generating TTS, or troubleshooting the HyperFrames environment.
- waapi: Web Animations API adapter patterns for HyperFrames. Use when authoring element.animate() motion, Animation currentTime seeking, document.getAnimations(), KeyframeEffect timing, fill modes, or native browser animations that must render deterministically in HyperFrames.
- animejs: Anime.js adapter patterns for HyperFrames. Use when writing Anime.js animations or timelines inside HyperFrames compositions, registering animations on window.__hfAnime, making Anime.js seek-driven and deterministic, or translating Anime.js examples into render-safe HyperFrames HTML.
- hyperframes-registry: Install and wire registry blocks and components into HyperFrames compositions. Use when running hyperframes add, installing a block or component, wiring an installed item into index.html, or working with hyperframes.json. Covers the add command, install locations, block sub-composition wiring, component snippet merging, and registry discovery.
- three: Three.js and WebGL adapter patterns for HyperFrames. Use when creating deterministic Three.js scenes, WebGL canvas layers, AnimationMixer timelines, camera motion, shader-driven visuals, or canvas renders that respond to HyperFrames hf-seek events.
- tailwind: Tailwind CSS v4.2 browser-runtime patterns for HyperFrames compositions. Use when scaffolding or editing projects created with `hyperframes init --tailwind`, writing Tailwind utility classes in composition HTML, adding CSS-first Tailwind v4 theme tokens, debugging v3 vs v4 syntax, or deciding when to compile Tailwind to CSS instead of using the browser runtime.
- hyperframes-media: Asset preprocessing for HyperFrames compositions — text-to-speech narration (Kokoro), audio/video transcription (Whisper), and background removal for transparent overlays (u2net). Use when generating voiceover from text, transcribing speech for captions, removing the background from a video or image to use as a transparent overlay, choosing a TTS voice or whisper model, or chaining these (TTS → transcribe → captions). Each command downloads its own model on first run.
- lottie: Lottie and dotLottie adapter patterns for HyperFrames. Use when embedding lottie-web JSON animations, .lottie files, @lottiefiles/dotlottie-web players, registering instances on window.__hfLottie, or making After Effects exports deterministic in HyperFrames.
- gsap: GSAP animation reference for HyperFrames. Covers gsap.to(), from(), fromTo(), easing, stagger, defaults, timelines (gsap.timeline(), position parameter, labels, nesting, playback), and performance (transforms, will-change, quickTo). Use when writing GSAP animations in HyperFrames compositions.
- css-animations: CSS animation adapter patterns for HyperFrames. Use when authoring CSS keyframes, animation-delay based timing, animation-fill-mode, animation-play-state, or CSS-only motion that HyperFrames must seek deterministically during preview and rendering.

怎么说呢?反正我立马把它卸载了。我给 claude code 的提示词如下:

1
我曾经用 npx skills add heygen-com/hyperframes 命令增加了 hyperframes skill, 现在我希望你帮我把这个 skill 删除掉。

用户人设和时间

其实 claude code 知道你的信息,相关提示词如下:

1
2
3
4
5
6
7
8
9
<system-reminder>
As you answer the user's questions, you can use the following context:
# userEmail
The user's email address is [email protected] .
# currentDate
Today's date is 2026/05/22.

IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant to your task.
</system-reminder>

用户的问题

用户输入的问题被放在了这里。

注意,每轮对话,它会把之前所有的对话都带上,直到上下文超限,才会进行压缩。

有意思的是,你能看到它不但带上了我的输入,还带上了工具执行的结果。所以对话的上下文增长的速度也非常快。

就比如我让它删除 hyperframes 的输入,它因为调用了 10 来次工具,使得我已经无法在这儿把所有的上下文贴给大家了。

工具层

有意思的是,工具层虽然也是可以缓存的部分,但是 claude code 把它放在了消息层后面。我猜这也是一个对抗其它模型缓存的办法,其它模型需要主动地把工具层部分的提示词也单独计算,否则它一定会因为夹在中间的用户输入而失效(心机重的 Anthropic 啊!)。

鼓励使用子 Agent

1
Launch a new agent to handle complex, multi-step tasks. Each agent type has specific capabilities and tools available to it.

如何提问

教大模型如何向用户提问,Claude code 有时候会弹出单选/复选框,就是这个提示词在起作用。

1
2
3
4
5
6
7
8
9
10
Use this tool when you need to ask the user questions during execution. This allows you to:
1. Gather user preferences or requirements
2. Clarify ambiguous instructions
3. Get decisions on implementation choices as you work
4. Offer choices to the user about what direction to take.

Usage notes:
- Users will always be able to select "Other" to provide custom text input
- Use multiSelect: true to allow multiple answers to be selected for a question
- If you recommend a specific option, make that the first option in the list and add "(Recommended)" at the end of the label

bash

所有的 bash 命令,也会在这一层被介绍给 Claude code 具体的使用方法。

比如 Read 命令的提示词如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Reads a file from the local filesystem. You can access any file directly by using this tool.
Assume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.

Usage:
- The file_path parameter must be an absolute path, not a relative path
- By default, it reads up to 2000 lines starting from the beginning of the file
- When you already know which part of the file you need, only read that part. This can be important for larger files.
- Results are returned using cat -n format, with line numbers starting at 1
- This tool allows Claude Code to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually as Claude Code is a multimodal LLM.
- This tool can read PDF files (.pdf). For large PDFs (more than 10 pages), you MUST provide the pages parameter to read specific page ranges (e.g., pages: "1-5"). Reading a large PDF without the pages parameter will fail. Maximum 20 pages per request.
- This tool can read Jupyter notebooks (.ipynb files) and returns all cells with their outputs, combining code, text, and visualizations.
- This tool can only read files, not directories. To list files in a directory, use the registered shell tool.
- You will regularly be asked to read screenshots. If the user provides a path to a screenshot, ALWAYS use this tool to view the file at the path. This tool will work with all temporary file paths.
- If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.
- Do NOT re-read a file you just edited to verify — Edit/Write would have errored if the change failed, and the harness tracks file state for you.

— schema —
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"file_path": {
"description": "The absolute path to the file to read",
"type": "string"
},
"offset": {
"description": "The line number to start reading from. Only provide if the file is too large to read at once",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"limit": {
"description": "The number of lines to read. Only provide if the file is too large to read at once.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"pages": {
"description": "Page range for PDF files (e.g., \"1-5\", \"3\", \"10-20\"). Only applicable to PDF files. Maximum 20 pages per request.",
"type": "string"
}
},
"required": [
"file_path"
],
"additionalProperties": false
}

MCP

所有的 MCP 在这一层被一一介绍。

比如这个 mcp__claude-in-chrome__tabs_create_mcp:

1
2
3
4
5
6
7
8
Creates a new empty tab in the MCP tab group. CRITICAL: You must get the context using tabs_context_mcp at least once before using other browser automation tools so you know what tabs exist.

— schema —
{
"type": "object",
"properties": {},
"required": []
}

调用 skill

虽然 skill 是在消息层注入的,但是工具层教大模型什么时候调用 skill。

1
2
3
4
5
When users reference a "slash command" or "/<something>", they are referring to a skill. Use this tool to invoke it.

How to invoke:
- Set `skill` to the exact name of an available skill (no leading slash). For plugin-namespaced skills use the fully qualified `plugin:skill` form.
- Set `args` to pass optional arguments.

结束语

最后给大家讲个题外话,ccglass 这个开源项目是百姓网CEO王建硕的作品,感谢王建硕先生!