我写的第一个 Claude Code skill 完全是为了自己方便。这个博客用 Hexo 发,工作流里毛刺不少,同样的东西我反复解释了好几遍,索性写下来一次:front matter 模板、SEO 检查项、部署路径、以及 Hexo 构建会以哪些方式静默失败。
它放在 ClawHub 上,攒了 700+ 次下载。
这个数字让我重新想了想。我写它的时候只当是给自己的备忘。结果一份”你已经亲手 debug 过的工作流备忘”,对还没踩过坑的人是有用的——这个门槛其实相当低,也就成了继续写的理由。
所以有了第二个,这次是插件:social-media-tones。
它解决什么
我发东西的语气会随平台变,而每次都要跟 Claude 重新解释一遍,很烦。写一条讲自己 debug 经历的 thread,和写一条讲刚读的论文的 thread,是两个不同的活。两者都技术、都口语,但不能互换——前者第一人称开场、落在”什么让我意外”,后者第三人称开场、落在 benchmark 数字。
所以里面现在有两个 skill:
| 怎么开头 | 落在哪 | |
|---|---|---|
x-learning-notes |
“had to build my own SFT data this week…” | 文章里还有什么 |
x-paper-explainer |
“the authors replace one FFN with a memory layer…” | 89% → 11% |
命名是平台在前,因为真正会让你栽跟头的约束属于平台而不是语气。一条帖能有多长、外链会不会被降权、hashtag 今年算不算垃圾信号——这些对 X 来说恒定,跟你用哪种语气无关。所以它们只写一遍,放在 platforms/x.md,两个 skill 都指向它。
为什么是插件,不是再写两个 skill
个人 skill 是扁平的。所有东西都在 ~/.claude/skills/<name>/SKILL.md——没有文件夹,没有嵌套,没有命名空间。我本机装了 56 个,全在同一层。这对一堆互不相关的工具没问题,但一旦你有了一族相关的东西就难受了:把它们归到一起的,只剩一个你得每次打对的前缀。
插件给你一个真的命名空间。装完的 skill 地址是 plugin:skill,我这两个就是 social-media-tones:x-learning-notes。而插件本身几乎没什么内容:一个 git 仓库、一个很小的 manifest,加上你本来就要写的那些 SKILL.md。
1 | /plugin marketplace add Jarxi/social-media-tones |
另一个理由是插件能长大。我知道自己还要 LinkedIn,大概还要一个记录发布进展的语气,以后可能还有长文的。加一个就是新建一个目录,命名空间自己吸收掉。
什么东西值得写进去
用形容词描述语气是没用的。”具体、小写、有热情”——照着这个写不出任何你愿意发出去的东西。真正让这个 skill 好用的是三样具体的:一条完整引用的真实帖子当校准样本、我写废并扔掉的那些草稿以及每一版错在哪、还有那些会骗你的平台事实。
最后一类举个这周的例子。我发一条 6 段的 thread,第 3 段返回:
1 | {"detail":"You are not permitted to perform this action.","status":403,"title":"Forbidden"} |
到底不被允许做什么?而第 1、2 段已经发出去了,我的时间线上于是挂着一段孤立的残片。限流正常,凭证正常,把第 3 段的每个段落单独发出去也全都成功。
X 不数字符,它算权重——只有几个很窄的码点区间算 1,其余一律算 2,包括中日韩、emoji,还有箭头。第 3 段是 279 个字符,里面有两个 →。真实长度 281,超了 1 个,然后被报成一个权限错误。
这种东西就该写进 skill。它跟写作没有半点关系,但它会花掉你一个下午。
接下来
计划就是一直往里加。每次我搞明白一件事、并且发现自己要解释第二遍,那就是一个 skill。Hexo 那个来自发这个博客,这个来自给这个博客发帖。两个都始于写给自己的备忘,而它们唯一值得分享的原因,是那些错误还留在里面。
想抄结构的话都在仓库里。目前两个语气——在你敢说自己搞懂了之前,这大概是个诚实的数量。
English version: After the Hexo Skill, a Plugin for Tone