把博客 Skill 从提示词模板改造成一键端到端工作流

摘要:把博客 Skill 从「复制提示词模板」重写为「一句话触发、一次产出三份文件、确认后推送」的端到端流程,拆解三文件结构、50-80 字摘要规范与只 add 指定文件的推送脚本设计。


0. 结论先行

Skill 不该是一段需要手动复制的提示词模板,而该是一段内建了完整工作流的可执行指令。

改造前,我的博客 Skill 把「生成博客」做成了「复制 references/blog-prompt.md 提示词模板发给 Agent」;改造后,我只说一句「把刚才这段对话整理成博客」,它就会自动完成提炼、产出三份文件、等我确认后 git push 到 Netlify。

1. 前置准备

说明
CodeBuddy Skill 机制 会读 SKILL.md 作为技能入口,触发即执行
Python 3 跑推送脚本 publish_blog.py,需健康解释器
Git D:\Blog 仓库,远程 github、分支 main

环境坑:本机系统默认 Python(3.13.3)损坏,跑脚本报 SRE module mismatch,必须用 uv 管理的 3.12.13 解释器。

2. 问题:提示词模板为什么不够

之前的博客产出流程是:Skill 检测到「整理成博客」意图 → 让用户复制 blog-prompt.md 里的提示词 → 用户把模板粘给 Agent → Agent 按模板生成。

这个流程有三个毛病:

毛病 具体表现
多一步手动操作 用户要自己复制、粘贴模板,不是「一句话触发」
模板与 Skill 脱节 模板放在 references 里,Skill 主流程不直接执行
产物不完整 只出 Obsidian 博客 + 发布清单,没有 Hexo 个人博客,也没有自动推送

核心矛盾:模板是给「人」看的,Skill 是要「机器」直接执行的。 把给机器执行的流程写成给模板,等于把工作推回给了用户。

3. 目标:一次产出三份文件

改造后的博客 Skill,一次运行产出三份文件:

# 文件 路径 用途 front-matter
1 Obsidian 正式博客 08-博客/001-博文/NN.标题.md CSDN 等平台发布 tags/created/updated,正文保留 wikilink
2 发布清单 08-博客/001-博文/NN.标题.发布清单.md 发布前核对 无,含标签 + 摘要 + 封面图
3 Hexo 个人博客 source/_posts/NN.标题.md 个人网站 title/tags/categories/date/description,去 wikilink

两个版本的 front-matter 差异是踩过的坑:Obsidian 版用 created/updated 且保留 wikilink,Hexo 版用 title/date/description 且必须去掉 wikilink,否则 Hexo 渲染会出错。

4. 三个关键设计决策

4.1 摘要长度:50-80 字

发布清单和 front-matter 里的摘要,统一为 50-80 字、不超过 100 字。旧规范写的是 100-150 字,太长——CSDN 摘要栏放不下,读者也没耐心看。于是把 templates.mdwriting-rules.mdblog-prompt.md 里的旧描述全部改成 50-80 字。

4.2 推送时机:确认后才执行

推送是不可逆操作,所以做成硬性规则:三份文件生成后必须停下,展示路径和推送预览,等用户说「确认」才执行 git commit + push。绝不自动 push。

4.3 序号续接:两边独立

Obsidian 目录和 Hexo 目录的博客序号不同步(Obsidian 现在最大 9、Hexo 最大 8),所以序号要各自数、各自 +1。这个细节容易出错——如果共用一个序号,下一篇就会撞号。

5. 实现:把工作流写进 SKILL.md

核心改动是在 SKILL.md 里新增「博客一键工作流」专节,四步:

1
2
3
4
第 1 步:提炼 —— 从对话提取知识点、代码、踩坑、结论
第 2 步:生成三份文件 —— 一次写完,序号各自续接
第 3 步:停下确认 —— 展示三份文件 + 推送预览,等确认
第 4 步:确认后推送 —— 运行 publish_blog.py

同时删掉了旧的「博客生成提示词」小节——它正是「让用户复制模板」的根源。

6. 推送脚本 publish_blog.py 的设计

推送脚本只做三件事:git add 指定文件git commitgit push origin main

关键设计是只 add 指定的那篇博客文件,绝不 git add .。因为 D:\Blog 仓库里混着 db.json、日志、public/ 等未跟踪文件,git add . 会把它们一起提交上去。

1
2
3
4
# 核心逻辑:只提交指定的博客文件
subprocess.run(["git", "add", blog_file], cwd=BLOG_REPO, check=True)
subprocess.run(["git", "commit", "-m", commit_msg], cwd=BLOG_REPO, check=True)
subprocess.run(["git", "push", "origin", "main"], cwd=BLOG_REPO, check=True)

7. 验证与收尾

改造完成后做了两层验证:

  • 两个脚本 ast.parse 语法检查通过、lint 0 错误。
  • 用健康 Python 解释器(uv 的 3.12.13)跑通,避开本机损坏的系统 Python。

整次改造动了 7 个文件:SKILL.mdtemplates.mdwriting-rules.mdblog-prompt.mdpublish_blog.py(新建)、blog_publisher.pyREADME.md