22 小时三个模块:我用 Claude Code 把博客从文章站改成 AI 信息站
✨文章摘要(AI生成)
2026-09-21 14:00 到 09-22 12:26,我用 Claude Code 在 22 小时里给这个 VitePress 博客加了三个内容模块:AI 动态(/news,主源外链+一句话点评)、模型竞技场(/arena,固定 8 题库 × 多模型逐字对答)、产品体验(/products,时间流体验日志+站内文章),6 个功能提交、测试从 31 涨到 45 全绿、本地构建逐次验证后推送 release 上线。本文拆解让这件事变快的真正原因——一个重复四次的「四件套」架构(数据 TS 文件 + 纯函数 utils + md 页面 + 录入 skill),以及比代码更难的部分:诚实规则(答案逐字照录、绝不代写、模型名如实标注)和关卡式工作流。结论:我的角色从写代码的人变成了把关的人,而这才是 AI 时代个人站该有的迭代速度。
引子:「我觉得是核心哎」
9 月 21 日下午,我盯着自己的博客首页看了十分钟,越看越不对劲:一个挂着「经济学在读、AI 产品经理实习」招牌的个人站,居然没有任何 AI 内容的更新流——最新一篇文的日期停在八月中旬。
于是我跟 Claude Code 说:「想加一个最近 AI 模型和产品动态……我觉得是核心哎,你帮我看看怎么扩展。」
第二天中午 12:26,最后一个提交推送完毕。从 09-21 14:00 第一个模块提交(5c99dd5)到 09-22 12:26 发布 skill 沉淀(2e1f47c),22 小时 26 分钟,6 个功能提交,三个内容模块全部上线:AI 动态 /news、模型竞技场 /arena、产品体验 /products,外加一套录制工作流和发布管线文档,45 个测试全绿。
先给一句话结论:这次变快的根本原因不是模型聪明,而是第二次造轮子时套路已经定型——我的角色从「写代码的人」变成了「把关的人」,把关比写代码舒服,也更重要。

一、三个模块,一个套路
三个模块需求是分三次提出的,而且一次比一次随意——第一次正经做了产品决策问卷,第三次只有一句「想再加个最新的 AI 产品/产品体验」。但实现速度反而一次比一次快,因为第二个模块开始,架构就固定成了四件套:
| 组件 | 是什么 | 例子 | 一句话 |
|---|---|---|---|
| 数据文件 | 纯 TS 模块,schema + 数据 | theme/news.ts | 单一事实源,Claude 更新它,页面读它 |
| 纯函数 utils | 排序/分组/标签 | utils/newsList.ts | 无副作用,node:test 直接测 |
| md 页面 | VitePress 路由 = 文件 | docs/news.md | 列表写 md 里,双语镜像各一份 |
| 录入 skill | 触发词 + 关卡流程 | ai-news-updater | 把「怎么更新」变成一句中文指令 |
三模块对比:
| 模块 | 数据形态 | 入口 | 更新触发词 | 一句话 |
|---|---|---|---|---|
| AI 动态 | 事件流,50 条上限 | 首页区块 + 导航 | 「更新AI动态」 | 我搜集主源,你过目表格 |
| 模型竞技场 | 固定 8 题库 × 场次 | 导航 + 首页链接 | 「跑一轮竞技场」 | 同一套题,不同模型逐字对答 |
| 产品体验 | 时间流,体验/关注二分 | 导航 | 「记录产品体验」 | 感受必须你口述,绝不代写 |
这里有两个 VitePress 的坑值得记:一是列表必须写在 md 里而不是 Vue 组件,因为 aside 不会动态刷新(vuejs/vitepress#2686),仓库里 blog.md 留了注释,我照抄了;二是数据文件不能叫 *.data.ts,这个后缀被 createContentLoader 保留,命名错了会撞上构建工具的约定。
第二个模块开始,我的提问方式也变了。第一次我让 Claude 出方案、我从头选;第三次需求只有一句话,它照样先问了三个选择题(形态/入口/种子数据)——但那是产品决策,不是技术方案。实现环节已经完全在复用套路,连带测试和数据完整性断言一起,四十分钟出头交付。
二、竞技场:最难的不是代码,是诚实
模型竞技场的原始需求是「同一套提示词,不同模型出来答案,类似竞技场」。技术上一晚上就能写完,但真正花时间的是诚实规则——一个静态博客做模型横评,最大的风险不是没人看,而是被读者发现在编数据。
三条红线,每条都有机制兜底而不只是口头约定:
1. 答案逐字照录,绝不改写。 存进 arena.ts 的 answer 字段是模型原始输出,连标点都不动。用户粘贴的答案只允许去尾随空白。
2. 绝不代写没跑过的模型。 schema 里没有「空槽」概念——Gemini 没跑就缺席,不占位不虚构。
3. 模型名如实标注。 这条有个反直觉的细节:Claude Code 会话里的底层模型不一定是 Claude,skill 里专门写了规则「never assume the session model is Claude」——标签必须问过桥或配置才写。我们那场种子对决标注的是 GPT-5.6(Codex 桥自报)和 GLM-5.2(会话实际模型)。
防线也是三层:测试断言(tests/arena-list.test.mjs 校验题库唯一性、无重复模型+日期、枚举合法)→ skill 规则(原题字节级复制下发,不许手打)→ 关卡表格里展示完整逐字答案供人工否决。
种子场选了道逻辑题(谁打碎了花瓶),两家走出了完全不同的路:
| 模型 | 推理路径 | 篇幅 | 一句话 |
|---|---|---|---|
| GPT-5.6 | 穷举三种假设逐一验证 | 14 行 | 老实人的笨办法,滴水不漏 |
| GLM-5.2 | 抓乙丙互相矛盾,锁死唯一真话 | 6 行 | 取巧,但取对了巧 |
这恰好是竞技场想看的东西:同一个正确答案背后,模型的性格差异藏不住。
三、Skills 工作流:把关,不是审批
三个录入 skill(ai-news-updater、arena-recorder、product-recorder)长一个样:触发词 → 读现状 → 搜集/追问 → 表格关卡 → STOP → 确认后写入 → 自检 → 汇报。
关卡表格是整个工作流的核心。以「更新AI动态」为例,Claude 搜完主源后在对话里出一张表:日期、类型、标题中英、来源、链接、一句话点评中英——然后停住,一个文件都不碰。我扫一眼,删两条、改一句点评,回「确认」,它才动 news.ts。
两条规则让这个流程没有变成走过场:
- 内容关卡通过 ≠ 发布许可。 表格确认只授权改文件,push 到 release(= 生产部署)永远要单独一句「commit + push」。有一天我看完了表格说确认,然后去吃饭,回来发现一切安静——文件改好了,没推送,等我发话。这是对的。
- 代写红线写进 skill 而不是靠自觉。 product-recorder 里写着:experience 条目的感受「必须来自用户口述,可以追问,绝不代写;没有感受就先记 watch」。首篇产品文章(Claude 体验)就是这么来的——我确认的那版感受,其实基于这周真实发生的事:博客就是用 Claude Code 改的,git 历史可查。
有意思的是角色变化:三个 skill 都是我没预先设计的情况下,由 Claude 在实现模块时顺手提议并沉淀的。它发现每个模块都需要一条「以后怎么更新」的路径,于是第三次直接默认带上。工具在替我管理工具。
四、发布管线:从想法到 justin3go.com
最后一块拼图是把发布流程本身也写成 skill(site-publisher),因为「从文章到上线」这条路值得一条命令讲清楚:
docs/**/*.md + 主题代码
→ npm test / docs:build 本地验证(45 个测试兜底)
→ dev 分支 commit(feature 分支 --ff-only 并回)
→ git push origin dev:release
→ Cloudflare Pages 自动构建(跑的就是同一条 docs:build)
→ 几分钟后 justin3go.com 生效
两个细节让它几乎零心智负担:新页面零注册——VitePress 路由就是文件路径,cleanUrls 开着,sitemap 和 RSS 在构建时自动收集,加一个模块不需要在任何配置里登记;本地构建即部署预演——Cloudflare Pages 跑的和本地 docs:build 是同一条命令,本地过了线上就不会炸。
三天里的三次推送(ef9a558..5c99dd5..0f61c2d..2e1f47c)全部一次过,唯一一次构建失败是我自己写的 YAML frontmatter 里冒号没加引号——十秒修好,跟架构无关。
结论:好在哪、差在哪、谁该学
好在哪:
- 四件套套路可复制。 下次想加「论文速递」或「开源项目雷达」,照抄 news 模块的目录结构,四十分钟起步。
- 诚实有机制。 逐字照录、来源标注、关卡否决、测试断言——读者可以不信任我的判断,但可以信任数据没被美化。
- 迭代成本归零。 「更新AI动态」五个字,换回一次全站内容更新。
差在哪:
- 首页产品名是空态。 没有真实体验的产品不可点(这是设计出来的诚实),但访客第一眼会以为列表没做完。
- 英文镜像是债。 三模块的页面双语了,竞技场答案和产品文章还是中文独一份。
- 检索能力有限。 50 条新闻、8 道题、6 个产品之后,需要筛选和搜索,目前只有月份分组。
你该不该学这套: 你只是想写博客 → 不值得,WordPress 更省事;你在维护一个持续更新的内容站、且每天跟 AI 对话 → 强烈建议把「更新流程」也当成模块来设计,数据文件 + skill 触发词的组合,是把重复劳动变成一句话的唯一门槛。
尾声
写完这篇的时候,我又看了一眼博客首页。AI 动态区块里躺着六条主源新闻,竞技场里 GPT-5.6 和 GLM-5.2 各自的推理过程并排摆着,产品列表第一个名字终于变成了可点的链接。
三天前那句「我觉得是核心哎」,现在看确实是核心,只是核心不是那三个模块,是说出这句话的成本变得有多低。
本文全部数据来自本仓库 git 历史(5c99dd5..2e1f47c,2026-09-21 至 09-22)与本地测试记录(45 pass),可复现。