2.6 KiB
2.6 KiB
AGENTS.md — @app/seo-geo
职责
SEO / GEO 纯函数库:生成 meta 标签、sitemap、robots.txt、JSON-LD、llms.txt。不依赖 Astro/React/DB,调用方自行注入到页面。
依赖库(重构后)
| 库 | 用途 |
|---|---|
zod |
入参 schema + 派生 TS 类型(types.ts) |
schema-dts |
JSON-LD 节点的 schema.org 强类型 |
escape-html |
head 标签属性转义 |
sitemap |
sitemap.xml 流式序列化 |
serialize-javascript |
JSON-LD <script> 安全序列化(XSS) |
mdast-util-to-markdown |
llms.txt / FAQ Markdown 生成 |
结构
src/
types.ts # Zod schema + SiteSeoConfig / PageSeoInput / SitemapEntry / LlmsSiteConfig ...
url.ts # absoluteUrl / normalizeSiteUrl / normalizePath ...
meta.ts # buildTitle / buildHeadTags / renderHeadTagsHtml / buildRobotsContent
sitemap.ts # buildSitemapXml / pathsToEntries
robots.ts # buildRobotsTxt / buildDefaultRobotsInput / paginationRobots / DRAFT_ROBOTS
jsonld.ts # webSite/webPage/faq/howTo/... + toJsonLdScript
llms.ts # buildLlmsTxt / buildLlmsFullTxt / faqToJsonLdAndMarkdown
index.ts # 全量导出(类型、Zod schema、函数)
核心类型
SiteSeoConfig:站点级一次配置(siteUrl、name、description、llms…)。PageSeoInput:页面级(title、path、robots、jsonLd、pagination…)。HeadTag:结构化 meta/link,由renderHeadTagsHtml转 HTML(已转义)。JsonLdNode:Thing | JsonLdObject | Record<string, unknown>,builder 返回schema-dts的 Leaf 类型。
修改指南
- 保持纯函数:无 IO、无全局状态、不读
import.meta.env。站点 URL 由调用方传入。 - 加新标签/JSON-LD 类型:扩展
types.tsZod schema + 对应 build 函数,并从index.ts导出。 toJsonLdScript走serialize-javascript(已转义</script>与 U+2028/2029)——序列化 JSON-LD 一律走它,不要手拼<script>。- 生成 HTML/XML 必须走库转义(
escape-html/sitemap包自带序列化)。 - JSON-LD 构造用
schema-dtsLeaf 类型(WebSiteLeaf等),自定义节点放page.jsonLd。 - GEO:
llms.txt约定参考 llmstxt.org;FAQ 同步产出 JSON-LD 与 Markdown 用faqToJsonLdAndMarkdown。
消费方
主要在 @app/web:lib/seo.ts 维护 siteSeo,AppLayout.astro 调 buildHeadTags + buildDefaultJsonLd,pages/*.ts 产出 sitemap/robots/llms 文本。
命令
yarn workspace @app/seo-geo typecheck
yarn workspace @app/seo-geo lint
yarn workspace @app/seo-geo build