- the module writes #seo-routes (static paths and route patterns) from the
resolved pages; options seo.routeReport, seo.pagination and
seo.htmlSitemap reach the public runtime config
- seo-route-report: POST /registry/routes once per process with the
route-report token, one retry after 60 s on failure, nothing without a
token, with the layer off or with routeReport false
- seo-drift: one "[vue-seo-layer] drift:" warning per mismatch between
the CMS's site answer (URL patterns, pagination, HTML sitemap paths)
and the build
- GET /api/__seo__/site and useSeoSite()
- smoke grammar routereport and log, fixture registry route, drift run
- server/middleware/seo-root.ts proxies /robots.txt, /sitemap.xml,
/sitemap-<name>.xml, /llms.txt and the verification and IndexNow key
files the site answer lists in root_files, with the backend's status,
content type and X-Robots-Tag; a backend failure is 503 Retry-After 60
- server/lib/site.ts caches GET /_seo/api/v1/site (300 s, cleared by the
purge); a backend without it (404) keeps the v0.1.1 behaviour: no root
proxies, the verification lookup by name
- the 404 report and the verification lookup honour seo.cms and rootFiles
- smoke runs for the layer off (seo.cms and the v0.1.1 enabled switch), the
CMS down (fail open) and no 404 token; npm run purge:check
- POST /api/__site__/cache/purge, its library and the site config plugin
moved from vue-journal-layer with the same contract (token rules, 404 for
proxied requests unless allowProxied, deprecated siteCache names); the
route also clears the resolve cache
- server/plugins/seo-cache-purge.ts clears the SEO caches after any 200
purge, so an app whose journal, menu or FAQ layer copy of the route wins
keeps fresh SEO answers until those copies are removed
- cachePurge and siteCache runtime keys; /api/__site__/** never cached
- testing/purge-check.mjs (CMS answer change, plus a redirect added for a
route-cached page applying at once) and purge-token-check.mjs