Codex skills 怎么写自己的工作流?最简单的理解是:把你反复复制粘贴给 Codex 的那套操作说明,整理成一个可以被 Codex 自动发现、按需读取、可长期维护的 SKILL.md。
如果只是一次性任务,直接在提示词里说清楚就行。只有当一个流程会重复出现,步骤相对固定,且经常需要读取同类文件、运行同类命令、产出同类结果时,才值得写成 skill。
官方文档对 skills 的定位很明确:skill 是一个目录,里面必须有 SKILL.md,可以附带 scripts/、references/、assets/ 等资源。Codex 会先看 skill 的 name 和 description 做发现,真正决定使用时才读取完整 SKILL.md。这意味着,写 skill 的关键不是把所有知识塞进去,而是让 Codex 能在正确场景选中它,并在选中后按稳定步骤执行。
快速结论
一个好用的 Codex skill,通常满足四点:
description写清楚“什么时候用”,不要只写“这是一个工具”。SKILL.md写流程、边界、输入、输出和验证,不要写成散文。- 长资料放进
references/,重复命令放进scripts/,模板放进assets/。 - 每次修改后用真实任务跑一遍,确认 Codex 会在该用的时候选中,也不会在不该用的时候误触发。
可以先从一个很小的 skill 开始,例如:
|
|
真正适合写成 skill 的,不是“知识点”,而是“可重复执行的工作方式”。
Skill、AGENTS.md、Hooks、MCP 分别放什么
写 skill 前,先别急着建目录。很多混乱来自放错位置。
| 需求 | 更适合放哪里 |
|---|---|
| 当前这次任务的临时要求 | 直接写在提示词里 |
| 仓库长期编码规范、测试命令、提交要求 | AGENTS.md |
| 一套可复用的任务流程 | Skill |
| 工具调用前后必须执行的机械规则 | Hook |
| 访问外部系统、数据库、私有服务 | MCP server 或 app connector |
| 定时检查、周期性报告 | Automation |
| 安装给别人复用的一整套扩展 | Plugin |
例如“每次改完代码都必须跑格式化”更像 hook;“审查 PR 时按安全、边界条件、测试缺口输出 findings”更像 skill;“这个仓库默认用 pnpm,不要用 npm”更像 AGENTS.md。
不要把 skill 写成万能说明书。它应该有一个明确任务。
最小目录结构
一个最小 skill 可以只有一个文件:
|
|
稍微完整一点,可以这样:
|
|
常见分工是:
SKILL.md:入口说明,必须简洁,告诉 Codex 何时使用、怎么执行、怎么验证。references/:较长背景、规则表、范例、领域资料。只有需要时再读。scripts/:稳定可重复的命令,避免让 Codex 每次手写长脚本。assets/:模板、样例文件、提示词片段、报告格式。
如果 skill 很小,不要为了“看起来专业”强行拆目录。先让 SKILL.md 工作起来。
SKILL.md 的基本模板
可以从这个模板开始:
|
|
真正写的时候,不一定每个标题都要保留,但这几个问题都要回答。
description 是最重要的一行
很多 skill 不好用,是因为 description 太虚。
不好的写法:
|
|
Codex 很难判断什么时候该用它。
更好的写法:
|
|
这行应该包含:
- 触发场景;
- 输入类型;
- 输出类型;
- 关键边界。
如果 skill 名字很短,description 就更要具体。
把提示词改成流程,而不是照搬
很多人第一次写 skill,会把过去常用的一大段提示词直接复制进去。这能用,但不稳定。
提示词通常是一次性对话:
|
|
Skill 应该改成流程:
|
|
这样 Codex 更容易执行,也更容易复查。
什么时候拆 references
SKILL.md 不适合无限变长。下面几类内容更适合放进 references/:
- 很长的风格指南;
- 大量示例输出;
- 术语表;
- API 字段说明;
- 评分规则;
- 多语言翻译对照;
- 复杂业务规则;
- 不一定每次都要读的背景资料。
SKILL.md 里只写路由:
|
|
这样可以减少上下文浪费。Codex 官方文档里也强调了 progressive disclosure:先看元数据,选中 skill 后再按需读取完整说明和附加资源。
什么时候写 scripts
只要某个步骤稳定、机械、容易写错,就适合脚本化。
适合放进 scripts/ 的例子:
- 扫描文件并生成清单;
- 校验 front matter;
- 把 JSON 转成 Markdown 表格;
- 下载固定来源的数据;
- 跑固定构建命令;
- 批量转换图片;
- 检查链接、slug、日期、语言文件。
不适合脚本化的例子:
- 需要判断文章角度;
- 需要代码审查;
- 需要选择方案;
- 需要根据上下文写解释;
- 需要和用户确认风险。
一个好习惯是:让 Codex 判断和组织,让脚本做机械执行。
示例:写一个周报 skill
假设你经常让 Codex 根据 Git 提交和工作记录写周报,可以建一个 skill:
|
|
SKILL.md 可以这样写:
|
|
这个 skill 的重点不是“会写周报”,而是固定了:先确认范围、优先用户资料、可选 Git 汇总、按主题分组、不能编造成果。
示例:写一个代码审查 skill
代码审查更适合写成流程,因为输出格式和关注点都很固定。
|
|
这个 skill 可以让 Codex 每次 review 都保持同一种姿势,而不是一会儿像导师,一会儿像 lint 工具,一会儿又直接帮你改代码。
示例:写一个博客发布 skill
站点内容工作也很适合 skill,因为它通常有固定规则:目录编号、front matter、语言文件、构建检查、提交边界。
|
|
这类 skill 的收益很大:它能防止“写错目录”“改错语言”“误改 slug”这类低级但代价很高的问题。
测试自己的 skill
写完 skill 后,不要只看 Markdown 漂不漂亮。要测三件事。
第一,能不能被选中。
你可以直接在提示词里显式调用:
|
|
也可以用自然语言测试:
|
|
如果自然语言任务经常触发不到,通常是 description 写得不够具体。
第二,选中后步骤是否够清楚。
观察 Codex 是否会:
- 先检查状态;
- 读取正确文件;
- 调用正确脚本;
- 遵守“不该做什么”;
- 给出符合预期的最终报告。
第三,会不会误触发。
如果一个普通问答也触发 skill,说明 description 太宽,或者 skill 名字太泛。把触发条件写窄一点。
常见错误
把 skill 写成百科
Skill 不是知识库。它应该告诉 Codex 怎么做事。背景资料可以放 references,入口文件保持短而清楚。
description 只有关键词
只写 “Codex, workflow, automation” 没有用。Codex 需要知道什么时候用、输入是什么、输出是什么。
没有完成标准
如果 skill 没写验证步骤,Codex 很容易“做完就说做完”。至少要写清楚如何检查文件、命令、格式或结果。
脚本太危险
不要在 skill 脚本里默认做删除、覆盖、发布、付费调用、批量重命名。高风险动作应该先确认,或者放到单独 skill 里。
所有流程都写成一个 skill
“我的万能工作流”通常很难维护。更好的方式是拆成几个小 skill:写文章、翻译、部署、SEO、代码审查、周报,各管一件事。
维护建议
Skill 写完以后,也要像代码一样维护。
建议每次踩坑后只改一小处:
- 如果 Codex 没选中,改
description。 - 如果 Codex 选中了但步骤不稳,改
Workflow。 - 如果输出格式不稳定,补
Reporting或模板。 - 如果经常手写同一段命令,抽到
scripts/。 - 如果
SKILL.md太长,把背景拆到references/。
不要一次性把所有规则塞进去。Skill 越像一份可执行操作规程,越容易长期可用。
参考资料
- OpenAI Developers:Agent Skills:https://developers.openai.com/codex/skills
- OpenAI Developers:Save workflows as skills:https://developers.openai.com/codex/use-cases/reusable-codex-skills
- OpenAI Developers:Codex customization:https://developers.openai.com/codex/concepts/customization
- OpenAI Developers:Codex best practices:https://developers.openai.com/codex/learn/best-practices
总结
Codex skills 不是把提示词换个地方保存,而是把一套可重复工作流变成可发现、可执行、可验证的项目资产。
先从一个小流程开始:写清楚触发条件,列出输入和输出,把步骤拆成编号,把风险边界写明,把机械动作交给脚本,把长资料放到 references。测试时重点看三件事:该用时能不能选中,选中后能不能按流程做,不该用时会不会误触发。
当一个 skill 能让你少重复解释一次流程、少犯一次目录或命令错误,它就已经值得存在。