写完这一套之后,我最大的感受是:很多 Agent 项目跑不好,关键经常卡在任务拆分上,模型被迫一次处理太多东西。

前面几篇已经把 Idea2Site 的各个 skill 都拆开讲了。

这篇做一个总结,主要记录一下我在写这套 skill suite 时觉得比较有价值的几个工程经验。

我想从更工程的角度回头看这个项目:它到底提供了哪些经验?哪些设计可以迁移到其他 Agent 项目?

1. 第一条经验:先把模糊任务拆出问题形状

用户说:

帮我做一个个人博客。

这句话看起来像建站请求,但其实里面包含很多未决问题。这里如果不先拆,后面基本会乱。

  • 是博客、作品集、研究主页还是数字花园?
  • 视觉方向是什么?
  • 有没有参考网站?
  • 有没有用户信息?
  • 有没有文章?
  • 是否需要发布?
  • 发布到哪里?
  • 是从零生成,还是改已有站点?

Agent 直接进入实现层时,就会被迫自己脑补。脑补得好还行,脑补错了就会生成一个完全不像用户的网站。

所以 Idea2Site 前面加了:

search-blog-theme
find-style-references

先把方向从模糊变具体,再开始建站。

这个思路可以迁移到很多任务。

有些任务适合先把问题形状处理一下。

有些任务应该先做方向澄清、参考研究、约束建模。

2. 第二条经验:skill 的边界比 skill 的能力更重要

一个 skill 如果什么都能做,看起来很强,实际很危险。这个项目里我最大的一个体会就是:边界比能力更重要。

比如如果 make-personal-site 既负责选主题、又负责复刻网站、又负责导入文章、又负责发布,那它最后会变成一个很长的提示词,边界模糊。

Idea2Site 里每个 skill 都有明确边界:

search-blog-theme:主题方向
find-style-references:真实参考和设计 brief
make-personal-site:原创静态站
copy-website-style:体验语言复刻
personalize-site:身份和 metadata 替换
add-blog-posts:沿用现有文章系统导入内容
edit-site-part:局部修改
review-static-site:交付前检查
publish-static-site:发布准备和部署路径

边界清楚之后,路由才可能稳定。否则每个 skill 都想顺手多做一点,最后会变成一团。

3. 第三条经验:每个 skill 都应该有 Contract

Idea2Site 里每个 skill 都有:

Inputs
Outputs
Boundaries
Success gate
If gate fails

我觉得这是一个很好的模式,也非常适合给 Agent 用。

因为它把一个 skill 从“能力描述”变成了“工作协议”。

比如:

review-static-site
Inputs:静态站根目录
Outputs:findings / fixes / pass-fail
Boundaries:检查静态站交付质量
Success gate:没有 blocker
If gate fails:路由到最小负责 skill

这比单纯写:

这个 skill 用来检查网站。

要强很多。

Agent 既知道“干什么”,也知道“什么时候算干完”和“干不完该怎么办”。这比单纯写一堆规则要稳定很多。

4. 第四条经验:质量门禁要尽量确定性

纯靠模型检查很容易漏。尤其是路径、编码、placeholder、隐私文件这种东西,模型看一遍很难保证全覆盖。

比如:

请检查有没有路径错误。
请检查有没有乱码。
请检查有没有隐私文件。

模型可能会看一部分文件,然后说没问题。

但是路径、编码、placeholder、secret-like string、root-absolute path 这些东西,其实很多可以用脚本查。

所以 Idea2Site 加了:

review-static-site/scripts/static_site_check.py

这个脚本会检查:

  • UTF-8;
  • mojibake;
  • missing charset;
  • broken href/src/css url;
  • root-absolute local path;
  • placeholder;
  • forbidden strings;
  • privacy-sensitive files;
  • secret-like assignments;
  • local absolute paths;
  • temp artifacts;
  • inferred page types;
  • EDITING.md

这给了整个系统一个确定性底座。这个底座很重要,因为它能帮我们把一部分“凭感觉”的检查变成程序检查。

我觉得 Agent 工程里一个很重要的原则是:

程序能检查的,就交给程序。

模型适合判断、生成、归纳、修复。

脚本适合重复、严格、无聊但关键的检查。

两者结合才稳。

5. 第五条经验:路径策略要尽早统一

静态网站路径问题看起来小,但它贯穿所有 skill。这个问题真的很容易低估。

make-personal-site 要生成正确路径。

copy-website-style 要把 framework/root route 转成静态相对路径。

personalize-site 替换头像和链接时要保持路径正确。

add-blog-posts 生成 nested article 时要计算 ../ 深度。

edit-site-part 改链接或图片时也要保持路径策略。

review-static-site 要检查路径。

publish-static-site 发布前还要确认路径在目标平台上稳定。

所以 Idea2Site 统一选择:

默认 page-relative path。
本地资源统一写相对路径。

这条规则虽然保守,但对普通静态个人站很适合。它能少掉很多发布之后才发现的 404。

因为它同时支持:

  • 直接打开 index.html
  • 本地 HTTP;
  • 静态托管根路径;
  • GitHub Pages 子路径;
  • 任意子目录。

我觉得这类底层约定一定要早定。

否则每个 skill 都按自己的习惯写路径,最后 review 会到处报错。

6. 第六条经验:生成结果要为下一次 Agent 修改服务

EDITING.md 是这个项目里一个很小但很有用的设计。我一开始只是想给后续修改留点说明,后来发现它其实很关键。

它面向未来用户或未来 Agent。

它应该记录:

  • 目录结构;
  • 页面地图;
  • 首页每个区域在哪里;
  • 文章模板在哪里;
  • 数据放在哪里;
  • 颜色变量在哪里;
  • 导航怎么改;
  • 项目怎么加;
  • 哪些内容是 placeholder;
  • 哪些路由被省略;
  • 哪些交互被简化。

这样下一次用户要改网站时,可以直接接着已有结构继续做。

我觉得这代表了一种 Agent 友好的产物设计。

完成当前任务的同时,也要让未来任务更容易完成。

7. 第七条经验:复刻网站要复制“体验语言”,避开网站本体搬运

copy-website-style 里很强调:

复制风格和交互模式。
代码、资产、个人身份、文章和 analytics 留在原站。

这点很重要。

因为用户说“复制这个网站”,很多时候真正想要的是:

  • 它的排版节奏;
  • 它的导航方式;
  • 它的文章列表风格;
  • 它的动效感觉;
  • 它的页面组织。

需要留在原站的东西:

  • 原作者的头像;
  • 原作者的文章;
  • 原站的域名;
  • 原站的统计代码;
  • 原站的代码 bundle;
  • 原站的私有内容。

所以要先做 signature inventory,再重写一个干净版本。

这个思路也可以迁移到别的“模仿”类任务。很多时候我们真正要学的是结构和体验,源对象本身留在原处。

真正要抽象的是结构和体验,避免把源对象搬过来。

8. 第八条经验:发布是高风险动作,默认要保守

publish-static-site 里最重要的是远程安全,平台教程只是其中一部分。

它反复强调:

  • push 需要明确授权;
  • 创建仓库需要明确授权;
  • 部署需要明确授权;
  • 绑定域名需要明确授权;
  • 修改 DNS 需要明确授权;
  • 本地路径问题先修;
  • 私密文件先排查;
  • 发布前先 review。

我觉得这是所有 Agent 发布/部署类技能都应该有的原则。生成阶段可以大胆一点,发布阶段一定要保守。

因为部署是外部状态改变。

本地文件写错了还能改。

一旦 push、上传、公开,就可能造成实际影响。

所以发布层必须比生成层更谨慎。

9. 第九条经验:编排层应该追求最短可靠路径

有了 11 个 skill 之后,一个诱惑是每次都把它们全跑一遍。

但这是不对的。

用户已有站点只是加文章,就不需要重新找主题。

用户只是改一个 section,就不需要重新 personalize。

用户只是发布,就不需要重新建站。

所以 from-idea-to-personal-sitebuild-personal-site 的核心是:

根据当前输入和目标,选择最短可靠路径。

这比“完整流水线”更重要。

好的编排会知道什么时候跳过。全跑一遍看起来完整,但很多时候会浪费上下文,还可能把已有东西改坏。

10. 第十条经验:失败后要路由到最小负责模块

这个项目的 gate loop 也很值得总结。

review 失败后,先看失败类型。

要看失败类型:

路径错 -> edit-site-part / make-personal-site
身份残留 -> personalize-site
文章图片错 -> add-blog-posts
复刻不像 -> copy-website-style
方向不清 -> search-blog-theme / find-style-references
发布设置错 -> publish-static-site

这就像一个多模块系统里的故障定位。哪里坏了回哪里修,避免一出问题就重做整站。

每个 bug 都回到最小负责模块,避免全局重启。

这会减少破坏用户已有内容的概率。

11. 这个项目还可以继续怎么演进

现在 Idea2Site 已经有一套比较完整的 skill suite,但我觉得后续还可以继续扩展。

11.1 更强的视觉 QA

现在 review 里有浏览器验证要求,但如果能进一步做截图对比、移动端布局检测、文字溢出检测,会更稳。

尤其是 copy-website-style,可以做 target/local 对比评分。

11.2 更结构化的文章导入测试

add-blog-posts 支持很多富内容,但可以补更多 fixtures:

  • Obsidian wikilinks;
  • math-heavy post;
  • image-heavy post;
  • old HTML import;
  • footnotes/citations;
  • Mermaid/Excalidraw。

这样每次修改 skill 都能验证不退化。

11.3 更完整的 publishing dry-run

发布前可以加入更多 dry-run 检查:

  • deploy root size;
  • robots/sitemap;
  • OG image;
  • canonical URL;
  • GitHub Pages 子路径模拟;
  • Cloudflare Pages output directory 检查。

11.4 更好的 style reference memory

search-blog-themefind-style-references 可以沉淀一些高质量风格参考库。

目的是让 Agent 对个人站审美有更多真实样本。

11.5 更强的 EDITING.md 标准化

未来可以把 EDITING.md 的结构进一步标准化,让后续 skill 更容易解析。

比如固定记录:

Page Map
Content Sources
Style Tokens
Post System
Path Rules
Known Placeholders
Validation Notes

这样下一轮 Agent 可以更快进入状态。

12. 总结

Idea2Site 的核心可以概括为更完整的 Agent 建站工程。

这个说法太泛了。

我更愿意把它理解成:

把一个模糊的个人建站请求,拆成一套可路由、可验证、可修复、可发布的 Agent Skill Suite。

它解决的是整个链路问题,单次生成只是其中一环:

方向
参考
建站
复刻
个性化
文章导入
局部编辑
质量门禁
发布
编排

每个环节都可以独立优化,每个失败都可以回到对应模块,每次交付都可以经过 review。

这就是我觉得它值得写成项目博客的原因。

它处理的是一个很实际的问题:

当用户把一个模糊愿望交给 Agent 时,
我们如何把它变成可靠的工程结果?

Idea2Site 给出的答案是:

别把方案收敛到一个更大的 prompt。
拆 skill。
写 contract。
加 gate。
做 review。
保守发布。
让产物能被下一次 Agent 继续维护。

这套经验不只适用于个人博客。

它也适用于很多 Agent 工程任务。

凡是用户目标模糊、流程多阶段、结果需要验证、失败需要修复的场景,都可以用类似方式去拆。

这也是这个项目对我最有启发的地方。