资料包里提供了一份可以直接复制使用的文章模板。它带有完整的 frontmatter,读者拿到后可能马上把它放进内容目录。需要验证的问题很具体:文件被识别为一篇文章后,会不会直接出现在公开页面里?
本站针对这个场景增加了回归检查。下面记录测试的输入、执行方式和判断依据;它验证的是本地构建行为。
输入:真正提供下载的那份文件
测试输入来自 public/downloads/agent-content-kit-v1/article-template.md。其中的起稿状态是:
kind: note
createdWith: agent
pubDate: 2026-09-10
draft: true日期有效,字段可以被内容集合接受。阻止它公开的关键是草稿状态,而不是故意写一个无法解析的文件。正文也要求使用者替换标题、日期、依据和实际结果。
测试没有另写一份相似样例,而是直接复制下载文件。这样,日后有人修改资料包模板,检查会覆盖修改后的真实内容。
做法:在临时项目里模拟一次复制
tests/blog.test.mjs 会建立临时目录,复制源码、公开资源与构建配置,并把下载模板放进临时项目的文章目录:
await cp(
join(workspace, "public/downloads/agent-content-kit-v1/article-template.md"),
join(content, "resource-template.md"),
);这里的 content 指向临时项目的 src/content/blog/regression。接着测试运行 Astro 构建,并要求进程成功退出。
两个条件需要同时成立:模板是一份合法内容,构建能够通过;它仍然是草稿,公开产物不能包含对应文章。仅仅让构建报错,不能说明草稿隔离实现正确。
验收:检查输出,而不只检查字段
构建后,测试枚举 dist,确认没有生成模板的文章页面:
assert.ok(
!files.some(file => file.startsWith("blog/regression/resource-template/")),
"下载模板复制到内容目录后仍然保持草稿",
);同时核对首页、文章列表、RSS 和 sitemap 不包含它的文章路径,避免“没有独立页面,但仍泄漏到订阅或索引”的情况。
这是可以在项目根目录执行的检查:
pnpm test
pnpm build本次实现已在本地执行上述检查,模板保持草稿隔离。测试使用临时项目,结束后清理,不会把样例文章留在正式内容目录。完整套件还会覆盖缺少草稿字段、未来日期以及草稿预览不进入生产产物等情形。
本文对应的资料版本
本文使用 Agent 内容运营资料包 v1.0.0 中的文章模板,独立示例为 v1.0.0。资料页保留版本说明和原始下载入口;有后续版本时,请按版本选择对应文件。
不需要本站仓库,也可以复现
下载独立示例 demo.mjs。使用 Node.js 24 和 npm,在文件所在目录执行:
node demo.mjs脚本会在系统临时目录建立最小 Astro 项目,通过 npm 下载 Astro 7.3.2,因此需要网络。它不读取你的博客仓库,不部署网站,结束后清理临时目录。可先用文本编辑器查看脚本再运行。
这个示例使用两个固定样例:一篇公开文章和一份草稿。第一次构建要求公开文章存在,而草稿不进入文章页面、首页、RSS 和 sitemap;第二次把草稿改为公开,再确认它进入这些产物。
成功时会输出:
PASS:公开对照文章存在;草稿不进入文章页面、首页、RSS、sitemap。
PASS:改为 draft: false 后,模板进入公开产物;发布边界生效。
临时项目已清理。独立示例演示同一套筛选原则,使用精简页面与固定测试数据;它不包含本站完整模板、样式或所有校验。上文的仓库回归测试仍直接使用真实下载模板。安装失败或任何断言不通过时,脚本以非零状态退出。
这个结果的适用范围
它证明的是本站当前构建规则对这份模板的处理方式。把模板改成 draft: false 并满足日期条件后,文章会获得公开构建资格;测试并不会判断其中的事实是否真实。
用于其他博客时,需要检查那个项目的发布规则。字段名相同不代表行为相同,也不能把本地构建成功写成正式域名已经上线。
这个测试很小,却能在资料包、内容字段和构建逻辑变化时检查同一个具体场景。比起只在文档里写“默认是草稿”,它额外留下了一次可以重复执行的验证。