基于 AI Agent Skill 工作流,实现从想法到上线全链路零人工干预的站群批量生产系统
站群矩阵 (Site Farm) 的本质是用数量对冲不确定性:快速生产大量细分领域的小站,用数据筛选流量赢家,再集中资源放大盈利。
这是整个系统的核心设计:把建站流程编码为 Skill 文件,让 AI Agent 像执行 SOP 一样自主完成全部工作。
Skill 是一份 Markdown 协议文件(.cursor/skills/build-site/SKILL.md),定义了 AI Agent 执行任务的完整规则:输入要求、执行步骤、约束条件、输出格式。当用户说"新建一个站"时,Agent 自动加载这份协议并按序执行。
| 层级 | 文件 | 职责 |
|---|---|---|
| 全局上下文 | AGENTS.md |
项目定位、技术栈、目录结构、对话触发词 — 每次对话自动加载 |
| 执行协议 | SKILL.md |
10 阶段建站流水线的完整 SOP — 用户触发"建站"时按需加载 |
| 规格标准 | SITE-SPEC.md |
MVP 页面数/文章数/技术规格/设计标准 — 建站时参考 |
| 质量门禁 | CHECKLIST.md |
构建/SEO/性能/安全/合规/交互测试 共 40+ 项检查 — Review 阶段逐项执行 |
| 运营手册 | PLAYBOOK.md |
选品框架、变现阶梯、内容规范、止损规则 — 站点通过评估后参考 |
一次收料、全程自主、交付即上线。用户只需提供 5 项材料(领域/受众/域名/变现偏好/内容方向),AI 自主执行以下 10 个阶段:
new-site.sh 从模板生成项目骨架,或根据站点类型从零搭建(工具站/目录站)。复用工程配置(next.config、eslint、postcss)和基础设施组件(GA、AdSense、Cookie Consent、JSON-LD)deploy.sh --create:通过 Vercel API 创建项目 → 链接 Monorepo → 配置环境变量 → 触发生产部署check-site.sh 检查所有页面 HTTP 状态码、SEO 标签、文章可达性;执行 ping-search-engines.sh 通知 Google/Bing 抓取 sitemap每个脚本都是幂等的、可独立执行的,AI Agent 在流水线中按需调用:
| 脚本 | 用途 | 关键实现 |
|---|---|---|
new-site.sh <slug> <brand> <desc> |
博客型站点脚手架 | 复制 templates/starter/ → 全局替换占位符 (__SLUG__, __BRAND__) → npm install → 生成 PLAN.md 骨架 |
deploy.sh <站名> --create |
首次部署 | Vercel API 创建项目(设置 rootDirectory + gitRepository)→ 配置环境变量(SITE_URL, GA_ID, ADSENSE_ID)→ 触发部署 → Ping 搜索引擎 → 健康检查 |
deploy.sh <站名> |
更新部署 | git add + git commit + git push → Vercel 通过 Ignored Build Step 只构建有变更的站点 |
check-site.sh <站名> |
健康检查 | curl 检测所有页面状态码 + SEO 标签(title/description/OG/JSON-LD)+ 遍历 MDX 目录验证文章可达性 |
ping-search-engines.sh <站名> |
搜索引擎通知 | HTTP 请求 Google Ping API + Bing Ping API,附带 sitemap URL |
站群场景下,如果每站一个仓库,管理成本会随站点数量线性增长。Monorepo 方案:一个仓库管 7 个站,共享脚本和模板,推一次 git 就触发所有变更站点的自动部署。
每个站点在 Vercel 上是独立项目,通过 rootDirectory 指向 sites/<站名>/。关键配置:
| 配置项 | 值 | 作用 |
|---|---|---|
rootDirectory |
sites/aitoolpilot |
告诉 Vercel 构建入口在哪 |
gitRepository |
github-org/site-forge |
链接到 Monorepo 而不是独立仓库 |
commandForIgnoringBuildStep |
git diff --quiet HEAD~1 HEAD -- . |
只有该站点目录有变更时才触发构建,避免无关 push 浪费构建配额 |
sites/aitoolpilot/ 下的文件 → git push → Vercel 只构建 aitoolpilot,其他 6 个站不受影响。部署完全由 git push 触发,无需手动操作 Vercel 后台。
质量门禁分三层:静态检查 → 部署后健康检查 → 交互测试。
自动 curl 所有页面,验证 HTTP 200 + SEO 标签存在性 + 文章可达性,输出 pass/fail/warn 汇总。
通过 Playwright MCP 工具在真实浏览器中验证:Cookie 弹窗点击 → 导航跳转 → 移动端汉堡菜单 → 客户端组件水合。这层解决了"SSR 看起来正常但事件处理器未绑定"的隐性 bug。
新站 30 天内很难有大量点击,但"展示量"说明 Google 已经认为你和某些搜索词相关。展示量是流量的先行指标。
| Day 30 展示量 | 判定 | 行动 |
|---|---|---|
| > 500 | 赢家候选 | 进入加码期 → 规划 10-20 篇文章 + 申请 AdSense + 注册联盟 |
| 100-500 | 观望 | 再等 30 天,不追加内容,Day 60 提高标准到 > 1000 |
| < 100 | 大概率淘汰 | 停止投入,保留站点 90 天观察 |
| 0 | 直接砍 | Niche 不行,不用犹豫 |
Day 0 只配 GSC 验证,不配 GA4。原因:新站前 30 天几乎没有流量,GA4 的数据没有决策价值,反而增加部署复杂度。Day 30 筛出赢家后再配 GA4,把精力花在刀刃上。
<站名>.vercel.app(被占用时会变成 <站名>-xxx.vercel.app)。如果代码里硬编码的域名和实际域名不一致,sitemap、canonical URL、JSON-LD 全部失效,GSC 无法正确抓取。
useState(() => localStorage.getItem(...)) 初始化状态时,服务端渲染的 HTML 和客户端水合后的 DOM 不一致,React 跳过水合,所有 onClick 等事件处理器失效。页面看起来正常但完全不可交互。
useSyncExternalStore 替代直接调用浏览器 API,确保 SSR 阶段返回安全的默认值。同时引入 Playwright MCP 做交互测试,在真实浏览器中验证事件绑定。
output: "export" 会生成纯静态 HTML,失去 Vercel 对 Next.js 的原生 SSG/ISR 支持,导致路由重写、middleware、动态路由等功能不可用。Vercel 本身就能完美处理 Next.js SSG,没必要退化到纯静态导出。
commandForIgnoringBuildStep 解决了"推一次构建所有"的问题,实现了按需构建。唯一的代价是仓库体积增大,但对于内容站来说完全可以接受。
templates/starter/ 是博客型参考模板,但站群覆盖多种形态(博客/工具站/目录站/对比站)。强制套模板会让工具站套上博客 UI,不合理。所以设计为"可复用的部分"(工程配置 + 基础设施组件)和"按需定制的部分"(页面结构 + UI),AI 根据领域灵活决定。
git diff --quiet HEAD~1 HEAD -- .,意思是"如果这次 push 没有改动我这个子目录下的文件,就跳过构建"。所以推一次代码,只有真正有变更的站点会触发构建,其他站不受影响。7 个站共享一个仓库,但构建互不干扰。
useState(() => localStorage.getItem(...)) 来读取用户之前的选择,但服务端渲染时 localStorage 不存在,导致服务端和客户端渲染结果不一致,React 跳过水合,所有按钮的点击事件都失效了。页面看起来完全正常,但一个按钮都点不了。排查了很久才定位到水合问题,最终用 useSyncExternalStore 解决。这个经历也促使我在流水线中加入了 Playwright 交互测试环节。
| 站名 | 领域 | 类型 |
|---|---|---|
| aitoolpilot | AI 工具评测 | 博客/评测 |
| calcwise | 在线计算器 | 工具站 |
| coursecompass | 在线课程导航 | 目录站 |
| desksetuphq | 桌面设置指南 | 博客/评测 |
| emailtoolscout | 邮件工具评测 | 博客/评测 |
| nocoderadar | 无代码工具雷达 | 博客/评测 |
| smartnestguide | 智能家居指南 | 博客/评测 |