从一次对话学会生成 Codex Skill
jerry2 CTO

这篇文章是对一次真实 Codex 协作过程的复盘。

最开始,我只是想创建一个“写博客并一键部署”的 Skill。真正做下来以后,才发现这个需求并不只是写一段提示词,而是要把写作、配图、构建、预览、源码保存、静态页面部署这些动作串成一条可靠的发布流水线。

这也是我对 Skill 最重要的理解:

Skill 不是让 AI 记住几句口号,而是把一次真实任务里的项目经验、操作顺序和风险边界沉淀下来。

从一次对话生成 Codex Skill 的流程


一、需求从一句话开始

最初的需求很简单:

我现在需要创建一个写博客并一键部署的技能。

如果直接让 AI 写一个 Skill,很容易得到一份很泛的说明,比如“帮用户写高质量博客”“遵循最佳实践”“部署前检查”。这些话没有错,但对真实项目帮助有限。

因为这个博客项目有自己的上下文:

  • 它是 Hexo 博客
  • 文章放在 source/_posts/
  • 图片资源有项目内约定
  • 部署页面用 GitHub Pages
  • 源码仓库和页面仓库不是同一个
  • 部署前必须让用户预览确认

所以第一步不是写 Skill,而是先观察项目。


二、先从项目事实里提炼规则

在当前仓库里,几个文件给出了关键线索:

1
2
3
4
5
6
7
package.json
_config.yml
push.sh
run.sh
source/_posts/
source/images/
skills/

package.json 说明了基础命令:

1
2
3
4
5
6
7
8
{
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
}
}

push.sh 说明了已有部署习惯:

1
hexo clean && hexo g && hexo d

_config.yml 说明这是 Hexo 6 项目,文章目录是 source/_posts/,并且配置了 GitHub Pages 部署仓库。

这些信息决定了 Skill 不能写成通用博客助手,而应该写成当前项目专属的发布助手。


三、先计划,再实现

在写 Skill 之前,先确认了几个关键决策:

  • Skill 放在当前仓库的 skills/ 目录
  • 默认服务这个 Hexo 博客,而不是全局泛用
  • 写作采用“先大纲后成文”
  • 部署不能自动跳过确认
  • 一键部署也必须保留安全门槛

于是创建了:

1
2
skills/hexo-blog-publisher/SKILL.md
skills/hexo-blog-publisher/agents/openai.yaml

SKILL.md 的 frontmatter 负责让 Codex 知道什么时候触发它:

1
2
3
4
---
name: hexo-blog-publisher
description: Use when writing, drafting, polishing, previewing, building, or deploying posts for this repository's Hexo blog...
---

这里的 description 很关键。它不是给人看的宣传语,而是给 Codex 判断“这个请求是否应该加载该 Skill”的触发条件。


四、第一版 Skill 做对了什么

第一版 Skill 已经包含了几个正确方向:

  • 写博客前先确认标题、大纲和标签
  • 新文章默认放到 source/_posts/
  • frontmatter 使用 titledatetags
  • 修改文章后运行 npm run build
  • 部署前需要用户明确确认
  • 部署命令使用 hexo clean && hexo g && hexo d

这已经比普通提示词可靠很多。

但真正执行一次完整流程后,问题也暴露出来了。


五、真实执行时暴露的问题

1. 图文结合应该更早进入流程

第一次写文章时,我先生成了纯文字版本。后来提醒“最好图文结合”,才补了一张流程图。

这说明 Skill 里应该提前考虑内容形态。对于教程、复盘、流程类文章,配图不是装饰,而是帮助读者理解结构的关键部分。

2. 图片目录不能只凭 Hexo 配置判断

项目里虽然开启了 post_asset_folder: true,但实际构建时,文章同名 .assets 目录里的 SVG 被插件改成了异常路径:

1
/.top//codex-skill-workflow.svg

构建本身没有失败,但生成后的页面图片路径是错的。

最后改成把图放在:

1
source/images/codex-skill-workflow.svg

并在文章里引用:

1
![从一次对话生成 Codex Skill 的流程](/images/codex-skill-workflow.svg)

这才通过了 HTML 和资源检查。

这件事提醒我:Skill 里的规则不能只看配置文件,还要吸收真实执行中的反馈。

3. 部署前应该先预览

第一次执行“一键部署”时,虽然构建通过,也成功发布到了 GitHub Pages,但顺序并不理想。

更正确的顺序应该是:

1
写文章 -> 加图 -> 构建 -> 检查 HTML 和图片 -> 本地预览 -> 用户确认 -> 提交源码 -> 部署页面

也就是说,用户应该先看到本地预览,再决定是否提交和部署。

4. 部署页面不等于保存源码

Hexo 部署到 GitHub Pages 的仓库里,保存的是生成后的静态页面。真正可维护的内容是当前源码仓库里的:

  • Markdown 原文
  • 图片源文件
  • Skill 文件
  • Hexo 配置
  • 主题和脚手架

所以发布完成不能只看 GitHub Pages 是否更新。源码仓库也必须提交并推送,否则以后就只剩线上页面,没有可维护源头。


六、Skill 被迭代成发布 Runbook

根据这些问题,hexo-blog-publisher 被继续优化,不再只是“写作和部署说明”,而是变成了一份发布 Runbook。

它现在的核心流程是:

1
2
3
4
5
6
7
8
9
写作/改稿
-> 配图
-> npm run build
-> 检查生成 HTML 和图片资源
-> 本地预览
-> 用户确认
-> 提交并推送源码仓库
-> 部署 GitHub Pages
-> 检查源码仓库 git status

这个顺序里最重要的是两个门槛:

  • 预览确认前,不提交源码
  • 源码保存前,不把发布视为完成

七、区分源码仓库和页面仓库

这次实践里,一个很关键的认知是:博客发布至少涉及两个仓库。

源码仓库是当前博客项目,远端在公开文章里应该脱敏成类似这样的占位:

1
https://example.com/<user>/<blog-source-repo>.git

它保存的是可维护内容。

GitHub Pages 仓库是 Hexo 生成后的静态站点仓库,公开记录时也不应该暴露真实账号和仓库名:

1
git@example.com:<user>/<pages-repo>.git

它保存的是部署产物。

两者角色不同:

仓库 保存内容 作用
源码仓库 Markdown、图片、Skill、配置 后续维护和继续写作
GitHub Pages 仓库 HTML、CSS、JS、静态资源 对外访问的网站

只有两个仓库都处理完,发布才算闭环。


八、最终的完成定义

优化后的 Skill 里加入了 Done Definition。

一次博客发布只有同时满足这些条件,才算完成:

  • 文章已经本地预览
  • 用户明确确认预览没问题
  • 源码变更已经提交并推送
  • GitHub Pages 静态页面部署成功
  • 当前源码仓库 git status --branch --short 是干净的
  • 最终回复里报告源码 commit 和部署结果

这个完成定义很有用。它让“一键部署”不再只是一个命令,而是一条有收尾检查的流程。


九、我学到的 Skill 生成方法

这次过程可以总结成一个通用方法:

  1. 不要直接空写 Skill,先观察项目
  2. 从真实配置、脚本、目录结构里提炼事实
  3. 先把用户目标拆成流程
  4. 明确哪些动作可以自动做,哪些动作必须确认
  5. 做一次真实任务,让问题暴露出来
  6. 把踩坑结果反向写回 Skill
  7. 给 Skill 加完成定义,而不只是操作步骤

一个好的 Skill 应该不断吸收实战反馈。

如果第一次生成的 Skill 只是“能用”,第二次迭代后的 Skill 才开始变得“可靠”。


十、当前这套博客发布 Skill 的价值

现在这个 Skill 能解决的不只是“帮我写文章”。

它真正沉淀的是一套博客发布习惯:

  • 写之前先确认方向
  • 教程类文章优先考虑图文结合
  • 图片放到当前项目已验证的 source/images/
  • 构建后检查 HTML 和资源
  • 发布前先本地预览
  • 预览后等用户确认
  • 保存源码仓库
  • 再部署 GitHub Pages
  • 最后检查源码状态

这套流程比单纯的“hexo d”慢一点,但更稳。

尤其是当 AI 可以直接读写文件、执行命令、推送远端时,慢一点的确认门槛反而是必要的。


总结

这次从一句“创建一个写博客并一键部署的技能”开始,最后得到的不只是一个 hexo-blog-publisher Skill,而是一套经过真实发布验证的工作流。

我最大的收获是:

Skill 的价值不在于把提示词写长,而在于把项目事实、执行顺序、失败经验和完成标准写清楚。

当这些内容沉淀下来,下一次再写博客、预览、提交源码和部署页面,AI 就不会只是“帮忙执行命令”,而是能按这个项目真正需要的方式完成整套闭环。

 评论