乐于分享
好东西不私藏

Codex App Skills 使用教程:把重复工作变成可复用流程

Codex App Skills 使用教程:把重复工作变成可复用流程

前几篇我们讲了 Codex App 的安装、工作流、Commands、项目指令、权限和 MCP。

这篇讲 Skills。

如果说 Commands 是入口,MCP 是外部工具,那么 Skills 就是你给 Codex 写的一本小手册。

它不一定连接外部服务。

也不一定需要代码。

它更关心一件事:

  1. 这类任务以后都按同一套方法做。

比如:

  1. 公众号文章审稿
  2. Markdown转公众号排版
  3. 安全审查
  4. 发布前检查
  5. PR 描述生成
  6. 项目初始化清单

这些事情不是一次性任务。

你今天要做,明天还会做。

每次都重新写 prompt,很烦。

这时候就适合做成 Skill。


一、Skill 到底是什么

Skill 是 Codex 的可复用工作流。

它通常是一个目录。

目录里最重要的是:

  1. SKILL.md

SKILL.md 里写两类内容。

第一,什么时候应该使用这个 Skill。

第二,使用时应该按什么步骤做。

一个最小 Skill 大概长这样:

  1. ---
  2. name: wechat-md-publisher
  3. description:PrepareMarkdown drafts forWeChatOfficialAccount publishing.
  4. ---
  5. # WeChat MD Publisher
  6. Usethis skill when preparing Markdown articles forWeChat publishing.
  7. ## Workflow
  8. 1.Check mobile reading flow.
  9. 2.Keep paragraphs short.
  10. 3.Verify image references.
  11. 4.Produce a publish checklist.

这个例子不复杂。

但已经能告诉 Codex:

  1. 遇到公众号Markdown发布任务时,按这套流程来。

二、Skill 不是更长的 prompt

很多人第一次写 Skill,会把它写成一段超长 prompt。

这样当然也能用。

但不太划算。

Prompt 适合一次性任务。

Skill 适合重复任务。

比如你今天只想让 Codex 改一段 README:

  1. 请把 README 的安装步骤写得更清楚。

这不需要 Skill。

但如果你每次写公众号文章,都要检查:

  1. 手机端段落
  2. 标题层级
  3. 图片路径
  4. 敏感信息
  5. 发布清单

那就值得做成 Skill。

判断标准很简单:

  1. 同一类事情,你已经重复说过三次。

这时候就可以考虑沉淀。


三、Skill、Command、MCP、Automation 怎么分

这几个概念很容易混。

我用最粗的方式分一下。

Command 是当前线程里的入口。

比如:

  1. /plan
  2. /review
  3. /status
  4. /mcp

Skill 是一套可复用工作方法。

比如:

  1. $humanizer-zh
  2. $markdown-to-html
  3. $wechat-md-publisher

MCP 是外部工具连接。

比如:

  1. 文档查询
  2. 浏览器操作
  3. 设计稿读取
  4. 数据库 schema 查询

Automation 是定时或后台任务。

比如:

  1. 每天检查仓库状态
  2. 每周提醒复盘文章
  3. 定时监控某个测试结果

所以不要把所有东西都写成 Skill。

如果它只是一个入口,用 Command。

如果它要连接外部工具,用 MCP。

如果它要定时运行,用 Automation。

如果它是一套反复用的做事方法,再写 Skill。


四、什么时候该写 Skill

我会在这些场景写 Skill:

  1. 任务反复出现
  2. 步骤比较固定
  3. 输出格式有要求
  4. 容易漏检查项
  5. 需要引用固定脚本或资料
  6. 不同文章/项目都能复用

比如我们这个公众号项目里,已经有几个很典型的 Skill 场景。

一个是文章发布。

Markdown 源稿要变成可复制到公众号后台的版本,还要检查图片、段落和发布清单。

一个是去 AI 腔审稿。

每篇文章都要看有没有公式化表达、过度总结、三段式排比。

一个是 Markdown 转 HTML。

文章源稿可以转成网页预览,方便检查结构。

这些工作每次都差不多。

写成 Skill 后,不用每次重新解释。


五、什么时候不要写 Skill

有些事情不适合写 Skill。

比如只做一次的临时要求:

  1. 把这篇文章标题改短一点。

这直接用 prompt 就行。

再比如高度不确定的探索:

  1. 帮我想几个产品方向。

这种先正常聊天。

等流程稳定下来,再沉淀。

还有一类也别急着写:

  1. 需要真实访问外部系统的任务。

如果主要工作是查数据库、读浏览器、访问设计工具,那可能要先考虑 MCP。

Skill 可以描述怎么用这些工具,但它本身不等于工具连接。


六、一个好 Skill 应该写什么

一个好 Skill 不需要很长。

但它要说清楚几件事。

第一,触发条件。

什么时候该用它?

什么时候不该用它?

第二,输入。

它需要什么文件、链接、截图、目标或约束?

第三,流程。

先做什么,后做什么。

第四,输出。

最终交付 Markdown、HTML、检查报告,还是代码修改?

第五,边界。

不要做什么。

不要编造什么。

不要访问什么。

可以先按这个骨架写:

  1. ---
  2. name: skill-name
  3. description:Usewhen...
  4. ---
  5. # Skill Name
  6. ## When to use
  7. Usethis skill when...
  8. Donotuse it when...
  9. ## Workflow
  10. 1.Read the input.
  11. 2.Check...
  12. 3.Produce...
  13. ## Output
  14. Return...
  15. ## Safety
  16. -Donot...
  17. -Ask before ...

这就够开始用了。


七、description 比你想的更重要

description 很短。

但它很要命。

Codex 会根据它判断什么时候该用这个 Skill。

如果你写得太泛:

  1. description:Helpwith writing.

那就很难匹配准确。

因为“写作”太大了。

更好的写法是:

  1. description:PrepareMarkdown drafts forWeChatOfficialAccount publishing, including mobile reading flow,local image placeholders,and publish checklist.

这句话虽然长一点,但范围清楚。

它告诉 Codex:

  1. 公众号
  2. Markdown
  3. 手机端阅读
  4. 图片占位
  5. 发布清单

这些词就是触发线索。

写 description 时,别追求文采。

写清楚它管什么、不管什么。


八、Skill 可以只有说明,也可以带脚本

很多 Skill 只需要说明。

比如审稿、写作风格、项目检查清单。

这些靠文字规则就够了。

但有些 Skill 适合带脚本。

比如:

  1. 批量检查图片路径
  2. Markdown转成发布稿
  3. 生成图片清单
  4. 导出 HTML
  5. 分析固定格式日志

脚本的好处是稳定。

同样的输入,尽量得到同样的输出。

但别什么都写脚本。

脚本越多,维护成本越高。

我的建议是:

  1. 先写说明。
  2. 重复几次后,发现某一步总是机械重复,再抽成脚本。

九、Skill 应该放在哪里

Codex 可以从多个位置读取 Skills。

日常可以先记两个。

个人通用 Skill:

  1. ~/.agents/skills

适合放你所有项目都可能用到的能力。

比如:

  1. 中文审稿
  2. Markdown HTML
  3. 通用发布检查

项目内 Skill:

  1. .agents/skills

适合放只服务当前仓库的能力。

比如这个公众号项目里的:

  1. .agents/skills/humanizer-zh
  2. .agents/skills/markdown-to-html

如果一个 Skill 只对这个项目有意义,就放项目里。

如果你想所有项目都能用,就放个人目录。

团队要共享,就提交到仓库。


十、怎么调用 Skill

有两种方式。

第一种,显式调用。

也就是你在 prompt 里直接写:

  1. $humanizer-zh

或者:

  1.  $markdown-to-html 把这篇Markdown转成 HTML

这种方式最稳。

你明确告诉 Codex:

这次就用这个 Skill。

第二种,隐式调用。

也就是你不点名 Skill,但任务描述命中了它的 description

比如你说:

  1. 检查这篇公众号文章有没有 AI 腔。

如果 humanizer-zh 的描述写得清楚,Codex 就可能自己选择它。

新手阶段,我建议显式调用。

少一点猜测。


十一、写 Skill 前先用 prompt 跑几次

不要第一次想到流程,就马上写 Skill。

先用普通 prompt 跑几次。

看哪些步骤每次都一样。

比如公众号文章发布,你可能会反复说:

  1. 段落要短
  2. 不要放文末资料堆
  3. 图片放 assets
  4. 文章放 articles
  5. 输出适合公众号手机端阅读
  6. 检查敏感信息

这些反复出现的要求,就是 Skill 的原材料。

等你发现自己已经懒得再打这些话,就可以沉淀了。

Skill 不是从天上写出来的。

它通常是从重复 prompt 里长出来的。


十二、Skill 写完要测试

Skill 写完不要直接相信它。

至少测试三件事。

第一,能不能触发。

你显式点名 $skill-name,Codex 是否会读取它?

第二,会不会误触发。

一个不相关任务,Codex 是否也错误使用了它?

第三,输出是否稳定。

同一类输入,结果是否大致符合预期?

可以这样测试:

  1.  $skill-name 处理这篇文章。
  2. 只说明你会按哪些步骤做,先不要修改文件。

先看步骤。

再让它动手。

这样比较稳。


十三、Skill 不要写成管家

有些 Skill 会越写越大。

最后变成:

  1. 写文章
  2. 排版
  3. 生成封面
  4.  HTML
  5. 发布检查
  6. Git提交
  7. 推送远程

看起来省事。

实际很难维护。

更好的方式是拆开:

  1. 写作审稿Skill
  2. Markdown HTML Skill
  3. 图片生成Skill
  4. 发布检查Skill

每个 Skill 管一件事。

需要组合时,在当前任务里组合。

不要让一个 Skill 变成所有工作的入口。

入口太大,失控也快。


十四、Skill 里的安全边界要写清楚

Skill 里一定要写“不做什么”。

比如公众号发布 Skill 可以写:

  1. 不要编造截图。
  2. 不要声称本地图片已经上传到公众号。
  3. 不要把本地相对路径当成可发布图片。
  4. 不要输出 API KeyTokenCookie

代码审查 Skill 可以写:

  1. 优先报告 bug、风险和缺少测试。
  2. 不要只写总结。
  3. 不要把风格偏好说成严重问题。

安全边界越具体,Codex 越好执行。

“注意安全”这种话太空。

写清楚具体不能做什么。


十五、什么时候要升级成 Plugin

Skill 适合本地和项目内复用。

Plugin 适合分发。

如果你只是自己用,或者团队在一个仓库里用,Skill 就够了。

如果你想把多个 Skills、MCP 配置、图标、默认配置一起打包给别人安装,那就考虑 Plugin。

可以这样判断:

  1. 只沉淀工作流:Skill
  2. 要打包分发一组能力:Plugin

不要一开始就做 Plugin。

先把 Skill 用顺。

等它真的稳定,再考虑打包。


十六、我的建议路线

如果你第一次做 Codex Skills,可以按这个顺序来:

  1. 1.先用 prompt 跑三次
  2. 2.记录重复步骤
  3. 3.写一个 instruction-only Skill
  4. 4. description 写具体
  5. 5.显式调用测试
  6. 6.改到不误触发
  7. 7.需要稳定输出时,再加脚本
  8. 8.团队要共享时,再考虑Plugin

这条路线慢一点。

但不会一上来就陷进配置和打包里。

大多数个人工作流,从一个干净的 SKILL.md 开始就够了。


总结

Codex Skills 解决的不是“怎么让 Codex 多一个按钮”。

它解决的是:

  1. 怎么让同一类任务下次还能按同一套方法做。

新手先记住几个判断:

  1. 一次性任务,用 prompt
  2. 当前入口,用Command
  3. 外部工具,用 MCP
  4. 定时任务,用Automation
  5. 可复用流程,用Skill
  6. 打包分发,用Plugin

写 Skill 时,别一上来就做得很大。

先让它专心做好一件小事。

用一阵子你会发现,省时间的往往不是某个特别厉害的 prompt。

而是把重复劳动一点点沉淀成稳定流程。